Comparar commits

..

500 Commits

Autor SHA1 Mensagem Data
Daniel Molkentin 1a6283e59f v2.2.1 2016-06-06 10:50:02 +02:00
Daniel Molkentin 066ee2fca7 Update ChangeLog 2016-06-06 10:49:29 +02:00
Daniel Molkentin 1787da8a9d Fix memleak in updater 2016-06-02 15:03:52 +02:00
Jenkins for ownCloud 9ab812f89b [tx-robot] updated from transifex 2016-06-01 02:19:17 -04:00
Markus Goetz de82d8fcdb QNAM: Try to workaround missing Qt patches #4720 #3888 #4051
We try this on all platforms now so we have more consistent behaviour.
2016-05-31 10:26:52 +02:00
Stephen Colebrook af2b712dc6 Search results are filtered by server. Don't filter a second time.
Also allows searching on attributes other than displayname in ldap
configurations. Search results match web and mobile apps.
2016-05-31 09:46:52 +02:00
Markus Goetz a507558dee Connectivity: Reduce ETag job timeout to 60 sec #4275
Before it used the default job timeout
2016-05-31 09:35:47 +02:00
Jenkins for ownCloud e73c3199c0 [tx-robot] updated from transifex 2016-05-31 02:20:28 -04:00
Markus Goetz d88ab4653b Connectivity: Delete job on timeout #4275
This was not done if there was no reply
2016-05-30 18:15:41 +02:00
Klaas Freitag 9a2450c4c1 Update changelog for 2.2.1 2016-05-30 17:19:40 +02:00
Daniel Molkentin 3c1f5e662f Remove stray file 2016-05-30 12:05:22 +02:00
Daniel Molkentin 100ee69ddd Merge pull request #4923 from RobinGeuze/2.2
Fix Qt4 build
2016-05-30 11:50:50 +02:00
Robin Geuze d45d6ca9da Fix Qt4 build 2016-05-30 09:55:45 +02:00
Daniel Molkentin 2608c7007e Merge pull request #4922 from owncloud/fix_4840
Don't try to determine pixel ratio with Qt < 5.6.0
2016-05-30 09:20:50 +02:00
Jenkins for ownCloud 06a88ea9a4 [tx-robot] updated from transifex 2016-05-30 02:41:51 -04:00
Daniel Molkentin 0194ebb222 Don't try to determine pixel ratio with Qt < 5.6.0
This seems to be broken. Worst case users can still
set it manually

Addresses #4840
2016-05-30 08:27:57 +02:00
Jenkins for ownCloud dc654ac846 [tx-robot] updated from transifex 2016-05-29 02:18:52 -04:00
Jenkins for ownCloud 370fd5062c [tx-robot] updated from transifex 2016-05-28 02:19:09 -04:00
Daniel Molkentin 00d20b4a42 Merge pull request #4913 from owncloud/normalize_name_in_filestatus
Undo regression caused by 727e73d
2016-05-27 18:08:08 +02:00
Daniel Molkentin a2b238e2e5 Undo regression caused by 727e73d
normalization to NFC is still required. Mac OS API will not take
care of that by default.

Resolves #4884
2016-05-27 16:03:59 +02:00
ckamm 0e2c16e827 Certs: Re-ask for different cert after rejection #4898 (#4911)
Previously rejecting any kind of certificate meant that the user
was never asked again, even if the certificate changed.

Now we keep track of which certificates were rejected and ask again
if the ones mentioned in the ssl errors change.

mitmproxy is excellent for testing this.
2016-05-27 12:08:42 +02:00
ckamm b9fdae6d67 Progress: Don't count items without propagation jobs #4856 (#4910)
* Progress: Don't count dirs without propagation jobs #4856

These directory SyncFileItems are necessary for bookkeeping
but should not influence the progress display at all.

* Progress: Skip ignored files #4856
2016-05-27 10:52:00 +02:00
Jenkins for ownCloud c34115610e [tx-robot] updated from transifex 2016-05-27 02:19:21 -04:00
Olivier Goffart 275ad1e157 Utility: Better fix for the translation of minutes, seconds, ...
The plural was not translated because of QTBUG-3945. Work around it.
Issue #4855
2016-05-26 12:17:16 +02:00
Jenkins for ownCloud 1855950fa1 [tx-robot] updated from transifex 2016-05-26 02:33:30 -04:00
Olivier Goffart fff5c280b3 SyncEngine: cleanup setting isDirectory 2016-05-25 16:27:40 +02:00
Olivier Goffart e960b265a8 Merge remote-tracking branch '2.1' into 2.2 2016-05-25 16:23:58 +02:00
Olivier Goffart f6b35e5d58 SyncEngine: invalid the blacklist entry when the rename destination change
The problem in this case is if we rename the file "xxx" to "invalid\file".
The rename will fail because the new filename constains a slash, and it
will be blacklisted.
But then if the user re-rename the file to "valid_name", then we should
invalidate the blacklist entry and retry to upload. But we did not do
that because renaming don't change the mtime and we did not store the
rename target in the database

IL issue 558
2016-05-25 15:32:45 +02:00
Jenkins for ownCloud 1d93af5f64 [tx-robot] updated from transifex 2016-05-25 02:19:18 -04:00
Markus Goetz 75efa8b252 sqlite: Update bundled version to 3.13.0
For OS X and Windows.
2016-05-24 17:27:31 +02:00
Markus Goetz 009a0b03da Add ChangeLog for 2.2.1 2016-05-24 17:04:04 +02:00
Jenkins for ownCloud 8379a36a75 [tx-robot] updated from transifex 2016-05-24 07:40:14 -04:00
Daniel Molkentin 2f1a40ff7c Travis coverity: Enforce Ubuntu 14.04 env, fix repo 2016-05-24 11:30:03 +02:00
Daniel Molkentin c041ca6163 Fix pot. mem leak found by coverity (CID 96004) 2016-05-24 11:21:33 +02:00
Daniel Molkentin eacc0c8bd6 Fix pot. mem leak found by coverity (CID 12900) 2016-05-24 11:21:33 +02:00
Jenkins for ownCloud 171de99e00 [tx-robot] updated from transifex 2016-05-24 02:19:53 -04:00
ckamm bf02ccc1e8 Remember to upload files that are locked during a sync run (#4865)
See owncloud/enterprise#1342
2016-05-23 09:03:03 +02:00
Jenkins for ownCloud 7ba961c21a [tx-robot] updated from transifex 2016-05-23 02:19:05 -04:00
Jenkins for ownCloud cb7be78352 [tx-robot] updated from transifex 2016-05-22 02:19:13 -04:00
Jenkins for ownCloud 6cb194e0d5 [tx-robot] updated from transifex 2016-05-21 02:19:09 -04:00
Markus Goetz 552ba94c41 SyncEngine: Set isDirectory before syncItemDiscovered
(cherry picked from commit fc1933803e)
2016-05-20 17:00:22 +02:00
Markus Goetz fc1933803e SyncEngine: Set isDirectory before syncItemDiscovered 2016-05-20 16:58:44 +02:00
Markus Goetz 46e4ec3183 Checksums: Use SHA1 like in >=2.2 2016-05-20 16:31:47 +02:00
Olivier Goffart 03e3b3bf50 Upload: put the job in the active list while doing the checksum computation.
This fixes an issue in which too many jobs are started un parallel
while uploading many files, which could cause too much memory usage as the
chunks are stored in memory.

Probably the fix for #4611
2016-05-20 16:28:27 +02:00
Christian Kamm 9aed8dbce8 Checksums: Compute content checksum on download #4375
Cherry-picked from d6d35029
2016-05-20 16:06:30 +02:00
ckamm c6794cd338 Progress info: Reset between syncs #4856 (PR #4872) 2016-05-20 15:07:54 +02:00
Jenkins for ownCloud 65ec1b74d5 [tx-robot] updated from transifex 2016-05-20 02:19:16 -04:00
Jenkins for ownCloud 1a3c9a9c1a [tx-robot] updated from transifex 2016-05-19 02:19:20 -04:00
Markus Goetz a038c99232 Upload: Remove bandwidth quota debug message #4837 2016-05-18 16:18:13 +02:00
Olivier Goffart 30c8fa1c93 Utility: Fix translation of second, minute, hour
Issue #4855

A typo in the context string made the translation lookup fail.
But also the %Ln was not recognized as a plural form by transifex, so only
the singular was translated
2016-05-18 10:52:22 +02:00
Olivier Goffart 010649f997 FolderWizard: remove dead code and fix the alias
Remove a bunch of dead code.

And also set the root folder name properly since alias is gone.

Fix the warning:
QWizard::field: No such field 'alias'
2016-05-18 10:52:22 +02:00
Jenkins for ownCloud 597f2a4dfc [tx-robot] updated from transifex 2016-05-18 02:19:16 -04:00
Olivier Goffart cf1fe690a3 Shibboleth: Show the inspector if OWNCLOUD_SHIBBOLETH_DEBUG is set
Help to debug https://github.com/owncloud/enterprise/issues/1265
2016-05-17 12:29:20 +02:00
Jenkins for ownCloud 31b27bea38 [tx-robot] updated from transifex 2016-05-17 02:18:59 -04:00
Jenkins for ownCloud 04f99f3bd7 [tx-robot] updated from transifex 2016-05-15 02:19:07 -04:00
Jenkins for ownCloud fbf92ac239 [tx-robot] updated from transifex 2016-05-14 02:19:15 -04:00
hefee 669a72f0e1 A final release version number breaks this regex (#4835)
f.ex. a valid verson nr: 2.2.0
-> fist \d+ = 2
-> second \d+ = 2
-> the last \d+ = 0
-> .+ in not matching, because there is nothing to match
2016-05-13 16:55:11 +02:00
Jenkins for ownCloud 2f0e65d37c [tx-robot] updated from transifex 2016-05-13 02:25:05 -04:00
Olivier Goffart 5676685f58 SyncEngine: Add a compile option so we rename to restoring a move we don't have the permission to do
IL issue 550
2016-05-12 13:15:30 +02:00
Christian Kamm db9ccb40a4 Fix compile with strict C flags 2016-05-12 13:14:40 +02:00
Christian Kamm d4c15d2c38 Ignores: expand escapes #4568
(cherry picked from commit d7bd1300a8)
2016-05-12 11:53:17 +02:00
Hefee edb3759684 For tests we do not need a xserver running.
Use for tests QTEST_GUILESS_MAIN and QTEST_APPLESS_MAIN.
2016-05-12 11:34:21 +02:00
Christian Kamm 0f9c32452c Protocol: Increase width of timestamp column #4721
Since the font metrics aren't reliable on windows, we add some
extra space there.
2016-05-12 10:24:34 +02:00
Daniel Molkentin 45dd1d0acf Bump to 2.2.1 2016-05-12 09:58:12 +02:00
Daniel Molkentin 552af7b94d 2.2.0 final 2016-05-12 09:58:12 +02:00
Christian Kamm 8934979ba1 timeAgo test: Fix for qt4, clean up 2016-05-12 09:25:15 +02:00
Daniel Molkentin b3e16e0eb0 Merge pull request #4825 from owncloud/22-user-manual
[Doc] 2.2 user manual updates
2016-05-12 08:20:55 +02:00
Carla Schroder 7773380deb update file manager screenshot 2016-05-11 12:44:27 -07:00
Carla Schroder e22050a434 updates to 2.2 user manual 2016-05-11 12:37:40 -07:00
Daniel Molkentin 7b0231bfce Merge pull request #4821 from owncloud/notification_doc
Documentation draft to introduce notifications.
2016-05-11 21:16:35 +02:00
Jocelyn Turcotte edc58c045f Fix assert on restore after propagation (#4823)
The assert was there to make sure that this case wasn't happening
to eventually be properly tested. Remove the assert for now but this
codepath should eventually be unit tested using this specific situation.
2016-05-11 18:16:46 +02:00
Klaas Freitag 035058934f Documentation draft to introduce notifications.
Also added a screenshot.
2016-05-11 11:16:08 +02:00
Klaas Freitag 9b1f46e560 Fix exclude unit test, adopt to new Iface of isExcluded. 2016-05-10 16:46:08 +02:00
Klaas Freitag 9e7a8e619b Fix utility test: Pass a command name to do the version check. 2016-05-10 16:26:42 +02:00
Klaas Freitag 9c0cd2b13e Added Changelog for 2.2.0 2016-05-10 15:39:44 +02:00
Daniel Molkentin 58ad781bd4 Update binary submodule 2016-05-10 14:39:22 +02:00
Daniel Molkentin 9d6701ecbe Windows Shell Integration: Fix another spot where the pipe path was constructed manually 2016-05-10 13:49:14 +02:00
Daniel Molkentin d659c54798 Update binary sub module 2016-05-10 10:36:49 +02:00
Daniel Molkentin 0e9170cb36 Windows Shell Integration: Unify path lookups 2016-05-10 10:18:53 +02:00
Markus Goetz 8820bc1c17 Windows: Fix Share menu #4781 2016-05-09 14:37:46 +02:00
Jenkins for ownCloud 74f67c97a9 [tx-robot] updated from transifex 2016-05-09 02:19:15 -04:00
Jenkins for ownCloud fd96b482c5 [tx-robot] updated from transifex 2016-05-07 02:19:16 -04:00
Jocelyn Turcotte 727e73d640 [shell/windows] Fix the windows status push not working (#4784)
Since the windows implementation first does cache lookups using the
path string, directories need to be passed identically as through
RETRIEVE_FILE_STATUS.

Change the convention to never have a trailing slash for directories
in the protocol. This allows the convention to be applied without
having to access the disk (since we'd need to know if the path is
represented by a directory) and also matches the convention of the
rest of the sync engine. Individual file manager plugins are then
responsible of handling pushed paths as not ending with a trailing
slash.

This also:
- Moves the trailing slash removal logic from the SyncFileStatusTracker
  to the SocketApi class
- Remove the unneeded QString::normalized call in fileStatus, since
  this should already be done by the FolderWatcher and plugins
2016-05-06 12:32:01 +02:00
Jenkins for ownCloud d7804d8df3 [tx-robot] updated from transifex 2016-05-06 02:19:00 -04:00
Olivier Goffart 3d9d106bb1 Dolphin plugin: fix build with branding
Make sure that the name of the _export.h file is the same no matter the plugin
2016-05-04 14:19:18 +02:00
Jenkins for ownCloud 15dc3408ef [tx-robot] updated from transifex 2016-05-04 02:19:15 -04:00
Markus Goetz 928643f597 NSIS: Properly uninstall both x64 and x86 DLLs #4762
Viel hilft viel ;-)
2016-05-03 18:35:01 +02:00
Markus Goetz 7110091fdd Qt patches: Update with information about Qt 5.6 2016-05-03 15:16:07 +02:00
Jocelyn Turcotte 064c2b678a Merge branch 'overlayIconFixes' into 2.2 (#4765) 2016-05-03 13:04:34 +02:00
Jocelyn Turcotte e58739de00 [osx] Fix missing overlay icons on client startup
Since the statuses are cached and that we can't invalidate the cache,
sending NOP would need to be overwritten by the default OK status
once the client successfully connected. But instead of remembering
which files we NOPed, rather wait until we are ready to sync before
sending the REGISTER_PATH message to the socket API client. It will
also prevent the client from sending unnecessary RETRIEVE_FILE_STATUS
requests.

Also remove AccountState::canSync, since it does the same as
isConnected and syncing is not an account responsibility.
2016-05-03 13:01:51 +02:00
Jocelyn Turcotte 7c2fdee78b Avoid a SyncFileStatusTracker private overload with the same name
Having an overload as a private function in the same class makes the
code harder to follow. Rename the private fileStatus to syncFileItemStatus.
2016-05-03 13:01:51 +02:00
Jocelyn Turcotte 7bfe46962f Simplify the root status logic
Go through fileStatus like other cases to make sure that all use
cases go through the same code path. This also makes sure to use
lookupProblem which will use lower_bound which is more efficient
for larger sets of sync problems.

This also fixes the issue with lookupProblem that prevented it to
properly match an empty pathToMatch, caused by the fact that the
problem map contains relative paths not starting with a slash.
2016-05-03 13:01:51 +02:00
Jocelyn Turcotte 32b3023a8e Fix the root item sync status #4682
Make sure that we push the new status when the status of the SyncEngine
changed. SyncEngine::started comes a bit late, only when the propagation
starts, although it's better in this case since child folders will
only switch to Sync in aboutToPropagate.

Also fix an issue with SyncEngine::findSyncItem when using an empty
fileName; this would match and return the wrong item, even though
not currently happening with the code since fileStatus won't call
it with an empty fileName anymore.
2016-05-03 13:01:51 +02:00
Jocelyn Turcotte a5df44c757 Fix the sync status push for parent directories #4682
As before, we rely on metadata-update SyncFileItem entries for parent
directories to notify us that a directory contains files to propagate,
and to know when all children were propagated through its itemCompleted
signal.

Those metadata SyncFileItems however have a None direction and we need
to add a explicit directory check to show them as Sync.
This fix also handles new files as well as existing ones, so no need
to keep a separate logic for new files.
2016-05-03 13:01:51 +02:00
Klaas Freitag 641125eac1 Fix nautilus and nemo plugin branding strings. (#4780)
* Fix nautilus and nemo plugin branding strings.

Fix for owncloud/enterprise#1314

* nautilus plugin: Add a comment why the line needs to stay unchanged.
2016-05-03 11:36:56 +02:00
Jenkins for ownCloud d340017a0a [tx-robot] updated from transifex 2016-05-03 02:19:16 -04:00
Olivier Goffart a67173610d Propagator: fix qt4 build
propagatedownload.cpp:712:35: error: 'seenLockedFile' is a protected member of 'OCC::OwncloudPropagator'

Signals are protected in Qt4 but public in Qt5, mark the class accessing it
as friend when compiling with Qt4
2016-05-02 17:34:21 +02:00
Daniel Molkentin e833d01288 Re-Apply: Disambiguate socket API pathes on Windows with user name
Addresses #3411
2016-05-02 16:09:48 +02:00
Olivier Goffart 3047682223 ShareDialog: show the error message in red
Do the visual stuff from designer.
The previous code that was ment to change the color in red did not work
and changed it to gray instead.
Also I don't see why there should be a frame.

Issue #4773
2016-05-02 14:12:04 +02:00
Jenkins for ownCloud c91dd94728 [tx-robot] updated from transifex 2016-05-02 02:19:41 -04:00
Jenkins for ownCloud 52f9f44b51 [tx-robot] updated from transifex 2016-05-01 02:19:18 -04:00
Jenkins for ownCloud 49748191a9 [tx-robot] updated from transifex 2016-04-30 02:19:14 -04:00
ckamm e6b937f508 LockWatcher: Keep an eye on Windows file locks (#4758)
When a conflict-rename or a temporary-rename fails, notify the
LockWatcher. It'll regularly check whether the file has become
accesible again. When it has, another sync is triggered.

owncloud/enterprise#1288
2016-04-29 16:14:18 +02:00
Roeland Douma 31c13f74fb Add spinner during sharee search (#4764)
Fixed #4740

When searching for sharees we should display a loading spinner.
2016-04-29 14:11:27 +02:00
Olivier Goffart be466b47b7 Merge remote-tracking branch 'origin/2.1' into 2.2 2016-04-29 08:52:17 +02:00
Olivier Goffart 11b144957b PropagateDownload: Throw an error if the file is empty while it should not have been (#4753)
If the downloaded file is empty but the PROPFIND previously announced it
should not have been empty, this might mean the file was somehow corrupted
because of a bug on the server and that we should therefore not accept
the file.

Normaly we accept a change between the actual size of the file and what we
got during discovery because the file might have been updated to a new version
inbetween. But after this patch we won't accept the file if it was replaced
by an empty file.

Will help for issue #4583
Also requested by IL for issue 548
2016-04-29 08:49:27 +02:00
Jenkins for ownCloud 817e97c148 [tx-robot] updated from transifex 2016-04-29 02:19:14 -04:00
Markus Goetz 29932004ae Shibboleth: Load username from config for UI (#4751)
For https://github.com/owncloud/enterprise/issues/1034
2016-04-28 14:55:29 +02:00
Daniel Molkentin 6d83e841a9 Merge pull request #4756 from owncloud/revert-4738-fix_3411
Revert "Disambiguate socket API pathes on Windows with user name"
2016-04-28 13:53:06 +02:00
Daniel Molkentin b43a9421d2 Revert "Disambiguate socket API pathes on Windows with user name" 2016-04-28 13:52:15 +02:00
Klaas Freitag e70b78d14b Merge pull request #4738 from owncloud/fix_3411
Disambiguate socket API pathes on Windows with user name
2016-04-28 13:46:10 +02:00
Klaas Freitag 6814342d1f Merge pull request #4748 from owncloud/win_stat_revisited
vio for windows: Use more graceful create file params.
2016-04-28 13:45:30 +02:00
Christian Kamm 68126dcff6 Checksums: Skip uploads of .eml files only #4754
This is a workaround. A correct solution would still update file metadata
such as the mtime. See #4755.
2016-04-28 12:59:39 +02:00
Christian Kamm e7f00339e6 Fix perl tests #4722
* The dav auth realm is "sabre/dav" for newer server versions
* Content checksums are enabled generally, so conflict detection
  is smarter
2016-04-28 10:44:37 +02:00
Christian Kamm a36b4ec863 FolderWizard: Sort remote folders #4612 2016-04-28 09:29:07 +02:00
Christian Kamm 074f8eadb1 Selective sync: Sort folders in FolderStatusModel #4612 2016-04-28 09:29:07 +02:00
Jenkins for ownCloud 6a51ae5b1b [tx-robot] updated from transifex 2016-04-28 02:19:20 -04:00
Christian Kamm af5f2d3860 Protocol: Make timestamp column width fit the text #4721 2016-04-28 07:37:42 +02:00
ckamm 38bad564a0 Merge pull request #4739 from ckamm/trackdirty
Overlay icons: Track touched files #4730
2016-04-28 07:17:17 +02:00
Christian Kamm c2fa3fb4c8 Overlay icons: Track touched files #4730
This uses the file watcher to keep track of files that were modified
in order to assign them the blue icon.

This is transient state that's not persisted across restarts.
2016-04-28 07:16:49 +02:00
Markus Goetz f7082ee3df sqlite: Update to version 3.12.2
For OS X and Windows
2016-04-27 12:22:12 +02:00
Markus Goetz f7c6efb391 ConnectionValidator: Also set short timeout for capabilities job
Default timeout was 5 min.
2016-04-27 12:19:49 +02:00
Klaas Freitag 051a348afd Vio for windows: Removed the overlap param again.
After discussion and studying docs again we agreed that
the parameter is not neccessary here as it only affects
the process that opens the handle. And we do not want to
do async stuff.
2016-04-27 11:37:21 +02:00
Olivier Goffart d0af3ede05 AccountSettings: context menu: don't rely on the alias
Don't rely on the alias to know weather we shuld show a context menu or not.
Use the classify function to know if it's a root folder instead
2016-04-27 11:21:58 +02:00
Olivier Goffart 0da2adcbe0 Workaround ubuntu 16.04 systemtray bug (#4693) (#4747) 2016-04-27 11:21:13 +02:00
Klaas Freitag 07bdd519e9 vio for windows: Use more graceful create file params. 2016-04-27 11:17:42 +02:00
Christian Kamm 0829a94c92 Remote folder selection: improve path typing #4745 #4746
* Scroll to the target typed path
* Show non-404 errors that were triggered by typing paths
2016-04-27 10:37:17 +02:00
Jenkins for ownCloud faf2514be2 [tx-robot] updated from transifex 2016-04-27 02:19:20 -04:00
Markus Goetz 4ea2edcf4a Merge pull request #4741 from owncloud/fix-alias
Accountsettings: Generate an alias for new folders
2016-04-26 17:34:10 +02:00
Olivier Goffart cd29875b76 Folder: Generate an alias for new folders
Before commit 1a51b6718a, the wizard was
making sure folder had an alias but this is no longer the case.
So generate still an unique alias.

Alias is not used in the UI any longer, it's just use for internal purposes.

For issue #4737
2016-04-26 16:53:24 +02:00
Markus Goetz 85bc3b276f Merge pull request #4744 from owncloud/fixAliasesOnceMore2
UI: Fix account name/alias display oddities #4577
2016-04-26 16:53:23 +02:00
Markus Goetz ce5ca8a42e UI: Fix account name/alias display oddities #4577 2016-04-26 16:47:47 +02:00
Daniel Molkentin ce6a365328 Disambiguate socket API pathes on Windows with user name
Addresses #3411
2016-04-26 14:49:45 +02:00
Christian Kamm 09eea7f5f2 Checksums: Use the first supported type if nothing is preferred 2016-04-26 13:10:53 +02:00
ckamm 043350f49d Merge pull request #4736 from ckamm/socketapi_nautilus_invalidate
Overlay icons: Fix invalidation with nautilus #3249
2016-04-26 12:04:53 +02:00
Christian Kamm f657bd0cd9 Overlay icons: Fix invalidation with nautilus #3249
This avoids an extra socketapi call after invalidate_extension_info
is called from a STATUS message.
2016-04-26 11:49:56 +02:00
Christian Kamm b4cf17d99d Overlay icons: Fix duplicate icons in nautilus #3249 2016-04-26 11:02:59 +02:00
Christian Kamm 12bf6e39b7 Share link: Consistent order of options owncloud/core#24122
(cherry picked from commit 8dc178a9f3)
2016-04-26 10:44:29 +02:00
Olivier Goffart 4e7c09de83 QTokenizer: fix Qt4 build
QSharedPointer::reset is new in Qt5
2016-04-26 10:38:20 +02:00
Jenkins for ownCloud 31f2c3e76a [tx-robot] updated from transifex 2016-04-26 02:19:11 -04:00
Jenkins for ownCloud 64b6486327 [tx-robot] updated from transifex 2016-04-25 08:26:49 -04:00
Jenkins for ownCloud 335e333e28 [tx-robot] updated from transifex 2016-04-24 02:19:04 -04:00
Jenkins for ownCloud 41eb5f0a3f [tx-robot] updated from transifex 2016-04-24 01:15:28 -04:00
Carla Schroder 030184fad9 Merge pull request #4704 from owncloud/doc_overlay_icons
Doc: Draft overlay icons
2016-04-22 08:40:09 -07:00
Roeland Douma 7d285d0225 Merge pull request #4717 from owncloud/fix_webdav_property
Only 1 : between namespace and property
2016-04-22 14:40:55 +02:00
Roeland Jago Douma d3a93322d2 Only 1 : between namespace and property 2016-04-22 14:38:43 +02:00
Jenkins for ownCloud 8694db1c49 [tx-robot] updated from transifex 2016-04-22 06:16:18 -04:00
Daniel Molkentin 19eca84d4f Merge pull request #4715 from owncloud/translate-desktop-ini
Adding new resource for the desktop.ini file
2016-04-22 12:05:15 +02:00
Daniel Molkentin 665c3f40e1 Fix search & replace error in Dockerfile 2016-04-22 11:26:46 +02:00
Thomas Müller f8f394eb0a Adding new resource for the desktop.ini file 2016-04-22 10:58:57 +02:00
Olivier Goffart 0711abbf56 Theme: missing virtual keyword 2016-04-22 10:09:07 +02:00
Olivier Goffart 84ac2e64e0 Quota: Add branding option for the base folder (#4714)
As discussed on issue ##4460
Having the quote to be queried on subfolder is wrong in the generic case,
so add a branding option to configure it.

This partially reverts commit ff4cdc3161
2016-04-22 10:05:50 +02:00
Klaas Freitag 57f0603e0e Doc: Applied review feedback for overlay icon docs. 2016-04-22 09:56:53 +02:00
Klaas Freitag b61ae351dd Merge pull request #4713 from owncloud/fix_win-sis
Fix sync to Windows deduplication enabled storages
2016-04-22 09:47:06 +02:00
Jenkins for ownCloud 277a1cfb5a [tx-robot] updated from transifex 2016-04-22 02:19:11 -04:00
Klaas Freitag 6ba7c6e2d3 Windows VIO: Remove unused variable. 2016-04-21 17:40:01 +02:00
Klaas Freitag 055c2ef73f local_vio_win: Fix handling files that have been deduplicated
as part of Windows SIS or Data Deduplication. Fixes #4056
2016-04-21 17:38:43 +02:00
Klaas Freitag e5a5b95b9a Merge pull request #4689 from owncloud/overlays_handle_root
SyncFileStatusTracker: Add a method to handle the root folder of the sync.

Also, handle new files put in the sync in the statustracker logic.
2016-04-21 15:01:11 +02:00
Klaas Freitag 7acdf50a2c SocketAPI: Code simplifications as asked for in the review. 2016-04-21 14:54:13 +02:00
Klaas Freitag 361ebf5464 SyncFileStatusTracker: Remember the state of new files.
In the before-propagate slot, new files that wait to be
pushed to the server are remembered in the _syncProblems
map. That way, the parents show a sync icon properly as
asked for in #4682.

After the item has been transfered properly, the item is
removed from the map again because success is the default.
2016-04-21 13:56:08 +02:00
Olivier Goffart 7a82fac0d5 owncloudcmd: Save the selective sync list on the first run
For issue #4690

In the first run, the journal might not exist, we should not cancel
setting the selective sync list
2016-04-21 12:58:10 +02:00
Daniel Molkentin 8b39c6e6ce Merge pull request #4709 from owncloud/fix_4691
Use QTokenizer to properly parse netrc
2016-04-21 12:50:43 +02:00
Daniel Molkentin e29d7e0128 Use QTokenizer to properly parse netrc
Addresses #4691
2016-04-21 12:46:03 +02:00
Daniel Molkentin dbcb94e7d4 Update doc and Dockerfile for 2.2 builds 2016-04-21 12:25:12 +02:00
Olivier Goffart 522f7afa9e Merge pull request #4663 from 'ckamm/disabletransmissionchecksum'
Disable validation of transmission checksums by default
2016-04-21 11:46:01 +02:00
Olivier Goffart fa69d089cf Checksums: remove the downloadChecksumValidationEnabled option
Added in previous commit from pull request #4663

As discussed, we do not need this option so no need to introduce
a new dependency on the config file in the sync engine
2016-04-21 11:43:44 +02:00
Jenkins for ownCloud 1935c78f17 [tx-robot] updated from transifex 2016-04-21 02:19:12 -04:00
Klaas Freitag b56919d0c4 SocketAPI: Return NOP state if folder is diconnected or paused.
Later, we can send a specific state for that.
2016-04-20 17:14:12 +02:00
Klaas Freitag f72c7f43bf Nautilus plugin: Be more robust against new states from socketapi
Do not bail out if an unknown state comes from SocketApi
2016-04-20 17:13:06 +02:00
Klaas Freitag add29befee Nautilus plugin: Remove the bogus logging 2016-04-20 17:12:21 +02:00
Markus Goetz f9fb7a59dd Merge pull request #4708 from owncloud/aliasGui
UI: Remove alias from more places #4577 #4695
2016-04-20 15:54:05 +02:00
Markus Goetz 1a51b6718a UI: Remove alias from more places #4577 #4695 2016-04-20 14:27:50 +02:00
Jenkins for ownCloud a3a9417630 [tx-robot] updated from transifex 2016-04-20 02:19:08 -04:00
Carla Schroder 53a72148d3 a bit of editing on new section 2016-04-19 10:28:46 -07:00
Klaas Freitag c379593c0f Doc: Draft overlay icons 2016-04-19 18:20:23 +02:00
Klaas Freitag bd37eab3ad SocketAPI: Display a warning on the directory if there are errors
Errors with individual files within a directory now result in
a warning label on the parent directories.
2016-04-19 18:18:00 +02:00
Markus Goetz edb942ba61 Merge pull request #4696 from owncloud/issue4573_negative_content_length
Discovery: Be more explicit about files with unknown size #4573
2016-04-19 16:09:48 +02:00
Markus Goetz a17f37d8ae Discovery: Be more explicit about files with unknown size #4573
Also related https://github.com/owncloud/core/issues/23468
2016-04-19 15:31:16 +02:00
Roeland Douma 33459b48c8 Merge pull request #4700 from owncloud/fix_4409
Use expireDate if returned by the OCS Share API
2016-04-19 13:14:04 +02:00
Roeland Jago Douma 598941948c Use expireDate if returned by the OCS Share API
If an app modifies the expiration date (for example the password policy
app) then on more recent versions of the server we will get the share
object back REST style. We should use that info!

Fixes #4409
2016-04-19 11:22:32 +02:00
Jenkins for ownCloud 038b7db606 [tx-robot] updated from transifex 2016-04-19 02:19:15 -04:00
Roeland Douma 9f30e83413 Merge pull request #4687 from owncloud/fix_share-permissions-namespace
The share-permissions namespace was moved
2016-04-18 21:29:26 +02:00
Klaas Freitag 2ab4caf007 ProtocolWidget: Display the recalculated number of issues.
Should fix #3222
2016-04-18 16:48:37 +02:00
Klaas Freitag 11d3aa3c4f Protocolwidget: Removed some leftovers from refactoring. 2016-04-18 16:47:14 +02:00
Jenkins for ownCloud 93ad61aeef [tx-robot] updated from transifex 2016-04-18 02:19:02 -04:00
Jenkins for ownCloud 6a36d1b4fb [tx-robot] updated from transifex 2016-04-17 02:19:07 -04:00
Daniel Molkentin c0ec481436 No need for WebKitWidgets in libsync anymore 2016-04-16 10:58:12 +02:00
Jenkins for ownCloud df0833d7f9 [tx-robot] updated from transifex 2016-04-16 02:19:16 -04:00
Markus Goetz 6a9655aab6 OS X: Fix overlay installation on El Capitan #4650
The sleep is somehow needed, probably for pkg to rebuild its DB?
The case fix fixes a warning but did not fix the issue itself.
2016-04-15 16:58:58 +02:00
Klaas Freitag 0f3d6d4160 SyncFileStatusTracker: Add a method to handle the root item. 2016-04-15 15:02:02 +02:00
Markus Goetz c4577cb2a1 Merge pull request #4683 from owncloud/fix4657
OS X: Allow ampersand in APPLICATION_NAME #4657
2016-04-15 14:28:38 +02:00
Olivier Goffart fafca26144 AccountManager: take theURL from the Theme rather than from the config if the theme specify it (#4591)
That way an upgrade of the client can actually change the URL
Issue https://github.com/owncloud/enterprise/issues/1113
https://github.com/owncloud/enterprise/issues/1126

In addition to restoring commit 7e5d89293d, this
add a way to override the auth type
2016-04-15 13:16:49 +02:00
Markus Goetz 06c19b0b6f sqlite: Update to version 3.12.1
For OS X and Windows.
2016-04-15 12:02:00 +02:00
Markus Goetz d1649ce4df OS X: Allow ampersand in APPLICATION_NAME #4657 2016-04-15 11:30:49 +02:00
Christian Kamm ea40e314d4 Add server capabilities for checksums #4638
* Add checksums/supportedTypes and checksums/preferredUploadType
  capabilities. The default is that no checksum types are supported.

* Remove the transmissionChecksum config option. Servers must now
  use the capabilities to indicate that they are fine with the
  client sending checksums.

Note: This intentionally breaks brandings that overrode
Theme::transmissionChecksum. The override must be removed and the
server's capabilities must be adjusted to include the new values.
2016-04-15 10:58:14 +02:00
Klaas Freitag e2622310df Merge pull request #4670 from owncloud/implement_ep_1136_2nd_attempt
Make postfixlineedit more userfriendly, rename email id string to "Email"
2016-04-15 10:17:03 +02:00
Klaas Freitag 4ad8e04bc3 Merge pull request #4684 from owncloud/less_socket_api_updates
Less socket api updates
2016-04-15 10:15:07 +02:00
Roeland Jago Douma 74301e4373 The share-permissions namespace was moved
See https://github.com/owncloud/core/pull/24017

This was done since other services we want to intergrate with don't use
the ownCloud namespace.
2016-04-15 10:14:05 +02:00
Markus Goetz 053dcbf1f5 Merge pull request #4686 from owncloud/allow_0_mtime_files
CSync: Allow files with 0 mtime #1603
2016-04-15 09:22:39 +02:00
Jenkins for ownCloud 700c7bcbc6 [tx-robot] updated from transifex 2016-04-15 02:19:14 -04:00
Markus Goetz bc6c57aa0b Exclude: .Trash-* trash folders #4600 2016-04-14 18:27:33 +02:00
Markus Goetz a0521caf52 CSync: Allow files with 0 mtime #1603
I don't see a reason we should not allow this. We detect
a "failed stat reply" in other ways. Maybe this was a legacy
csync decision somewhow that is not valid anymore?
2016-04-14 18:15:16 +02:00
Klaas Freitag 8007331462 SocketAPI: Remove unneeded logging. 2016-04-14 15:39:46 +02:00
Klaas Freitag 12330b38e9 Folderman: Remove one call to updateFolderView.
The reason is that updateFolderView is invoked by the
emitted signal folderSyncStateChange() anyway.

This will reduce the traffic over the SocketAPI nicely,
maybe this was the reason why it was slower than before.
2016-04-14 15:26:11 +02:00
Klaas Freitag 8eb53fa9ae nautilus integration: Handle NOP as empty. 2016-04-14 15:24:46 +02:00
Christian Kamm dfd7d4d2f9 Activity tab visibility fixes #4651 2016-04-14 11:35:16 +02:00
Christian Kamm 484a2c800d Fix typo 2016-04-14 10:59:40 +02:00
Christian Kamm 8d300b049f ShareDialog: Tell a user early if resharing is impossible #4679 2016-04-14 10:16:37 +02:00
ckamm 48e594ebbf Merge pull request #4673 from ckamm/shareperm
Disable unavailable sharing permissions #4383
2016-04-14 09:44:58 +02:00
Christian Kamm 910c61b492 Disable unavailable sharing permissions #4383
Users can't reshare with more permissions than they have themselves.
2016-04-14 09:44:37 +02:00
Jenkins for ownCloud 8155c1c426 [tx-robot] updated from transifex 2016-04-14 02:19:23 -04:00
Daniel Molkentin 97a6d3df82 document Theme::wizardUrlHint() 2016-04-13 15:59:25 +02:00
Olivier Goffart f7aafb081f Dolphin Plugin: rename the files to the branded name #4669 (#4672) 2016-04-13 15:05:04 +02:00
Daniel Molkentin 9cc981c8c7 Make postfixlineedit more userfriendly, rename email id string to "Email". 2016-04-13 14:56:49 +02:00
Klaas Freitag ed3203d25d Merge pull request #4659 from owncloud/fix_client_4651
Fix client #4651
2016-04-13 12:02:45 +02:00
Jenkins for ownCloud a4f606ceab [tx-robot] updated from transifex 2016-04-13 02:19:05 -04:00
Klaas Freitag 15988c6fda SocketAPI: Use NOP only, not NONE in the share api protocol.
Otherwise, plugins might brake, as the linux one did.
2016-04-12 18:28:27 +02:00
Klaas Freitag f443377978 Merge pull request #4664 from ckamm/hiddenfiles
Fix hidden file handling #4655
2016-04-12 17:14:47 +02:00
Olivier Goffart fdcdddca16 CMakeLists: move QtKeychain detection in client 2016-04-12 14:43:26 +02:00
Klaas Freitag bf99306a53 Merge branch 'do_not_close_db_on_done' 2016-04-12 14:36:46 +02:00
Christian Kamm 844777d43f Fix unit test build 2016-04-12 13:43:17 +02:00
Christian Kamm 4f79f1b5e8 Explicitly depend on Qt5Test. 2016-04-12 12:45:55 +02:00
Christian Kamm 6f454feb39 Fix hidden file handling #4655
There were two issues:

* With the refactoring of how Folder and SyncEngine relate, the
  ignore_hidden_files flag on the CSync context was reset after
  each sync run and not updated from the configuration again.

* The folder watcher failed to enumerate hidden folders and thus
  didn't watch for changes inside them. (linux only)
2016-04-12 11:59:07 +02:00
Olivier Goffart 68b7437afb Merge pull request #4658 from owncloud/fix-qt4-build
Fix qt4 build
2016-04-12 10:36:48 +02:00
Christian Kamm 41b950b7e6 Don't call reset() on a query after close() #4662 2016-04-12 10:30:46 +02:00
Jenkins for ownCloud 2d08754f91 [tx-robot] updated from transifex 2016-04-12 02:19:13 -04:00
Klaas Freitag 868edb1f0d SyncJournalDb: Only close the db if the return code is not SQLITE_DONE
SQLITE_DONE is the indicator for not more query results, which is a legal
thing and not an error condition.

Also, check _getFileRecordQuery for null pointer, as close() wipes it.
2016-04-11 17:38:16 +02:00
Klaas Freitag aaf43bd0d3 SyncJournalDb: Handle empty filename and avoid a bogus db query. 2016-04-11 17:36:15 +02:00
Klaas Freitag d5f1d1c6b2 SqlQuery: Add method errorId() to get the numeric error code. 2016-04-11 17:34:59 +02:00
Klaas Freitag 6cb94e8849 Merge pull request #4656 from owncloud/close_journal_fix
Close journal fix - do not keep the journal open or reopen on error.
2016-04-11 16:14:17 +02:00
Klaas Freitag d433c24186 Check if the record returned from getFileRecord is valid.
Handle database fails properly.
2016-04-11 16:04:20 +02:00
Olivier Goffart c48b5c4f61 ActivityWidget: use a QHash for _widgetsToRemove
The problem with QSet is that the QDateTime was part of
the hash, but that does not make sens as it should be unique
per widget and not per <date, widget>

Instead make it a QHash so there is only one entry per widget.
2016-04-11 15:49:24 +02:00
Olivier Goffart 976f4dfabe ActivityWidget: Fix Qt4 build
Don't use API added in Qt5
2016-04-11 15:49:24 +02:00
Olivier Goffart f8dc263338 CMakeLists: fix Qt4 build
Only the src subdirectory needs Qt.
Otherwise it activates Qt4 also for the dolphin plugin which always need Qt5
2016-04-11 15:49:18 +02:00
Klaas Freitag e896d16f32 ActivityWidget: Make sure Notification are visible if Activity disabled
This is the fix for #4651
2016-04-11 15:39:25 +02:00
Klaas Freitag 2ec642aadb ActivityWidget: Properly set widget for the Scrollview.
Also fixed some SizePolicy settings.
2016-04-11 15:38:25 +02:00
Olivier Goffart bd3a079a7b Merge pull request #4648 from owncloud/handle-database-errors
Handle setFileRecord errors #4632
2016-04-11 15:36:46 +02:00
Olivier Goffart 6ee7e82913 Handle setFileRecord errors #4632 2016-04-11 14:11:11 +02:00
Klaas Freitag 648328fbe2 SyncJournalDb: Close the db on error in getFileRecord()
The idea is that the next call to any database operation will try to
reopen the database through the checkConnect() method. So even if there
was a disconnect trom the db file, this will reestablish the connection.
2016-04-11 12:40:19 +02:00
Klaas Freitag ee58cc3b66 SyncEngine: Close the sync journal after the sync run has finished. 2016-04-11 11:31:54 +02:00
Jenkins for ownCloud 74a75f6399 [tx-robot] updated from transifex 2016-04-11 02:19:03 -04:00
Jenkins for ownCloud a0baca25ff [tx-robot] updated from transifex 2016-04-10 02:18:57 -04:00
Jenkins for ownCloud 4b5c9c5ee5 [tx-robot] updated from transifex 2016-04-09 02:19:05 -04:00
ckamm 4ce97633cd Merge pull request #4630 from ckamm/folderwatchwin
Graceful termination of folderwatcher_win #4620
2016-04-09 06:55:30 +02:00
Jenkins for ownCloud f1732d66d6 [tx-robot] updated from transifex 2016-04-08 02:19:09 -04:00
Jenkins for ownCloud 329f512a40 [tx-robot] updated from transifex 2016-04-08 01:15:47 -04:00
Markus Goetz c64720eac5 Merge pull request #4605 from RealRancor/RealRancor-patch-1
Change note to warning in documentation
2016-04-07 15:50:32 +02:00
Klaas Freitag 8f7b833c12 Not Synced Tab: Use tr rather than string concat 2016-04-07 09:18:51 +02:00
Klaas Freitag 48bfcde97d Merge pull request #4640 from owncloud/numberInProtocolTab
ProtocolWidget: Show number of non synced files in tab label.
2016-04-07 09:15:06 +02:00
Klaas Freitag 42439490cc Merge pull request #4645 from owncloud/fix_4633
SelectiveSync: Verify if the list could be read from journal.

If not handle the error rather than assuming the selective sync list is empty.
2016-04-07 09:14:33 +02:00
Jenkins for ownCloud 4dd8d61e4e [tx-robot] updated from transifex 2016-04-07 02:19:10 -04:00
Daniel Molkentin 271bea39ff Update binary subdir 2016-04-06 18:07:35 +02:00
Daniel Molkentin a0827c5ef2 Remove deleted icons from resource file 2016-04-06 17:59:34 +02:00
Klaas Freitag 058cd33324 Not Synced: Display only the number of not synced items in parathesis.
This was Jans wish.
2016-04-06 17:53:42 +02:00
Klaas Freitag e4604b406f SyncEngine: finalize properly on error with syncjournal 2016-04-06 17:20:48 +02:00
Klaas Freitag 7b1f02fcda SelectiveSync: Verify if the list could be read from journal.
If there is a read error from the database while trying to get
the list from database, make sure to not behave badly because
the list is empty.
2016-04-06 15:01:28 +02:00
Klaas Freitag 52a5234122 Merge pull request #4641 from owncloud/bubbleUpConflicts
Bubble up conflicts: Show a tray notification on conflicts and show the conflicts in the not-synced list.
2016-04-06 13:45:47 +02:00
Klaas Freitag 4e17dabcb6 Folder: Fixed a couple of plural translation issues. 2016-04-06 12:22:29 +02:00
Jenkins for ownCloud 15bdb7be64 [tx-robot] updated from transifex 2016-04-06 02:19:26 -04:00
Klaas Freitag 9bdc84c6f4 NotificationJobs: Set ocs header to maintain the session.
This is needed by the server.
2016-04-05 16:52:51 +02:00
Klaas Freitag 252aea25da ProgressDispatcher: Improve wording about conflicts. 2016-04-05 16:38:18 +02:00
Klaas Freitag efb0faa14e Folder: After sync, fire up tray notification if conflicts happened.
If there were conflicts, users want to have a tray notification that warn
about.
This will help for #3222
2016-04-05 16:37:54 +02:00
Klaas Freitag 5b40921587 ProtocolWidget: Show number of non synced files in tab label. 2016-04-05 13:57:38 +02:00
Klaas Freitag 7994b3d91a ProtocolWidget: handle Conflicts as not-synced items 2016-04-05 11:13:12 +02:00
Jenkins for ownCloud 65e740301a [tx-robot] updated from transifex 2016-04-05 02:19:38 -04:00
Jenkins for ownCloud f495daf1cf [tx-robot] updated from transifex 2016-04-05 01:15:46 -04:00
Olivier Goffart 3334067d9f Merge branch '2.1'
Conflicts:
	src/gui/socketapi.cpp
2016-04-04 16:58:49 +02:00
Klaas Freitag 73e2a503d7 NotificationWidget: Some ui refinements. 2016-04-04 12:46:00 +02:00
Klaas Freitag bc6eebddf4 NotificationWidget: Handle empty message and subject properly. 2016-04-04 12:45:39 +02:00
Olivier Goffart 434d16941b SyncEngine: fixed restoring files when they are moved in a new directory
Imagine tgus scenario on a read only share that you move file from
one location to a new directory in the read only share.
Creating the read only directory fails for permission error.
But we should also restore the files that have been moved.

IL issue 542
2016-04-04 10:41:12 +02:00
Klaas Freitag 6b0d535120 Merge branch 'notifications' 2016-04-04 10:40:33 +02:00
Jenkins for ownCloud 8b3ea7aa97 [tx-robot] updated from transifex 2016-04-04 02:19:12 -04:00
Jenkins for ownCloud 84ad0d234e [tx-robot] updated from transifex 2016-04-02 02:19:13 -04:00
Jenkins for ownCloud 87e4370bf4 [tx-robot] updated from transifex 2016-04-01 02:19:45 -04:00
Christian Kamm fa1bb309ca Graceful termination of folderwatcher_win #4620 2016-03-31 15:44:42 +02:00
Christian Kamm e05819370b Fix invalid read on account removal 2016-03-31 09:00:32 +02:00
Jenkins for ownCloud d65808b1e1 [tx-robot] updated from transifex 2016-03-31 02:19:30 -04:00
Jocelyn Turcotte a115f4b9d0 Merge pull request #4625 from owncloud/trivialFixes
Trivial fixes
2016-03-30 18:41:56 +02:00
Daniel Molkentin 9ea191f63d Scale correctly with HiDPI displays on Linux with Qt 5.6 2016-03-30 18:25:30 +02:00
Jocelyn Turcotte 17c645ce43 Hide environment variables when running the FinderSync icns script
This otherwise shows up in the console for each incremental build.
2016-03-30 18:00:22 +02:00
Jocelyn Turcotte f427955512 Simplify the build of auto tests
Remove all configure_files:
- Move all tests to cpp files
- Use the QTEST_MAIN macro instead of a generated main.cpp
- Include test*.moc in the cpp to let CMAKE_AUTOMOC call moc
- Pass info through add_definitions instead of generating oc_bin.h with them

This makes sure that build errors points to the original test source
file instead of the generated one in the build directory to be able to
jump and fix errors directly from the IDE's error pane.
2016-03-30 18:00:22 +02:00
Markus Goetz dd8b0c3e4a Merge pull request #4623 from owncloud/share_menu_icon_osx
OS X: Use app icon for "Share with ..." Finder menu #4472
2016-03-30 15:53:54 +02:00
Markus Goetz 6c283c7a48 OS X: Use app icon for "Share with ..." Finder menu #4472
This works for both plain ownCloud and themed clients.
2016-03-30 15:26:43 +02:00
Christian Kamm c150350096 SyncFileStatusTracker: Fix compilation with older Qt 2016-03-30 13:42:08 +02:00
Christian Kamm c35e74d264 Theme: Enable link sharing by default
Was disabled by accident.
2016-03-30 13:33:12 +02:00
Olivier Goffart cdbc25ede8 Merge pull request #4615 from owncloud/socketApiRefactor
Socket API refactor
2016-03-30 13:24:10 +02:00
Jocelyn Turcotte a0260c29c0 Fix the build on Windows 2016-03-30 12:19:09 +02:00
Jocelyn Turcotte 2c0caf8b75 Fix the SocketApi status of CSYNC_FILE_SILENTLY_EXCLUDED files
Bring back the hardcoded status logic for excluded files.
Since the activity log doesn't even mention those files on purpose,
we can't rely on the SyncEngine to notify us about the status of those files.
2016-03-30 12:10:51 +02:00
Jocelyn Turcotte 56064c9366 Fix sibbling directories showing up as warning
Looking up a/aa while an error is present in a/aab/aaba would return
a warning status since a/aa is a substring of a/aab.
Fix the issue by checking if the following character is a slash.
2016-03-30 11:22:01 +02:00
ckamm 98995f45e6 Merge pull request #4618 from ckamm/progressui
Progress layout adjustments
2016-03-30 09:22:27 +02:00
Christian Kamm 5636dc1386 Tooltip updater: Fix compile with Qt4 2016-03-30 09:21:28 +02:00
Jenkins for ownCloud 127291e35d [tx-robot] updated from transifex 2016-03-30 02:19:15 -04:00
Klaas Freitag 885f8b382f ActivityWidget: Handle plural properly in translations.
Even for the case where the number is fixed.
Also fix the translators comments.
2016-03-29 18:01:54 +02:00
Klaas Freitag 8166c52f4a NotificationHandling: Use QByteArray for the verb. 2016-03-29 18:01:49 +02:00
Jocelyn Turcotte ef57d4ae11 Move the SyncFileStatusTracker directory slash suffix logic in a method 2016-03-29 17:55:02 +02:00
Jocelyn Turcotte fbf23b6abb Cleanup after the SyncFileStatusTracker change
- Add missing explicit keywords
- Add doc
- Comment out verbose and partly redundant qDebug statements
2016-03-29 17:39:30 +02:00
Jocelyn Turcotte 47a552f8c2 Use a std::map for SyncFileStatusTracker problems
This prevents having to define a Problem structure with dubious
operator overloads to accomplish the same.
Also use std::map::lower_bound to quickly iterate over the
list of problems.
2016-03-29 17:29:36 +02:00
Klaas Freitag cd3f612857 ActivityWidget: Rename blacklistActivities to blacklistNotifications. 2016-03-29 16:50:58 +02:00
Klaas Freitag 2e30a0e5bc Remove superflous iterator increment 2016-03-29 16:50:15 +02:00
Klaas Freitag 9f438cb768 Doc: Add milliseconds unit to notificationRefreshInterval doc 2016-03-29 14:39:12 +02:00
Klaas Freitag cacb751ab8 Cleaups based on review feedback. 2016-03-29 14:38:11 +02:00
Klaas Freitag 4d59f5ec66 ActivityData: Declare operators outside the class 2016-03-29 14:09:19 +02:00
Klaas Freitag 69e8e15884 Remove explicit time spec specification as it is not needed. 2016-03-29 13:59:08 +02:00
Daniel Molkentin 1730569f77 No Q_NULLPTR in Qt 4.8 2016-03-29 13:28:11 +02:00
Olivier Goffart 98091aeab7 Theme: document forceSystemNetworkProxy (#4458) 2016-03-29 13:08:33 +02:00
Christian Kamm c5fbde412c Folder info layout adjustments #3403
* Remove duplicate remote path
* Use thin progress bar
* Move bandwidth and file info to tooltip
* Shorten overall progress message

This also fixes #4562 by making the layout not dependent on the
width of the displayed text.
2016-03-29 12:45:01 +02:00
Christian Kamm 10a7128d1a Update QTreeView tooltips as they change #3403 2016-03-29 12:26:09 +02:00
Christian Kamm 41f43feecf Add utility function for shorter time duration strings #3403 2016-03-29 12:26:09 +02:00
Christian Kamm 4915bbf8f3 Adjust size description strings #3403
@jancorchardt suggested to not have decimal places on file
sizes, except for GB.
2016-03-29 12:26:09 +02:00
Christian Kamm ffbd5df25f Account UI: Fix log out button text #4578 2016-03-29 12:14:53 +02:00
Jocelyn Turcotte 82190eaa81 Refactor the overlay icon logic to show errors as a warning for parent folders #3634
This also remove all smartness from the SocketApi about the status
of a file and solely use info from the current and last sync.
This simplifies the logic a lot and prevents any discrepancy between
the status shown in the activity log and the one displayed on the
overlay icon of a file.

The main benefit of the additional simplicity is that we are able
to push all new status of a file reliably (including warnings for
parent folders) to properly update the icon on overlay implementations
that don't allow us invalidating the status cache, like on OS X.

Both errors and warning from the last sync are now kept in a set,
which is used to also affect parent folders of an error.

To make sure that errors don't become warning icons on a second
sync, SyncFileItem::_hasBlacklistEntry is also interpreted as an error.
This also renames StatusIgnore to StatusWarning to match this semantic.

SyncEngine::aboutToPropagate is used in favor of SyncEngine::syncItemDiscovered
since the latter is emitted before file permission warnings are set on the
SyncFileItem. SyncEngine::finished is not used since we have all the
needed information in SyncEngine::itemCompleted.
2016-03-28 14:29:48 +02:00
Jocelyn Turcotte 69aa39f1f6 Don's use SyncFileStatus for Folder::createGuiLog
SyncFileStatus' purpose is to track overlay icon status.
Instead of putting comments and default: clauses in switch
on both sides about unused enums, use different enums.

This also remove STATUS_NEW which is the equivalent of
STATUS_SYNC in all shell extension implementations, and
remove STATUS_UPDATED and STATUS_STAT_ERROR which have
the same semantic as STATUS_UPTODATE and STATUS__ERROR.
2016-03-28 14:29:47 +02:00
Jocelyn Turcotte ea5e6d367b Connect the SocketApi directly to the SyncFileStatusTracker
Don't go through the Folder->ProgressDispatcher->SocketApi route and
keep the path logic in SyncFileStatusTracker.
2016-03-28 14:29:47 +02:00
Jocelyn Turcotte da7b9916e5 Move the SocketApi business logic to a libsync SyncFileStatusTracker class
This will allow testing this code and avoid going through too many
layers to get notified and a file status changed.
2016-03-28 14:29:47 +02:00
Jocelyn Turcotte dac4bd8370 Remove null-checks for FolderMan::_socketApi
It's now created in the constructor and won't be null.
2016-03-28 14:29:47 +02:00
Jocelyn Turcotte 6e16e34799 Remove SocketApi::dbFileRecord_capi in favor of JournalDB::getFileRecord 2016-03-28 14:29:47 +02:00
Jocelyn Turcotte 6d3fe9d865 Remove the tainted folder logic
This currently is no-op code since the socket API isn't notified
that the tainted folder list changed, and the result is the same
since a sync will be triggered within the next 5 seconds and the
modified folder will be shown as SYNC at that point anyway.

Removing the dependency to the file watcher allows moving the
status estimation logic to libsync.
2016-03-28 14:29:47 +02:00
Jocelyn Turcotte c090a511fd Remove OwnCloud6 specific sharing code
If users encounter this situation, the share icon will simply not show.
This simplifies the transition to move this code in libsync.
2016-03-28 14:29:47 +02:00
Jocelyn Turcotte a4e0899af4 Remove the mutex from ExcludedFiles
It's always accessed from the main thread.
2016-03-28 14:29:47 +02:00
Jocelyn Turcotte 2d2c7bc9b8 Move the SyncEngine construction to the Folder constructor
The SyncEngine is now created only once, at construction of the
Folder, instead of being reconstructed on each sync.
2016-03-28 13:26:38 +02:00
Jocelyn Turcotte df386b64ba Make the AccountState a construction argument of the Folder
This will help moving the SyncEngine construction in the constructor
and allow moving functionalities from Folder to SyncEngine or its
delegated objects.
2016-03-28 13:07:28 +02:00
Jenkins for ownCloud 80bd86a305 [tx-robot] updated from transifex 2016-03-28 02:18:50 -04:00
Jenkins for ownCloud d55c31d93b [tx-robot] updated from transifex 2016-03-27 02:19:06 -04:00
Jenkins for ownCloud 68cbaf1bd6 [tx-robot] updated from transifex 2016-03-26 02:18:41 -04:00
Jenkins for ownCloud 6867c2ffb3 [tx-robot] updated from transifex 2016-03-25 02:19:21 -04:00
Jenkins for ownCloud ecb34f60f2 [tx-robot] updated from transifex 2016-03-25 01:15:43 -04:00
Jocelyn Turcotte 5989a07339 [Win-shellex] Make sure to unregister obsolete CLSIDs #4595
If the user tries to install an older version of a branded client
with shell extensions, and also install the 2.1 ownCloud client
side-by-side, both shell extensions DLLs will be registered and might
lead to both DLLs versions being loaded by exlorer, causing a system
crash.

Since we don't support both branded and non-branded shell extensions
to work at the same time, at least make sure to unregister any legacy
CLSID that could cause explorer to load the previous version DLL.
2016-03-24 16:35:38 +01:00
Daniel Molkentin 7730e826b0 Merge pull request #4580 from owncloud/implement_ep_1136
Implement EP 1136
2016-03-24 14:58:09 +01:00
Daniel Molkentin 2d24585a8f Implement enforcing a static URL postfix.
Second part of EP 1136
2016-03-24 14:18:52 +01:00
Jenkins for ownCloud 84a6d1e920 [tx-robot] updated from transifex 2016-03-24 02:19:22 -04:00
RealRancor 05fae8ee7f Change note to warning in documentation 2016-03-23 18:19:44 +01:00
Klaas Freitag 1fe5d6bb0c Notifications: Handle Notifications without an action.
The policy that was said is that if a notification has no action, the
client can and should display a close-button. This patch does it.

In additon to that, the client needs a blacklist of closed notifcations
otherwise they would re-appear next time the server notifications are
fetched again.

Also, changed the cleanup of not-longer-used widgets to be more robust.
2016-03-23 17:02:13 +01:00
Klaas Freitag 0c944a06f9 NotificationWidgetUI: Fix sizing and sizePolicy 2016-03-23 16:49:25 +01:00
Klaas Freitag 1bb3a4a45d NotificationWidget: Remove accountName() and add activity() method. 2016-03-23 16:48:38 +01:00
Klaas Freitag 161d21904a ActivityData: Add source file for implementation details
Add the ident() method and operators.
2016-03-23 16:47:13 +01:00
Klaas Freitag ea2f19b78a Docs: Add new config option for the notification sync interval. 2016-03-22 11:38:44 +01:00
Klaas Freitag f70c6282ca Notifications: Remove unused variable. 2016-03-22 11:38:10 +01:00
Klaas Freitag ad60e8ac89 Notifications: Fix handling of notifications to remove from the list.
If a notification is not longer in the list of notifications coming from
the server, it needs to be removed from the widget list.
2016-03-22 10:35:24 +01:00
Klaas Freitag d03fcc95e4 Notifications: Maintain a timeSinceLastCheck for every Account.
In multi-account environment every account needs the own counter.
2016-03-22 09:58:30 +01:00
Jenkins for ownCloud 588646f7a2 [tx-robot] updated from transifex 2016-03-22 02:19:22 -04:00
Daniel Molkentin fb75adcd57 Wizard: Implement alternative forms of inquiring about the userID
Settable in the theme.
2016-03-21 23:50:48 +01:00
Klaas Freitag d407aacc4a Notifications: remove notification widgets if the notification is gone.
If a notification is not longer in the list that comes from the
server, the notification is removed.

That is mainly for the notifications that are created by the
announcement application
2016-03-21 16:32:37 +01:00
Markus Goetz 02a69d5487 Exclude: Weird GoogleDrive "My Saved Places." file #4573 2016-03-21 15:15:59 +01:00
Markus Goetz 57acde758b Documentation: promptDeleteAllFiles #4389 2016-03-21 15:05:49 +01:00
Klaas Freitag f587f35ef0 Fix plural translation handling, remove the superflous arg() 2016-03-21 15:03:28 +01:00
Jenkins for ownCloud 8c00d5e1ee [tx-robot] updated from transifex 2016-03-21 02:19:11 -04:00
Jenkins for ownCloud f02148e8ca [tx-robot] updated from transifex 2016-03-20 02:18:46 -04:00
Jenkins for ownCloud 476d628c01 [tx-robot] updated from transifex 2016-03-19 02:19:17 -04:00
Jocelyn Turcotte c55ac504a3 Merge pull request #4584 from lultimouomo/fix-destruction-order
Fix crash due to destruction order
2016-03-18 18:58:23 +01:00
Luca Niccoli 6735126c09 Fix crash due to destruction order 2016-03-18 16:41:48 +01:00
Klaas Freitag b9663456d8 Notifications: Refresh the notifications based on a config value.
Pulls a timer that polls for new notifications regularly. Add
Config file method for the interval value.
2016-03-18 16:28:20 +01:00
Daniel Molkentin cabeeba7c5 Merge pull request #4582 from owncloud/nsis_uninstall_test
NSIS: Force uninstall before install #4543
2016-03-18 16:01:41 +01:00
Markus Goetz 6c517638d0 NSIS Silent mode: Force uninstall before install #4543 2016-03-18 16:00:29 +01:00
Klaas Freitag 0e1b9a346d Fix plural translation handling, remove the superflous arg() 2016-03-18 15:28:00 +01:00
Christian Kamm 03db1894d8 Fix wizardSelectiveSyncDefaultNothing #4581 2016-03-18 13:52:45 +01:00
Christian Kamm ff4cdc3161 Quota: Change quota path if single folder #4460
Since the quota is a per-folder value, this will make the displayed data
more useful when a single sync folder is configured.

Of course each subfolder could have a different quota again.
2016-03-18 13:34:49 +01:00
Christian Kamm 0febe9b0df Revert "Utility: Make sure to use UTC timestamp to compare in timeAgoInWords"
This reverts commit 41b43bf961.

Using now in UTC should make no difference, but that assert might
trigger...
2016-03-18 13:15:35 +01:00
Christian Kamm ceb4a23dab Fix compile with strict C flags 2016-03-18 12:41:57 +01:00
Klaas Freitag 7f22a07312 Notifications: Check if the account is connected before querying.
Also avoid memory leaks if it is not connected.
2016-03-18 12:29:09 +01:00
Klaas Freitag 328d254f7f Notifications: Remove "done" notification widgets after fife seconds. 2016-03-18 11:25:14 +01:00
Markus Goetz 15f6e133a5 sqlite: Update to version 3.11.1
For OS X and Windows.
2016-03-18 10:17:41 +01:00
Klaas Freitag 0a590b7cbe Notifications: Give feedback if notifcation request succeeded.
Also display a time stamp.
2016-03-18 10:02:11 +01:00
Klaas Freitag f04895a407 Utility: Fix plural translation. 2016-03-18 08:31:13 +01:00
Klaas Freitag 41b43bf961 Utility: Make sure to use UTC timestamp to compare in timeAgoInWords
This should help to fix the problems we see in #4521
2016-03-18 08:31:03 +01:00
Klaas Freitag 05de710b67 Notifications: Display timestamp of the notification in the widget 2016-03-18 08:21:54 +01:00
Klaas Freitag f71fdab997 Fix timeAgoInWords 2016-03-18 08:20:23 +01:00
Jenkins for ownCloud 6d8e570420 [tx-robot] updated from transifex 2016-03-18 02:19:21 -04:00
Christian Kamm d7bd1300a8 Ignores: expand escapes #4568 2016-03-17 14:31:53 +01:00
Christian Kamm 2bba68e059 Handle server timezone data correctly #4521
The date we receive from the server is an ISO8601 datetime that
includes the offset from UTC. Qt does correctly parse this
information and creates the appropriate QDateTime object.

Calling setTimeSpec(UTC) will force the timezone offset to 0 and
thereby change the referenced point in time to an incorrect one.
2016-03-17 13:04:18 +01:00
Christian Kamm 4b19cdeca0 Propfind: Treat broken XML response as failure #4575
Soldiering on with a broken or incomplete response could lead to
incorrect sync behavior.

Since discovery uses LsCol jobs which already handle errors
correctly, this should not have a significant impact.
2016-03-17 11:32:19 +01:00
Olivier Goffart 3d157cbb02 User-Agent: put the actual version string in there
It contains the build id in addition

(cherry picked from commit e0e793fb14)
2016-03-17 10:52:55 +01:00
Olivier Goffart 80b5f3f43d Never overwrite the size from the db when updating the metadata
the size on the server might be different from the size on the client
with certain backend so it should be ignored.

(cherry picked from commit 9222db6df9)
2016-03-17 10:48:49 +01:00
Olivier Goffart 254361cb87 Shared dialog: move the error label up (#4348) 2016-03-16 18:06:46 +01:00
Klaas Freitag f7f412007e Activity: Some documentation and better varialbe names 2016-03-16 16:31:52 +01:00
Klaas Freitag 45c32ec0b1 NotificationWidget: Remove not needed method. 2016-03-16 16:21:20 +01:00
Jenkins for ownCloud 97e323ac3a [tx-robot] updated from transifex 2016-03-16 02:19:14 -04:00
Christian Kamm 04faee4a0f Doc: low disk space #4443 2016-03-15 15:20:23 +01:00
Christian Kamm 4900703970 SqlQuery: Write NULL when intended #4548
In SQLite bindings are not cleared by sqlite3_reset() calls, so
skipping a sqlite3_bind call to create a NULL value doesn't work,
instead the previous value will be written.

To fix this, I clear all bindings in SqlQuery::reset and make sure
to explicitly bind NULL when desired in SqlQuery::bind.

To make sure there's no confusion about SqlQuery::reset and
sqlite3_reset, I rename our method to reset_and_clear_bindings().

(cherry picked from commit 7bd4f95b8c)
2016-03-15 15:17:35 +01:00
Christian Kamm 7bd4f95b8c SqlQuery: Write NULL when intended #4548
In SQLite bindings are not cleared by sqlite3_reset() calls, so
skipping a sqlite3_bind call to create a NULL value doesn't work,
instead the previous value will be written.

To fix this, I clear all bindings in SqlQuery::reset and make sure
to explicitly bind NULL when desired in SqlQuery::bind.

To make sure there's no confusion about SqlQuery::reset and
sqlite3_reset, I rename our method to reset_and_clear_bindings().
2016-03-15 14:38:31 +01:00
Markus Goetz ecd44f70de Submodule: Use https path
Else I got a git hickup here
2016-03-15 11:55:28 +01:00
Markus Goetz 9d5307d04c Propagator: On remove move, take size from DB
Some servers can claim different sizes for on-the-fly protected/encrypted
MS Office files during discovery.
2016-03-15 10:28:47 +01:00
Jenkins for ownCloud 6e697bae97 [tx-robot] updated from transifex 2016-03-15 02:19:11 -04:00
Jenkins for ownCloud 366abb5350 [tx-robot] updated from transifex 2016-03-15 01:15:43 -04:00
Markus Goetz 9460aa7f21 SyncEngine: Also emit item in other code path
Else a user of this library cannot build a complete list of items.
2016-03-14 18:12:07 +01:00
Klaas Freitag a4dcc2784a Notification: Fix plural handling for tray message 2016-03-14 16:21:04 +01:00
Klaas Freitag 9a2f1456c5 ocs jobs: Add a define for OCS job success. 2016-03-14 15:41:20 +01:00
Klaas Freitag 9d219a18f3 ActivityListModel: Code cleanups
based on review feedback.
2016-03-14 15:40:39 +01:00
Klaas Freitag 97f1694f7e ActivityData: Simplified implementation.
Use QVariantHash and removed ActivityList object in favour
of a typedef
2016-03-14 15:39:07 +01:00
Klaas Freitag 73cd5a9c27 Notifications: Cleaner notification string build 2016-03-14 14:41:21 +01:00
ckamm 25baa995ec Merge pull request #4532 from ckamm/content-checksum
Enable content checksums #4375
2016-03-14 09:49:31 +01:00
Jenkins for ownCloud 39a95d3bd5 [tx-robot] updated from transifex 2016-03-14 02:19:15 -04:00
Jenkins for ownCloud 22acc004cc [tx-robot] updated from transifex 2016-03-12 02:19:25 -05:00
Markus Goetz 6c07f08175 Proxies: Enable ownBrander to force system proxy usage #4458 2016-03-11 16:21:40 +01:00
Markus Goetz 62d4ed8087 Protocol: Show by default instead of server activity #4395 2016-03-11 16:08:56 +01:00
Klaas Freitag adf9570a92 Notification: Enhance the tray message
Add the hostname from where the notification comes, as well as
the name of the application to the header.
2016-03-11 12:48:31 +01:00
Klaas Freitag 2c2a18af43 Activitiy: Refactor - move classes to their own source files.
Created a activitydata.h header (only) for the basic data, plus
a separate file for the model. Cleans up the widget source.
2016-03-11 11:41:19 +01:00
Klaas Freitag 2d1ab27cb5 Notifications: Refactor - create a notification handler class
That cleans the ActivityWidget class
2016-03-11 10:48:34 +01:00
Klaas Freitag 903e79a7c4 Notifications: Do a GUI tray notification if new notifciations arrive.
Show a GUI notification once an hour if no new notifications arrive
to not annoy users.
2016-03-11 10:15:28 +01:00
Jenkins for ownCloud 6b8636f79b [tx-robot] updated from transifex 2016-03-11 02:19:14 -05:00
Klaas Freitag 8a0ce463da Notifications: Properly delete the notification check job. 2016-03-10 17:46:00 +01:00
Klaas Freitag 7d13a1d8e1 Notifications: Check capabilities if the notifications are enabled
If not, do not query for them.
2016-03-10 17:46:00 +01:00
Klaas Freitag b97c832306 Capabilities: Add isValid check and check for notifications
The isValid check should be used everywhere the capabilities
are used as the loading of the capabilities is happening
in parallel of the startup, so it is not guaranteed to be
available always.
2016-03-10 17:46:00 +01:00
Klaas Freitag 4a4dac22e2 Notifications: Add a Progress indicator and handle job results.
Parse the replyCode from the button action calls and disable
buttons accordingly.
2016-03-10 17:46:00 +01:00
Klaas Freitag 32e16b323c Display server notifications on the client (#3733)
As interaction is required, the notifications are displayed in a
separate widget above the server activity list.

Note that design and also where we display the notifications can
still be discussed and changed.
2016-03-10 17:46:00 +01:00
Klaas Freitag 688c5502a8 New GUI class NotificationWidget.
It displays a server notification that can come with a dynamic
set of buttons next to a message and a subject (=header)
2016-03-10 17:22:36 +01:00
Klaas Freitag eb00b34191 Minor wording fixes 2016-03-10 17:22:36 +01:00
Klaas Freitag a831b7417f Added temporar icon for notifications. 2016-03-10 17:22:36 +01:00
Klaas Freitag 0eb1041290 AbstractNetworkJob: Add a delete job.
It is needed to easily send delete requests which happen
through the notify API.
2016-03-10 17:22:36 +01:00
Jenkins for ownCloud c0623295e0 [tx-robot] updated from transifex 2016-03-10 02:19:25 -05:00
Jenkins for ownCloud e82a13803d [tx-robot] updated from transifex 2016-03-10 01:15:45 -05:00
Markus Goetz 5cb45bf738 Merge pull request #4549 from owncloud/fix_4545
Add account name to warning message boxes in Folder
2016-03-09 19:12:34 +01:00
Markus Goetz a14b495864 Old servers: Don't nag if version still undetected #4523 2016-03-09 15:57:45 +01:00
Markus Goetz ad1c343cd7 Merge pull request #4552 from owncloud/hide_activity_tab
Activities: Hide if non of the accounts has the app enabled.
2016-03-09 15:34:12 +01:00
Christian Kamm 17003cec19 Settings: Hide update info if skipUpdateCheck #4397
(cherry picked from commit 93de378fb21e934d324d621f66eec98e53f1637a)
2016-03-09 15:32:32 +01:00
Markus Goetz 2843214d09 Merge pull request #4531 from ckamm/old-server
Add warnings for old server versions #4523
2016-03-09 15:16:48 +01:00
Daniel Molkentin b456ded5e7 Show full path in warning message boxes before folder removal
Fixes #4545
2016-03-09 14:07:34 +01:00
Roeland Douma d4848880e1 Merge pull request #4553 from owncloud/add_spinner
Add spinner to show we are creating the share
2016-03-09 09:39:48 +01:00
Jenkins for ownCloud e41bb8af6d [tx-robot] updated from transifex 2016-03-09 02:19:14 -05:00
Jenkins for ownCloud 3a608dda8f [tx-robot] updated from transifex 2016-03-09 01:15:44 -05:00
Roeland Jago Douma 41d38b37cf Add spinner to show we are creating the share
Fixes #3737
2016-03-08 20:54:14 +01:00
Olivier Goffart 54612455e6 Merge pull request #4513 from owncloud/csyncContextToSyncEngine
Move the csync_context creation in SyncEngine
2016-03-08 18:12:31 +01:00
Klaas Freitag 9c5b9f932b Activities: Hide if non of the accounts has the app enabled.
If the ownCloud server does not have the activity app enabled,
it returns 999 as status code. If all the configured accounts
do that, this code hides the entire tab with the server
activities.

This is supposed to fix #4533
2016-03-08 18:01:42 +01:00
Jenkins for ownCloud debaff6f7a [tx-robot] updated from transifex 2016-03-08 02:19:06 -05:00
Jenkins for ownCloud 25ce5f1c22 [tx-robot] updated from transifex 2016-03-06 02:18:40 -05:00
Jenkins for ownCloud a441e4e30d [tx-robot] updated from transifex 2016-03-05 02:19:40 -05:00
Jenkins for ownCloud 50c32f45ac [tx-robot] updated from transifex 2016-03-05 01:15:44 -05:00
Jenkins for ownCloud 5f24575ed9 [tx-robot] updated from transifex 2016-03-04 02:19:10 -05:00
Jocelyn Turcotte e91a5c85ff Move the Logger reference back into src/gui 2016-03-03 20:26:48 +01:00
Jocelyn Turcotte 7561f5c717 Add comment and cleanup the csync exclude list code
Removed the csync_add_exclude_list function that isn't use anywhere
anymore.
2016-03-03 20:26:48 +01:00
Christian Kamm c554f5383c Downloads: Preserve group ownership #4330 2016-03-03 12:02:06 +01:00
Christian Kamm 4f48c888ef Don't use QVector::removeOne, added in Qt 5.4
A QList makes sense there and makes the rest of the code
work with earlier Qt versions.
2016-03-03 10:03:41 +01:00
Jenkins for ownCloud 4ff6dc2992 [tx-robot] updated from transifex 2016-03-03 02:19:13 -05:00
Markus Goetz 266508b691 Merge pull request #4529 from owncloud/dynamic_parallelism_scaling
Propagator: Pump in more requests if we think current ones are quick
2016-03-02 15:23:58 +01:00
Markus Goetz d78c3679e7 Propagator: Pump in more requests if we think current ones are quick
Helps with small file sync #331
When I benchmarked this, it went up to 6 parallelism and
was about 1/3 faster than the previous fixed 3 parallelism.
Doing more than 6 is dangerous because QNAM limits to 6 TCP
connections and also the server might become a bottleneck.

Should also help for #4081
2016-03-02 15:22:21 +01:00
Christian Kamm d6d3502960 Checksums: Compute content checksum on download #4375 2016-03-02 14:28:41 +01:00
Christian Kamm 7ed7512f27 Checksums: Content checksums for all uploads #4375 2016-03-02 14:28:20 +01:00
ckamm ffa78b99d9 Merge pull request #4512 from owncloud/add-checksum-to-database
Checksums: keep the transfer checksum in the database as the content …
2016-03-02 14:04:37 +01:00
Christian Kamm f66c28900a Add warnings for old server versions #4523
* A tray message on every start up
* Red message in account settings
* Folders are paused when the server version switches to
  an unsupported one
2016-03-02 12:54:22 +01:00
Christian Kamm 40c109597e Improve folder pausing API
Previously one could accidentally call Folder::setSyncPaused() and miss
some expected side effects. Before, the correct call was to FolderMan::
slotSetFolderPaused(). Now the setter on Folder has the expected effect.
2016-03-02 11:06:03 +01:00
ckamm 6e9019120f Merge pull request #4527 from ckamm/account-pause
Account pausing #3829
2016-03-02 10:35:40 +01:00
Jenkins for ownCloud 17f40f7efd [tx-robot] updated from transifex 2016-03-02 02:19:13 -05:00
Roeland Douma b0db709960 Merge pull request #4501 from owncloud/fix_4481
Do not send reshare permissions when creating a federated share
2016-03-01 17:03:00 +01:00
Roeland Douma 216956da4a Merge pull request #4493 from owncloud/fix_4185
Disable sharing dialog if account state is not connected
2016-03-01 16:59:40 +01:00
Roeland Jago Douma e4ec09dd87 Do not send reshare permissions when creating a federated share
See https://github.com/owncloud/core/issues/22122#issuecomment-185637344
2016-03-01 16:58:47 +01:00
Roeland Jago Douma ba42d40df9 Disable sharing dialog if account state is not connected
Fixes #4185
2016-03-01 16:55:56 +01:00
Christian Kamm d521232587 AccountState: Allow storing state in settings
This will be useful if we ever want to store account-level gui state.
I built this originally because I thought a paused account would be
this kind of state.
2016-03-01 16:08:23 +01:00
Christian Kamm 10e8f03ea4 Add 'pause all' tray menu entry #3829 2016-03-01 16:07:11 +01:00
Roeland Douma 8877f04835 Merge pull request #4497 from owncloud/fix_4469
Lock the sharee input when sharing
2016-03-01 15:40:29 +01:00
Roeland Douma f24fa46789 Merge pull request #4496 from owncloud/fix_4325
Add theming options control sharing operations
2016-03-01 15:33:04 +01:00
Christian Kamm a9b00a7489 Don't make files read-only when server is too old #4450 2016-03-01 10:11:20 +01:00
Jenkins for ownCloud 3f462403a9 [tx-robot] updated from transifex 2016-03-01 02:18:58 -05:00
Jenkins for ownCloud 6aa418f7c4 [tx-robot] updated from transifex 2016-02-29 12:10:28 -05:00
Carla Schroder 6493421109 Merge pull request #4509 from owncloud/build-client
improve client build instructions
2016-02-29 08:00:12 -08:00
Jocelyn Turcotte 49f00499f7 Fix a crash when syncing 2016-02-26 18:05:04 +01:00
Carla Schroder 0052386b41 correct OBS url for client building 2016-02-26 08:41:33 -08:00
Carla Schroder e1909c3bd1 add OBS link for client building 2016-02-26 08:37:54 -08:00
Carla Schroder 8ce9388d29 corrections to client building instructions 2016-02-26 08:32:52 -08:00
Jocelyn Turcotte b8227afcaa Move the csync_context creation in SyncEngine
The creation doesn't need to be separated from the SyncEngine anymore.
This allows the SyncEngine to be created in fewer steps if we want to
use it in tests.

This moves most of the direct csync code from Folder into the SyncEngine.
The exclude file logic for the context has been wrapped using the
existing ExcludedFiles class as well.
2016-02-25 20:53:13 +01:00
Jocelyn Turcotte b8dee63d7a Remove superfluous error checking from csync_create and csync_init
Given that we control all call sites, the only way that this can fail is during
OOM. Also remove the code in csync itself to make sure that it's obvious that
any new error case wouldn't be handled by call sites.
2016-02-25 20:53:13 +01:00
Jocelyn Turcotte 75c99bf2b1 Fix TestXmlParse::testParser1 2016-02-25 20:53:13 +01:00
Olivier Goffart e6f81d3965 Checksums: keep the transfer checksum in the database as the content checksum
Currently, we only use this for .eml files. But we can just store this checksum
in the database if it was computed anyway.

Issue #4487
2016-02-25 17:17:14 +01:00
Olivier Goffart 1fafb1325b Revert "AccountManager: take theURL from the Theme rather than from the config if the theme specify it"
The URL may change from shiboleth to normal authentication method.
Also some people were changing the config file manually to test stuff

Issue https://github.com/owncloud/enterprise/issues/1113

This reverts commit 7e5d89293d.
2016-02-25 11:33:26 +01:00
Jocelyn Turcotte 8222295ab1 Merge pull request #4508 from owncloud/fix-crash
PropagatorDownload: fix possible crash
2016-02-25 10:46:45 +01:00
Jenkins for ownCloud 744464aca6 [tx-robot] updated from transifex 2016-02-25 01:15:43 -05:00
Carla Schroder c13637b105 improve client build instructions 2016-02-24 13:31:19 -08:00
Olivier Goffart 60c101d90b PropagatorDownload: fix possible crash
Backtrace seen from the crash reporter where reply() is null.
2016-02-24 19:52:14 +01:00
Olivier Goffart b685f6b6b6 Chunking: change the default chunk size to 10MB
As discussed with Klaas, this seems to be a better compromise.
10MB * 3 prarralel jobs = 30MB in memory, and to retry in case of
disconnection. Which is still reasonable.  And might make the upload
almost twice as fast on fast network where the amount of chunk is the
bottleneck (because of more server processing)

Relates to issue #4354
2016-02-24 16:25:45 +01:00
Carla Schroder 424bf6f06a Merge pull request #4503 from owncloud/client-regkeys
Add note that branded clients have custom windows registry key names
2016-02-23 09:47:10 -08:00
Carla Schroder 46c3c9e0fc fix formatting 2016-02-23 09:45:30 -08:00
Carla Schroder 85f6c5fda8 Add note that branded clients have custom windows registry key names 2016-02-23 09:42:40 -08:00
Olivier Goffart 7e5d89293d AccountManager: take theURL from the Theme rather than from the config if the theme specify it
That way an upgrade of the client can actually change the URL
Issue https://github.com/owncloud/enterprise/issues/1113
2016-02-23 18:10:11 +01:00
Markus Goetz fe7630954e Propagator: Remove 100msec delay between jobs 2016-02-23 14:27:35 +01:00
Markus Goetz 47ce4bd9e5 SelectiveSync: Improve menu #4378 2016-02-23 11:28:03 +01:00
Olivier Goffart 8fe4f1f0d7 Selective sync: Don't show negative size
Relates to issue #4491
2016-02-22 17:26:09 +01:00
Olivier Goffart b3d57f3c7c Cleanup syncengine after the new option not to ask confirmation when everything is removed
Cleanup after pull reuqest  #4389

Do not make the SyncEngine depends on the ConfigFile
2016-02-22 16:14:22 +01:00
Markus Goetz a76ba06817 Merge pull request #4389 from Bottswana/deleteprompt
Add option to disable the delete all files prompt
2016-02-22 15:44:50 +01:00
Markus Goetz 86fb83261a Merge pull request #4470 from RealRancor/chunksize_config
Add chunkSize config to documentation
2016-02-22 15:43:12 +01:00
Roeland Jago Douma cf0762a067 Lock the sharee input when sharing
This prevents accidentally sharing with the same sharee multiple times.
Because creating shares is not instance.

Fixes #4469
2016-02-22 15:14:05 +01:00
Roeland Jago Douma 99b3b752e3 Add theming options control sharing operations
Fixes #4325
2016-02-22 13:53:45 +01:00
Markus Goetz 5d7aa792e7 SyncEngine: Improve error message for ignored files/folders #4143 2016-02-22 11:13:29 +01:00
Hefee 28b694b170 Merge branch '2.1' 2016-02-20 10:34:34 +01:00
Hefee 74f74e0363 fix typo occured->occurred 2016-02-20 10:33:13 +01:00
Jenkins for ownCloud 64ca8a668a [tx-robot] updated from transifex 2016-02-20 01:15:28 -05:00
Daniel Molkentin bd72408e7a Merge pull request #4488 from owncloud/21-updates
doc updates for 2.1.1 release
2016-02-19 09:16:37 +01:00
Carla Schroder a32381a2a4 doc updates for 2.1.1 release 2016-02-18 10:31:51 -08:00
Daniel Molkentin 841973d399 Use correct values for items in version.rc 2016-02-17 14:16:29 +01:00
Jenkins for ownCloud cf47523b2c [tx-robot] updated from transifex 2016-02-17 02:19:09 -05:00
Daniel Molkentin 2918e45343 Add comment, transliterate copyright symbol 2016-02-16 17:56:51 +01:00
Daniel Molkentin e3b56fb559 Add file description, copyright to win32 VERSIONINFO struct 2016-02-16 16:19:12 +01:00
Jenkins for ownCloud 667f2a7c4c [tx-robot] updated from transifex 2016-02-16 02:19:01 -05:00
Klaas Freitag e846b36bf6 Tests: Add a test for the timeAgoInWords function 2016-02-15 17:59:24 +01:00
Klaas Freitag 7f18d087e6 Utility: Make the timeAgoInWords method a bit more verbose 2016-02-15 17:59:24 +01:00
Klaas Freitag 3cc9019b37 ActivityWidget: Set timespec to UTC for JSON values.
This will fix the problem in #4439 that the time display
jumps if the timezone is changed on windows.
2016-02-15 17:59:24 +01:00
Daniel Molkentin 37924b9c7f Win32: More complete resource specification
Add application and vendor name

Addresses #4473
2016-02-15 15:51:48 +01:00
RealRancor ed06fc51a0 Add chunkSize config to documentation 2016-02-12 11:34:27 +01:00
Olivier Goffart cd83772112 SyncJounral: add an index on the error blacklist table
https://github.com/owncloud/enterprise/issues/1035
2016-02-11 14:38:38 +01:00
Olivier Goffart 893e22691d ConnectionValidator: Make sure we intercept propfind error
If the PROPFIND return an invalid code (like 200) then we would
not recieve the error signal and we would never sync again.

Found while investigating https://github.com/owncloud/enterprise/issues/1068
2016-02-10 15:38:21 +01:00
James Botting f442195b8a Remove option from GUI, leaving config option only. 2016-02-05 15:48:17 +00:00
James Botting d8af949a6a Alter sync engine to check new setting before displaying prompt 2016-01-24 18:45:29 +00:00
James Botting 74a8c4aae8 Add additional configuration option to toggle display of delete prompt 2016-01-24 18:45:12 +00:00
281 arquivos alterados com 50839 adições e 28447 exclusões
+1 -1
Ver Arquivo
@@ -3,7 +3,7 @@
url = https://github.com/owncloud/documentation
[submodule "src/3rdparty/qtmacgoodies"]
path = src/3rdparty/qtmacgoodies
url = git://github.com/guruz/qtmacgoodies.git
url = https://github.com/guruz/qtmacgoodies.git
[submodule "binary"]
path = binary
url = git://github.com/owncloud/owncloud-client-binary.git
+10 -4
Ver Arquivo
@@ -1,15 +1,21 @@
sudo: required
language: cpp
services:
- docker
branches:
only:
- coverity_scan
before_install:
- sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
- sudo sh -c "echo 'deb-src http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
- wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/xUbuntu_12.04/Release.key
- sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_14.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
- sudo sh -c "echo 'deb-src http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_14.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
- wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/Ubuntu_14.04/Release.key
- sudo apt-key add - < Release.key
- sudo apt-get update
- sudo apt-get build-dep owncloud-client
- sudo apt-get -y build-dep owncloud-client
- checkout=$(git show-ref --head --hash head)
- cd ../
- wget https://scan.coverity.com/download/linux-64 --post-data "token=$token&project=owncloud%2Fmirall" -O coverity_tool.tgz
+18 -29
Ver Arquivo
@@ -1,3 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_policy(VERSION 2.8.0)
@@ -20,6 +21,11 @@ if (NOT DEFINED APPLICATION_SHORTNAME)
set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
endif()
# For usage in XML files we preprocess
string(REPLACE "&" "&amp;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME}")
string(REPLACE "<" "&lt;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
string(REPLACE ">" "&gt;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
set(PACKAGE "${APPLICATION_SHORTNAME}-client")
set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
@@ -30,7 +36,7 @@ endif()
include(Warnings)
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/")
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
# disable the crashreporter if libcrashreporter-qt is not available or we're building for ARM
if( CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/libcrashreporter-qt/CMakeLists.txt")
@@ -51,9 +57,7 @@ endif()
include(GNUInstallDirs)
include(DefineInstallationPaths)
include(QtVersionAbstraction)
setup_qt()
include(GetGitRevisionDescription)
@@ -122,38 +126,23 @@ if(OWNCLOUD_5XX_NO_BLACKLIST)
add_definitions(-DOWNCLOUD_5XX_NO_BLACKLIST=1)
endif()
# When this option is enabled, a rename that is not allowed will be renamed back
# do the original as a restoration step. Withut this option, the restoration will
# re-download the file instead.
# The default is off because we don't want to rename the files back behind the user's back
# Added for IL issue #550
option(OWNCLOUD_RESTORE_RENAME "OWNCLOUD_RESTORE_RENAME" OFF)
if(OWNCLOUD_RESTORE_RENAME)
add_definitions(-DOWNCLOUD_RESTORE_RENAME=1)
endif()
if(APPLE)
set( SOCKETAPI_TEAM_IDENTIFIER_PREFIX "" CACHE STRING "SocketApi prefix (including a following dot) that must match the codesign key's TeamIdentifier/Organizational Unit" )
endif()
#### find libs
#find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml QtNetwork QtTest QtWebkit REQUIRED )
#if( UNIX AND NOT APPLE ) # Fdo notifications
# find_package(Qt4 4.7.0 COMPONENTS QtDBus REQUIRED )
#endif()
if(HAVE_QT5)
if (${Qt5Core_VERSION_MAJOR} EQUAL "5")
if (${Qt5Core_VERSION_MINOR} EQUAL "4" OR ${Qt5Core_VERSION_MINOR} GREATER 4)
else()
message(STATUS "If possible compile me with Qt 5.4 or higher.")
endif()
endif()
else()
message(STATUS "If possible compile me with Qt 5.4 or higher.")
endif()
find_package(OpenSSL 1.0.0 REQUIRED)
if(NOT TOKEN_AUTH_ONLY)
if (Qt5Core_DIR)
find_package(Qt5Keychain REQUIRED)
else()
find_package(QtKeychain REQUIRED)
endif()
endif()
if(APPLE)
find_package(Sparkle)
endif(APPLE)
+36
Ver Arquivo
@@ -1,5 +1,41 @@
ChangeLog
=========
version 2.2.1 (release 2016-06-06)
* Fix out of memory error when too many uploads happen (#4611)
* Fix display errors in progress display (#4803 #4856)
* LockWatcher: Remember to upload files after they become unlocked (#4865)
* Fix overlay icons for files with umlauts (#4884)
* Certs: Re-ask for different cert after rejection (#4898, #4911)
* Progress: Don't count items without propagation jobs (#4856, #4910)
* Utility: Fix for the translation of minutes, second (#4855)
* SyncEngine: invalid the blacklist entry when the rename destination change
* Several fixes to speed up reconnect after connection changes
* Updater: Fix small memory leak
* Linux: Revert forced HiDPI detection settings (#4840, #4861)
version 2.2.0 (release 2016-05-12)
* Overlay icons: Refactoring - mainly for performance improvements
* Improved error handling with Sync Journal on USB storages (#4632)
* Sharing Completion: Improved UI of completion in sharing from desktop. (#3737)
* Show server notifications on the client (#3733)
* Improved Speed with small files by dynamic parallel request count (#4529)
* LockWatcher: Make sure to sync files after apps released exclusive locks on Windows.
* Improved handling of Win32 file locks and network files
* Workaround Ubuntu 16.04 tray icon bug (#4693)
* Removed the Alias field from the folder definition (#4695)
* Improved netrc parser (#4691)
* Improved user notifications about ignored files and conflicts (#4761, #3222)
* Add warnings for old server versions (#4523)
* Enable tranportation checksums if the server supports based on server capabilities (#3735)
* Default Chunk-size changed to 10MB (#4354)
* Documentation Improvements, ie. about overlay icons
* Translation fixes
* Countless other bugfixes
* Sqlite Update to recent version
* Update of QtKeyChain to support Windows credential store
* Packaging of dolphin overlay icon module for bleeding edge distros
version 2.1.1 (release 2016-02-10)
* UI improvements for HiDPI screens, error messages, RTL languages
* Fix occurences of "Connection Closed" when a new unauthenticated TCP socket is used
+3 -2
Ver Arquivo
@@ -1,10 +1,11 @@
set( MIRALL_VERSION_MAJOR 2 )
set( MIRALL_VERSION_MINOR 2 )
set( MIRALL_VERSION_PATCH 0 )
set( MIRALL_VERSION_PATCH 1 )
set( MIRALL_VERSION_YEAR 2016 )
set( MIRALL_SOVERSION 0 )
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
set( MIRALL_VERSION_SUFFIX "git") #e.g. beta1, beta2, rc1
set( MIRALL_VERSION_SUFFIX "") #e.g. beta1, beta2, rc1
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
if( NOT DEFINED MIRALL_VERSION_BUILD )
+3 -3
Ver Arquivo
@@ -497,7 +497,7 @@
<key>IDENTIFIER</key>
<string>@APPLICATION_REV_DOMAIN_INSTALLER@</string>
<key>NAME</key>
<string>@APPLICATION_NAME@</string>
<string>@APPLICATION_NAME_XML_ESCAPED@</string>
<key>OVERWRITE_PERMISSIONS</key>
<false/>
<key>VERSION</key>
@@ -1245,7 +1245,7 @@
<key>LANGUAGE</key>
<string>English</string>
<key>VALUE</key>
<string>@APPLICATION_NAME@ Client</string>
<string>@APPLICATION_NAME_XML_ESCAPED@ Client</string>
</dict>
</array>
</dict>
@@ -1445,7 +1445,7 @@
</dict>
</array>
<key>NAME</key>
<string>@APPLICATION_NAME@ Installer</string>
<string>@APPLICATION_NAME_XML_ESCAPED@ Installer</string>
<key>REFERENCE_FOLDER_PATH</key>
<string>@CMAKE_INSTALL_DIR@</string>
</dict>
+3 -1
Ver Arquivo
@@ -12,8 +12,10 @@ EOF
if [ -x "$(command -v pluginkit)" ]; then
# add it to DB. This happens automatically too but we try to push it a bit harder for issue #3463
pluginkit -a "/Applications/@APPLICATION_EXECUTABLE@.app/Contents/PlugIns/FinderSyncExt.appex/"
# Since El Capitan we need to sleep #4650
sleep 10s
# enable it
pluginkit -e use -i @APPLICATION_REV_DOMAIN@.FinderSyncExt
fi
exit 0
exit 0
+13 -5
Ver Arquivo
@@ -1,7 +1,7 @@
## Patches used
There are our patches on top of Qt 5.4.0, which we are currently
using for our binary packages on Windows and Mac OS. Most of them
using for our binary packages on Windows and Mac OS X. Most of them
have been sent upstream and are part of newer Qt releases.
All changes are designed to up upstream, and all those that are
@@ -28,18 +28,26 @@ purpose is outlined in each patches' front matter.
* 0007-X-Network-Fix-up-previous-corruption-patch.patch
* 0008-QNAM-Fix-reply-deadlocks-on-server-closing-connectio.patch
* 0014-Fix-SNI-for-TlsV1_0OrLater-TlsV1_1OrLater-and-TlsV1_.patch
* 0016-Fix-possible-crash-when-passing-an-invalid-PAC-URL.patch
* 0011-Make-sure-to-report-correct-NetworkAccessibility.patch
### Upstreamed but not in any release yet (as of 2015-11-16)
### Part of Qt v5.5.2 (UNRELEASED!)
* 0009-QNAM-Assign-proper-channel-before-sslErrors-emission.patch
* 0010-Don-t-let-closed-http-sockets-pass-as-valid-connecti.patch
* 0012-Make-sure-networkAccessibilityChanged-is-emitted.patch
### Part of Qt v5.6 and later
* 0009-QNAM-Assign-proper-channel-before-sslErrors-emission.patch
* 0010-Don-t-let-closed-http-sockets-pass-as-valid-connecti.patch
* 0011-Make-sure-to-report-correct-NetworkAccessibility.patch
* 0012-Make-sure-networkAccessibilityChanged-is-emitted.patch
* 0013-Make-UnknownAccessibility-not-block-requests.patch
* 0015-Remove-legacy-platform-code-in-QSslSocket-for-OS-X-1.patch
* 0016-Fix-possible-crash-when-passing-an-invalid-PAC-URL.patch
* 0019-Ensure-system-tray-icon-is-prepared-even-when-menu-bar.patch
### Not submitted to be part of any release:
### Part of Qt 5.7 and later
* 0015-Remove-legacy-platform-code-in-QSslSocket-for-OS-X-1.patch
### Not submitted upstream to be part of any release:
* 0006-Fix-force-debug-info-with-macx-clang_NOUPSTREAM.patch
This is only needed if you intent to harvest debugging symbols
for breakpad.
+2 -2
Ver Arquivo
@@ -5,11 +5,11 @@ MAINTAINER Daniel Molkentin <danimo@owncloud.com>
ENV TERM ansi
ENV HOME /root
ENV REFRESHED_AT 20160202
ENV REFRESHED_AT 20160421
RUN zypper --non-interactive --gpg-auto-import-keys refresh
RUN zypper --non-interactive --gpg-auto-import-keys ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_42.1/windows:mingw.repo
RUN zypper --non-interactive --gpg-auto-import-keys ar http://download.opensuse.org/repositories/isv:ownCloud:toolchains:mingw:win32:2.1/openSUSE_Leap_42.1/isv:ownCloud:toolchains:mingw:win32:2.1.repo
RUN zypper --non-interactive --gpg-auto-import-keys ar http://download.opensuse.org/repositories/isv:ownCloud:toolchains:mingw:win32:2.2/openSUSE_Leap_42.1/isv:ownCloud:toolchains:mingw:win32:2.2.repo
RUN zypper --non-interactive --gpg-auto-import-keys install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
mingw32-headers mingw32-runtime site-config mingw32-libwebp \
+3 -3
Ver Arquivo
@@ -1,11 +1,11 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Toon releaseopmerkingen"
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Toon opmerkingen bij deze uitgave"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Gevonden ${APPLICATION_EXECUTABLE} proces(sen) moet worden gestopt.$\nWilt u dat het installatieprogramma dat voor u doet?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Stoppen ${APPLICATION_EXECUTABLE} processen."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Het te stoppen proces is niet gevonden!"
StrCpy $PageReinstall_NEW_Field_1 "Er is een oudere versie van ${APPLICATION_NAME} geïnstalleerd op uw systeem. geadviseerd wordt om de huidige versie te de-installeren voordat de nieuwe versie wordt geïnstalleerd. Selecteer de uit te voeren actie en klik op Verder om door te gaan."
StrCpy $PageReinstall_NEW_Field_2 "De-installeren voor installeren"
StrCpy $PageReinstall_NEW_Field_3 "Niet de-installeren"
StrCpy $PageReinstall_NEW_Field_2 "Verwijder oude versie"
StrCpy $PageReinstall_NEW_Field_3 "Behoud oude versie"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Al geïnstalleerd"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Kies hoe u ${APPLICATION_NAME} wilt installeren."
StrCpy $PageReinstall_OLD_Field_1 "Er is al een recentere versie van ${APPLICATION_NAME} geïnstalleerd! Installeren van een oudere versie wordt niet aangeraden. Als u echt de oudere versie wilt installeren, adviseren we de huidige versie eerst te verwijderen. Kies de actie die u wilt uitvoeren en druk op Verder om door te gaan."
+1 -1
Ver Arquivo
@@ -38,6 +38,6 @@ StrCpy $UAC_ERROR_ELEVATE "Rechte k
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dieses Installationsprogramm erfordert Administrator-Rechte, bitte erneut versuchen"
StrCpy $INIT_INSTALLER_RUNNING "Das Installationsprogramm wird bereits ausgeführt."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Das Deinstallationsprogramm erfordert Administrator-Rechte. Bitte erneut versuchen."
StrCpy $UAC_ERROR_LOGON_SERVICE "Anmeldedienst läuft nicht, abbruch!"
StrCpy $INIT_UNINSTALLER_RUNNING "Das Deinstallationsprogramm wird bereits ausgeführt."
StrCpy $SectionGroup_Shortcuts "Verknüpfungen"
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
+4 -4
Ver Arquivo
@@ -7,7 +7,7 @@ StrCpy $PageReinstall_NEW_Field_1 "Az ${APPLICATION_NAME} alkalmazás egy régeb
StrCpy $PageReinstall_NEW_Field_2 "Eltávolítás telepítés előtt"
StrCpy $PageReinstall_NEW_Field_3 "Ne távolítsa el"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Már telepítve"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Válaszd ki, hogy szeretnéd telepíteni a következő alkalmazást ${APPLICATION_NAME}."
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Válassza ki, hogy szeretné telepíteni a következő alkalmazást: ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Az ${APPLICATION_NAME} alkalmazás egy újabb verziója már megtalálható a rendszeren. Nem ajánlott egy régebbi verzió telepítése. Ha valóban szeretné a régebbi verziót telepíteni, akkor ajánlott a jelenleg telepített verzió eltávolítása. Válassza ki milyen műveletet szeretne végrehajtani, és nyomja meg a $\"Következő$\" gombot a folytatáshoz."
StrCpy $PageReinstall_SAME_Field_1 "Az ${APPLICATION_NAME} alkalmazás ${VERSION} verziója már telepítve van.$↩$\nKérjük válaszd ki milyen műveletet szeretnél végrehajtani, és nyomd meg a „Következő” gombot."
StrCpy $PageReinstall_SAME_Field_2 "Komponens hozzáadása/újratelepítése"
@@ -31,13 +31,13 @@ StrCpy $UNINSTALLER_FILE_Detail "Elltávolító írása"
StrCpy $UNINSTALLER_REGISTRY_Detail "Telepítési registry kulcsok írása"
StrCpy $UNINSTALLER_FINISHED_Detail "Befejezve!"
StrCpy $UNINSTALL_MESSAGEBOX "Nem sikerült az ${APPLICATION_NAME} alkalmazás telepítése a '$INSTDIR' könyvtárba.$\n$\nSzeretné mindenképpen folytatni (nem ajánlott)?"
StrCpy $UNINSTALL_ABORT "Az eltávolítást egy felhasználó megszakította"
StrCpy $UNINSTALL_ABORT "Az eltávolítást a felhasználó megszakította"
StrCpy $INIT_NO_QUICK_LAUNCH "Gyorsindító hivatkozás (N/A)"
StrCpy $INIT_NO_DESKTOP "Asztali hivatkozás (felülírja a meglévőt)"
StrCpy $UAC_ERROR_ELEVATE "Nem sikerült felemelni, hiba:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "A telepítő futtatásához adminisztrátori hozzáférés szükséges, próbáld újra."
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "A telepítő futtatásához adminisztrátori hozzáférés szükséges, próbálja újra."
StrCpy $INIT_INSTALLER_RUNNING "A telepítő már fut."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Az eltávolító futtatásához adminisztrátori hozzáférés szükséges, próbáld újra."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Az eltávolító futtatásához adminisztrátori hozzáférés szükséges, próbálja újra."
StrCpy $UAC_ERROR_LOGON_SERVICE "A bejelentkező szolgáltatás nem fut, megszakítás!"
StrCpy $INIT_UNINSTALLER_RUNNING "Az eltávolító már fut."
StrCpy $SectionGroup_Shortcuts "Parancsikonok"
+2 -2
Ver Arquivo
@@ -9,6 +9,7 @@ StrCpy $PageReinstall_NEW_Field_3 "Nie usuwaj "
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ju¿ zainstalowane"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Wybierz jak chcesz zainstalowaæ ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Zainstalowana jest nowsza wersja ${APPLICATION_NAME}! Niezalecane jest instalowanie starszej wersji. Jeœli naprawdê chcesz zainstalowaæ starsz¹ wersjê lepiej najpierw odinstalowaæ obecn¹ aplikacjê. Wybierz operacjê któr¹ chcesz wykonaæ i naciœnij przycisk Dalej."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} jest ju¿ zainstalowany.$\nWybierz operacjê któr¹ chcesz wykonaæ i naciœnij przycisk Dalej."
StrCpy $PageReinstall_SAME_Field_2 "Doda/Przeinstaluj komponenty"
StrCpy $PageReinstall_SAME_Field_3 "Odinstaluj ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstaluj ${APPLICATION_NAME}"
@@ -37,7 +38,6 @@ StrCpy $UAC_ERROR_ELEVATE "Niemo
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Ten instalator potrzebuje uprawnieñ administratora, spróbuj ponownie"
StrCpy $INIT_INSTALLER_RUNNING "Instalator ju¿ jest uruchomiony."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ten dezinstalator potrzebuje uprawnieñ administratora, spróbuj ponownie"
StrCpy $UAC_ERROR_LOGON_SERVICE "Proces logowania nie jest uruchomiony, przerywam !"
StrCpy $INIT_UNINSTALLER_RUNNING "Dezinstalator ju¿ jest uruchomiony."
StrCpy $SectionGroup_Shortcuts "Skróty"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
+1 -1
Ver Arquivo
@@ -1,6 +1,6 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\nDeseja que o instalador os termine automaticamente?"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Existem ${APPLICATION_EXECUTABLE} processo(s) em execução que precisa(m) de ser interrompido(s).$\nDeseja que o instalador o(s) termine automaticamente?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!"
StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar a mais recente. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
+3 -3
Ver Arquivo
@@ -1,8 +1,8 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "查看版本日志"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "有 ${APPLICATION_EXECUTABLE} 项进程需要关闭。$\n您想让安装程序关闭这些进程吗?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "杀死${APPLICATION_EXECUTABLE}进程。"
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "未找到要杀死的进程!"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "停止${APPLICATION_EXECUTABLE}进程。"
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "未找到要停止的进程!"
StrCpy $PageReinstall_NEW_Field_1 "您的系统已经安装${APPLICATION_NAME}较老版本。建议安装前卸载当前版本。选择将要执行的操作,点击下一步继续。"
StrCpy $PageReinstall_NEW_Field_2 "在安装前先卸载"
StrCpy $PageReinstall_NEW_Field_3 "不要卸载"
@@ -38,6 +38,6 @@ StrCpy $UAC_ERROR_ELEVATE "无法获得权限,错误:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "安装程序需要管理员权限,请重试"
StrCpy $INIT_INSTALLER_RUNNING "安装程序已经运行。"
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "卸载程序需要管理员权限,请重试"
StrCpy $UAC_ERROR_LOGON_SERVICE "登录服务器未运行!"
StrCpy $INIT_UNINSTALLER_RUNNING "卸载程序已经运行。"
StrCpy $SectionGroup_Shortcuts "快捷方式"
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
+3 -3
Ver Arquivo
@@ -14,6 +14,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Avinstallera ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Avinstallera ${APPLICATION_NAME}"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Välj underhålls alternativ att utföra."
StrCpy $SEC_APPLICATION_DETAILS "Installerar ${APPLICATION_NAME} väsentligheter."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration för Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installerar integration för Windows Explorer"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start-meny program genväg"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lägger till genväg för ${APPLICATION_NAME} till Start-menyn."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Skrivbordsgenväg"
@@ -35,9 +37,7 @@ StrCpy $UAC_ERROR_ELEVATE "Kunde inte få förhöjda rättigheter, fel:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Detta installationsprogram kräver adminstratörs rättigheter, försök igen"
StrCpy $INIT_INSTALLER_RUNNING "Installationsprogrammet körs redan."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Detta avinstallationsprogram kräver administratörsrättigheter, försök igen"
StrCpy $UAC_ERROR_LOGON_SERVICE "Login-service körs inte, avbryter!"
StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallationsprogrammet körs redan."
StrCpy $SectionGroup_Shortcuts "Genvägar"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
+3 -3
Ver Arquivo
@@ -3,13 +3,13 @@ StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "แสดงบันทึกป
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "พบว่ากระบวนการ ${APPLICATION_EXECUTABLE} จะต้องหยุดทำงาน$\nคุณต้องการติดตั้งเพื่อหยุดการทำงานเหล่านี้ของคุณ?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "ฆ่ากระบวนการทำงาน ${APPLICATION_EXECUTABLE}"
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "ไม่พบการฆ่ากระบวนการ!"
StrCpy $PageReinstall_NEW_Field_1 "รุ่นเก่าของ ${APPLICATION_NAME} มีการติดตั้งในระบบของคุณ ขอแนะนำให้คุณถอนการติดตั้งรุ่นปัจจุบันออกก่อน เลือกการดำเนินการที่คุณต้องการที่จะดำเนินการและคลิกถัดไปเพื่อดำเนินการต่อ"
StrCpy $PageReinstall_NEW_Field_1 "รุ่นเก่าของ ${APPLICATION_NAME} ได้ถูกติดตั้งในระบบของคุณ ขอแนะนำให้คุณถอนการติดตั้งรุ่นปัจจุบันออกก่อน แล้วเลือกการดำเนินการที่คุณต้องการหลังจากนั้นคลิกถัดไปเพื่อดำเนินการต่อ"
StrCpy $PageReinstall_NEW_Field_2 "ถอนการติดตั้งก่อนการติดตั้ง"
StrCpy $PageReinstall_NEW_Field_3 "อย่าถอนการติดตั้ง"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "ติดตั้งแล้ว"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "เลือกวิธีที่คุณต้องการติดตั้ง ${APPLICATION_NAME}"
StrCpy $PageReinstall_OLD_Field_1 "รุ่นใหม่ของ ${APPLICATION_NAME} ถูกติดตั้งแล้ว! เราไม่แนะนำให้คุณติดตั้งรุ่นเก่า ถ้าคุณอยากจะติดตั้งรุ่นเก่าก็สามารถอนการติดตั้งได้"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ถูกติดตั้งไปแล้ว$ $\nเลือกดำเนินงานที่คุณต้องการและคลิกถัดไปเพื่อดำเนินการต่อ"
StrCpy $PageReinstall_OLD_Field_1 "รุ่นใหม่ของ ${APPLICATION_NAME} ถูกติดตั้งแล้ว! เราไม่แนะนำให้คุณติดตั้งรุ่นที่เก่ากว่า ถ้าคุณอยากจะติดตั้งรุ่นเก่าก็สามารถอนการติดตั้งได้"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} รุ่น ${VERSION} ถูกติดตั้งไปแล้ว$ $\nเลือกดำเนินงานที่คุณต้องการและคลิกถัดไปเพื่อดำเนินการต่อ"
StrCpy $PageReinstall_SAME_Field_2 "ส่วนประกอบ เพิ่ม/ติดตั้งใหม่ "
StrCpy $PageReinstall_SAME_Field_3 "ถอนการติดตั้ง ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "ถอนการติดตั้ง ${APPLICATION_NAME}"
+2 -2
Ver Arquivo
@@ -9,6 +9,7 @@ StrCpy $PageReinstall_NEW_Field_3 "Не видаляти"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Установлено"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Оберіть, як ви хочете установити ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Знайдено новішу версію ${APPLICATION_NAME}! Ми не рекомендуємо встановлювати стару версію. Якщо ви все ж бажаєте встановити цю версію, спочатку видаліть поточну версію. Оберіть подальшу дію та натисніть $\"Далі$\"."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} вже встановлено.$\n$\nОберіть подальшу дію та натисніть $\"Далі$\" для продовження."
StrCpy $PageReinstall_SAME_Field_2 "Додати/Перевстановити компоненти"
StrCpy $PageReinstall_SAME_Field_3 "Видалити ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Видалити ${APPLICATION_NAME}"
@@ -37,7 +38,6 @@ StrCpy $UAC_ERROR_ELEVATE "Неможливо підняти, помилка:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Для установки потрібні права адміністратора, спробуйте ще раз"
StrCpy $INIT_INSTALLER_RUNNING "Установка вже запущена."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Для видалення потрібні права адміністратора, спробуйте ще раз"
StrCpy $UAC_ERROR_LOGON_SERVICE "Сервіс авторизації не запущений, припиняю!"
StrCpy $INIT_UNINSTALLER_RUNNING "Програма видалення вже запущено."
StrCpy $SectionGroup_Shortcuts "Ярлики"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
+1 -1
Submodule binary updated: 71633edc9a...d27d472817
-5
Ver Arquivo
@@ -1,5 +0,0 @@
--- binary
+++ binary
@@ -1 +1 @@
-Subproject commit 1fb9ddfa9a9a1b4dbc447eee10dbed89172d968a
+Subproject commit 01d73965dc8b862d1b2310d3ef801c297b697ec7
+1
Ver Arquivo
@@ -22,5 +22,6 @@
<file>resources/account.png</file>
<file>resources/more.png</file>
<file>resources/delete.png</file>
<file>resources/bell.png</file>
</qresource>
</RCC>
+1 -1
Ver Arquivo
@@ -17,7 +17,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLongVersionString</key>
<string>@APPLICATION_NAME@ @MIRALL_VERSION_STRING@</string>
<string>@APPLICATION_NAME_XML_ESCAPED@ @MIRALL_VERSION_STRING@</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
+11 -1
Ver Arquivo
@@ -620,7 +620,6 @@ Section Uninstall
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x64.dll"
!insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x64.dll"
!undef LIBRARY_X64
${Else}
DetailPrint "Uninstalling x86 overlay DLLs"
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCContextMenu_x86.dll"
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x86.dll"
@@ -757,6 +756,12 @@ Function .onInit
;Shutdown ${APPLICATION_NAME} in case Add/Remove re-installer option used.
Call EnsureOwncloudShutdown
ReadRegStr $R0 ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "InstallLocation"
${If} ${Silent}
${AndIf} $R0 != ""
ExecWait '"$R0\Uninstall.exe" /S _?=$R0'
${EndIf}
FunctionEnd
Function .onInstSuccess
@@ -766,6 +771,11 @@ Function .onInstSuccess
WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "skipUpdateCheck" "1"
${EndIf}
; TODO: Only needed to when updating from 2.1.{0,1}. Remove in due time.
Delete /REBOOTOK $INSTDIR\bearer\qgenericbearer.dll
Delete /REBOOTOK $INSTDIR\bearer\qnativewifibearer.dll
RMDir /REBOOTOK $INSTDIR\bearer
${If} ${Silent}
${AndIf} $InstallRunIfSilent == "yes"
Call LaunchApplication
+3
Ver Arquivo
@@ -18,6 +18,9 @@ if( Qt5Core_FOUND )
find_package(Qt5Network REQUIRED)
find_package(Qt5Xml REQUIRED)
find_package(Qt5Concurrent REQUIRED)
if(UNIT_TESTING)
find_package(Qt5Test REQUIRED)
endif()
if(NOT TOKEN_AUTH_ONLY)
find_package(Qt5WebKitWidgets REQUIRED)
find_package(Qt5WebKit REQUIRED)
-6
Ver Arquivo
@@ -128,10 +128,4 @@ else()
)
endif()
# INSTALL(
# FILES
# ${csync_HDRS}
# DESTINATION
# ${INCLUDE_INSTALL_DIR}/${APPLICATION_NAME}
# )
+10 -70
Ver Arquivo
@@ -25,6 +25,7 @@
#define _GNU_SOURCE
#endif
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
@@ -89,14 +90,11 @@ static int _data_cmp(const void *key, const void *data) {
return 0;
}
int csync_create(CSYNC **csync, const char *local, const char *remote) {
void csync_create(CSYNC **csync, const char *local, const char *remote) {
CSYNC *ctx;
size_t len = 0;
ctx = c_malloc(sizeof(CSYNC));
if (ctx == NULL) {
return -1;
}
ctx->status_code = CSYNC_STATUS_OK;
@@ -121,46 +119,21 @@ int csync_create(CSYNC **csync, const char *local, const char *remote) {
ctx->ignore_hidden_files = true;
*csync = ctx;
return 0;
}
int csync_init(CSYNC *ctx) {
int rc;
if (ctx == NULL) {
errno = EBADF;
return -1;
}
ctx->status_code = CSYNC_STATUS_OK;
void csync_init(CSYNC *ctx) {
assert(ctx);
/* Do not initialize twice */
if (ctx->status & CSYNC_STATUS_INIT) {
return 1;
}
/* check for uri */
if (csync_fnmatch("owncloud://*", ctx->remote.uri, 0) == 0 && csync_fnmatch("ownclouds://*", ctx->remote.uri, 0) == 0) {
ctx->status_code = CSYNC_STATUS_NO_MODULE;
rc = -1;
goto out;
}
assert(!(ctx->status & CSYNC_STATUS_INIT));
ctx->status_code = CSYNC_STATUS_OK;
ctx->local.type = LOCAL_REPLICA;
ctx->remote.type = REMOTE_REPLICA;
if (c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp) < 0) {
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
rc = -1;
goto out;
}
if (c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp) < 0) {
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
rc = -1;
goto out;
}
c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp);
c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp);
ctx->remote.root_perms = 0;
@@ -168,11 +141,6 @@ int csync_init(CSYNC *ctx) {
/* initialize random generator */
srand(time(NULL));
rc = 0;
out:
return rc;
}
int csync_update(CSYNC *ctx) {
@@ -580,29 +548,17 @@ int csync_commit(CSYNC *ctx) {
ctx->remote.read_from_db = 0;
ctx->read_remote_from_db = true;
ctx->db_is_empty = false;
ctx->ignore_hidden_files = true; // do NOT sync hidden files by default.
/* Create new trees */
rc = c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp);
if (rc < 0) {
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
goto out;
}
rc = c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp);
if (rc < 0) {
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
goto out;
}
c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp);
c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp);
ctx->status = CSYNC_STATUS_INIT;
SAFE_FREE(ctx->error_string);
rc = 0;
out:
return rc;
}
@@ -622,9 +578,6 @@ int csync_destroy(CSYNC *ctx) {
}
ctx->statedb.db = NULL;
/* destroy exclude list */
csync_exclude_destroy(ctx);
_csync_clean_ctx(ctx);
SAFE_FREE(ctx->local.uri);
@@ -640,19 +593,6 @@ int csync_destroy(CSYNC *ctx) {
return rc;
}
int csync_add_exclude_list(CSYNC *ctx, const char *path) {
if (ctx == NULL || path == NULL) {
return -1;
}
return csync_exclude_load(path, &ctx->excludes);
}
void csync_clear_exclude_list(CSYNC *ctx)
{
csync_exclude_clear(ctx);
}
void *csync_get_userdata(CSYNC *ctx) {
if (ctx == NULL) {
return NULL;
+16 -38
Ver Arquivo
@@ -316,10 +316,8 @@ typedef const char* (*csync_checksum_hook) (
* @brief Allocate a csync context.
*
* @param csync The context variable to allocate.
*
* @return 0 on success, less than 0 if an error occured.
*/
int csync_create(CSYNC **csync, const char *local, const char *remote);
void csync_create(CSYNC **csync, const char *local, const char *remote);
/**
* @brief Initialize the file synchronizer.
@@ -327,17 +325,15 @@ int csync_create(CSYNC **csync, const char *local, const char *remote);
* This function loads the configuration
*
* @param ctx The context to initialize.
*
* @return 0 on success, less than 0 if an error occured.
*/
int csync_init(CSYNC *ctx);
void csync_init(CSYNC *ctx);
/**
* @brief Update detection
*
* @param ctx The context to run the update detection on.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_update(CSYNC *ctx);
@@ -346,7 +342,7 @@ int csync_update(CSYNC *ctx);
*
* @param ctx The context to run the reconciliation on.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_reconcile(CSYNC *ctx);
@@ -355,7 +351,7 @@ int csync_reconcile(CSYNC *ctx);
*
* @param ctx The context to commit.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_commit(CSYNC *ctx);
@@ -366,35 +362,17 @@ int csync_commit(CSYNC *ctx);
*
* @param ctx The context to destroy.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_destroy(CSYNC *ctx);
/**
* @brief Add an additional exclude list.
*
* @param ctx The context to add the exclude list.
*
* @param path The path pointing to the file.
*
* @return 0 on success, less than 0 if an error occured.
*/
int csync_add_exclude_list(CSYNC *ctx, const char *path);
/**
* @brief Removes all items imported from exclude lists.
*
* @param ctx The context to add the exclude list.
*/
void csync_clear_exclude_list(CSYNC *ctx);
/**
* @brief Get the userdata saved in the context.
*
* @param ctx The csync context.
*
* @return The userdata saved in the context, NULL if an error
* occured.
* occurred.
*/
void *csync_get_userdata(CSYNC *ctx);
@@ -406,7 +384,7 @@ void *csync_get_userdata(CSYNC *ctx);
*
* @param userdata The userdata to be stored in the context.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_set_userdata(CSYNC *ctx, void *userdata);
@@ -416,7 +394,7 @@ int csync_set_userdata(CSYNC *ctx, void *userdata);
* @param ctx The csync context.
*
* @return The authentication callback set or NULL if an error
* occured.
* occurred.
*/
csync_auth_callback csync_get_auth_callback(CSYNC *ctx);
@@ -427,7 +405,7 @@ csync_auth_callback csync_get_auth_callback(CSYNC *ctx);
*
* @param cb The authentication callback.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb);
@@ -436,7 +414,7 @@ int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb);
*
* @param[in] level The log verbosity.
*
* @return 0 on success, < 0 if an error occured.
* @return 0 on success, < 0 if an error occurred.
*/
int csync_set_log_level(int level);
@@ -451,7 +429,7 @@ int csync_get_log_level(void);
* @brief Get the logging callback set.
*
* @return The logging callback set or NULL if an error
* occured.
* occurred.
*/
csync_log_callback csync_get_log_callback(void);
@@ -460,7 +438,7 @@ csync_log_callback csync_get_log_callback(void);
*
* @param cb The logging callback.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_set_log_callback(csync_log_callback cb);
@@ -476,7 +454,7 @@ void *csync_get_log_userdata(void);
*
* @param[in] data The userdata to set.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_set_log_userdata(void *data);
@@ -495,7 +473,7 @@ typedef int csync_treewalk_visit_func(TREE_WALK_FILE* ,void*);
* @param visitor A callback function to handle the file info.
* @param filter A filter, built from or'ed csync_instructions_e
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
@@ -506,7 +484,7 @@ int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int fi
* @param visitor A callback function to handle the file info.
* @param filter A filter, built from and'ed csync_instructions_e
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int csync_walk_remote_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
+43 -19
Ver Arquivo
@@ -47,6 +47,45 @@ int _csync_exclude_add(c_strlist_t **inList, const char *string) {
return c_strlist_add_grow(inList, string);
}
/** Expands C-like escape sequences.
*
* The returned string is heap-allocated and owned by the caller.
*/
static const char *csync_exclude_expand_escapes(const char * input)
{
size_t i_len = strlen(input) + 1;
char *out = c_malloc(i_len); // out can only be shorter
size_t i = 0;
size_t o = 0;
for (; i < i_len; ++i) {
if (input[i] == '\\') {
// at worst input[i+1] is \0
switch (input[i+1]) {
case '\'': out[o++] = '\''; break;
case '"': out[o++] = '"'; break;
case '?': out[o++] = '?'; break;
case '\\': out[o++] = '\\'; break;
case 'a': out[o++] = '\a'; break;
case 'b': out[o++] = '\b'; break;
case 'f': out[o++] = '\f'; break;
case 'n': out[o++] = '\n'; break;
case 'r': out[o++] = '\r'; break;
case 't': out[o++] = '\t'; break;
case 'v': out[o++] = '\v'; break;
default:
out[o++] = input[i];
out[o++] = input[i+1];
break;
}
++i;
} else {
out[o++] = input[i];
}
}
return out;
}
int csync_exclude_load(const char *fname, c_strlist_t **list) {
int fd = -1;
int i = 0;
@@ -99,8 +138,10 @@ int csync_exclude_load(const char *fname, c_strlist_t **list) {
if (entry != buf + i) {
buf[i] = '\0';
if (*entry != '#') {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", entry);
rc = _csync_exclude_add(list, entry);
const char *unescaped = csync_exclude_expand_escapes(entry);
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", unescaped);
rc = _csync_exclude_add(list, unescaped);
SAFE_FREE(unescaped);
if (rc < 0) {
goto out;
}
@@ -117,23 +158,6 @@ out:
return rc;
}
void csync_exclude_clear(CSYNC *ctx) {
c_strlist_clear(ctx->excludes);
}
void csync_exclude_destroy(CSYNC *ctx) {
c_strlist_destroy(ctx->excludes);
}
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
CSYNC_EXCLUDE_TYPE match = CSYNC_NOT_EXCLUDED;
match = csync_excluded_no_ctx( ctx->excludes, path, filetype );
return match;
}
// See http://support.microsoft.com/kb/74496 and
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
// Additionally, we ignore '$Recycle.Bin', see https://github.com/owncloud/client/issues/2955
+1 -32
Ver Arquivo
@@ -43,41 +43,10 @@ int _csync_exclude_add(c_strlist_t **inList, const char *string);
* @param ctx The context of the synchronizer.
* @param fname The filename to load.
*
* @return 0 on success, -1 if an error occured with errno set.
* @return 0 on success, -1 if an error occurred with errno set.
*/
int csync_exclude_load(const char *fname, c_strlist_t **list);
/**
* @brief Clear the exclude list in memory.
*
* @param ctx The synchronizer context.
*/
void csync_exclude_clear(CSYNC *ctx);
/**
* @brief Destroy the exclude list in memory.
*
* @param ctx The synchronizer context.
*/
void csync_exclude_destroy(CSYNC *ctx);
/**
* @brief Check if the given path should be excluded.
*
* This excludes also paths which can't be used without unix extensions.
*
* The exclude list is checked against the full path, each component of
* the path and all leading directory strings, e.g.
* '/foo/bar/file' checks ('/foo/bar/file', 'foo', 'bar', 'file',
* '/foo/bar', '/foo').
*
* @param ctx The synchronizer context.
* @param path The patch to check.
*
* @return 2 if excluded and needs cleanup, 1 if excluded, 0 if not.
*/
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype);
/**
* @brief Check if the given path should be excluded in a traversal situation.
*
+1
Ver Arquivo
@@ -33,6 +33,7 @@
* than fmmatch anyway, which does not care for flags.
**/
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
#endif
int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags);
+1 -1
Ver Arquivo
@@ -54,7 +54,7 @@ int csync_get_statedb_exists(CSYNC *ctx);
* @param ctx The csync context.
* @param statedb Path to the statedb file (sqlite3 db).
*
* @return 0 on success, less than 0 if an error occured with errno set.
* @return 0 on success, less than 0 if an error occurred with errno set.
*/
int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb);
+11 -27
Ver Arquivo
@@ -245,33 +245,9 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
st->etag = NULL;
st->child_modified = 0;
st->has_ignored_files = 0;
/* FIXME: Under which conditions are the following two ifs true and the code
* is executed? */
if (type == CSYNC_FTW_TYPE_FILE ) {
if (fs->mtime == 0) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - mtime is zero!", path);
tmp = csync_statedb_get_stat_by_hash(ctx, h);
if(_last_db_return_error(ctx)) {
SAFE_FREE(st);
SAFE_FREE(tmp);
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
return -1;
}
if (tmp == NULL) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - not found in db, IGNORE!", path);
st->instruction = CSYNC_INSTRUCTION_IGNORE;
} else {
SAFE_FREE(st);
st = tmp;
st->instruction = CSYNC_INSTRUCTION_NONE;
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - tmp non zero, mtime %lu", path, st->modtime );
tmp = NULL;
}
goto fastout; /* Skip copying of the etag. That's an important difference to upstream
* without etags. */
}
}
@@ -294,6 +270,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
if(_last_db_return_error(ctx)) {
SAFE_FREE(st);
SAFE_FREE(tmp);
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
return -1;
}
@@ -321,7 +298,10 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
// zero size in statedb can happen during migration
|| (tmp->size != 0 && fs->size != tmp->size))) {
if (fs->size == tmp->size && tmp->checksumTypeId) {
// Checksum comparison at this stage is only enabled for .eml files,
// check #4754 #4755
bool isEmlFile = csync_fnmatch("*.eml", file, FNM_CASEFOLD) == 0;
if (isEmlFile && fs->size == tmp->size && tmp->checksumTypeId) {
if (ctx->callbacks.checksum_hook) {
st->checksum = ctx->callbacks.checksum_hook(
file, tmp->checksumTypeId,
@@ -333,6 +313,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
checksumIdentical = strncmp(st->checksum, tmp->checksum, 1000) == 0;
}
if (checksumIdentical) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "NOTE: Checksums are identical, file did not actually change: %s", path);
st->instruction = CSYNC_INSTRUCTION_NONE;
st->should_update_metadata = true;
goto out;
@@ -535,7 +516,6 @@ out:
strncpy(st->remotePerm, fs->remotePerm, REMOTE_PERM_BUF_SIZE);
}
fastout: /* target if the file information is read from database into st */
st->phash = h;
st->pathlen = len;
memcpy(st->path, (len ? path : ""), len + 1);
@@ -580,7 +560,11 @@ int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs,
switch (flag) {
case CSYNC_FTW_FLAG_FILE:
if (ctx->current == REMOTE_REPLICA) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s size=%" PRIu64 "]", file, fs->file_id, fs->size);
if (fs->fields & CSYNC_VIO_FILE_STAT_FIELDS_SIZE) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s size=%" PRIu64 "]", file, fs->file_id, fs->size);
} else {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s size=UNKNOWN]", file, fs->file_id);
}
} else {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [inode=%" PRIu64 " size=%" PRIu64 "]", file, fs->inode, fs->size);
}
+5 -8
Ver Arquivo
@@ -38,13 +38,12 @@
#define NIL &_sentinel /* all leafs are sentinels */
static c_rbnode_t _sentinel = {NULL, NIL, NIL, NULL, NULL, BLACK};
int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare) {
c_rbtree_t *tree = NULL;
void c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare) {
assert(rbtree);
assert(key_compare);
assert(data_compare);
if (rbtree == NULL || key_compare == NULL || data_compare == NULL) {
errno = EINVAL;
return -1;
}
c_rbtree_t *tree = NULL;
tree = c_malloc(sizeof(*tree));
tree->root = NIL;
@@ -53,8 +52,6 @@ int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_r
tree->size = 0;
*rbtree = tree;
return 0;
}
static c_rbnode_t *_rbtree_subtree_dup(const c_rbnode_t *node, c_rbtree_t *new_tree, c_rbnode_t *new_parent) {
+12 -14
Ver Arquivo
@@ -135,10 +135,8 @@ struct c_rbnode_s {
*
* @param data_compare Callback function to compare a key as data with thee
* data inside a red-black tree node.
*
* @return 0 on success, -1 if an error occured with errno set.
*/
int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare);
void c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare);
/**
* @brief Duplicate a red-black tree.
@@ -146,7 +144,7 @@ int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_r
* @param tree Tree to duplicate.
*
* @return Pointer to a new allocated duplicated rbtree. NULL if an error
* occured.
* occurred.
*/
c_rbtree_t *c_rbtree_dup(const c_rbtree_t *tree);
@@ -157,7 +155,7 @@ c_rbtree_t *c_rbtree_dup(const c_rbtree_t *tree);
*
* @param tree The tree to free.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int c_rbtree_free(c_rbtree_t *tree);
@@ -198,7 +196,7 @@ int c_rbtree_free(c_rbtree_t *tree);
* @param data The data to insert into the tree.
*
* @return 0 on success, 1 if a duplicate has been found and < 0 if an error
* occured with errno set.
* occurred with errno set.
* EINVAL if a null pointer has been passed as the tree.
* ENOMEM if there is no memory left.
*/
@@ -223,7 +221,7 @@ c_rbnode_t *c_rbtree_find(c_rbtree_t *tree, const void *key);
*
* @param tree The tree to get the head for.
*
* @return The head node. NULL if an error occured.
* @return The head node. NULL if an error occurred.
*/
c_rbnode_t *c_rbtree_head(c_rbtree_t *tree);
@@ -232,7 +230,7 @@ c_rbnode_t *c_rbtree_head(c_rbtree_t *tree);
*
* @param tree The tree to get the tail for.
*
* @return The tail node. NULL if an error occured.
* @return The tail node. NULL if an error occurred.
*/
c_rbnode_t *c_rbtree_tail(c_rbtree_t *tree);
@@ -254,7 +252,7 @@ c_rbnode_t *c_rbtree_tail(c_rbtree_t *tree);
* @param data Data which should be passed to the visitor function.
* @param visitor Visitor function. This will be called for each node passed.
*
* @return 0 on sucess, less than 0 if an error occured.
* @return 0 on sucess, less than 0 if an error occurred.
*/
int c_rbtree_walk(c_rbtree_t *tree, void *data, c_rbtree_visit_func *visitor);
@@ -263,7 +261,7 @@ int c_rbtree_walk(c_rbtree_t *tree, void *data, c_rbtree_visit_func *visitor);
*
* @param node Node which should be deleted.
*
* @return 0 on success, -1 if an error occured.
* @return 0 on success, -1 if an error occurred.
*/
int c_rbtree_node_delete(c_rbnode_t *node);
@@ -272,7 +270,7 @@ int c_rbtree_node_delete(c_rbnode_t *node);
*
* @param node The node of which you want the next node.
*
* @return The next node, NULL if an error occured.
* @return The next node, NULL if an error occurred.
*/
c_rbnode_t *c_rbtree_node_next(c_rbnode_t *node);
@@ -281,7 +279,7 @@ c_rbnode_t *c_rbtree_node_next(c_rbnode_t *node);
*
* @param node The node of which you want the previous node.
*
* @return The previous node, NULL if an error occured.
* @return The previous node, NULL if an error occurred.
*/
c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
@@ -290,7 +288,7 @@ c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
*
* @param N The node to get the data from.
*
* @return The data, NULL if an error occured.
* @return The data, NULL if an error occurred.
*/
#define c_rbtree_node_data(N) ((N) ? ((N)->data) : NULL)
@@ -301,7 +299,7 @@ c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
*
* @param tree The tree to check.
*
* @return 0 on success, less than 0 if an error occured.
* @return 0 on success, less than 0 if an error occurred.
*/
int c_rbtree_check_sanity(c_rbtree_t *tree);
+12 -6
Ver Arquivo
@@ -139,7 +139,6 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
dhandle_t *handle = NULL;
csync_vio_file_stat_t *file_stat = NULL;
ULARGE_INTEGER FileIndex;
DWORD rem;
handle = (dhandle_t *) dhandle;
@@ -168,9 +167,14 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
}
file_stat->name = c_utf8_from_locale(handle->ffd.cFileName);
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT
&& handle->ffd.dwReserved0 & IO_REPARSE_TAG_SYMLINK) {
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
if ( (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
&& (handle->ffd.dwReserved0 & IO_REPARSE_TAG_SYMLINK)
// The SIS or DEDUP flag points to a MS deduplication feature of
// certain file storage products. It is not a normal symlink
// that should be ignored.
&& (! (handle->ffd.dwReserved0 & IO_REPARSE_TAG_SIS))
&& (! (handle->ffd.dwReserved0 & IO_REPARSE_TAG_DEDUP)) ) {
file_stat->flags = CSYNC_VIO_FILE_FLAGS_SYMLINK;
file_stat->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
@@ -226,8 +230,10 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
ULARGE_INTEGER FileIndex;
mbchar_t *wuri = c_utf8_path_to_locale( uri );
h = CreateFileW( wuri, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL+FILE_FLAG_BACKUP_SEMANTICS+FILE_FLAG_OPEN_REPARSE_POINT, NULL );
h = CreateFileW( wuri, 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
NULL );
if( h == INVALID_HANDLE_VALUE ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_CRIT, "CreateFileW failed on %s", uri );
errno = GetLastError();
+3 -16
Ver Arquivo
@@ -33,8 +33,7 @@ static void setup(void **state) {
rc = system("mkdir -p /tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
*state = csync;
}
@@ -49,10 +48,9 @@ static void setup_module(void **state) {
rc = system("mkdir -p /tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
rc = csync_init(csync);
csync_init(csync);
*state = csync;
}
@@ -74,16 +72,6 @@ static void teardown(void **state) {
*state = NULL;
}
static void check_csync_commit_null(void **state)
{
int rc;
(void) state; /* unused */
rc = csync_commit(NULL);
assert_int_equal(rc, -1);
}
static void check_csync_commit(void **state)
{
CSYNC *csync = *state;
@@ -110,7 +98,6 @@ static void check_csync_commit_dummy(void **state)
int torture_run_tests(void)
{
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_commit_null, setup, teardown),
unit_test_setup_teardown(check_csync_commit, setup, teardown),
unit_test_setup_teardown(check_csync_commit_dummy, setup_module, teardown),
};
+1 -2
Ver Arquivo
@@ -42,8 +42,7 @@ static void check_csync_create(void **state)
(void) state; /* unused */
rc = csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
rc = csync_destroy(csync);
assert_int_equal(rc, 0);
+62 -44
Ver Arquivo
@@ -32,8 +32,7 @@ static void setup(void **state) {
CSYNC *csync;
int rc;
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
*state = csync;
}
@@ -42,8 +41,7 @@ static void setup_init(void **state) {
CSYNC *csync;
int rc;
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
rc = csync_exclude_load(EXCLUDE_LIST_FILE, &(csync->excludes));
assert_int_equal(rc, 0);
@@ -102,84 +100,84 @@ static void check_csync_excluded(void **state)
CSYNC *csync = *state;
int rc;
rc = csync_excluded(csync, "", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "/", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "/", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "krawel_krawel", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "krawel_krawel", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, ".kde/share/config/kwin.eventsrc", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, ".kde/share/config/kwin.eventsrc", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, ".htaccess/cache-maximegalon/cache1.txt", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, ".htaccess/cache-maximegalon/cache1.txt", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "mozilla/.htaccess", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "mozilla/.htaccess", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
/*
* Test for patterns in subdirs. '.beagle' is defined as a pattern and has
* to be found in top dir as well as in directories underneath.
*/
rc = csync_excluded(csync, ".apdisk", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, ".apdisk", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "foo/.apdisk", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "foo/.apdisk", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "foo/bar/.apdisk", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "foo/bar/.apdisk", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, ".java", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, ".java", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
/* Files in the ignored dir .java will also be ignored. */
rc = csync_excluded(csync, ".apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, ".apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
/* and also in subdirs */
rc = csync_excluded(csync, "projects/.apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "projects/.apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
/* csync-journal is ignored in general silently. */
rc = csync_excluded(csync, ".csync_journal.db", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, ".csync_journal.db", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
rc = csync_excluded(csync, ".csync_journal.db.ctmp", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, ".csync_journal.db.ctmp", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
rc = csync_excluded(csync, "subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
/* pattern ]*.directory - ignore and remove */
rc = csync_excluded(csync, "my.~directory", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "my.~directory", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE);
rc = csync_excluded(csync, "/a_folder/my.~directory", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "/a_folder/my.~directory", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE);
/* Not excluded because the pattern .netscape/cache requires directory. */
rc = csync_excluded(csync, ".netscape/cache", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, ".netscape/cache", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
/* Not excluded */
rc = csync_excluded(csync, "unicode/中文.hé", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "unicode/中文.hé", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
/* excluded */
rc = csync_excluded(csync, "unicode/пятницы.txt", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "unicode/пятницы.txt", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "unicode/中文.💩", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "unicode/中文.💩", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
/* path wildcards */
rc = csync_excluded(csync, "foobar/my_manuscript.out", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "foobar/my_manuscript.out", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "latex_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "latex_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "word_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "word_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "latex/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "latex/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "latex/songbook/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "latex/songbook/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
}
@@ -241,45 +239,45 @@ static void check_csync_pathes(void **state)
_csync_exclude_add( &(csync->excludes), "/exclude" );
/* Check toplevel dir, the pattern only works for toplevel dir. */
rc = csync_excluded(csync, "/exclude", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "/exclude", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/foo/exclude", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "/foo/exclude", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
/* check for a file called exclude. Must still work */
rc = csync_excluded(csync, "/exclude", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "/exclude", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/foo/exclude", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "/foo/exclude", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
/* Add an exclude for directories only: excl/ */
_csync_exclude_add( &(csync->excludes), "excl/" );
rc = csync_excluded(csync, "/excl", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "/excl", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "meep/excl", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "meep/excl", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "meep/excl/file", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "meep/excl/file", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/excl", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "/excl", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
_csync_exclude_add(&csync->excludes, "/excludepath/withsubdir");
rc = csync_excluded(csync, "/excludepath/withsubdir", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/excludepath/withsubdir", CSYNC_FTW_TYPE_FILE);
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/excludepath/withsubdir2", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir2", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "/excludepath/withsubdir/foo", CSYNC_FTW_TYPE_DIR);
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir/foo", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
}
@@ -314,8 +312,8 @@ static void check_csync_excluded_performance(void **state)
gettimeofday(&before, 0);
for (int i = 0; i < N; ++i) {
totalRc += csync_excluded(csync, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR);
totalRc += csync_excluded(csync, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE);
totalRc += csync_excluded_no_ctx(csync->excludes, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR);
totalRc += csync_excluded_no_ctx(csync->excludes, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE);
}
assert_int_equal(totalRc, CSYNC_NOT_EXCLUDED); // mainly to avoid optimization
@@ -346,6 +344,25 @@ static void check_csync_excluded_performance(void **state)
}
}
static void check_csync_exclude_expand_escapes(void **state)
{
(void)state;
const char *str = csync_exclude_expand_escapes(
"keep \\' \\\" \\? \\\\ \\a \\b \\f \\n \\r \\t \\v \\z");
assert_true(0 == strcmp(
str, "keep ' \" ? \\ \a \b \f \n \r \t \v \\z"));
SAFE_FREE(str);
str = csync_exclude_expand_escapes("");
assert_true(0 == strcmp(str, ""));
SAFE_FREE(str);
str = csync_exclude_expand_escapes("\\");
assert_true(0 == strcmp(str, "\\"));
SAFE_FREE(str);
}
int torture_run_tests(void)
{
const UnitTest tests[] = {
@@ -356,6 +373,7 @@ int torture_run_tests(void)
unit_test_setup_teardown(check_csync_pathes, setup_init, teardown),
unit_test_setup_teardown(check_csync_is_windows_reserved_word, setup_init, teardown),
unit_test_setup_teardown(check_csync_excluded_performance, setup_init, teardown),
unit_test(check_csync_exclude_expand_escapes),
};
return run_tests(tests);
+3 -20
Ver Arquivo
@@ -33,8 +33,7 @@ static void setup(void **state) {
rc = system("mkdir -p /tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
*state = csync;
}
@@ -49,8 +48,7 @@ static void setup_module(void **state) {
rc = system("mkdir -p /tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
*state = csync;
}
@@ -73,34 +71,19 @@ static void teardown(void **state) {
*state = NULL;
}
static void check_csync_init_null(void **state)
{
int rc;
(void) state; /* unused */
rc = csync_init(NULL);
assert_int_equal(rc, -1);
}
static void check_csync_init(void **state)
{
CSYNC *csync = *state;
int rc;
rc = csync_init(csync);
assert_int_equal(rc, 0);
csync_init(csync);
assert_int_equal(csync->status & CSYNC_STATUS_INIT, 1);
rc = csync_init(csync);
assert_int_equal(rc, 1);
}
int torture_run_tests(void)
{
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_init_null, setup, teardown),
unit_test_setup_teardown(check_csync_init, setup, teardown),
unit_test_setup_teardown(check_csync_init, setup_module, teardown),
};
+1 -2
Ver Arquivo
@@ -37,8 +37,7 @@ static void setup(void **state) {
rc = system("mkdir -p /tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
*state = csync;
}
@@ -37,8 +37,7 @@ static void setup(void **state) {
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
csync->statedb.file = c_strdup( TESTDB );
*state = csync;
@@ -42,10 +42,8 @@ static void setup(void **state)
assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_init(csync);
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
csync_init(csync);
sqlite3 *db = NULL;
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
+4 -8
Ver Arquivo
@@ -93,10 +93,8 @@ static void setup(void **state)
assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_init(csync);
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
csync_init(csync);
/* Create a new db with metadata */
sqlite3 *db;
@@ -126,10 +124,8 @@ static void setup_ftw(void **state)
assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync2");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp", "/tmp");
assert_int_equal(rc, 0);
rc = csync_init(csync);
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp", "/tmp");
csync_init(csync);
sqlite3 *db = NULL;
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
+18 -24
Ver Arquivo
@@ -85,6 +85,16 @@ sub fromFileName($)
}
}
sub setCredentials
{
my ($dav, $user, $passwd) = @_;
$dav->credentials(-url=> $owncloud, -realm=>"sabre/dav",
-user=> $user, -pass=> $passwd);
$dav->credentials(-url=> $owncloud, -realm=>"ownCloud",
-user=> $user, -pass=> $passwd);
}
sub initTesting(;$)
{
@@ -127,9 +137,7 @@ sub initTesting(;$)
my $ua = HTTP::DAV::UserAgent->new(keep_alive => 1 );
$d = HTTP::DAV->new(-useragent => $ua);
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
-user=> $user,
-pass=> $passwd );
setCredentials($d, $user, $passwd);
# $d->DebugLevel(3);
$prefix = "t1" unless( defined $prefix );
@@ -193,9 +201,7 @@ sub removeRemoteDir($;$)
my $url = testDirUrl() . $dir;
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
-user=> $optionsRef->{user},
-pass=> $optionsRef->{passwd} );
setCredentials($d, $optionsRef->{user}, $optionsRef->{passwd});
if( $optionsRef->{url} ) {
$url = $optionsRef->{url} . $dir;
}
@@ -219,9 +225,7 @@ sub createRemoteDir(;$$)
my $url = testDirUrl() . $dir;
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
-user=> $optionsRef->{user},
-pass=> $optionsRef->{passwd} );
setCredentials($d, $optionsRef->{user}, $optionsRef->{passwd});
if( $optionsRef->{url} ) {
$url = $optionsRef->{url} . $dir;
}
@@ -396,9 +400,7 @@ sub traverse( $$;$ )
my %seen;
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
-user=> $user,
-pass=> $passwd );
setCredentials($d, $user, $passwd);
$d->open( $owncloud );
if( my $r = $d->propfind( -url => $url, -depth => 1 ) ) {
@@ -513,9 +515,7 @@ sub put_to_dir( $$;$ )
my $targetUrl = testDirUrl();
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
-user=> $optionsRef->{user},
-pass=> $optionsRef->{passwd} );
setCredentials($d, $optionsRef->{user}, $optionsRef->{passwd});
if( $optionsRef->{url} ) {
$targetUrl = $optionsRef->{url};
}
@@ -649,9 +649,7 @@ sub moveRemoteFile($$;$)
{
my ($from, $to, $no_testdir) = @_;
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
-user=> $user,
-pass=> $passwd );
setCredentials($d, $user, $passwd);
my $fromUrl = testDirUrl(). $from;
my $toUrl = testDirUrl() . $to;
@@ -725,9 +723,7 @@ sub createShare($$)
my $dd = HTTP::DAV->new();
$dd->credentials( -url=> $owncloud, -realm=>"ownCloud",
-user=> $share_user,
-pass=> $share_passwd );
setCredentials($dd, $share_user, $share_passwd);
$dd->open( $owncloud);
# create a remote dir
@@ -769,9 +765,7 @@ sub removeShare($$)
my $dd = HTTP::DAV->new();
$dd->credentials( -url => $owncloud, -realm=>"ownCloud",
-user => $share_user,
-pass => $share_passwd );
setCredentials($dd, $share_user, $share_passwd);
$dd->open( $owncloud);
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
+2 -2
Ver Arquivo
@@ -146,9 +146,9 @@ assertLocalAndRemoteDir( '', 0);
# create a true conflict.
printInfo( "Create a conflict." );
system( "echo \"This is more stuff\" >> /tmp/kernelcrash.txt" );
system( "echo \"This is more server stuff\" >> /tmp/kernelcrash.txt" );
put_to_dir( '/tmp/kernelcrash.txt', 'remoteToLocal1' );
system( "sleep 2 && touch " . localDir() . "remoteToLocal1/kernelcrash.txt" );
system( "sleep 2 && echo \"This is more client stuff\" >> " . localDir() . "remoteToLocal1/kernelcrash.txt" );
csync();
assertLocalAndRemoteDir( '', 1);
+1 -1
Ver Arquivo
@@ -71,7 +71,7 @@ assert($emlpropafter->get_property( "getlastmodified" ) eq
$emlpropbefore->get_property( "getlastmodified" ));
printInfo( "Change content of eml file (but not size)");
system( "sed -i -e 's/in/IN/' $locDir/test.eml" );
system( "sleep 1 && sed -i -e 's/in/IN/' $locDir/test.eml" );
csync( );
+4 -27
Ver Arquivo
@@ -84,10 +84,8 @@ static void destructor(void *data) {
static void setup(void **state) {
c_rbtree_t *tree = NULL;
int rc;
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
assert_int_equal(rc, 0);
c_rbtree_create(&tree, key_cmp, data_cmp);
*state = tree;
}
@@ -97,8 +95,7 @@ static void setup_complete_tree(void **state) {
int i = 0;
int rc;
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
assert_int_equal(rc, 0);
c_rbtree_create(&tree, key_cmp, data_cmp);
for (i = 0; i < 100; i++) {
test_t *testdata = NULL;
@@ -131,31 +128,13 @@ static void check_c_rbtree_create_free(void **state)
(void) state; /* unused */
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
assert_int_equal(rc, 0);
c_rbtree_create(&tree, key_cmp, data_cmp);
assert_int_equal(tree->size, 0);
rc = c_rbtree_free(tree);
assert_int_equal(rc, 0);
}
static void check_c_rbtree_create_null(void **state)
{
c_rbtree_t *tree = NULL;
int rc;
(void) state; /* unused */
rc = c_rbtree_create(NULL, key_cmp, data_cmp);
assert_int_equal(rc, -1);
rc = c_rbtree_create(&tree, NULL, data_cmp);
assert_int_equal(rc, -1);
rc = c_rbtree_create(&tree, key_cmp, NULL);
assert_int_equal(rc, -1);
}
static void check_c_rbtree_free_null(void **state)
{
int rc;
@@ -175,8 +154,7 @@ static void check_c_rbtree_insert_delete(void **state)
(void) state; /* unused */
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
assert_int_equal(rc, 0);
c_rbtree_create(&tree, key_cmp, data_cmp);
testdata = malloc(sizeof(test_t));
testdata->key = 42;
@@ -369,7 +347,6 @@ int torture_run_tests(void)
{
const UnitTest tests[] = {
unit_test(check_c_rbtree_create_free),
unit_test(check_c_rbtree_create_null),
unit_test(check_c_rbtree_free_null),
unit_test(check_c_rbtree_insert_delete),
unit_test_setup_teardown(check_c_rbtree_insert_random, setup, teardown),
+1 -2
Ver Arquivo
@@ -49,8 +49,7 @@ static void setup(void **state)
rc = system("rm -rf /tmp/csync_test");
assert_int_equal(rc, 0);
rc = csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
csync->replica = LOCAL_REPLICA;
+1 -2
Ver Arquivo
@@ -97,8 +97,7 @@ static void setup_testenv(void **state) {
statevar *mystate = malloc( sizeof(statevar) );
mystate->result = NULL;
rc = csync_create(&(mystate->csync), "/tmp/csync1", "/tmp/csync2");
assert_int_equal(rc, 0);
csync_create(&(mystate->csync), "/tmp/csync1", "/tmp/csync2");
mystate->csync->replica = LOCAL_REPLICA;
+5
Ver Arquivo
@@ -18,3 +18,8 @@ ownCloud Command Line Client
----------------------------
.. index:: owncloudcmd
.. include:: owncloudcmd.rst
Low Disk Space
--------------
.. index:: disk space
.. include:: lowdiskspace.rst
+9 -1
Ver Arquivo
@@ -87,7 +87,7 @@ To manually override this key, use the same value in ``HKEY_CURRENT_USER``.
To prevent automatic updates and disallow manual overrides:
.. note::This is the preferred method of controlling the updater behavior using
.. note:: This is the preferred method of controlling the updater behavior using
Group Policies.
1. Edit this Registry key:
@@ -98,6 +98,14 @@ To prevent automatic updates and disallow manual overrides:
3. Specify a value of ``1`` to the machine.
.. note:: Enterprise branded clients
(see `Building Branded ownCloud Clients
<https://doc.owncloud.org/branded_clients/>`_) have different key names,
which are set in ownBrander using the Application Vendor and Application
Name fields. Your key names look like this::
``HKEY_LOCAL_MACHINE\Software\Policies\myCompanyName\myAppName``
Preventing Automatic Updates in Mac OS X Environments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+41 -16
Ver Arquivo
@@ -11,22 +11,44 @@ desktop client.
.. note:: Build instructions are subject to change as development proceeds.
Please check the version for which you want to build.
The instructions contained in this topic were updated to work with version 1.7 of the ownCloud Client.
These instructions are updated to work with version 2.2 of the ownCloud Client.
Getting Source Code
-------------------
The :ref:`generic-build-instructions` pull the latest code directly from
GitHub, and work on Linux, Mac OS X, and Windows.
See the next section for instructions on getting source code from Linux
packages.
Linux
-----
1. Add the `ownCloud repository from OBS`_.
2. Install the dependencies (as root, or using ``sudo``) using the following
commands for your specific Linux distribution:
You may wish to use source packages for your Linux distribution, as these give
you the exact sources from which the binary packages are built. These are
hosted on the `ownCloud repository from OBS`_. Go to the `Index of
repositories`_ to see all the Linux client repos.
1. At the `bottom of the page for each distribution
<https://software.opensuse.org/download/package?project=isv:ownCloud:desktop&
package=owncloud-client>`_ is a "Grab binary packages directly" section.
These contain source RPMs for CentOS, RHEL, Fedora, SLES, and openSUSE.
To get the .deb source packages add the source
repo for your Debian or Ubuntu version, like this example for Debian 8
(run as root)::
echo 'deb-src
http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Debian_8.0/ /' >> /etc/apt/sources.list.d/owncloud-client.list
2. Install the dependencies using the following commands for your specific Linux distribution:
* Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
* openSUSE: ``zypper ref; zypper si -d owncloud-client``
* Fedora/CentOS: ``yum install yum-utils; yum-builddep owncloud-client``
* openSUSE/SLES: ``zypper ref; zypper si -d owncloud-client``
* Fedora/CentOS/RHEL: ``yum install yum-utils; yum-builddep owncloud-client``
3. Follow the :ref:`generic-build-instructions`.
4. (Optional) Call ``make install`` to install the client to the ``/usr/local/bin`` directory.
3. Follow the :ref:`generic-build-instructions`, starting with step 2.
Mac OS X
--------
@@ -187,9 +209,7 @@ Compared to previous versions, building the desktop sync client has become easie
earlier versions, CSync, which is the sync engine library of the client, is now
part of the client source repository and not a separate module.
You can download the desktop sync client from the ownCloud `Client Download Page`_.
To build the most up to date version of the client:
To build the most up-to-date version of the client:
1. Clone the latest versions of the client from Git_ as follows::
@@ -217,6 +237,9 @@ To build the most up to date version of the client:
4. Call ``make``.
The owncloud binary will appear in the ``bin`` directory.
5. (Optional) Call ``make install`` to install the client to the
``/usr/local/bin`` directory.
The following are known cmake parameters:
@@ -229,15 +252,17 @@ The following are known cmake parameters:
* ``BUILD_WITH_QT4=ON``: Builds using Qt4 (even if Qt5 is found).
* ``CMAKE_INSTALL_PREFIX=path``: Set an install prefix. This is mandatory on Mac OS
.. _`ownCloud repository from OBS`: http://software.opensuse.org/download/package?project=isv:ownCloud:desktop&package=owncloud-client
.. _ownCloud repository from OBS: http://software.opensuse.org/download/package?
project=isv:ownCloud:desktop&package=owncloud-client
.. _CMake: http://www.cmake.org/download
.. _CSync: http://www.csync.org
.. _`Client Download Page`: http://owncloud.org/sync-clients/
.. _Client Download Page: https://owncloud.org/install/#desktop
.. _Git: http://git-scm.com
.. _MacPorts: http://www.macports.org
.. _Homebrew: http://mxcl.github.com/homebrew/
.. _`OpenSSL Windows Build`: http://slproweb.com/products/Win32OpenSSL.html
.. _OpenSSL Windows Build: http://slproweb.com/products/Win32OpenSSL.html
.. _Qt: http://www.qt.io/download
.. _`Microsoft Authenticode`: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx
.. _Microsoft Authenticode: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx
.. _QtKeychain: https://github.com/frankosterfeld/qtkeychain
.. _Packages: http://s.sudre.free.fr/Software/Packages/about.html
.. _Index of repositories: http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/
+2 -2
Ver Arquivo
@@ -41,7 +41,7 @@ master_doc = 'index'
# General information about the project.
project = u'ownCloud Client Manual'
copyright = u'2013, The ownCloud developers'
copyright = u'2013-2016, The ownCloud developers'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -250,7 +250,7 @@ texinfo_documents = [
epub_title = u'ownCloud Client Manual'
epub_author = u'The ownCloud developers'
epub_publisher = u'The ownCloud developers'
epub_copyright = u'2013, The ownCloud developers'
epub_copyright = u'2013-2016, The ownCloud developers'
# The language of the text. It defaults to the language option
# or en if the language is not set.
+6
Ver Arquivo
@@ -22,3 +22,9 @@ You can change the following configuration settings (must be under the ``[ownClo
- ``maxLogLines`` (default: ``20000``) -- Specifies the maximum number of log lines displayed in the log window.
- ``chunkSize`` (default: ``5242880``) -- Specifies the chunk size of uploaded files in bytes.
- ``promptDeleteAllFiles`` (default: ``true``) -- If a UI prompt should ask for confirmation if it was detected that all files and folders were deleted.
- ``notificationRefreshInterval`` (default``300,000``) -- Specifies the default interval of checking for new server notifications in milliseconds.
Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 82 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 72 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 52 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 52 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 82 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 49 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 58 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 58 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 224 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 99 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 20 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 24 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 34 KiB

+3 -3
Ver Arquivo
@@ -4,16 +4,16 @@ ownCloud Desktop Client Manual
==============================
.. toctree::
:maxdepth: 3
:maxdepth: 2
introduction
installing
navigating
advancedusage
autoupdate
building
architecture
troubleshooting
faq
glossary
glossary
+14 -10
Ver Arquivo
@@ -12,18 +12,22 @@ Desktop Sync client enables you to:
Your files are always automatically synchronized between your ownCloud server
and local PC.
.. note:: Because of various technical issues, desktop sync clients older than
1.7 will not allowed to connect and sync with the ownCloud 8.1+ server. It
is highly recommended to keep your client updated.
Because of various technical issues, desktop sync clients older than 1.7 will
not allowed to connect and sync with the ownCloud 8.1+ server. It is highly
recommended to keep your client updated.
Improvements and New Features
-----------------------------
The 2.1 release of the ownCloud desktop sync client has many new features and
The 2.2 release of the ownCloud desktop sync client has many new features and
improvements. (See the `complete changelog
<https://owncloud.org/changelog/desktop/>`_.)
* Share with internal ownCloud users from your desktop
* Separate views for server activity, sync activity, and errors
* Don't re-upload *eml-files if size and checksum are unchanged
* Improved upload/download progress indicator
* Show server notifications on the client
* Improved sync speed
* Improved handling of Win32 file locks and network files
* Improved user notifications about ignored files and conflicts
* Add warnings for old server versions
* Update of QtKeyChain to support Windows credential store
* Packaging of dolphin overlay icon module for bleeding edge distros
+5
Ver Arquivo
@@ -0,0 +1,5 @@
When disk space is low the ownCloud Client will be unable to synchronize all files. This section describes its behavior in a low disk space situation as well as the options that influence it.
1. Synchronization of a folder aborts entirely if the remaining disk space falls below 50 MB. This threshold can be adjusted with the ``OWNCLOUD_CRITICAL_FREE_SPACE_BYTES`` environment variable.
2. Downloads that would reduce the free disk space below 250 MB will be skipped or aborted. The download will be retried regularly and other synchronization is unaffected. This threshold can be adjusted with the ``OWNCLOUD_FREE_SPACE_BYTES`` environment variable.
+69 -24
Ver Arquivo
@@ -11,7 +11,7 @@ in the system tray (Windows, KDE), status bar (Mac OS X), or notification area
.. figure:: images/icon.png
:alt: Status icon, little cloud with green circle and white checkmark
The status indicator uses overlay icons to indicate the current status of your
The status indicator uses icons to indicate the current status of your
synchronization. The green circle with the white checkmark tells you that your
synchronization is current and you are connected to your ownCloud server.
@@ -24,7 +24,7 @@ The blue icon with the white semi-circles means synchronization is in progress.
:alt: Status icon, little cloud with yellow circle and vertical parallel
lines
The yellow overlay icon with the parallel lines tells you your synchronization
The yellow icon with the parallel lines tells you your synchronization
has been paused. (Most likely by you.)
.. figure:: images/icon-offline.png
@@ -58,11 +58,13 @@ operations.
This menu provides the following options:
* Quick access to your accounts
* Sync status
* Recent Changes, showing latest activities
* Status of your client version (whether it is up to date)
* Settings
* Help menu
* Pause synchronizations
* An option to log in or log out of all of your accounts at once
* Quit ownCloud
* Quit ownCloud, logging out and closing the client
A left-click on your systray icon opens the desktop client to the account
settings window.
@@ -82,7 +84,7 @@ have the following features:
* Connection status, showing which ownCloud server you are connected to, and
your ownCloud username.
* An **Account** button, which contains a dropdown menu with **Add New**,
**Sign In/Sign Out**, and **Remove**.
**Log Out**, and **Remove**.
* Used and available space on the server.
* Current synchronization status.
* **Add Folder Sync Connection** button, which is active only when you have
@@ -92,26 +94,17 @@ The little button with three dots (the overflow menu) that sits to the right of
the sync status bar offers four additional options:
* Open Folder
* Choose What to Sync
* Choose What to Sync (This appears only when your file tree is collapsed, and
expands the file tree)
* Pause Sync / Resume Sync
* Remove folder sync connection
**Open Folder** opens a file explorer window displaying the client-side folder
that is being synced.
**Choose What to Sync** opens the folder sync tree view. Use this to sync all
or only some of the folders in the folder tree.
**Open Folder** opens your local ownCloud sync folder.
**Pause Sync** pauses sync operations without making any changes to your
account. It will continue to update file and folder lists, without
downloading or updating files. To stop all sync activity use **Remove Sync**.
**Resume Sync** resumes sync operations.
**Remove Sync** removes the sync connection without removing the account. This
stops all sync activity, including file and folder list updates. If you want to
synchronize the folder tree again then click the **Add Folder Sync Connection**
button, and re-select the folder tree that you want to sync.
downloading or updating files. To stop all sync activity use **Remove
Folder Sync Connection**.
.. figure:: images/client-7.png
:alt: Extra options for sync operations
@@ -130,6 +123,39 @@ account, and then follow the account creation wizard. The new account will
appear as a new tab in the settings dialog, where you can adjust its settings at
any time. Use **Account** > **Remove** to delete accounts.
File Manager Overlay Icons
--------------------------
The ownCloud sync client provides overlay icons, in addition to the normal file
type icons, for your system file manager (Explorer on Windows, Finder on Mac and
Nautilus on Linux) to indicate the sync status of your ownCloud files.
The overlay icons are similar to the systray icons introduced above. They
behave differently on files and directories according to sync status
and errors.
The overlay icon of an individual file indicates its current sync state. If the
file is in sync with the server version, it displays a green checkmark.
If the file is ignored from syncing, for example because it is on your
exclude list, or because it is a symbolic link, it displays a warning icon.
If there is a sync error, or the file is blacklisted, it displays an
eye-catching red X.
If the file is waiting to be synced, or is currently syncing, the overlay
icon displays a blue cycling icon.
When the client is offline, no icons are shown to reflect that the
folder is currently out of sync and no changes are synced to the server.
The overlay icon of a synced directory indicates the status of the files in the
directory. If there are any sync errors, the directory is marked with a warning
icon.
If a directory includes ignored files that are marked with warning icons
that does not change the status of the parent directories.
Sharing From Your Desktop
-------------------------
@@ -139,9 +165,7 @@ the ``owncloud-client-nautilus`` plugin.) You can create share links, and share
with internal ownCloud users the same way as in your ownCloud Web interface.
.. figure:: images/mac-share.png
:alt: Sync client integration in Finder on Mac OS X.
*Shared ownCloud files in Finder on Mac OS X*
:alt: Sync client integration in Windows Explorer.
Right-click your systray icon, hover over the account you want to use, and
left-click "Open folder [folder name] to quickly enter your local ownCloud
@@ -170,6 +194,25 @@ such as files not synced.
.. figure:: images/client-8.png
:alt: Activity windows logs all server and client activities.
Server Notifications
--------------------
Starting with version 2.2.0, the client will display notifications from your
ownCloud server that require manual interaction by you. For example, when a
user on a remote ownCloud creates a new Federated share for you, you can accept
it from your desktop client.
The desktop client automatically checks for available notifications
automatically on a regular basis. Notifications are displayed in the Server
Activity tab, and if you have **Show Desktop Notifications** enabled (General
tab) you'll also see a systray notification.
.. figure:: images/client12.png
:alt: Activity window with notification.
This also displays notifications sent to users by the ownCloud admin via the
Announcements app.
General Window
--------------
@@ -206,10 +249,12 @@ can use the *Ignored Files Editor* (General tab.)
.. figure:: images/ignored_files_editor.png
For your convenience, the editor is pre-populated with a default list of typical
For your convenience, the editor is pre-populated with a default list of
typical
ignore patterns. These patterns are contained in a system file (typically
``sync-exclude.lst``) located in the ownCloud Client application directory. You
cannot modify these pre-populated patterns directly from the editor. However, if
cannot modify these pre-populated patterns directly from the editor. However,
if
necessary, you can hover over any pattern in the list to show the path and
filename associated with that pattern, locate the file, and edit the
``sync-exclude.lst`` file.
+1 -1
Ver Arquivo
@@ -49,7 +49,7 @@ Other command line switches supported by ``owncloudcmd`` include the following:
Exclude list file
``--unsyncedfolders [file]``
File containing the list of unsynced folders (selective sync)
File containing the list of unsynced remote folders (selective sync)
``--max-sync-retries [n]``
Retries maximum n times (defaults to 3)
+1 -1
Ver Arquivo
@@ -78,7 +78,7 @@ Other issues can affect synchronization of your ownCloud files:
- If you are operating your own server, and use the local storage backend (the
default), make sure that ownCloud has exclusive access to the directory.
.. note:: The data directory on the server is exclusive to ownCloud and must not be modified manually.
.. warning:: The data directory on the server is exclusive to ownCloud and must not be modified manually.
- If you are using a different file backend on the server, you can try to exclude a bug in the
backend by reverting to the built-in backend.
+127
Ver Arquivo
@@ -8,3 +8,130 @@ GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
# Translations
# Translations
# Translations
# Translations
# Translations
# Translations
# Translations
# Translations
# Translations
Icon[oc]=@APPLICATION_EXECUTABLE@
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@
Comment[da]=@APPLICATION_NAME@ skrivebordsklient til synkronisering
GenericName[da]=Mappesynkronisering
Name[da]=@APPLICATION_NAME@ skrivebordsklient til synk
Icon[da]=@APPLICATION_EXECUTABLE@
Comment[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
GenericName[de]=Ordner-Synchronisation
Name[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
Icon[de]=@APPLICATION_EXECUTABLE@
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@
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@
Comment[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
GenericName[de_DE]=Ordner-Synchronisation
Name[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
Icon[de_DE]=@APPLICATION_EXECUTABLE@
Comment[fr]=@APPLICATION_NAME@ synchronisation du client
GenericName[fr]=Dossier de Synchronisation
Name[fr]=@APPLICATION_NAME@ synchronisation du client
Icon[fr]=@APPLICATION_EXECUTABLE@
Comment[he]=@APPLICATION_NAME@ לקוח סנכון שולחן עבודה
GenericName[he]=סנכון תיקייה
Name[he]=@APPLICATION_NAME@ לקוח סנכרון שולחן עבודה
Icon[he]=@APPLICATION_EXECUTABLE@
Comment[id]=Klien sinkronisasi desktop @APPLICATION_NAME@
GenericName[id]=Folder Sync
Name[id]=Klien sync desktop @APPLICATION_NAME@
Icon[id]=@APPLICATION_EXECUTABLE@
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@
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@
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
GenericName[ko]=폴더 동기화
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
Comment[nl]=@APPLICATION_NAME@ desktop synchronisatie client
GenericName[nl]=Mappen sync
Name[nl]=@APPLICATION_NAME@ desktop sync client
Icon[nl]=@APPLICATION_EXECUTABLE@
Comment[bg_BG]=@APPLICATION_NAME@ клиент за десктоп синхронизация
GenericName[bg_BG]=Синхронизиране на папката
Name[bg_BG]=@APPLICATION_NAME@ клиент десктоп синхронизация
Icon[bg_BG]=@APPLICATION_EXECUTABLE@
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@
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@
Comment[ru]=Настольный клиент синхронизации @НАЗВАНИЕ_ПРИЛОЖЕНИЯ@
GenericName[ru]=Синхронизация папки
Name[ru]=Настольный клиент синхронизации @НАЗВАНИЕ_ПРИЛОЖЕНИЯ@
Icon[ru]=@ВЫПОЛНЯЕМОЕ_ПРИЛОЖЕНИЕ@
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@
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@
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
GenericName[ja_JP]=フォルダ同期
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
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@
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
GenericName[zh_CN]=文件夹同步
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
Icon[zh_CN]=@APPLICATION_EXECUTABLE@
GenericName[zh_TW]=資料夾同步
Comment[pt_PT]=@APPLICATION_NAME@ cliente de sincronização para ambiente de trabalho
GenericName[pt_PT]=Sincronizar Pasta
Name[pt_PT]=@APPLICATION_NAME@ cliente de sincronização para ambiente de trabalho
Icon[pt_PT]=@APPLICATION_EXECUTABLE@
Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
Name[th_TH]= @APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
Icon[th_TH]=@APPLICATION_EXECUTABLE@
Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 900 B

+11 -2
Ver Arquivo
@@ -7,6 +7,9 @@ add_custom_target( legacy_mac_overlayplugin ALL
OC_SOCKETAPI_TEAM_IDENTIFIER_PREFIX=${SOCKETAPI_TEAM_IDENTIFIER_PREFIX}
COMMENT building Legacy Mac Overlay icons)
# Contrary to popular belief, this is called like this no matter what theme/OEM.
set(OC_OEM_SHARE_ICNS "${CMAKE_BINARY_DIR}/src/gui/ownCloud.icns")
# The bundle identifier and application group need to have compatible values with the client
# to be able to open a Mach port across the extension's sandbox boundary.
# Pass the info through the xcodebuild command line and make sure that the project uses
@@ -14,15 +17,21 @@ add_custom_target( legacy_mac_overlayplugin ALL
add_custom_target( mac_overlayplugin ALL
xcodebuild -project ${CMAKE_SOURCE_DIR}/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj
-target FinderSyncExt -configuration Release SYMROOT=${CMAKE_CURRENT_BINARY_DIR}
OC_APPLICATION_NAME=${APPLICATION_NAME}
OC_OEM_SHARE_ICNS=${OC_OEM_SHARE_ICNS}
OC_APPLICATION_NAME="${APPLICATION_NAME}"
OC_APPLICATION_REV_DOMAIN=${APPLICATION_REV_DOMAIN}
OC_SOCKETAPI_TEAM_IDENTIFIER_PREFIX=${SOCKETAPI_TEAM_IDENTIFIER_PREFIX}
COMMENT building Mac Overlay icons)
add_dependencies(mac_overlayplugin ${APPLICATION_EXECUTABLE}) # for the ownCloud.icns to be generated
# legacy
INSTALL( DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Release/SyncStateFinder.osax/Contents
DESTINATION ${CMAKE_INSTALL_PREFIX}/Library/ScriptingAdditions/SyncStateFinder.osax/ )
# >= 10.10.x
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Release/FinderSyncExt.appex
DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/Plugins
DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/PlugIns
USE_SOURCE_PERMISSIONS)
endif(APPLE)
@@ -103,7 +103,8 @@
if (_shareMenuTitle && !onlyRootsSelected) {
NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
[menu addItemWithTitle:_shareMenuTitle action:@selector(shareMenuAction:) keyEquivalent:@"title"];
NSMenuItem *item = [menu addItemWithTitle:_shareMenuTitle action:@selector(shareMenuAction:) keyEquivalent:@"title"];
item.image = [[NSBundle mainBundle] imageForResource:@"app.icns"];
return menu;
}
@@ -178,6 +178,7 @@
C2B573D31B1CD9CE00303B36 /* Sources */,
C2B573D41B1CD9CE00303B36 /* Frameworks */,
C2B573D51B1CD9CE00303B36 /* Resources */,
5B3335471CA058E200E11A45 /* ShellScript */,
);
buildRules = (
);
@@ -253,6 +254,23 @@
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
5B3335471CA058E200E11A45 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [[ ${OC_OEM_SHARE_ICNS} ]]; then\n cp ${OC_OEM_SHARE_ICNS} ${BUILT_PRODUCTS_DIR}/FinderSyncExt.appex/Contents/Resources/app.icns\nfi";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
C2B573AD1B1CD91E00303B36 /* Sources */ = {
isa = PBXSourcesBuildPhase;
@@ -429,6 +447,7 @@
MTL_ENABLE_DEBUG_INFO = YES;
OC_APPLICATION_NAME = ownCloud;
OC_APPLICATION_REV_DOMAIN = com.owncloud.desktopclient;
OC_OEM_SHARE_ICNS = "";
OC_SOCKETAPI_TEAM_IDENTIFIER_PREFIX = "";
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -476,6 +495,7 @@
MTL_ENABLE_DEBUG_INFO = NO;
OC_APPLICATION_NAME = ownCloud;
OC_APPLICATION_REV_DOMAIN = com.owncloud.desktopclient;
OC_OEM_SHARE_ICNS = "";
OC_SOCKETAPI_TEAM_IDENTIFIER_PREFIX = "";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
+17 -10
Ver Arquivo
@@ -28,19 +28,26 @@ include(GenerateExportHeader)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS)
if (NOT DEFINED APPLICATION_EXECUTABLE )
set ( APPLICATION_EXECUTABLE "owncloud" )
endif()
#---HELPER---
add_library(ownclouddolphinpluginhelper SHARED ownclouddolphinpluginhelper.cpp)
target_link_libraries(ownclouddolphinpluginhelper Qt5::Network)
generate_export_header(ownclouddolphinpluginhelper)
install(TARGETS ownclouddolphinpluginhelper LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(OWNCLOUDDOLPHINHELPER ${APPLICATION_EXECUTABLE}dolphinpluginhelper)
add_library(${OWNCLOUDDOLPHINHELPER} SHARED ownclouddolphinpluginhelper.cpp)
target_link_libraries(${OWNCLOUDDOLPHINHELPER} Qt5::Network)
generate_export_header(${OWNCLOUDDOLPHINHELPER} BASE_NAME ownclouddolphinpluginhelper)
install(TARGETS ${OWNCLOUDDOLPHINHELPER} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
#---OVERLAY PLUGIN---
kcoreaddons_add_plugin(ownclouddolphinoverlayplugin INSTALL_NAMESPACE "kf5/overlayicon"
set(OWNCLOUDDOLPHINOVERLAYPLUGIN ${APPLICATION_EXECUTABLE}dolphinoverlayplugin)
kcoreaddons_add_plugin(${OWNCLOUDDOLPHINOVERLAYPLUGIN} INSTALL_NAMESPACE "kf5/overlayicon"
JSON ownclouddolphinoverlayplugin.json SOURCES ownclouddolphinoverlayplugin.cpp)
target_link_libraries(ownclouddolphinoverlayplugin KF5::CoreAddons KF5::KIOCore KF5::KIOWidgets ownclouddolphinpluginhelper)
target_link_libraries(${OWNCLOUDDOLPHINOVERLAYPLUGIN} KF5::CoreAddons KF5::KIOCore KF5::KIOWidgets ${OWNCLOUDDOLPHINHELPER})
#---ACTION PLUGIN---
add_library(ownclouddolphinactionplugin MODULE ownclouddolphinactionplugin.cpp)
target_link_libraries(ownclouddolphinactionplugin KF5::CoreAddons KF5::KIOCore KF5::KIOWidgets ownclouddolphinpluginhelper)
install(FILES ownclouddolphinactionplugin.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR})
install(TARGETS ownclouddolphinactionplugin DESTINATION ${KDE_INSTALL_PLUGINDIR})
set(OWNCLOUDDOLPHINACTIONPLUGIN ${APPLICATION_EXECUTABLE}dolphinactionplugin)
add_library(${OWNCLOUDDOLPHINACTIONPLUGIN} MODULE ownclouddolphinactionplugin.cpp)
target_link_libraries(${OWNCLOUDDOLPHINACTIONPLUGIN} KF5::CoreAddons KF5::KIOCore KF5::KIOWidgets ${OWNCLOUDDOLPHINHELPER})
install(FILES ownclouddolphinactionplugin.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} RENAME ${OWNCLOUDDOLPHINACTIONPLUGIN}.desktop)
install(TARGETS ${OWNCLOUDDOLPHINACTIONPLUGIN} DESTINATION ${KDE_INSTALL_PLUGINDIR})
+78 -37
Ver Arquivo
@@ -21,11 +21,15 @@ import socket
from gi.repository import GObject, Nautilus
print("Initializing owncloud-client-nautilus extension")
# Do not touch the following line.
# Please do not touch the following line.
# The reason is that we use a script to adopt this file for branding
# by replacing this line with the branding app name. If the following
# line is changed, the script can not match the pattern and fails.
appname = 'ownCloud'
print("Initializing "+appname+"-client-nautilus extension")
def get_local_path(url):
if url[0:7] == 'file://':
url = url[7:]
@@ -66,6 +70,7 @@ class SocketConnect(GObject.GObject):
GObject.timeout_add(5000, self._connectToSocketServer)
def sendCommand(self, cmd):
# print("Server command: " + cmd)
if self.connected:
try:
self._sock.send(cmd)
@@ -180,10 +185,10 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
if not syncedFile:
return items
# Create an menu item
# Create a menu item
labelStr = "Share with " + appname + "..."
item = Nautilus.MenuItem(name='NautilusPython::ShareItem', label=labelStr,
tip='Share file %s through ownCloud' % file.get_name())
tip='Share file {} through {}'.format(file.get_name(), appname) )
item.connect("activate", self.menu_share, file)
items.append(item)
@@ -225,41 +230,43 @@ class SyncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
for p in socketConnect.nautilusVFSFile_table:
if p == path or p.startswith(path):
item = socketConnect.nautilusVFSFile_table[p]['item']
update_items.append(item)
update_items.append(p)
for item in update_items:
item.invalidate_extension_info()
for path1 in update_items:
socketConnect.nautilusVFSFile_table[path1]['item'].invalidate_extension_info()
# Handles a single line of server response and sets the emblem
def handle_commands(self, action, args):
Emblems = { 'OK' : appname +'_ok',
'SYNC' : appname +'_sync',
'NEW' : appname +'_sync',
'IGNORE' : appname +'_warn',
'ERROR' : appname +'_error',
'OK+SWM' : appname +'_ok_shared',
'SYNC+SWM' : appname +'_sync_shared',
'NEW+SWM' : appname +'_sync_shared',
'IGNORE+SWM': appname +'_warn_shared',
'ERROR+SWM' : appname +'_error_shared',
'NOP' : appname +'_error'
}
# file = args[0] # For debug only
# print("Action for " + file + ": " + args[0]) # For debug only
if action == 'STATUS':
newState = args[0]
emblem = Emblems[newState]
filename = ':'.join(args[1:])
if emblem:
itemStore = self.find_item_for_file(filename)
if itemStore:
if( not itemStore['state'] or newState != itemStore['state'] ):
item = itemStore['item']
item.add_emblem(emblem)
# print("Setting emblem on " + filename + "<>" + emblem + "<>") # For debug only
socketConnect.nautilusVFSFile_table[filename] = {'item': item, 'state':newState}
itemStore = self.find_item_for_file(filename)
if itemStore:
if( not itemStore['state'] or newState != itemStore['state'] ):
item = itemStore['item']
# print("Setting emblem on " + filename + "<>" + emblem + "<>") # For debug only
# If an emblem is already set for this item, we need to
# clear the existing extension info before setting a new one.
#
# That will also trigger a new call to
# update_file_info for this item! That's why we set
# skipNextUpdate to True: we don't want to pull the
# current data from the client after getting a push
# notification.
invalidate = itemStore['state'] != None
if invalidate:
item.invalidate_extension_info()
self.set_emblem(item, newState)
socketConnect.nautilusVFSFile_table[filename] = {
'item': item,
'state': newState,
'skipNextUpdate': invalidate }
elif action == 'UPDATE_VIEW':
# Search all items underneath this path and invalidate them
@@ -271,6 +278,25 @@ class SyncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
elif action == 'UNREGISTER_PATH':
self.invalidate_items_underneath(args[0])
def set_emblem(self, item, state):
Emblems = { 'OK' : appname +'_ok',
'SYNC' : appname +'_sync',
'NEW' : appname +'_sync',
'IGNORE' : appname +'_warn',
'ERROR' : appname +'_error',
'OK+SWM' : appname +'_ok_shared',
'SYNC+SWM' : appname +'_sync_shared',
'NEW+SWM' : appname +'_sync_shared',
'IGNORE+SWM': appname +'_warn_shared',
'ERROR+SWM' : appname +'_error_shared',
'NOP' : ''
}
emblem = 'NOP' # Show nothing if no emblem is defined.
if state in Emblems:
emblem = Emblems[state]
item.add_emblem(emblem)
def update_file_info(self, item):
if item.get_uri_scheme() != 'file':
return
@@ -279,13 +305,28 @@ class SyncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
if item.is_directory():
filename += '/'
inScope = False
for reg_path in socketConnect.registered_paths:
if filename.startswith(reg_path):
socketConnect.nautilusVFSFile_table[filename] = {'item': item, 'state':''}
# item.add_string_attribute('share_state', "share state") # ?
self.askForOverlay(filename)
inScope = True
break
else:
# print("Not in scope:" + filename) # For debug only
pass
if not inScope:
return
# Ask for the current state from the client -- unless this update was
# triggered by receiving a STATUS message from the client in the first
# place.
itemStore = self.find_item_for_file(filename)
if itemStore and itemStore['skipNextUpdate'] and itemStore['state']:
itemStore['skipNextUpdate'] = False
itemStore['item'] = item
self.set_emblem(item, itemStore['state'])
else:
socketConnect.nautilusVFSFile_table[filename] = {
'item': item,
'state': None,
'skipNextUpdate': False }
# item.add_string_attribute('share_state', "share state") # ?
self.askForOverlay(filename)
@@ -36,8 +36,7 @@ using namespace std;
OCClientInterface::ContextMenuInfo OCClientInterface::FetchInfo()
{
auto pipename = std::wstring(L"\\\\.\\pipe\\");
pipename += L"ownCloud";
auto pipename = CommunicationSocket::DefaultPipePath();
CommunicationSocket socket;
if (!WaitNamedPipe(pipename.data(), PIPE_TIMEOUT)) {
@@ -72,8 +71,7 @@ OCClientInterface::ContextMenuInfo OCClientInterface::FetchInfo()
void OCClientInterface::ShareObject(const std::wstring &path)
{
auto pipename = std::wstring(L"\\\\.\\pipe\\");
pipename += L"ownCloud";
auto pipename = CommunicationSocket::DefaultPipePath();
CommunicationSocket socket;
if (!WaitNamedPipe(pipename.data(), PIPE_TIMEOUT)) {
+31 -25
Ver Arquivo
@@ -108,31 +108,6 @@ HRESULT RegisterCLSID(LPCOLESTR guidStr, PCWSTR overlayStr, PCWSTR szModule)
return hResult;
}
HRESULT _stdcall DllRegisterServer(void)
{
HRESULT hResult = S_OK;
wchar_t szModule[MAX_PATH];
if (GetModuleFileName(instanceHandle, szModule, ARRAYSIZE(szModule)) == 0) {
hResult = HRESULT_FROM_WIN32(GetLastError());
return hResult;
}
hResult = RegisterCLSID(OVERLAY_GUID_ERROR, OVERLAY_NAME_ERROR, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_OK, OVERLAY_NAME_OK, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_OK_SHARED, OVERLAY_NAME_OK_SHARED, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_SYNC, OVERLAY_NAME_SYNC, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_WARNING, OVERLAY_NAME_WARNING, szModule);
return hResult;
}
HRESULT UnregisterCLSID(LPCOLESTR guidStr, PCWSTR overlayStr)
{
HRESULT hResult = S_OK;
@@ -155,6 +130,37 @@ HRESULT UnregisterCLSID(LPCOLESTR guidStr, PCWSTR overlayStr)
return hResult;
}
HRESULT _stdcall DllRegisterServer(void)
{
HRESULT hResult = S_OK;
wchar_t szModule[MAX_PATH];
if (GetModuleFileName(instanceHandle, szModule, ARRAYSIZE(szModule)) == 0) {
hResult = HRESULT_FROM_WIN32(GetLastError());
return hResult;
}
// Unregister any obsolete CLSID when we register here
// Those CLSID were removed in 2.1, but we need to make sure to prevent any previous version
// of the extension on the system from loading at the same time as a new version to avoid crashing explorer.
UnregisterCLSID(OVERLAY_GUID_ERROR_SHARED, OVERLAY_NAME_ERROR_SHARED);
UnregisterCLSID(OVERLAY_GUID_SYNC_SHARED, OVERLAY_NAME_SYNC_SHARED);
UnregisterCLSID(OVERLAY_GUID_WARNING_SHARED, OVERLAY_NAME_WARNING_SHARED);
hResult = RegisterCLSID(OVERLAY_GUID_ERROR, OVERLAY_NAME_ERROR, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_OK, OVERLAY_NAME_OK, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_OK_SHARED, OVERLAY_NAME_OK_SHARED, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_SYNC, OVERLAY_NAME_SYNC, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_WARNING, OVERLAY_NAME_WARNING, szModule);
return hResult;
}
STDAPI DllUnregisterServer(void)
{
HRESULT hResult = S_OK;
@@ -14,19 +14,25 @@
#define OVERLAY_GUID_ERROR L"{0960F090-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_ERROR_SHARED L"{0960F091-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_OK L"{0960F092-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_OK_SHARED L"{0960F093-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_SYNC L"{0960F094-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_SYNC_SHARED L"{0960F095-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_WARNING L"{0960F096-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_WARNING_SHARED L"{0960F097-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GENERIC_NAME L"OC Overlay Handler"
// two spaces to put us ahead of the competition :/
#define OVERLAY_NAME_ERROR L" OCError"
#define OVERLAY_NAME_ERROR_SHARED L" OCErrorShared"
#define OVERLAY_NAME_OK L" OCOK"
#define OVERLAY_NAME_OK_SHARED L" OCOKShared"
#define OVERLAY_NAME_SYNC L" OCSync"
#define OVERLAY_NAME_SYNC_SHARED L" OCSyncShared"
#define OVERLAY_NAME_WARNING L" OCWarning"
#define OVERLAY_NAME_WARNING_SHARED L" OCWarningShared"
#define REGISTRY_OVERLAY_KEY L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIconOverlayIdentifiers"
#define REGISTRY_CLSID L"CLSID"
@@ -24,11 +24,31 @@
#include <fstream>
#define BUFSIZE 1024
#define DEFAULT_BUFLEN 4096
using namespace std;
#define DEFAULT_BUFLEN 4096
namespace {
std::wstring getUserName() {
DWORD len = DEFAULT_BUFLEN;
TCHAR buf[DEFAULT_BUFLEN];
if (GetUserName(buf, &len)) {
return std::wstring(&buf[0], len);
} else {
return std::wstring();
}
}
}
std::wstring CommunicationSocket::DefaultPipePath()
{
auto pipename = std::wstring(L"\\\\.\\pipe\\");
pipename += L"ownCloud\\";
pipename += getUserName();
return pipename;
}
CommunicationSocket::CommunicationSocket()
: _pipe(INVALID_HANDLE_VALUE)
@@ -26,6 +26,8 @@
class __declspec(dllexport) CommunicationSocket
{
public:
static std::wstring DefaultPipePath();
CommunicationSocket();
~CommunicationSocket();
@@ -43,4 +45,4 @@ private:
bool _connected;
};
#endif
#endif
@@ -31,13 +31,10 @@
using namespace std;
// This code is run in a thread
void RemotePathChecker::workerThreadLoop()
{
auto pipename = std::wstring(L"\\\\.\\pipe\\");
pipename += L"ownCloud";
auto pipename = CommunicationSocket::DefaultPipePath();
bool connected = false;
CommunicationSocket socket;
std::unordered_set<std::wstring> asked;
@@ -241,4 +238,4 @@ RemotePathChecker::FileState RemotePathChecker::_StrToFileState(const std::wstri
}
return StateNone;
}
}
+3 -7
Ver Arquivo
@@ -28,16 +28,12 @@
* \return string PEM
*/
string x509ToString(BIO *o) {
int len = 0;
BUF_MEM *bptr;
void* data;
string ret = "";
BIO_get_mem_ptr(o, &bptr);
len = bptr->length;
data = calloc(len+10, sizeof(char));
int len = bptr->length;
void* data = calloc(len+10, sizeof(char));
BIO_read(o, data, len);
ret = strdup((char*)data);
string ret = std::string(static_cast<char*>(data));
free(data);
return ret;
-353
Ver Arquivo
@@ -1,353 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "fancylineedit.h"
#include <QEvent>
#include <QDebug>
#include <QString>
#include <QPropertyAnimation>
#include <QApplication>
#include <QMenu>
#include <QMouseEvent>
#include <QLabel>
#include <QAbstractButton>
#include <QPainter>
#include <QStyle>
#include <QPaintEvent>
#include <QDesktopWidget>
/*! Opens a menu at the specified widget position.
* This functions computes the position where to show the menu, and opens it with
* QMenu::exec().
* \param menu The menu to open
* \param widget The widget next to which to open the menu
*/
static void execMenuAtWidget(QMenu *menu, QWidget *widget)
{
QPoint p;
QRect screen = qApp->desktop()->availableGeometry(widget);
QSize sh = menu->sizeHint();
QRect rect = widget->rect();
if (widget->isRightToLeft()) {
if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height())
p = widget->mapToGlobal(rect.bottomRight());
else
p = widget->mapToGlobal(rect.topRight() - QPoint(0, sh.height()));
p.rx() -= sh.width();
} else {
if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height())
p = widget->mapToGlobal(rect.bottomLeft());
else
p = widget->mapToGlobal(rect.topLeft() - QPoint(0, sh.height()));
}
p.rx() = qMax(screen.left(), qMin(p.x(), screen.right() - sh.width()));
p.ry() += 1;
menu->exec(p);
}
/*!
\class Utils::FancyLineEdit
\brief A line edit with an embedded pixmap on one side that is connected to
a menu.
Additionally, it can display a grayed hintText (like "Type Here to")
when not focused and empty. When connecting to the changed signals and
querying text, one has to be aware that the text is set to that hint
text if isShowingHintText() returns true (that is, does not contain
valid user input).
*/
enum { margin = 6 };
#define ICONBUTTON_HEIGHT 18
#define FADE_TIME 160
namespace Utils {
// --------- FancyLineEditPrivate
class FancyLineEditPrivate : public QObject
{
public:
explicit FancyLineEditPrivate(FancyLineEdit *parent);
virtual bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE;
FancyLineEdit *m_lineEdit;
QPixmap m_pixmap[2];
QMenu *m_menu[2];
bool m_menuTabFocusTrigger[2];
IconButton *m_iconbutton[2];
bool m_iconEnabled[2];
};
FancyLineEditPrivate::FancyLineEditPrivate(FancyLineEdit *parent) :
QObject(parent), m_lineEdit(parent)
{
for (int i = 0; i < 2; ++i) {
m_menu[i] = 0;
m_menuTabFocusTrigger[i] = false;
m_iconbutton[i] = new IconButton(parent);
m_iconbutton[i]->installEventFilter(this);
m_iconbutton[i]->hide();
m_iconbutton[i]->setAutoHide(false);
m_iconEnabled[i] = false;
}
}
bool FancyLineEditPrivate::eventFilter(QObject *obj, QEvent *event)
{
int buttonIndex = -1;
for (int i = 0; i < 2; ++i) {
if (obj == m_iconbutton[i]) {
buttonIndex = i;
break;
}
}
if (buttonIndex == -1)
return QObject::eventFilter(obj, event);
switch (event->type()) {
case QEvent::FocusIn:
if (m_menuTabFocusTrigger[buttonIndex] && m_menu[buttonIndex]) {
m_lineEdit->setFocus();
execMenuAtWidget(m_menu[buttonIndex], m_iconbutton[buttonIndex]);
return true;
}
default:
break;
}
return QObject::eventFilter(obj, event);
}
// --------- FancyLineEdit
FancyLineEdit::FancyLineEdit(QWidget *parent) :
QLineEdit(parent),
d(new FancyLineEditPrivate(this))
{
ensurePolished();
updateMargins();
connect(this, SIGNAL(textChanged(QString)), this, SLOT(checkButtons(QString)));
connect(d->m_iconbutton[Left], SIGNAL(clicked()), this, SLOT(iconClicked()));
connect(d->m_iconbutton[Right], SIGNAL(clicked()), this, SLOT(iconClicked()));
}
void FancyLineEdit::checkButtons(const QString &text)
{
if (m_oldText.isEmpty() || text.isEmpty()) {
for (int i = 0; i < 2; ++i) {
if (d->m_iconbutton[i]->hasAutoHide())
d->m_iconbutton[i]->animateShow(!text.isEmpty());
}
m_oldText = text;
}
}
FancyLineEdit::~FancyLineEdit()
{
}
void FancyLineEdit::setButtonVisible(Side side, bool visible)
{
d->m_iconbutton[side]->setVisible(visible);
d->m_iconEnabled[side] = visible;
updateMargins();
}
bool FancyLineEdit::isButtonVisible(Side side) const
{
return d->m_iconEnabled[side];
}
void FancyLineEdit::iconClicked()
{
IconButton *button = qobject_cast<IconButton *>(sender());
int index = -1;
for (int i = 0; i < 2; ++i)
if (d->m_iconbutton[i] == button)
index = i;
if (index == -1)
return;
if (d->m_menu[index]) {
execMenuAtWidget(d->m_menu[index], button);
} else {
emit buttonClicked((Side)index);
if (index == Left)
emit leftButtonClicked();
else if (index == Right)
emit rightButtonClicked();
}
}
void FancyLineEdit::updateMargins()
{
bool leftToRight = (layoutDirection() == Qt::LeftToRight);
Side realLeft = (leftToRight ? Left : Right);
Side realRight = (leftToRight ? Right : Left);
int leftMargin = d->m_iconbutton[realLeft]->pixmap().width() + 8;
int rightMargin = d->m_iconbutton[realRight]->pixmap().width() + 8;
// Note KDE does not reserve space for the highlight color
if (style()->inherits("OxygenStyle")) {
leftMargin = qMax(24, leftMargin);
rightMargin = qMax(24, rightMargin);
}
QMargins margins((d->m_iconEnabled[realLeft] ? leftMargin : 0), 0,
(d->m_iconEnabled[realRight] ? rightMargin : 0), 0);
setTextMargins(margins);
}
void FancyLineEdit::updateButtonPositions()
{
QRect contentRect = rect();
for (int i = 0; i < 2; ++i) {
Side iconpos = (Side)i;
if (layoutDirection() == Qt::RightToLeft)
iconpos = (iconpos == Left ? Right : Left);
if (iconpos == FancyLineEdit::Right) {
const int iconoffset = textMargins().right() + 4;
d->m_iconbutton[i]->setGeometry(contentRect.adjusted(width() - iconoffset, 0, 0, 0));
} else {
const int iconoffset = textMargins().left() + 4;
d->m_iconbutton[i]->setGeometry(contentRect.adjusted(0, 0, -width() + iconoffset, 0));
}
}
}
void FancyLineEdit::resizeEvent(QResizeEvent *)
{
updateButtonPositions();
}
void FancyLineEdit::setButtonPixmap(Side side, const QPixmap &buttonPixmap)
{
d->m_iconbutton[side]->setPixmap(buttonPixmap);
updateMargins();
updateButtonPositions();
update();
}
QPixmap FancyLineEdit::buttonPixmap(Side side) const
{
return d->m_pixmap[side];
}
void FancyLineEdit::setButtonMenu(Side side, QMenu *buttonMenu)
{
d->m_menu[side] = buttonMenu;
d->m_iconbutton[side]->setIconOpacity(1.0);
}
QMenu *FancyLineEdit::buttonMenu(Side side) const
{
return d->m_menu[side];
}
bool FancyLineEdit::hasMenuTabFocusTrigger(Side side) const
{
return d->m_menuTabFocusTrigger[side];
}
void FancyLineEdit::setMenuTabFocusTrigger(Side side, bool v)
{
if (d->m_menuTabFocusTrigger[side] == v)
return;
d->m_menuTabFocusTrigger[side] = v;
d->m_iconbutton[side]->setFocusPolicy(v ? Qt::TabFocus : Qt::NoFocus);
}
bool FancyLineEdit::hasAutoHideButton(Side side) const
{
return d->m_iconbutton[side]->hasAutoHide();
}
void FancyLineEdit::setAutoHideButton(Side side, bool h)
{
d->m_iconbutton[side]->setAutoHide(h);
if (h)
d->m_iconbutton[side]->setIconOpacity(text().isEmpty() ? 0.0 : 1.0);
else
d->m_iconbutton[side]->setIconOpacity(1.0);
}
void FancyLineEdit::setButtonToolTip(Side side, const QString &tip)
{
d->m_iconbutton[side]->setToolTip(tip);
}
void FancyLineEdit::setButtonFocusPolicy(Side side, Qt::FocusPolicy policy)
{
d->m_iconbutton[side]->setFocusPolicy(policy);
}
// IconButton - helper class to represent a clickable icon
IconButton::IconButton(QWidget *parent)
: QAbstractButton(parent), m_iconOpacity(0), m_autoHide(false)
{
setCursor(Qt::ArrowCursor);
setFocusPolicy(Qt::NoFocus);
}
void IconButton::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QRect pixmapRect = QRect(0, 0, m_pixmap.width(), m_pixmap.height());
pixmapRect.moveCenter(rect().center());
if (m_autoHide)
painter.setOpacity(m_iconOpacity);
painter.drawPixmap(pixmapRect, m_pixmap);
}
void IconButton::animateShow(bool visible)
{
if (visible) {
QPropertyAnimation *animation = new QPropertyAnimation(this, "iconOpacity");
animation->setDuration(FADE_TIME);
animation->setEndValue(1.0);
animation->start(QAbstractAnimation::DeleteWhenStopped);
} else {
QPropertyAnimation *animation = new QPropertyAnimation(this, "iconOpacity");
animation->setDuration(FADE_TIME);
animation->setEndValue(0.0);
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
}
} // namespace Utils
-121
Ver Arquivo
@@ -1,121 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef FANCYLINEEDIT_H
#define FANCYLINEEDIT_H
#include <QLineEdit>
#include <QAbstractButton>
namespace Utils {
class FancyLineEditPrivate;
class IconButton: public QAbstractButton
{
Q_OBJECT
Q_PROPERTY(float iconOpacity READ iconOpacity WRITE setIconOpacity)
Q_PROPERTY(bool autoHide READ hasAutoHide WRITE setAutoHide)
Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap)
public:
explicit IconButton(QWidget *parent = 0);
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
void setPixmap(const QPixmap &pixmap) { m_pixmap = pixmap; update(); }
QPixmap pixmap() const { return m_pixmap; }
float iconOpacity() { return m_iconOpacity; }
void setIconOpacity(float value) { m_iconOpacity = value; update(); }
void animateShow(bool visible);
void setAutoHide(bool hide) { m_autoHide = hide; }
bool hasAutoHide() const { return m_autoHide; }
private:
float m_iconOpacity;
bool m_autoHide;
QPixmap m_pixmap;
};
class FancyLineEdit : public QLineEdit
{
Q_OBJECT
Q_ENUMS(Side)
public:
enum Side {Left = 0, Right = 1};
explicit FancyLineEdit(QWidget *parent = 0);
~FancyLineEdit();
QPixmap buttonPixmap(Side side) const;
void setButtonPixmap(Side side, const QPixmap &pixmap);
QMenu *buttonMenu(Side side) const;
void setButtonMenu(Side side, QMenu *menu);
void setButtonVisible(Side side, bool visible);
bool isButtonVisible(Side side) const;
void setButtonToolTip(Side side, const QString &);
void setButtonFocusPolicy(Side side, Qt::FocusPolicy policy);
// Set whether tabbing in will trigger the menu.
void setMenuTabFocusTrigger(Side side, bool v);
bool hasMenuTabFocusTrigger(Side side) const;
// Set if icon should be hidden when text is empty
void setAutoHideButton(Side side, bool h);
bool hasAutoHideButton(Side side) const;
#if QT_VERSION <= 0x040700
void setPlaceholderText( const QString& ) { }
#endif
signals:
void buttonClicked(Utils::FancyLineEdit::Side side);
void leftButtonClicked();
void rightButtonClicked();
private slots:
void checkButtons(const QString &);
void iconClicked();
protected:
virtual void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;
private:
void updateMargins();
void updateButtonPositions();
friend class Utils::FancyLineEditPrivate;
FancyLineEditPrivate *d;
QString m_oldText;
};
} // namespace Utils
#endif // FANCYLINEEDIT_H
+264
Ver Arquivo
@@ -0,0 +1,264 @@
/****************************************************************************
**
** Copyright (C) 2014 Daniel Molkentin <daniel@molkentin.de>
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtNetwork module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef TOKENIZER_H
#define TOKENIZER_H
#include <QString>
#include <QByteArray>
#include <QSharedPointer>
QT_BEGIN_NAMESPACE
template <class T, class const_iterator>
struct QTokenizerPrivate {
typedef typename T::value_type char_type;
struct State {
bool inQuote;
bool inEscape;
char_type quoteChar;
State() : inQuote(false), inEscape(false), quoteChar('\0') {}
};
QTokenizerPrivate(const T& _string, const T& _delims) :
string(_string)
, begin(string.begin())
, end(string.end())
, tokenBegin(end)
, tokenEnd(begin)
, delimiters(_delims)
, isDelim(false)
, returnDelimiters(false)
, returnQuotes(false)
{
}
bool isDelimiter(char_type c) const {
return delimiters.contains(c);
}
bool isQuote(char_type c) const {
return quotes.contains(c);
}
// Returns true if a delimiter was not hit
bool nextChar(State* state, char_type c) {
if (state->inQuote) {
if (state->inEscape) {
state->inEscape = false;
} else if (c == '\\') {
state->inEscape = true;
} else if (c == state->quoteChar) {
state->inQuote = false;
}
} else {
if (isDelimiter(c))
return false;
state->inQuote = isQuote(state->quoteChar = c);
}
return true;
}
T string;
// ### copies begin and end for performance, premature optimization?
const_iterator begin;
const_iterator end;
const_iterator tokenBegin;
const_iterator tokenEnd;
T delimiters;
T quotes;
bool isDelim;
bool returnDelimiters;
bool returnQuotes;
};
template <class T, class const_iterator>
class QTokenizer {
public:
typedef typename T::value_type char_type;
/*!
\class QTokenizer
\inmodule QtNetwork
\brief QTokenizer tokenizes Strings on QString, QByteArray,
std::string or std::wstring
Example Usage:
\code
QString str = ...;
QByteArrayTokenizer tokenizer(str, "; ");
tokenizer.setQuoteCharacters("\"'");
tokenizer.setReturnDelimiters(true);
while (tokenizer.hasNext()) {
QByteArray token = tokenizer.next();
bool isDelimiter = tokenizer.isDelimiter();
...
}
\endcode
\param string The string to tokenize
\param delimiters A string containing delimiters
\sa QStringTokenizer, QByteArrayTokenizer, StringTokenizer, WStringTokenizer
*/
QTokenizer(const T& string, const T& delimiters)
: d(new QTokenizerPrivate<T, const_iterator>(string, delimiters))
{ }
/*!
Whether or not to return delimiters as tokens
\see setQuoteCharacters
*/
void setReturnDelimiters(bool enable) { d->returnDelimiters = enable; }
/*!
Sets characters that are considered to start and end quotes.
When between two characters considered a quote, delimiters will
be ignored.
When between quotes, blackslash characters will cause the QTokenizer
to skip the next character.
\param quotes Characters that delimit quotes.
*/
void setQuoteCharacters(const T& quotes) { d->quotes = quotes; }
/*!
Whether or not to return delimiters as tokens
\see setQuoteCharacters
*/
void setReturnQuoteCharacters(bool enable) { d->returnQuotes = enable; }
/*!
Retrieve next token.
Returns true if there are more tokens, false otherwise.
\sa next()
*/
bool hasNext()
{
typename QTokenizerPrivate<T, const_iterator>::State state;
d->isDelim = false;
for (;;) {
d->tokenBegin = d->tokenEnd;
if (d->tokenEnd == d->end)
return false;
d->tokenEnd++;
if (d->nextChar(&state, *d->tokenBegin))
break;
if (d->returnDelimiters) {
d->isDelim = true;
return true;
}
}
while (d->tokenEnd != d->end && d->nextChar(&state, *d->tokenEnd)) {
d->tokenEnd++;
}
return true;
}
/*!
Resets the tokenizer to the starting position.
*/
void reset() {
d->tokenEnd = d->begin;
}
/*!
Returns true if the current token is a delimiter,
if one more more delimiting characters have been set.
*/
bool isDelimiter() const { return d->isDelim; }
/*!
Returns the current token.
Use \c hasNext() to fetch the next token.
*/
T next() const {
int len = d->tokenEnd-d->tokenBegin;
const_iterator tmpStart = d->tokenBegin;
if (!d->returnQuotes && len > 1 && d->isQuote(*d->tokenBegin)) {
tmpStart++;
len -= 2;
}
return T(tmpStart, len);
}
private:
friend class QStringTokenizer;
QSharedPointer<QTokenizerPrivate<T, const_iterator> > d;
};
class QStringTokenizer : public QTokenizer<QString, QString::const_iterator> {
public:
QStringTokenizer(const QString &string, const QString &delim) :
QTokenizer<QString, QString::const_iterator>(string, delim) {}
/**
* @brief Like \see next(), but returns a lightweight string reference
* @return A reference to the token within the string
*/
QStringRef stringRef() {
int begin = d->tokenBegin-d->begin;
int end = d->tokenEnd-d->tokenBegin;
if (!d->returnQuotes && d->isQuote(*d->tokenBegin)) {
begin++;
end -= 2;
}
return QStringRef(&d->string, begin, end);
}
};
typedef QTokenizer<QByteArray, QByteArray::const_iterator> QByteArrayTokenizer;
typedef QTokenizer<std::string, std::string::const_iterator> StringTokenizer;
typedef QTokenizer<std::wstring, std::wstring::const_iterator> WStringTokenizer;
QT_END_NAMESPACE
#endif // TOKENIZER_H
+2
Ver Arquivo
@@ -0,0 +1,2 @@
TEMPLATE = subdirs
SUBDIRS = test
+8
Ver Arquivo
@@ -0,0 +1,8 @@
TEMPLATE = app
QT += testlib
CONFIG += testlib
TARGET = test
INCLUDEPATH += . ..
# Input
SOURCES += tst_qtokenizer.cpp
+139
Ver Arquivo
@@ -0,0 +1,139 @@
#include <QtTest>
#include "qtokenizer.h"
namespace {
const QString simple = QLatin1String("A simple tokenizer test");
const QString quoted = QLatin1String("\"Wait for me!\" he shouted");
}
class TestTokenizer : public QObject
{
Q_OBJECT
private slots:
void tokenizeQStringSimple() {
QStringTokenizer tokenizer(simple, " ");
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("A"));
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("simple"));
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("tokenizer"));
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("test"));
QCOMPARE(tokenizer.hasNext(), false);
}
void tokenizeQStringSimpleRef() {
QStringTokenizer tokenizer(simple, " ");
QCOMPARE(tokenizer.hasNext(), true);
QVERIFY(tokenizer.stringRef() == QLatin1String("A"));
QCOMPARE(tokenizer.hasNext(), true);
QVERIFY(tokenizer.stringRef() == QLatin1String("simple"));
QCOMPARE(tokenizer.hasNext(), true);
QVERIFY(tokenizer.stringRef() == QLatin1String("tokenizer"));
QCOMPARE(tokenizer.hasNext(), true);
QVERIFY(tokenizer.stringRef() == QLatin1String("test"));
QCOMPARE(tokenizer.hasNext(), false);
}
void tokenizeQStringQuoted() {
const QString multiquote(QLatin1String("\"'Billy - the Kid' is dead!\""));
QStringTokenizer tokenizer(multiquote, " -");
tokenizer.setQuoteCharacters("\"");
tokenizer.setReturnQuoteCharacters(true);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("\"'Billy - the Kid' is dead!\""));
QCOMPARE(tokenizer.hasNext(), false);
}
void tokenizeQStringSkipQuotes() {
const QString multiquote(QLatin1String("\"'Billy - the Kid' is dead!\""));
QStringTokenizer tokenizer(multiquote, " ");
tokenizer.setQuoteCharacters("\"");
tokenizer.setReturnQuoteCharacters(false);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("'Billy - the Kid' is dead!"));
QCOMPARE(tokenizer.stringRef().toString(), QLatin1String("'Billy - the Kid' is dead!"));
QCOMPARE(tokenizer.hasNext(), false);
}
void tokenizeQStringWithDelims() {
const QString delims(QLatin1String("I;Insist,On/a-Delimiter"));
QStringTokenizer tokenizer(delims, ";,/-");
tokenizer.setReturnDelimiters(true);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), false);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), true);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), false);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), true);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), false);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), true);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), false);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), true);
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.isDelimiter(), false);
QCOMPARE(tokenizer.hasNext(), false);
}
void resetTokenizer() {
for (int i = 0; i < 2; i++) {
QStringTokenizer tokenizer(simple, " ");
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("A"));
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("simple"));
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("tokenizer"));
QCOMPARE(tokenizer.hasNext(), true);
QCOMPARE(tokenizer.next(), QLatin1String("test"));
QCOMPARE(tokenizer.hasNext(), false);
tokenizer.reset();
}
}
// ### QByteArray, other types
};
QTEST_APPLESS_MAIN(TestTokenizer)
#include "tst_qtokenizer.moc"
+22625 -10014
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+1801 -56
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+22
Ver Arquivo
@@ -5,10 +5,32 @@ set(BIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(synclib_NAME ${APPLICATION_EXECUTABLE}sync)
include(QtVersionAbstraction)
setup_qt()
if(HAVE_QT5 AND NOT BUILD_WITH_QT4)
if (${Qt5Core_VERSION_MAJOR} EQUAL "5")
if (${Qt5Core_VERSION_MINOR} EQUAL "4" OR ${Qt5Core_VERSION_MINOR} GREATER 4)
else()
message(STATUS "If possible compile me with Qt 5.4 or higher.")
endif()
endif()
else()
message(STATUS "If possible compile me with Qt 5.4 or higher.")
endif()
if (APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
endif()
if(NOT TOKEN_AUTH_ONLY)
if (Qt5Core_DIR)
find_package(Qt5Keychain REQUIRED)
else()
find_package(QtKeychain REQUIRED)
endif()
endif()
add_subdirectory(libsync)
if (NOT BUILD_LIBRARIES_ONLY)
add_subdirectory(gui)
+3
Ver Arquivo
@@ -17,6 +17,9 @@ include_directories(${CMAKE_SOURCE_DIR}/csync/src
${CMAKE_BINARY_DIR}/csync/src
)
# Need tokenizer for netrc parser
include_directories(${CMAKE_SOURCE_DIR}/src/3rdparty/qtokenizer)
if(NOT BUILD_LIBRARIES_ONLY)
add_executable(${cmd_NAME} ${cmd_SRC})
qt5_use_modules(${cmd_NAME} Network Sql)
+24 -50
Ver Arquivo
@@ -153,7 +153,7 @@ void help()
std::cout << " Proxy is http://server:port" << std::endl;
std::cout << " --trust Trust the SSL certification." << std::endl;
std::cout << " --exclude [file] Exclude list file" << std::endl;
std::cout << " --unsyncedfolders [file] File containing the list of unsynced folders (selective sync)" << std::endl;
std::cout << " --unsyncedfolders [file] File containing the list of unsynced remote folders (selective sync)" << std::endl;
std::cout << " --user, -u [name] Use [name] as the login name" << std::endl;
std::cout << " --password, -p [pass] Use [pass] as password" << std::endl;
std::cout << " -n Use netrc (5) for login" << std::endl;
@@ -249,23 +249,23 @@ void parseOptions( const QStringList& app_args, CmdOptions *options )
*/
void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList)
{
if (!journal->exists()) {
return;
}
SqlDatabase db;
if (!db.openOrCreateReadWrite(journal->databaseFilePath())) {
return;
}
auto oldBlackListSet = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList).toSet();
auto blackListSet = newList.toSet();
auto changes = (oldBlackListSet - blackListSet) + (blackListSet - oldBlackListSet);
foreach(const auto &it, changes) {
journal->avoidReadFromDbOnNextSync(it);
}
bool ok;
journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, newList);
auto oldBlackListSet = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok).toSet();
if( ok ) {
auto blackListSet = newList.toSet();
auto changes = (oldBlackListSet - blackListSet) + (blackListSet - oldBlackListSet);
foreach(const auto &it, changes) {
journal->avoidReadFromDbOnNextSync(it);
}
journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, newList);
}
}
@@ -385,26 +385,10 @@ int main(int argc, char **argv) {
int restartCount = 0;
restart_sync:
CSYNC *_csync_ctx;
if( csync_create( &_csync_ctx, options.source_dir.toUtf8(),
remUrl.constData()) < 0 ) {
qFatal("Unable to create csync-context!");
return EXIT_FAILURE;
}
csync_set_log_level(options.silent ? 1 : 11);
opts = &options;
if( csync_init( _csync_ctx ) < 0 ) {
qFatal("Could not initialize csync!");
return EXIT_FAILURE;
}
// ignore hidden files or not
_csync_ctx->ignore_hidden_files = options.ignoreHiddenFiles;
if( !options.proxy.isNull() ) {
QString host;
int port = 0;
@@ -431,18 +415,6 @@ restart_sync:
}
}
// Exclude lists
QString systemExcludeListFn = ConfigFile::excludeFileFromSystem();
int loadedSystemExcludeList = false;
if (!systemExcludeListFn.isEmpty()) {
loadedSystemExcludeList = csync_add_exclude_list(_csync_ctx, systemExcludeListFn.toLocal8Bit());
}
int loadedUserExcludeList = false;
if (!options.exclude.isEmpty()) {
loadedUserExcludeList = csync_add_exclude_list(_csync_ctx, options.exclude.toLocal8Bit());
}
QStringList selectiveSyncList;
if (!options.unsyncedfolders.isEmpty()) {
QFile f(options.unsyncedfolders);
@@ -460,30 +432,32 @@ restart_sync:
}
}
if (loadedSystemExcludeList != 0 && loadedUserExcludeList != 0) {
// Always make sure at least one list has been loaded
qFatal("Cannot load system exclude list or list supplied via --exclude");
return EXIT_FAILURE;
}
Cmd cmd;
SyncJournalDb db(options.source_dir);
if (!selectiveSyncList.empty()) {
selectiveSyncFixup(&db, selectiveSyncList);
}
SyncEngine engine(account, _csync_ctx, options.source_dir, QUrl(options.target_url).path(), folder, &db);
SyncEngine engine(account, options.source_dir, QUrl(options.target_url), folder, &db);
engine.setIgnoreHiddenFiles(options.ignoreHiddenFiles);
QObject::connect(&engine, SIGNAL(finished(bool)), &app, SLOT(quit()));
QObject::connect(&engine, SIGNAL(transmissionProgress(ProgressInfo)), &cmd, SLOT(transmissionProgressSlot()));
// Exclude lists
engine.excludedFiles().addExcludeFilePath(ConfigFile::excludeFileFromSystem());
if( QFile::exists(options.exclude) )
engine.excludedFiles().addExcludeFilePath(options.exclude);
if (!engine.excludedFiles().reloadExcludes()) {
// Always make sure at least one list has been loaded
qFatal("Cannot load system exclude list or list supplied via --exclude");
return EXIT_FAILURE;
}
// Have to be done async, else, an error before exec() does not terminate the event loop.
QMetaObject::invokeMethod(&engine, "startSync", Qt::QueuedConnection);
app.exec();
csync_destroy(_csync_ctx);
if (engine.isAnotherSyncNeeded()) {
if (restartCount < options.restartTimes) {
restartCount++;
+30 -16
Ver Arquivo
@@ -16,6 +16,10 @@
#include <QFile>
#include <QTextStream>
#include <qtokenizer.h>
#include <QDebug>
#include "netrcparser.h"
namespace OCC {
@@ -28,11 +32,11 @@ QString passwordKeyword = QLatin1String("password");
}
NetrcParser::NetrcParser(const QString &fileName)
: _fileName(fileName)
NetrcParser::NetrcParser(const QString &file)
{
if (_fileName.isEmpty()) {
_fileName = QDir::homePath()+QLatin1String("/.netrc");
_netrcLocation = file;
if (_netrcLocation.isEmpty()) {
_netrcLocation = QDir::homePath()+QLatin1String("/.netrc");
}
}
@@ -49,29 +53,39 @@ void NetrcParser::tryAddEntryAndClear(QString& machine, LoginPair& pair, bool& i
bool NetrcParser::parse()
{
QFile netrc(_fileName);
QFile netrc(_netrcLocation);
if (!netrc.open(QIODevice::ReadOnly)) {
return false;
}
QString content = netrc.readAll();
QStringTokenizer tokenizer(content, " \n\t");
tokenizer.setQuoteCharacters("\"'");
QTextStream ts(&netrc);
LoginPair pair;
QString machine;
bool isDefault = false;
while (!ts.atEnd()) {
QString next;
ts >> next;
if (next == defaultKeyword) {
while (tokenizer.hasNext()) {
QString key = tokenizer.next();
if (key == defaultKeyword) {
tryAddEntryAndClear(machine, pair, isDefault);
isDefault = true;
continue; // don't read a value
}
if (next == machineKeyword) {
if (!tokenizer.hasNext()) {
qDebug() << "error fetching value for" << key;
return false;
}
QString value = tokenizer.next();
if (key == machineKeyword) {
tryAddEntryAndClear(machine, pair, isDefault);
ts >> machine;
} else if (next == loginKeyword) {
ts >> pair.first;
} else if (next == passwordKeyword) {
ts >> pair.second;
machine = value;
} else if (key == loginKeyword) {
pair.first = value;
} else if (key == passwordKeyword) {
pair.second = value;
} // ignore unsupported tokens
}
+2 -2
Ver Arquivo
@@ -29,7 +29,7 @@ class NetrcParser
public:
typedef QPair<QString, QString> LoginPair;
NetrcParser(const QString &fileName = QString::null);
NetrcParser(const QString &file = QString());
bool parse();
LoginPair find(const QString &machine);
@@ -37,7 +37,7 @@ private:
void tryAddEntryAndClear(QString &machine, LoginPair &pair, bool &isDefault);
QHash<QString, LoginPair> _entries;
LoginPair _default;
QString _fileName;
QString _netrcLocation;
};
} // namespace OCC
+9 -2
Ver Arquivo
@@ -32,6 +32,7 @@ set(client_UI
owncloudsetuppage.ui
addcertificatedialog.ui
proxyauthdialog.ui
notificationwidget.ui
wizard/owncloudadvancedsetuppage.ui
wizard/owncloudconnectionmethoddialog.ui
wizard/owncloudhttpcredspage.ui
@@ -53,6 +54,7 @@ set(client_SRCS
folderwizard.cpp
generalsettings.cpp
ignorelisteditor.cpp
lockwatcher.cpp
logbrowser.cpp
networksettings.cpp
ocsjob.cpp
@@ -62,6 +64,8 @@ set(client_SRCS
owncloudgui.cpp
owncloudsetupwizard.cpp
protocolwidget.cpp
activitydata.cpp
activitylistmodel.cpp
activitywidget.cpp
activityitemdelegate.cpp
selectivesyncdialog.cpp
@@ -84,11 +88,16 @@ set(client_SRCS
proxyauthhandler.cpp
proxyauthdialog.cpp
synclogdialog.cpp
tooltipupdater.cpp
notificationwidget.cpp
notificationconfirmjob.cpp
servernotificationhandler.cpp
creds/credentialsfactory.cpp
creds/httpcredentialsgui.cpp
creds/shibbolethcredentials.cpp
creds/shibboleth/shibbolethwebview.cpp
creds/shibboleth/shibbolethuserjob.cpp
wizard/postfixlineedit.cpp
wizard/abstractcredswizardpage.cpp
wizard/owncloudadvancedsetuppage.cpp
wizard/owncloudconnectionmethoddialog.cpp
@@ -133,7 +142,6 @@ list(APPEND client_SRCS folderwatcher_mac.cpp)
ENDIF()
set(3rdparty_SRC
../3rdparty/fancylineedit/fancylineedit.cpp
../3rdparty/QProgressIndicator/QProgressIndicator.cpp
../3rdparty/qtlockedfile/qtlockedfile.cpp
../3rdparty/qtsingleapplication/qtlocalpeer.cpp
@@ -157,7 +165,6 @@ else()
endif()
set(3rdparty_INC
${CMAKE_SOURCE_DIR}/src/3rdparty/fancylineedit
${CMAKE_SOURCE_DIR}/src/3rdparty/qjson
${CMAKE_SOURCE_DIR}/src/3rdparty/QProgressIndicator
${CMAKE_SOURCE_DIR}/src/3rdparty/qtlockedfile
+55 -18
Ver Arquivo
@@ -30,6 +30,7 @@ static const char httpUserC[] = "http_user";
static const char caCertsKeyC[] = "CaCertificates";
static const char accountsC[] = "Accounts";
static const char versionC[] = "version";
static const char serverVersionC[] = "serverVersion";
}
@@ -53,9 +54,11 @@ bool AccountManager::restore()
foreach (const auto& accountId, settings->childGroups()) {
settings->beginGroup(accountId);
if (auto acc = load(*settings)) {
if (auto acc = loadAccountHelper(*settings)) {
acc->_id = accountId;
addAccount(acc);
if (auto accState = AccountState::loadFromSettings(acc, *settings)) {
addAccountState(accState);
}
}
settings->endGroup();
}
@@ -110,7 +113,7 @@ bool AccountManager::restoreFromLegacySettings()
// Try to load the single account.
if (!settings->childKeys().isEmpty()) {
if (auto acc = load(*settings)) {
if (auto acc = loadAccountHelper(*settings)) {
if (migratedCreds) {
acc->setMigrated(true);
}
@@ -127,7 +130,8 @@ void AccountManager::save(bool saveCredentials)
settings->setValue(QLatin1String(versionC), 2);
foreach (const auto &acc, _accounts) {
settings->beginGroup(acc->account()->id());
save(acc->account(), *settings, saveCredentials);
saveAccountHelper(acc->account().data(), *settings, saveCredentials);
acc->writeToSettings(*settings);
settings->endGroup();
}
@@ -135,21 +139,34 @@ void AccountManager::save(bool saveCredentials)
qDebug() << "Saved all account settings, status:" << settings->status();
}
void AccountManager::wantsAccountSavedSlot(AccountPtr a)
void AccountManager::saveAccount(Account* a)
{
qDebug() << "Saving account" << a->url().toString();
auto settings = Account::settingsWithGroup(QLatin1String(accountsC));
settings->beginGroup(a->id());
save(a, *settings, false); // don't save credentials they might not have been loaded yet
saveAccountHelper(a, *settings, false); // don't save credentials they might not have been loaded yet
settings->endGroup();
settings->sync();
qDebug() << "Saved account settings, status:" << settings->status();
}
void AccountManager::save(const AccountPtr& acc, QSettings& settings, bool saveCredentials)
void AccountManager::saveAccountState(AccountState* a)
{
qDebug() << "Saving account state" << a->account()->url().toString();
auto settings = Account::settingsWithGroup(QLatin1String(accountsC));
settings->beginGroup(a->account()->id());
a->writeToSettings(*settings);
settings->endGroup();
settings->sync();
qDebug() << "Saved account state settings, status:" << settings->status();
}
void AccountManager::saveAccountHelper(Account* acc, QSettings& settings, bool saveCredentials)
{
settings.setValue(QLatin1String(urlC), acc->_url.toString());
settings.setValue(QLatin1String(serverVersionC), acc->_serverVersion);
if (acc->_credentials) {
if (saveCredentials) {
// Only persist the credentials if the parameter is set, on migration from 1.8.x
@@ -190,22 +207,35 @@ void AccountManager::save(const AccountPtr& acc, QSettings& settings, bool saveC
}
}
AccountPtr AccountManager::load(QSettings& settings)
AccountPtr AccountManager::loadAccountHelper(QSettings& settings)
{
auto acc = createAccount();
acc->setUrl(settings.value(QLatin1String(urlC)).toUrl());
QString authType = settings.value(QLatin1String(authTypeC)).toString();
QString overrideUrl = Theme::instance()->overrideServerUrl();
if( !overrideUrl.isEmpty() ) {
// if there is a overrideUrl, don't even bother reading from the config as all the accounts
// must use the overrideUrl
acc->setUrl(overrideUrl);
auto forceAuth = Theme::instance()->forceConfigAuthType();
if (!forceAuth.isEmpty()) {
authType = forceAuth;
}
} else {
acc->setUrl(settings.value(QLatin1String(urlC)).toUrl());
}
acc->_serverVersion = settings.value(QLatin1String(serverVersionC)).toString();
// We want to only restore settings for that auth type and the user value
acc->_settingsMap.insert(QLatin1String(userC), settings.value(userC));
QString authTypePrefix = settings.value(authTypeC).toString() + "_";
QString authTypePrefix = authType + "_";
Q_FOREACH(QString key, settings.childKeys()) {
if (!key.startsWith(authTypePrefix))
continue;
acc->_settingsMap.insert(key, settings.value(key));
}
acc->setCredentials(CredentialsFactory::create(settings.value(QLatin1String(authTypeC)).toString()));
acc->setCredentials(CredentialsFactory::create(authType));
// now the cert, it is in the general group
settings.beginGroup(QLatin1String("General"));
@@ -233,13 +263,9 @@ AccountState *AccountManager::addAccount(const AccountPtr& newAccount)
}
newAccount->_id = id;
QObject::connect(newAccount.data(), SIGNAL(wantsAccountSaved(AccountPtr)),
this, SLOT(wantsAccountSavedSlot(AccountPtr)));
AccountStatePtr newAccountState(new AccountState(newAccount));
_accounts << newAccountState;
emit accountAdded(newAccountState.data());
return newAccountState.data();
auto newAccountState = new AccountState(newAccount);
addAccountState(newAccountState);
return newAccountState;
}
void AccountManager::deleteAccount(AccountState* account)
@@ -296,4 +322,15 @@ QString AccountManager::generateFreeAccountId() const
}
}
void AccountManager::addAccountState(AccountState* accountState)
{
QObject::connect(accountState->account().data(),
SIGNAL(wantsAccountSaved(Account*)),
SLOT(saveAccount(Account*)));
AccountStatePtr ptr(accountState);
_accounts << ptr;
emit accountAdded(accountState);
}
}
+12 -5
Ver Arquivo
@@ -18,8 +18,6 @@
namespace OCC {
typedef QSharedPointer<AccountState> AccountStatePtr;
/**
@brief The AccountManager class
@ingroup gui
@@ -76,15 +74,24 @@ public:
static AccountPtr createAccount();
private:
void save(const AccountPtr& account, QSettings& settings, bool saveCredentials = true);
AccountPtr load(QSettings& settings);
// saving and loading Account to settings
void saveAccountHelper(Account* account, QSettings& settings, bool saveCredentials = true);
AccountPtr loadAccountHelper(QSettings& settings);
bool restoreFromLegacySettings();
bool isAccountIdAvailable(const QString& id) const;
QString generateFreeAccountId() const;
// Adds an account to the tracked list, emitting accountAdded()
void addAccountState(AccountState* accountState);
public slots:
void wantsAccountSavedSlot(AccountPtr a);
/// Saves account data, not including the credentials
void saveAccount(Account* a);
/// Saves account state data, not including the account
void saveAccountState(AccountState* a);
Q_SIGNALS:
+25 -16
Ver Arquivo
@@ -29,11 +29,13 @@
#include "accountmanager.h"
#include "owncloudsetupwizard.h"
#include "creds/abstractcredentials.h"
#include "tooltipupdater.h"
#include <math.h>
#include <QDebug>
#include <QDesktopServices>
#include <QDir>
#include <QListWidgetItem>
#include <QMessageBox>
#include <QAction>
@@ -87,6 +89,8 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) :
#else
ui->_folderList->setMinimumWidth( 300 );
#endif
new ToolTipUpdater(ui->_folderList);
createAccountToolbox();
connect(AccountManager::instance(), SIGNAL(accountAdded(AccountState*)),
SLOT(slotAccountAdded(AccountState*)));
@@ -193,8 +197,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos)
return;
}
QString alias = _model->data( index, FolderStatusDelegate::FolderAliasRole ).toString();
if (alias.isEmpty()) {
if (_model->classify(index) != FolderStatusModel::RootFolder) {
return;
}
@@ -208,9 +211,11 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos)
QAction *ac = menu->addAction(tr("Open folder"));
connect(ac, SIGNAL(triggered(bool)), this, SLOT(slotOpenCurrentFolder()));
ac = menu->addAction(tr("Choose what to sync"));
ac->setEnabled(folderConnected);
connect(ac, SIGNAL(triggered(bool)), this, SLOT(doExpand()));
if (!ui->_folderList->isExpanded(index)) {
ac = menu->addAction(tr("Choose what to sync"));
ac->setEnabled(folderConnected);
connect(ac, SIGNAL(triggered(bool)), this, SLOT(doExpand()));
}
ac = menu->addAction(folderPaused ? tr("Resume sync") : tr("Pause sync"));
connect(ac, SIGNAL(triggered(bool)), this, SLOT(slotEnableCurrentFolder()));
@@ -271,7 +276,6 @@ void AccountSettings::slotFolderWizardAccepted()
qDebug() << "* Folder wizard completed";
FolderDefinition definition;
definition.alias = folderWizard->field(QLatin1String("alias")).toString();
definition.localPath = FolderDefinition::prepareLocalPath(
folderWizard->field(QLatin1String("sourceFolder")).toString());
definition.targetPath = folderWizard->property("targetPath").toString();
@@ -328,10 +332,13 @@ void AccountSettings::slotRemoveCurrentFolder()
QString alias = _model->data( selected, FolderStatusDelegate::FolderAliasRole ).toString();
qDebug() << "Remove Folder alias " << alias;
if( !alias.isEmpty() ) {
FolderMan *folderMan = FolderMan::instance();
QString shortGuiLocalPath = folderMan->folder(alias)->shortGuiLocalPath();
QMessageBox messageBox(QMessageBox::Question,
tr("Confirm Folder Sync Connection Removal"),
tr("<p>Do you really want to stop syncing the folder <i>%1</i>?</p>"
"<p><b>Note:</b> This will <b>not</b> delete any files.</p>").arg(alias),
"<p><b>Note:</b> This will <b>not</b> delete any files.</p>").arg(shortGuiLocalPath),
QMessageBox::NoButton,
this);
QPushButton* yesButton =
@@ -343,7 +350,6 @@ void AccountSettings::slotRemoveCurrentFolder()
return;
}
FolderMan *folderMan = FolderMan::instance();
folderMan->slotRemoveFolder( folderMan->folder(alias) );
_model->removeRow(row);
@@ -435,8 +441,7 @@ void AccountSettings::slotEnableCurrentFolder()
if ( f->isBusy() && terminate ) {
f->slotTerminateSync();
}
f->setSyncPaused(!currentlyPaused); // toggle the pause setting
folderMan->slotSetFolderPaused( f, !currentlyPaused );
f->setSyncPaused(!currentlyPaused);
// keep state for the icon setting.
if( currentlyPaused ) _wasDisabledBefore = true;
@@ -511,7 +516,11 @@ void AccountSettings::slotAccountStateChanged(int state)
}
if (state == AccountState::Connected) {
showConnectionLabel( tr("Connected to %1.").arg(serverWithUser) );
QStringList errors;
if (account->serverVersionUnsupported()) {
errors << tr("The server version %1 is old and unsupported! Proceed at your own risk.").arg(account->serverVersion());
}
showConnectionLabel( tr("Connected to %1.").arg(serverWithUser), errors );
} else if (state == AccountState::ServiceUnavailable) {
showConnectionLabel( tr("Server %1 is temporarily unavailable.").arg(server) );
} else if (state == AccountState::SignedOut) {
@@ -539,11 +548,10 @@ void AccountSettings::slotAccountStateChanged(int state)
}
/* set the correct label for the Account toolbox button */
if( _accountState ) {
bool isConnected = _accountState->isConnected();
if( isConnected ) {
_toggleSignInOutAction->setText(tr("Log out"));
} else {
if( _accountState->isSignedOut() ) {
_toggleSignInOutAction->setText(tr("Log in"));
} else {
_toggleSignInOutAction->setText(tr("Log out"));
}
}
}
@@ -598,7 +606,8 @@ void AccountSettings::refreshSelectiveSyncStatus()
continue;
}
auto undecidedList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList);
bool ok;
auto undecidedList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok);
QString p;
foreach(const auto &it, undecidedList) {
// FIXME: add the folder alias in a hoover hint.
+17 -2
Ver Arquivo
@@ -46,6 +46,16 @@ AccountState::~AccountState()
{
}
AccountState *AccountState::loadFromSettings(AccountPtr account, QSettings& /*settings*/)
{
auto accountState = new AccountState(account);
return accountState;
}
void AccountState::writeToSettings(QSettings& /*settings*/)
{
}
AccountPtr AccountState::account() const
{
return _account;
@@ -85,6 +95,9 @@ void AccountState::setState(State state)
} else if (oldState == SignedOut && _state == Disconnected) {
checkConnectivity();
}
if (oldState == Connected || _state == Connected) {
emit isConnectedChanged();
}
}
// might not have changed but the underlying _connectionErrors might have
@@ -177,7 +190,8 @@ void AccountState::checkConnectivity()
} else {
// Check the server and then the auth.
#ifdef Q_OS_WIN
// Let's try this for all OS and see if it fixes the Qt issues we have on Linux #4720 #3888 #4051
//#ifdef Q_OS_WIN
// There seems to be a bug in Qt on Windows where QNAM sometimes stops
// working correctly after the computer woke up from sleep. See #2895 #2899
// and #2973.
@@ -188,7 +202,7 @@ void AccountState::checkConnectivity()
// If we don't reset the ssl config a second CheckServerJob can produce a
// ssl config that does not have a sensible certificate chain.
account()->setSslConfiguration(QSslConfiguration());
#endif
//#endif
conValidator->checkServerAndAuth();
}
}
@@ -196,6 +210,7 @@ void AccountState::checkConnectivity()
void AccountState::slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList& errors)
{
if (isSignedOut()) {
qDebug() << "Signed out, ignoring" << connectionStatusString(status) << _account->url().toString();
return;
}
+18 -3
Ver Arquivo
@@ -29,11 +29,13 @@ namespace OCC {
class AccountState;
class Account;
typedef QExplicitlySharedDataPointer<AccountState> AccountStatePtr;
/**
* @brief Extra info about an ownCloud server account.
* @ingroup gui
*/
class AccountState : public QObject {
class AccountState : public QObject, public QSharedData {
Q_OBJECT
public:
enum State {
@@ -64,9 +66,21 @@ public:
typedef ConnectionValidator::Status ConnectionStatus;
/// Use the account as parent
AccountState(AccountPtr account);
explicit AccountState(AccountPtr account);
~AccountState();
/** Creates an account state from settings and an Account object.
*
* Use from AccountManager with a prepared QSettings object only.
*/
static AccountState* loadFromSettings(AccountPtr account, QSettings& settings);
/** Writes account state information to settings.
*
* It does not write the Account data.
*/
void writeToSettings(QSettings& settings);
AccountPtr account() const;
ConnectionStatus connectionStatus() const;
@@ -113,6 +127,7 @@ private:
signals:
void stateChanged(int state);
void isConnectedChanged();
protected Q_SLOTS:
void slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList& errors);
@@ -133,6 +148,6 @@ private:
}
Q_DECLARE_METATYPE(OCC::AccountState*)
Q_DECLARE_METATYPE(QSharedPointer<OCC::AccountState>)
Q_DECLARE_METATYPE(OCC::AccountStatePtr)
#endif //ACCOUNTINFO_H

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais