Comparar commits

..

98 Commits

Autor SHA1 Mensagem Data
Daniel Molkentin 5f3f6011d0 Bump to beta1 2016-01-18 16:26:46 +01:00
Daniel Molkentin 21e3df4f34 Add mac system tray fix as deployed on the build machine
Fixes #3918
2016-01-18 16:18:53 +01:00
Markus Goetz f03f845d04 Changelog for 2.1.1 2016-01-18 13:34:00 +01:00
Jocelyn Turcotte a87727844c shell: Update binaries to fix the Directory Opus warning 2016-01-18 11:37:19 +01:00
Jenkins for ownCloud e88410d07b [tx-robot] updated from transifex 2016-01-18 02:18:25 -05:00
Jenkins for ownCloud 3f704a7a0e [tx-robot] updated from transifex 2016-01-17 02:18:45 -05:00
Jenkins for ownCloud 81204ee0db [tx-robot] updated from transifex 2016-01-16 02:18:48 -05:00
Olivier Goffart d12c0939b9 Upload: Chunk size can be changed in the config file
Added a new "chunkSize" entry in the General group of the owncloud.cfg
which can be set to the size, in bytes, of the chunks.

This allow user with hude bandwidth to select more optimal chunk size

Issue #4354
2016-01-15 13:16:52 +01:00
Klaas Freitag a41fbc0454 csync_private: Fix comment about size of file id buffer 2016-01-15 12:14:46 +01:00
Jenkins for ownCloud 9d6d14d623 [tx-robot] updated from transifex 2016-01-15 02:18:51 -05:00
Jocelyn Turcotte 439eddb523 OS X shell: Don't allow sharing sync roots #3505 2016-01-14 16:25:19 +01:00
Jocelyn Turcotte 7beb6f2234 Windows shell: Remove unneeded Winsock code #4356 2016-01-14 15:02:56 +01:00
Jocelyn Turcotte 19a3a10524 Windows: Fix the progress text being cut but a few pixels
QFontMetrics::boundingRect doesn't return the right size for this
font size for some reason, while it works well if we remove the
smaller point size adjustment for the progress font.

To avoid having to debug the font system in Qt just increase the
existing +2px adjustment to +5px so that it renders fine.
2016-01-14 13:01:18 +01:00
Jenkins for ownCloud 2e5f28d7c1 [tx-robot] updated from transifex 2016-01-14 02:19:05 -05:00
Olivier Goffart bbedeed1c5 SyncEngine: For server older than 8.1, ignore invalid char in new directories
Server older than 8.1 cannot cope with invalid char in the filename
so we must not send them from the client. We were already checking
for new files, but not for renames or new directories.

https://github.com/owncloud/enterprise/issues/1009
2016-01-13 17:53:12 +01:00
Olivier Goffart a18b13d56e FolderDelegate: fix positions and margin
- Fix the margin of the progressbar to let some room for the '...' button

 - Fix the size of the "Add Folder" button
2016-01-13 11:57:15 +01:00
Jocelyn Turcotte 31da3e98c9 Fix the folder option button click
The height adjustment done to place the button in the middle of the
non-error area was only done for rendering. Make sure that we do the
same adjustment when mapping click events as well.

Also replace some wrong occurences of aliasMargin*2 for margin.
2016-01-13 11:44:36 +01:00
Olivier Goffart 272755e1ec ConfigFile: Create the directory when using --confdir and it does not exist
Previously we would fail to start if the directory was not existing.
This was working for relative directory, but it should also work for
absolute ones

https://github.com/owncloud/enterprise/issues/970
2016-01-13 10:31:02 +01:00
Jenkins for ownCloud 580b6e2349 [tx-robot] updated from transifex 2016-01-13 02:19:20 -05:00
Olivier Goffart 9800101748 Sharing: feedback when there is no result while searching for an user #4348 2016-01-12 14:36:13 +01:00
Olivier Goffart 1ed02f6494 Sharing: Display the error from the server when trying to share with users or group 2016-01-12 14:36:13 +01:00
Jocelyn Turcotte bb5c370575 Windows: Update the overlay icon graphics #3105
The bug seems to be in Windows when it upscales an smaller icon for
HiDPI displays. It works fine if we provide a 256x256 size in the
ico files.

Use the new square icons also used on OS X that removes the share badge
and instead has a share icon only for the OK state. This means that we
can also remove 3 icons and release 3 slots in the registry for
overlay icons (only the first few are actually loaded by explorer).

This also adds a script that uses ImageMagick to convert our SVG icons
to Windows ico files. Since ImageMagick seems to have issue doing
proper antialiasing with pixels on the edge of icons, this also
slightly scale the icons to leave 2px on each edge, out of its
logical 128px width.
2016-01-12 11:46:05 +01:00
Jenkins for ownCloud 74b0d2d9f1 [tx-robot] updated from transifex 2016-01-12 02:19:07 -05:00
Jenkins for ownCloud 8c531873a8 [tx-robot] updated from transifex 2016-01-12 01:15:38 -05:00
Markus Goetz 9c9b9f3931 Activities: Fix color when row is selected 2016-01-11 16:52:37 +01:00
Markus Goetz 95615eaca7 Merge pull request #4338 from owncloud/mtimes
add note re mtime syncing
2016-01-11 16:44:56 +01:00
Jocelyn Turcotte 54c2c9ac4e Windows: Fix HiDPI #3414
Use QT_DEVICE_PIXEL_RATIO=auto on Qt<=5.5 to enable automatic
scale factor settings on Windows. Also move the existing
Qt::AA_EnableHighDpiScaling logic to use the equivalent
QT_AUTO_SCREEN_SCALE_FACTOR=1 environment variable just to
keep the 5.5 and >=5.6 code at the same place.
2016-01-11 15:41:08 +01:00
Klaas Freitag ea03f9da13 NSIS: Escape line endings for NSIS correctly.
This is supposed to fix #3519
2016-01-11 15:36:24 +01:00
Jenkins for ownCloud 536fd105ae [tx-robot] updated from transifex 2016-01-11 02:19:09 -05:00
Klaas Freitag d89edc35d2 csync-tests: Added some directory wildcard tests.
This was to verify client issue #1558
2016-01-10 12:04:07 +01:00
Jenkins for ownCloud 4d8f81d802 [tx-robot] updated from transifex 2016-01-10 02:19:07 -05:00
Jenkins for ownCloud ed6f76ca28 [tx-robot] updated from transifex 2016-01-10 01:15:43 -05:00
Jenkins for ownCloud 63bc383dfa [tx-robot] updated from transifex 2016-01-09 02:19:19 -05:00
Markus Goetz 0f658e5ca9 OS X: Don't install legacy Finder plugin on >= 10.10 #3587 (v2) 2016-01-08 17:54:10 +01:00
Jenkins for ownCloud 49824b930d [tx-robot] updated from transifex 2016-01-08 02:19:04 -05:00
Christian Kamm abf5a5ad1e Propagation: Fix dir <-> file changes propagating to server #4302
* Ensure every time a file becomes a directory or the other way around
  the item is flagged as INSTRUCTION_TYPE_CHANGE.
* Delete the badly-typed entity if necessary in the propagation jobs.
2016-01-08 05:38:08 +01:00
Christian Kamm d4b6b5cb1d Propagator: Remove warning when moving out of deleted folder 2016-01-08 05:38:08 +01:00
Jocelyn Turcotte ce6f90397a Fix the rendering of the red error box text
QPainter::drawText uses the top of the font for the y position of its
rect argument, but uses the baseline when using a point argument.

Also use the margin variable that matches the font used instead of
the aliasMargin and make sure that the margin is only added between
the box and the text once.
2016-01-07 18:02:35 +01:00
Olivier Goffart bb6a50be02 SettingsDialog: show "Account" for the tab name for branded client
https://github.com/owncloud/enterprise/issues/863
2016-01-07 17:59:21 +01:00
Jocelyn Turcotte e7e918dafe Only clean the Not Synced list for the current account #3171 2016-01-07 16:14:18 +01:00
Olivier Goffart 81b7798ac2 HttpCredentials::slotAuthentication: fix comment
The recent revert did no fix the comment
2016-01-07 14:58:02 +01:00
Olivier Goffart 868d4c781a HTTP creds: Fix GUI blocking for 5 seconds when entering wrong password
The Qt HTTP thread calls authenticationRequired (indirectly) using a
BlockingQueuedConnection. So when we call invalidateToken from slot
connected to this signal and end up calling QNAM::clearAccessCache which
waits on the thread for 5 seconds

Backtraces:

Qt HTTP thread:
 #0  0x00007ffff20c707f in pthread_cond_wait@@GLIBC_2.3.2 ()
 #1  0x00007ffff43f0c0b in QWaitConditionPrivate::wait
 #2  QWaitCondition::wait
 #3  0x00007ffff43ea06b in QSemaphore::acquire
 #4  0x00007ffff45dcf6f in QMetaObject::activate
[...]
 #9  0x00007ffff45dd607 in QMetaObject::activate
 #10 0x00007ffff4edbaf7 in QHttpNetworkReply::authenticationRequired
 #11 0x00007ffff4e0b2b4 in QHttpNetworkConnectionPrivate::handleAuthenticateChallenge
 #12 0x00007ffff4e10753 in QHttpNetworkConnectionChannel::handleStatus
 #13 0x00007ffff4e11cc9 in QHttpNetworkConnectionChannel::allDone
 #14 0x00007ffff4e14605 in QHttpProtocolHandler::_q_receiveReply

Main Thread:
 #0  0x00007ffff20c7428 in pthread_cond_timedwait@@GLIBC_2.3.2 ()
 #1  0x00007ffff43f0b56 in QWaitConditionPrivate::wait_relative (time=5000, this=0x136c580)
 #2  QWaitConditionPrivate::wait (time=5000, this=0x136c580)
 #3  QWaitCondition::wait (this=this@entry=0x136c788, mutex=mutex@entry=0x136c760, time=time@entry=5000)
 #4  0x00007ffff43efa6e in QThread::wait (this=<optimized out>, time=time@entry=5000)
 #5  0x00007ffff4e1edd3 in QNetworkAccessManagerPrivate::clearCache
 #6  0x00007ffff7b6fb03 in OCC::HttpCredentials::invalidateToken()
 #7  0x000000000057adb4 in OCC::AccountState::slotInvalidCredentials()
 #8  0x000000000057ac76 in OCC::AccountState::slotConnectionValidatorResult(OCC::ConnectionValidator::Status, QStringList const&) ()
 #9  0x00000000005ab45c in OCC::AccountState::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
 #10 0x00007ffff45dcd30 in QMetaObject::activate
 #11 0x00007ffff7b78671 in OCC::ConnectionValidator::connectionResult(OCC::ConnectionValidator::Status, QStringList) ()
 #12 0x00007ffff7ae2514 in OCC::ConnectionValidator::reportResult(OCC::ConnectionValidator::Status) ()
 #13 0x00007ffff7ae39b7 in OCC::ConnectionValidator::slotAuthFailed(QNetworkReply*) ()
 #14 0x00007ffff7b784a9 in OCC::ConnectionValidator::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
 #15 0x00007ffff45dcd30 in QMetaObject::activate
 #16 0x00007ffff7b766dc in OCC::AbstractNetworkJob::networkError(QNetworkReply*)
 #17 0x00007ffff7af9f6e in OCC::AbstractNetworkJob::slotFinished()
 #18 0x00007ffff7b7654d in OCC::AbstractNetworkJob::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
 #20 0x00007ffff45dd607 in QMetaObject::activate
 #21 0x00007ffff4edd143 in QNetworkReply::finished
 #22 0x00007ffff4e3fec7 in QNetworkReplyHttpImplPrivate::finished
 #23 0x00007ffff4e41818 in QNetworkReplyHttpImpl::close
 #24 0x00007ffff7b7047b in OCC::HttpCredentials::slotAuthentication(QNetworkReply*, QAuthenticator*) ()
 #25 0x00007ffff7b79092 in OCC::HttpCredentials::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
 #27 0x00007ffff45dd607 in QMetaObject::activate
 #28 0x00007ffff4e1d6fb in QNetworkAccessManager::authenticationRequired
 #29 0x00007ffff4e1ea07 in QNetworkAccessManagerPrivate::authenticationRequired
 #30 0x00007ffff4e3c784 in QNetworkReplyHttpImplPrivate::httpAuthenticationRequired

Another case of Main Thread:
 #5  0x00007ffff4e1edd3 in QNetworkAccessManagerPrivate::clearCache
 #6  0x00007ffff7b6fb03 in OCC::HttpCredentials::invalidateToken()
 #7  0x000000000057b1e4 in OCC::AccountState::slotInvalidCredentials() ()
 #8  0x00000000005abb8a in OCC::AccountState::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
 #9  0x00007ffff45dcd30 in QMetaObject::activate
 #10 0x00007ffff7b76ed5 in OCC::Account::invalidCredentials() ()
 #11 0x00007ffff7ad55f5 in OCC::Account::handleInvalidCredentials()
 #12 0x00007ffff7afa69a in OCC::AbstractNetworkJob::slotFinished()
 #13 0x00007ffff7b7654d in OCC::AbstractNetworkJob::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
 #15 0x00007ffff45dd607 in QMetaObject::activate
 #16 0x00007ffff4edd143 in QNetworkReply::finished
 #17 0x00007ffff4e3fec7 in QNetworkReplyHttpImplPrivate::finished
 #18 0x00007ffff4e41818 in QNetworkReplyHttpImpl::close
 #19 0x00007ffff7b7047b in OCC::HttpCredentials::slotAuthentication(QNetworkReply*, QAuthenticator*) ()
 #20 0x00007ffff7b79092 in OCC::HttpCredentials::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
 #22 0x00007ffff45dd607 in QMetaObject::activate
 #23 0x00007ffff4e1d6fb in QNetworkAccessManager::authenticationRequired
2016-01-07 14:46:49 +01:00
Christian Kamm 71ad94ddb2 Fix crash when deleting account while sync is running #4337 2016-01-07 13:54:26 +01:00
Olivier Goffart 06ffc44073 Fix RTL languages in sync dialog #4336 2016-01-07 13:37:46 +01:00
Jocelyn Turcotte e9ba7c612e Keep only active entries in the Not Synced list #3171
Now that we have a separate list for files that could not be synced,
we can make sure that it only shows entries for files that are still
not in sync with the server. This allows the user to treat this list
as action items in order to get everything synced, including the
blacklist.

Simply remove the keep-errors logic that was used when the lists were
merged to achieve this result.
2016-01-07 11:37:50 +01:00
Jenkins for ownCloud fd7afa87b7 [tx-robot] updated from transifex 2016-01-07 02:19:23 -05:00
Daniel Molkentin 51a70cee3d Document all owncloudcmd switches in man page/doc
Fixes #4290
2016-01-06 22:33:39 +01:00
Carla Schroder aafab73a82 add note re mtime syncing 2016-01-06 12:45:23 -08:00
Daniel Molkentin e3c1d96519 Update German translation
Changes performed on transifex.

Resolves #4255
2016-01-06 17:03:39 +01:00
Daniel Molkentin 9c7066ac47 Translation cleanups
- Disambiguation
- Remove potentially illigitmate concatenations
2016-01-06 16:50:59 +01:00
Daniel Molkentin cede7ec971 Work around layouting issue for RTL languages
This has been fixed in the meanwhile, but we are still shipping
with Qt 5.4. Also, some Linux Distros will still have older Qt
versions.

Addresses issue #4301
2016-01-06 12:52:58 +01:00
Jocelyn Turcotte 2f355c473a Don't show parent folders in the error list #3796
The error status of children should only be used for the etag logic.
The SocketApi uses a path matching system to do this and the UI should
report errors only for individual involved files/directories.
2016-01-06 12:37:35 +01:00
Jocelyn Turcotte a63ebe0904 Bring back the red box for errors #3796
This use the previous code by resetting the progress to hide
the progress back and then return errors in the FolderErrorMsg
data role of the folder model.

This also remove the unused FolderRemotePath role, remove FolderStatus
in favor of invalidating all roles in dataChanged and make sure
that the SyncRunning role is transfered properly from the SyncResult
to show the warning icon during sync.
2016-01-06 12:37:35 +01:00
Markus Goetz ef9483c82d Revert "HTTP Creds: Do not send the password at every request"
We need this for #4326

This reverts commit ae17f58b80.
2016-01-06 11:50:52 +01:00
Jenkins for ownCloud 10f1ed771a [tx-robot] updated from transifex 2016-01-06 02:19:20 -05:00
Markus Goetz 93e8bbab10 OS X: Don't install legacy Finder plugin on >= 10.10 #3587 2016-01-05 17:43:48 +01:00
Jocelyn Turcotte 62df938465 Rename SyncFileStatus::STATUS_SYNC to STATUS_UPTODATE
Also use STATUS_UPDATED instead to match SyncFileItem::Success in the SocketAPI.
2016-01-05 15:41:15 +01:00
Markus Goetz 634dad033f Debug: Attempt to make log more useful 2016-01-05 15:12:00 +01:00
Jocelyn Turcotte 6e3809528e Fix OK statuses not being broadcasted during a sync #3944
Since the presence of any path in SyncEngine::_syncedItems
would translate in a SYNC status, platforms that don't refresh
all their status cache after an UPDATE_VIEW message like OS X
or Windows would keep displaying that status even after all
files are successfully synchronized.

- Read SyncFileItem::_status to determine the status to display mid-sync
- Match moved paths also to _renameTarget since this might be the
  path to match
- Make sure that PropagateDirectory jobs also set SyncFileItem::_status
  properly
2016-01-05 15:08:26 +01:00
Markus Goetz 60a6b2b0c3 OS X: Also show desktop notifications when app is active 2016-01-05 13:33:05 +01:00
Christian Kamm 2662203fb7 Windows: Fix deleting and replacing of read-only files #4308 2016-01-05 13:15:59 +01:00
Christian Kamm d4edab02b0 Propagator: Deal with directories becoming files #4302
Note, in particular the revised order of directory deletion jobs.
2016-01-05 10:26:41 +01:00
Christian Kamm 5cc4c03b6a Propagator: Deal with files becoming directories #4302
This needed adjustments in reconcile, to mark the item as SYNC
as well as additions to the LocalMkdir job.
2016-01-05 10:26:41 +01:00
Jenkins for ownCloud 5382901859 [tx-robot] updated from transifex 2016-01-05 03:04:45 -05:00
Jocelyn Turcotte 2e7a3f9e37 Fix a missing sync-exclude.lst file not failing the sync
After c3cf6aef7d the invokeMethod calls
should be adjusted to pass the new method arguments.

The result was currently a passing sync with this error message on
the console:
QMetaObject::invokeMethod: No such method OCC::Folder::slotSyncFinished()
2016-01-04 17:01:21 +01:00
Markus Goetz c8b3df6668 OS X: Fix alignment of "Copy" button in protocol #4207 2016-01-04 16:16:15 +01:00
Grigorii Horos 69d9840b89 Dolphin integration: use system icons for labels in KDE
Cherry-picked from https://github.com/owncloud/client/pull/4252
2016-01-04 12:57:24 +01:00
Olivier Goffart 970cdcfdbb SocketAPI: SHARE: Fix the paths when creating the share dialog
The socket api uses native folder separator. We need to use QDir::cleanPath
for anything else so we only work with '/' everywhere else in the code

This fixes the sharing dialog on window.

Issue #4311
2016-01-04 12:06:09 +01:00
Daniel Molkentin 0ef9bd9e23 Remove bearer plugins
Causes regressions due to constant Wifi scanning
2016-01-04 11:54:11 +01:00
Daniel Molkentin 16030a61eb Enable HiDpi scaling with Qt 5.6 2016-01-04 11:50:00 +01:00
Daniel Molkentin 5487fc1f9c Ensure Qt translator does always get loaded. 2016-01-04 11:50:00 +01:00
Jenkins for ownCloud 92677da3e4 [tx-robot] updated from transifex 2016-01-04 02:19:22 -05:00
Jenkins for ownCloud 6d38d4e085 [tx-robot] updated from transifex 2016-01-03 02:19:00 -05:00
Jenkins for ownCloud a16361e823 [tx-robot] updated from transifex 2015-12-31 02:19:14 -05:00
Jenkins for ownCloud 03415b286c [tx-robot] updated from transifex 2015-12-29 02:18:39 -05:00
Jenkins for ownCloud 72a503e93f [tx-robot] updated from transifex 2015-12-28 02:19:02 -05:00
Jenkins for ownCloud 6a6bce4bef [tx-robot] updated from transifex 2015-12-25 02:19:06 -05:00
Jenkins for ownCloud e64833a217 [tx-robot] updated from transifex 2015-12-23 02:19:07 -05:00
Klaas Freitag a759ba1d9e Do not use nullptr, old compilers die on it. 2015-12-22 15:07:51 +01:00
Klaas Freitag 7ed243d3cd Move version to 2.1.1 git. 2015-12-22 11:18:20 +01:00
Klaas Freitag afa8d671be shell integration: Create a plugin for nemo out of the nautilus one. 2015-12-22 11:05:00 +01:00
Klaas Freitag c607707580 Backport of #4245 2015-12-22 10:26:13 +01:00
Olivier Goffart a0b913f65d gui: Word Wrap in QInputDialog (#4197) 2015-12-22 10:08:17 +01:00
Jenkins for ownCloud 271b2f8c5b [tx-robot] updated from transifex 2015-12-22 02:19:06 -05:00
Olivier Goffart cf5b1e401c csync_vio_local_stat: Win: fetch mtime and size if not previously fetched
Since owncloud 2.1, csync_vio_local_stat was optimized because readdir
would already fetch most of the info.  This works for the discovery,
but not later.  And we used this function later for symliks and co.

So this fixes the .lnk on windows

Issue #4300
2015-12-21 14:25:30 +01:00
Olivier Goffart 11174ddf4c PropagateLocalRemove: Make it possible to remove read only files (#4277) 2015-12-21 13:25:10 +01:00
Olivier Goffart 48a0ffdc9e Systray: Use the original name for the rename notification #4295
Otherwise it shows twice as "newname was renamed to newname".
Because _file is set to the new name in PropagateLocalRename::start
2015-12-21 11:06:39 +01:00
Jenkins for ownCloud 3664be1480 [tx-robot] updated from transifex 2015-12-21 02:18:42 -05:00
Jenkins for ownCloud c5cd584b63 [tx-robot] updated from transifex 2015-12-19 02:19:06 -05:00
Jenkins for ownCloud ca1c8a0121 [tx-robot] updated from transifex 2015-12-17 02:19:04 -05:00
Jenkins for ownCloud 3649c90605 [tx-robot] updated from transifex 2015-12-16 02:19:03 -05:00
Jenkins for ownCloud 89cb27f224 [tx-robot] updated from transifex 2015-12-13 02:18:46 -05:00
Jenkins for ownCloud 0d808114b6 [tx-robot] updated from transifex 2015-12-11 02:19:06 -05:00
Christian Kamm 0555c88425 User Sharing: Match user names and case insensitive #4269 2015-12-10 14:56:15 +01:00
Christian Kamm e2d1a5a41d Share UI: Allow typing in a sharee
Previously you *had* to select one of the completion options, even
if the text in the lineedit was identical to one of the options.
2015-12-10 13:49:47 +01:00
Christian Kamm df1b309b36 FolderWatcher: Remove IN_DONT_FOLLOW #3475
This fixes the case of the root folder being symlinked.
2015-12-10 13:05:43 +01:00
Christian Kamm e3b53b7e74 Log: Remove scary messages :) 2015-12-10 11:50:19 +01:00
Christian Kamm d8d9fcf2f4 Silence warning about zorder in .ui file. 2015-12-10 11:10:49 +01:00
148 arquivos alterados com 6760 adições e 5758 exclusões
+3
Ver Arquivo
@@ -10,3 +10,6 @@
[submodule "src/3rdparty/libcrashreporter-qt"]
path = src/3rdparty/libcrashreporter-qt
url = git://github.com/dschmidt/libcrashreporter-qt.git
[submodule "src/3rdparty/qtkeychain"]
path = src/3rdparty/qtkeychain
url = https://github.com/frankosterfeld/qtkeychain.git
+20
Ver Arquivo
@@ -1,5 +1,25 @@
ChangeLog
=========
version 2.1.1 (release 2016-01-2x)
* UI improvements for HiDPI screens, error messages, RTL languages
* Fix occurences of "Connection Closed" when a new unauthenticated TCP socket is used
* Fix undeliberate WiFi scanning done by Qt Network classes
* Several fixes/improvements to the sharing dialog
* Several fixes/improvements to the server activity tab
* Create the directory when using --confdir and it does not exist
* Windows Overlay icons: Fix DLL and icon oddities
* Mac Overlay icons: Don't install legacy Finder plugin on >= 10.10
* Linux Overlay icons: Nemo plugin
* Overlay icons: Fix several wrong icon state computations
* Allow changeable upload chunk size in owncloud.cfg
* Crash fixes on account deletion
* Forget password on explicit sign-out
* Sync Engine: .lnk files
* Sync Engine: symlinked syn directories
* Sync Engine: Windows: Fix deleting and replacing of read-only files (#4308 #4277)
* Sync Engine: Fixes for files becoming directories and vice versa (#4302)
* Misc other fixes/improvements
version 2.1 (release 2015-12-03)
* GUI: Added a display of server activities
* GUI: Added a separate view for not synced items, ignores, errors
+3 -3
Ver Arquivo
@@ -1,10 +1,10 @@
set( MIRALL_VERSION_MAJOR 2 )
set( MIRALL_VERSION_MINOR 2 )
set( MIRALL_VERSION_PATCH 0 )
set( MIRALL_VERSION_MINOR 1 )
set( MIRALL_VERSION_PATCH 1 )
set( MIRALL_SOVERSION 0 )
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
set( MIRALL_VERSION_SUFFIX "git") #e.g. beta1, beta2, rc1
set( MIRALL_VERSION_SUFFIX "beta1") #e.g. beta1, beta2, rc1
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
if( NOT DEFINED MIRALL_VERSION_BUILD )
-2
Ver Arquivo
@@ -38,8 +38,6 @@ QT_PLUGINS = [
'imageformats/libqgif.dylib',
'imageformats/libqico.dylib',
'imageformats/libqjpeg.dylib',
'bearer/libqcorewlanbearer.dylib',
'bearer/libqgenericbearer.dylib',
'imageformats/libqsvg.dylib',
'imageformats/libqmng.dylib',
]
+34
Ver Arquivo
@@ -1115,6 +1115,28 @@
</dict>
<key>PACKAGE_UUID</key>
<string>39F61FCD-6EAA-4F3A-81C6-25E3F667DFB5</string>
<key>REQUIREMENTS</key>
<array>
<dict>
<key>BEHAVIOR</key>
<integer>1</integer>
<key>DICTIONARY</key>
<dict>
<key>IC_REQUIREMENT_JAVASCRIPT_FUNCTION</key>
<string>olderOsx</string>
<key>IC_REQUIREMENT_JAVASCRIPT_PARAMETERS</key>
<array/>
</dict>
<key>IDENTIFIER</key>
<string>fr.whitebox.Packages.requirement.javascript</string>
<key>MESSAGE</key>
<array/>
<key>NAME</key>
<string>JavaScript</string>
<key>STATE</key>
<true/>
</dict>
</array>
<key>TITLE</key>
<array/>
<key>TOOLTIP</key>
@@ -1428,6 +1450,18 @@
<string>@CMAKE_INSTALL_DIR@</string>
</dict>
</dict>
<key>SHARED_GLOBAL_DATA</key>
<dict>
<key>IC_REQUIREMENT_JAVASCRIPT_SHARED_SOURCE_CODE</key>
<string>
function olderOsx() {
if(system.compareVersions(system.version.ProductVersion, '10.10') == -1) {
return true;
}
return false;
}
</string>
</dict>
<key>TYPE</key>
<integer>0</integer>
<key>VERSION</key>
@@ -0,0 +1,39 @@
From cf6881c03d9f08c6ace83defe461423bb87f30d8 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@theqtcompany.com>
Date: Fri, 15 Jan 2016 14:15:51 +0100
Subject: [PATCH] OS X: Ensure system tray icon is prepared even when menu bar
is hidden
On OS X 10.11 (El Capitan) the system menu bar can be automatically
hidden, in which case the menu bar height is reported to be 0 when
using the menuBarHeight API.
This resulted in failing to prepare an image for the system tray
icon item, making the tray item "invisible".
Instead we now use the [[NSStatusBar systemStatusBar] thickness]
API, which returns the correct height regardless of the menu bar
being hidden or not.
Task-number: QTBUG-48960
Change-Id: I208fb8df13754964a6f254cadfbff06dd56c6bab
---
src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
index a3ffb5b..8152c57 100644
--- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
+++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
@@ -198,7 +198,7 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
// current OS X versions is 22 points. Provide some future-proofing
// by deriving the icon height from the menu height.
const int padding = 4;
- const int menuHeight = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
+ const int menuHeight = [[NSStatusBar systemStatusBar] thickness];
const int maxImageHeight = menuHeight - padding;
// Select pixmap based on the device pixel height. Ideally we would use
--
2.6.2.2.g1b5ffa3
+1
Ver Arquivo
@@ -37,6 +37,7 @@ purpose is outlined in each patches' front matter.
* 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:
* 0006-Fix-force-debug-info-with-macx-clang_NOUPSTREAM.patch
+1 -1
Ver Arquivo
@@ -29,7 +29,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}erako Abiarazle
StrCpy $UNINSTALLER_FILE_Detail "Desinstalatzailea idazten"
StrCpy $UNINSTALLER_REGISTRY_Detail "Instalatzaileko Erregistroko Giltzak idazten"
StrCpy $UNINSTALLER_FINISHED_Detail "Bukatuta"
StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.\n$\nJarraitu hala ere (ez da aholkatzen)?"
StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.$\n$\nJarraitu hala ere (ez da aholkatzen)?"
StrCpy $UNINSTALL_ABORT "Desinstalazioak erabiltzaileak bertan behera utzi du"
StrCpy $INIT_NO_QUICK_LAUNCH "Abiarazle Bizkorreko Lasterbidea (E/E)"
StrCpy $INIT_NO_DESKTOP "Mahaigaineko Lasterbidea (dagoena berridazten du)"
+1 -1
Ver Arquivo
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "میانبر اجرای سریع ب
StrCpy $UNINSTALLER_FILE_Detail "نوشتن حذف کننده"
StrCpy $UNINSTALLER_REGISTRY_Detail "در حال نوشتن کلید های رجیستری نصاب"
StrCpy $UNINSTALLER_FINISHED_Detail "اتمام"
StrCpy $UNINSTALL_MESSAGEBOX "به نظر نمی رسد نرم افزار ${APPLICATION_NAME} در '$INSTDIR'.$\n$\nنصب شده باشد.\nآیا می خواهید ادامه دهید ( توصیه نشده است ) ؟"
StrCpy $UNINSTALL_MESSAGEBOX "به نظر نمی رسد نرم افزار ${APPLICATION_NAME} در '$INSTDIR'.$\n$\nنصب شده باشد.$\nآیا می خواهید ادامه دهید ( توصیه نشده است ) ؟"
StrCpy $UNINSTALL_ABORT "عمل حذف توسط کاربر متوقف شد"
StrCpy $INIT_NO_QUICK_LAUNCH "میانبر بازکردن سریع ( N/A )"
StrCpy $INIT_NO_DESKTOP "میانبر دسکتاپ (رونویسی وجود دارد)"
+2 -2
Ver Arquivo
@@ -1,6 +1,6 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näytä julkaisutiedot"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.$\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Pysäytetään sovelluksen ${APPLICATION_EXECUTABLE} prosessit."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Tapettavaa prosessia ei löytynyt!"
StrCpy $PageReinstall_NEW_Field_1 "Vanhempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu. On suositeltavaa että poistat vanhan asennuksen ensin. Valitse mikä toiminto suoritetaan ja napsauta Seuraava jatkaaksesi."
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Pikak
StrCpy $UNINSTALLER_FILE_Detail "Kirjoitetaan poisto-ohjelmaa"
StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjoitetaan asennusohjelman rekisteriavaimia"
StrCpy $UNINSTALLER_FINISHED_Detail "Valmis"
StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.\n\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?"
StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.$\n$\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?"
StrCpy $UNINSTALL_ABORT "Poistaminen keskeytettiin käyttäjän toimesta"
StrCpy $INIT_NO_QUICK_LAUNCH "Pikakäynnistyksen pikakuvake (-)"
StrCpy $INIT_NO_DESKTOP "Työpöydän pikakuvake (korvaa nykyinen)"
+1 -1
Ver Arquivo
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Scorciatoia per ${APPLICATION_NAME}
StrCpy $UNINSTALLER_FILE_Detail "Creazione del programma di disinstallazione"
StrCpy $UNINSTALLER_REGISTRY_Detail "Scrittura delle chiavi di registro del programma di installazione"
StrCpy $UNINSTALLER_FINISHED_Detail "Completato"
StrCpy $UNINSTALL_MESSAGEBOX "Non sembra che ${APPLICATION_NAME} sia installato nella cartella '$INSTDIR'.$\nVuoi continuare comunque (non consigliato)?"
StrCpy $UNINSTALL_MESSAGEBOX "Non sembra che ${APPLICATION_NAME} sia installato nella cartella '$INSTDIR'.$$\nVuoi continuare comunque (non consigliato)?"
StrCpy $UNINSTALL_ABORT "Disinstallazione interrotta dall'utente"
StrCpy $INIT_NO_QUICK_LAUNCH "Scorciatoia dell'avvio veloce (N/D)"
StrCpy $INIT_NO_DESKTOP "Scorciatoia del desktop (sovrascrivi se esistente)"
+2 -2
Ver Arquivo
@@ -3,12 +3,12 @@ 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} の旧バージョンがインストールされています。\n旧バージョンをアンインストールし、最新バージョンをインストールするのをお勧めします。\nオペレーションを選択し、次へをクリックする。"
StrCpy $PageReinstall_NEW_Field_1 "システムに ${APPLICATION_NAME} の旧バージョンがインストールされています。$\n旧バージョンをアンインストールし、最新バージョンをインストールするのをお勧めします。$\nオペレーションを選択し、次へをクリックする。"
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} の最新バージョンがすでにインストールされています。\n旧バージョンのインストールはお勧めしません。旧バージョンのインストールが本当に必要な場合は、まず最新バージョンをアンインストールしてから、旧バージョンをインストールしてください。\nオペレーションを選択し、次へをクリックする。"
StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME} の最新バージョンがすでにインストールされています。$\n旧バージョンのインストールはお勧めしません。旧バージョンのインストールが本当に必要な場合は、まず最新バージョンをアンインストールしてから、旧バージョンをインストールしてください。$\nオペレーションを選択し、次へをクリックする。"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} は、${VERSION} が既にインストールされています。$\n$\n実行したい操作を選択し、次へをクリックする。"
StrCpy $PageReinstall_SAME_Field_2 "追加/再インストールコンポーネント"
StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} をアンインストール"
+2 -2
Ver Arquivo
@@ -3,13 +3,13 @@ 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_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. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
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."
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Uma versão mais recente do ${APPLICATION_NAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão, aconselha-se a desinstalação da versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalada.\nSelecione a operação que deseja realizar e clique em 'Seguinte' para continuar."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalada.$\nSelecione a operação que deseja realizar e clique em 'Seguinte' para continuar."
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
+1 -1
Ver Arquivo
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлык в меню быстро
StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталлятора"
StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра установщика"
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.\nВсе равно продолжить (не рекомендуется)?"
StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.$\nВсе равно продолжить (не рекомендуется)?"
StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем"
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (не доступен)"
StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезапись существующего)"
+1 -1
Ver Arquivo
@@ -1,6 +1,6 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "แสดงบันทึกประจำรุ่น"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "พบว่ากระบวนการ ${APPLICATION_EXECUTABLE} จะต้องหยุดทำงาน\nคุณต้องการติดตั้งเพื่อหยุดการทำงานเหล่านี้ของคุณ?"
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} มีการติดตั้งในระบบของคุณ ขอแนะนำให้คุณถอนการติดตั้งรุ่นปัจจุบันออกก่อน เลือกการดำเนินการที่คุณต้องการที่จะดำเนินการและคลิกถัดไปเพื่อดำเนินการต่อ"
+5 -3
Ver Arquivo
@@ -104,10 +104,12 @@ localeToName = {
def escapeNSIS(st):
return st.replace('\\', r'$\\')\
.replace('\t', r'$\t')\
.replace('\r', r'\r')\
.replace('\n', r'\n')\
.replace('\r', r'$\r')\
.replace('\n', r'$\n')\
.replace('\"', r'$\"')\
.replace('$$\\', '$\\')
.replace('$$\\', '$\\')\
.replace('$\\n', r'$\n')
translationCache = {}
+1 -1
Submodule binary updated: 8b72648a93...71633edc9a
-5
Ver Arquivo
@@ -40,7 +40,6 @@
!define QT_DLL_PATH "${MING_BIN}"
!define ACCESSIBLE_DLL_PATH "${MING_LIB}/qt5/plugins/accessible"
!define SQLITE_DLL_PATH "${MING_LIB}/qt5/plugins/sqldrivers"
!define BEARER_DLL_PATH "${MING_LIB}/qt5/plugins/bearer"
!define IMAGEFORMATS_DLL_PATH "${MING_LIB}/qt5/plugins/imageformats"
!define PLATFORMS_DLL_PATH "${MING_LIB}/qt5/plugins/platforms"
@@ -407,10 +406,6 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
SetOutPath "$INSTDIR\sqldrivers"
File "${SQLITE_DLL_PATH}\qsqlite.dll"
SetOutPath "$INSTDIR\bearer"
File "${BEARER_DLL_PATH}\qgenericbearer.dll"
File "${BEARER_DLL_PATH}\qnativewifibearer.dll"
SetOutPath "$INSTDIR"
;License & release notes.
File "@CPACK_RESOURCE_FILE_LICENSE@"
+4 -1
Ver Arquivo
@@ -134,7 +134,10 @@ enum csync_instructions_e {
CSYNC_INSTRUCTION_IGNORE = 0x00000020, /* The file is ignored (UPDATE|RECONCILE) */
CSYNC_INSTRUCTION_SYNC = 0x00000040, /* The file need to be pushed to the other remote (RECONCILE) */
CSYNC_INSTRUCTION_STAT_ERROR = 0x00000080,
CSYNC_INSTRUCTION_ERROR = 0x00000100
CSYNC_INSTRUCTION_ERROR = 0x00000100,
CSYNC_INSTRUCTION_TYPE_CHANGE = 0x0000200, /* Like NEW, but deletes the old entity first (RECONCILE)
Used when the type of something changes from directory to file
or back. */
};
enum csync_ftw_type_e {
+1 -1
Ver Arquivo
@@ -192,7 +192,7 @@ struct csync_file_stat_s {
char *destpath; /* for renames */
const char *etag;
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width of 21 byte. */
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width in ownCloud. */
char *directDownloadUrl;
char *directDownloadCookies;
char remotePerm[REMOTE_PERM_BUF_SIZE+1];
+7 -1
Ver Arquivo
@@ -283,7 +283,13 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
break;
/* file on the other replica has not been modified */
case CSYNC_INSTRUCTION_NONE:
cur->instruction = CSYNC_INSTRUCTION_SYNC;
if (cur->type != other->type) {
// If the type of the entity changed, it's like NEW, but
// needs to delete the other entity first.
cur->instruction = CSYNC_INSTRUCTION_TYPE_CHANGE;
} else {
cur->instruction = CSYNC_INSTRUCTION_SYNC;
}
break;
case CSYNC_INSTRUCTION_IGNORE:
cur->instruction = CSYNC_INSTRUCTION_IGNORE;
+10
Ver Arquivo
@@ -272,6 +272,11 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
(uint64_t) fs->size, (uint64_t) tmp->size, fs->remotePerm, tmp->remotePerm, tmp->has_ignored_files );
if (ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag)) {
st->instruction = CSYNC_INSTRUCTION_EVAL;
// Preserve the EVAL flag later on if the type has changed.
if (tmp->type != fs->type)
st->child_modified = 1;
goto out;
}
if (ctx->current == LOCAL_REPLICA &&
@@ -296,6 +301,11 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
goto out;
}
}
// Preserve the EVAL flag later on if the type has changed.
if (tmp->type != fs->type)
st->child_modified = 1;
st->instruction = CSYNC_INSTRUCTION_EVAL;
goto out;
}
+1
Ver Arquivo
@@ -55,6 +55,7 @@ static const _instr_code_struct _instr[] =
{ "INSTRUCTION_SYNC", CSYNC_INSTRUCTION_SYNC },
{ "INSTRUCTION_STAT_ERR", CSYNC_INSTRUCTION_STAT_ERROR },
{ "INSTRUCTION_ERROR", CSYNC_INSTRUCTION_ERROR },
{ "INSTRUCTION_TYPE_CHANGE", CSYNC_INSTRUCTION_TYPE_CHANGE },
{ NULL, CSYNC_INSTRUCTION_ERROR }
};
+11
Ver Arquivo
@@ -250,6 +250,17 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
/* printf("Index: %I64i\n", FileIndex.QuadPart); */
buf->inode = FileIndex.QuadPart;
if (!(buf->fields & CSYNC_VIO_FILE_STAT_FIELDS_SIZE)) {
buf->size = (fileInfo.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + fileInfo.nFileSizeLow;
buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE;
}
if (!(buf->fields & CSYNC_VIO_FILE_STAT_FIELDS_MTIME)) {
DWORD rem;
buf->mtime = FileTimeToUnixTime(&fileInfo.ftLastWriteTime, &rem);
/* CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Local File MTime: %llu", (unsigned long long) buf->mtime ); */
buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME;
}
c_free_locale_string(wuri);
CloseHandle(h);
return 0;
@@ -53,6 +53,12 @@ static void setup_init(void **state) {
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "пятницы.*");
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "*/*.out");
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "latex*/*.run.xml");
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "latex/*/*.tex.tmp");
assert_int_equal(rc, 0);
*state = csync;
}
@@ -160,7 +166,21 @@ static void check_csync_excluded(void **state)
rc = csync_excluded(csync, "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);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "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);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "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);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
}
static void check_csync_excluded_traversal(void **state)
+11 -12
Ver Arquivo
@@ -193,26 +193,25 @@ You can download the desktop sync client from the ownCloud `Client Download Page
To build the most up to date version of the client:
1. Clone the latest versions of the client from Git_ as follows::
1. Clone the latest versions of the client from Git_ as follows:
git clone git://github.com/owncloud/client.git
cd client
git submodule init
git submodule update
``git clone git://github.com/owncloud/client.git``
``git submodule init``
``git submodule update``
2. Create the build directory::
2. Create the build directory:
mkdir client-build
cd client-build
``mkdir client-build``
``cd client-build``
3. Configure the client build::
3. Configure the client build:
cmake -DCMAKE_BUILD_TYPE="Debug" ..
``cmake -DCMAKE_BUILD_TYPE="Debug" ../client``
.. note:: You must use absolute paths for the ``include`` and ``library``
..note:: You must use absolute paths for the ``include`` and ``library``
directories.
.. note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
..note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
where ``target`` is a private location, i.e. in parallel to your build
dir by specifying ``../install``.
+5
Ver Arquivo
@@ -116,6 +116,11 @@ button, and re-select the folder tree that you want to sync.
.. figure:: images/client-7.png
:alt: Extra options for sync operations
.. note:: ownCloud does not preserve the mtime (modification time) of
directories, though it does update the mtimes on files. See
`Wrong folder date when syncing
<https://github.com/owncloud/core/issues/7009>`_ for discussion of this.
Adding New Accounts
^^^^^^^^^^^^^^^^^^^
+12
Ver Arquivo
@@ -56,6 +56,18 @@ OPTIONS
``--davpath [path]``
Overrides the WebDAV Path with ``path``
``--exclude [file]``
Exclude list file
``--unsyncedfolders [file]``
File containing the list of unsynced folders (selective sync)
``--max-sync-retries [n]``
Retries maximum n times (defaults to 3)
``-h``
Sync hidden files,do not ignore them
Example
=======
To synchronize the ownCloud directory ``Music`` to the local directory ``media/music``
+20 -11
Ver Arquivo
@@ -19,28 +19,25 @@ the server URL.
Other command line switches supported by ``owncloudcmd`` include the following:
``--user``, ``-u`` ``[user]``
Specify the user's login name.
Use ``user`` as the login name.
``--password``, ``-p`` ``[password]``
Specify the user's password.
Use ``password`` as the password.
``-n``
Use ``netrc (5)`` for login.
Use ``netrc (5)`` for login.
``--non-interactive``
Do not prompt for questions.
Do not prompt for questions.
``--silent``, ``-s``
Inhibits verbose log output.
``--silent``, ``--s``
Inhibits verbose log output.
``--trust``
Trust any SSL certificate, including invalid ones.
Trust any SSL certificate, including invalid ones.
``--httpproxy http://[user@pass:]<server>:<port>``
Uses the specified ``server`` as the HTTP proxy.
``--unsyncedfolders [file]``
File containing list of folders to not sync
Uses ``server`` as HTTP proxy.
``--nonshib``
Uses Non Shibboleth WebDAV Authentication
@@ -48,6 +45,18 @@ Other command line switches supported by ``owncloudcmd`` include the following:
``--davpath [path]``
Overrides the WebDAV Path with ``path``
``--exclude [file]``
Exclude list file
``--unsyncedfolders [file]``
File containing the list of unsynced folders (selective sync)
``--max-sync-retries [n]``
Retries maximum n times (defaults to 3)
``-h``
Sync hidden files,do not ignore them
Credential Handling
~~~~~~~~~~~~~~~~~~~
@@ -21,7 +21,6 @@
{
SyncClientProxy *_syncClientProxy;
NSMutableSet *_registeredDirectories;
NSMutableSet *_requestedUrls;
NSString *_shareMenuTitle;
}
@@ -83,7 +83,25 @@
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu
{
if (_shareMenuTitle) {
FIFinderSyncController *syncController = [FIFinderSyncController defaultController];
NSMutableSet *rootPaths = [[NSMutableSet alloc] init];
[syncController.directoryURLs enumerateObjectsUsingBlock: ^(id obj, BOOL *stop) {
[rootPaths addObject:[obj path]];
}];
// The server doesn't support sharing a root directory so do not show the option in this case.
// It is still possible to get a problematic sharing by selecting both the root and a child,
// but this is so complicated to do and meaningless that it's not worth putting this check
// also in shareMenuAction.
__block BOOL onlyRootsSelected = YES;
[syncController.selectedItemURLs enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
if (![rootPaths member:[obj path]]) {
onlyRootsSelected = NO;
*stop = YES;
}
}];
if (_shareMenuTitle && !onlyRootsSelected) {
NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
[menu addItemWithTitle:_shareMenuTitle action:@selector(shareMenuAction:) keyEquivalent:@"title"];
@@ -64,13 +64,13 @@ private:
return r;
if (status.startsWith("OK"))
r << "ownCloud_ok";
r << "vcs-normal";
if (status.startsWith("SYNC") || status.startsWith("NEW"))
r << "ownCloud_sync";
r << "vcs-update-required";
if (status.startsWith("IGNORE") || status.startsWith("WARN"))
r << "ownCloud_warn";
r << "vcs-locally-modified-unstaged";
if (status.startsWith("ERROR"))
r << "ownCloud_error";
r << "vcs-conflicting";
if (status.contains("+SWM"))
r << "document-share";
@@ -1,32 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<g>
<circle fill="#E0D92D" cx="64" cy="64" r="61.9"/>
<path fill="#8E7409" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
c0,33,26.9,59.9,59.9,59.9c33,0,59.9-26.9,59.9-59.9C123.9,31,97,4.1,64,4.1z"/>
</g>
</g>
<g>
<g>
<g>
<path fill="#FFFFFF" d="M64,107.4c-5.6,0-10.2-4.6-10.2-10.2C53.8,91.6,58.4,87,64,87c5.6,0,10.2,4.6,10.2,10.2
C74.2,102.8,69.6,107.4,64,107.4z M64,81.3c-8.3,0-8.3-7.3-8.3-10.2L52,30.9v-0.1c0-5.6,5.4-10.2,12-10.2c6.6,0,12,4.6,12,10.2
v0.1l-3.7,40.3C72.3,74,72.3,81.3,64,81.3z"/>
</g>
<g>
<path fill="#8E7409" d="M64,21.9c5.9,0,10.7,4,10.7,8.8l-3.7,40.3c0,4.9-1.1,8.8-7,8.8c-5.9,0-6.9-4-6.9-8.8l-3.7-40.3
C53.3,25.9,58.1,21.9,64,21.9 M64,88.3c4.9,0,8.9,4,8.9,8.8c0,4.9-4,8.9-8.9,8.9c-4.9,0-8.9-4-8.9-8.9
C55.1,92.3,59.1,88.3,64,88.3 M64,19.2c-3.5,0-6.8,1.1-9.3,3.2c-2.7,2.2-4.1,5.2-4.1,8.4v0.1l0,0.1l3.7,40.1
c0,2.3,0.2,5.2,1.7,7.6c1.6,2.6,4.3,3.9,8,3.9c3.7,0,6.4-1.3,8-3.9c1.5-2.3,1.7-5.3,1.7-7.6L77.4,31l0-0.1v-0.1
c0-3.2-1.5-6.2-4.1-8.4C70.8,20.3,67.5,19.2,64,19.2L64,19.2z M64,85.6c-6.4,0-11.6,5.2-11.6,11.6c0,6.4,5.2,11.6,11.6,11.6
c6.4,0,11.6-5.2,11.6-11.6C75.6,90.8,70.4,85.6,64,85.6L64,85.6z"/>
</g>
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata29"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs27" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><g
id="g7"><circle
style="fill:#e0d92d"
id="circle9"
r="61.900002"
cy="64"
cx="64" /><path
style="fill:#8e7409"
id="path11"
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z" /></g></g><g
id="g13"><g
id="g15"><g
id="g17"><path
style="fill:#ffffff"
id="path19"
d="m 64,107.4 c -5.6,0 -10.2,-4.6 -10.2,-10.2 0,-5.6 4.6,-10.2 10.2,-10.2 5.6,0 10.2,4.6 10.2,10.2 0,5.6 -4.6,10.2 -10.2,10.2 z M 64,81.3 C 55.7,81.3 55.7,74 55.7,71.1 L 52,30.9 52,30.8 c 0,-5.6 5.4,-10.2 12,-10.2 6.6,0 12,4.6 12,10.2 l 0,0.1 -3.7,40.3 c 0,2.8 0,10.1 -8.3,10.1 z" /></g><g
id="g21"><path
style="fill:#8e7409"
id="path23"
d="m 64,21.9 c 5.9,0 10.7,4 10.7,8.8 L 71,71 c 0,4.9 -1.1,8.8 -7,8.8 -5.9,0 -6.9,-4 -6.9,-8.8 L 53.4,30.7 C 53.3,25.9 58.1,21.9 64,21.9 m 0,66.4 c 4.9,0 8.9,4 8.9,8.8 0,4.9 -4,8.9 -8.9,8.9 -4.9,0 -8.9,-4 -8.9,-8.9 0,-4.8 4,-8.8 8.9,-8.8 m 0,-69.1 c -3.5,0 -6.8,1.1 -9.3,3.2 -2.7,2.2 -4.1,5.2 -4.1,8.4 l 0,0.1 0,0.1 3.7,40.1 c 0,2.3 0.2,5.2 1.7,7.6 1.6,2.6 4.3,3.9 8,3.9 3.7,0 6.4,-1.3 8,-3.9 1.5,-2.3 1.7,-5.3 1.7,-7.6 l 3.7,-40.1 0,-0.1 0,-0.1 c 0,-3.2 -1.5,-6.2 -4.1,-8.4 -2.5,-2.1 -5.8,-3.2 -9.3,-3.2 l 0,0 z m 0,66.4 c -6.4,0 -11.6,5.2 -11.6,11.6 0,6.4 5.2,11.6 11.6,11.6 6.4,0 11.6,-5.2 11.6,-11.6 0,-6.4 -5.2,-11.6 -11.6,-11.6 l 0,0 z" /></g></g></g></g></svg>

Antes

Largura:  |  Altura:  |  Tamanho: 1.7 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 2.4 KiB

+39 -36
Ver Arquivo
@@ -1,36 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<g>
<circle fill="#B23015" cx="64" cy="64" r="61.9"/>
<path fill="#981D05" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
S31,123.9,64,123.9c33,0,59.9-26.9,59.9-59.9S97,4.1,64,4.1z"/>
</g>
</g>
<g>
<g>
<path fill="#FFFFFF" d="M41.8,95.2c-2.4,0-4.4-0.9-6.2-2.6c-1.7-1.7-2.7-3.9-2.8-6.4c-0.1-2.6,0.7-4.8,2.5-6.8L50.8,64L35.4,48.6
c-1.9-1.9-2.7-4-2.5-6.5c0.2-2.3,1.1-4.5,2.7-6.3l0,0l0,0c1.9-1.9,4-2.9,6.3-2.9c0.2,0,0.4,0,0.6,0c2.4,0.2,4.5,1.1,6.4,2.8l0,0
L64,50.7l15.4-15.2c1.8-1.8,3.9-2.7,6.3-2.7c0.1,0,0.1,0,0.2,0c2.4,0.1,4.6,1,6.5,2.8l0,0c1.7,1.7,2.6,3.9,2.6,6.5
c0,2.6-0.9,4.8-2.6,6.6L77.4,64l15.1,15.2c1.7,1.7,2.6,3.9,2.7,6.5c0.1,2.6-0.8,5-2.7,6.9c-1.7,1.7-4,2.6-6.6,2.6
c-2.6,0-4.9-1-6.8-3L64,77.4L48.9,92.6l0,0c-1.7,1.5-3.8,2.4-6.4,2.6C42.3,95.2,42,95.2,41.8,95.2z"/>
</g>
<g>
<path fill="#981D05" d="M41.9,34.1c0.2,0,0.3,0,0.5,0c2,0.2,3.9,1,5.5,2.5l16,16l16.4-16.2c1.5-1.5,3.3-2.3,5.3-2.3
c0.1,0,0.1,0,0.2,0c2.1,0,4,0.8,5.6,2.4c1.5,1.5,2.2,3.3,2.2,5.6c0,2.2-0.7,4.1-2.2,5.7L75.4,64l16,16.2c1.5,1.5,2.3,3.3,2.3,5.6
c0.1,2.3-0.7,4.2-2.3,5.9c-1.5,1.5-3.3,2.2-5.6,2.2c-2.3,0-4.2-0.9-5.9-2.6L64,75.5l-16,16.2c-1.5,1.3-3.3,2.1-5.5,2.2
c-0.2,0-0.4,0-0.6,0c-2,0-3.7-0.7-5.2-2.2c-1.5-1.5-2.3-3.3-2.4-5.5c-0.1-2.2,0.6-4.1,2.2-5.7L52.7,64L36.3,47.6
c-1.6-1.6-2.3-3.4-2.1-5.4c0.2-2.1,0.9-3.9,2.3-5.6C38.3,35,40,34.1,41.9,34.1 M41.9,31.4c-2.6,0-5,1.1-7.2,3.3l-0.1,0.1
l-0.1,0.1c-1.8,2.1-2.8,4.5-3,7.1c-0.2,2.9,0.8,5.5,2.9,7.6L48.9,64L34.4,78.5l0,0l0,0c-2.1,2.2-3.1,4.8-2.9,7.8
c0.2,2.9,1.2,5.3,3.2,7.3c2,2,4.4,3,7.2,3c0.3,0,0.5,0,0.8,0c2.8-0.2,5.2-1.2,7.2-2.9l0.1-0.1l0.1-0.1L64,79.4L78,93.2
c2.2,2.3,4.8,3.4,7.8,3.4c3,0,5.6-1,7.6-3c2.2-2.2,3.3-4.9,3.1-7.9c-0.1-3-1.2-5.5-3.1-7.5L79.3,64l14.1-14.2l0,0l0,0
c2-2.1,3-4.6,3-7.6c0-3-1-5.5-3-7.5l0,0l0,0c-2.2-2-4.7-3.1-7.4-3.2c-0.1,0-0.1,0-0.2,0c-2.8,0-5.2,1-7.3,3.1L64,48.8L49.9,34.7
l0-0.1l-0.1-0.1c-2.1-1.9-4.5-2.9-7.2-3.2C42.4,31.4,42.1,31.4,41.9,31.4L41.9,31.4z"/>
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata27"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs25" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><g
id="g7"><circle
style="fill:#b23015"
id="circle9"
r="61.900002"
cy="64"
cx="64" /><path
style="fill:#981d05"
id="path11"
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z" /></g></g><g
id="g13"><g
id="g15"><path
style="fill:#ffffff"
id="path17"
d="m 41.8,95.2 c -2.4,0 -4.4,-0.9 -6.2,-2.6 -1.7,-1.7 -2.7,-3.9 -2.8,-6.4 -0.1,-2.6 0.7,-4.8 2.5,-6.8 L 50.8,64 35.4,48.6 c -1.9,-1.9 -2.7,-4 -2.5,-6.5 0.2,-2.3 1.1,-4.5 2.7,-6.3 l 0,0 0,0 c 1.9,-1.9 4,-2.9 6.3,-2.9 0.2,0 0.4,0 0.6,0 2.4,0.2 4.5,1.1 6.4,2.8 l 0,0 15.1,15 15.4,-15.2 c 1.8,-1.8 3.9,-2.7 6.3,-2.7 0.1,0 0.1,0 0.2,0 2.4,0.1 4.6,1 6.5,2.8 l 0,0 c 1.7,1.7 2.6,3.9 2.6,6.5 0,2.6 -0.9,4.8 -2.6,6.6 L 77.4,64 92.5,79.2 c 1.7,1.7 2.6,3.9 2.7,6.5 0.1,2.6 -0.8,5 -2.7,6.9 -1.7,1.7 -4,2.6 -6.6,2.6 -2.6,0 -4.9,-1 -6.8,-3 L 64,77.4 48.9,92.6 l 0,0 c -1.7,1.5 -3.8,2.4 -6.4,2.6 -0.2,0 -0.5,0 -0.7,0 z" /></g><g
id="g19"><path
style="fill:#981d05"
id="path21"
d="m 41.9,34.1 c 0.2,0 0.3,0 0.5,0 2,0.2 3.9,1 5.5,2.5 l 16,16 16.4,-16.2 c 1.5,-1.5 3.3,-2.3 5.3,-2.3 0.1,0 0.1,0 0.2,0 2.1,0 4,0.8 5.6,2.4 1.5,1.5 2.2,3.3 2.2,5.6 0,2.2 -0.7,4.1 -2.2,5.7 l -16,16.2 16,16.2 c 1.5,1.5 2.3,3.3 2.3,5.6 0.1,2.3 -0.7,4.2 -2.3,5.9 -1.5,1.5 -3.3,2.2 -5.6,2.2 -2.3,0 -4.2,-0.9 -5.9,-2.6 L 64,75.5 48,91.7 c -1.5,1.3 -3.3,2.1 -5.5,2.2 -0.2,0 -0.4,0 -0.6,0 -2,0 -3.7,-0.7 -5.2,-2.2 -1.5,-1.5 -2.3,-3.3 -2.4,-5.5 -0.1,-2.2 0.6,-4.1 2.2,-5.7 L 52.7,64 36.3,47.6 C 34.7,46 34,44.2 34.2,42.2 c 0.2,-2.1 0.9,-3.9 2.3,-5.6 1.8,-1.6 3.5,-2.5 5.4,-2.5 m 0,-2.7 c -2.6,0 -5,1.1 -7.2,3.3 l -0.1,0.1 -0.1,0.1 c -1.8,2.1 -2.8,4.5 -3,7.1 -0.2,2.9 0.8,5.5 2.9,7.6 L 48.9,64 34.4,78.5 l 0,0 0,0 c -2.1,2.2 -3.1,4.8 -2.9,7.8 0.2,2.9 1.2,5.3 3.2,7.3 2,2 4.4,3 7.2,3 0.3,0 0.5,0 0.8,0 2.8,-0.2 5.2,-1.2 7.2,-2.9 L 50,93.6 50.1,93.5 64,79.4 78,93.2 c 2.2,2.3 4.8,3.4 7.8,3.4 3,0 5.6,-1 7.6,-3 2.2,-2.2 3.3,-4.9 3.1,-7.9 -0.1,-3 -1.2,-5.5 -3.1,-7.5 L 79.3,64 93.4,49.8 l 0,0 0,0 c 2,-2.1 3,-4.6 3,-7.6 0,-3 -1,-5.5 -3,-7.5 l 0,0 0,0 c -2.2,-2 -4.7,-3.1 -7.4,-3.2 -0.1,0 -0.1,0 -0.2,0 -2.8,0 -5.2,1 -7.3,3.1 L 64,48.8 49.9,34.7 l 0,-0.1 -0.1,-0.1 c -2.1,-1.9 -4.5,-2.9 -7.2,-3.2 -0.2,0.1 -0.5,0.1 -0.7,0.1 l 0,0 z" /></g></g></g></svg>

Antes

Largura:  |  Altura:  |  Tamanho: 2.5 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 3.2 KiB

+8
Ver Arquivo
@@ -0,0 +1,8 @@
#!/bin/sh
# Dimensions taken from https://www.apriorit.com/dev-blog/357-shell-extentions-basics-samples-common-problems#_Toc408244375
convert -background transparent attention.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/Warning.ico
convert -background transparent error.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/Error.ico
convert -background transparent ok.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/OK.ico
convert -background transparent shared.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/OK_Shared.ico
convert -background transparent sync.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/Sync.ico
+36 -23
Ver Arquivo
@@ -1,23 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<path fill="#5EB220" d="M64,2.1c34.2,0,61.9,27.7,61.9,61.9S98.2,125.9,64,125.9C29.8,125.9,2.1,98.2,2.1,64S29.8,2.1,64,2.1z"/>
<path fill="#3A9804" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
S31,123.9,64,123.9c33,0,59.9-26.9,59.9-59.9S97,4.1,64,4.1z"/>
</g>
<g>
<g>
<polygon fill="#FFFFFF" points="25.7,76.8 35.9,63.8 53,77.3 87.1,31 100.3,40.7 61.3,93.9 56.2,100.7 "/>
</g>
<g>
<path fill="#3A9804" d="M87.3,32.4L98.9,41l-4.3,5.8L60.4,93.2l-4.4,6l-5.8-4.6L32.8,81.1l-5.7-4.4L36,65.3l5.7,4.4l11.5,9
L83,38.2L87.3,32.4 M86.8,29.5l-1.2,1.7L81.3,37L52.8,75.8L43,68.1l-5.7-4.4l-1.6-1.3L34.4,64l-8.9,11.4L24.3,77l1.6,1.3l5.7,4.4
l17.4,13.6l5.8,4.6l1.7,1.3l1.3-1.7l4.4-6L96.3,48l4.3-5.8l1.2-1.7l-1.7-1.2l-11.6-8.5L86.8,29.5L86.8,29.5z"/>
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata25"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs23" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><path
style="fill:#5eb220"
id="path7"
d="m 64,2.1 c 34.2,0 61.9,27.7 61.9,61.9 0,34.2 -27.7,61.9 -61.9,61.9 C 29.8,125.9 2.1,98.2 2.1,64 2.1,29.8 29.8,2.1 64,2.1 Z" /><path
style="fill:#3a9804"
id="path9"
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z" /></g><g
id="g11"><g
id="g13"><polygon
style="fill:#ffffff"
id="polygon15"
points="35.9,63.8 53,77.3 87.1,31 100.3,40.7 61.3,93.9 56.2,100.7 25.7,76.8 " /></g><g
id="g17"><path
style="fill:#3a9804"
id="path19"
d="M 87.3,32.4 98.9,41 94.6,46.8 60.4,93.2 56,99.2 50.2,94.6 32.8,81.1 27.1,76.7 36,65.3 l 5.7,4.4 11.5,9 L 83,38.2 87.3,32.4 M 86.8,29.5 85.6,31.2 81.3,37 52.8,75.8 43,68.1 37.3,63.7 35.7,62.4 34.4,64 25.5,75.4 24.3,77 l 1.6,1.3 5.7,4.4 17.4,13.6 5.8,4.6 1.7,1.3 1.3,-1.7 4.4,-6 34.1,-46.5 4.3,-5.8 1.2,-1.7 -1.7,-1.2 -11.6,-8.5 -1.7,-1.3 0,0 z" /></g></g></g></svg>

Antes

Largura:  |  Altura:  |  Tamanho: 1.3 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 1.9 KiB

+47 -62
Ver Arquivo
@@ -1,62 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<g>
<g>
<path fill="#5EB220" d="M64,2.1c34.2,0,61.9,27.7,61.9,61.9S98.2,125.9,64,125.9C29.8,125.9,2.1,98.2,2.1,64S29.8,2.1,64,2.1z"
/>
</g>
<g>
<path fill="#3A9804" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
S31,123.9,64,123.9c33,0,59.9-26.9,59.9-59.9S97,4.1,64,4.1z"/>
</g>
</g>
</g>
<g transform="translate(0 -1036.4)">
<g>
<g>
<path fill="#FFFFFF" d="M83.9,1059.9c-7.9,0-14.2,6.4-14.2,14.2c0,0.4,0,0.9,0.1,1.3l-27.4,14c-2.5-2.1-5.7-3.4-9.2-3.4
c-7.9,0-14.2,6.4-14.2,14.2c0,7.9,6.4,14.2,14.2,14.2c3.2,0,6.1-1,8.5-2.8l28.2,14.3c0,0.2-0.1,0.5-0.1,0.8
c0,7.9,6.4,14.2,14.2,14.2c7.8,0,14.2-6.4,14.2-14.2c0-7.9-6.4-14.2-14.2-14.2c-3.7,0-7.1,1.4-9.6,3.7l-27.2-13.9
c0.1-0.7,0.2-1.4,0.2-2.2c0-0.4-0.1-0.8-0.1-1.2l27.5-14c2.5,2.1,5.7,3.4,9.2,3.4c7.9,0,14.2-6.4,14.2-14.2
C98.1,1066.2,91.7,1059.8,83.9,1059.9L83.9,1059.9z"/>
<path fill="#3A9804" d="M83.9,1141.9c-8.4,0-15.2-6.8-15.2-15.1c0-0.1,0-0.2,0-0.2l-27.1-13.8c-2.5,1.7-5.4,2.6-8.5,2.6
c-8.3,0-15.1-6.8-15.1-15.1c0-8.3,6.8-15.1,15.1-15.1c3.4,0,6.7,1.1,9.4,3.2l26.3-13.4c0-0.3,0-0.5,0-0.8
c0-8,6.2-14.6,14.1-15.1l0,0l1-0.1c8.3,0,15.1,6.8,15.1,15.1c0,8.4-6.8,15.2-15.1,15.2c-3.4,0-6.7-1.1-9.3-3.2l-26.4,13.4
c0,0.2,0,0.5,0,0.7c0,0.6-0.1,1.1-0.1,1.7l26.1,13.3c2.7-2.3,6.2-3.5,9.7-3.5c8.3,0,15.1,6.8,15.1,15.2
C99,1135.1,92.2,1141.9,83.9,1141.9z M41.4,1110.6l29.2,14.9l-0.1,0.9c0,0.1,0,0.3,0,0.4c0,7.3,6,13.3,13.3,13.3
c7.3,0,13.3-6,13.3-13.3c0-7.3-6-13.3-13.3-13.3c-3.3,0-6.5,1.2-9,3.5l-0.5,0.4l-28.3-14.5l0.1-0.6c0.1-0.7,0.2-1.4,0.2-2.1
c0-0.3,0-0.5,0-0.8l-0.1-1l28.5-14.5l0.5,0.4c2.4,2,5.5,3.2,8.6,3.2c7.3,0,13.3-6,13.3-13.3c0-7.1-5.6-12.9-12.6-13.3l-0.7,0
c-7.3,0-13.3,6-13.3,13.3c0,0.4,0,0.7,0.1,1.1l0.1,0.6l-0.5,0.4l-28,14.3l-0.5-0.4c-2.4-2-5.5-3.2-8.6-3.2
c-7.3,0-13.3,6-13.3,13.3c0,7.3,6,13.3,13.3,13.3c2.9,0,5.6-0.9,7.9-2.6L41.4,1110.6z"/>
</g>
<g>
<path fill="#FFFFFF" d="M83.9,1141.2c-8,0-14.4-6.5-14.4-14.4c0-0.2,0-0.3,0-0.5c0-0.1,0-0.1,0-0.2l-28-14.2
c-2.4,1.8-5.4,2.7-8.5,2.7c-7.9,0-14.4-6.5-14.4-14.4c0-7.9,6.5-14.4,14.4-14.4c3.4,0,6.7,1.2,9.3,3.4l27.2-13.9l0-0.1
c0-0.4-0.1-0.7-0.1-1.1c0-7.9,6.4-14.3,14.2-14.4l0-0.1h0.2c7.9,0,14.4,6.5,14.4,14.4c0,8-6.5,14.4-14.4,14.4
c-3.4,0-6.6-1.2-9.2-3.3L47.4,1099l0,0.2c0,0.3,0.1,0.6,0.1,0.9c0,0.7-0.1,1.4-0.2,2.1l27,13.8c2.6-2.4,6.1-3.7,9.6-3.7
c7.9,0,14.4,6.5,14.4,14.4C98.3,1134.7,91.8,1141.2,83.9,1141.2z M41.5,1111.4L41.5,1111.4l28.4,14.4l0,0.1c0,0.1,0,0.2,0,0.3
c0,0.2,0,0.3,0,0.5c0,7.7,6.3,14,14.1,14c7.7,0,14-6.3,14-14c0-7.8-6.3-14.1-14-14.1c-3.5,0-6.9,1.3-9.5,3.7l-0.1,0.1l-0.1-0.1
l-27.3-14l0-0.1c0.1-0.7,0.2-1.4,0.2-2.2c0-0.3,0-0.6-0.1-0.9c0-0.1,0-0.2,0-0.3l0-0.1l0.1-0.1l27.6-14l0.1,0.1
c2.5,2.1,5.8,3.3,9.1,3.3c7.7,0,14-6.3,14-14.1c0-7.7-6.2-13.9-13.8-14l0,0.1h-0.2c-7.8,0-14.1,6.3-14.1,14c0,0.4,0,0.7,0.1,1
l0,0.3l-0.1,0.1l-27.5,14l-0.1-0.1c-2.5-2.2-5.8-3.3-9.1-3.3c-7.7,0-14,6.3-14,14c0,7.7,6.3,14,14,14
C36.1,1114.2,39,1113.3,41.5,1111.4L41.5,1111.4z"/>
<path fill="#3A9804" d="M83.9,1142.1c-8.5,0-15.3-6.9-15.3-15.3c0,0,0-0.1,0-0.1l-26.9-13.7c-2.5,1.7-5.5,2.6-8.6,2.6
c-8.4,0-15.3-6.9-15.3-15.3c0-8.4,6.9-15.3,15.3-15.3c3.4,0,6.7,1.1,9.4,3.2l26.1-13.3c0-0.2,0-0.4,0-0.7
c0-8,6.2-14.6,14.1-15.3l0,0l1-0.1c8.6,0,15.5,6.9,15.5,15.3c0,8.5-6.9,15.3-15.3,15.3c-3.4,0-6.7-1.1-9.3-3.2l-26.2,13.3
c0,0.2,0,0.4,0,0.6c0,0.5,0,1-0.1,1.6l25.8,13.2c2.7-2.3,6.2-3.5,9.7-3.5c8.4,0,15.3,6.9,15.3,15.3
C99.2,1135.2,92.3,1142.1,83.9,1142.1z M41.3,1110.4l0.7,0.3l28.8,14.7l-0.1,1.1c0,0.1,0,0.2,0,0.4c0,7.2,5.9,13.1,13.1,13.1
c7.2,0,13.1-5.9,13.1-13.1c0-7.2-5.9-13.1-13.1-13.1c-3.3,0-6.4,1.2-8.8,3.4l-0.5,0.4l-0.6-0.2l-28-14.3l0.1-0.6
c0.1-0.8,0.2-1.5,0.2-2.2c0-0.3,0-0.5,0-0.8l-0.1-1l0.5-0.4l28.2-14.4l0.5,0.4c2.5,2.1,5.5,3.2,8.6,3.2
c7.2,0,13.1-5.9,13.1-13.1c0-6.9-5.5-12.7-12.3-13.1l-0.6,0c-7.5,0-13.4,5.9-13.4,13.1c0,0.3,0,0.7,0.1,1l0.1,1l-0.5,0.3
l-28.2,14.4l-0.5-0.4c-2.4-2.1-5.5-3.2-8.6-3.2c-7.2,0-13.1,5.9-13.1,13.1c0,7.2,5.9,13.1,13.1,13.1c2.9,0,5.6-0.9,7.8-2.5
L41.3,1110.4z"/>
</g>
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="Sync"
x="0px"
y="0px"
viewBox="0 0 128 128"
enable-background="new 0 0 128 128"
xml:space="preserve"><metadata
id="metadata37"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs35" /><g
id="g3362"><g
id="g5"
transform="matrix(0.96875,0,0,0.96875,2,2)"><g
id="g7"><g
id="g9"><path
d="m 64,2.1 c 34.2,0 61.9,27.7 61.9,61.9 0,34.2 -27.7,61.9 -61.9,61.9 C 29.8,125.9 2.1,98.2 2.1,64 2.1,29.8 29.8,2.1 64,2.1 Z"
id="path11"
style="fill:#5eb220" /></g><g
id="g13"><path
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z"
id="path15"
style="fill:#3a9804" /></g></g></g><g
transform="matrix(0.96875,0,0,0.96875,0.50025,-1002.0125)"
id="g17"><g
id="g19"><g
id="g21"><path
d="m 83.9,1059.9 c -7.9,0 -14.2,6.4 -14.2,14.2 0,0.4 0,0.9 0.1,1.3 l -27.4,14 c -2.5,-2.1 -5.7,-3.4 -9.2,-3.4 -7.9,0 -14.2,6.4 -14.2,14.2 0,7.9 6.4,14.2 14.2,14.2 3.2,0 6.1,-1 8.5,-2.8 l 28.2,14.3 c 0,0.2 -0.1,0.5 -0.1,0.8 0,7.9 6.4,14.2 14.2,14.2 7.8,0 14.2,-6.4 14.2,-14.2 0,-7.9 -6.4,-14.2 -14.2,-14.2 -3.7,0 -7.1,1.4 -9.6,3.7 l -27.2,-13.9 c 0.1,-0.7 0.2,-1.4 0.2,-2.2 0,-0.4 -0.1,-0.8 -0.1,-1.2 l 27.5,-14 c 2.5,2.1 5.7,3.4 9.2,3.4 7.9,0 14.2,-6.4 14.2,-14.2 -0.1,-7.9 -6.5,-14.3 -14.3,-14.2 l 0,0 z"
id="path23"
style="fill:#ffffff" /><path
d="m 83.9,1141.9 c -8.4,0 -15.2,-6.8 -15.2,-15.1 0,-0.1 0,-0.2 0,-0.2 l -27.1,-13.8 c -2.5,1.7 -5.4,2.6 -8.5,2.6 -8.3,0 -15.1,-6.8 -15.1,-15.1 0,-8.3 6.8,-15.1 15.1,-15.1 3.4,0 6.7,1.1 9.4,3.2 L 68.8,1075 c 0,-0.3 0,-0.5 0,-0.8 0,-8 6.2,-14.6 14.1,-15.1 l 0,0 1,-0.1 c 8.3,0 15.1,6.8 15.1,15.1 0,8.4 -6.8,15.2 -15.1,15.2 -3.4,0 -6.7,-1.1 -9.3,-3.2 l -26.4,13.4 c 0,0.2 0,0.5 0,0.7 0,0.6 -0.1,1.1 -0.1,1.7 l 26.1,13.3 c 2.7,-2.3 6.2,-3.5 9.7,-3.5 8.3,0 15.1,6.8 15.1,15.2 0,8.2 -6.8,15 -15.1,15 z m -42.5,-31.3 29.2,14.9 -0.1,0.9 c 0,0.1 0,0.3 0,0.4 0,7.3 6,13.3 13.3,13.3 7.3,0 13.3,-6 13.3,-13.3 0,-7.3 -6,-13.3 -13.3,-13.3 -3.3,0 -6.5,1.2 -9,3.5 l -0.5,0.4 -28.3,-14.5 0.1,-0.6 c 0.1,-0.7 0.2,-1.4 0.2,-2.1 0,-0.3 0,-0.5 0,-0.8 l -0.1,-1 28.5,-14.5 0.5,0.4 c 2.4,2 5.5,3.2 8.6,3.2 7.3,0 13.3,-6 13.3,-13.3 0,-7.1 -5.6,-12.9 -12.6,-13.3 l -0.7,0 c -7.3,0 -13.3,6 -13.3,13.3 0,0.4 0,0.7 0.1,1.1 l 0.1,0.6 -0.5,0.4 -28,14.3 -0.5,-0.4 c -2.4,-2 -5.5,-3.2 -8.6,-3.2 -7.3,0 -13.3,6 -13.3,13.3 0,7.3 6,13.3 13.3,13.3 2.9,0 5.6,-0.9 7.9,-2.6 l 0.4,-0.4 z"
id="path25"
style="fill:#3a9804" /></g><g
id="g27"><path
d="m 83.9,1141.2 c -8,0 -14.4,-6.5 -14.4,-14.4 0,-0.2 0,-0.3 0,-0.5 0,-0.1 0,-0.1 0,-0.2 l -28,-14.2 c -2.4,1.8 -5.4,2.7 -8.5,2.7 -7.9,0 -14.4,-6.5 -14.4,-14.4 0,-7.9 6.5,-14.4 14.4,-14.4 3.4,0 6.7,1.2 9.3,3.4 l 27.2,-13.9 0,-0.1 c 0,-0.4 -0.1,-0.7 -0.1,-1.1 0,-7.9 6.4,-14.3 14.2,-14.4 l 0,-0.1 0.2,0 c 7.9,0 14.4,6.5 14.4,14.4 0,8 -6.5,14.4 -14.4,14.4 -3.4,0 -6.6,-1.2 -9.2,-3.3 l -27.2,13.9 0,0.2 c 0,0.3 0.1,0.6 0.1,0.9 0,0.7 -0.1,1.4 -0.2,2.1 l 27,13.8 c 2.6,-2.4 6.1,-3.7 9.6,-3.7 7.9,0 14.4,6.5 14.4,14.4 0,8 -6.5,14.5 -14.4,14.5 z m -42.4,-29.8 0,0 28.4,14.4 0,0.1 c 0,0.1 0,0.2 0,0.3 0,0.2 0,0.3 0,0.5 0,7.7 6.3,14 14.1,14 7.7,0 14,-6.3 14,-14 0,-7.8 -6.3,-14.1 -14,-14.1 -3.5,0 -6.9,1.3 -9.5,3.7 l -0.1,0.1 -0.1,-0.1 -27.3,-14 0,-0.1 c 0.1,-0.7 0.2,-1.4 0.2,-2.2 0,-0.3 0,-0.6 -0.1,-0.9 0,-0.1 0,-0.2 0,-0.3 l 0,-0.1 0.1,-0.1 27.6,-14 0.1,0.1 c 2.5,2.1 5.8,3.3 9.1,3.3 7.7,0 14,-6.3 14,-14.1 0,-7.7 -6.2,-13.9 -13.8,-14 l 0,0.1 -0.2,0 c -7.8,0 -14.1,6.3 -14.1,14 0,0.4 0,0.7 0.1,1 l 0,0.3 -0.1,0.1 -27.5,14 -0.1,-0.1 c -2.5,-2.2 -5.8,-3.3 -9.1,-3.3 -7.7,0 -14,6.3 -14,14 0,7.7 6.3,14 14,14 2.9,0.2 5.8,-0.7 8.3,-2.6 l 0,0 z"
id="path29"
style="fill:#ffffff" /><path
d="m 83.9,1142.1 c -8.5,0 -15.3,-6.9 -15.3,-15.3 0,0 0,-0.1 0,-0.1 L 41.7,1113 c -2.5,1.7 -5.5,2.6 -8.6,2.6 -8.4,0 -15.3,-6.9 -15.3,-15.3 0,-8.4 6.9,-15.3 15.3,-15.3 3.4,0 6.7,1.1 9.4,3.2 l 26.1,-13.3 c 0,-0.2 0,-0.4 0,-0.7 0,-8 6.2,-14.6 14.1,-15.3 l 0,0 1,-0.1 c 8.6,0 15.5,6.9 15.5,15.3 0,8.5 -6.9,15.3 -15.3,15.3 -3.4,0 -6.7,-1.1 -9.3,-3.2 l -26.2,13.3 c 0,0.2 0,0.4 0,0.6 0,0.5 0,1 -0.1,1.6 l 25.8,13.2 c 2.7,-2.3 6.2,-3.5 9.7,-3.5 8.4,0 15.3,6.9 15.3,15.3 0.1,8.5 -6.8,15.4 -15.2,15.4 z m -42.6,-31.7 0.7,0.3 28.8,14.7 -0.1,1.1 c 0,0.1 0,0.2 0,0.4 0,7.2 5.9,13.1 13.1,13.1 7.2,0 13.1,-5.9 13.1,-13.1 0,-7.2 -5.9,-13.1 -13.1,-13.1 -3.3,0 -6.4,1.2 -8.8,3.4 l -0.5,0.4 -0.6,-0.2 -28,-14.3 0.1,-0.6 c 0.1,-0.8 0.2,-1.5 0.2,-2.2 0,-0.3 0,-0.5 0,-0.8 l -0.1,-1 0.5,-0.4 28.2,-14.4 0.5,0.4 c 2.5,2.1 5.5,3.2 8.6,3.2 7.2,0 13.1,-5.9 13.1,-13.1 0,-6.9 -5.5,-12.7 -12.3,-13.1 l -0.6,0 c -7.5,0 -13.4,5.9 -13.4,13.1 0,0.3 0,0.7 0.1,1 l 0.1,1 -0.5,0.3 -28.2,14.4 -0.5,-0.4 c -2.4,-2.1 -5.5,-3.2 -8.6,-3.2 -7.2,0 -13.1,5.9 -13.1,13.1 0,7.2 5.9,13.1 13.1,13.1 2.9,0 5.6,-0.9 7.8,-2.5 l 0.4,-0.6 z"
id="path31"
style="fill:#3a9804" /></g></g></g></g></svg>

Antes

Largura:  |  Altura:  |  Tamanho: 4.6 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 5.5 KiB

+48 -55
Ver Arquivo
@@ -1,55 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<circle fill="#2268AB" cx="64" cy="64" r="61.934"/>
<path fill="#114999" d="M64,128C28.711,128,0,99.289,0,64S28.711,0,64,0s64,28.711,64,64S99.289,128,64,128z M64,4.132
C30.989,4.132,4.132,30.987,4.132,64S30.989,123.868,64,123.868S123.868,97.013,123.868,64S97.011,4.132,64,4.132z"/>
</g>
<g>
<g>
<g>
<path fill="#FFFFFF" d="M85.311,53.564c-3.957-8.111-12.221-13.307-21.264-13.307c-1.375,0-2.764,0.121-4.125,0.364
c-8.236,1.448-15.172,7.237-18.111,15.105l-0.264,0.705l-14.818,2.616l0.346-1.871c2.836-15.363,15.068-27.507,30.436-30.216
c2.164-0.38,4.361-0.575,6.543-0.575c12.025,0,23.222,5.73,30.3,15.411l4.771-6.193l1.889,21.721l0.325,1.479l-0.046,0.004
v0.007l-23.129,4.048L85.311,53.564z"/>
</g>
<g>
<path fill="#114999" d="M64.053,27.711c12.314,0,23.643,6.318,30.25,16.325l3.8-4.938l1.6,18.411
c0.007,0.048,0.025,0.111,0.036,0.159l-0.025,0.003l0.014,0.074l-18.446,3.232l5.568-7.243
c-3.996-8.916-12.936-14.798-22.803-14.798c-1.436,0-2.889,0.125-4.353,0.38c-9.054,1.595-16.114,7.893-19.121,15.948
l-12.197,2.152c2.672-14.457,14.061-26.452,29.368-29.152C59.861,27.891,61.971,27.711,64.053,27.711 M64.053,25.064
c-2.257,0-4.536,0.2-6.768,0.595c-7.957,1.405-15.164,5.177-20.846,10.911c-5.55,5.605-9.239,12.65-10.664,20.368l-0.693,3.745
l3.754-0.661l12.196-2.152l1.49-0.264l0.528-1.415c1.343-3.602,3.6-6.819,6.525-9.307c3.014-2.557,6.668-4.273,10.575-4.962
c1.289-0.225,2.596-0.343,3.896-0.343c8.264,0,15.839,4.602,19.704,11.845l-4.564,5.941l-4.143,5.386l6.697-1.168l18.443-3.232
l1.371-0.24l1.393-0.173l-0.625-2.82l-1.582-18.248l-0.593-6.761l-4.143,5.377l-1.65,2.145
c-3.222-3.998-7.236-7.363-11.775-9.832C76.9,26.702,70.489,25.064,64.053,25.064L64.053,25.064z"/>
</g>
</g>
<g>
<g>
<path fill="#FFFFFF" d="M64.032,101.541c-11.982,0-23.157-5.701-30.254-15.341l-4.825,6.289l-1.918-21.98
c-0.007-0.032-0.011-0.063-0.014-0.087l-0.147-1.245l13.597-2.398l0.018,0.096l9.422-1.653l-7.093,9.234
c3.979,8.048,12.221,13.207,21.211,13.207c1.368,0,2.761-0.12,4.125-0.362c8.154-1.439,15.068-7.148,18.036-14.902l0.268-0.704
l14.857-2.62l-0.361,1.884C99.543,78.37,95.968,85.127,90.618,90.5c-5.475,5.498-12.411,9.121-20.057,10.466
C68.404,101.348,66.207,101.541,64.032,101.541z"/>
</g>
<g>
<path fill="#114999" d="M46.793,67.111l-5.518,7.182c4.021,8.855,12.918,14.691,22.754,14.691c1.432,0,2.89-0.123,4.353-0.384
c8.975-1.581,15.997-7.784,19.043-15.732l12.232-2.159c-2.743,14.366-14.086,26.268-29.325,28.957
c-2.118,0.37-4.221,0.554-6.3,0.554c-12.278,0-23.582-6.291-30.204-16.255l-3.85,5.019l-1.632-18.652
c-0.007-0.025-0.007-0.052-0.011-0.073l11.054-1.948c0.004,0.029,0.018,0.059,0.025,0.095L46.793,67.111 M53.032,63.332
l-6.697,1.173l-4.764,0.834l-0.014-0.093l-2.629,0.463l-11.05,1.948l-2.471,0.432l0.304,2.487
c0.004,0.029,0.007,0.059,0.011,0.095l1.622,18.545l0.589,6.779l4.143-5.398l1.711-2.23c3.225,3.986,7.239,7.329,11.761,9.784
c5.675,3.084,12.068,4.713,18.486,4.713c2.25,0,4.525-0.2,6.761-0.591c7.914-1.398,15.097-5.145,20.765-10.841
c5.535-5.559,9.232-12.555,10.696-20.223l0.718-3.768l-3.775,0.668l-12.232,2.156l-1.475,0.259l-0.536,1.402
c-1.361,3.55-3.618,6.723-6.529,9.173c-2.996,2.522-6.629,4.218-10.503,4.902c-1.29,0.225-2.6,0.343-3.893,0.343
c-8.214,0-15.764-4.564-19.65-11.746l4.511-5.872L53.032,63.332L53.032,63.332z"/>
</g>
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata37"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs35" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><circle
style="fill:#2268ab"
id="circle7"
r="61.933998"
cy="64"
cx="64" /><path
style="fill:#114999"
id="path9"
d="M 64,128 C 28.711,128 0,99.289 0,64 0,28.711 28.711,0 64,0 c 35.289,0 64,28.711 64,64 0,35.289 -28.711,64 -64,64 z M 64,4.132 C 30.989,4.132 4.132,30.987 4.132,64 4.132,97.013 30.989,123.868 64,123.868 97.011,123.868 123.868,97.013 123.868,64 123.868,30.987 97.011,4.132 64,4.132 Z" /></g><g
id="g11"><g
id="g13"><g
id="g15"><path
style="fill:#ffffff"
id="path17"
d="M 85.311,53.564 C 81.354,45.453 73.09,40.257 64.047,40.257 c -1.375,0 -2.764,0.121 -4.125,0.364 -8.236,1.448 -15.172,7.237 -18.111,15.105 l -0.264,0.705 -14.818,2.616 0.346,-1.871 C 29.911,41.813 42.143,29.669 57.511,26.96 c 2.164,-0.38 4.361,-0.575 6.543,-0.575 12.025,0 23.222,5.73 30.3,15.411 l 4.771,-6.193 1.889,21.721 0.325,1.479 -0.046,0.004 0,0.007 -23.129,4.048 7.147,-9.298 z" /></g><g
id="g19"><path
style="fill:#114999"
id="path21"
d="m 64.053,27.711 c 12.314,0 23.643,6.318 30.25,16.325 l 3.8,-4.938 1.6,18.411 c 0.007,0.048 0.025,0.111 0.036,0.159 l -0.025,0.003 0.014,0.074 -18.446,3.232 5.568,-7.243 C 82.854,44.818 73.914,38.936 64.047,38.936 c -1.436,0 -2.889,0.125 -4.353,0.38 -9.054,1.595 -16.114,7.893 -19.121,15.948 l -12.197,2.152 c 2.672,-14.457 14.061,-26.452 29.368,-29.152 2.117,-0.373 4.227,-0.553 6.309,-0.553 m 0,-2.647 c -2.257,0 -4.536,0.2 -6.768,0.595 -7.957,1.405 -15.164,5.177 -20.846,10.911 -5.55,5.605 -9.239,12.65 -10.664,20.368 l -0.693,3.745 3.754,-0.661 12.196,-2.152 1.49,-0.264 0.528,-1.415 c 1.343,-3.602 3.6,-6.819 6.525,-9.307 3.014,-2.557 6.668,-4.273 10.575,-4.962 1.289,-0.225 2.596,-0.343 3.896,-0.343 8.264,0 15.839,4.602 19.704,11.845 l -4.564,5.941 -4.143,5.386 6.697,-1.168 18.443,-3.232 1.371,-0.24 1.393,-0.173 -0.625,-2.82 -1.582,-18.248 -0.593,-6.761 -4.143,5.377 -1.65,2.145 C 91.132,35.633 87.118,32.268 82.579,29.799 76.9,26.702 70.489,25.064 64.053,25.064 l 0,0 z" /></g></g><g
id="g23"><g
id="g25"><path
style="fill:#ffffff"
id="path27"
d="M 64.032,101.541 C 52.05,101.541 40.875,95.84 33.778,86.2 l -4.825,6.289 -1.918,-21.98 c -0.007,-0.032 -0.011,-0.063 -0.014,-0.087 l -0.147,-1.245 13.597,-2.398 0.018,0.096 9.422,-1.653 -7.093,9.234 c 3.979,8.048 12.221,13.207 21.211,13.207 1.368,0 2.761,-0.12 4.125,-0.362 8.154,-1.439 15.068,-7.148 18.036,-14.902 l 0.268,-0.704 14.857,-2.62 -0.361,1.884 C 99.543,78.37 95.968,85.127 90.618,90.5 c -5.475,5.498 -12.411,9.121 -20.057,10.466 -2.157,0.382 -4.354,0.575 -6.529,0.575 z" /></g><g
id="g29"><path
style="fill:#114999"
id="path31"
d="m 46.793,67.111 -5.518,7.182 c 4.021,8.855 12.918,14.691 22.754,14.691 1.432,0 2.89,-0.123 4.353,-0.384 8.975,-1.581 15.997,-7.784 19.043,-15.732 l 12.232,-2.159 c -2.743,14.366 -14.086,26.268 -29.325,28.957 -2.118,0.37 -4.221,0.554 -6.3,0.554 -12.278,0 -23.582,-6.291 -30.204,-16.255 l -3.85,5.019 -1.632,-18.652 C 28.339,70.307 28.339,70.28 28.335,70.259 l 11.054,-1.948 c 0.004,0.029 0.018,0.059 0.025,0.095 l 7.379,-1.295 m 6.239,-3.779 -6.697,1.173 -4.764,0.834 -0.014,-0.093 -2.629,0.463 -11.05,1.948 -2.471,0.432 0.304,2.487 c 0.004,0.029 0.007,0.059 0.011,0.095 l 1.622,18.545 0.589,6.779 4.143,-5.398 1.711,-2.23 c 3.225,3.986 7.239,7.329 11.761,9.784 5.675,3.084 12.068,4.713 18.486,4.713 2.25,0 4.525,-0.2 6.761,-0.591 7.914,-1.398 15.097,-5.145 20.765,-10.841 5.535,-5.559 9.232,-12.555 10.696,-20.223 l 0.718,-3.768 -3.775,0.668 -12.232,2.156 -1.475,0.259 -0.536,1.402 c -1.361,3.55 -3.618,6.723 -6.529,9.173 -2.996,2.522 -6.629,4.218 -10.503,4.902 -1.29,0.225 -2.6,0.343 -3.893,0.343 -8.214,0 -15.764,-4.564 -19.65,-11.746 l 4.511,-5.872 4.14,-5.394 0,0 z" /></g></g></g></g></svg>

Antes

Largura:  |  Altura:  |  Tamanho: 3.8 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 4.6 KiB

+13 -1
Ver Arquivo
@@ -3,6 +3,7 @@
if( UNIX AND NOT APPLE )
configure_file(syncstate.py syncstate.py COPYONLY)
configure_file(syncstate.py syncstate_nemo.py COPYONLY)
# Call the setupappname.sh script to set the custom app name.
set (cmd "${CMAKE_CURRENT_SOURCE_DIR}/setappname.sh")
@@ -10,7 +11,18 @@ if( UNIX AND NOT APPLE )
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
install(FILES syncstate.py DESTINATION ${DATADIR}/nautilus-python/extensions)
# Create a nemo plugin script from the nautilus one.
# nemocmd copies the syncstate.py and performs string replacement.
set (nemocmd "${CMAKE_CURRENT_SOURCE_DIR}/createnemoplugin.sh")
execute_process(COMMAND ${nemocmd}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate.py DESTINATION ${DATADIR}/nautilus-python/extensions)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_nemo.py DESTINATION ${DATADIR}/nemo-python/extensions RENAME syncstate.py)
endif()
@@ -60,10 +60,6 @@ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_Error); }
hResult = CLSIDFromString(OVERLAY_GUID_ERROR_SHARED, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_ErrorShared); }
hResult = CLSIDFromString(OVERLAY_GUID_OK, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_OK); }
@@ -76,18 +72,10 @@ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_Sync); }
hResult = CLSIDFromString(OVERLAY_GUID_SYNC_SHARED, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_SyncShared); }
hResult = CLSIDFromString(OVERLAY_GUID_WARNING, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_Warning); }
hResult = CLSIDFromString(OVERLAY_GUID_WARNING_SHARED, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_WarningShared); }
return CLASS_E_CLASSNOTAVAILABLE;
}
@@ -133,19 +121,13 @@ HRESULT _stdcall DllRegisterServer(void)
hResult = RegisterCLSID(OVERLAY_GUID_ERROR, OVERLAY_NAME_ERROR, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_ERROR_SHARED, OVERLAY_NAME_ERROR_SHARED, 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_SYNC_SHARED, OVERLAY_NAME_SYNC_SHARED,szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_WARNING, OVERLAY_NAME_WARNING, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_WARNING_SHARED, OVERLAY_NAME_WARNING_SHARED, szModule);
return hResult;
}
@@ -187,19 +169,13 @@ STDAPI DllUnregisterServer(void)
hResult = UnregisterCLSID(OVERLAY_GUID_ERROR, OVERLAY_NAME_ERROR);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_ERROR_SHARED, OVERLAY_NAME_ERROR_SHARED);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_OK, OVERLAY_NAME_OK);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_OK_SHARED, OVERLAY_NAME_OK_SHARED);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_SYNC, OVERLAY_NAME_SYNC);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_SYNC_SHARED, OVERLAY_NAME_SYNC_SHARED);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_WARNING, OVERLAY_NAME_WARNING);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_WARNING_SHARED, OVERLAY_NAME_WARNING_SHARED);
return hResult;
}
@@ -115,18 +115,12 @@ IFACEMETHODIMP OCOverlay::GetPriority(int *pPriority)
*pPriority = 1;
case State_Warning:
*pPriority = 2;
case State_WarningShared:
*pPriority = 3;
case State_Sync:
*pPriority = 4;
case State_SyncShared:
*pPriority = 5;
*pPriority = 3;
case State_Error:
*pPriority = 6;
case State_ErrorShared:
*pPriority = 7;
*pPriority = 4;
default:
*pPriority = 8;
*pPriority = 5;
}
return S_OK;
Arquivo binário não exibido.
@@ -18,10 +18,10 @@
#pragma once
enum State {
State_Error = 0, State_ErrorShared,
State_Error = 0,
State_OK, State_OKShared,
State_Sync, State_SyncShared,
State_Warning, State_WarningShared
State_Sync,
State_Warning
};
class OCOverlayFactory : public IClassFactory
@@ -184,22 +184,11 @@
<ResourceCompile Include="OCOverlay.rc" />
</ItemGroup>
<ItemGroup>
<Image Include="Error.ico" />
<Image Include="Error_Shared.ico" />
<Image Include="ico\Error.ico" />
<Image Include="ico\Error_Shared.ico" />
<Image Include="ico\OK.ico" />
<Image Include="ico\OK_Shared.ico" />
<Image Include="ico\Sync.ico" />
<Image Include="ico\Sync_Shared.ico" />
<Image Include="ico\Warning.ico" />
<Image Include="ico\Warning_Shared.ico" />
<Image Include="OK.ico" />
<Image Include="OK_Shared.ico" />
<Image Include="Sync.ico" />
<Image Include="Sync_Shared.ico" />
<Image Include="Warning.ico" />
<Image Include="Warning_Shared.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
@@ -14,25 +14,19 @@
#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"
Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 27 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 26 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 29 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 31 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 25 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 30 KiB

@@ -18,9 +18,6 @@
#include "UtilConstants.h"
#include "StringUtil.h"
#include <WinSock2.h>
#include <Ws2def.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <array>
@@ -45,7 +42,6 @@ CommunicationSocket::~CommunicationSocket()
bool CommunicationSocket::Close()
{
WSACleanup();
if (_pipe == INVALID_HANDLE_VALUE) {
return false;
}
+1 -1
Ver Arquivo
@@ -143,7 +143,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
@@ -225,7 +225,7 @@ RemotePathChecker::FileState RemotePathChecker::_StrToFileState(const std::wstri
} else if (str == L"SYNC" || str == L"NEW") {
return StateSync;
} else if (str == L"SYNC+SWM" || str == L"NEW+SWM") {
return StateSyncSWM;
return StateSync;
} else if (str == L"OK") {
return StateOk;
} else if (str == L"OK+SWM") {
@@ -233,11 +233,11 @@ RemotePathChecker::FileState RemotePathChecker::_StrToFileState(const std::wstri
} else if (str == L"IGNORE") {
return StateWarning;
} else if (str == L"IGNORE+SWM") {
return StateWarningSWM;
return StateWarning;
} else if (str == L"ERROR") {
return StateError;
} else if (str == L"ERROR+SWM") {
return StateErrorSWM;
return StateError;
}
return StateNone;
@@ -29,10 +29,10 @@ class __declspec(dllexport) RemotePathChecker {
public:
enum FileState {
// Order synced with OCOverlay
StateError = 0, StateErrorSWM,
StateError = 0,
StateOk, StateOkSWM,
StateSync, StateSyncSWM,
StateWarning, StateWarningSWM,
StateSync,
StateWarning,
StateNone
};
RemotePathChecker();
externo Submódulo
+1
Submodule src/3rdparty/qtkeychain added at 08be0593e1
-1
Ver Arquivo
@@ -45,7 +45,6 @@ set(client_SRCS
accountmanager.cpp
accountsettings.cpp
application.cpp
avatarjob.cpp
folder.cpp
folderman.cpp
folderstatusmodel.cpp
+31 -1
Ver Arquivo
@@ -103,6 +103,11 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) :
connect(_model, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(refreshSelectiveSyncStatus()));
QAction *resetFolderAction = new QAction(this);
resetFolderAction->setShortcut(QKeySequence(Qt::Key_F5));
connect(resetFolderAction, SIGNAL(triggered()), SLOT(slotResetCurrentFolder()));
addAction(resetFolderAction);
QAction *syncNowAction = new QAction(this);
syncNowAction->setShortcut(QKeySequence(Qt::Key_F6));
connect(syncNowAction, SIGNAL(triggered()), SLOT(slotSyncCurrentFolderNow()));
@@ -237,7 +242,7 @@ void AccountSettings::slotFolderListClicked(const QModelIndex& indx)
// tries to find if we clicked on the '...' button.
QTreeView *tv = ui->_folderList;
auto pos = tv->mapFromGlobal(QCursor::pos());
if (FolderStatusDelegate::optionsButtonRect(tv->visualRect(indx)).contains(pos)) {
if (FolderStatusDelegate::optionsButtonRect(tv->visualRect(indx), layoutDirection()).contains(pos)) {
slotCustomContextMenuRequested(pos);
return;
}
@@ -354,6 +359,31 @@ void AccountSettings::slotRemoveCurrentFolder()
}
}
void AccountSettings::slotResetCurrentFolder()
{
QModelIndex selected = ui->_folderList->selectionModel()->currentIndex();
if( selected.isValid() ) {
QString alias = _model->data( selected, FolderStatusDelegate::FolderAliasRole ).toString();
if (alias.isEmpty())
return;
int ret = QMessageBox::question( 0, tr("Confirm Folder Reset"),
tr("<p>Do you really want to reset folder <i>%1</i> and rebuild your client database?</p>"
"<p><b>Note:</b> This function is designed for maintenance purposes only. "
"No files will be removed, but this can cause significant data traffic and "
"take several minutes or hours to complete, depending on the size of the folder. "
"Only use this option if advised by your administrator.</p>").arg(alias),
QMessageBox::Yes|QMessageBox::No );
if( ret == QMessageBox::Yes ) {
FolderMan *folderMan = FolderMan::instance();
if(Folder *f = folderMan->folder(alias)) {
f->slotTerminateSync();
f->wipe();
}
folderMan->slotScheduleAllFolders();
}
}
}
void AccountSettings::slotOpenCurrentFolder()
{
QModelIndex selected = ui->_folderList->selectionModel()->currentIndex();
+1
Ver Arquivo
@@ -72,6 +72,7 @@ protected slots:
void slotEnableCurrentFolder();
void slotSyncCurrentFolderNow();
void slotRemoveCurrentFolder();
void slotResetCurrentFolder();
void slotOpenCurrentFolder();
void slotFolderWizardAccepted();
void slotFolderWizardRejected();
-1
Ver Arquivo
@@ -45,7 +45,6 @@ AccountState::AccountState(AccountPtr account)
AccountState::~AccountState()
{
qDebug() << "Account state for account" << account()->displayName() << "deleted";
}
AccountPtr AccountState::account() const
+15 -4
Ver Arquivo
@@ -122,6 +122,16 @@ void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
pm = userIcon.pixmap(iconWidth, iconHeight, QIcon::Normal);
painter->drawPixmap(QPoint(userIconRect.left(), userIconRect.top()), pm);
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
? QPalette::Normal : QPalette::Disabled;
if (cg == QPalette::Normal && !(option.state & QStyle::State_Active))
cg = QPalette::Inactive;
if (option.state & QStyle::State_Selected) {
painter->setPen(option.palette.color(cg, QPalette::HighlightedText));
} else {
painter->setPen(option.palette.color(cg, QPalette::Text));
}
const QString elidedAction = fm.elidedText(actionText, Qt::ElideRight, actionTextBox.width());
painter->drawText(actionTextBox, elidedAction);
@@ -130,12 +140,13 @@ void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
accountRole.remove(0, atPos+1);
}
QString timeStr = tr("%1 on %2").arg(timeText).arg(accountRole);
if( !accountOnline ) {
QString timeStr;
if ( accountOnline ) {
timeStr = tr("%1 on %2").arg(timeText).arg(accountRole);
} else {
timeStr = tr("%1 on %2 (disconnected)").arg(timeText).arg(accountRole);
QPalette p = option.palette;
painter->setPen(p.color(QPalette::Disabled, QPalette::Text));
timeStr.append(" ");
timeStr.append(tr("(disconnected)"));
}
const QString elidedTime = fm.elidedText(timeStr, Qt::ElideRight, timeBox.width());
+5 -5
Ver Arquivo
@@ -442,24 +442,24 @@ void ActivitySettings::slotCopyToClipboard()
QTextStream ts(&text);
int idx = _tab->currentIndex();
QString theSubject;
QString message;
if( idx == 0 ) {
// the activity widget
_activityWidget->storeActivityList(ts);
theSubject = tr("server activity list");
message = tr("The server activity list has been copied to the clipboard.");
} else if(idx == 1 ) {
// the protocol widget
_protocolWidget->storeSyncActivity(ts);
theSubject = tr("sync activity list");
message = tr("The sync activity list has been copied to the clipboard.");
} else if(idx == 2 ) {
// issues Widget
theSubject = tr("not syned items list");
message = tr("The list of unsynched items has been copied to the clipboard.");
_protocolWidget->storeSyncIssues(ts);
}
QApplication::clipboard()->setText(text);
emit guiLog(tr("Copied to clipboard"), tr("The %1 has been copied to the clipboard.").arg(theSubject));
emit guiLog(tr("Copied to clipboard"), message);
}
void ActivitySettings::slotRemoveAccount( AccountState *ptr )
+11 -1
Ver Arquivo
@@ -113,6 +113,7 @@ Application::Application(int &argc, char **argv) :
#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
setAttribute(Qt::AA_UseHighDpiPixmaps, true);
#endif
parseOptions(arguments());
//no need to waste time;
if ( _helpOnly || _versionOnly ) return;
@@ -165,6 +166,9 @@ Application::Application(int &argc, char **argv) :
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
}
// Enable word wrapping of QInputDialog (#4197)
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");
connect(AccountManager::instance(), SIGNAL(accountAdded(AccountState*)),
SLOT(slotAccountStateAdded(AccountState*)));
connect(AccountManager::instance(), SIGNAL(accountRemoved(AccountState*)),
@@ -542,7 +546,9 @@ void Application::setupTranslations()
const QString qtBaseTrFile = QLatin1String("qtbase_") + lang;
if (!qtTranslator->load(qtTrFile, qtTrPath)) {
if (!qtTranslator->load(qtTrFile, trPath)) {
qtTranslator->load(qtBaseTrFile, trPath);
if (!qtTranslator->load(qtBaseTrFile, qtTrPath)) {
qtTranslator->load(qtBaseTrFile, trPath);
}
}
}
const QString qtkeychainTrFile = QLatin1String("qtkeychain_") + lang;
@@ -560,6 +566,10 @@ void Application::setupTranslations()
if (property("ui_lang").isNull())
setProperty("ui_lang", "C");
}
// Work around Qt 5 < 5.5.0 regression, see https://bugreports.qt.io/browse/QTBUG-43447
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
setLayoutDirection(QApplication::tr("QT_LAYOUT_DIRECTION") == QLatin1String("RTL") ? Qt::RightToLeft : Qt::LeftToRight);
#endif
}
bool Application::giveHelp()
-53
Ver Arquivo
@@ -1,53 +0,0 @@
/*
* Copyright (C) by Roeland Jago Douma <roeland@famdouma.nl>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "avatarjob.h"
#include "networkjobs.h"
#include "account.h"
#include <QLatin1String>
namespace OCC {
AvatarJob::AvatarJob(const QString &userId, int size, AccountPtr account, QObject* parent)
: AbstractNetworkJob(account, QLatin1String("remote.php/dav/avatars/"), parent)
{
setIgnoreCredentialFailure(true);
//Append <userid>/<size> to the path
setPath(path() + userId + QString("/%1").arg(size));
}
void AvatarJob::start()
{
setReply(getRequest(path()));
setupConnections(reply());
AbstractNetworkJob::start();
}
bool AvatarJob::finished()
{
int statusCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode != 200) {
emit avatarNotAvailable(statusCode);
} else {
QByteArray data = reply()->readAll();
QString mimeType = reply()->header(QNetworkRequest::ContentTypeHeader).toString();
emit avatarReady(data, mimeType);
}
return true;
}
}
-63
Ver Arquivo
@@ -1,63 +0,0 @@
/*
* Copyright (C) by Roeland Jago Douma <roeland@famdouma.nl>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#ifndef AVATARJOB_H
#define AVATARJOB_H
#include "networkjobs.h"
#include "accountfwd.h"
namespace OCC {
/**
* @brief Job to fetch an avatar for a user
* @ingroup gui
*/
class AvatarJob : public AbstractNetworkJob {
Q_OBJECT
public:
/**
* @param userId The user for which to obtain the avatar
* @param size The size of the avatar (square so size*size)
* @param account For which account to obtain the avatar
* @param parent Parent of the object
*/
explicit AvatarJob(const QString& userId, int size, AccountPtr account, QObject* parent = 0);
public slots:
/* Start the job */
void start() Q_DECL_OVERRIDE;
signals:
/**
* Signal that the job is done and returned an avatar
*
* @param reply the content of the reply
* @param the mimetype (set by the server)
*/
void avatarReady(QByteArray reply, QString mimeType);
/**
* Signal that the job is done but the server did not return
* an avatar
*
* @param statusCode The status code returned by the server
*/
void avatarNotAvailable(int statusCode);
private slots:
virtual bool finished() Q_DECL_OVERRIDE;
};
}
#endif // AVATAR_H
+31 -14
Ver Arquivo
@@ -247,7 +247,9 @@ QString Folder::remotePath() const
QUrl Folder::remoteUrl() const
{
Q_ASSERT(_accountState);
if (!_accountState) {
return QUrl("http://deleted-account");
}
return Account::concatUrlPath(_accountState->account()->davUrl(), remotePath());
}
@@ -296,19 +298,22 @@ void Folder::prepareToSync()
void Folder::slotRunEtagJob()
{
qDebug() << "* Trying to check" << alias() << "for changes via ETag check. (time since last sync:" << (_timeSinceLastSyncDone.elapsed() / 1000) << "s)";
qDebug() << "* Trying to check" << remoteUrl().toString() << "for changes via ETag check. (time since last sync:" << (_timeSinceLastSyncDone.elapsed() / 1000) << "s)";
Q_ASSERT(_accountState );
if (!_accountState) {
qDebug() << "Can't run EtagJob, account is deleted";
return;
}
AccountPtr account = _accountState->account();
if (!_requestEtagJob.isNull()) {
qDebug() << Q_FUNC_INFO << alias() << "has ETag job queued, not trying to sync";
qDebug() << Q_FUNC_INFO << remoteUrl().toString() << "has ETag job queued, not trying to sync";
return;
}
if (_definition.paused || !_accountState->isConnected()) {
qDebug() << "Not syncing. :" << alias() << _definition.paused << AccountState::stateString(_accountState->state());
qDebug() << "Not syncing. :" << remoteUrl().toString() << _definition.paused << AccountState::stateString(_accountState->state());
return;
}
@@ -356,12 +361,13 @@ void Folder::slotRunEtagJob()
void Folder::etagRetreived(const QString& etag)
{
qDebug() << "* Compare etag with previous etag: last:" << _lastEtag << ", received:" << etag;
//qDebug() << "* Compare etag with previous etag: last:" << _lastEtag << ", received:" << etag;
// re-enable sync if it was disabled because network was down
FolderMan::instance()->setSyncEnabled(true);
if (_lastEtag != etag) {
qDebug() << "* Compare etag with previous etag: last:" << _lastEtag << ", received:" << etag << "-> CHANGED";
_lastEtag = etag;
emit scheduleToSync(this);
}
@@ -428,6 +434,7 @@ void Folder::bubbleUpSyncResult()
if (!item->hasErrorStatus() && item->_direction == SyncFileItem::Down) {
switch (item->_instruction) {
case CSYNC_INSTRUCTION_NEW:
case CSYNC_INSTRUCTION_TYPE_CHANGE:
newItems++;
if (!firstItemNew)
firstItemNew = item;
@@ -488,7 +495,7 @@ void Folder::bubbleUpSyncResult()
if(renTarget != renSource) {
status.set(SyncFileStatus::STATUS_MOVE);
}
createGuiLog( firstItemRenamed->_file, status, renamedItems, firstItemRenamed->_renameTarget );
createGuiLog( firstItemRenamed->_originalFile, status, renamedItems, firstItemRenamed->_renameTarget );
}
createGuiLog( firstItemError->_file, SyncFileStatus::STATUS_ERROR, errorItems );
@@ -570,7 +577,7 @@ int Folder::slotDiscardDownloadProgress()
foreach (const SyncJournalDb::DownloadInfo & deleted_info, deleted_infos) {
const QString tmppath = folderpath.filePath(deleted_info._tmpfile);
qDebug() << "Deleting temporary file: " << tmppath;
QFile::remove(tmppath);
FileSystem::remove(tmppath);
}
return deleted_infos.size();
}
@@ -702,7 +709,11 @@ bool Folder::estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s)
void Folder::saveToSettings() const
{
Q_ASSERT(_accountState);
if (!_accountState) {
qDebug() << "Can't save folder to settings, account is deleted";
return;
}
auto settings = _accountState->settings();
settings->beginGroup(QLatin1String("Folders"));
FolderDefinition::save(*settings, _definition);
@@ -713,7 +724,10 @@ void Folder::saveToSettings() const
void Folder::removeFromSettings() const
{
Q_ASSERT(_accountState);
if (!_accountState) {
qDebug() << "Can't remove folder from settings, account is deleted";
return;
}
auto settings = _accountState->settings();
settings->beginGroup(QLatin1String("Folders"));
@@ -850,7 +864,10 @@ bool Folder::proxyDirty()
void Folder::startSync(const QStringList &pathList)
{
Q_ASSERT(_accountState);
if (!_accountState) {
qDebug() << "Can't startSync, account is deleted";
return;
}
Q_UNUSED(pathList)
if (!_csync_ctx) {
@@ -860,7 +877,7 @@ void Folder::startSync(const QStringList &pathList)
if (!_csync_ctx) {
qDebug() << Q_FUNC_INFO << "init failed.";
// the error should already be set
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection, Q_ARG(bool, false));
return;
}
} else if (proxyDirty()) {
@@ -882,13 +899,13 @@ void Folder::startSync(const QStringList &pathList)
_syncResult.setSyncFileItemVector(SyncFileItemVector());
emit syncStateChange();
qDebug() << "*** Start syncing " << alias() << " - client version"
qDebug() << "*** Start syncing " << remoteUrl().toString() << " - client version"
<< qPrintable(Theme::instance()->version());
if (! setIgnoredFiles())
{
slotSyncError(tr("Could not read system exclude file"));
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection, Q_ARG(bool, false));
return;
}
+1 -1
Ver Arquivo
@@ -282,7 +282,7 @@ private:
void createGuiLog(const QString& filename, SyncFileStatus status, int count,
const QString& renameTarget = QString::null );
AccountState* _accountState;
QPointer<AccountState> _accountState;
FolderDefinition _definition;
SyncResult _syncResult;
+7 -7
Ver Arquivo
@@ -523,12 +523,12 @@ void FolderMan::slotEtagJobDestroyed(QObject* /*o*/)
void FolderMan::slotRunOneEtagJob()
{
if (_currentEtagJob.isNull()) {
QString alias;
Folder *folder;
foreach(Folder *f, _folderMap) {
if (f->etagJob()) {
// Caveat: always grabs the first folder with a job, but we think this is Ok for now and avoids us having a seperate queue.
_currentEtagJob = f->etagJob();
alias = f->alias();
folder = f;
break;
}
}
@@ -540,7 +540,7 @@ void FolderMan::slotRunOneEtagJob()
restartApplication();
}
} else {
qDebug() << "Scheduling" << alias << "to check remote ETag";
qDebug() << "Scheduling" << folder->remoteUrl().toString() << "to check remote ETag";
_currentEtagJob->start(); // on destroy/end it will continue the queue via slotEtagJobDestroyed
}
}
@@ -657,7 +657,7 @@ void FolderMan::startScheduledSyncSoon(qint64 msMinimumDelay)
void FolderMan::slotStartScheduledFolderSync()
{
if( _currentSyncFolder ) {
qDebug() << "Currently folder " << _currentSyncFolder->alias() << " is running, wait for finish!";
qDebug() << "Currently folder " << _currentSyncFolder->remoteUrl().toString() << " is running, wait for finish!";
return;
}
@@ -672,7 +672,7 @@ void FolderMan::slotStartScheduledFolderSync()
}
// Find the first folder in the queue that can be synced.
Folder* f = nullptr;
Folder* f = 0;
while( !_scheduleQueue.isEmpty() ) {
f = _scheduleQueue.dequeue();
Q_ASSERT(f);
@@ -746,7 +746,7 @@ void FolderMan::slotForwardFolderSyncStateChange()
void FolderMan::slotFolderSyncStarted( )
{
qDebug() << ">===================================== sync started for " << _currentSyncFolder->alias();
qDebug() << ">===================================== sync started for " << _currentSyncFolder->remoteUrl().toString();
}
/*
@@ -757,7 +757,7 @@ void FolderMan::slotFolderSyncStarted( )
*/
void FolderMan::slotFolderSyncFinished( const SyncResult& )
{
qDebug() << "<===================================== sync finished for " << _currentSyncFolder->alias();
qDebug() << "<===================================== sync finished for " << _currentSyncFolder->remoteUrl().toString();
_lastSyncFolder = _currentSyncFolder;
_currentSyncFolder = 0;
+76 -53
Ver Arquivo
@@ -26,6 +26,14 @@
#include <QPainter>
#include <QApplication>
inline static QFont makeAliasFont(const QFont &normalFont)
{
QFont aliasFont = normalFont;
aliasFont.setBold(true);
aliasFont.setPointSize(normalFont.pointSize()+2);
return aliasFont;
}
namespace OCC {
FolderStatusDelegate::FolderStatusDelegate() : QStyledItemDelegate() {
@@ -41,18 +49,15 @@ QString FolderStatusDelegate::addFolderText()
QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem & option ,
const QModelIndex & index) const
{
QFont aliasFont = option.font;
QFont aliasFont = makeAliasFont(option.font);
QFont font = option.font;
aliasFont.setPointSize( font.pointSize() +2 );
QFontMetrics fm(font);
QFontMetrics aliasFm(aliasFont);
int aliasMargin = aliasFm.height()/2;
int margin = fm.height()/4;
auto classif = static_cast<const FolderStatusModel *>(index.model())->classify(index);
if (classif == FolderStatusModel::AddButton) {
int margins = fm.height();
QFontMetrics fm(option.font);
QStyleOptionButton opt;
static_cast<QStyleOption&>(opt) = option;
@@ -60,7 +65,7 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem & option ,
return QApplication::style()->sizeFromContents(
QStyle::CT_PushButton, &opt, fm.size(Qt::TextSingleLine, opt.text)).
expandedTo(QApplication::globalStrut())
+ QSize(0, 2*aliasMargin);
+ QSize(0, margins);
}
if (classif != FolderStatusModel::RootFolder) {
@@ -68,6 +73,22 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem & option ,
}
// calc height
int h = rootFolderHeightWithoutErrors(fm, aliasFm);
// add some space to show an error condition.
if( ! qvariant_cast<QStringList>(index.data(FolderErrorMsg)).isEmpty() ) {
int margin = fm.height()/4;
QStringList errMsgs = qvariant_cast<QStringList>(index.data(FolderErrorMsg));
h += margin + errMsgs.count()*fm.height();
}
return QSize( 0, h);
}
int FolderStatusDelegate::rootFolderHeightWithoutErrors(const QFontMetrics &fm, const QFontMetrics &aliasFm)
{
const int aliasMargin = aliasFm.height()/2;
const int margin = fm.height()/4;
int h = aliasMargin; // margin to top
h += aliasFm.height(); // alias
@@ -76,14 +97,7 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem & option ,
h += margin; // between local and remote path
h += fm.height(); // remote path
h += aliasMargin; // bottom margin
// add some space to show an error condition.
if( ! qvariant_cast<QStringList>(index.data(FolderErrorMsg)).isEmpty() ) {
QStringList errMsgs = qvariant_cast<QStringList>(index.data(FolderErrorMsg));
h += aliasMargin*2 + errMsgs.count()*fm.height();
}
return QSize( 0, h);
return h;
}
void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
@@ -91,15 +105,14 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
{
QStyledItemDelegate::paint(painter,option,index);
QFont aliasFont = option.font;
auto textAlign = Qt::AlignLeft;
QFont aliasFont = makeAliasFont(option.font);
QFont subFont = option.font;
QFont errorFont = subFont;
QFont progressFont = subFont;
progressFont.setPointSize( subFont.pointSize()-2);
//font.setPixelSize(font.weight()+);
aliasFont.setBold(true);
aliasFont.setPointSize( subFont.pointSize()+2 );
QFontMetrics subFm( subFont );
QFontMetrics aliasFm( aliasFont );
@@ -117,6 +130,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
opt.text = addFolderText();
opt.rect.setWidth(qMin(opt.rect.width(), hint.width()));
opt.rect.adjust(0, aliasMargin, 0, -aliasMargin);
opt.rect = QStyle::visualRect(option.direction, option.rect, opt.rect);
QApplication::style()->drawControl(QStyle::CE_PushButton, &opt, painter
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
, option.widget
@@ -141,10 +155,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
QString itemString = qvariant_cast<QString>(index.data(SyncProgressItemString));
int warningCount = qvariant_cast<int>(index.data(WarningCount));
bool syncOngoing = qvariant_cast<bool>(index.data(SyncRunning));
// QString statusText = qvariant_cast<QString>(index.data(FolderStatus));
bool syncEnabled = index.data(FolderAccountConnected).toBool();
// QString syncStatus = syncEnabled? tr( "Enabled" ) : tr( "Disabled" );
bool syncEnabled = qvariant_cast<bool>(index.data(FolderAccountConnected));
QRect iconRect = option.rect;
QRect aliasRect = option.rect;
@@ -177,8 +188,11 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
int iconSize = iconRect.width();
auto optionsButtonVisualRect = optionsButtonRect(option.rect, option.direction);
QPixmap pm = statusIcon.pixmap(iconSize, iconSize, syncEnabled ? QIcon::Normal : QIcon::Disabled );
painter->drawPixmap(QPoint(iconRect.left(), iconRect.top()), pm);
painter->drawPixmap(QStyle::visualRect(option.direction, option.rect, iconRect).left(),
iconRect.top(), pm);
// only show the warning icon if the sync is running. Otherwise its
// encoded in the status icon.
@@ -191,6 +205,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
QIcon warnIcon(":/client/resources/warning");
QPixmap pm = warnIcon.pixmap(16,16, syncEnabled ? QIcon::Normal : QIcon::Disabled );
warnRect = QStyle::visualRect(option.direction, option.rect, warnRect);
painter->drawPixmap(QPoint(warnRect.left(), warnRect.top()),pm );
}
@@ -217,7 +232,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
}
QString elidedAlias = aliasFm.elidedText(aliasText, Qt::ElideRight, aliasRect.width());
painter->setFont(aliasFont);
painter->drawText(aliasRect, elidedAlias);
painter->drawText(QStyle::visualRect(option.direction, option.rect, aliasRect), textAlign, elidedAlias);
const bool showProgess = !overallString.isEmpty() || !itemString.isEmpty();
if(!showProgess) {
@@ -231,56 +246,56 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
elidedRemotePathText = subFm.elidedText(tr("Remote path: %1").arg(remotePath),
Qt::ElideMiddle, remotePathRect.width());
}
painter->drawText(remotePathRect, elidedRemotePathText);
painter->drawText(QStyle::visualRect(option.direction, option.rect, remotePathRect),
textAlign, elidedRemotePathText);
QString elidedPathText = subFm.elidedText(pathText, Qt::ElideMiddle, localPathRect.width());
painter->drawText(localPathRect, elidedPathText);
painter->drawText(QStyle::visualRect(option.direction, option.rect, localPathRect),
textAlign, elidedPathText);
}
// paint an error overlay if there is an error string
int h = iconRect.bottom();
if( !errorTexts.isEmpty() ) {
h += aliasMargin;
h += margin;
QRect errorRect = localPathRect;
errorRect.setLeft( iconRect.left());
errorRect.setTop( h );
errorRect.setHeight(errorTexts.count() * subFm.height()+aliasMargin);
errorRect.setRight( option.rect.right()-aliasMargin );
errorRect.setHeight(errorTexts.count() * subFm.height() + 2 * margin);
errorRect.setRight( option.rect.right() - margin );
painter->setBrush( QColor(0xbb, 0x4d, 0x4d) );
painter->setPen( QColor(0xaa, 0xaa, 0xaa));
painter->drawRoundedRect( errorRect, 4, 4 );
painter->drawRoundedRect(QStyle::visualRect(option.direction, option.rect, errorRect),
4, 4);
painter->setPen( Qt::white );
painter->setFont(errorFont);
QRect errorTextRect = errorRect;
errorTextRect.setLeft( errorTextRect.left()+aliasMargin );
errorTextRect.setTop( errorTextRect.top()+aliasMargin/2 );
int x = errorTextRect.left();
int y = errorTextRect.top()+aliasMargin/2 + subFm.height()/2;
QRect errorTextRect( errorRect.left() + margin,
errorRect.top() + margin,
errorRect.width() - 2 * margin,
subFm.height() );
foreach( QString eText, errorTexts ) {
painter->drawText(x, y, subFm.elidedText( eText, Qt::ElideLeft, errorTextRect.width()-2*aliasMargin));
y += subFm.height();
painter->drawText(QStyle::visualRect(option.direction, option.rect, errorTextRect), textAlign,
subFm.elidedText( eText, Qt::ElideLeft, errorTextRect.width()));
errorTextRect.translate(0, errorTextRect.height());
}
h = errorRect.bottom();
}
h += aliasMargin;
h += margin;
// Sync File Progress Bar: Show it if syncFile is not empty.
if (showProgess) {
int fileNameTextHeight = subFm.boundingRect(tr("File")).height();
int barHeight = qMax(fileNameTextHeight, aliasFm.height()+4); ;
int overallWidth = option.rect.width()-aliasMargin-nextToIcon;
int barHeight = qMax(fileNameTextHeight, aliasFm.height()+4);
int overallWidth = option.rect.right() - aliasMargin - optionsButtonVisualRect.width() - nextToIcon;
painter->save();
// Sizes-Text
QRect octetRect = progressFm.boundingRect(QRect(), 0, overallString );
int progressTextWidth = octetRect.width() + 2;
int progressTextWidth = octetRect.width() + 5;
// Overall Progress Bar.
QRect pBRect;
@@ -296,7 +311,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
pBarOpt.maximum = 100;
pBarOpt.progress = overallPercent;
pBarOpt.orientation = Qt::Horizontal;
pBarOpt.rect = pBRect;
pBarOpt.rect = QStyle::visualRect(option.direction, option.rect, pBRect);
QApplication::style()->drawControl( QStyle::CE_ProgressBar, &pBarOpt, painter );
@@ -308,7 +323,8 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
overallProgressRect.setWidth( progressTextWidth );
painter->setFont(progressFont);
painter->drawText( overallProgressRect, Qt::AlignRight+Qt::AlignVCenter, overallString);
painter->drawText(QStyle::visualRect(option.direction, option.rect, overallProgressRect),
Qt::AlignRight | Qt::AlignVCenter, overallString);
// painter->drawRect(overallProgressRect);
// Individual File Progress
@@ -319,7 +335,8 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
fileRect.setHeight(fileNameTextHeight);
QString elidedText = progressFm.elidedText(itemString, Qt::ElideLeft, fileRect.width());
painter->drawText( fileRect, Qt::AlignLeft+Qt::AlignVCenter, elidedText);
painter->drawText(QStyle::visualRect(option.direction, option.rect, fileRect),
Qt::AlignLeft | Qt::AlignVCenter, elidedText);
painter->restore();
}
@@ -334,7 +351,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
btnOpt.state |= QStyle::State_Raised;
btnOpt.arrowType = Qt::NoArrow;
btnOpt.subControls = QStyle::SC_ToolButton;
btnOpt.rect = optionsButtonRect(option.rect);
btnOpt.rect = optionsButtonVisualRect;
btnOpt.icon = m_moreIcon;
btnOpt.iconSize = btnOpt.rect.size();
QApplication::style()->drawComplexControl( QStyle::CC_ToolButton, &btnOpt, painter );
@@ -347,20 +364,26 @@ bool FolderStatusDelegate::editorEvent ( QEvent * event, QAbstractItemModel * mo
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
QRect FolderStatusDelegate::optionsButtonRect(const QRect &within)
QRect FolderStatusDelegate::optionsButtonRect(QRect within, Qt::LayoutDirection direction)
{
QFont font = QFont();
QFont aliasFont = makeAliasFont(font);
QFontMetrics fm(font);
QFontMetrics aliasFm(aliasFont);
within.setHeight(FolderStatusDelegate::rootFolderHeightWithoutErrors(fm, aliasFm));
QStyleOptionToolButton opt;
opt.text = QLatin1String("...");
QFontMetrics fm = QFontMetrics(QFont());
QSize textSize = fm.size(Qt::TextShowMnemonic, opt.text);
opt.rect.setSize(textSize);
QSize size = QApplication::style()->sizeFromContents(QStyle::CT_ToolButton, &opt, textSize).
expandedTo(QApplication::globalStrut());
int margin = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
return QRect(QPoint(within.right() - size.width() - margin,
within.top() + within.height()/2 - size.height()/2),
size);
QRect r(QPoint(within.right() - size.width() - margin,
within.top() + within.height()/2 - size.height()/2),
size);
return QStyle::visualRect(direction, within, r);
}
+2 -3
Ver Arquivo
@@ -33,8 +33,6 @@ public:
HeaderRole,
FolderPathRole,
FolderSecondPathRole,
FolderRemotePath,
FolderStatus,
FolderErrorMsg,
FolderSyncPaused,
FolderStatusIconRole,
@@ -57,7 +55,8 @@ public:
/**
* return the position of the option button within the item
*/
static QRect optionsButtonRect(const QRect &within);
static QRect optionsButtonRect(QRect within, Qt::LayoutDirection direction);
static int rootFolderHeightWithoutErrors(const QFontMetrics &fm, const QFontMetrics &aliasFm);
private:
static QString addFolderText();
};
+5 -3
Ver Arquivo
@@ -187,6 +187,8 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const
switch (role) {
case FolderStatusDelegate::FolderPathRole : return f->shortGuiPath();
case FolderStatusDelegate::FolderSecondPathRole : return f->remotePath();
case FolderStatusDelegate::FolderErrorMsg : return f->syncResult().errorStrings();
case FolderStatusDelegate::SyncRunning : return f->syncResult().status() == SyncResult::SyncRunning;
case FolderStatusDelegate::HeaderRole : return f->aliasGui();
case FolderStatusDelegate::FolderAliasRole : return f->alias();
case FolderStatusDelegate::FolderSyncPaused : return f->syncPaused();
@@ -708,8 +710,7 @@ void FolderStatusModel::slotUpdateFolderState(Folder *folder)
if( ! folder ) return;
for (int i = 0; i < _folders.count(); ++i) {
if (_folders.at(i)._folder == folder) {
emit dataChanged(index(i), index(i),
QVector<int>() << FolderStatusDelegate::FolderStatus);
emit dataChanged(index(i), index(i));
}
}
}
@@ -970,7 +971,7 @@ void FolderStatusModel::slotFolderSyncStateChange(Folder *f)
// Reset the progress info after a sync.
_folders[folderIndex]._progress = SubFolderInfo::Progress();
} else if (state == SyncResult::Error) {
_folders[folderIndex]._progress._progressString = f->syncResult().errorString();
_folders[folderIndex]._progress = SubFolderInfo::Progress();
}
// update the icon etc. now
@@ -979,6 +980,7 @@ void FolderStatusModel::slotFolderSyncStateChange(Folder *f)
if (state == SyncResult::Success) {
foreach (const SyncFileItemPtr &i, f->syncResult().syncFileItemVector()) {
if (i->_isDirectory && (i->_instruction == CSYNC_INSTRUCTION_NEW
|| i->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE
|| i->_instruction == CSYNC_INSTRUCTION_REMOVE
|| i->_instruction == CSYNC_INSTRUCTION_RENAME)) {
// There is a new or a removed folder. reset all data
+1 -2
Ver Arquivo
@@ -79,8 +79,7 @@ void FolderWatcherPrivate::inotifyRegisterPath(const QString& path)
int wd = inotify_add_watch(_fd, path.toUtf8().constData(),
IN_CLOSE_WRITE | IN_ATTRIB | IN_MOVE |
IN_CREATE |IN_DELETE | IN_DELETE_SELF |
IN_MOVE_SELF |IN_UNMOUNT |IN_ONLYDIR |
IN_DONT_FOLLOW );
IN_MOVE_SELF |IN_UNMOUNT |IN_ONLYDIR);
if( wd > -1 ) {
_watches.insert(wd, path);
}
+23
Ver Arquivo
@@ -47,11 +47,34 @@ int main(int argc, char **argv)
{
Q_INIT_RESOURCE(client);
#ifdef Q_OS_WIN
// If the font size ratio is set on Windows, we need to
// enable the auto pixelRatio in Qt since we don't
// want to use sizes relative to the font size everywhere.
// This is automatic on OS X, but opt-in on Windows
// https://doc-snapshots.qt.io/qt5-5.6/highdpi.html#qt-support
#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0)
qputenv("QT_DEVICE_PIXEL_RATIO", "auto");
#else
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");
#endif
#endif // Q_OS_WIN
#ifdef Q_OS_MAC
Mac::CocoaInitializer cocoaInit; // RIIA
#endif
OCC::Application app(argc, argv);
#ifdef Q_OS_WIN
// The Windows style still has pixelated elements with Qt 5.6,
// it's recommended to use the Fusion style in this case, even
// though it looks slightly less native. Check here after the
// QApplication was constructed, but before any QWidget is
// constructed.
if (app.devicePixelRatio() > 1)
QApplication::setStyle(QStringLiteral("fusion"));
#endif // Q_OS_WIN
#ifndef Q_OS_WIN
signal(SIGPIPE, SIG_IGN);
#endif
+1 -1
Ver Arquivo
@@ -199,7 +199,7 @@ void ownCloudGui::slotSyncStateChange( Folder* folder )
auto result = folder->syncResult();
qDebug() << "Sync state changed for folder " << folder->alias() << ": " << result.statusString();
qDebug() << "Sync state changed for folder " << folder->remoteUrl().toString() << ": " << result.statusString();
if (result.status() == SyncResult::Success || result.status() == SyncResult::Error) {
Logger::instance()->enterNextLogFile();
+5 -13
Ver Arquivo
@@ -126,7 +126,7 @@ void ProtocolWidget::hideEvent(QHideEvent *ev)
QWidget::hideEvent(ev);
}
void ProtocolWidget::cleanIgnoreItems(const QString& folder)
void ProtocolWidget::cleanItems(const QString& folder)
{
int itemCnt = _ui->_treeWidget->topLevelItemCount();
@@ -136,21 +136,13 @@ void ProtocolWidget::cleanIgnoreItems(const QString& folder)
itemCnt--;
}
// limit also in the protocol widget
// The issue list is a state, clear it and let the next sync fill it
// with ignored files and propagation errors.
itemCnt = _issueItemView->topLevelItemCount();
// Limit the number of items in the issue view
while(itemCnt > 2000) {
delete _issueItemView->takeTopLevelItem(itemCnt - 1);
itemCnt--;
}
// clean up the issue list
for( int cnt = itemCnt-1; cnt >=0 ; cnt-- ) {
QTreeWidgetItem *item = _issueItemView->topLevelItem(cnt);
bool isErrorItem = item->data(0, IgnoredIndicatorRole).toBool();
QString itemFolder = item->data(2, Qt::UserRole).toString();
if( isErrorItem && itemFolder == folder ) {
if( itemFolder == folder ) {
delete item;
}
}
@@ -261,7 +253,7 @@ void ProtocolWidget::slotProgressInfo( const QString& folder, const ProgressInfo
{
if( !progress.hasStarted() ) {
// The sync is restarting, clean the old items
cleanIgnoreItems(folder);
cleanItems(folder);
computeResyncButtonEnabled();
} else if (progress.completedFiles() >= progress.totalFiles()) {
//Sync completed
+1 -1
Ver Arquivo
@@ -63,7 +63,7 @@ signals:
private:
void setSyncResultStatus(const SyncResult& result );
void cleanIgnoreItems( const QString& folder );
void cleanItems( const QString& folder );
void computeResyncButtonEnabled();
QTreeWidgetItem* createCompletedTreewidgetItem(const QString &folder, const SyncFileItem &item );
+1 -1
Ver Arquivo
@@ -57,7 +57,7 @@
</column>
</widget>
</item>
<item row="2" column="1">
<item row="2" column="0" colspan="2">
<widget class="QDialogButtonBox" name="_dialogButtonBox"/>
</item>
</layout>
+9 -4
Ver Arquivo
@@ -183,17 +183,22 @@ void SettingsDialog::showFirstPage()
void SettingsDialog::showActivityPage()
{
if (_activityAction) {
slotSwitchPage(_activityAction);
_activityAction->trigger();
}
}
void SettingsDialog::accountAdded(AccountState *s)
{
auto height = _toolBar->sizeHint().height();
bool brandingSingleAccount = !Theme::instance()->multiAccount();
auto accountAction = createColorAwareAction(QLatin1String(":/client/resources/account.png"),
s->account()->displayName());
accountAction->setToolTip(s->account()->displayName());
accountAction->setIconText(s->shortDisplayNameForSettings(height * buttonSizeRatio));
brandingSingleAccount ? tr("Account") : s->account()->displayName());
if (!brandingSingleAccount) {
accountAction->setToolTip(s->account()->displayName());
accountAction->setIconText(s->shortDisplayNameForSettings(height * buttonSizeRatio));
}
_toolBar->insertAction(_toolBar->actions().at(0), accountAction);
auto accountSettings = new AccountSettings(s, this);
_ui->stack->insertWidget(0 , accountSettings);
+1 -1
Ver Arquivo
@@ -117,7 +117,7 @@ void SettingsDialogMac::accountAdded(AccountState *s)
QIcon accountIcon = MacStandardIcon::icon(MacStandardIcon::UserAccounts);
auto accountSettings = new AccountSettings(s, this);
QString displayName = s->shortDisplayNameForSettings();
QString displayName = Theme::instance()->multiAccount() ? s->shortDisplayNameForSettings() : tr("Account");
insertPreferencesPanel(0, accountIcon, displayName, accountSettings);
+14 -5
Ver Arquivo
@@ -63,6 +63,7 @@ void ShareeModel::fetch(const QString &search, const ShareeSet &blacklist)
_shareeBlacklist = blacklist;
OcsShareeJob *job = new OcsShareeJob(_account);
connect(job, SIGNAL(shareeJobFinished(QVariantMap)), SLOT(shareesFetched(QVariantMap)));
connect(job, SIGNAL(ocsError(int,QString)), SIGNAL(displayErrorMessage(int,QString)));
job->getSharees(_search, _type, 1, 50);
}
@@ -196,11 +197,19 @@ QVariant ShareeModel::data(const QModelIndex &index, int role) const
return QVariant();
}
if (role == Qt::DisplayRole || role == Qt::EditRole) {
return _sharees.at(index.row())->format();
}
if (role == Qt::UserRole) {
return QVariant::fromValue(_sharees.at(index.row()));
const auto & sharee = _sharees.at(index.row());
if (role == Qt::DisplayRole) {
return sharee->format();
} else if (role == Qt::EditRole) {
// This role is used by the completer - it should match
// the full name and the user name and thus we include both
// in the output here. But we need to take care this string
// doesn't leak to the user.
return QString(sharee->displayName() + " (" + sharee->shareWith() + ")");
} else if (role == Qt::UserRole) {
return QVariant::fromValue(sharee);
}
return QVariant();
+3
Ver Arquivo
@@ -64,8 +64,11 @@ public:
QSharedPointer<Sharee> getSharee(int at);
QString currentSearch() const { return _search; }
signals:
void shareesReady();
void displayErrorMessage(int code, const QString &);
private slots:
void shareesFetched(const QVariantMap &reply);
+2 -7
Ver Arquivo
@@ -505,8 +505,8 @@ void ShareLinkWidget::setShareCheckBoxTitle(bool haveShares)
void ShareLinkWidget::displayError(int code, const QString &message)
{
const QString arg = QString("%1, %2").arg(code).arg(message);
const QString errMsg = tr("OCS API error code: %1").arg(arg);
displayError(errMsg);
qDebug() << "Error from server" << code << message;
displayError(message);
}
void ShareLinkWidget::displayError(const QString& errMsg)
@@ -515,10 +515,5 @@ void ShareLinkWidget::displayError(const QString& errMsg)
_ui->errorLabel->show();
}
void ShareLinkWidget::displayError(int code)
{
const QString errMsg = tr("OCS API error code: %1").arg(code);
displayError(errMsg);
}
}
-1
Ver Arquivo
@@ -74,7 +74,6 @@ private slots:
private:
void setShareCheckBoxTitle(bool haveShares);
void displayError(int code);
void displayError(const QString& errMsg);
void setShareLink( const QString& url );
void resizeEvent(QResizeEvent *e);
-1
Ver Arquivo
@@ -224,7 +224,6 @@
</layout>
<zorder>errorLabel</zorder>
<zorder>widget_shareLink</zorder>
<zorder>verticalSpacer</zorder>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
+62 -111
Ver Arquivo
@@ -26,7 +26,6 @@
#include "thumbnailjob.h"
#include "share.h"
#include "sharee.h"
#include "avatarjob.h"
#include "QProgressIndicator.h"
#include <QBuffer>
@@ -40,9 +39,6 @@
#include <QPropertyAnimation>
#include <QMenu>
#include <QAction>
#include <QCryptographicHash>
#include <QColor>
#include <QPainter>
namespace OCC {
@@ -52,7 +48,8 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_account(account),
_sharePath(sharePath),
_localPath(localPath),
_resharingAllowed(resharingAllowed)
_resharingAllowed(resharingAllowed),
_disableCompleterActivated(false)
{
setAttribute(Qt::WA_DeleteOnClose);
setObjectName("SharingDialogUG"); // required as group for saveGeometry call
@@ -67,8 +64,10 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_isFile ? QLatin1String("file") : QLatin1String("folder"),
_completer);
connect(_completerModel, SIGNAL(shareesReady()), this, SLOT(slotShareesReady()));
connect(_completerModel, SIGNAL(displayErrorMessage(int,QString)), this, SLOT(displayError(int,QString)));
_completer->setModel(_completerModel);
_completer->setCaseSensitivity(Qt::CaseInsensitive);
#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
_completer->setFilterMode(Qt::MatchContains);
#endif
@@ -77,8 +76,15 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_manager = new ShareManager(_account, this);
connect(_manager, SIGNAL(sharesFetched(QList<QSharedPointer<Share>>)), SLOT(slotSharesFetched(QList<QSharedPointer<Share>>)));
connect(_manager, SIGNAL(shareCreated(QSharedPointer<Share>)), SLOT(getShares()));
// connect(_ui->shareeLineEdit, SIGNAL(returnPressed()), SLOT(on_searchPushButton_clicked()));
connect(_completer, SIGNAL(activated(QModelIndex)), SLOT(slotCompleterActivated(QModelIndex)));
connect(_manager, SIGNAL(serverError(int,QString)), this, SLOT(displayError(int,QString)));
connect(_ui->shareeLineEdit, SIGNAL(returnPressed()), SLOT(slotLineEditReturn()));
// By making the next two QueuedConnections we can override
// the strings the completer sets on the line edit.
connect(_completer, SIGNAL(activated(QModelIndex)), SLOT(slotCompleterActivated(QModelIndex)),
Qt::QueuedConnection);
connect(_completer, SIGNAL(highlighted(QModelIndex)), SLOT(slotCompleterHighlighted(QModelIndex)),
Qt::QueuedConnection);
// Queued connection so this signal is recieved after textChanged
connect(_ui->shareeLineEdit, SIGNAL(textEdited(QString)),
@@ -88,6 +94,7 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_completionTimer.setInterval(600);
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
_ui->errorLabel->hide();
}
ShareUserGroupWidget::~ShareUserGroupWidget()
@@ -102,6 +109,7 @@ void ShareUserGroupWidget::on_shareeLineEdit_textChanged(const QString &)
void ShareUserGroupWidget::slotLineEditTextEdited(const QString& text)
{
_disableCompleterActivated = false;
// First textChanged is called first and we stopped the timer when the text is changed, programatically or not
// Then we restart the timer here if the user touched a key
if (!text.isEmpty()) {
@@ -109,6 +117,28 @@ void ShareUserGroupWidget::slotLineEditTextEdited(const QString& text)
}
}
void ShareUserGroupWidget::slotLineEditReturn()
{
_disableCompleterActivated = false;
// did the user type in one of the options?
const auto text = _ui->shareeLineEdit->text();
for (int i = 0; i < _completerModel->rowCount(); ++i) {
const auto sharee = _completerModel->getSharee(i);
if (sharee->format() == text
|| sharee->displayName() == text
|| sharee->shareWith() == text) {
slotCompleterActivated(_completerModel->index(i));
// make sure we do not send the same item twice (because return is called when we press
// return to activate an item inthe completer)
_disableCompleterActivated = true;
return;
}
}
// nothing found? try to refresh completion
_completionTimer.start();
}
void ShareUserGroupWidget::searchForSharees()
{
@@ -122,7 +152,7 @@ void ShareUserGroupWidget::searchForSharees()
foreach (auto sw, _ui->scrollArea->findChildren<ShareWidget*>()) {
blacklist << sw->share()->getShareWith();
}
_ui->errorLabel->hide();
_completerModel->fetch(_ui->shareeLineEdit->text(), blacklist);
}
@@ -136,7 +166,6 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
{
QScrollArea *scrollArea = _ui->scrollArea;
auto newViewPort = new QWidget(scrollArea);
auto layout = new QVBoxLayout(newViewPort);
@@ -149,7 +178,7 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
continue;
}
ShareWidget *s = new ShareWidget(share, _isFile, _account, _ui->scrollArea);
ShareWidget *s = new ShareWidget(share, _isFile, _ui->scrollArea);
connect(s, SIGNAL(resizeRequested()), this, SLOT(slotAdjustScrollWidgetSize()));
layout->addWidget(s);
@@ -166,6 +195,8 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
scrollArea->setMinimumSize(minimumSize);
scrollArea->setVisible(!shares.isEmpty());
scrollArea->setWidget(newViewPort);
_disableCompleterActivated = false;
}
void ShareUserGroupWidget::slotAdjustScrollWidgetSize()
@@ -180,14 +211,19 @@ void ShareUserGroupWidget::slotAdjustScrollWidgetSize()
}
}
void ShareUserGroupWidget::slotShareesReady()
{
if (_completerModel->rowCount() == 0) {
displayError(0, tr("No results for '%1'").arg(_completerModel->currentSearch()));
return;
}
_completer->complete();
}
void ShareUserGroupWidget::slotCompleterActivated(const QModelIndex & index)
{
if (_disableCompleterActivated)
return;
// The index is an index from the QCompletion model which is itelf a proxy
// model proxying the _completerModel
auto sharee = qvariant_cast<QSharedPointer<Sharee>>(index.data(Qt::UserRole));
@@ -201,15 +237,27 @@ void ShareUserGroupWidget::slotCompleterActivated(const QModelIndex & index)
_ui->shareeLineEdit->setText(QString());
}
void ShareUserGroupWidget::slotCompleterHighlighted(const QModelIndex & index)
{
// By default the completer would set the text to EditRole,
// override that here.
_ui->shareeLineEdit->setText(index.data(Qt::DisplayRole).toString());
}
void ShareUserGroupWidget::displayError(int code, const QString& message)
{
qDebug() << "Error from server" << code << message;
_ui->errorLabel->setText(message);
_ui->errorLabel->show();
}
ShareWidget::ShareWidget(QSharedPointer<Share> share,
bool isFile,
AccountPtr account,
QWidget *parent) :
QWidget(parent),
_ui(new Ui::ShareWidget),
_share(share),
_isFile(isFile),
_account(account)
_isFile(isFile)
{
_ui->setupUi(this);
@@ -256,103 +304,6 @@ ShareWidget::ShareWidget(QSharedPointer<Share> share,
if (!share->account()->capabilities().shareResharing()) {
_ui->permissionShare->hide();
}
loadAvatar();
}
void ShareWidget::loadAvatar()
{
/* Set the default place holder
* This is calculated the same way as on the webinterface
* So that the colors match
*
* This is done first so that we can directly show something
*/
// Set size of the placeholder
_ui->avatar->setMinimumHeight(48);
_ui->avatar->setMinimumWidth(48);
_ui->avatar->setMaximumHeight(48);
_ui->avatar->setMaximumWidth(48);
_ui->avatar->setAlignment(Qt::AlignCenter);
/* Calculate the hue
* We could use more digits but we have the MSB now which
* is already plenty
*/
const QString text = _share->getShareWith()->displayName();
QString seed = _share->getShareWith()->shareWith();
if (_share->getShareWith()->type() != Sharee::User) {
seed += QString(" %1").arg(_share->getShareWith()->type());
}
const QByteArray hash = QCryptographicHash::hash(seed.toUtf8(), QCryptographicHash::Md5);
int hue = ((double)hash.mid(0, 3).toHex().toInt(0, 16) / (double)0xffffff) * 255;
const QColor bg = QColor::fromHsl(hue, 230, 166);
const QString style = QString("* {\
color: #fff;\
background-color: %1;\
border-radius: 24px;\
font-size: 26px\
}").arg(bg.name());
// Set the style
_ui->avatar->setStyleSheet(style);
// Set the placeholder text
_ui->avatar->setText(text.at(0).toUpper());
// We can only fetch avatars for local users currently
if (_share->getShareWith()->type() == Sharee::User) {
AvatarJob *job = new AvatarJob(_share->getShareWith()->shareWith(), 48, _account, this);
connect(job, SIGNAL(avatarReady(QByteArray, QString)), SLOT(slotAvatarLoaded(QByteArray, QString)));
job->start();
}
}
void ShareWidget::slotAvatarLoaded(const QByteArray &data, const QString &mimeType)
{
QPixmap p;
bool valid = false;
if (mimeType == "image/png") {
valid = p.loadFromData(data, "PNG");
} else if (mimeType == "image/jpeg") {
valid = p.loadFromData(data, "JPG");
} else {
// Guess the filetype
valid = p.loadFromData(data);
}
// If the image was loaded succesfully set it!
if (valid) {
/*
* We want round avatars so create a new pixmap to draw
* the round avatar on and set a transparent background
*/
QPixmap avatar(p.width(), p.height());
avatar.fill(QColor(0,0,0,0));
// Initialise our painer
QPainter painter(&avatar);
painter.setRenderHint(QPainter::Antialiasing);
// Set to draw only a cricle
QPainterPath path;
path.addEllipse(0,0,p.width(),p.height());
painter.setClipPath(path);
// Draw the round avatar
painter.drawPixmap(0,0,p.width(),p.width(),p);
// Set the avatar
_ui->avatar->setPixmap(avatar);
// Remove the stylesheet
_ui->avatar->setStyleSheet("");
}
}
void ShareWidget::on_deleteShareButton_clicked()
+5 -9
Ver Arquivo
@@ -48,10 +48,7 @@ class ShareWidget : public QWidget
Q_OBJECT
public:
explicit ShareWidget(QSharedPointer<Share> Share,
bool isFile,
AccountPtr account,
QWidget *parent = 0);
explicit ShareWidget(QSharedPointer<Share> Share, bool isFile, QWidget *parent = 0);
~ShareWidget();
QSharedPointer<Share> share() const;
@@ -68,16 +65,12 @@ private slots:
void slotShareDeleted();
void slotPermissionsSet();
void slotAvatarLoaded(const QByteArray &data, const QString &mimeType);
private:
void displayPermissions();
void loadAvatar();
Ui::ShareWidget *_ui;
QSharedPointer<Share> _share;
bool _isFile;
AccountPtr _account;
QAction *_permissionCreate;
QAction *_permissionUpdate;
@@ -111,9 +104,12 @@ private slots:
void searchForSharees();
void slotLineEditTextEdited(const QString &text);
void slotLineEditReturn();
void slotCompleterActivated(const QModelIndex & index);
void slotCompleterHighlighted(const QModelIndex & index);
void slotShareesReady();
void slotAdjustScrollWidgetSize();
void displayError(int code ,const QString &message);
private:
Ui::ShareUserGroupWidget *_ui;
@@ -127,7 +123,7 @@ private:
bool _resharingAllowed;
bool _isFile;
bool _disableCompleterActivated; // in order to avoid that we share the contents twice
ShareManager *_manager;
};
+11 -1
Ver Arquivo
@@ -41,13 +41,23 @@
<x>0</x>
<y>0</y>
<width>441</width>
<height>128</height>
<height>98</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3"/>
</widget>
</widget>
</item>
<item>
<widget class="QLabel" name="errorLabel">
<property name="text">
<string notr="true">Placeholder for Error text</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
-7
Ver Arquivo
@@ -31,13 +31,6 @@
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="avatar">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="sharedWith">
<property name="text">
+11 -11
Ver Arquivo
@@ -374,28 +374,28 @@ void SocketApi::command_SHARE(const QString& localFile, QIODevice* socket)
// if the folder isn't connected, don't open the share dialog
sendMessage(socket, message);
} else {
const QString file = QDir::cleanPath(localFile).mid(shareFolder->cleanPath().length()+1);
const QString localFileClean = QDir::cleanPath(localFile);
const QString file = localFileClean.mid(shareFolder->cleanPath().length()+1);
SyncFileStatus fileStatus = this->fileStatus(shareFolder, file);
// Verify the file is on the server (to our knowledge of course)
if (fileStatus.tag() != SyncFileStatus::STATUS_SYNC &&
if (fileStatus.tag() != SyncFileStatus::STATUS_UPTODATE &&
fileStatus.tag() != SyncFileStatus::STATUS_UPDATED) {
const QString message = QLatin1String("SHARE:NOTSYNCED:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
return;
}
const QString folderForPath = shareFolder->path();
const QString remotePath = shareFolder->remotePath() + localFile.right(localFile.count()-folderForPath.count()+1);
const QString remotePath = shareFolder->remotePath() + QLatin1Char('/') + file;
// Can't share root folder
if (QDir::cleanPath(remotePath) == "/") {
if (remotePath == "/") {
const QString message = QLatin1String("SHARE:CANNOTSHAREROOT:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
return;
}
SyncJournalFileRecord rec = dbFileRecord_capi(shareFolder, localFile);
SyncJournalFileRecord rec = dbFileRecord_capi(shareFolder, localFileClean);
bool allowReshare = true; // lets assume the good
if( rec.isValid() ) {
@@ -407,7 +407,7 @@ void SocketApi::command_SHARE(const QString& localFile, QIODevice* socket)
const QString message = QLatin1String("SHARE:OK:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
emit shareCommandReceived(remotePath, localFile, allowReshare);
emit shareCommandReceived(remotePath, localFileClean, allowReshare);
}
}
@@ -435,7 +435,7 @@ void SocketApi::command_SHARE_STATUS(const QString &localFile, QIODevice *socket
SyncFileStatus fileStatus = this->fileStatus(shareFolder, file);
// Verify the file is on the server (to our knowledge of course)
if (fileStatus.tag() != SyncFileStatus::STATUS_SYNC &&
if (fileStatus.tag() != SyncFileStatus::STATUS_UPTODATE &&
fileStatus.tag() != SyncFileStatus::STATUS_UPDATED) {
const QString message = QLatin1String("SHARE_STATUS:NOTSYNCED:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
@@ -621,7 +621,7 @@ SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileNa
case SyncResult::Success:
case SyncResult::Problem:
status.set(SyncFileStatus::STATUS_SYNC);
status.set(SyncFileStatus::STATUS_UPTODATE);
return status;
case SyncResult::Error:
@@ -636,7 +636,7 @@ SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileNa
}
} else if (type == CSYNC_FTW_TYPE_DIR) {
if (rec.isValid()) {
status.set(SyncFileStatus::STATUS_SYNC);
status.set(SyncFileStatus::STATUS_UPTODATE);
} else {
qDebug() << "Could not determine state for folder" << fileName << "will set STATUS_NEW";
status.set(SyncFileStatus::STATUS_NEW);
@@ -644,7 +644,7 @@ SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileNa
} else if (type == CSYNC_FTW_TYPE_FILE) {
if (rec.isValid()) {
if( FileSystem::getModTime(fi.absoluteFilePath()) == Utility::qDateTimeToTime_t(rec._modtime) ) {
status.set(SyncFileStatus::STATUS_SYNC);
status.set(SyncFileStatus::STATUS_UPTODATE);
} else {
if (rec._remotePerm.isNull() || rec._remotePerm.contains("W") ) {
status.set(SyncFileStatus::STATUS_EVAL);
+3
Ver Arquivo
@@ -78,6 +78,9 @@ QString SyncRunFileLog::instructionToStr( csync_instructions_e inst )
case CSYNC_INSTRUCTION_ERROR:
re = "INST_ERROR";
break;
case CSYNC_INSTRUCTION_TYPE_CHANGE:
re = "INST_TYPE_CHANGE";
break;
}
return re;
+19
Ver Arquivo
@@ -2,6 +2,19 @@
#include <QDebug>
#import <Cocoa/Cocoa.h>
@interface NotificationCenterDelegate : NSObject
@end
@implementation NotificationCenterDelegate
// Always show, even if app is active at the moment.
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center
shouldPresentNotification:(NSUserNotification *)notification
{
Q_UNUSED(center);
Q_UNUSED(notification);
return YES;
}
@end
namespace OCC {
bool canOsXSendUserNotification()
@@ -15,6 +28,12 @@ void sendOsXUserNotification(const QString &title, const QString &message)
Class cuserNotificationCenter = NSClassFromString(@"NSUserNotificationCenter");
id userNotificationCenter = [cuserNotificationCenter defaultUserNotificationCenter];
static dispatch_once_t once;
dispatch_once(&once, ^{
id delegate = [[NotificationCenterDelegate alloc] init];
[userNotificationCenter setDelegate:delegate];
});
Class cuserNotification = NSClassFromString(@"NSUserNotification");
id notification = [[cuserNotification alloc] init];
[notification setTitle:[NSString stringWithUTF8String:title.toUtf8().data()]];
+3 -2
Ver Arquivo
@@ -76,7 +76,7 @@ void AbstractNetworkJob::setReply(QNetworkReply *reply)
void AbstractNetworkJob::setTimeout(qint64 msec)
{
qDebug() << Q_FUNC_INFO << msec;
//qDebug() << Q_FUNC_INFO << msec;
_timer.start(msec);
}
@@ -225,7 +225,8 @@ void AbstractNetworkJob::start()
const QUrl url = account()->url();
const QString displayUrl = QString( "%1://%2%3").arg(url.scheme()).arg(url.host()).arg(url.path());
qDebug() << "!!!" << metaObject()->className() << "created for" << displayUrl << "+" << path();
QString parentMetaObjectName = parent() ? parent()->metaObject()->className() : "";
qDebug() << "!!!" << metaObject()->className() << "created for" << displayUrl << "+" << path() << parentMetaObjectName;
}
void AbstractNetworkJob::slotTimeout()
-1
Ver Arquivo
@@ -56,7 +56,6 @@ AccountPtr Account::create()
Account::~Account()
{
qDebug() << "Account" << displayName() << "deleted";
delete _credentials;
delete _am;
}
+10 -5
Ver Arquivo
@@ -49,6 +49,7 @@ static const char skipUpdateCheckC[] = "skipUpdateCheck";
static const char updateCheckIntervalC[] = "updateCheckInterval";
static const char geometryC[] = "geometry";
static const char timeoutC[] = "timeout";
static const char chunkSizeC[] = "chunkSize";
static const char transmissionChecksumC[] = "transmissionChecksum";
static const char proxyHostC[] = "Proxy/host";
@@ -95,11 +96,9 @@ bool ConfigFile::setConfDir(const QString &value)
if( dirPath.isEmpty() ) return false;
QFileInfo fi(dirPath);
if ( !fi.exists() && !fi.isAbsolute() ) {
QDir::current().mkdir(dirPath);
QDir dir = QDir::current();
dir.cd(dirPath);
fi.setFile(dir.path());
if ( !fi.exists() ) {
QDir().mkpath(dirPath);
fi.setFile(dirPath);
}
if( fi.exists() && fi.isDir() ) {
dirPath = fi.absoluteFilePath();
@@ -122,6 +121,12 @@ int ConfigFile::timeout() const
return settings.value(QLatin1String(timeoutC), 300).toInt(); // default to 5 min
}
quint64 ConfigFile::chunkSize() const
{
QSettings settings(configFile(), QSettings::IniFormat);
return settings.value(QLatin1String(chunkSizeC), 5*1024*1024).toLongLong(); // default to 5 MiB
}
QString ConfigFile::transmissionChecksum() const
{
QSettings settings(configFile(), QSettings::IniFormat);
+1
Ver Arquivo
@@ -106,6 +106,7 @@ public:
void setOptionalDesktopNotifications(bool show);
int timeout() const;
quint64 chunkSize() const;
// send a checksum as a header along with the transmission or not.
// possible values:
+35 -14
Ver Arquivo
@@ -16,7 +16,6 @@
#include <QMutex>
#include <QDebug>
#include <QNetworkReply>
#include <QAuthenticator>
#include <QSettings>
#include <QInputDialog>
@@ -43,6 +42,22 @@ const char certifPasswdC[] = "certificatePasswd";
const char authenticationFailedC[] = "owncloud-authentication-failed";
} // ns
class HttpCredentialsAccessManager : public AccessManager {
public:
HttpCredentialsAccessManager(const HttpCredentials *cred, QObject* parent = 0)
: AccessManager(parent), _cred(cred) {}
protected:
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) Q_DECL_OVERRIDE {
QByteArray credHash = QByteArray(_cred->user().toUtf8()+":"+_cred->password().toUtf8()).toBase64();
QNetworkRequest req(request);
req.setRawHeader(QByteArray("Authorization"), QByteArray("Basic ") + credHash);
//qDebug() << "Request for " << req.url() << "with authorization" << QByteArray::fromBase64(credHash);
return AccessManager::createRequest(op, req, outgoingData);
}
private:
const HttpCredentials *_cred;
};
HttpCredentials::HttpCredentials()
: _ready(false)
{
@@ -107,7 +122,7 @@ void HttpCredentials::setAccount(Account* account)
QNetworkAccessManager* HttpCredentials::getQNAM() const
{
AccessManager* qnam = new AccessManager;
AccessManager* qnam = new HttpCredentialsAccessManager(this);
connect( qnam, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)),
this, SLOT(slotAuthentication(QNetworkReply*,QAuthenticator*)));
@@ -161,7 +176,10 @@ void HttpCredentials::fetchFromKeychain()
}
bool HttpCredentials::stillValid(QNetworkReply *reply)
{
return (reply->error() != QNetworkReply::AuthenticationRequiredError);
return ((reply->error() != QNetworkReply::AuthenticationRequiredError)
// returned if user or password is incorrect
&& (reply->error() != QNetworkReply::OperationCanceledError
|| !reply->property(authenticationFailedC).toBool()));
}
void HttpCredentials::slotReadJobDone(QKeychain::Job *job)
@@ -231,6 +249,15 @@ void HttpCredentials::invalidateToken()
_account->clearCookieJar();
// let QNAM forget about the password
// This needs to be done later in the event loop because we might be called (directly or
// indirectly) from QNetworkAccessManagerPrivate::authenticationRequired, which itself
// is a called from a BlockingQueuedConnection from the Qt HTTP thread. And clearing the
// cache needs to synchronize again with the HTTP thread.
QTimer::singleShot(0, this, SLOT(clearQNAMCache()));
}
void HttpCredentials::clearQNAMCache()
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
_account->networkAccessManager()->clearAccessCache();
#else
@@ -280,18 +307,12 @@ void HttpCredentials::slotWriteJobDone(QKeychain::Job *job)
void HttpCredentials::slotAuthentication(QNetworkReply* reply, QAuthenticator* authenticator)
{
if (reply->property(authenticationFailedC).toBool()) {
qDebug() << "Authentication failed for " << reply->url().toString();
return;
}
// QNAM sends the user and password in latin-1, but the server expects UTF-8.
// So send mojibake on purpose
authenticator->setUser(QString::fromLatin1(user().toUtf8()));
authenticator->setPassword(QString::fromLatin1(password().toUtf8()));
// Set a property so we don't send the same password twice
Q_UNUSED(authenticator)
// Because of issue #4326, we need to set the login and password manually at every requests
// Thus, if we reach this signal, those credentials were invalid and we terminate.
qDebug() << "Stop request: Authentication failed for " << reply->url().toString();
reply->setProperty(authenticationFailedC, true);
reply->close();
}
} // namespace OCC
+1
Ver Arquivo
@@ -61,6 +61,7 @@ private Q_SLOTS:
void slotAuthentication(QNetworkReply*, QAuthenticator*);
void slotReadJobDone(QKeychain::Job*);
void slotWriteJobDone(QKeychain::Job*);
void clearQNAMCache();
protected:
QString _user;

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