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

Compare commits

..

616 Commits

Author SHA1 Message Date
Daniel Molkentin
c1b92f9fed beta2 2013-05-31 16:25:57 +02:00
Daniel Molkentin
b028ca0738 Merge pull request #650 from manolopm/master
Fixes for windows client when setup server url customization
2013-05-31 07:25:09 -07:00
Daniel Molkentin
a9aab30d55 Display proxy errors 2013-05-31 16:16:56 +02:00
Daniel Molkentin
efbad3a3c8 Propagate proxy changes to csync at run time 2013-05-31 16:16:41 +02:00
Manuel Padron Martinez
b6ed959f98 Removes server url label if a custom url is defined
Signed-off-by: Manuel Padron Martinez <manolopm@gmail.com>
2013-05-31 04:46:26 +01:00
Manuel Padron Martinez
477953f965 Put wizard url customization before connect signals
Signed-off-by: Manuel Padron Martinez <manolopm@gmail.com>
2013-05-31 04:45:48 +01:00
Daniel Molkentin
aaf59cece5 Wizard: Normalize directory separators 2013-05-29 17:24:59 +02:00
Daniel Molkentin
e88b7e8ec2 Centralize User Agent string and use in UpdateDetector 2013-05-29 16:13:38 +02:00
Daniel Molkentin
078b09b5f4 Remove obsolete include 2013-05-29 16:12:42 +02:00
Daniel Molkentin
0d06fe764a Status dialog: Use correct font metrics
This avoids cutting charcters such as 'y'.
2013-05-29 14:46:02 +02:00
Daniel Molkentin
94f8c39a9e Proxy settings: Also keep proxy user/pwd
make sure not to use it when the user
has asked us not to.

Simplify setupProxy()
2013-05-29 12:56:23 +02:00
Daniel Molkentin
7d1bd9da86 Properly deal with SOCKS proxies
Fixes #10
2013-05-29 02:14:40 +02:00
Daniel Molkentin
ed8cdf6910 Remember proxy settings even after switching type
Fixes #649
2013-05-29 01:41:04 +02:00
Daniel Molkentin
7ee83847c8 Do not try to reset the wizard when visible 2013-05-29 01:30:00 +02:00
Daniel Molkentin
52eca1362f Delete QWizard on destruction 2013-05-29 01:29:56 +02:00
Daniel Molkentin
eec1af09c4 Wizard: Fix rich text label layouting 2013-05-29 01:17:12 +02:00
Daniel Molkentin
c651c8cbf9 Wizard: Improve wording. 2013-05-29 01:16:52 +02:00
Daniel Molkentin
da6a398624 Wizard: Warn on re-setup with multiple folders 2013-05-28 20:25:31 +02:00
Daniel Molkentin
1418512a9f More cheating on proxies: Add OS to User-Agent 2013-05-28 19:35:30 +02:00
Daniel Molkentin
dd2859880b Set User-Agent to contain Mozilla/5.0 string
A blatant lie for a blatant abuse of Firewall filters.
2013-05-28 15:44:41 +02:00
Daniel Molkentin
f38d8ba2e4 Improve wizard in edit mode 2013-05-28 14:51:49 +02:00
Daniel Molkentin
fdd52a2520 Kill non-boxed mode for now 2013-05-28 14:51:48 +02:00
Daniel Molkentin
e2c0792043 take local folder path from property
This gets set by slotSelectFolder() and from the wizards caller.
2013-05-28 14:51:41 +02:00
Daniel Molkentin
e8889530b0 Fix owncloud theme icon 2013-05-28 14:42:41 +02:00
Klaas Freitag
23f67d950a Handle password change correct, add "sync from scratch".
The setup wizard now destinguishes if there was already a configuration
or not. If yes, it's going to password-change mode. Also added a checkbox
that allows to start a sync from a cleared local directory.
2013-05-26 14:04:11 +02:00
Klaas Freitag
0bd1f507ab Added a checkbox "start sync from scratch". 2013-05-26 13:57:28 +02:00
Klaas Freitag
2bcfc143f6 Let the folderman create a new sync directory.
If a sync directory exists its moved to a backup path and created new.
That allows to start a sync "from scratch".
2013-05-26 13:56:51 +02:00
Klaas Freitag
9dc21bf8a3 Let the keychain return new creds during async save.
The credentials are asynchronously saved. The credentialstore now returns
the creds even if the saving has not yet finished but is running, for that
the new state AsyncWriting was added. That makes the start of the sync
after the password was changed more reliable.
2013-05-26 13:55:23 +02:00
Klaas Freitag
70f627ba06 Fix the folder setup wizard. 2013-05-24 09:54:48 +02:00
Daniel Molkentin
0683c26d41 Make setting custom folders work again
Also, ensure that opening the local directory from the wizard
will work on Windows.
2013-05-23 01:51:05 +02:00
Daniel Molkentin
dbc085d4d4 Fix systray class when built without FDO support 2013-05-22 17:39:49 +02:00
Daniel Molkentin
804eaa700e Remove bogus debug output 2013-05-22 15:58:54 +02:00
Daniel Molkentin
646922665d 1.3.0beta1 2013-05-22 15:34:19 +02:00
Daniel Molkentin
62ad2f19e3 Setup Wizard: Make server/folder buttons work 2013-05-21 14:25:31 +02:00
Daniel Molkentin
14f55420f9 Remove obsolete connect statement 2013-05-21 14:20:56 +02:00
Daniel Molkentin
d4ea0ba6ba Merge branch 'master' of git://github.com/gnumdk/mirall
Conflicts:
	CMakeLists.txt

As per PR 457
2013-05-20 16:54:49 +02:00
Daniel Molkentin
c06f7b7ecb Update README.md
Fixes #182.
2013-05-20 11:00:29 +02:00
Daniel Molkentin
3a50eece9e More theming refactoring 2013-05-17 20:56:17 +02:00
Daniel Molkentin
44f0fb0242 Fix broken include 2013-05-17 20:12:31 +02:00
Daniel Molkentin
c210e2b72f Remove obsolete miralltheme 2013-05-17 20:11:16 +02:00
Daniel Molkentin
7b5079f043 Amendment to previous commit 2013-05-17 18:27:07 +02:00
Daniel Molkentin
be4027fb36 Remove deleted file from resources 2013-05-17 18:13:14 +02:00
Daniel Molkentin
0f03b47a46 Make new connection wizard themable 2013-05-17 18:05:22 +02:00
Daniel Molkentin
c923e0803e Add SyncResult::SyncPrepare case to FileItemDialog 2013-05-17 12:33:02 +02:00
Daniel Molkentin
bd74dbbfc5 doc: markup fixes 2013-05-17 12:02:40 +02:00
Daniel Molkentin
a0599e75b7 Update build instructions for Mac OS 2013-05-17 11:42:19 +02:00
Klaas Freitag
f334b6349b Add a call to quit to make the thread ending the loop 2013-05-16 17:35:40 +02:00
Klaas Freitag
2ff9fcfa1d Fix crash if _thread is not initialized before. 2013-05-16 13:26:05 +02:00
Daniel Molkentin
aa23e4698b Correct spelling of some mac os meta files
Fixes #619
2013-05-14 23:15:22 +02:00
Daniel Molkentin
302fdeb1f9 Use UTF-8 for basic auth
Slightly off-specs, and fails for non UTF-8 setups,
but the ownCloud server itself expects UTF-8 encoding.
2013-05-09 22:01:39 +02:00
Daniel Molkentin
eea8542fc0 Quit app/abort sync gracefully. 2013-05-09 21:55:28 +02:00
Daniel Molkentin
a36d79e993 Fix make install 2013-05-04 17:01:14 +02:00
Daniel Molkentin
be5c1b2072 Fix build 2013-05-04 16:38:39 +02:00
Daniel Molkentin
f0bd1ea48e Add connectionvalidator class 2013-05-04 16:01:45 +02:00
Daniel Molkentin
90d0460a42 Remove dummy artwork, dead switches 2013-05-04 15:55:04 +02:00
Daniel Molkentin
c15ce2b20b Remove last traces of localRun 2013-05-04 15:16:53 +02:00
Daniel Molkentin
b51f210bfa Drop (broken) mirall binary
This remove all non-ownCloud backends, as well
as all obsolete wizard pages. CSync is now
a mandatory dependency.
2013-05-04 14:03:51 +02:00
Daniel Molkentin
105c76c055 Fix sizing problems in the new wizard dialog. 2013-04-30 21:51:48 +02:00
Daniel Molkentin
6b15b7a58f Update detector: make it possible to skip updates.
Fixes issue #588.
2013-04-30 17:46:07 +02:00
Daniel Molkentin
fee0aae975 new wizard: Better separate folder names in strings. 2013-04-30 17:46:07 +02:00
Klaas Freitag
b33b638d2d A bit more verbose troubleshooting documentation. 2013-04-30 13:53:33 +02:00
Klaas Freitag
1e677a5f0f Fixed default target dir to / and fixed logging text. 2013-04-30 13:53:13 +02:00
Klaas Freitag
3f3f6c0f39 Move setPlaceholderText to correct class. 2013-04-29 14:09:05 +02:00
Klaas Freitag
5dd53b48ef Add missing lineedit method for ancient Qt versions 2013-04-29 11:08:37 +02:00
Klaas Freitag
a215e11b20 Merge development branch with new setup dialog. 2013-04-29 10:20:01 +02:00
Daniel Molkentin
7d71f9dd2d Merge pull request #582 from ghmer/master
Fix messed formatting in build documentation
2013-04-29 00:34:53 -07:00
Jenkins for ownCloud
183f1574ca [tx-robot] updated from transifex 2013-04-29 01:26:56 +02:00
Jenkins for ownCloud
504b651bb9 [tx-robot] updated from transifex 2013-04-28 01:27:25 +02:00
Klaas Freitag
c848ff4bdb New setup dialog, simplified version. 2013-04-27 22:24:32 +02:00
Klaas Freitag
5aa8f5bc01 Added own CookieJar to not return a Session Cookie, rem Auth Callback
The auth callback is not needed as we send an Basic Auth header.
2013-04-27 22:22:20 +02:00
Klaas Freitag
6c5d5a543c Simplified config file write method, removed don't store pwd. 2013-04-27 22:21:28 +02:00
Klaas Freitag
a8bc849b5d Add blue ownCloud logo. 2013-04-27 22:20:33 +02:00
Klaas Freitag
5f535b9661 owncloud logo pixmap. 2013-04-27 21:07:39 +02:00
Klaas Freitag
eaf865539c Added owncloud logo for new setup dialog. 2013-04-27 21:07:00 +02:00
Mario Enrico Ragucci
75448c41d4 Verified format cleanup (really...)
Signed-off-by: Mario Enrico Ragucci <github@ragucci.de>
2013-04-26 17:02:55 +02:00
Mario Enrico Ragucci
afc96e2021 Format cleanup
Signed-off-by: Mario Enrico Ragucci <github@ragucci.de>
2013-04-26 15:47:49 +02:00
Daniel Molkentin
d7bce80c7b Merge pull request #580 from ghmer/master
Documentation Update cross-compiling section to include all libs needed to build the Windows Package
2013-04-26 04:41:20 -07:00
Mario Enrico Ragucci
7e07d20d31 Remove LOG4C information as this is not needed anymore
Signed-off-by: Mario Enrico Ragucci <github@ragucci.de>
2013-04-26 13:32:35 +02:00
Daniel Molkentin
238111be09 Find csync_version.h, local config.h 2013-04-26 10:48:02 +02:00
Klaas Freitag
6f0820a3ed Add QProgressIndicator to source list 2013-04-26 10:47:17 +02:00
Jenkins for ownCloud
1d0d1c249b [tx-robot] updated from transifex 2013-04-26 01:26:32 +02:00
Mario Enrico Ragucci
1b5ed68375 Formatting cleanup 2013-04-26 01:00:50 +02:00
Mario Enrico Ragucci
ce996b3fc8 - Update Cross-Compiling section: Listing of all needed libraries to successfully build the Windows installer package
- Adding a note about the missing cross-compiled LOG4C package
- Minor changes to the documentation to be more specific about building the Windows package
2013-04-26 00:45:19 +02:00
Daniel Molkentin
2789522948 Folder/ownCloudFolder: Clean up secondPath stuff 2013-04-25 16:06:31 +02:00
Daniel Molkentin
55a56cc275 Find csync_version.h, local config.h 2013-04-25 13:19:38 +02:00
Jenkins for ownCloud
20101527b2 [tx-robot] updated from transifex 2013-04-25 01:27:34 +02:00
Daniel Molkentin
311bd39100 Add simplified FancyLineEdit from Qt Creator to 3rdparty 2013-04-24 13:36:25 +02:00
Klaas Freitag
fab77a15f0 Fix build after merge 2013-04-24 13:33:26 +02:00
Klaas Freitag
09e7f5c618 Add qprogressindicator widget 2013-04-24 11:45:53 +02:00
Klaas Freitag
c5a674b1df More work on new Connection dialog. First working version. 2013-04-24 11:40:29 +02:00
Jenkins for ownCloud
f83453cfc7 [tx-robot] updated from transifex 2013-04-24 01:27:36 +02:00
Daniel Molkentin
1ca8ebebd9 Do not add shortcuts to non-existent files 2013-04-23 17:19:27 +02:00
Klaas Freitag
7cc73ed46c Merge feature branch that introduces non terminating csync. 2013-04-23 16:52:02 +02:00
Daniel Molkentin
01b4694b47 Bump version to distinguish nightlies 2013-04-23 16:49:15 +02:00
dragotin
bcc6d59c6b Update CONTRIBUTING.md 2013-04-23 12:35:44 +03:00
Daniel Molkentin
b4e2e5f586 1.2.5 ChangeLog 2013-04-22 15:48:21 +02:00
Jenkins for ownCloud
43ed874789 [tx-robot] updated from transifex 2013-04-22 15:28:38 +02:00
Klaas Freitag
8928c87fc3 Removed silly configDir hack from thread. 2013-04-22 15:06:28 +02:00
Daniel Molkentin
e3f8a918d6 Merge pull request #559 from ghmer/master
Fix for Issue #424
2013-04-22 04:01:22 -07:00
Daniel Molkentin
668bb94270 1.2.5 2013-04-22 12:46:16 +02:00
Daniel Molkentin
89e0543e0a Merge pull request #562 from fastfwd/master
Fix Issue #382 (Minor Windows Installer Issue: Missing descriptions on the "Choose Components" screen).
2013-04-22 03:41:17 -07:00
fastfwd
6695b50965 Fix Issue #382
Just a couple of typo/cut-and-paste errors.
2013-04-22 01:22:16 -07:00
Jenkins for ownCloud
5c02c85126 [tx-robot] updated from transifex 2013-04-21 01:26:18 +02:00
Mario Enrico Ragucci
de99c0c7e7 Silently ignore "installed = true" string in JSON string returned by status.php 2013-04-21 00:46:37 +02:00
Klaas Freitag
9f0348979b Simplify csyncthread with keeping csync ctx intact 2013-04-20 13:15:27 +03:00
Jenkins for ownCloud
5b5cd310b9 [tx-robot] updated from transifex 2013-04-20 01:27:05 +02:00
Daniel Molkentin
ea85d68a26 Revert non-working hack 2013-04-19 16:20:30 +02:00
Daniel Molkentin
fb0a883f7b Init member to 0, remove nonsensical if (foo) delete foo 2013-04-19 16:20:30 +02:00
Jenkins for ownCloud
64a0efe29a [tx-robot] updated from transifex 2013-04-19 01:26:30 +02:00
Daniel Molkentin
1f361b7260 Make certificateChain() thread safe
Fixes #487, #491, #454
2013-04-18 14:02:20 +02:00
Jenkins for ownCloud
763b06477d [tx-robot] updated from transifex 2013-04-18 01:28:59 +02:00
Klaas Freitag
cd7d2a0778 Set path for configure_file of desktop file. 2013-04-17 16:21:05 +02:00
Klaas Freitag
a4be3f304d Set log verbosity before calling csync_init. 2013-04-17 15:29:44 +02:00
Jenkins for ownCloud
88184d14d6 [tx-robot] updated from transifex 2013-04-17 01:53:47 +02:00
Daniel Molkentin
844d8eba47 Fix tr plural usage 2013-04-17 01:21:15 +02:00
Daniel Molkentin
5e65945a53 filitemdialog: more wording changes 2013-04-16 17:28:03 +02:00
Daniel Molkentin
428040762f fileitemdialog: GUI feedback for the copy action 2013-04-16 16:49:53 +02:00
Daniel Molkentin
30e0a13bc5 invalid password: Improve wording 2013-04-16 14:28:00 +02:00
Daniel Molkentin
275c2b1a6b Fix misleading balloon titles
Fixes #546
2013-04-16 11:24:07 +02:00
Jenkins for ownCloud
e409814cb6 [tx-robot] updated from transifex 2013-04-16 01:03:40 +02:00
Daniel Molkentin
acdb624713 safer approach for detecting duplicate sync runs 2013-04-15 15:55:54 +02:00
Daniel Molkentin
3cae8e7124 Remove debugging code 2013-04-15 14:32:23 +02:00
Jenkins for ownCloud
2595b9eae7 [tx-robot] updated from transifex 2013-04-15 01:02:18 +02:00
Jenkins for ownCloud
46a8561925 [tx-robot] updated from transifex 2013-04-14 01:02:45 +02:00
Jenkins for ownCloud
bb74cab887 [tx-robot] updated from transifex 2013-04-13 01:02:28 +02:00
Jenkins for ownCloud
dd7f58b9b9 [tx-robot] updated from transifex 2013-04-12 01:02:18 +02:00
Daniel Molkentin
ee080222d8 Bump version 2013-04-11 12:52:58 +04:00
Daniel Molkentin
c7aaa3ab28 Add 1.2.4 changelog 2013-04-11 12:34:33 +04:00
Daniel Molkentin
fcde01fd4c Clarify string in folder wizard 2013-04-11 10:57:19 +04:00
Jenkins for ownCloud
83be334ee8 [tx-robot] updated from transifex 2013-04-11 01:02:21 +02:00
Jenkins for ownCloud
819f76c2b9 [tx-robot] updated from transifex 2013-04-10 01:02:30 +02:00
Jenkins for ownCloud
783b16676f [tx-robot] updated from transifex 2013-04-09 01:09:43 +02:00
Klaas Freitag
aa6160ab62 Fixed some valgrind warnings. 2013-04-08 14:50:47 +02:00
Jenkins for ownCloud
8bae06802b [tx-robot] updated from transifex 2013-04-06 00:06:25 +02:00
Jenkins for ownCloud
a20f572448 [tx-robot] updated from transifex 2013-04-05 00:24:21 +02:00
Daniel Molkentin
f74aa1e9a6 terminate if more than one thread is being started. 2013-04-04 17:25:53 +02:00
Klaas Freitag
86525570aa Fix default config storage path. 2013-04-04 15:19:45 +02:00
Jenkins for ownCloud
d11ce781d0 [tx-robot] updated from transifex 2013-04-04 00:07:40 +02:00
Klaas Freitag
be5a50a000 Merge branch 'confdir' of https://github.com/smessmer/mirall into smessmer-confdir 2013-04-03 14:42:13 +02:00
dragotin
7309a894bc Merge pull request #477 from rominf/master
Fix for bug with folders adding
2013-04-03 04:39:17 -07:00
Jenkins for ownCloud
310f29d3fd [tx-robot] updated from transifex 2013-04-03 00:04:53 +02:00
Daniel Molkentin
07db03d6bc 1.2.3 2013-04-02 15:27:37 +02:00
Daniel Molkentin
d68c4b379f Unbreak self-signed certificate handling 2013-04-02 15:22:27 +02:00
Daniel Molkentin
396a12dfde Amend ChangeLog 2013-04-02 10:14:02 +02:00
Jenkins for ownCloud
c79f4f91a8 [tx-robot] updated from transifex 2013-04-02 00:05:14 +02:00
Klaas Freitag
bec2f7c9b9 Removed verbose logging on Win32. 2013-03-28 11:14:16 +01:00
Jenkins for ownCloud
d4c8cad0e2 [tx-robot] updated from transifex 2013-03-27 00:11:52 +01:00
Daniel Molkentin
0ad2bd4b91 Add favlink generation support for Nautilus 2013-03-25 18:00:58 +01:00
Daniel Molkentin
dcc8f9fa6c Fix favlink manual test 2013-03-25 18:00:25 +01:00
Markus Goetz
d7a93c74aa OS X: Fix creation of Finder Favorite 2013-03-25 14:57:34 +01:00
Daniel Molkentin
408547611b Manual test for favlinks 2013-03-25 12:53:40 +01:00
rominf
a8f0e79046 Skipping folders with no absolute path. 2013-03-23 10:48:37 +04:00
Jenkins for ownCloud
3e45147497 [tx-robot] updated from transifex 2013-03-23 00:07:09 +01:00
Daniel Molkentin
48310d3f5e Add 1.2.2 changelog 2013-03-22 14:59:22 +01:00
Daniel Molkentin
1831a975eb SSLErrorDialog: We cannot use the existing key chain
... use the one returned by the new server instead.
2013-03-22 14:59:22 +01:00
Jenkins for ownCloud
a766a44bcf [tx-robot] updated from transifex 2013-03-22 12:08:57 +01:00
Cedric Bellegarde
8165b83a27 Check for service availability 2013-03-22 11:58:55 +01:00
Cedric Bellegarde
fa62c270e6 Merge git://github.com/owncloud/mirall 2013-03-22 11:40:58 +01:00
Cedric Bellegarde
c03199e78a Re add space 2013-03-22 11:35:25 +01:00
Cedric Bellegarde
f346503534 Better fdo detection 2013-03-22 11:34:21 +01:00
Jenkins for ownCloud
287f1c55ff [tx-robot] updated from transifex 2013-03-22 00:05:37 +01:00
Daniel Molkentin
1c6523bcec Add plugin for screenreader support 2013-03-21 17:49:03 +03:00
Daniel Molkentin
337c6d3e4e Try to avoid crash on Mac OS during setup
... by moving setupFavLink to a place only called
if the folder to be referenced exists for sure.
2013-03-21 12:50:47 +01:00
Jenkins for ownCloud
4a57957420 [tx-robot] updated from transifex 2013-03-21 00:05:23 +01:00
Daniel Molkentin
c633302f31 Use the certificateChain() in the SSL error dialog
This includes the self-signed certificate anyway, and the previous
behavior led to funny side-effects.
2013-03-20 15:53:55 +01:00
Cedric Bellegarde
1315ca2a57 Move files to correct location 2013-03-20 10:19:55 +01:00
Cedric Bellegarde
2f0474a467 Add support for freedesktop notifications 2013-03-20 10:03:49 +01:00
Daniel Molkentin
db95e7291d bump version 2013-03-19 16:30:17 +01:00
Klaas Freitag
ae54c27805 Added office doc lock files. 2013-03-19 16:20:00 +01:00
Daniel Molkentin
284285d441 Do not follow symlinks when recursing
We do not support symlinks anyway
2013-03-18 14:12:25 +01:00
Jenkins for ownCloud
2554a67cc7 [tx-robot] updated from transifex 2013-03-15 00:08:00 +01:00
Jenkins for ownCloud
e2cccd8615 [tx-robot] updated from transifex 2013-03-13 00:07:52 +01:00
Jenkins for ownCloud
948a98a871 [tx-robot] updated from transifex 2013-03-12 00:15:38 +01:00
Daniel Molkentin
b50d201154 Merge pull request #423 from hefee/master
adding WITH_DOC parameter to cmake
2013-03-11 08:28:51 -07:00
hefee
25a3ceb94d adding WITH_DOC parameter to cmake
Fixes #412
2013-03-11 16:18:20 +01:00
Jenkins for ownCloud
c514fe371a [tx-robot] updated from transifex 2013-03-10 00:08:00 +01:00
Jenkins for ownCloud
9169c70efe [tx-robot] updated from transifex 2013-03-09 00:07:47 +01:00
Jenkins for ownCloud
3c07cea229 [tx-robot] updated from transifex 2013-03-08 00:27:56 +01:00
Klaas Freitag
d3f51c611f Some more troubleshooting details. 2013-03-06 08:51:04 +01:00
Jenkins for ownCloud
21123bb029 [tx-robot] updated from transifex 2013-03-04 00:09:00 +01:00
Jenkins for ownCloud
fb8d11650c [tx-robot] updated from transifex 2013-03-03 00:08:15 +01:00
Jan-Christoph Borchardt
2c250050d5 add http and https icons for connection feedback 2013-03-01 16:09:10 +01:00
Jenkins for ownCloud
e9b3cbf3f7 [tx-robot] updated from transifex 2013-02-28 00:07:02 +01:00
Jenkins for ownCloud
d31a6e6179 [tx-robot] updated from transifex 2013-02-27 00:10:59 +01:00
Klaas Freitag
26d8c213b0 Updated Changelog. 2013-02-26 12:08:40 +01:00
Daniel Molkentin
bcb9491f6a RC1 -> final 2013-02-26 11:32:32 +01:00
Klaas Freitag
9d2c3ebad3 Move config.h out of header files. 2013-02-25 09:54:19 +01:00
Daniel Molkentin
ad063b0634 Make chinese translations work on OS X
... by mapping chinese script codes to country
 codes as used by Qt and Transifex.
2013-02-24 15:44:38 +01:00
Daniel Molkentin
8765538458 Be more permission when loading languages
Accept languages when they only exist for mirall,
but not for Qt and QtKeychain (Fixes #359). This
is more permissive than before, but while fixing
#359, it became evident that supporting "partial"
translations might actually be beneficial.
2013-02-24 15:44:38 +01:00
Jenkins for ownCloud
dd4aa14a8c [tx-robot] updated from transifex 2013-02-23 00:06:50 +01:00
Jenkins for ownCloud
99814539eb [tx-robot] updated from transifex 2013-02-22 00:10:10 +01:00
Daniel Molkentin
dbec98ff48 Manual update of avail translations 2013-02-21 18:35:33 +03:00
Daniel Molkentin
e2e14f2184 Do not install docs on OS X 2013-02-21 15:26:31 +01:00
Daniel Molkentin
e85291c4ba en language is implied 2013-02-21 15:17:13 +01:00
Klaas Freitag
58a5405343 Dont do the doc build step on every build. 2013-02-21 14:01:16 +01:00
Klaas Freitag
4ba85311da Handle all cases in switches. 2013-02-21 13:36:51 +01:00
Daniel Molkentin
3cf7003101 Load UI languages instead of locales where possible
Load Qt translations consistently along the way.
This only has been verified on mac and needs adoption
for win32.
2013-02-21 13:19:54 +01:00
Klaas Freitag
ae558a5889 Add a appNameGUI method to the theming. 2013-02-21 12:21:42 +01:00
Jenkins for ownCloud
0b0b762c6c [tx-robot] updated from transifex 2013-02-21 00:13:24 +01:00
Klaas Freitag
55a4fd752d Fix commit fd83bf - add treewalk success check. 2013-02-20 17:26:07 +01:00
Klaas Freitag
136b699106 Make sure to restart sync after folder add. 2013-02-20 16:06:46 +01:00
Klaas Freitag
fd83bf2089 Remove unused variable doTreeWalk. 2013-02-20 10:06:45 +01:00
Jenkins for ownCloud
75f075feb0 [tx-robot] updated from transifex 2013-02-20 00:04:39 +01:00
Klaas Freitag
817039ddf3 Simplify and fix startup: Steer starting of sync from folderman. 2013-02-19 17:24:10 +01:00
Klaas Freitag
6d6deaf6c4 Setup folders added after setup wizard ended. 2013-02-19 12:04:36 +01:00
Klaas Freitag
9c63b89bac Removed useless warning. 2013-02-19 09:34:33 +01:00
Jenkins for ownCloud
2a6e084219 [tx-robot] updated from transifex 2013-02-19 00:08:08 +01:00
Klaas Freitag
ec120cd64c Make folderman load folders at start and update later. 2013-02-18 18:31:29 +02:00
Klaas Freitag
a9173b1aa1 Add setters for update check and max log lines 2013-02-18 17:17:03 +02:00
Klaas Freitag
89f7f75af2 If a new server is configured, take the proxy config to the new config
file.
2013-02-18 17:16:10 +02:00
Daniel Molkentin
8809ac0c4a remove unused connect 2013-02-18 14:56:50 +01:00
Daniel Molkentin
7a03164a9a Handle server offline state on application start gracefully 2013-02-18 14:56:50 +01:00
Jenkins for ownCloud
406254cd04 [tx-robot] updated from transifex 2013-02-18 00:07:57 +01:00
Jenkins for ownCloud
f01eeed9d0 [tx-robot] updated from transifex 2013-02-17 00:27:55 +01:00
Jenkins for ownCloud
5b6439e29d [tx-robot] updated from transifex 2013-02-16 00:07:02 +01:00
Daniel Molkentin
38954c2193 Remove obsolete signal. 2013-02-15 19:29:38 +01:00
Daniel Molkentin
5954fb280c Centralize error handling for csync steps
...as a preparation for offline handling.
As a side-effect, removed the last instance
of goto in mirall.
2013-02-15 19:29:27 +01:00
Daniel Molkentin
8e63652fb3 Send OEM string to update detector. 2013-02-15 18:39:25 +01:00
Jenkins for ownCloud
365dfd5380 [tx-robot] updated from transifex 2013-02-15 00:08:10 +01:00
Daniel Molkentin
1c70fb3ba4 Set csync config dir in mirall properly
Otherwise canceling the sync cannot remove the lock file
2013-02-14 17:36:11 +01:00
Daniel Molkentin
e5af8e87b3 Fix crash when pausing mirall. 2013-02-14 17:36:11 +01:00
Daniel Molkentin
bfbec24f43 Add more debug in case inotify fails
We should probably make this at least a visible error, because it's a
limitation set by the kernel/the distro and we would require root
permissions to adjust the value.

Right now all that happens is that syncing is not immediate, but only
run every 30 secs (due to server polling).
2013-02-14 17:36:11 +01:00
Daniel Molkentin
8dd97a358a Introduce SyncPrepare state
SyncPrepare is when the folder class prepares the actual syncing,
i.e. does treewalks and runs the reconceiler in case of mirall. The actual
SyncRunning state will only be entered if there is actually anything to
sync.

Fixes #289
2013-02-14 17:36:11 +01:00
Daniel Molkentin
7290afc6fe Minimize Sync notification notification
Notifies only in the end of a complete sync run now

Migitates/fixes #314
2013-02-14 17:36:11 +01:00
Daniel Molkentin
2ba20369ea Remove unused gitfolder class for now 2013-02-14 17:36:11 +01:00
Daniel Molkentin
804aef6548 Remove stray code 2013-02-14 17:36:11 +01:00
Daniel Molkentin
85f49b6af4 Fix guard position 2013-02-14 17:36:11 +01:00
Daniel Molkentin
68afc6011d proxy dialog: no extra heading 2013-02-14 17:36:11 +01:00
Daniel Molkentin
524ffcd0e1 owncloud setup: Fix label style 2013-02-14 17:36:11 +01:00
Jenkins for ownCloud
a7303205b4 [tx-robot] updated from transifex 2013-02-14 00:08:08 +01:00
Jenkins for ownCloud
8a06b2d136 [tx-robot] updated from transifex 2013-02-13 00:06:54 +01:00
Daniel Molkentin
7ba8a55fa5 Merge pull request #313 from hefee/doc2default
creating doc to default target
2013-02-12 11:48:00 -08:00
Daniel Molkentin
ee7dc8e1c5 Merge pull request #312 from hefee/master
usefull manpages for owncloud and mirall
2013-02-12 11:47:41 -08:00
Jenkins for ownCloud
3556f90d68 [tx-robot] updated from transifex 2013-02-12 00:20:28 +01:00
Klaas Freitag
6d984b505d Handle not stored password correctly. 2013-02-11 14:21:53 +01:00
Klaas Freitag
8d9336f9f4 Removed obsolete scheduler start. 2013-02-11 14:21:21 +01:00
Klaas Freitag
2b5e694181 Set default argument to method. 2013-02-11 14:20:32 +01:00
Klaas Freitag
aa983e4966 Make user password dialog real async working. 2013-02-11 14:18:45 +01:00
Klaas Freitag
424b3a9dfc cleanup comments and dupes. 2013-02-11 14:18:16 +01:00
Jenkins for ownCloud
5a3bc7af9a [tx-robot] updated from transifex 2013-02-11 00:05:57 +01:00
Klaas Freitag
4501ec10dc Make sure that journals are wiped if server changes + some utility
functions.
2013-02-10 20:04:03 +01:00
Klaas Freitag
699ae176df Revert "Allow setting of custom poll interval through status.php"
This reverts commit 39a89e8fc7.

Conflicts:
	src/mirall/folderman.cpp
	src/mirall/folderman.h
2013-02-10 14:57:57 +01:00
Klaas Freitag
9297b3b850 Add chrome download file to exclude list 2013-02-10 14:48:17 +01:00
Klaas Freitag
cac5f81388 Clear pending network requests in setup wizard on back. 2013-02-10 14:03:09 +01:00
Klaas Freitag
28af8068e9 Always return QNetworkReply* on mkdir and also on checkInstall. 2013-02-10 14:01:38 +01:00
Sebastian Kügler
a1d64af7b1 API additions for the Plasma client
This patch contains a few (source-compatible) API additions needed for
the Plasma client.

* return QNetworkReply* to caller for tracking status and error of
  requests such as mkdir, getWebDAVPath and getRequest
* Add a setter for the QNetworkAccessManager. This allows us to route at
  least some of the network requests through KIO in the Plasma client
* Add a setter for the remotePollInterval. This should be enough API to
* make it possible to adapt the polling interval to the client's machine
  state, e.g. sync less often on battery, or somesuch
2013-02-10 13:10:53 +01:00
dragotin
edbb79b79c Merge pull request #5 from sebasje/mkdirreply
Return QNetworkReply from remote mkdir
2013-02-10 02:34:36 -08:00
dragotin
a000a7b52e Merge pull request #4 from sebasje/requestreply
Return QNetworkReply from getRequests
2013-02-10 02:34:14 -08:00
Klaas Freitag
0a427541d6 Added config file setter for poll interval. Thx for pull request. 2013-02-10 11:27:21 +01:00
Klaas Freitag
1c297c56a2 Stop authentication tries already after the first attempt without
success.
2013-02-10 11:02:39 +01:00
Klaas Freitag
6f9bbc431d Properly stop syncing when connection manager opens. 2013-02-10 11:02:39 +01:00
Klaas Freitag
f62626e3eb Delete existing folders properly before adding new ones. 2013-02-10 11:02:38 +01:00
Jenkins for ownCloud
28fcd75494 [tx-robot] updated from transifex 2013-02-10 00:11:52 +01:00
Klaas Freitag
39a89e8fc7 Allow setting of custom poll interval through status.php 2013-02-09 14:04:04 +01:00
Klaas Freitag
38a8096732 Fixed sorting of header entries, ie. public / protected / private. 2013-02-09 14:03:05 +01:00
Klaas Freitag
d358c839ce Fixed typos. 2013-02-09 12:46:08 +01:00
hefee
17901e7bc7 fixing typo in mirall.1.rst 2013-02-09 12:28:43 +01:00
hefee
0ea16c04cc moving description of config file and client optinos to own files.
* split usage to three files: usage, conffile, options
* fixing minor typos in mirall.1.rst and owncloud1.rst
* owncloud.1 uses include conffile, options
* mirall.1 uses include conffile, options
* Fixes: #183
2013-02-09 12:23:32 +01:00
Klaas Freitag
f1e0cd1c9c Cleaned up used icons. 2013-02-09 10:32:29 +01:00
hefee
e1f404a011 adding maclocation 2013-02-09 10:30:56 +01:00
hefee
69715d2182 merging from owncloud/master 2013-02-09 10:16:38 +01:00
hefee
0285213140 removing asciidoc, now creating manpages via sphinx again 2013-02-09 10:10:23 +01:00
hefee
1a907f23f0 moving generation of manpages to sphinx
--HG--
rename : doc/mirall.1.txt => doc/mirall.1.rst
rename : doc/owncloud.1.txt => doc/owncloud.1.rst
2013-02-09 10:05:45 +01:00
Jenkins for ownCloud
1296be71ed [tx-robot] updated from transifex 2013-02-09 00:15:51 +01:00
hefee
0ebcdbbb3f no more different cmake parameter is needed 2013-02-08 18:57:25 +01:00
dragotin
891ced0fca Merge pull request #318 from LukeOwncloud/patch-1
Update doc/usage.rst
2013-02-08 09:45:30 -08:00
dragotin
6276bb3873 Merge pull request #322 from hefee/soname
adding soname version to libowncloudsync and libmirallsync
2013-02-08 09:42:32 -08:00
Klaas Freitag
dbb0cbaff8 Removed build of obsolete mirallsync lib which is equal to owncloudsync. 2013-02-08 19:18:36 +01:00
Sandro Knauß
cfa777260c removing version for mirallsync (it is'nt build anymore :) 2013-02-08 18:37:29 +01:00
Sandro Knauß
66fc273db6 merging with default 2013-02-08 18:36:26 +01:00
hefee
9c9e377cf4 adding soname version to libowncloudsync and libmirallsync 2013-02-08 18:21:59 +01:00
Jenkins for ownCloud
f75eb24bfe [tx-robot] updated from transifex 2013-02-08 00:14:28 +01:00
LukeOwncloud
a617a04295 Update doc/usage.rst 2013-02-07 08:50:49 +01:00
Jenkins for ownCloud
dc16f277ce [tx-robot] updated from transifex 2013-02-07 00:12:34 +01:00
Klaas Freitag
07258deaaf Fix build for mirall target. 2013-02-06 15:05:34 +01:00
Klaas Freitag
7b53e0f953 Fix return from non void function. 2013-02-06 14:58:31 +01:00
Klaas Freitag
2ac764bd1a Fix compile without OWNCLOUD_CLIENT define, thx Jenkins 2013-02-06 11:58:14 +02:00
Klaas Freitag
82d2851a6b Set username in connection dialog if there. 2013-02-06 11:42:36 +02:00
Klaas Freitag
7a3be71452 The user name is not really to be protected. 2013-02-06 11:41:47 +02:00
Klaas Freitag
977a513ee5 Always set the connect result to en/disable the Finish button. 2013-02-06 11:21:50 +02:00
Klaas Freitag
22cbebb7a7 Fix build on debian with ancient Qt, thanks Mr. Jenkins for notifying. 2013-02-06 10:41:25 +02:00
Klaas Freitag
72b2e6778a Use new ownCloudInfo / CredentialStore interface. 2013-02-06 10:09:02 +02:00
Klaas Freitag
08babbf38d Set credentials in ownCloudInfo after these have been fetched. 2013-02-06 10:09:02 +02:00
Klaas Freitag
2ae5ae6962 Change interface to not support customHandles. 2013-02-06 10:09:02 +02:00
Klaas Freitag
fa6331a40a Removed use of CredentialStore from class and added setter for
credentials.

This makes handling of temporar credentials for the setup dialog easier
and streamlines the code.
2013-02-06 10:09:02 +02:00
Klaas Freitag
cece465947 Link libdl explicitely. 2013-02-06 10:09:02 +02:00
Jenkins for ownCloud
3f97047abc [tx-robot] updated from transifex 2013-02-06 00:07:36 +01:00
Daniel Molkentin
b6d5213880 Add suffix, to be added with -DVERSION_SUFFIX=... 2013-02-05 15:42:53 +01:00
Daniel Molkentin
0bcb65db29 Do not allow to press Finished if connection to the server fails
This does not yet consider cases where the connection
succeeds but webdav fails.
2013-02-05 15:40:59 +01:00
Klaas Freitag
7734656ae3 Make mirall packager for win bundle the new openSSL dlls. 2013-02-05 14:37:39 +01:00
Klaas Freitag
c14e17e271 Set to version 1.2.1pre 2013-02-05 14:37:39 +01:00
hefee
1f4ea2c60e only add instalation dir if we are creating doc 2013-02-04 18:31:48 +01:00
hefee
edb4ff6b98 adding doc to default if CREATEDOC is set 2013-02-04 18:10:51 +01:00
Sandro Knauß
279bb47ab4 add creating manpages to CMakeLists 2013-02-04 17:36:56 +01:00
Sandro Knauß
7ef92748ea adding manpages for mirall and owncloud 2013-02-04 16:56:39 +01:00
Sandro Knauß
0e6e614318 adding --monoicons option to usage.rst 2013-02-04 16:55:50 +01:00
Jenkins for ownCloud
a5b6c3add7 [tx-robot] updated from transifex 2013-02-04 00:07:05 +01:00
Daniel Molkentin
fd30d8b0d1 Typo 2013-02-03 13:39:34 +01:00
Daniel Molkentin
5944acf8a6 Hack: Do not leak FDs when neon is built with gnutls (Linux)
Previously, this would cause Mirall to crash sooner or later.

Fixes #154
2013-02-03 13:37:03 +01:00
Jenkins for ownCloud
58ace7c774 [tx-robot] updated from transifex 2013-02-02 00:09:05 +01:00
Jenkins for ownCloud
a07444412b [tx-robot] updated from transifex 2013-02-01 00:20:42 +01:00
mjkent
339f59a4e8 Merge pull request #284 from mjkent/854852959c95935efd8902f05d9935b04bb9f04c
Improve command line argument handling
2013-01-31 15:00:37 -08:00
Jenkins for ownCloud
4beb9b3efc [tx-robot] updated from transifex 2013-01-31 00:33:28 +01:00
Daniel Molkentin
a04cf32a69 No need to ship ocsync.conf 2013-01-30 09:48:45 +01:00
Jenkins for ownCloud
746c0359d2 [tx-robot] updated from transifex 2013-01-30 00:27:40 +01:00
Michael Kent
854852959c Changes to handling of command line options. Fix a segmentation fault with owncloud --help. Add -h as help short. If a commandline argument isn't recognized, print that it isn't recognized, print help, and abort. 2013-01-28 22:19:14 -06:00
Daniel Molkentin
1e1751e451 sign_dmg.sh: increase wait time for dmg mount 2013-01-28 21:04:43 +01:00
Jenkins for ownCloud
7cd0179adc [tx-robot] updated from transifex 2013-01-28 00:06:52 +01:00
Jenkins for ownCloud
c0543cdbaf [tx-robot] updated from transifex 2013-01-27 00:07:31 +01:00
Daniel Molkentin
d681066dc2 Results bubble: _localPrefix might not end in a separator 2013-01-26 20:47:20 +01:00
Jenkins for ownCloud
b81939bff5 [tx-robot] updated from transifex 2013-01-26 00:11:18 +01:00
Daniel Molkentin
f8685c97f1 CPack: more parameterization 2013-01-25 15:59:13 +01:00
Daniel Molkentin
11e06c33db Fix compilation on win/mac 2013-01-25 15:46:23 +01:00
Daniel Molkentin
c0f2f5bcaa Load Qt translations from app dir/bundle, too 2013-01-25 15:41:18 +01:00
Daniel Molkentin
bfee6402a6 Simplify NSIS template 2013-01-25 12:56:00 +01:00
Klaas Freitag
4fac62560e Removed remove of list of configured sync folder on reconfiguration.
The removal of the configured folders was needed as long as the
csync journal was based in on the folder name of the sync folder.
Now that every folder has its own sync journal its not longer needed.
2013-01-25 11:33:00 +01:00
Jenkins for ownCloud
d780055b0e [tx-robot] updated from transifex 2013-01-25 00:07:05 +01:00
Jenkins for ownCloud
3f5c53425b [tx-robot] updated from transifex 2013-01-24 00:08:40 +01:00
Jenkins for ownCloud
08f90ce3a6 [tx-robot] updated from transifex 2013-01-23 16:25:33 +01:00
Jenkins for ownCloud
6ee70a852a [tx-robot] updated from transifex 2013-01-23 16:06:47 +01:00
Klaas Freitag
4908dbdee8 Updated Changelog for the 1.2.0 release. 2013-01-23 16:04:29 +01:00
Jenkins for ownCloud
a6573c21e7 [tx-robot] updated from transifex 2013-01-23 15:30:18 +01:00
Daniel Molkentin
aca965f111 Fix favlink generation on windows 2013-01-23 17:22:38 +03:00
Klaas Freitag
01a8ab7bf0 Set version to final version 1.2.0 2013-01-23 15:19:26 +01:00
Daniel Molkentin
5dbd987df3 Mirall != owncloud client. Move about dialog to theme. 2013-01-23 13:45:50 +01:00
Daniel Molkentin
e37fc8c6e5 tr: Don't hardcode app name in string 2013-01-23 13:45:50 +01:00
Klaas Freitag
7614776e10 Fixed isComplete() for credential setup dialog. 2013-01-23 10:57:45 +01:00
Klaas Freitag
4ea4c70443 Minor: Fixed a typo. 2013-01-23 10:57:45 +01:00
Jenkins for ownCloud
ec1946a9ff [tx-robot] updated from transifex 2013-01-23 00:07:29 +01:00
Daniel Molkentin
e0332deffc SSL: Use better test.
The other one was not working anyway.
2013-01-22 15:29:14 +01:00
Daniel Molkentin
afe6caf406 Remove stray object 2013-01-22 15:29:14 +01:00
Klaas Freitag
1385aab65d Changed FindCSync module to not check relative pathes + docu. 2013-01-22 15:08:56 +01:00
Klaas Freitag
862a9d938c Handle missed case in switch statement. 2013-01-22 15:08:04 +01:00
Klaas Freitag
80108727c4 Linux: Work around keychain shortcoming if chain does not contain
a password entry.
2013-01-22 12:08:56 +01:00
Klaas Freitag
84e3d6278d Check for empty user in keychain key. 2013-01-21 18:36:03 +01:00
Klaas Freitag
a1bf324f47 normilize url before writing, error checks. 2013-01-21 16:33:52 +01:00
Klaas Freitag
1b8f7059e3 Fix pre initialization of _state in fetchCredentials(). 2013-01-21 15:23:44 +01:00
Daniel Molkentin
b9fe6f2aed bump version (pre-beta3) 2013-01-21 13:35:42 +01:00
Daniel Molkentin
7794480da0 csync: Put up the QNAM key chain for comparison
Comparing with the CA certs will not help with
intermediates, and other cases.
2013-01-21 13:33:33 +01:00
Daniel Molkentin
0171b8b998 Make hash formatting static
no need for class instanciation.
2013-01-21 13:33:33 +01:00
Klaas Freitag
915764cc52 If credentials are ok, do not fetch them again from store. 2013-01-21 13:32:52 +01:00
Klaas Freitag
381aa701ce Add a another default Category to make desktop file check happy. 2013-01-21 11:43:40 +01:00
Klaas Freitag
76653fcedb Minor: removed bogus stuff. 2013-01-21 11:43:39 +01:00
Jenkins for ownCloud
dd0cfec225 [tx-robot] updated from transifex 2013-01-21 00:06:38 +01:00
Jenkins for ownCloud
67b64e0816 [tx-robot] updated from transifex 2013-01-20 00:07:44 +01:00
Jenkins for ownCloud
7552f5e5da [tx-robot] updated from transifex 2013-01-19 00:06:40 +01:00
Daniel Molkentin
9af862b455 Fix make install, clean up 2013-01-18 22:15:08 +01:00
Jenkins for ownCloud
f26f7646ba [tx-robot] updated from transifex 2013-01-18 00:05:58 +01:00
Daniel Molkentin
0f36dc03c4 FileItemDialog: Add copy to clipboard functionality 2013-01-17 10:35:08 +01:00
Jenkins for ownCloud
36b385ed54 [tx-robot] updated from transifex 2013-01-17 00:29:16 +01:00
Daniel Molkentin
5e3f2cf25a Remove legacy configuration options.
They were not used anyway.
2013-01-16 18:03:40 +01:00
Daniel Molkentin
8b0cfab2b2 Ignore Mac OS custom folder icons 2013-01-16 17:51:25 +01:00
Daniel Molkentin
f678629734 Fix proxy auth
- The port was not set correctly
- The password was read base64 encoded, but not read stored as such
2013-01-16 17:50:26 +01:00
Daniel Molkentin
635cb4dc7c NSIS: Remove GnuTLS remainders 2013-01-16 14:41:12 +01:00
Daniel Molkentin
87df74e4d0 Fix: pause icon not visible 2013-01-16 14:41:12 +01:00
Daniel Molkentin
45c82a2746 Go offline when server is in maintenance. 2013-01-16 14:41:12 +01:00
Jenkins for ownCloud
d3c55c2b7c [tx-robot] updated from transifex 2013-01-16 00:22:56 +01:00
Klaas Freitag
bc3938daa7 A new sync file protocol dialog. 2013-01-15 20:42:09 +01:00
Jenkins for ownCloud
4d4b509ac3 [tx-robot] updated from transifex 2013-01-15 00:06:13 +01:00
Lukas Reschke
304b484529 Typo 2013-01-14 16:40:01 +01:00
Daniel Molkentin
7025d612c1 Fix c&p error 2013-01-14 16:28:07 +01:00
Daniel Molkentin
2eb9406611 add CONTRIBUTING.md and reporting template for mirall 2013-01-14 12:33:49 +01:00
Klaas Freitag
07034daffe Take valid caList from QSslSocket::defaultCA. 2013-01-14 12:13:51 +01:00
Klaas Freitag
dca8ecb929 Remove bogus spaces. 2013-01-14 12:13:50 +01:00
Klaas Freitag
dd2eecec42 Remove bogus reset after creds were written. 2013-01-14 12:13:50 +01:00
Klaas Freitag
72ba4213d5 Push to beta version 2. 2013-01-14 12:13:50 +01:00
Klaas Freitag
11dbacab60 Exclude desktop file handling for windows platform. 2013-01-14 12:13:50 +01:00
Sebastian Meßmer
4caca2ce1a The configuration directory is a static attribute in mirallconfigfile class 2013-01-14 00:48:26 +01:00
Jenkins for ownCloud
90e39e34e9 [tx-robot] updated from transifex 2013-01-14 00:19:22 +01:00
Jenkins for ownCloud
9a7171068d [tx-robot] updated from transifex 2013-01-13 00:09:52 +01:00
Jenkins for ownCloud
bb2a3590ad [tx-robot] updated from transifex 2013-01-12 00:12:20 +01:00
Daniel Molkentin
280dd205d9 setup wizard: Improve wording and context 2013-01-11 17:10:31 +01:00
Jenkins for ownCloud
2a722644b2 [tx-robot] updated from transifex 2013-01-11 00:07:26 +01:00
Daniel Molkentin
de69bb9448 build fix 2013-01-10 17:24:06 +01:00
Daniel Molkentin
5c495265f4 Consolidate theming support.
This implements out-of-repository-theming, and removes the old
custom.ini theming that never worked on all platforms and had
no straight deployment story.

The new approach requires the CMAKE variable OEM_THEME_DIR to
point to a directory that must at least contain an OEM.cmake file
(check OWNCLOUD.cmake for possible options) as well as a themes.qrc
and a themes/ directory that directly correspond to the ones in
the source tree.
2013-01-10 17:16:59 +01:00
Daniel Molkentin
9cdf2d8150 Remove potentially dangerous processEvent calls 2013-01-10 17:16:58 +01:00
Jenkins for ownCloud
6af1a52305 [tx-robot] updated from transifex 2013-01-10 00:06:57 +01:00
Klaas Freitag
703002bafa Set path to neon-config file in cmake toolchain file. 2013-01-09 15:08:25 +01:00
Jenkins for ownCloud
8104e4bde9 [tx-robot] updated from transifex 2013-01-08 00:33:20 +01:00
Jenkins for ownCloud
763dbfc397 [tx-robot] updated from transifex 2013-01-04 13:26:11 +01:00
Sebastian Meßmer
e0645b4b63 Allow setting the configuration directory on command line 2013-01-02 19:08:14 +01:00
Jenkins for ownCloud
f714759ec7 [tx-robot] updated from transifex 2013-01-02 00:06:16 +01:00
Jenkins for ownCloud
8168e9cca1 [tx-robot] updated from transifex 2012-12-31 00:06:30 +01:00
Jenkins for ownCloud
be470b71ea [tx-robot] updated from transifex 2012-12-30 00:06:49 +01:00
Jenkins for ownCloud
216f39e9bc [tx-robot] updated from transifex 2012-12-29 00:09:42 +01:00
Jenkins for ownCloud
486c4481d8 [tx-robot] updated from transifex 2012-12-28 00:21:26 +01:00
Jenkins for ownCloud
6a154c139f [tx-robot] updated from transifex 2012-12-27 00:06:31 +01:00
Jenkins for ownCloud
d559ac513e [tx-robot] updated from transifex 2012-12-26 00:13:40 +01:00
Jenkins for ownCloud
c2c89c6c6b [tx-robot] updated from transifex 2012-12-25 00:12:20 +01:00
Jenkins for ownCloud
af76c77b18 [tx-robot] updated from transifex 2012-12-24 00:13:14 +01:00
Jenkins for ownCloud
c4be5107df [tx-robot] updated from transifex 2012-12-23 00:11:23 +01:00
Jenkins for ownCloud
c13218d647 [tx-robot] updated from transifex 2012-12-22 00:28:19 +01:00
Daniel Molkentin
4ce55a44ba Klaas > Danimo, I am rather unpolite...
Also, fix whitespace errors
2012-12-21 01:16:54 +01:00
Jenkins for ownCloud
905891683b [tx-robot] updated from transifex 2012-12-21 00:13:21 +01:00
Klaas Freitag
f4019f5a5a Show backend error messages to user. 2012-12-20 20:51:43 +01:00
Daniel Molkentin
b7aec51ed8 Bump to 1.2.0beta1 2012-12-20 20:43:41 +01:00
Daniel Molkentin
e6b9c16d04 Update About dialog 2012-12-20 20:35:21 +01:00
Daniel Molkentin
488943aaa0 Correct inheritance in status dialog 2012-12-20 17:36:10 +01:00
Klaas Freitag
c3f6153f94 Fixed QString -> const char* conversions to handle UTF8 correctly. 2012-12-20 16:49:29 +01:00
Klaas Freitag
87aa3d7c60 More detailed error handling. 2012-12-20 16:49:29 +01:00
Klaas Freitag
144a2832b9 Loop over all certificates to match the approved one. 2012-12-20 16:49:29 +01:00
Daniel Molkentin
26c01cefa7 New icons for ownCloud client
--monoicons shows platform-specific monochrome icons
for now until we have a proper settings dialog.
2012-12-20 16:41:54 +01:00
Jenkins for ownCloud
91b58bdb3f [tx-robot] updated from transifex 2012-12-20 00:14:32 +01:00
Jenkins for ownCloud
b97d9a4fa9 [tx-robot] updated from transifex 2012-12-19 00:05:10 +01:00
Jenkins for ownCloud
83a1663750 [tx-robot] updated from transifex 2012-12-18 00:17:17 +01:00
Jenkins for ownCloud
76f571f9a9 [tx-robot] updated from transifex 2012-12-16 00:13:18 +01:00
Jenkins for ownCloud
8c53f6ff49 [tx-robot] updated from transifex 2012-12-15 00:13:14 +01:00
Daniel Molkentin
08ab13dc4b Doc: More missing packages 2012-12-14 21:11:19 +01:00
Daniel Molkentin
aac9b770fc Details on windows builds 2012-12-14 20:42:59 +01:00
Jenkins for ownCloud
552d979039 [tx-robot] updated from transifex 2012-12-14 00:18:50 +01:00
Klaas Freitag
30494eee75 Added utility class with format fingerprint method.
Removed other obsolete formatting method.
2012-12-13 21:36:44 +01:00
Klaas Freitag
eb0782ec90 Check certificate fingerprints reported back from neon. 2012-12-13 19:52:22 +01:00
Klaas Freitag
c6edde1365 Fix merging. 2012-12-13 19:52:07 +01:00
Jenkins for ownCloud
5c918a486c [tx-robot] updated from transifex 2012-12-13 00:16:51 +01:00
Daniel Molkentin
6e3b5e075a Fix crash 2012-12-12 20:06:59 +01:00
Daniel Molkentin
8b8d78f456 Improved version of popup-notify 2012-12-12 19:30:37 +01:00
Daniel Molkentin
3cb2e74d12 Notify user about new files.
Let's see if its too annoying,
we can still add a timer later
2012-12-12 15:00:38 +01:00
Daniel Molkentin
41082c5e81 Fix proxy error
This was caused by an incorrect translation to a string type.
2012-12-12 15:00:38 +01:00
Jenkins for ownCloud
e939c6f91a [tx-robot] updated from transifex 2012-12-12 00:15:35 +01:00
Klaas Freitag
5da634ed70 Transparent fallback to the former password storage if keychain is not
there.
2012-12-11 15:08:20 +01:00
Jenkins for ownCloud
bee3605275 [tx-robot] updated from transifex 2012-12-11 00:05:32 +01:00
Jenkins for ownCloud
243567bdbb [tx-robot] updated from transifex 2012-12-10 00:13:29 +01:00
Jenkins for ownCloud
52b22b3c58 [tx-robot] updated from transifex 2012-12-09 00:14:14 +01:00
Klaas Freitag
edfefabcf8 Use two step process to store credentials through config file. 2012-12-08 22:56:48 +01:00
Klaas Freitag
9c627782d4 Use a two step process to store credentials for setup dialog. 2012-12-08 22:55:46 +01:00
Jenkins for ownCloud
cb1a9aef3c [tx-robot] updated from transifex 2012-12-08 00:12:08 +01:00
Daniel Molkentin
ba9f46ef49 Make Windows-version of Add to Favorites work
I committed a WiP before...
2012-12-07 20:20:40 +01:00
Daniel Molkentin
5502087017 Fix windows build 2012-12-07 19:53:36 +01:00
Daniel Molkentin
5510135084 Fix formatting hashes 2012-12-07 19:51:11 +01:00
Daniel Molkentin
ddecca47fd osx/win: add sync folders to favorite folders 2012-12-07 19:51:11 +01:00
Klaas Freitag
1eabdee253 Enable logging through new csync logging api 2012-12-07 09:03:24 +01:00
Klaas Freitag
029535bcea Removed another scary thing: qstrdup for proxy type. 2012-12-06 19:05:25 +01:00
Daniel Molkentin
4ef89abac7 Compile on Mac 2012-12-06 18:48:36 +01:00
Klaas Freitag
8af257a4cd Start fs watching with a delay of 2 seconds to don't catch the journal changes. 2012-12-06 18:38:45 +01:00
Klaas Freitag
a124dcd4e8 More cleanups that were possible by the new notify api. 2012-12-06 18:38:06 +01:00
Klaas Freitag
fbae2d7330 Further cleanups that were possible by new change notification. 2012-12-06 18:35:02 +01:00
Klaas Freitag
f296fad4bb Set csync context as module parameter 2012-12-06 17:57:00 +01:00
Daniel Molkentin
e2d8105f0d Remove debug 2012-12-06 17:54:44 +01:00
Daniel Molkentin
287c073f00 Remove code for local sync runs
Rely entirely on folderwatcher. Local
sync runs can be implemented in terms
of a dummy folderwatcher if we want
to support systems without fs monitoring
again..
2012-12-06 17:53:04 +01:00
Daniel Molkentin
ff1706c729 Add libqtkeychain dll to NSIS 2012-12-06 17:53:04 +01:00
Daniel Molkentin
138a060df2 Fix Windows folder watcher 2012-12-06 17:53:04 +01:00
Daniel Molkentin
6678beadab Hack: Sleep 2 secs after sync run
This avoids that we get notified by the system
about writing of the csync db (IO has latency).
2012-12-06 17:53:04 +01:00
Daniel Molkentin
09793fcd59 Bump version to 1.2.0pre 2012-12-06 17:53:04 +01:00
Daniel Molkentin
cab503bb2b CredentialStore: Fix off-by-one 2012-12-06 17:53:04 +01:00
Daniel Molkentin
f20db6bbc1 Implement folder watching for OS X using FSEvents 2012-12-06 17:53:04 +01:00
Daniel Molkentin
d50d4d1a6f Add windows backend, require Inotify on Linux
Dummy-backend yanked for now, no support for other Unixes...
2012-12-06 17:53:04 +01:00
Jenkins for ownCloud
59b722f663 [tx-robot] updated from transifex 2012-12-06 00:13:28 +01:00
Daniel Molkentin
b65fd11a36 Remove superfluous include 2012-12-05 16:46:27 +01:00
Daniel Molkentin
36c9a29a7b Move Logger into its own file, move it to libsync.
This fixes a linker error.
2012-12-05 16:45:28 +01:00
Klaas Freitag
6ba098d26d Make use of the new csync_set_module_properties and remove stuff from
before.
2012-12-05 12:30:28 +01:00
Jenkins for ownCloud
fbf25c1529 [tx-robot] updated from transifex 2012-12-05 00:06:11 +01:00
Daniel Molkentin
214261e764 pimpl folderwatcher 2012-12-04 18:24:25 +01:00
Klaas Freitag
b74cfcfec5 Add missing ifdef QTKEYCHAIN. 2012-12-04 18:11:24 +01:00
Daniel Molkentin
bc67756ff6 Fix typo 2012-12-04 17:48:14 +01:00
Daniel Molkentin
eccd12923b factor inotify out of folderwatcher 2012-12-04 17:48:14 +01:00
Daniel Molkentin
8f9ad524c2 Find inotify on multiarch debian/ubuntu 2012-12-04 17:48:14 +01:00
Klaas Freitag
5d958a4c07 Make use of QKeyChain if its there. 2012-12-04 17:27:59 +01:00
Klaas Freitag
22128781be Use new logging api of csync. 2012-12-04 17:24:46 +01:00
Klaas Freitag
34dcff4ce2 Add a ownCloudWizard finished slot. 2012-12-04 17:05:17 +01:00
Klaas Freitag
bcbdfdd7ab Some cleanups to avoid build warnings under win32. 2012-12-04 17:05:17 +01:00
Jenkins for ownCloud
ee0125eff6 [tx-robot] updated from transifex 2012-12-04 00:08:09 +01:00
Jenkins for ownCloud
e6409b09a3 [tx-robot] updated from transifex 2012-12-03 00:06:39 +01:00
Jenkins for ownCloud
9c015de00b [tx-robot] updated from transifex 2012-12-02 00:04:29 +01:00
Jenkins for ownCloud
3a04778f97 [tx-robot] updated from transifex 2012-11-30 00:06:15 +01:00
Daniel Molkentin
53aea61184 doc: Fix PDF generation here, too 2012-11-29 12:25:32 +01:00
Jenkins for ownCloud
b424247daf [tx-robot] updated from transifex 2012-11-29 00:06:14 +01:00
Dominik Schmidt
097be61c9f Fix QT_STRICT_ITERATOR errors 2012-11-28 23:31:03 +01:00
Daniel Molkentin
b349caeab1 Build with ancient GCC (4.2 on Mac OS) 2012-11-28 12:03:36 +01:00
Klaas Freitag
593636f135 User feedback on wrong passwd from KeyStore. 2012-11-28 10:44:25 +01:00
Klaas Freitag
70ea325c75 Do not commit devel hardcoded to KeyChain 2012-11-28 10:44:25 +01:00
Klaas Freitag
1a9a9cb402 More QtKeyChain integration. 2012-11-28 10:44:25 +01:00
Klaas Freitag
9d05a53c89 Fix cmake checks on QtKeyChain. 2012-11-28 10:44:25 +01:00
Jenkins for ownCloud
56794e8d7c [tx-robot] updated from transifex 2012-11-28 00:12:19 +01:00
Dominik Schmidt
2b2eb853fc Add qtkeychain to cmake - WIP read password from keychain.
Conflicts:

	CMakeLists.txt
2012-11-27 19:28:03 +01:00
Klaas Freitag
bf2181f111 Minor doc fix. 2012-11-27 15:46:17 +01:00
Jenkins for ownCloud
bd0882ccd5 [tx-robot] updated from transifex 2012-11-27 00:11:51 +01:00
Klaas Freitag
0c2564df86 Ready for 1.1.2 Release: Set version. 2012-11-26 14:44:38 +01:00
Jenkins for ownCloud
824c97d618 [tx-robot] updated from transifex 2012-11-26 00:03:28 +01:00
Daniel Molkentin
271d4fa22e Show last updated timestamp 2012-11-25 02:07:12 +01:00
Daniel Molkentin
a3a0202752 Fix copy/paste error 2012-11-25 01:20:25 +01:00
Daniel Molkentin
0da93f3eb5 Remove doc from the default target
The doc target requires strict parallel execution. Make it
a separate target unless we figure out how to do this with cmake.
2012-11-25 01:00:21 +01:00
Daniel Molkentin
78c7dc95a0 Add doc cmake targets (HTML, PDF, QtHelp, CHM, man)
make doc will build all of the above, except for CHM,
which needs manual preparation and can be built with
make doc-chm. See doc/scripts/README.rst for details.

We do our best to ensure to detect the required tools
before adding targets, so a build should always succeed.

Exception: On Debian and Ubuntu, the following packages are
required to build the PDF target (in addition to pdflatex
itself, which is autodetected):

* texlive-latex-recommended
* texlive-latex-extra
* texlive-fonts-recommended

If pdflatex is present, but those are not, the doc target
will fail.

Results can be found in $BUILDDIR/doc/$format.
2012-11-25 00:38:47 +01:00
Jenkins for ownCloud
f7b7669be6 [tx-robot] updated from transifex 2012-11-25 00:04:10 +01:00
Daniel Molkentin
f607cf55c6 doc: Make fit for use with make latexpdf 2012-11-24 02:35:18 +01:00
Jenkins for ownCloud
6a33b6ec33 [tx-robot] updated from transifex 2012-11-23 00:04:25 +01:00
Daniel Molkentin
e1bf2cc626 Ready for Release Candidate 2012-11-22 15:58:56 +01:00
Klaas Freitag
d15c0d046b Remove pre marker for version. 2012-11-22 12:34:21 +01:00
Klaas Freitag
f20bbe05bd Allow alias setting in Settings group name. 2012-11-22 12:32:07 +01:00
Klaas Freitag
c560fc5959 Escape [ and ] in Folder alias and file name. 2012-11-22 12:32:06 +01:00
Klaas Freitag
ee9e814f41 Getter and Setter for the config file name. 2012-11-22 12:32:06 +01:00
Jenkins for ownCloud
9e3d22af2d [tx-robot] updated from transifex 2012-11-22 00:03:15 +01:00
Klaas Freitag
c8ff747194 More changelog entries for 1.1.2 2012-11-21 16:39:25 +01:00
Daniel Molkentin
da64639f39 Update doc/building.rst
move packages into correct section
2012-11-21 15:20:15 +01:00
Daniel Molkentin
faa0f06fe3 Improve building section based on user feedback 2012-11-21 14:57:40 +01:00
Jenkins for ownCloud
2b9262f653 [tx-robot] updated from transifex 2012-11-21 00:03:40 +01:00
Klaas Freitag
01ccf679bd Fix Qt 46 build 2012-11-20 10:56:20 +01:00
dragotin
b55d6742fe Merge pull request #94 from owncloud/qt46fixurl
Fix url encoding in Qt46, Bug #93
2012-11-20 01:39:04 -08:00
Jenkins for ownCloud
fc6350cb9a [tx-robot] updated from transifex 2012-11-20 00:03:26 +01:00
Daniel Molkentin
9b8b656720 doc: Add Qt dependency to build instructions 2012-11-19 18:49:10 +01:00
Daniel Molkentin
8c9f8bdb6d doc: Fix build instructions; hint make package 2012-11-19 18:15:25 +01:00
Daniel Molkentin
be367eb94b Do not prepopulate the user field, it's usually wrong
Especially without LDAP, or in cases where the login
is an email address. If we ever want this again,
we need to make this cleverer.
2012-11-19 12:10:46 +01:00
Daniel Molkentin
aa577ce038 Remove placeholder texts for username and password
User names might be misleading, since they might be
email addresses, SMB logins including domain, etc.
2012-11-19 12:10:46 +01:00
Daniel Molkentin
53b0b96627 setup wizard: Remove subtitles 2012-11-19 12:10:46 +01:00
Daniel Molkentin
5173de5798 Theme: allow enforced locale 2012-11-19 12:10:46 +01:00
Daniel Molkentin
6457153bda Mac: Do not deploy DMG background, doesn't work 2012-11-19 12:10:45 +01:00
Daniel Molkentin
f8f188add4 Mac: Deploy sync-exclude.lst to bundle at build time 2012-11-19 12:10:45 +01:00
Jenkins for ownCloud
b6dfdc4c57 [tx-robot] updated from transifex 2012-11-19 00:02:43 +01:00
Jenkins for ownCloud
385f35d356 [tx-robot] updated from transifex 2012-11-18 00:02:57 +01:00
Klaas Freitag
afa48b0cc2 Fix url encoding in Qt46, Bug #93 2012-11-17 16:46:31 +01:00
Jenkins for ownCloud
94ed186b4c [tx-robot] updated from transifex 2012-11-17 00:03:22 +01:00
Daniel Molkentin
8fc1b38359 dialog title == menu item title 2012-11-16 13:36:16 +01:00
Klaas Freitag
9e66de07f9 Better error message for propagate fail. 2012-11-16 12:32:07 +01:00
Jenkins for ownCloud
2a53abbc20 [tx-robot] updated from transifex 2012-11-16 00:04:51 +01:00
Daniel Molkentin
ba9a07c2f2 Upate build docs 2012-11-15 14:42:10 +01:00
Daniel Molkentin
e4ae794bac Remove and do not try to commit temp editor files 2012-11-15 12:50:52 +01:00
Klaas Freitag
01e8c9dbbe Fix credentialstore on startup, promote credentials back on setup.
This fixes https://github.com/owncloud/mirall/issues/81
2012-11-15 11:43:43 +01:00
Daniel Molkentin
c5739b4d53 Remove extraneous legalese. 2012-11-15 01:07:51 +01:00
Jenkins for ownCloud
158859006b [tx-robot] updated from transifex 2012-11-15 00:04:24 +01:00
Klaas Freitag
1a5a015eb4 More changes to the Changelog. 2012-11-14 15:03:14 +01:00
Klaas Freitag
1acea008c2 Fixed package download link. 2012-11-14 15:03:14 +01:00
Jenkins for ownCloud
59a1cc4596 [tx-robot] updated from transifex 2012-11-14 00:04:41 +01:00
Klaas Freitag
39dc4cb46c Use CredentialStore also for Qt4.6 based builds. 2012-11-13 15:01:05 +01:00
Klaas Freitag
9c3b9b84ae Prepare some entries for 1.1.2 2012-11-13 11:19:34 +01:00
Klaas Freitag
a8dbed989b Use CredentialStore to manage user credentials.
This fixes the bug that if the password is not stored in the cfg
file the user could not cancel the auth dialog. Moreover it handles
various credential backends better and gives a better user experience.
2012-11-13 11:19:34 +01:00
Klaas Freitag
78be11b3cf Push Version to 1.1.2 pre 2012-11-13 11:19:34 +01:00
Jenkins for ownCloud
6f8824eacb [tx-robot] updated from transifex 2012-11-13 00:06:33 +01:00
Jenkins for ownCloud
12b5ad644d [tx-robot] updated from transifex 2012-11-12 00:03:18 +01:00
Jenkins for ownCloud
35b0a2b116 [tx-robot] updated from transifex 2012-11-10 00:03:27 +01:00
Jenkins for ownCloud
6442c7e5f7 [tx-robot] updated from transifex 2012-11-09 00:04:31 +01:00
Jenkins for ownCloud
8a394dd471 [tx-robot] updated from transifex 2012-11-08 00:04:24 +01:00
Jenkins for ownCloud
02e990b2c5 [tx-robot] updated from transifex 2012-11-07 00:04:15 +01:00
Jenkins for ownCloud
64177df3d9 [tx-robot] updated from transifex 2012-11-06 00:02:48 +01:00
Daniel Molkentin
df219dd09b Doc: use correct cmake vars 2012-11-05 14:44:10 +01:00
Daniel Molkentin
59969c3574 Qt is not C. 2012-11-05 11:44:22 +01:00
Klaas Freitag
3b9f4bf825 Merge branch 'master' of github.com:owncloud/mirall 2012-11-05 11:38:16 +01:00
Daniel Molkentin
80ecd71fc7 Doc: more trouble shooting 2012-11-05 11:36:48 +01:00
Klaas Freitag
5519bc7cbb Try to create local dir if not existing. 2012-11-05 11:36:39 +01:00
Klaas Freitag
c31f0885a4 Remove bogus space 2012-11-05 11:36:38 +01:00
Klaas Freitag
2501cc57d5 Display error status in statusdialog. 2012-11-05 11:36:38 +01:00
Klaas Freitag
fbb46b64f9 Check if local folder is proper and set error stat accordingly. 2012-11-05 11:36:38 +01:00
Klaas Freitag
4d08605b5b Also compute overall status for disabled folders. 2012-11-05 11:36:38 +01:00
Klaas Freitag
764c352c8f Calculate overallSyncStartup on startup. 2012-11-05 11:36:38 +01:00
Jenkins for ownCloud
61b9b44fa7 [tx-robot] updated from transifex 2012-11-05 00:04:23 +01:00
Daniel Molkentin
7d6eb61f1b doc: wording 2012-11-04 00:46:02 +01:00
Jenkins for ownCloud
6d17b9de4e [tx-robot] updated from transifex 2012-11-04 00:02:33 +01:00
Jenkins for ownCloud
ce45c7876c [tx-robot] updated from transifex 2012-11-03 00:03:25 +01:00
Daniel Molkentin
7cc3e7e392 Debug: fix typo 2012-11-02 16:32:26 +01:00
Daniel Molkentin
3a165ad654 Doc: add troubleshooting section 2012-11-02 16:26:56 +01:00
Daniel Molkentin
f04cf3a31e Bump version of master to 1.2pre 2012-11-02 16:14:51 +01:00
Daniel Molkentin
4fbfe7bfef Installer: Only show license on special request
GPL is a distribution license, and should thus
not be required to be accepted upon installation.
2012-11-02 16:14:33 +01:00
Daniel Molkentin
46a82b69c5 Show user name for connection in statusdialog
Move server version purely to tooltip.

Fixes issue #8.
2012-11-02 14:09:23 +01:00
Jenkins for ownCloud
0de3ae32c0 [tx-robot] updated from transifex 2012-11-02 00:05:49 +01:00
Daniel Molkentin
06e7864174 Doc: Require sphinx todo extension 2012-11-01 19:10:51 +01:00
Daniel Molkentin
8b60726a48 Doc: Introduce chapter on Architecture, Glossary 2012-11-01 19:10:01 +01:00
Daniel Molkentin
855597bfd9 Doc: formatting 2012-11-01 17:24:25 +01:00
Daniel Molkentin
827a31fa02 doc: formatting fix 2012-11-01 17:03:58 +01:00
Daniel Molkentin
20f04ec6d9 doc: small improvements 2012-11-01 16:52:07 +01:00
Daniel Molkentin
83180310af doc: add chapter on (soft-)branding 2012-11-01 16:33:27 +01:00
Jenkins for ownCloud
829bb7c5a9 [tx-robot] updated from transifex 2012-11-01 00:03:01 +01:00
Daniel Molkentin
9feb9b5262 Doc: fix typo 2012-10-31 17:22:03 +01:00
Daniel Molkentin
f2cfabcdb8 Doc: improve build instructions 2012-10-31 15:19:00 +01:00
Daniel Molkentin
6b2be97c22 Docs: add build chapter 2012-10-31 14:44:59 +01:00
Jenkins for ownCloud
616d8d39b7 [tx-robot] updated from transifex 2012-10-31 00:03:16 +01:00
Jenkins for ownCloud
69b3e9b10d [tx-robot] updated from transifex 2012-10-30 00:02:40 +01:00
Klaas Freitag
0224c3fbd6 Compare absolute path in fileStatus. 2012-10-29 14:35:02 +01:00
Klaas Freitag
78c1bc6b22 Cleanup of sync result treewalk, build up journal in owncloudfolder. 2012-10-29 12:24:20 +01:00
Klaas Freitag
993d33f779 Fix fileStatus API.
Conflicts:

	src/mirall/owncloudfolder.cpp
2012-10-29 12:23:01 +01:00
Klaas Freitag
0aa403eca3 Clean merge problems. 2012-10-29 12:20:57 +01:00
Klaas Freitag
8d1c7ddb9f Make sure that path() has a trailing slash. 2012-10-29 12:20:57 +01:00
Jenkins for ownCloud
01e601db14 [tx-robot] updated from transifex 2012-10-29 00:03:36 +01:00
Jenkins for ownCloud
0184993795 [tx-robot] updated from transifex 2012-10-28 00:03:12 +02:00
Daniel Molkentin
6b0abed4ee Remove file checked-in by accident 2012-10-27 19:30:37 +02:00
Daniel Molkentin
bf8b9246fe Add docs 2012-10-27 17:05:01 +02:00
Daniel Molkentin
6d4f712f83 Make SSL error dialog more intuitive 2012-10-27 17:05:01 +02:00
Daniel Molkentin
d2ebcd065e Fix tab order in setup page 2012-10-27 17:04:49 +02:00
Daniel Molkentin
28e15f5420 Escape HTML tags in self-signed certs 2012-10-27 17:04:49 +02:00
Daniel Molkentin
a315a3b5c7 There always must be both kinds of hashes, simplify code 2012-10-27 17:04:49 +02:00
Jenkins for ownCloud
10766182bc [tx-robot] updated from transifex 2012-10-27 00:02:51 +02:00
Dominik Schmidt
351f9aedfb Add testing skeleton 2012-10-26 20:24:12 +02:00
Jenkins for ownCloud
6757db2e53 [tx-robot] updated from transifex 2012-10-26 02:07:36 +02:00
Bartek Przybylski
55c9c3bf12 remove compilation warning 2012-10-25 23:20:00 +02:00
Jenkins for ownCloud
e52d43f68b [tx-robot] updated from transifex 2012-10-25 02:11:05 +02:00
Jenkins for ownCloud
cfe9a2476b [tx-robot] updated from transifex 2012-10-24 02:10:48 +02:00
Daniel Molkentin
efa8d7670c Show hashes of unknown certs 2012-10-24 01:44:13 +02:00
Jenkins for ownCloud
8ddba655df [tx-robot] updated from transifex 2012-10-23 02:08:12 +02:00
Daniel Molkentin
5c13115fee Remove 0% translations. 2012-10-22 16:39:56 +02:00
Thomas Müller
f948ce4015 [tx] minimum_perc = 70 2012-10-22 15:16:57 +03:00
Daniel Molkentin
2cbcd52f35 Do not allow the selection of a target in single folder mode 2012-10-22 11:32:53 +02:00
Jenkins for ownCloud
09405fc9f7 [tx-robot] updated from transifex 2012-10-22 02:08:53 +02:00
Jenkins for ownCloud
651517c3a7 [tx-robot] updated from transifex 2012-10-21 02:09:50 +02:00
Daniel Molkentin
b0801d469c If present, select first item in status dialog
The old behavior is confusing and there is no real
reason to not have an object that is default-selected.
2012-10-20 14:58:49 +02:00
Daniel Molkentin
8fbc0e7c46 Show wizard with intro when starting without account
The message box was complicated and not even correct
on some OSes. The intro page is omitted if the wizard
gets called via the "Configure" menu item.
2012-10-20 13:58:37 +02:00
Daniel Molkentin
d8728a56bc Pre-setup, disable irrelevant items in context menu 2012-10-20 13:58:37 +02:00
Jenkins for ownCloud
3e150ee47b [tx-robot] updated from transifex 2012-10-20 02:06:35 +02:00
Jenkins for ownCloud
ddc337303c [tx-robot] updated from transifex 2012-10-19 02:10:42 +02:00
Daniel Molkentin
574b6f49c2 Add .gitattributes, needed for clean git export 2012-10-18 13:42:47 +04:00
Daniel Molkentin
18a06506b8 ChangeLog updates for 1.1.1 2012-10-18 10:11:58 +02:00
Jenkins for ownCloud
bbdc7423b9 [tx-robot] updated from transifex 2012-10-18 02:11:56 +02:00
Daniel Molkentin
379da4ed0d Proper workaround for bug in Ubuntu's Qt SNI bridge. 2012-10-17 23:16:59 +02:00
Klaas Freitag
cff0fcee16 Escape the folder alias as used in QSetting and as file name. 2012-10-17 16:33:19 +02:00
Jenkins for ownCloud
94346fc12f [tx-robot] updated from transifex 2012-10-17 02:08:28 +02:00
Daniel Molkentin
257896969a Clean up argument handling
- Allow to retrospectively open log window
- Don't waste init time if only help is requested.
2012-10-16 19:06:23 +02:00
Klaas Freitag
fe665f234d Use better default value instead of constant number. 2012-10-16 10:11:24 +02:00
Daniel Molkentin
bb76365a3a Make sure SSL errors are always handled 2012-10-16 10:09:38 +02:00
Jenkins for ownCloud
dfe30c16c1 [tx-robot] updated from transifex 2012-10-16 02:10:50 +02:00
Jenkins for ownCloud
824a14ebb5 [tx-robot] updated from transifex 2012-10-15 02:11:39 +02:00
Jenkins for ownCloud
6fa9b86ee7 [tx-robot] updated from transifex 2012-10-14 02:12:35 +02:00
Jenkins for ownCloud
0955e8cc1f [tx-robot] updated from transifex 2012-10-13 02:11:26 +02:00
Daniel Molkentin
aad21c8c4a Add license to Windows installer 2012-10-12 14:44:21 +02:00
Daniel Molkentin
b7433ccad6 Revert "Hide remove button in singleFolder mode"
This reverts commit 8939e08ce1.
2012-10-12 14:44:21 +02:00
Daniel Molkentin
04642b3c6d Export repo revision indicator
To be used with git export.
2012-10-12 14:44:21 +02:00
Jenkins for ownCloud
85ac69dbe6 [tx-robot] updated from transifex 2012-10-12 02:09:27 +02:00
Jenkins for ownCloud
c491b9c064 [tx-robot] updated from transifex 2012-10-11 02:10:00 +02:00
Daniel Molkentin
d52d32f1b3 add helper script to sign app bundle 2012-10-10 16:57:07 +02:00
Sebastian Kügler
591b71cf18 Return QNetworkReply from remote mkdir
This patch allows the client implementation to react to specific results
of mkdir requests

I need this patch to be able to catch errors from creating remote
folders.
2012-09-11 05:26:07 +02:00
Sebastian Kügler
76e9687d6f Return QNetworkReply from getRequests
This patch allows the client implementation to react to specific
getRequests, such as folder checks, etc. It allows to connect
client-specific slots to requests, catch its errors and handle them
separately.

I need this patch to be able to check more than one remote folder on the
server, and not mix up their job's signal handling.
2012-09-11 03:35:32 +02:00
292 changed files with 36978 additions and 42178 deletions

4
.gitattributes vendored Normal file
View File

@@ -0,0 +1,4 @@
.tag export-subst
.gitignore export-ignore
.gitattributes export-ignore
.commit-template export-ignore

5
.gitignore vendored
View File

@@ -1,4 +1,7 @@
*build*
*build*/
*flymake*
CMakeLists.txt.user*
*.patch
*~
*.autosave
doc/_build/*

1
.tag Normal file
View File

@@ -0,0 +1 @@
$Format:%H$

View File

@@ -4,17 +4,34 @@ project(mirall)
set(PACKAGE "mirall")
set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
if ( EXISTS ${CMAKE_SOURCE_DIR}/OEM.cmake )
include ( ${CMAKE_SOURCE_DIR}/OEM.cmake )
set(OEM_THEME_DIR "" CACHE STRING "Define directory containing a custom theme")
if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake )
include ( ${OEM_THEME_DIR}/OEM.cmake )
else ()
include ( ${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake )
endif()
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
configure_file( ${CMAKE_SOURCE_DIR}/src/mirall/version.h.in "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/version.h" )
include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/")
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/")
include(GNUInstallDirs)
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
# if we cannot get it from git, directly try .tag (packages)
# this will work if the tar balls have been properly created
# via git-archive.
if (${GIT_SHA1} STREQUAL "GITDIR-NOTFOUND")
file(READ ${CMAKE_SOURCE_DIR}/.tag sha1_candidate)
string(REPLACE "\n" "" sha1_candidate ${sha1_candidate})
if (NOT ${sha1_candidate} STREQUAL "$Format:%H$")
message("${sha1_candidate}")
set (GIT_SHA1 "${sha1_candidate}")
endif()
endif()
## stupid, we should upstream this
if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr" AND NOT CMAKE_INSTALL_SYSCONFDIR)
set(CMAKE_INSTALL_SYSCONFDIR "/etc")
@@ -37,25 +54,33 @@ else()
endif()
#####
find_package(Qt4 4.6.0 COMPONENTS QtCore QtGui QtXml QtNetwork QtTest REQUIRED )
find_package(Csync)
find_package(INotify)
#####
## handle DBUS for Fdo notifications
if( UNIX AND NOT APPLE )
add_definitions( -DUSE_FDO_NOTIFICATIONS)
endif()
####
set(WITH_CSYNC CSYNC_FOUND)
#### find libs
find_package(Qt4 4.6.0 COMPONENTS QtCore QtGui QtXml QtNetwork QtTest REQUIRED )
if( UNIX AND NOT APPLE ) # Fdo notifications
find_package(Qt4 4.6.0 COMPONENTS QtDBus REQUIRED )
endif()
find_package(Csync REQUIRED)
if(UNIX)
find_package(INotify REQUIRED)
else()
find_package(INotify)
endif()
find_package(Sphinx)
find_package(PdfLatex)
find_package(QtKeychain)
set(WITH_QTKEYCHAIN ${QTKEYCHAIN_FOUND})
set(USE_INOTIFY ${INOTIFY_FOUND})
configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
macro(add_tests)
foreach( loop_var ${ARGV} )
qt4_automoc(test${loop_var}.cpp)
add_executable(test${loop_var} test${loop_var}.cpp)
target_link_libraries(test${loop_var} ${QT_LIBRARIES} mirall_static)
add_test(test${loop_var} ${CMAKE_CURRENT_BINARY_DIR}/test${loop_var} --catch_system_errors=no)
endforeach( loop_var )
endmacro(add_tests)
set(CPACK_SOURCE_IGNORE_FILES
# hidden files
"/\\\\..+$"
@@ -77,15 +102,6 @@ set(CPACK_SOURCE_IGNORE_FILES
include(OwnCloudCPack.cmake)
include(CTest)
enable_testing()
#
# This cmake builds two targets (aka apps), mirall and owncloud. For the owncloud
# target, OWNCLOUD_CLIENT needs to be a compile flag. It is set in src/CMakeLists.txt
# but if that fails because cmake is too old, uncomment this here if you want to build
# owncloud.
# add_definitions(-DOWNCLOUD_CLIENT)
add_definitions(-DUNICODE)
add_definitions(-D_UNICODE)
@@ -94,13 +110,16 @@ file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translations/mirall_*.ts)
set(TRANSLATIONS ${TRANS_FILES})
add_subdirectory(src)
add_subdirectory(doc)
if(UNIT_TESTING)
include(CTest)
enable_testing()
add_subdirectory(test)
endif(UNIT_TESTING)
if(BUILD_OWNCLOUD_OSX_BUNDLE)
install( FILES sync-exclude.lst DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources )
configure_file(sync-exclude.lst ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/sync-exclude.lst COPYONLY)
else()
install( FILES sync-exclude.lst DESTINATION ${CMAKE_INSTALL_SYSCONFDIR} )
endif()

48
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,48 @@
## Submitting Desktop Client issues
If you have questions about how to use the ownCloud Desktop Client, please
direct these to the [mailing list][mailinglist] or our [forum][forum].
We are also available on [IRC][irc].
### Bug Reporting Guidelines
* Important: Report the issue using our [template][template], it includes all the
informations we need to track down the issue.
* This repository is *only* for issues within the ownCloud desktop client.
Issues in other compontents should be reported in their own repositores:
- [ownCloud server](https://github.com/owncloud/core/issues)
- [ownCloud apps](https://github.com/owncloud/apps/issues) (e.g. Calendar,
Contacts...)
- [Android client](https://github.com/owncloud/android/issues)
- [iOS client](https://github.com/owncloud/ios-issues/issues)
* Search the existing issues first, it's likely that your issue was already
reported.
If your issue appears to be a bug, and hasn't been reported, open a new issue.
Help us to maximize the effort we can spend fixing issues and adding new
features, by not reporting duplicate issues.
[template]: https://raw.github.com/owncloud/mirall/master/issue_template.md
[mailinglist]: https://mail.kde.org/mailman/listinfo/owncloud
[forum]: http://forum.owncloud.org/
[irc]: http://webchat.freenode.net/?channels=owncloud&uio=d4
## Contributing to Source Code
Thanks for wanting to contribute source code to ownCloud. That's great!
Before we're able to merge your code to mirall, you need to sign
our [Contributor Agreement][agreement].
Please read the [Desktop Client Manual][mirallman] and the [Developer
Manuals][devmanual] to get useful infos like how to create your first
application or how to test the ownCloud code with phpunit.
[agreement]: http://owncloud.org/about/contributor-agreement/
[devmanual]: http://owncloud.org/dev/
[mirallman]: http://doc.owncloud.org/desktop/1.1/
## Translations
Please submit translations via [Transifex][transifex].
[transifex]: https://www.transifex.com/projects/p/owncloud/

319
COPYING.documentation Normal file
View File

@@ -0,0 +1,319 @@
Creative Commons Legal Code
Attribution 3.0 Unported
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
DAMAGES RESULTING FROM ITS USE.
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
CONDITIONS.
1. Definitions
a. "Adaptation" means a work based upon the Work, or upon the Work and
other pre-existing works, such as a translation, adaptation,
derivative work, arrangement of music or other alterations of a
literary or artistic work, or phonogram or performance and includes
cinematographic adaptations or any other form in which the Work may be
recast, transformed, or adapted including in any form recognizably
derived from the original, except that a work that constitutes a
Collection will not be considered an Adaptation for the purpose of
this License. For the avoidance of doubt, where the Work is a musical
work, performance or phonogram, the synchronization of the Work in
timed-relation with a moving image ("synching") will be considered an
Adaptation for the purpose of this License.
b. "Collection" means a collection of literary or artistic works, such as
encyclopedias and anthologies, or performances, phonograms or
broadcasts, or other works or subject matter other than works listed
in Section 1(f) below, which, by reason of the selection and
arrangement of their contents, constitute intellectual creations, in
which the Work is included in its entirety in unmodified form along
with one or more other contributions, each constituting separate and
independent works in themselves, which together are assembled into a
collective whole. A work that constitutes a Collection will not be
considered an Adaptation (as defined above) for the purposes of this
License.
c. "Distribute" means to make available to the public the original and
copies of the Work or Adaptation, as appropriate, through sale or
other transfer of ownership.
d. "Licensor" means the individual, individuals, entity or entities that
offer(s) the Work under the terms of this License.
e. "Original Author" means, in the case of a literary or artistic work,
the individual, individuals, entity or entities who created the Work
or if no individual or entity can be identified, the publisher; and in
addition (i) in the case of a performance the actors, singers,
musicians, dancers, and other persons who act, sing, deliver, declaim,
play in, interpret or otherwise perform literary or artistic works or
expressions of folklore; (ii) in the case of a phonogram the producer
being the person or legal entity who first fixes the sounds of a
performance or other sounds; and, (iii) in the case of broadcasts, the
organization that transmits the broadcast.
f. "Work" means the literary and/or artistic work offered under the terms
of this License including without limitation any production in the
literary, scientific and artistic domain, whatever may be the mode or
form of its expression including digital form, such as a book,
pamphlet and other writing; a lecture, address, sermon or other work
of the same nature; a dramatic or dramatico-musical work; a
choreographic work or entertainment in dumb show; a musical
composition with or without words; a cinematographic work to which are
assimilated works expressed by a process analogous to cinematography;
a work of drawing, painting, architecture, sculpture, engraving or
lithography; a photographic work to which are assimilated works
expressed by a process analogous to photography; a work of applied
art; an illustration, map, plan, sketch or three-dimensional work
relative to geography, topography, architecture or science; a
performance; a broadcast; a phonogram; a compilation of data to the
extent it is protected as a copyrightable work; or a work performed by
a variety or circus performer to the extent it is not otherwise
considered a literary or artistic work.
g. "You" means an individual or entity exercising rights under this
License who has not previously violated the terms of this License with
respect to the Work, or who has received express permission from the
Licensor to exercise rights under this License despite a previous
violation.
h. "Publicly Perform" means to perform public recitations of the Work and
to communicate to the public those public recitations, by any means or
process, including by wire or wireless means or public digital
performances; to make available to the public Works in such a way that
members of the public may access these Works from a place and at a
place individually chosen by them; to perform the Work to the public
by any means or process and the communication to the public of the
performances of the Work, including by public digital performance; to
broadcast and rebroadcast the Work by any means including signs,
sounds or images.
i. "Reproduce" means to make copies of the Work by any means including
without limitation by sound or visual recordings and the right of
fixation and reproducing fixations of the Work, including storage of a
protected performance or phonogram in digital form or other electronic
medium.
2. Fair Dealing Rights. Nothing in this License is intended to reduce,
limit, or restrict any uses free from copyright or rights arising from
limitations or exceptions that are provided for in connection with the
copyright protection under copyright law or other applicable laws.
3. License Grant. Subject to the terms and conditions of this License,
Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
perpetual (for the duration of the applicable copyright) license to
exercise the rights in the Work as stated below:
a. to Reproduce the Work, to incorporate the Work into one or more
Collections, and to Reproduce the Work as incorporated in the
Collections;
b. to create and Reproduce Adaptations provided that any such Adaptation,
including any translation in any medium, takes reasonable steps to
clearly label, demarcate or otherwise identify that changes were made
to the original Work. For example, a translation could be marked "The
original work was translated from English to Spanish," or a
modification could indicate "The original work has been modified.";
c. to Distribute and Publicly Perform the Work including as incorporated
in Collections; and,
d. to Distribute and Publicly Perform Adaptations.
e. For the avoidance of doubt:
i. Non-waivable Compulsory License Schemes. In those jurisdictions in
which the right to collect royalties through any statutory or
compulsory licensing scheme cannot be waived, the Licensor
reserves the exclusive right to collect such royalties for any
exercise by You of the rights granted under this License;
ii. Waivable Compulsory License Schemes. In those jurisdictions in
which the right to collect royalties through any statutory or
compulsory licensing scheme can be waived, the Licensor waives the
exclusive right to collect such royalties for any exercise by You
of the rights granted under this License; and,
iii. Voluntary License Schemes. The Licensor waives the right to
collect royalties, whether individually or, in the event that the
Licensor is a member of a collecting society that administers
voluntary licensing schemes, via that society, from any exercise
by You of the rights granted under this License.
The above rights may be exercised in all media and formats whether now
known or hereafter devised. The above rights include the right to make
such modifications as are technically necessary to exercise the rights in
other media and formats. Subject to Section 8(f), all rights not expressly
granted by Licensor are hereby reserved.
4. Restrictions. The license granted in Section 3 above is expressly made
subject to and limited by the following restrictions:
a. You may Distribute or Publicly Perform the Work only under the terms
of this License. You must include a copy of, or the Uniform Resource
Identifier (URI) for, this License with every copy of the Work You
Distribute or Publicly Perform. You may not offer or impose any terms
on the Work that restrict the terms of this License or the ability of
the recipient of the Work to exercise the rights granted to that
recipient under the terms of the License. You may not sublicense the
Work. You must keep intact all notices that refer to this License and
to the disclaimer of warranties with every copy of the Work You
Distribute or Publicly Perform. When You Distribute or Publicly
Perform the Work, You may not impose any effective technological
measures on the Work that restrict the ability of a recipient of the
Work from You to exercise the rights granted to that recipient under
the terms of the License. This Section 4(a) applies to the Work as
incorporated in a Collection, but this does not require the Collection
apart from the Work itself to be made subject to the terms of this
License. If You create a Collection, upon notice from any Licensor You
must, to the extent practicable, remove from the Collection any credit
as required by Section 4(b), as requested. If You create an
Adaptation, upon notice from any Licensor You must, to the extent
practicable, remove from the Adaptation any credit as required by
Section 4(b), as requested.
b. If You Distribute, or Publicly Perform the Work or any Adaptations or
Collections, You must, unless a request has been made pursuant to
Section 4(a), keep intact all copyright notices for the Work and
provide, reasonable to the medium or means You are utilizing: (i) the
name of the Original Author (or pseudonym, if applicable) if supplied,
and/or if the Original Author and/or Licensor designate another party
or parties (e.g., a sponsor institute, publishing entity, journal) for
attribution ("Attribution Parties") in Licensor's copyright notice,
terms of service or by other reasonable means, the name of such party
or parties; (ii) the title of the Work if supplied; (iii) to the
extent reasonably practicable, the URI, if any, that Licensor
specifies to be associated with the Work, unless such URI does not
refer to the copyright notice or licensing information for the Work;
and (iv) , consistent with Section 3(b), in the case of an Adaptation,
a credit identifying the use of the Work in the Adaptation (e.g.,
"French translation of the Work by Original Author," or "Screenplay
based on original Work by Original Author"). The credit required by
this Section 4 (b) may be implemented in any reasonable manner;
provided, however, that in the case of a Adaptation or Collection, at
a minimum such credit will appear, if a credit for all contributing
authors of the Adaptation or Collection appears, then as part of these
credits and in a manner at least as prominent as the credits for the
other contributing authors. For the avoidance of doubt, You may only
use the credit required by this Section for the purpose of attribution
in the manner set out above and, by exercising Your rights under this
License, You may not implicitly or explicitly assert or imply any
connection with, sponsorship or endorsement by the Original Author,
Licensor and/or Attribution Parties, as appropriate, of You or Your
use of the Work, without the separate, express prior written
permission of the Original Author, Licensor and/or Attribution
Parties.
c. Except as otherwise agreed in writing by the Licensor or as may be
otherwise permitted by applicable law, if You Reproduce, Distribute or
Publicly Perform the Work either by itself or as part of any
Adaptations or Collections, You must not distort, mutilate, modify or
take other derogatory action in relation to the Work which would be
prejudicial to the Original Author's honor or reputation. Licensor
agrees that in those jurisdictions (e.g. Japan), in which any exercise
of the right granted in Section 3(b) of this License (the right to
make Adaptations) would be deemed to be a distortion, mutilation,
modification or other derogatory action prejudicial to the Original
Author's honor and reputation, the Licensor will waive or not assert,
as appropriate, this Section, to the fullest extent permitted by the
applicable national law, to enable You to reasonably exercise Your
right under Section 3(b) of this License (right to make Adaptations)
but not otherwise.
5. Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. Termination
a. This License and the rights granted hereunder will terminate
automatically upon any breach by You of the terms of this License.
Individuals or entities who have received Adaptations or Collections
from You under this License, however, will not have their licenses
terminated provided such individuals or entities remain in full
compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
survive any termination of this License.
b. Subject to the above terms and conditions, the license granted here is
perpetual (for the duration of the applicable copyright in the Work).
Notwithstanding the above, Licensor reserves the right to release the
Work under different license terms or to stop distributing the Work at
any time; provided, however that any such election will not serve to
withdraw this License (or any other license that has been, or is
required to be, granted under the terms of this License), and this
License will continue in full force and effect unless terminated as
stated above.
8. Miscellaneous
a. Each time You Distribute or Publicly Perform the Work or a Collection,
the Licensor offers to the recipient a license to the Work on the same
terms and conditions as the license granted to You under this License.
b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
offers to the recipient a license to the original Work on the same
terms and conditions as the license granted to You under this License.
c. If any provision of this License is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this License, and without further action
by the parties to this agreement, such provision shall be reformed to
the minimum extent necessary to make such provision valid and
enforceable.
d. No term or provision of this License shall be deemed waived and no
breach consented to unless such waiver or consent shall be in writing
and signed by the party to be charged with such waiver or consent.
e. This License constitutes the entire agreement between the parties with
respect to the Work licensed here. There are no understandings,
agreements or representations with respect to the Work not specified
here. Licensor shall not be bound by any additional provisions that
may appear in any communication from You. This License may not be
modified without the mutual written agreement of the Licensor and You.
f. The rights granted under, and the subject matter referenced, in this
License were drafted utilizing the terminology of the Berne Convention
for the Protection of Literary and Artistic Works (as amended on
September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
and the Universal Copyright Convention (as revised on July 24, 1971).
These rights and subject matter take effect in the relevant
jurisdiction in which the License terms are sought to be enforced
according to the corresponding provisions of the implementation of
those treaty provisions in the applicable national law. If the
standard suite of rights granted under applicable copyright law
includes additional rights not granted under this License, such
additional rights are deemed to be included in the License; this
License is not intended to restrict the license of any rights under
applicable law.
Creative Commons Notice
Creative Commons is not a party to this License, and makes no warranty
whatsoever in connection with the Work. Creative Commons will not be
liable to You or any party on any legal theory for any damages
whatsoever, including without limitation any general, special,
incidental or consequential damages arising in connection to this
license. Notwithstanding the foregoing two (2) sentences, if Creative
Commons has expressly identified itself as the Licensor hereunder, it
shall have all rights and obligations of Licensor.
Except for the limited purpose of indicating to the public that the
Work is licensed under the CCPL, Creative Commons does not authorize
the use by either party of the trademark "Creative Commons" or any
related trademark or logo of Creative Commons without the prior
written consent of Creative Commons. Any permitted use will be in
compliance with Creative Commons' then-current trademark usage
guidelines, as may be published on its website or otherwise made
available upon request from time to time. For the avoidance of doubt,
this trademark restriction does not form part of this License.
Creative Commons may be contacted at http://creativecommons.org/.

View File

@@ -9,9 +9,10 @@ endif(CPACK_GENERATOR MATCHES "NSIS")
set( CMAKE_SOURCE_DIR @CMAKE_SOURCE_DIR@ )
set( CMAKE_BINARY_DIR @CMAKE_BINARY_DIR@ )
set( OEM_THEME_DIR @OEM_THEME_DIR@ )
if ( EXISTS "${CMAKE_SOURCE_DIR}/OEM.cmake" )
include ( "${CMAKE_SOURCE_DIR}/OEM.cmake" )
if ( DEFINED OEM_THEME_DIR AND EXISTS ${OEM_THEME_DIR}/OEM.cmake )
include ( ${OEM_THEME_DIR}/OEM.cmake )
else ()
include ( "${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake" )
endif()

121
ChangeLog
View File

@@ -1,10 +1,108 @@
ChangeLog
=========
version 1.1.0 (release ), csync 0.60.0 required
*
* [GUI] Added an about dialog
* [GUI] Improved themeing capabilities of the client.
* [GUI] Minor fixes in folder assistant.
version 1.2.5 (release 2013-04-23 ), csync 0.70.7 required
* [Fixes] NSIS installer fixes
* [Fixes] Fix crash race by making certificateChain() thread safe
* [Fixes] Build with older CMake versions (CentOS/RHEL 6)
* [Fixes] Wording in GUI
* [Fixes] Silently ignore "installed = true" status.php
* Set log verbosity before calling csync_init.
* GUI feedback for the statistics copy action
* Safer approach for detecting duplicate sync runs
version 1.2.4 (release 2013-04-11 ), csync 0.70.6 required
* [Fixes] Clarify string in folder wizard
* [Fixes] Fixed some valgrind warnings
* [Fixes] Ensure that only one sync thread can ever run
* [Fixes] Fix default config storage path
* [Fixes] Skip folders with no absolute path
* [Fixes] Allow setting the configuration directory on command line
version 1.2.3 (release 2013-04-02 ), csync 0.70.5 required
* [Fixes] Unbreak self-signed certificate handling
version 1.2.2 (release 2013-04-02 ), csync 0.70.5 required
* [Fixes] Do not crash when local file tree contains symlinks
* [Fixes] Correctly handle locked files on Windows
* [Fixes] Display errors in all members of the SSL chain
* [Fixes] Enable Accessibility features on Windows
* [Fixes] Make setupFavLink work properly on Mac OS
* [Fixes] Ignore temporary files created by MS Office
* [Gui] Support Nautilus in setupFavLink
version 1.2.1 (release 2013-02-26 ), csync 0.70.4 required
* [Fixes] Leave configured folders on configuration changes.
* [Fixes] Do not allow to finish the setup dialog if connection can't be established.
* [Fixes] Better handling of credentials in setup dialog.
* [Fixes] Do not leak fd's to /dev/null when using gnutls
* [Fixes] Stop sync scheduling when configuration wizard starts.
* [Fixes] Clear pending network requests when stepping back in config wizard.
* [Fixes] User password dialog asynchronous issues.
* [Fixes] Make folderman starting and stoping the scheduling.
* [Fixes] Various minor fixes and cleanups.
* [Fixes] Crash on pausing sync
* [Fixes] Stale lock file after pausing sync
* [App] Load translations from app dir or bundle as well.
* [Platform] Build fixes and simplifications, ie. build only one lib.
* [Platform] Added some getter/setters for configuration values.
* [Platform] Added man pages.
* [Platform] Simplified/fixed credential store usage and custom configs.
* [Platform] Added soname version to libowncloudsync.
* [Platform] Pull in Qt translations
* [Gui] Make sync result popups less annoyingq
* [Gui] Fix for result popup
version 1.2.0 (release 2013-01-24 ), csync 0.70.2 required
* [GUI] New status dialog to show a detailed list of synced files.
* [GUI] New tray notifications about synced files.
* [GUI] New platform specific icon set.
* [App] Using cross platform QtKeychain library to store credentials crypted.
* [App] Use cross platform notification for changes in the local file system rather than regular poll.
* [Fixes] Improved SSL Certificate handling and SSL fixes troughout syncing.
* [Fixes] Fixed proxy authentication.
* [Fixes] Allow brackets in folder name alias.
* [Fixes] Lots of other minor fixes.
* [Platform] cmake fixes.
* [Platform] Improved, more detailed error reporting.
version 1.1.4 (release 2012-12-19 ), csync 0.60.4 required
* No changes to mirall, only csync fixes.
version 1.1.3 (release 2012-11-30 ), csync 0.60.3 required
* No changes to mirall, only csync fixes.
version 1.1.2 (release 2012-11-26 ), csync 0.60.2 required
* [Fixes] Allow to properly cancel the password dialog.
* [Fixes] Share folder name correctly percent encoded with old Qt
4.6 builds ie. Debian.
* [Fixes] If local sync dir is not existing, create it.
* [Fixes] lots of other minor fixes.
* [GUI] Display error messages in status dialog.
* [GUI] GUI fixes for the connection wizard.
* [GUI] Show username for connection in statusdialog.
* [GUI] Show intro wizard on new connection setup.
* [APP] Use CredentialStore to better support various credential
backends.
* [APP] Handle missing local folder more robust: Create it if
missing instead of ignoring.
* [APP] Simplify treewalk code.
* [Platform] Fix Mac building
version 1.1.1 (release 2012-10-18), csync 0.60.1 required
* [GUI] Allow changing folder name in single folder mode
* [GUI] Windows: Add license to installer
* [GUI] owncloud --logwindow will bring up the log window
in an already running instance
* [Fixes] Make sure SSL errors are always handled
* [Fixes] Allow special characters in folder alias
* [Fixes] Proper workaround for Menu bug in Ubuntu
* [Fixes] csync: Fix improper memory cleanup which could
cause memory leaks and crashes
* [Fixes] csync: Fix memory leak
* [Fixes] csync: Allow single quote (') in file names
* [Fixes] csync: Remove stray temporary files
* [GUI] Reworked tray context menu.
* [GUI] Users can now sync the server root folder.
* [Fixes] Proxy support: now supports Proxy Auto-Configuration (PAC)
@@ -23,7 +121,7 @@ version 1.1.0 (release ), csync 0.60.0 required
* [Platform] csync conf file and database were moved to the users app data
directory, away from the .csync dir.
* Renamed exclude.lst to sync-exclude.lst and moved it to
/etc/appName()/ for more clean packaging. From the user path,
/etc/appName()/ for more clean packaging. From the user path,
still exclude.lst is read if sync-exclude.lst is not existing.
* Placed custom.ini with customization options to /etc/appName()
@@ -32,7 +130,7 @@ version 1.0.5 (release 2012-08-14), csync 0.50.8 required
version 1.0.4 (release 2012-08-10), csync 0.50.8 required
* [APP] ownCloud is now a single instance app, can not start twice any more.
* [APP] Proxy support
* [APP] Proxy support
* [APP] Handle HTTP redirection correctly, note new url.
* [APP] More relaxed handling of read only directories in the sync paths.
* [APP] Started to split off a library with sync functionality, eg for KDE
@@ -43,13 +141,13 @@ version 1.0.4 (release 2012-08-10), csync 0.50.8 required
* [GUI] Removed Log Window Button, log available through command line.
* [GUI] Proxy configuration dialog added.
* [GUI] Added Translations to languages Slovenian, Polish, Catalan,
Portuguese (Brazil), German, Greek, Spanish, Czech, Italian, Slovak,
French, Russian, Japanese, Swedish, Portuguese (Portugal)
Portuguese (Brazil), German, Greek, Spanish, Czech, Italian, Slovak,
French, Russian, Japanese, Swedish, Portuguese (Portugal)
all with translation rate >90%.
* [Fixes] Loading of self signed certs into Networkmanager (#oc-843)
* [Fixes] Win32: Handle SSL dll loading correctly.
* [Fixes] Many other small fixes and improvements.
version 1.0.3 (release 2012-06-19), csync 0.50.7 required
* [GUI] Added a log window which catches the logging if required and
allows to save for information.
@@ -58,7 +156,7 @@ version 1.0.3 (release 2012-06-19), csync 0.50.7 required
* [Fixes] Do not use csync database files from a sync before.
* [Fixes] In Connection wizard, write the final config onyl if
the user really accepted. Also remove the former database.
* [Fixes] More user expected behaviour deletion of sync folder local
* [Fixes] More user expected behaviour deletion of sync folder local
and remote.
* [Fixes] Allow special characters in the sync directory names
* [Fixes] Win32: Fixed directory removal with special character dirs.
@@ -99,4 +197,3 @@ version 1.0.1 (release 2012-04-18), csync 0.50.5 required
* [Platform] MacOSX Bundle creation added
* [Platform] Enabled ranslations on Windows.

View File

@@ -1,8 +1,10 @@
set( APPLICATION_SHORTNAME "owncloud" )
set( APPLICATION_NAME "ownCloud" )
set( APPLICATION_EXECUTABLE "owncloud" )
set( APPLICATION_DOMAIN "owncloud.org" )
set( APPLICATION_VENDOR "ownCloud.org" )
set( APPLICATION_DOMAIN "owncloud.com" )
set( APPLICATION_VENDOR "ownCloud, Inc" )
set( THEME_CLASS "ownCloudTheme" )
SET( APPLICATION_REV_DOMAIN "org.owncloud.desktopclient" )
set( APPLICATION_REV_DOMAIN "com.owncloud.desktopclient" )
set( WIN_SETUP_BITMAP_PATH "${CMAKE_SOURCE_DIR}/admin/win/nsi" )
# set( THEME_INCLUDE "${OEM_THEME_DIR}/mytheme.h" )
# set( APPLICATION_LICENSE "${OEM_THEME_DIR}/license.txt )

View File

@@ -2,8 +2,8 @@ include( InstallRequiredSystemLibraries )
set( CPACK_PACKAGE_CONTACT "Dominik Schmidt <domme@tomahawk-player.org>" )
if ( EXISTS "${CMAKE_SOURCE_DIR}/OEM.cmake" )
include ( "${CMAKE_SOURCE_DIR}/OEM.cmake" )
if ( DEFINED OEM_THEME_DIR AND EXISTS ${OEM_THEME_DIR}/OEM.cmake )
include ( "${OEM_THEME_DIR}/OEM.cmake" )
else ()
include ( "${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake" )
endif()
@@ -21,7 +21,7 @@ if(APPLE)
set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/ownCloud.icns)
set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in")
set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
# set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
set( CPACK_DMG_FORMAT "UDBZ" )
set( CPACK_DMG_VOLUME_NAME "${APPLICATION_NAME}")
@@ -45,12 +45,12 @@ if(WIN32)
# CPACK_INCLUDE_TOPLEVEL_DIRECTORY Controls whether CPack adds a top-level directory, usually of the form ProjectName-Version-OS, to the top of package tree. 0 to disable, 1 to enable
# CPACK_INSTALL_CMAKE_PROJECTS List of four values: Build directory, Project Name, Project Component, Directory in the package /home/andy/vtk/CMake-bin;CMake;ALL;/
set( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md" ) # File used as a description of a project /path/to/project/ReadMe.txt
set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "ownCloud Syncing Client" ) # Description summary of a project
set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "${APPLICATION_NAME} Syncing Client" ) # Description summary of a project
# CPACK_PACKAGE_EXECUTABLES List of pairs of executables and labels. Used by the NSIS generator to create Start Menu shortcuts. ccmake;CMake
set( CPACK_PACKAGE_INSTALL_DIRECTORY ${APPLICATION_NAME} ) # Installation directory on the target system -> C:\Program Files\fellody
set( CPACK_PACKAGE_INSTALL_REGISTRY_KEY ${APPLICATION_NAME} ) # Registry key used when installing this project CMake 2.5.0
set( CPACK_PACKAGE_NAME ${APPLICATION_NAME} ) # Package name, defaults to the project name
set( CPACK_PACKAGE_VENDOR "http://owncloud.com" ) # Package vendor name
set( CPACK_PACKAGE_VENDOR "http://${APPLICATION_DOMAIN}" ) # Package vendor name
endif()
# set( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt" ) # License file for the project, used by the STGZ, NSIS, and PackageMaker generators. /home/andy/vtk/CMake/Copyright.txt

View File

@@ -2,54 +2,14 @@
## Introduction
Mirall synchronizes your folders with another computer.
The ultimate goals of Mirall are:
* Network location aware: should not try to sync against your NAS if you are
not in the home network
* It is a zero-interaction tool. So forget about resolving conflicts.
* It should work silently and realiably.
Mirall is in early stages of development, and may still eat your
files or hang your computer.
* Network location awareness not implemented yet
* Current version supports local and remote (sftp and smb) folders.
* It is powered by csync (http://www.csync.org), however
the user does not know and other tools will be incorporated to provide other
functionality.
## Current issues
* No sane way to backup conflicting versions yet, this should be solved
in a near csync release (--conflictcopy, available in Jann's branch).
Right now the newest copy wins.
* You can't remove folder configurations
Workaround: delete ~/.local/share/data/Mirall/folders/$alias and restart
* Some tasks block the GUI (initial setup of watchers)
* May be some concurrency issues
## Roadmap
* Improve robustness to minimize user interaction
* Improve feedback and sync results
* Add support for other folder types: tarsnap, duplicity, git (SparkleShare)
## Requirements
* Linux (currently it uses inotify to detect file changes)
* unison installed in the local and remote machine
(you should not care if you got Mirall with your favorite
distribution)
Mirall is a tool to synchronize files from ownCloud Server with your computer.
It uses OCSync as its syncing backend.
## Download
### openSUSE
### Binary packages
* 1-click install available in software.opensuse.org
http://software.opensuse.org/search?q=mirall&baseproject=ALL&lang=en&include_home=true&exclude_debug=true
* Refer to the download page http://owncloud.org/sync-clients/
### Source code
@@ -57,23 +17,12 @@ http://software.opensuse.org/search?q=mirall&baseproject=ALL&lang=en&include_hom
## Building the source code
You need Qt 4.7 and cmake:
mkdir build
cd build
cmake ..
make
To generate a tarball:
mkdir build
cd build
cmake ..
make package_source
Please refer to [Building the Client](http://doc.owncloud.org/desktop/1.2/building.html)
in the ownCloud client manual.
## Authors
* Duncan Mac-Vicar P. <duncan@kde.org>
* Duncan Mac-Vicar P. <duncan@kde.org> (original Mirall author)
* Klaas Freitag <freitag@owncloud.com>
* Daniel Molkentin <danimo@owncloud.com>

View File

@@ -1,5 +1,6 @@
set( VERSION_MAJOR 1 )
set( VERSION_MINOR 1 )
set( VERSION_MINOR 3 )
set( VERSION_PATCH 0 )
set( VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} )
set( VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}beta2)
set( SOVERSION 0 )

20
admin/osx/sign_dmg.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/sh -x
[ "$#" -lt 2 ] && echo "Usage: sign_dmg.sh <dmg> <identity>" && exit
src_dmg=$1
tmp_dmg=writable_$1
signed_dmg=signed_$1
identity=$2
mount="/Volumes/$(basename $src_dmg|cut -d"-" -f1)"
test -e $tmp_dmg && rm -rf $tmp_dmg
hdiutil convert $src_dmg -format UDRW -o $tmp_dmg
open $tmp_dmg
sleep 12s
pushd $mount
codesign -s "$identity" $mount/*.app
popd
diskutil eject $mount
test -e $signed_dmg && rm -rf $signed_dmg
hdiutil convert $tmp_dmg -format UDBZ -o $signed_dmg

View File

@@ -32,3 +32,7 @@ SET(QT_MOC_EXECUTABLE ${MINGW_PREFIX}-moc)
SET(QT_RCC_EXECUTABLE ${MINGW_PREFIX}-rcc)
SET(QT_UIC_EXECUTABLE ${MINGW_PREFIX}-uic)
SET(QT_LRELEASE_EXECUTABLE ${MINGW_PREFIX}-lrelease)
# neon config
SET(NEON_CONFIG_EXECUTABLE ${CMAKE_FIND_ROOT_PATH}/bin/neon-config)
# /usr/i686-w64-mingw32/sys-root/mingw/bin/neon-config

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 151 KiB

View File

@@ -1,28 +1,28 @@
IF(EXISTS "${CMAKE_SOURCE_DIR}/../csync/src/csync.h")
SET(CSYNC_INCLUDE_PATH ${CMAKE_SOURCE_DIR}/../csync/src/)
ELSE()
FIND_PATH(CSYNC_INCLUDE_PATH NAMES csync.h HINTS $ENV{CSYNC_DIR} )
ENDIF()
IF( DEFINED CSYNC_LIBRARY_PATH AND DEFINED CSYNC_INCLUDE_PATH )
IF( WIN32 )
SET(CSYNC_LIBRARY ${CSYNC_LIBRARY_PATH}/src/libocsync.dll)
ELSEIF ( APPLE )
SET(CSYNC_LIBRARY ${CSYNC_LIBRARY_PATH}/src/libocsync.dylib)
IF( DEFINED CSYNC_BUILD_PATH )
SET(CSYNC_LIBRARY_PATH ${CSYNC_BUILD_PATH})
SET(CSYNC_BINARY_DIR ${CSYNC_BUILD_PATH})
IF(WIN32)
SET(CSYNC_LIBRARY ${CSYNC_BUILD_PATH}/src/libocsync.dll)
ELSEIF( APPLE )
SET(CSYNC_LIBRARY ${CSYNC_BUILD_PATH}/src/libocsync.dylib)
ELSE()
SET(CSYNC_LIBRARY ${CSYNC_LIBRARY_PATH}/src/libocsync.so)
ENDIF( )
SET(CSYNC_BINARY_DIR ${CSYNC_LIBRARY_PATH})
SET(CSYNC_LIBRARY ${CSYNC_BUILD_PATH}/src/libocsync.so)
ENDIF()
ELSE()
FIND_LIBRARY(CSYNC_LIBRARY NAMES ocsync HINTS $ENV{CSYNC_DIR})
ENDIF()
IF(NOT DEFINED CSYNC_INCLUDE_PATH)
FIND_PATH(CSYNC_INCLUDE_PATH NAMES csync.h HINTS $ENV{CSYNC_DIR} )
ENDIF()
SET(CSYNC_INCLUDE_DIR ${CSYNC_INCLUDE_PATH})
# handle the QUIETLY and REQUIRED arguments and set CSYNC_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Csync DEFAULT_MSG
CSYNC_LIBRARY CSYNC_INCLUDE_PATH)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Csync DEFAULT_MSG CSYNC_LIBRARY CSYNC_INCLUDE_PATH)
MARK_AS_ADVANCED( CSYNC_INCLUDE_PATH CSYNC_LIBRARY )

View File

@@ -4,12 +4,12 @@
# also defined, but not for general use are
# INOTIFY_LIBRARY, where to find the inotify library.
find_path(INOTIFY_INCLUDE_DIR sys/inotify.h)
find_path(INOTIFY_INCLUDE_DIR sys/inotify.h
HINTS /usr/include/${CMAKE_LIBRARY_ARCHITECTURE})
mark_as_advanced(INOTIFY_INCLUDE_DIR)
# handle the QUIETLY and REQUIRED arguments and set INOTIFY_FOUND to TRUE if
# all listed variables are TRUE
# handle the QUIETLY and REQUIRED arguments and set INOTIFY_FOUND to TRUE if
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(INOTIFY DEFAULT_MSG INOTIFY_INCLUDE_DIR)

View File

@@ -0,0 +1,16 @@
find_program(PDFLATEX_EXECUTABLE NAMES pdflatex
HINTS
$ENV{PDFLATEX_DIR}
PATH_SUFFIXES bin
DOC "PDF LaTeX"
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PdfLatex DEFAULT_MSG
PDFLATEX_EXECUTABLE
)
mark_as_advanced(
PDFLATEX_EXECUTABLE
)

View File

@@ -0,0 +1,18 @@
# - Try to find QtKeyChain
# Once done this will define
# QTKEYCHAIN_FOUND - System has QtKeyChain
# QTKEYCHAIN_INCLUDE_DIRS - The QtKeyChain include directories
# QTKEYCHAIN_LIBRARIES - The libraries needed to use QtKeyChain
# QTKEYCHAIN_DEFINITIONS - Compiler switches required for using LibXml2
find_path(QTKEYCHAIN_INCLUDE_DIR qtkeychain/keychain.h)
find_library(QTKEYCHAIN_LIBRARY NAMES libqtkeychain qtkeychain)
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set QTKEYCHAIN_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(QtKeyChain DEFAULT_MSG
QTKEYCHAIN_LIBRARY QTKEYCHAIN_INCLUDE_DIR)
mark_as_advanced(QTKEYCHAIN_INCLUDE_DIR QTKEYCHAIN_LIBRARY )

View File

@@ -0,0 +1,16 @@
find_program(SPHINX_EXECUTABLE NAMES sphinx-build
HINTS
$ENV{SPHINX_DIR}
PATH_SUFFIXES bin
DOC "Sphinx documentation generator"
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Sphinx DEFAULT_MSG
SPHINX_EXECUTABLE
)
mark_as_advanced(
SPHINX_EXECUTABLE
)

View File

@@ -0,0 +1,123 @@
# - Returns a version string from Git
#
# These functions force a re-configure on each git commit so that you can
# trust the values of the variables in your build system.
#
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
#
# Returns the refspec and sha hash of the current head revision
#
# git_describe(<var> [<additional arguments to git describe> ...])
#
# Returns the results of git describe on the source tree, and adjusting
# the output so that it tests false if an error occurs.
#
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
#
# Returns the results of git describe --exact-match on the source tree,
# and adjusting the output so that it tests false if there was no exact
# matching tag.
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__get_git_revision_description)
return()
endif()
set(__get_git_revision_description YES)
# We must run the following at "include" time, not at function call time,
# to find the path to this module rather than the path to a calling list file
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
function(get_git_head_revision _refspecvar _hashvar)
set(GIT_PARENT_DIR "${CMAKE_SOURCE_DIR}")
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
# We have reached the root directory, we are not in git
set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
return()
endif()
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
endwhile()
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
if(NOT EXISTS "${GIT_DATA}")
file(MAKE_DIRECTORY "${GIT_DATA}")
endif()
if(NOT EXISTS "${GIT_DIR}/HEAD")
return()
endif()
set(HEAD_FILE "${GIT_DATA}/HEAD")
configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
"${GIT_DATA}/grabRef.cmake"
@ONLY)
include("${GIT_DATA}/grabRef.cmake")
set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
endfunction()
function(git_describe _var)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
get_git_head_revision(refspec hash)
if(NOT GIT_FOUND)
set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
return()
endif()
if(NOT hash)
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
return()
endif()
# TODO sanitize
#if((${ARGN}" MATCHES "&&") OR
# (ARGN MATCHES "||") OR
# (ARGN MATCHES "\\;"))
# message("Please report the following error to the project!")
# message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
#endif()
#message(STATUS "Arguments to execute_process: ${ARGN}")
execute_process(COMMAND
"${GIT_EXECUTABLE}"
describe
${hash}
${ARGN}
WORKING_DIRECTORY
"${CMAKE_SOURCE_DIR}"
RESULT_VARIABLE
res
OUTPUT_VARIABLE
out
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var} "${out}" PARENT_SCOPE)
endfunction()
function(git_get_exact_tag _var)
git_describe(out --exact-match ${ARGN})
set(${_var} "${out}" PARENT_SCOPE)
endfunction()

View File

@@ -0,0 +1,38 @@
#
# Internal file for GetGitRevisionDescription.cmake
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
set(HEAD_HASH)
file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
if(HEAD_CONTENTS MATCHES "ref")
# named branch
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
if(EXISTS "@GIT_DIR@/${HEAD_REF}")
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}")
configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
set(HEAD_HASH "${HEAD_REF}")
endif()
else()
# detached HEAD
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
endif()
if(NOT HEAD_HASH)
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
string(STRIP "${HEAD_HASH}" HEAD_HASH)
endif()

View File

@@ -5,14 +5,15 @@
!define APPLICATION_VENDOR "@APPLICATION_VENDOR@"
!define APPLICATION_EXECUTABLE "@APPLICATION_EXECUTABLE@.exe"
!define APPLICATION_DOMAIN "@APPLICATION_DOMAIN@"
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.${APPLICATION_DOMAIN}"
!define APPLICATION_LICENSE "@APPLICATION_LICENSE@"
!define WIN_SETUP_BITMAP_PATH "@WIN_SETUP_BITMAP_PATH@"
;-----------------------------------------------------------------------------
; Some installer script options (comment-out options not required)
;-----------------------------------------------------------------------------
;!define OPTION_LICENSE_AGREEMENT
!if "@APPLICATION_LICENSE@" != ""
!define OPTION_LICENSE_AGREEMENT
!endif
!define OPTION_UAC_PLUGIN_ENHANCED
!define OPTION_SECTION_SC_START_MENU
!define OPTION_SECTION_SC_DESKTOP
@@ -30,9 +31,11 @@
!endif
!define MING_BIN "${MING_PATH}/bin"
!define MING_LIB "${MING_PATH}/lib"
!define MING_SHARE "${MING_PATH}/share"
!define BUILD_PATH "@CMAKE_BINARY_DIR@"
!define SOURCE_PATH "@CMAKE_SOURCE_DIR@"
!define QT_DLL_PATH "${MING_BIN}"
!define ACCESSIBLE_DLL_PATH "${MING_LIB}/qt4/plugins/accessible"
!define SQLITE_DLL_PATH "${MING_LIB}/qt4/plugins/sqldrivers"
!define IMAGEFORMATS_DLL_PATH "${MING_LIB}/qt4/plugins/imageformats"
@@ -40,7 +43,7 @@
!define CSYNC_PLUGIN_DIR "@CSYNC_PLUGIN_DIR@"
!define CSYNC_CONFIG_DIR "@CSYNC_CONFIG_DIR@"
!define NSI_PATH "${SOURCE_PATH}/admin/win/nsi"
!define NSI_PATH "${source_path}/admin/win/nsi"
;-----------------------------------------------------------------------------
; Installer version
@@ -60,7 +63,6 @@
; Initial installer setup and definitions.
;-----------------------------------------------------------------------------
Name "@CPACK_NSIS_PACKAGE_NAME@"
Caption "${APPLICATION_NAME} Setup"
BrandingText "${APPLICATION_NAME} ${VERSION} -- ${BUILD_TIME}"
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
InstallDir "$PROGRAMFILES\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
@@ -100,14 +102,12 @@ ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
!define MUI_ABORTWARNING
!define MUI_ICON ${NSI_PATH}\installer.ico
!define MUI_UNICON ${NSI_PATH}\installer.ico
!define MUI_WELCOMEFINISHPAGE_BITMAP ${NSI_PATH}\welcome_${APPLICATION_SHORTNAME}.bmp
!define MUI_WELCOMEPAGE_TITLE "Welcome to the @CPACK_PACKAGE_NAME@ ${VERSION} Setup Wizard"
!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation.$\r$\n$\r$\n$_CLICK"
!define MUI_WELCOMEFINISHPAGE_BITMAP ${WIN_SETUP_BITMAP_PATH}/welcome.bmp
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP ${NSI_PATH}\page_header_${APPLICATION_SHORTNAME}.bmp
!define MUI_HEADERIMAGE_BITMAP ${WIN_SETUP_BITMAP_PATH}/page_header.bmp
!define MUI_COMPONENTSPAGE_SMALLDESC
!define MUI_FINISHPAGE_TITLE "@CPACK_PACKAGE_NAME@ Setup Completed"
!define MUI_FINISHPAGE_LINK "Click here to visit the @CPACK_PACKAGE_NAME@ website."
!define MUI_FINISHPAGE_LINK "www.${APPLICATION_DOMAIN}"
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.${APPLICATION_DOMAIN}"
!define MUI_FINISHPAGE_NOREBOOTSUPPORT
!ifdef OPTION_FINISHPAGE_RELEASE_NOTES
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
@@ -125,7 +125,7 @@ ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
;-----------------------------------------------------------------------------
!insertmacro MUI_PAGE_WELCOME
!ifdef OPTION_LICENSE_AGREEMENT
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
!insertmacro MUI_PAGE_LICENSE "${APPLICATION_LICENSE}"
!endif
Page custom PageReinstall PageLeaveReinstall
!insertmacro MUI_PAGE_COMPONENTS
@@ -267,7 +267,7 @@ FunctionEnd
# INSTALLER SECTIONS #
# #
##############################################################################
Section "${APPLICATION_NAME}" SEC_OWNCLOUD
Section "${APPLICATION_NAME}" SEC_APPLICATION
SectionIn 1 2 3 RO
SetDetailsPrint listonly
@@ -284,22 +284,83 @@ Section "${APPLICATION_NAME}" SEC_OWNCLOUD
;Main executable.
File "${BUILD_PATH}\bin\${APPLICATION_EXECUTABLE}"
File "${BUILD_PATH}\src\libowncloudsync.dll"
File "${BUILD_PATH}\src\mirall_ca.qm"
File "${BUILD_PATH}\src\mirall_cs_CZ.qm"
File "${BUILD_PATH}\src\mirall_da.qm"
File "${BUILD_PATH}\src\mirall_de.qm"
File "${BUILD_PATH}\src\mirall_el.qm"
File "${BUILD_PATH}\src\mirall_en.qm"
File "${BUILD_PATH}\src\mirall_eo.qm"
File "${BUILD_PATH}\src\mirall_es.qm"
File "${BUILD_PATH}\src\mirall_es_AR.qm"
File "${BUILD_PATH}\src\mirall_et_EE.qm"
File "${BUILD_PATH}\src\mirall_eu.qm"
File "${BUILD_PATH}\src\mirall_fa.qm"
File "${BUILD_PATH}\src\mirall_fi_FI.qm"
File "${BUILD_PATH}\src\mirall_fr.qm"
File "${BUILD_PATH}\src\mirall_gl.qm"
File "${BUILD_PATH}\src\mirall_he.qm"
File "${BUILD_PATH}\src\mirall_hr.qm"
File "${BUILD_PATH}\src\mirall_hu_HU.qm"
File "${BUILD_PATH}\src\mirall_it.qm"
File "${BUILD_PATH}\src\mirall_ja_JP.qm"
File "${BUILD_PATH}\src\mirall_ko.qm"
File "${BUILD_PATH}\src\mirall_lb.qm"
File "${BUILD_PATH}\src\mirall_lt_LT.qm"
File "${BUILD_PATH}\src\mirall_lv.qm"
File "${BUILD_PATH}\src\mirall_mk.qm"
File "${BUILD_PATH}\src\mirall_ms_MY.qm"
File "${BUILD_PATH}\src\mirall_nb_NO.qm"
File "${BUILD_PATH}\src\mirall_nl.qm"
File "${BUILD_PATH}\src\mirall_oc.qm"
File "${BUILD_PATH}\src\mirall_pl.qm"
File "${BUILD_PATH}\src\mirall_pt_BR.qm"
File "${BUILD_PATH}\src\mirall_pt_PT.qm"
File "${BUILD_PATH}\src\mirall_ro.qm"
File "${BUILD_PATH}\src\mirall_ru.qm"
File "${BUILD_PATH}\src\mirall_ru_RU.qm"
File "${BUILD_PATH}\src\mirall_si_LK.qm"
File "${BUILD_PATH}\src\mirall_sk_SK.qm"
File "${BUILD_PATH}\src\mirall_sl.qm"
File "${BUILD_PATH}\src\mirall_sr@latin.qm"
File "${BUILD_PATH}\src\mirall_sv.qm"
File "${BUILD_PATH}\src\mirall_ta_LK.qm"
File "${BUILD_PATH}\src\mirall_th_TH.qm"
File "${BUILD_PATH}\src\mirall_tr.qm"
File "${BUILD_PATH}\src\mirall_uk.qm"
File "${BUILD_PATH}\src\mirall_vi.qm"
File "${BUILD_PATH}\src\mirall_zh_CN.qm"
File "${BUILD_PATH}\src\mirall_zh_TW.qm"
#File "${MING_SHARE}\qt4\translations\qt_ar.qm"
File "${MING_SHARE}\qt4\translations\qt_cs.qm"
File "${MING_SHARE}\qt4\translations\qt_da.qm"
File "${MING_SHARE}\qt4\translations\qt_de.qm"
File "${MING_SHARE}\qt4\translations\qt_es.qm"
File "${MING_SHARE}\qt4\translations\qt_fa.qm"
File "${MING_SHARE}\qt4\translations\qt_fr.qm"
File "${MING_SHARE}\qt4\translations\qt_gl.qm"
File "${MING_SHARE}\qt4\translations\qt_he.qm"
File "${MING_SHARE}\qt4\translations\qt_hu.qm"
File "${MING_SHARE}\qt4\translations\qt_ja.qm"
File "${MING_SHARE}\qt4\translations\qt_ko.qm"
File "${MING_SHARE}\qt4\translations\qt_lt.qm"
File "${MING_SHARE}\qt4\translations\qt_pl.qm"
File "${MING_SHARE}\qt4\translations\qt_pt.qm"
File "${MING_SHARE}\qt4\translations\qt_ru.qm"
File "${MING_SHARE}\qt4\translations\qt_sk.qm"
File "${MING_SHARE}\qt4\translations\qt_sl.qm"
File "${MING_SHARE}\qt4\translations\qt_sv.qm"
File "${MING_SHARE}\qt4\translations\qt_uk.qm"
File "${MING_SHARE}\qt4\translations\qt_zh_CN.qm"
File "${MING_SHARE}\qt4\translations\qt_zh_TW.qm"
File "${MING_SHARE}\qt4\translations\qt_zh_TW.qm"
File "${MING_SHARE}\qt4\translations\qtkeychain_de.qm"
SetOutPath "$INSTDIR\accessible"
File "${ACCESSIBLE_DLL_PATH}\qtaccessiblewidgets4.dll"
SetOutPath "$INSTDIR\modules"
; FIXME: fix installation dir of module, currently needs manual copying to
@@ -313,7 +374,7 @@ Section "${APPLICATION_NAME}" SEC_OWNCLOUD
;License & release notes.
File "@CPACK_RESOURCE_FILE_LICENSE@"
File /oname=NOTES.txt ${NSI_PATH}\RELEASE_NOTES.txt
;File /oname=NOTES.txt ${NSI_PATH}\RELEASE_NOTES.txt
;QT stuff:
File "${QT_DLL_PATH}\QtCore4.dll"
@@ -321,6 +382,9 @@ Section "${APPLICATION_NAME}" SEC_OWNCLOUD
File "${QT_DLL_PATH}\QtNetwork4.dll"
File "${QT_DLL_PATH}\QtXml4.dll"
;QtKeyChain stuff
File "${MING_BIN}\libqtkeychain.dll"
File "${CSYNC_LIBRARY_DIR}/libocsync.dll"
File "${MING_BIN}\libsqlite3-0.dll"
File "${MING_BIN}\libiniparser.dll"
@@ -328,14 +392,10 @@ Section "${APPLICATION_NAME}" SEC_OWNCLOUD
File "${MING_BIN}\libpng15-15.dll"
; ownCloud plugin
File "${MING_BIN}\libgcrypt-11.dll"
File "${MING_BIN}\libgnutls-26.dll"
File "${MING_BIN}\libgpg-error-0.dll"
File "${MING_BIN}\libintl-8.dll"
File "${MING_BIN}\libneon-27.dll"
File "${MING_BIN}\libproxy.dll"
File "${MING_BIN}\libmodman.dll"
File "${MING_BIN}\libtasn1-3.dll"
File "${MING_BIN}\libxml2-2.dll"
;MinGW stuff
@@ -346,11 +406,10 @@ Section "${APPLICATION_NAME}" SEC_OWNCLOUD
;File "${MING_BIN}\libpng15-15.dll"
;File "${MING_BIN}\libjpeg-8.dll"
File "${MING_BIN}\zlib1.dll"
File "${MING_BIN}\libcrypto-8.dll"
File "${MING_BIN}\libssl-8.dll"
File "${MING_BIN}\libcrypto-10.dll"
File "${MING_BIN}\libssl-10.dll"
; CSync configs
File "${CSYNC_CONFIG_DIR}/ocsync.conf"
File "${SOURCE_PATH}/sync-exclude.lst"
SectionEnd
@@ -366,9 +425,9 @@ SectionGroup "Shortcuts"
SetShellVarContext all
RMDir /r "$SMPROGRAMS\${APPLICATION_NAME}"
CreateDirectory "$SMPROGRAMS\${APPLICATION_NAME}"
CreateShortCut "$SMPROGRAMS\${APPLICATION_NAME}\LICENSE.lnk" "$INSTDIR\LICENSE.txt"
;CreateShortCut "$SMPROGRAMS\${APPLICATION_NAME}\LICENSE.lnk" "$INSTDIR\LICENSE.txt"
CreateShortCut "$SMPROGRAMS\${APPLICATION_NAME}\${APPLICATION_NAME}.lnk" "$INSTDIR\${APPLICATION_EXECUTABLE}"
CreateShortCut "$SMPROGRAMS\${APPLICATION_NAME}\Release notes.lnk" "$INSTDIR\NOTES.txt"
;CreateShortCut "$SMPROGRAMS\${APPLICATION_NAME}\Release notes.lnk" "$INSTDIR\NOTES.txt"
CreateShortCut "$SMPROGRAMS\${APPLICATION_NAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe"
SetShellVarContext current
${MementoSectionEnd}
@@ -403,7 +462,7 @@ SectionGroupEnd
DetailPrint "Creating Windows Start Entry"
SetDetailsPrint listonly
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Run" \
"${APPLICATION_NAME}" "$INSTDIR\${APPLICATION_EXECUTABLE}"
"${APPLICATION_NAME}" "$INSTDIR\${APPLICATION_EXECUTABLE}"
${MementoSectionEnd}
!endif
@@ -416,7 +475,7 @@ ${MementoSectionDone}
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_START_MENU} "${APPLICATION_NAME} program group."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_DESKTOP} "Desktop shortcut for ${APPLICATION_NAME}."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_QUICK_LAUNCH} "Quick Launch shortcut for ${APPLICATION_NAME}."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_QUICK_AUTOSTART} "Register ${APPLICATION_NAME} to run on Windows startup."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_AUTOSTART} "Register ${APPLICATION_NAME} to run on Windows startup."
!insertmacro MUI_FUNCTION_DESCRIPTION_END
Section -post

View File

@@ -3,6 +3,10 @@
#cmakedefine USE_INOTIFY 1
#cmakedefine WITH_CSYNC 1
#cmakedefine WITH_QTKEYCHAIN 1
#cmakedefine GIT_SHA1 "@GIT_SHA1@"
#cmakedefine APPLICATION_DOMAIN @APPLICATION_DOMAIN@
#cmakedefine THEME_CLASS @THEME_CLASS@
#cmakedefine THEME_INCLUDE @THEME_INCLUDE@
#endif

79
doc/CMakeLists.txt Normal file
View File

@@ -0,0 +1,79 @@
if(SPHINX_FOUND)
# Sphinx cache with pickled ReST documents
set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees")
# HTML output directory
set(SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/html")
set(SPHINX_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/man")
set(SPHINX_PDF_DIR "${CMAKE_CURRENT_BINARY_DIR}/latex")
set(SPHINX_QCH_DIR "${CMAKE_CURRENT_BINARY_DIR}/qthelp")
set(SPHINX_HTMLHELP_DIR "${CMAKE_CURRENT_BINARY_DIR}/htmlhelp")
set(MSHTML_COMPILER wine 'C:\\Program Files\\HTML Help Workshop\\hhc.exe')
# assets
set(LATEX_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/logo-blue.pdf")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in" conf.py @ONLY)
if(WITH_DOC)
add_custom_target(doc ALL DEPENDS doc-html doc-man COMMENT "Building documentation...")
install(DIRECTORY ${SPHINX_HTML_DIR} DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(DIRECTORY ${SPHINX_MAN_DIR} DESTINATION ${CMAKE_INSTALL_MANDIR})
else(WITH_DOC)
add_custom_target(doc DEPENDS doc-html doc-man COMMENT "Building documentation...")
endif(WITH_DOC)
if(PDFLATEX_FOUND)
# if this still fails on Debian/Ubuntu, run
# apt-get install texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended
add_custom_target(doc-latex ${SPHINX_EXECUTABLE}
-q -c . -b latex
-d ${SPHINX_CACHE_DIR}
-D latex_logo=${LATEX_LOGO}
${CMAKE_CURRENT_SOURCE_DIR}
${SPHINX_PDF_DIR} )
add_custom_target(doc-pdf make -C ${SPHINX_PDF_DIR} all-pdf
DEPENDS doc-latex )
add_dependencies(doc doc-pdf)
if (WITH_DOC)
install(DIRECTORY ${SPHINX_PDF_DIR} DESTINATION ${CMAKE_INSTALL_DOCDIR})
endif (WITH_DOC)
endif(PDFLATEX_FOUND)
if (EXISTS ${QT_QCOLLECTIONGENERATOR_EXECUTABLE})
add_custom_target( doc-qch-sphinx ${SPHINX_EXECUTABLE}
-q -c . -b qthelp
-d ${SPHINX_CACHE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${SPHINX_QCH_DIR} )
add_custom_target( doc-qch ${QT_QCOLLECTIONGENERATOR_EXECUTABLE}
${SPHINX_QCH_DIR}/*.qhcp
DEPENDS doc-qch-sphinx )
add_dependencies(doc doc-qch)
if (WITH_DOC)
install(DIRECTORY ${SPHINX_QCH_DIR} DESTINATION ${CMAKE_INSTALL_DOCDIR})
endif (WITH_DOC)
endif()
add_custom_target( doc-html ${SPHINX_EXECUTABLE}
-q -c . -b html
-d ${SPHINX_CACHE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${SPHINX_HTML_DIR} )
add_custom_target( doc-man ${SPHINX_EXECUTABLE}
-q -c . -b man
-d ${SPHINX_CACHE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${SPHINX_MAN_DIR} )
## Building CHM files requires HTML Help Workshop. Since it requires wine
## with special dependencies, it's impossible to write a cmake check for it.
## This is why doc-chm is not a dependency for doc. Instead, run
## doc/scripts/htmlhelp.exe to install them and run this target
## explicitly.
add_custom_target( doc-chm-sphinx ${SPHINX_EXECUTABLE}
-q -c . -b htmlhelp
-D html_theme=basic
-d ${SPHINX_CACHE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${SPHINX_HTMLHELP_DIR} )
add_custom_target( doc-chm pushd ${SPHINX_HTMLHELP_DIR}; ${MSHTML_COMPILER} *.hhp; popd
DEPENDS doc-chm-sphinx )
endif(SPHINX_FOUND)

153
doc/Makefile Normal file
View File

@@ -0,0 +1,153 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OwncloudDocumentation.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OwncloudDocumentation.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/OwncloudDocumentation"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OwncloudDocumentation"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."

108
doc/architecture.rst Normal file
View File

@@ -0,0 +1,108 @@
Architecture
============
.. index:: architecture
The ownCloud project provides desktop sync clients to synchronize the
contents of local directories on the desktop machines to the ownCloud.
The syncing is done with csync_, a bidirectional file synchronizing tool which
provides both a command line client as well as a library. A special module for
csync was written to synchronize with ownClouds built-in WebDAV server.
The ownCloud sync client is based on a tool called mirall initially written by
Duncan Mac Vicar. Later Klaas Freitag joined the project and enhanced it to work
with ownCloud server. Both mirall and ownCloud Client (oCC) build from the same
source, currently hosted in the ownCloud source repo on gitorious.
oCC is written in C++ using the `Qt Framework`_. As a result oCC runs on the
three important platforms Linux, Windows and MacOS.
.. _csync: http://www.csync.org
.. _`Qt Framework`: http://www.qt-project.org
The Sync Process
----------------
First it is important to recall what syncing is. Syncing tries to keep the files
on both repositories the same. That means if a file is added to one repository
it is going to be copied to the other repository. If a file is changed on one
repository, the change is propagated to the other repository. Also, if a file
is deleted on one side, it is deleted on the other. As a matter of fact, in
ownCloud syncing we do not have a typical client/server system where the
server is always master.
This is the major difference to other systems like a file backup where just
changes and new files are propagated but files never get deleted.
Sync Direction and Strategies
-----------------------------
.. index:: time stamps, file times, etag, unique id
Until the release of ownCloud 4.5 and ownCloud Client 1.1, ownCloud employed
a single file property to decide which file is newer and hence needs to be
synced to the other repository: the files modification time.
The *modification timestamp* is part of the files metadata. It is available on
every relevant filesystem and is the natural indicator for a file change.
modification timestamps do not require special action to create and have
a general meaning. One design goal of csync is to not require a special server
component, thats why it was chosen as the backend component.
To compare the modification times of two files from different systems,
it is needed to operate on the same base. Before version 1.1.0,
csync requires both sides running on the exact same time, which can
be achieved through enterprise standard `NTP time synchronisation`_ on all
machines.
Since this strategy is rather fragile without NTP, ownCloud 4.5 introduced a
unique number, which changes whenever the file changes. Although it is a unique
value, it is not a hash of the file, but a randomly chosen number, which it will
transmit in the Etag_ field. The client will store this number in a
per-directory database, located in the application directory (version 1.1) or
as a hidden file right in the directory to be synced (later versions).
Since the file number is guaranteed to change if the file changes, it can now be
used to determine if one of the files has changed.
.. todo:: describe what happens if both sides change
If the per-directory database gets removed, oCC's CSync backend will fall back
to a time-stamp based sync process to rebuild the database. Thus it should be
made sure that both server and client synchronized to NTP time before
restarting the client after a database removal. If time deviates, the sync
process might create faux conflict files, which only differ in their time.
Those need to be cleaned up manually later on and will not be synced back
to the server. However, no files will get deleted in this process.
Just like files, directories also hold a unique id, which changes whenever
one of the contained files or directories gets modified. Since this is a
recursive process, it significantly reduces the effort required for a sync
cycle, because the client will only walk directories with a modified unique id.
.. note:: oCC 1.1 and newer require file ID capabilities on the ownCloud server,
hence using them with a server earlier than 4.5.0 is not supported.
This table outlines the different sync methods attempted depending
on server/client combination:
.. index:: compatiblity table
+--------------------+-------------------+----------------------------+
| Server Version | Client Version | Sync Methods |
+====================+===================+============================+
| 4.0.x or earlier | 1.0.5 or earlier | Time Stamp |
+--------------------+-------------------+----------------------------+
| 4.0.x or earlier | 1.1 or later | n/a (incompatible) |
+--------------------+-------------------+----------------------------+
| 4.5 or later | 1.0.5 or earlier | Time Stamp |
+--------------------+-------------------+----------------------------+
| 4.5 or later | 1.1 or later | File ID, Time Stamp |
+--------------------+-------------------+----------------------------+
It is highly recommended to upgrade to ownCloud 4.5 or later with ownCloud
Client 1.1 or later, since the time stamp-based sync mechanism can
lead to data loss in certain edge-cases, especially when multiple clients
are involved and one of them is not in sync with NTP time.
.. _`NTP time synchronisation`: http://en.wikipedia.org/wiki/Network_Time_Protocol
.. _Etag: http://en.wikipedia.org/wiki/HTTP_ETag

171
doc/building.rst Normal file
View File

@@ -0,0 +1,171 @@
Building the Client
===================
This section explains how to build the ownCloud Client from source
for all major platforms. You should read this section if you want
to development on the desktop client.
Linux
-----
1. Add the `ownCloud repository from OBS`_.
2. Install the dependencies (as root, or via sudo):
* Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
* openSUSE: ``zypper ref; zypper si -d owncloud-client``
* Fedora/CentOS: ``yum install yum-utils; yum-builddep owncloud-client``
3. Follow the `generic build instructions`_.
Mac OS X
--------
Next to XCode (and the command line tools!), you will need some
extra dependencies.
You can install these dependencies via MacPorts_ or Homebrew_.
This is only needed on the build machine, since non-standard libs
will be deployed in the app bundle.
The tested and preferred way is to use HomeBrew_. The ownCloud team has
its own repository which contains non-standard recipes. Add it with::
brew tap owncloud/owncloud
Next, install the missing dependencies::
brew install $(brew deps ocsync)
brew install $(brew deps mirall)
To build mirall and cmake, follow the `generic build instructions`_.
.. note::
You should not call ``make install`` at any time, since the product of the
mirall build is an app bundle. Call ``make package`` instead to create an
install-ready disk image.
Windows (cross-compile)
-----------------------
Due to the amount of dependencies that csync entails, building the client
for Windows is **currently only supported on openSUSE**, by using the MinGW
cross compiler. You can set up openSUSE 12.1 or 12.2 in a virtual machine
if you do not have it installed already.
In order to cross-compile, the following repositories need to be added
via YaST or ``zypper ar`` (adjust when using openSUSE 12.2)::
zypper ar http://download.opensuse.org/repositories/isv:/ownCloud:/devel:/mingw:/win32/openSUSE_12.1/isv:ownCloud:devel:mingw:win32.repo
zypper ar http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_12.1/windows:mingw:win32.repo
zypper ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_12.1/windows:mingw.repo
Next, install the cross-compiler packages and the cross-compiled dependencies::
zypper install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
mingw32-headers mingw32-runtime site-config mingw32-iniparser-devel \
mingw32-libsqlite-devel mingw32-dlfcn-devel mingw32-libssh2-devel \
kdewin-png2ico mingw32-libqt4 mingw32-libqt4-devel mingw32-libgcrypt \
mingw32-libgnutls mingw32-libneon mingw32-libneon-devel mingw32-libbeecrypt \
mingw32-libopenssl mingw32-openssl mingw32-libpng-devel mingw32-libsqlite \
mingw32-qtkeychain mingw32-qtkeychain-devel mingw32-iniparser mingw32-dlfcn \
mingw32-libintl-devel mingw32-libneon-devel mingw32-libopenssl-devel \
mingw32-libproxy-devel mingw32-libxml2-devel mingw32-zlib-devel
For the installer, the NSIS installer package is also required::
zypper install mingw32-cross-nsis
.. Usually, the following would be needed as well, but due to a bug in mingw, they
will currently not build properly from source.
mingw32-cross-nsis-plugin-processes mingw32-cross-nsis-plugin-uac
You will also need to manually download and install the following files with
``rpm -ivh <package>`` (They will also work with OpenSUSE 12.2)::
rpm -ihv http://pmbs.links2linux.org/download/mingw:/32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-processes-0-1.1.x86_64.rpm
rpm -ihv http://pmbs.links2linux.org/download/mingw:/32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-uac-0-3.1.x86_64.rpm
Now, follow the `generic build instructions`_, but pay attention to
the following differences:
1. For building ``libocsync``, you need to use ``mingw32-cmake`` instead
of cmake.
2. for building ``mirall``, you need to use ``cmake`` again, but make sure
to append the following parameter::
3. Also, you need to specify *absolute pathes* for ``CSYNC_LIBRARY_PATH``
and ``CSYNC_LIBRARY_PATH`` when running ``cmake`` on mirall.
``-DCMAKE_TOOLCHAIN_FILE=../mirall/admin/win/Toolchain-mingw32-openSUSE.cmake``
Finally, just build by running ``make``. ``make package`` will produce
an NSIS-based installer, provided the NSIS mingw32 packages are installed.
Generic Build Instructions
--------------------------
.. _`generic build instructions`
The ownCloud Client requires Mirall and CSync_. Mirall is the GUI frontend,
while CSync is responsible for handling the actual synchronization process.
At the moment, ownCloud Client requires a forked version of CSync. Both
CMake and Mirall can be downloaded at ownCloud's `Client Download Page`_.
If you want to build the leading edge version of the client, you should
use the latest versions of Mirall and CSync via Git_, like so::
git clone git://git.csync.org/users/freitag/csync.git ocsync
git clone git://github.com/owncloud/mirall.git
Next, create build directories::
mkdir ocsync-build
mkdir mirall-build
This guide assumes that all directories are residing next to each other.
Next, make sure to check out the 'dav' branch in the newly checked out
`ocsync` directory::
cd ocsync
git checkout dav
The first package to build is CSync::
cd ocsync-build
cmake -DCMAKE_BUILD_TYPE="Debug" ../ocsync
make
You probably have to satisfy some dependencies. Make sure to install all the
needed development packages. You will need ``iniparser``, ``sqlite3`` as well as
``neon`` for the ownCloud module. Take special care about ``neon``. If that is
missing, the cmake run will succeed but silently not build the ownCloud module.
``libssh`` and ``libsmbclient`` are optional and not required for the client
to work. If you want to install the client, run ``make install`` as a final step.
Next, we build mirall::
cd ../mirall-build
cmake -DCMAKE_BUILD_TYPE="Debug" ../mirall \
-DCSYNC_BUILD_PATH=/path/to/ocsync-build \
-DCSYNC_INCLUDE_PATH=/path/to/ocsync/src
Note that it is important to use absolute pathes for the include- and library
directories. If this succeeds, call ``make``. The owncloud binary should appear
in the ``bin`` directory. You can also run ``make install`` to install the client to
``/usr/local/bin``.
To build an installer/app bundle (requires the mingw32-cross-nsis packages on Windows)::
make package
Known cmake parameters:
* WITH_DOC=TRUE: create doc and manpages via running ``make``; also adds install statements to be able to install it via ``make install``.
.. _`ownCloud repository from OBS`: http://software.opensuse.org/download/package?project=isv:ownCloud:devel&package=owncloud-client
.. _CSync: http://www.csync.org
.. _`Client Download Page`: http://owncloud.org/sync-clients/
.. _Git: http://git-scm.com
.. _MacPorts: http://www.macports.org
.. _Homebrew: http://mxcl.github.com/homebrew/

290
doc/conf.py.in Normal file
View File

@@ -0,0 +1,290 @@
# -*- coding: utf-8 -*-
#
# ownCloud Documentation documentation build configuration file, created by
# sphinx-quickstart on Mon Oct 22 23:16:40 2012.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.todo']
# Add any paths that contain templates here, relative to this directory.
#templates_path = ['templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'ownCloud Client Manual'
copyright = u'2012, The ownCloud developers'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '@VERSION_MAJOR@.@VERSION_MINOR@'
# The full version, including alpha/beta/rc tags.
release = '@VERSION@'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
2
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = ['themes']
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#html_theme = 'bootstrap'
html_theme = 'default'
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
html_short_title = "Client Manual"
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
#html_static_path = ['static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = False
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'ownCloudClientManual'
# -- Options for LaTeX output --------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'ownCloudClientManual.tex', u'ownCloud Client Manual',
u'The ownCloud developers', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('owncloud.1', 'owncloud', u'File synchronisation desktop utility.',
[u'The ownCloud developers'], 1),
('mirall.1', 'mirall', u'File synchronisation desktop utility.',
[u'The ownCloud developers'], 1)
]
# If true, show URL addresses after external links.
man_show_urls = True
# -- Options for Texinfo output ------------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'ownCloudClientManual', u'ownCloud Client Manual',
u'The ownCloud developers', 'ownCloud', 'The ownCloud Client Manual.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# -- Options for Epub output ---------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = u'ownCloud Client Manual'
epub_author = u'The ownCloud developers'
epub_publisher = u'The ownCloud developers'
epub_copyright = u'2012, The ownCloud developers'
# The language of the text. It defaults to the language option
# or en if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
#epub_exclude_files = []
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True
# Include todos?
todo_include_todos = True

31
doc/conffile.rst Normal file
View File

@@ -0,0 +1,31 @@
ownCloud Client reads a configuration file.
On Linux it can be found in:
``$HOME/.local/share/data/ownCloud/owncloud.cfg``
On Windows it can be found in:
``%LOCALAPPDATA%\ownCloud\owncloud.cfg``
On Mac it can be found in:
``$HOME/Library/Application Support/ownCloud``
It contains settings in the ini file format known from Windows.
.. note:: Changes here should be done carefully as wrong settings can cause disfunctionality.
.. note:: Changes may be overwritten by using ownCloud's configuration dialog.
.. note:: The new version is less precise in this regard.
These are config settings that may be changed:
``remotePollinterval`` (default: ``30000``)
Poll time for the remote repository in milliseconds
``maxLogLines`` (default: ``20000``)
Maximum count of log lines shown in the log window
``remotePollinterval``
The frequency used for polling for remote changes on the ownCloud Server.

28
doc/glossary.rst Normal file
View File

@@ -0,0 +1,28 @@
Glossary
========
.. glossary::
:sorted:
ownCloud Client
oCC
Name of the official ownCloud syncing client for desktop, which runs on
Windows, Mac OS X and Linux. It is based Mirall, and uses the CSync
sync engine for synchronization with the ownCloud server.
ownCloud Server
The server counter part of ownCloud Client as provided by the ownCloud
community.
mtime
modification time
file modification time
File property used to determine whether the servers' or the clients' file
is more recent. Standard procedure in oCC 1.0.5 and earlier, used by
oCC 1.1 and later only when no sync database exists and files already
exist in the client directory.
unique id
ID assigned to every file starting with ownCloud server 4.5 and submitted
via the HTTP ``Etag``. Used to check if files on client and server have
changed.

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

15
doc/index.rst Normal file
View File

@@ -0,0 +1,15 @@
.. _contents:
Contents
========
.. toctree::
:maxdepth: 2
install
usage
building
architecture
troubleshooting
glossary

36
doc/install.rst Normal file
View File

@@ -0,0 +1,36 @@
Installation
============
General
-------
The latest version of ownCloud client can be obtained at
http://owncloud.org/sync-clients/.
Windows
-------
ownCloud client for Windows is provided as a NSIS-based setup file for
machine-wide install.
Mac OS X
--------
Installing the ownCloud client on your Mac follows the normal app installation
pattern:
1. Download the installation file Click ownCloud-1.1.1.dmg, a window with the
2. ownCloud icon opens In that window, drag the ownCloud application into the
3. Applications folder on the right hand side From Applications, choose
ownCloud
Linux
------
The ownCloud client is provided as in a convenient repository for a wide range
of popular Linux distributions. If you want to build the sources instead.
Supported distributions are CentOS/RHEL, Fedora, SLES, openSUSE, Ubuntu and
Debian.
To support other distributions, a source build is required.

BIN
doc/logo-blue.pdf Normal file

Binary file not shown.

190
doc/make.bat Normal file
View File

@@ -0,0 +1,190 @@
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
set I18NSPHINXOPTS=%SPHINXOPTS% .
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\OwncloudDocumentation.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\OwncloudDocumentation.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
:end

38
doc/mirall.1.rst Normal file
View File

@@ -0,0 +1,38 @@
mirall(1)
---------
SYNOPSIS
========
*mirall* [`OPTIONS`...]
DESCRIPTION
===========
mirall is a file synchronisation desktop utility.
It synchronizes files on your local machine with an ownCloud Server. If you
make a change to the files on one computer, it will flow across the others
using this desktop sync clients.
Normally you start the client by click on the desktop icon or start from the
application menu. After starting an ownCloud icon appears in the system tray.
Options
=======
.. include:: options.rst
Config File
===========
.. include:: conffile.rst
BUGS
====
Please report bugs at https://github.com/owncloud/core/issues.
SEE ALSO
========
`csync(1)`, `mirall(1)`

15
doc/options.rst Normal file
View File

@@ -0,0 +1,15 @@
ownCloud Client supports the following command line switches:
``--logwindow``
open a window to show log output at startup.
``--logfile`` `<filename>`
write log output to file.
``--flushlog``
flush the log file after every write.
``--monoicons``
Use black/white pictograms for systray.

37
doc/owncloud.1.rst Normal file
View File

@@ -0,0 +1,37 @@
owncloud(1)
-----------
SYNOPSIS
========
*owncloud* [`OPTIONS`...]
DESCRIPTION
===========
owncloud is a file synchronisation desktop utility it is based on mirall.
It synchronizes files on your local machine with an ownCloud Server. If you
make a change to the files on one computer, it will flow across the others
using this desktop sync clients.
Normally you start the client by click on the desktop icon or start from the
application menu. After starting an ownCloud icon appears in the system tray.
Options
=======
.. include:: options.rst
Config File
===========
.. include:: conffile.rst
BUGS
====
Please report bugs at https://github.com/owncloud/core/issues.
SEE ALSO
========
`csync(1)`, `mirall(1)`

12
doc/scripts/README.rst Normal file
View File

@@ -0,0 +1,12 @@
Doc Build Convenience Scripts
=============================
* ``htmlhelp.sh``: A script to install Microsoft HTML Workshop on Linux or Mac OS using Wine, along with some dependencies.
* ``htmlhelp.reg``: Registry file to override some DLLs with their native version and set the right Windows version.
Those files have been taken from the HTML Help Project (http://code.google.com/p/htmlhelp/wiki/HHW4Wine).
License
-------
The HTML Help Project has licensed its software under LGPLv3 terms.

12
doc/scripts/htmlhelp.reg Executable file
View File

@@ -0,0 +1,12 @@
REGEDIT4
[HKEY_CURRENT_USER\Software\Wine]
"Version"="win2k"
[HKEY_CURRENT_USER\Software\Wine\AppDefaults\hhc.exe\DllOverrides]
"itircl"="native"
"itss"="native"
[HKEY_CURRENT_USER\Software\Wine\AppDefaults\hhw.exe\DllOverrides]
"itircl"="native"
"itss"="native"

27
doc/scripts/htmlhelp.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/sh
WINEPREFIX=${WINEPREFIX:=$HOME/.wine}
test -d "$WINEPREFIX" || wineprefixcreate
# Setup the registry
wine regedit htmlhelp.reg
# Install HTML Help Workshop
wget 'http://go.microsoft.com/fwlink/?LinkId=14188' -O htmlhelp.exe
wine htmlhelp.exe
# Install ITSS.DLL
cabextract -F hhupd.exe htmlhelp.exe
cabextract -F itircl.dll hhupd.exe
cabextract -F itss.dll hhupd.exe
cp -a itircl.dll "$WINEPREFIX/drive_c/windows/system32/"
cp -a itss.dll "$WINEPREFIX/drive_c/windows/system32/"
wine regsvr32 /s 'C:\WINDOWS\SYSTEM32\itircl.dll'
wine regsvr32 /s 'C:\WINDOWS\SYSTEM32\itss.dll'
# Install MFC40.DLL
wget -N http://activex.microsoft.com/controls/vc/mfc40.cab
cabextract -F mfc40.exe mfc40.cab
cabextract -F mfc40.dll mfc40.exe
cp -a mfc40.dll "$WINEPREFIX/drive_c/windows/system32/"

85
doc/troubleshooting.rst Normal file
View File

@@ -0,0 +1,85 @@
Troubleshooting
===============
If the client fails to start syncing it basically can have two
basic reasons: Either the server setup has a problem or the client
has a bug. When reporting bugs, it is crucial to find out what part
of the system causes the problem.
Here are a couple of useful steps to isolate the problem.
:A general ownCloud Server test:
A very first check is to verify that you can log on to ownClouds web
application. Assuming your ownCloud instance is installed at
``http://yourserver.com/owncloud``, type
``http://yourserver.com/owncloud/`` into your browsers address bar.
If you are not prompted to enter your user name and password, or if you
see a red warning box on the page, your server setup is not correct or needs
fixes. Please verify that your server installation is working correctly.
:All desktop clients fail to connect to ownCloud:
The ownCloud syncing use the built in WebDAV server of ownCloud.
Verify that you can log on to ownClouds WebDAV server. Assuming your ownCloud
instance is installed at ``http://yourserver.com/owncloud``, type
``http://yourserver.com/owncloud/remote.php/webdav`` into your browsers
address bar.
If you are prompted, but the authentication fails even though the credentials
your provided are correct, please ensure that your authentication backend
is configured properly.
:Use a WebDAV command line tool to test:
A more sophisticated test is to use a WebDAV command line client and log
into the ownCloud WebDAV server, such as a little app called cadaver, available
on Linux. It can be used to further verify that the WebDAV server is running
properly, for example by performing PROPFIND calls:
``propget .`` called within cadaver will return some properties of the current
directory and thus be a successful WebDAV connect.
Logfiles
========
Doing effective debugging requires to provide as much as relevant logfiles as
possible. The log output can help you with tracking down problem, and if you
report a bug, you're advised to include the output.
:Client Logfile:
Start the client with ``--logwindow``. That opens a window providing a view
on the current log. It provides a Save button to let you save the log to a
file.
You can also open a log window for an already running session, by simply
starting the client again with this parameter. Syntax:
* Windows: ``C:\Program Files (x86)\ownCloud\owncloud.exe --logwindow``
* Mac OS X: ``/Applications/owncloud.app/Contents/MacOS/owncloud --logwindow``
* Linux: ``owncloud --logwindow``
It is also possible to directly log into a file, which is an useful option
in case the problem only happens ocassionally. In that case it is better to
create a huge logfile than piping the whole log through the log window.
To create a log file, start the client with ``--logfile <filename>``.
:ownCloud server Logfile:
The ownCloud server maintains an ownCloud specific logfile as well. It can and
must be enabled through the ownCloud Administration page. There you can adjust
the loglevel. It is advisable to set it to a verbose level like ``Debug`` or ``Info``.
The logfile can be viewed either in the web interface or can be found in the
filesystem in the ownCloud server data dir.
:Webserver Logfiles:
Also, please take a look at your webservers error log file to check if there
are problems. For apache on linux, the error logs usually can be found at
``/var/log/apache2``. A file called ``error_log`` shows errors like PHP code
problems. A file called ``access_log`` usually records all requests handled
by the server. Especially the access_log is a very good debugging tool as the
log line contains a lot of information of every request and it's result.
More information about the apache logging can be found at
``http://httpd.apache.org/docs/current/logs.html``.

24
doc/usage.rst Normal file
View File

@@ -0,0 +1,24 @@
Usage
=====
.. index:: usage, client sync usage
To start ownCloud Client, click on the desktop icon or start it from the
application menu. In the system tray, an ownCloud icon appears.
.. index:: start application
A left click on the tray icon open a status dialog which gives an overview on
the configured sync folders and allows to add and remove more sync folder
connections as well as pausing a sync connection.
A right click on the tray icon gives other configuration options.
Options
-------
.. index:: command line switches, command line, options, parameters
.. include:: options.rst
Config File
-----------
.. index:: config file
.. include:: conffile.rst

48
issue_template.md Normal file
View File

@@ -0,0 +1,48 @@
### Expected behaviour
Tell us what should happen
### Actual behaviour
Tell us what happens instead
### Steps to reproduce
1.
2.
3.
### Server configuration
Operating system:
Web server:
Database:
PHP version:
ownCloud version:
### Client configuration
Client version:
Operating system:
OS language:
Installation path of client:
### Logs
#### output of `owncloud --logwindow` or `owncloud --logfile log.txt`
```
Insert your log output here
```
#### Web server error log
```
Insert your webserver log here
```
#### ownCloud log (data/owncloud.log)
```
Insert your ownCloud log here
```

7
mirall.desktop.in Normal file
View File

@@ -0,0 +1,7 @@
[Desktop Entry]
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
GenericName=Folder Sync
Icon=@APPLICATION_SHORTNAME@

View File

@@ -1,35 +1,14 @@
<RCC>
<qresource prefix="/mirall">
<file>resources/mirall-32.png</file>
<file>resources/mirall-64.png</file>
<file>resources/mirall-128.png</file>
<file>resources/folder-grey-32.png</file>
<file>resources/folder-remote-32.png</file>
<file>resources/folder-grey-22.png</file>
<file>resources/folder-remote-22.png</file>
<file>resources/mirall-22.png</file>
<file>resources/mirall-48.png</file>
<file>resources/folder-grey-48.png</file>
<file>resources/folder-remote-48.png</file>
<file>resources/dialog-close.png</file>
<file>resources/dialog-ok.png</file>
<file>resources/dialog-cancel.png</file>
<file>resources/view-refresh.png</file>
<file>resources/folder-favorites.png</file>
<file>resources/folder-sync-48.png</file>
<file>resources/folder-important.png</file>
<file>resources/folder-remote-32.png</file>
<file>resources/folder-remote.png</file>
<file>resources/folder-sync.png</file>
<file>resources/folder-grey.png</file>
<file>resources/owncloud_splash.png</file>
<file>resources/task-ongoing.png</file>
<file>resources/owncloud-icon-22.png</file>
<file>resources/owncloud-icon-32.png</file>
<file>resources/owncloud-icon-48.png</file>
<file>resources/owncloud-icon-64.png</file>
<file>resources/owncloud-icon-128.png</file>
<file>resources/owncloud-framed-64.png</file>
<file>resources/owncloud-error-48.png</file>
<file>resources/owncloud-sync-48.png</file>
<file>resources/owncloud-sync-ok-48.png</file>
<file>resources/view-refresh.png</file>
<file>resources/owncloud_logo_blue.png</file>
</qresource>
</RCC>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 883 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
resources/lock-http.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

BIN
resources/lock-https.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 991 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

165
src/3rdparty/QProgressIndicator/LICENSE vendored Normal file
View File

@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

View File

@@ -0,0 +1,137 @@
/*
*
* This file is part of QProgressIndicator,
* an open-source recent files menu widget
*
* Copyright (C) 2009 - 2010 Morgan Leborgne
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with QRecentFilesMenu. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "QProgressIndicator.h"
#include <QPainter>
QProgressIndicator::QProgressIndicator(QWidget* parent)
: QWidget(parent),
m_angle(0),
m_timerId(-1),
m_delay(40),
m_displayedWhenStopped(false),
m_color(Qt::black)
{
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
setFocusPolicy(Qt::NoFocus);
}
bool QProgressIndicator::isAnimated () const
{
return (m_timerId != -1);
}
void QProgressIndicator::setDisplayedWhenStopped(bool state)
{
m_displayedWhenStopped = state;
update();
}
bool QProgressIndicator::isDisplayedWhenStopped() const
{
return m_displayedWhenStopped;
}
void QProgressIndicator::startAnimation()
{
m_angle = 0;
if (m_timerId == -1)
m_timerId = startTimer(m_delay);
}
void QProgressIndicator::stopAnimation()
{
if (m_timerId != -1)
killTimer(m_timerId);
m_timerId = -1;
update();
}
void QProgressIndicator::setAnimationDelay(int delay)
{
if (m_timerId != -1)
killTimer(m_timerId);
m_delay = delay;
if (m_timerId != -1)
m_timerId = startTimer(m_delay);
}
void QProgressIndicator::setColor(const QColor & color)
{
m_color = color;
update();
}
QSize QProgressIndicator::sizeHint() const
{
return QSize(20,20);
}
int QProgressIndicator::heightForWidth(int w) const
{
return w;
}
void QProgressIndicator::timerEvent(QTimerEvent * /*event*/)
{
m_angle = (m_angle+30)%360;
update();
}
void QProgressIndicator::paintEvent(QPaintEvent * /*event*/)
{
if (!m_displayedWhenStopped && !isAnimated())
return;
int width = qMin(this->width(), this->height());
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
int outerRadius = (width-1)*0.5;
int innerRadius = (width-1)*0.5*0.38;
int capsuleHeight = outerRadius - innerRadius;
int capsuleWidth = (width > 32 ) ? capsuleHeight *.23 : capsuleHeight *.35;
int capsuleRadius = capsuleWidth/2;
for (int i=0; i<12; i++)
{
QColor color = m_color;
color.setAlphaF(1.0f - (i/12.0f));
p.setPen(Qt::NoPen);
p.setBrush(color);
p.save();
p.translate(rect().center());
p.rotate(m_angle - i*30.0f);
p.drawRoundedRect(-capsuleWidth*0.5, -(innerRadius+capsuleHeight), capsuleWidth, capsuleHeight, capsuleRadius, capsuleRadius);
p.restore();
}
}

View File

@@ -0,0 +1,108 @@
/*
*
* This file is part of QProgressIndicator,
* an open-source recent files menu widget
*
* Copyright (C) 2009 - 2010 Morgan Leborgne
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with QRecentFilesMenu. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef QPROGRESSINDICATOR_H
#define QPROGRESSINDICATOR_H
#include <QWidget>
#include <QColor>
/*!
\class QProgressIndicator
\brief The QProgressIndicator class lets an application display a progress indicator to show that a lengthy task is under way.
Progress indicators are indeterminate and do nothing more than spin to show that the application is busy.
\sa QProgressBar
*/
class QProgressIndicator : public QWidget
{
Q_OBJECT
Q_PROPERTY(int delay READ animationDelay WRITE setAnimationDelay)
Q_PROPERTY(bool displayedWhenStopped READ isDisplayedWhenStopped WRITE setDisplayedWhenStopped)
Q_PROPERTY(QColor color READ color WRITE setColor)
public:
QProgressIndicator(QWidget* parent = 0);
/*! Returns the delay between animation steps.
\return The number of milliseconds between animation steps. By default, the animation delay is set to 40 milliseconds.
\sa setAnimationDelay
*/
int animationDelay() const { return m_delay; }
/*! Returns a Boolean value indicating whether the component is currently animated.
\return Animation state.
\sa startAnimation stopAnimation
*/
bool isAnimated () const;
/*! Returns a Boolean value indicating whether the receiver shows itself even when it is not animating.
\return Return true if the progress indicator shows itself even when it is not animating. By default, it returns false.
\sa setDisplayedWhenStopped
*/
bool isDisplayedWhenStopped() const;
/*! Returns the color of the component.
\sa setColor
*/
const QColor & color() const { return m_color; }
virtual QSize sizeHint() const;
int heightForWidth(int w) const;
public slots:
/*! Starts the spin animation.
\sa stopAnimation isAnimated
*/
void startAnimation();
/*! Stops the spin animation.
\sa startAnimation isAnimated
*/
void stopAnimation();
/*! Sets the delay between animation steps.
Setting the \a delay to a value larger than 40 slows the animation, while setting the \a delay to a smaller value speeds it up.
\param delay The delay, in milliseconds.
\sa animationDelay
*/
void setAnimationDelay(int delay);
/*! Sets whether the component hides itself when it is not animating.
\param state The animation state. Set false to hide the progress indicator when it is not animating; otherwise true.
\sa isDisplayedWhenStopped
*/
void setDisplayedWhenStopped(bool state);
/*! Sets the color of the components to the given color.
\sa color
*/
void setColor(const QColor & color);
protected:
virtual void timerEvent(QTimerEvent * event);
virtual void paintEvent(QPaintEvent * event);
private:
int m_angle;
int m_timerId;
int m_delay;
bool m_displayedWhenStopped;
QColor m_color;
};
#endif // QPROGRESSINDICATOR_H

View File

@@ -0,0 +1,14 @@
## Description
The QProgressIndicator class lets an application display a progress indicator to show that a lengthy task is under way.
Will work at any size.
<img src="https://raw.github.com/mojocorp/QProgressIndicator/master/screen-capture-1.png" >
<img src="https://raw.github.com/mojocorp/QProgressIndicator/master/screen-capture-2.png" >
## Dependency
Qt 4.4.x.
## License
LGPL

View File

@@ -0,0 +1,353 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "fancylineedit.h"
#include <QEvent>
#include <QDebug>
#include <QString>
#include <QPropertyAnimation>
#include <QApplication>
#include <QMenu>
#include <QMouseEvent>
#include <QLabel>
#include <QAbstractButton>
#include <QPainter>
#include <QStyle>
#include <QPaintEvent>
#include <QDesktopWidget>
/*! Opens a menu at the specified widget position.
* This functions computes the position where to show the menu, and opens it with
* QMenu::exec().
* \param menu The menu to open
* \param widget The widget next to which to open the menu
*/
static void execMenuAtWidget(QMenu *menu, QWidget *widget)
{
QPoint p;
QRect screen = qApp->desktop()->availableGeometry(widget);
QSize sh = menu->sizeHint();
QRect rect = widget->rect();
if (widget->isRightToLeft()) {
if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height())
p = widget->mapToGlobal(rect.bottomRight());
else
p = widget->mapToGlobal(rect.topRight() - QPoint(0, sh.height()));
p.rx() -= sh.width();
} else {
if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height())
p = widget->mapToGlobal(rect.bottomLeft());
else
p = widget->mapToGlobal(rect.topLeft() - QPoint(0, sh.height()));
}
p.rx() = qMax(screen.left(), qMin(p.x(), screen.right() - sh.width()));
p.ry() += 1;
menu->exec(p);
}
/*!
\class Utils::FancyLineEdit
\brief A line edit with an embedded pixmap on one side that is connected to
a menu.
Additionally, it can display a grayed hintText (like "Type Here to")
when not focused and empty. When connecting to the changed signals and
querying text, one has to be aware that the text is set to that hint
text if isShowingHintText() returns true (that is, does not contain
valid user input).
*/
enum { margin = 6 };
#define ICONBUTTON_HEIGHT 18
#define FADE_TIME 160
namespace Utils {
// --------- FancyLineEditPrivate
class FancyLineEditPrivate : public QObject
{
public:
explicit FancyLineEditPrivate(FancyLineEdit *parent);
virtual bool eventFilter(QObject *obj, QEvent *event);
FancyLineEdit *m_lineEdit;
QPixmap m_pixmap[2];
QMenu *m_menu[2];
bool m_menuTabFocusTrigger[2];
IconButton *m_iconbutton[2];
bool m_iconEnabled[2];
};
FancyLineEditPrivate::FancyLineEditPrivate(FancyLineEdit *parent) :
QObject(parent), m_lineEdit(parent)
{
for (int i = 0; i < 2; ++i) {
m_menu[i] = 0;
m_menuTabFocusTrigger[i] = false;
m_iconbutton[i] = new IconButton(parent);
m_iconbutton[i]->installEventFilter(this);
m_iconbutton[i]->hide();
m_iconbutton[i]->setAutoHide(false);
m_iconEnabled[i] = false;
}
}
bool FancyLineEditPrivate::eventFilter(QObject *obj, QEvent *event)
{
int buttonIndex = -1;
for (int i = 0; i < 2; ++i) {
if (obj == m_iconbutton[i]) {
buttonIndex = i;
break;
}
}
if (buttonIndex == -1)
return QObject::eventFilter(obj, event);
switch (event->type()) {
case QEvent::FocusIn:
if (m_menuTabFocusTrigger[buttonIndex] && m_menu[buttonIndex]) {
m_lineEdit->setFocus();
execMenuAtWidget(m_menu[buttonIndex], m_iconbutton[buttonIndex]);
return true;
}
default:
break;
}
return QObject::eventFilter(obj, event);
}
// --------- FancyLineEdit
FancyLineEdit::FancyLineEdit(QWidget *parent) :
QLineEdit(parent),
d(new FancyLineEditPrivate(this))
{
ensurePolished();
updateMargins();
connect(this, SIGNAL(textChanged(QString)), this, SLOT(checkButtons(QString)));
connect(d->m_iconbutton[Left], SIGNAL(clicked()), this, SLOT(iconClicked()));
connect(d->m_iconbutton[Right], SIGNAL(clicked()), this, SLOT(iconClicked()));
}
void FancyLineEdit::checkButtons(const QString &text)
{
if (m_oldText.isEmpty() || text.isEmpty()) {
for (int i = 0; i < 2; ++i) {
if (d->m_iconbutton[i]->hasAutoHide())
d->m_iconbutton[i]->animateShow(!text.isEmpty());
}
m_oldText = text;
}
}
FancyLineEdit::~FancyLineEdit()
{
}
void FancyLineEdit::setButtonVisible(Side side, bool visible)
{
d->m_iconbutton[side]->setVisible(visible);
d->m_iconEnabled[side] = visible;
updateMargins();
}
bool FancyLineEdit::isButtonVisible(Side side) const
{
return d->m_iconEnabled[side];
}
void FancyLineEdit::iconClicked()
{
IconButton *button = qobject_cast<IconButton *>(sender());
int index = -1;
for (int i = 0; i < 2; ++i)
if (d->m_iconbutton[i] == button)
index = i;
if (index == -1)
return;
if (d->m_menu[index]) {
execMenuAtWidget(d->m_menu[index], button);
} else {
emit buttonClicked((Side)index);
if (index == Left)
emit leftButtonClicked();
else if (index == Right)
emit rightButtonClicked();
}
}
void FancyLineEdit::updateMargins()
{
bool leftToRight = (layoutDirection() == Qt::LeftToRight);
Side realLeft = (leftToRight ? Left : Right);
Side realRight = (leftToRight ? Right : Left);
int leftMargin = d->m_iconbutton[realLeft]->pixmap().width() + 8;
int rightMargin = d->m_iconbutton[realRight]->pixmap().width() + 8;
// Note KDE does not reserve space for the highlight color
if (style()->inherits("OxygenStyle")) {
leftMargin = qMax(24, leftMargin);
rightMargin = qMax(24, rightMargin);
}
QMargins margins((d->m_iconEnabled[realLeft] ? leftMargin : 0), 0,
(d->m_iconEnabled[realRight] ? rightMargin : 0), 0);
setTextMargins(margins);
}
void FancyLineEdit::updateButtonPositions()
{
QRect contentRect = rect();
for (int i = 0; i < 2; ++i) {
Side iconpos = (Side)i;
if (layoutDirection() == Qt::RightToLeft)
iconpos = (iconpos == Left ? Right : Left);
if (iconpos == FancyLineEdit::Right) {
const int iconoffset = textMargins().right() + 4;
d->m_iconbutton[i]->setGeometry(contentRect.adjusted(width() - iconoffset, 0, 0, 0));
} else {
const int iconoffset = textMargins().left() + 4;
d->m_iconbutton[i]->setGeometry(contentRect.adjusted(0, 0, -width() + iconoffset, 0));
}
}
}
void FancyLineEdit::resizeEvent(QResizeEvent *)
{
updateButtonPositions();
}
void FancyLineEdit::setButtonPixmap(Side side, const QPixmap &buttonPixmap)
{
d->m_iconbutton[side]->setPixmap(buttonPixmap);
updateMargins();
updateButtonPositions();
update();
}
QPixmap FancyLineEdit::buttonPixmap(Side side) const
{
return d->m_pixmap[side];
}
void FancyLineEdit::setButtonMenu(Side side, QMenu *buttonMenu)
{
d->m_menu[side] = buttonMenu;
d->m_iconbutton[side]->setIconOpacity(1.0);
}
QMenu *FancyLineEdit::buttonMenu(Side side) const
{
return d->m_menu[side];
}
bool FancyLineEdit::hasMenuTabFocusTrigger(Side side) const
{
return d->m_menuTabFocusTrigger[side];
}
void FancyLineEdit::setMenuTabFocusTrigger(Side side, bool v)
{
if (d->m_menuTabFocusTrigger[side] == v)
return;
d->m_menuTabFocusTrigger[side] = v;
d->m_iconbutton[side]->setFocusPolicy(v ? Qt::TabFocus : Qt::NoFocus);
}
bool FancyLineEdit::hasAutoHideButton(Side side) const
{
return d->m_iconbutton[side]->hasAutoHide();
}
void FancyLineEdit::setAutoHideButton(Side side, bool h)
{
d->m_iconbutton[side]->setAutoHide(h);
if (h)
d->m_iconbutton[side]->setIconOpacity(text().isEmpty() ? 0.0 : 1.0);
else
d->m_iconbutton[side]->setIconOpacity(1.0);
}
void FancyLineEdit::setButtonToolTip(Side side, const QString &tip)
{
d->m_iconbutton[side]->setToolTip(tip);
}
void FancyLineEdit::setButtonFocusPolicy(Side side, Qt::FocusPolicy policy)
{
d->m_iconbutton[side]->setFocusPolicy(policy);
}
// IconButton - helper class to represent a clickable icon
IconButton::IconButton(QWidget *parent)
: QAbstractButton(parent), m_autoHide(false)
{
setCursor(Qt::ArrowCursor);
setFocusPolicy(Qt::NoFocus);
}
void IconButton::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QRect pixmapRect = QRect(0, 0, m_pixmap.width(), m_pixmap.height());
pixmapRect.moveCenter(rect().center());
if (m_autoHide)
painter.setOpacity(m_iconOpacity);
painter.drawPixmap(pixmapRect, m_pixmap);
}
void IconButton::animateShow(bool visible)
{
if (visible) {
QPropertyAnimation *animation = new QPropertyAnimation(this, "iconOpacity");
animation->setDuration(FADE_TIME);
animation->setEndValue(1.0);
animation->start(QAbstractAnimation::DeleteWhenStopped);
} else {
QPropertyAnimation *animation = new QPropertyAnimation(this, "iconOpacity");
animation->setDuration(FADE_TIME);
animation->setEndValue(0.0);
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
}
} // namespace Utils

View File

@@ -0,0 +1,121 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef FANCYLINEEDIT_H
#define FANCYLINEEDIT_H
#include <QLineEdit>
#include <QAbstractButton>
namespace Utils {
class FancyLineEditPrivate;
class IconButton: public QAbstractButton
{
Q_OBJECT
Q_PROPERTY(float iconOpacity READ iconOpacity WRITE setIconOpacity)
Q_PROPERTY(bool autoHide READ hasAutoHide WRITE setAutoHide)
Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap)
public:
explicit IconButton(QWidget *parent = 0);
void paintEvent(QPaintEvent *event);
void setPixmap(const QPixmap &pixmap) { m_pixmap = pixmap; update(); }
QPixmap pixmap() const { return m_pixmap; }
float iconOpacity() { return m_iconOpacity; }
void setIconOpacity(float value) { m_iconOpacity = value; update(); }
void animateShow(bool visible);
void setAutoHide(bool hide) { m_autoHide = hide; }
bool hasAutoHide() const { return m_autoHide; }
private:
float m_iconOpacity;
bool m_autoHide;
QPixmap m_pixmap;
};
class FancyLineEdit : public QLineEdit
{
Q_OBJECT
Q_ENUMS(Side)
public:
enum Side {Left = 0, Right = 1};
explicit FancyLineEdit(QWidget *parent = 0);
~FancyLineEdit();
QPixmap buttonPixmap(Side side) const;
void setButtonPixmap(Side side, const QPixmap &pixmap);
QMenu *buttonMenu(Side side) const;
void setButtonMenu(Side side, QMenu *menu);
void setButtonVisible(Side side, bool visible);
bool isButtonVisible(Side side) const;
void setButtonToolTip(Side side, const QString &);
void setButtonFocusPolicy(Side side, Qt::FocusPolicy policy);
// Set whether tabbing in will trigger the menu.
void setMenuTabFocusTrigger(Side side, bool v);
bool hasMenuTabFocusTrigger(Side side) const;
// Set if icon should be hidden when text is empty
void setAutoHideButton(Side side, bool h);
bool hasAutoHideButton(Side side) const;
#if QT_VERSION <= 0x040700
void setPlaceholderText( const QString& ) { }
#endif
signals:
void buttonClicked(Utils::FancyLineEdit::Side side);
void leftButtonClicked();
void rightButtonClicked();
private slots:
void checkButtons(const QString &);
void iconClicked();
protected:
virtual void resizeEvent(QResizeEvent *e);
private:
void updateMargins();
void updateButtonPositions();
friend class Utils::FancyLineEditPrivate;
FancyLineEditPrivate *d;
QString m_oldText;
};
} // namespace Utils
#endif // FANCYLINEEDIT_H

View File

@@ -3,39 +3,41 @@ include(${QT_USE_FILE})
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
QT4_ADD_RESOURCES ( MIRALL_RC_SRC ../mirall.qrc)
if ( IS_DIRECTORY ${OEM_THEME_DIR} )
QT4_ADD_RESOURCES ( MIRALL_RC_SRC ${OEM_THEME_DIR}/theme.qrc)
set(theme_dir ${OEM_THEME_DIR}/theme)
else()
QT4_ADD_RESOURCES ( MIRALL_RC_SRC ../theme.qrc)
set(theme_dir ${CMAKE_CURRENT_SOURCE_DIR}/../theme)
endif()
set(mirall_UI
mirall/folderwizardsourcepage.ui
mirall/folderwizardtargetpage.ui
mirall/folderwizardnetworkpage.ui
mirall/folderwizardowncloudpage.ui
mirall/statusdialog.ui
mirall/owncloudwizardselecttypepage.ui
mirall/owncloudsetuppage.ui
mirall/createanowncloudpage.ui
mirall/owncloudftpaccesspage.ui
mirall/owncloudsetuppage_ng.ui
mirall/owncloudwizardresultpage.ui
mirall/owncloudcredentialspage.ui
mirall/sslerrordialog.ui
mirall/proxydialog.ui
mirall/fileitemdialog.ui
)
set(3rdparty_SRC
3rdparty/qtsingleapplication/qtsingleapplication.cpp
3rdparty/qtsingleapplication/qtlocalpeer.h
3rdparty/qtsingleapplication/qtlocalpeer.cpp
3rdparty/qtsingleapplication/qtsingleapplication.h
3rdparty/qtsingleapplication/qtsinglecoreapplication.h
3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp
3rdparty/qtlockedfile/qtlockedfile.h
3rdparty/qtlockedfile/qtlockedfile.cpp
3rdparty/fancylineedit/fancylineedit.cpp
3rdparty/QProgressIndicator/QProgressIndicator.cpp
)
set(3rdparty_HEADER
3rdparty/qtsingleapplication/qtlocalpeer.h
3rdparty/qtsingleapplication/qtsingleapplication.h
3rdparty/qtsingleapplication/qtsinglecoreapplication.h
3rdparty/fancylineedit/fancylineedit.h
3rdparty/QProgressIndicator/QProgressIndicator.h
)
qt4_wrap_cpp(3rdparty_MOC ${3rdparty_HEADER})
@@ -48,6 +50,8 @@ endif()
set(3rdparty_INC
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtlockedfile
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/QProgressIndicator
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/fancylineedit
)
qt4_wrap_ui(mirall_UI_SRCS ${mirall_UI})
@@ -56,57 +60,90 @@ set(libsync_SRCS
mirall/folderman.cpp
mirall/folder.cpp
mirall/folderwatcher.cpp
mirall/gitfolder.cpp
mirall/syncresult.cpp
mirall/unisonfolder.cpp
mirall/networklocation.cpp
mirall/mirallconfigfile.cpp
mirall/csyncfolder.cpp
mirall/credentialstore.cpp
mirall/owncloudfolder.cpp
mirall/csyncthread.cpp
mirall/fileutils.cpp
mirall/theme.cpp
mirall/owncloudtheme.cpp
mirall/miralltheme.cpp
mirall/owncloudinfo.cpp
mirall/logger.cpp
mirall/utility.cpp
mirall/connectionvalidator.cpp
)
set(libsync_HEADERS
mirall/folderman.h
mirall/folder.h
mirall/folderwatcher.h
mirall/gitfolder.h
mirall/unisonfolder.h
mirall/csyncfolder.h
mirall/owncloudfolder.h
mirall/csyncthread.h
mirall/owncloudinfo.h
mirall/credentialstore.h
mirall/logger.h
mirall/connectionvalidator.h
)
IF( INOTIFY_FOUND )
set(libsync_SRCS ${libsync_SRCS} mirall/inotify.cpp)
set(libsync_SRCS ${libsync_SRCS} mirall/folderwatcher_inotify.cpp)
set(libsync_HEADERS ${libsync_HEADERS} mirall/inotify.h)
set(libsync_HEADERS ${libsync_HEADERS} mirall/folderwatcher_inotify.h)
ENDIF()
IF( WIN32 )
set(libsync_SRCS ${libsync_SRCS} mirall/folderwatcher_win.cpp)
set(libsync_HEADERS ${libsync_HEADERS} mirall/folderwatcher_win.h)
ENDIF()
IF( APPLE )
set(libsync_SRCS ${libsync_SRCS} mirall/folderwatcher_mac.cpp)
ENDIF()
qt4_wrap_cpp(syncMoc ${libsync_HEADERS})
add_library(mirallsync SHARED ${libsync_SRCS} ${syncMoc})
list(APPEND libsync_LINK_TARGETS
${QT_LIBRARIES}
${CSYNC_LIBRARY}
dl
)
if(QTKEYCHAIN_FOUND)
list(APPEND libsync_LINK_TARGETS ${QTKEYCHAIN_LIBRARY})
include_directories(${QTKEYCHAIN_INCLUDE_DIR})
endif()
add_library(owncloudsync SHARED ${libsync_SRCS} ${syncMoc})
set_target_properties( owncloudsync PROPERTIES COMPILE_DEFINITIONS OWNCLOUD_CLIENT)
target_link_libraries(mirallsync ${QT_LIBRARIES} ${CSYNC_LIBRARY} )
target_link_libraries(owncloudsync ${QT_LIBRARIES} ${CSYNC_LIBRARY} )
set_target_properties( owncloudsync PROPERTIES
VERSION ${VERSION}
SOVERSION ${SOVERSION}
)
target_link_libraries(owncloudsync ${libsync_LINK_TARGETS} )
if ( APPLE )
target_link_libraries(owncloudsync /System/Library/Frameworks/CoreServices.framework)
endif()
if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
install(TARGETS mirallsync owncloudsync
install(TARGETS owncloudsync
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
if(NOT WIN32)
configure_file(${CMAKE_SOURCE_DIR}/mirall.desktop.in
${CMAKE_CURRENT_BINARY_DIR}/${APPLICATION_SHORTNAME}.desktop)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${APPLICATION_SHORTNAME}.desktop DESTINATION share/applications )
endif()
else()
install(TARGETS mirallsync owncloudsync DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/MacOS)
install(TARGETS owncloudsync DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/MacOS)
endif()
set(mirall_SRCS
mirall/application.cpp
mirall/systray.cpp
mirall/folderwizard.cpp
mirall/statusdialog.cpp
mirall/owncloudwizard.cpp
@@ -116,10 +153,12 @@ set(mirall_SRCS
mirall/sslerrordialog.cpp
mirall/logbrowser.cpp
mirall/proxydialog.cpp
mirall/fileitemdialog.cpp
)
set(mirall_HEADERS
mirall/application.h
mirall/systray.h
mirall/folderwizard.h
mirall/owncloudsetupwizard.h
mirall/owncloudwizard.h
@@ -128,6 +167,7 @@ set(mirall_HEADERS
mirall/sslerrordialog.h
mirall/logbrowser.h
mirall/proxydialog.h
mirall/fileitemdialog.h
)
if( UNIX AND NOT APPLE)
@@ -137,7 +177,7 @@ if( UNIX AND NOT APPLE)
endif()
# csync is required.
include_directories(${CSYNC_INCLUDE_DIR}/csync ${CSYNC_INCLUDE_DIR} ${CMAKE_BINARY_DIR})
include_directories(${CSYNC_INCLUDE_DIR}/csync ${CSYNC_INCLUDE_DIR} ${CSYNC_BUILD_PATH}/src)
include_directories(${3rdparty_INC})
qt4_wrap_cpp(mirallMoc ${mirall_HEADERS})
@@ -159,15 +199,19 @@ set( final_src
# add executable icon on windows and osx
include( AddAppIconMacro )
set(ownCloud_old ${ownCloud})
kde4_add_app_icon( ownCloud "${CMAKE_CURRENT_SOURCE_DIR}/../resources/owncloud-icon-*.png")
kde4_add_app_icon( ownCloud "${theme_dir}/colored/${APPLICATION_SHORTNAME}-icon*.png")
list(APPEND final_src ${ownCloud})
set(ownCloud ${ownCloud_old})
if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
set(BIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
install(FILES ${CMAKE_SOURCE_DIR}/resources/mirall-48.png DESTINATION share/icons/hicolor/48x48/apps/ RENAME mirall.png)
install(FILES ${CMAKE_SOURCE_DIR}/resources/owncloud-icon-48.png DESTINATION share/icons/hicolor/48x48/apps/ RENAME owncloud.png)
if(NOT WIN32)
install(FILES
${theme_dir}/colored/${APPLICATION_SHORTNAME}-icon-48.png
DESTINATION share/icons/hicolor/48x48/apps/ RENAME ${APPLICATION_SHORTNAME}.png)
endif(NOT WIN32)
install(FILES ${mirall_I18N} DESTINATION share/mirall/i18n)
@@ -175,22 +219,7 @@ if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
# add_executable( ${APPLICATION_EXECUTABLE} main.cpp ${final_src})
add_executable( ${APPLICATION_EXECUTABLE} WIN32 main.cpp ${final_src})
set_target_properties( ${APPLICATION_EXECUTABLE} PROPERTIES COMPILE_DEFINITIONS OWNCLOUD_CLIENT)
# mirall is not built for the bundle
add_executable( mirall WIN32 main.cpp ${final_src})
target_link_libraries(mirall ${QT_LIBRARIES} )
target_link_libraries(mirall mirallsync)
target_link_libraries(mirall ${CSYNC_LIBRARY})
set_target_properties( mirall PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY} )
install(TARGETS mirall
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
else()
set(BIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
include(DeployQt4)
@@ -200,7 +229,6 @@ else()
# we must add MACOSX_BUNDLE only if building a bundle
add_executable( ${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp ${final_src})
set_target_properties( ${APPLICATION_EXECUTABLE} PROPERTIES COMPILE_DEFINITIONS OWNCLOUD_CLIENT)
#FIXME: hardcoded path
if ( EXISTS ${CSYNC_BINARY_DIR}/modules/ocsync_owncloud.so )
@@ -208,8 +236,13 @@ else()
else()
install(FILES /usr/local/lib/ocsync-0/ocsync_owncloud.so DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/Plugins)
endif()
install(FILES ${mirall_I18N} DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/translations)
set (QM_DIR ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/Translations)
install(FILES ${mirall_I18N} DESTINATION ${QM_DIR})
file(GLOB qt_I18N ${QT_TRANSLATIONS_DIR}/qt_??.qm ${QT_TRANSLATIONS_DIR}/qt_??_??.qm)
install(FILES ${qt_I18N} DESTINATION ${QM_DIR})
file(GLOB qtkeychain_I18N ${QT_TRANSLATIONS_DIR}/qtkeychain*.qm)
install(FILES ${qtkeychain_I18N} DESTINATION ${QM_DIR})
list(APPEND dirs "/usr/local/lib")
endif()
@@ -228,7 +261,7 @@ install(TARGETS ${APPLICATION_EXECUTABLE}
BUNDLE DESTINATION "."
)
#FIXME: find a nice solution to make the second if(BUILD_OWNCLOUD_OSX_BUNDLE) unneccessary
#FIXME: find a nice solution to make the second if(BUILD_OWNCLOUD_OSX_BUNDLE) unnecessary
# currently it needs to be done because the code right above needs to be executed no matter
# if building a bundle or not and the install_qt4_executable needs to be called afterwards
if(BUILD_OWNCLOUD_OSX_BUNDLE)

View File

@@ -21,16 +21,21 @@ int main(int argc, char **argv)
Mirall::Application app(argc, argv);
app.initialize();
qint64 pid = -1;
// if the application is already running, notify it.
if( app.isRunning() ) {
if( app.sendMessage( QLatin1String("A message to the master"), 5000, pid ))
return 0;
QStringList args = app.arguments();
if ( args.size() > 1 && ! app.giveHelp() ) {
QString msg = args.join( QLatin1String("|") );
if( ! app.sendMessage( msg ) )
return -1;
}
return 0;
}
// if help requested, show on command line and exit.
if( ! app.giveHelp() )
if( ! app.giveHelp() ) {
return app.exec();
} else {
app.showHelp();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,6 @@
#define APPLICATION_H
#include <QApplication>
#include <QSystemTrayIcon>
#include <QNetworkReply>
#include <QSslError>
@@ -26,6 +25,8 @@
#include "mirall/folder.h"
#include "mirall/logbrowser.h"
#include "mirall/folderman.h"
#include "mirall/fileitemdialog.h"
#include "mirall/systray.h"
class QAction;
class QMenu;
@@ -52,6 +53,7 @@ public:
~Application();
bool giveHelp();
void showHelp();
signals:
@@ -63,10 +65,15 @@ protected slots:
void slotInfoFolder( const QString& );
void slotConfigure();
void slotConfigureProxy();
void slotParseOptions( const QString& );
void slotShowTrayMessage(const QString&, const QString&);
void slotSyncStateChange( const QString& );
void slotownCloudWizardDone(int);
protected:
void parseOptions(const QStringList& );
void setupTranslations();
void setupActions();
void setupSystemTray();
void setupContextMenu();
@@ -80,7 +87,7 @@ protected slots:
void slotTrayClicked( QSystemTrayIcon::ActivationReason );
void slotFolderOpenAction(const QString & );
void slotOpenOwnCloud();
void slotStartFolderSetup(int result = 1); // defaulting to Accepted
void slotStartFolderSetup(int result = QDialog::Accepted); // defaulting to Accepted
void slotOwnCloudFound( const QString&, const QString&, const QString&, const QString& );
void slotNoOwnCloudFound( QNetworkReply* );
void slotCheckAuthentication();
@@ -88,14 +95,16 @@ protected slots:
void slotOpenLogBrowser();
void slotAbout();
void slotSSLFailed( QNetworkReply *reply, QList<QSslError> errors );
void slotFetchCredentials();
void slotCredentialsFetched( bool );
void slotStartUpdateDetector();
private:
void showHelp();
void setHelp();
void raiseDialog( QWidget* );
// configuration file -> folder
QSystemTrayIcon *_tray;
Systray *_tray;
QAction *_actionQuit;
QAction *_actionAddFolder;
QAction *_actionOpenStatus;
@@ -115,6 +124,7 @@ private:
// tray's menu
QMenu *_contextMenu;
StatusDialog *_statusDialog;
FileItemDialog *_fileItemDialog;
FolderMan *_folderMan;
Theme *_theme;
@@ -122,7 +132,10 @@ private:
UpdateDetector *_updateDetector;
QMap<QString, QString> _overallStatusStrings;
LogBrowser *_logBrowser;
bool _helpOnly;
QString _logFile;
bool _showLogWindow;
bool _logFlush;
bool _helpOnly;
};
} // namespace Mirall

View File

@@ -0,0 +1,193 @@
/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* 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 <QtCore>
#include "mirall/connectionvalidator.h"
#include "mirall/owncloudinfo.h"
#include "mirall/mirallconfigfile.h"
#include "mirall/theme.h"
#include "mirall/credentialstore.h"
namespace Mirall {
ConnectionValidator::ConnectionValidator(QObject *parent) :
QObject(parent)
{
}
ConnectionValidator::ConnectionValidator(const QString& connection, QObject *parent)
:_connection(connection)
{
ownCloudInfo::instance()->setCustomConfigHandle(_connection);
}
QStringList ConnectionValidator::errors() const
{
return _errors;
}
QString ConnectionValidator::statusString( Status )
{
return QLatin1String("Get your street creds!");
}
void ConnectionValidator::checkConnection()
{
if( ownCloudInfo::instance()->isConfigured() ) {
connect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),
SLOT(slotStatusFound(QString,QString,QString,QString)));
connect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)),
SLOT(slotNoStatusFound(QNetworkReply*)));
// checks for status.php
ownCloudInfo::instance()->checkInstallation();
} else {
emit connectionResult( NotConfigured );
}
}
void ConnectionValidator::slotStatusFound( const QString& url, const QString& versionStr, const QString& version, const QString& edition)
{
// status.php was found.
qDebug() << "** Application: ownCloud found: " << url << " with version " << versionStr << "(" << version << ")";
// now check the authentication
MirallConfigFile cfgFile(_connection);
cfgFile.setOwnCloudVersion( version );
// disconnect from ownCloudInfo
disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),
this, SLOT(slotStatusFound(QString,QString,QString,QString)));
disconnect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)),
this, SLOT(slotNoStatusFound(QNetworkReply*)));
if( version.startsWith("4.0") ) {
_errors.append( tr("<p>The configured server for this client is too old.</p>"
"<p>Please update to the latest server and restart the client.</p>"));
emit connectionResult( ServerVersionMismatch );
return;
}
QTimer::singleShot( 0, this, SLOT( slotFetchCredentials() ));
}
// status.php could not be loaded.
void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply)
{
// disconnect from ownCloudInfo
disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),
this, SLOT(slotStatusFound(QString,QString,QString,QString)));
disconnect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)),
this, SLOT(slotNoStatusFound(QNetworkReply*)));
_errors.append( reply->errorString() );
emit connectionResult( StatusNotFound );
}
void ConnectionValidator::slotFetchCredentials()
{
if( _connection.isEmpty() ) {
if( CredentialStore::instance()->canTryAgain() ) {
connect( CredentialStore::instance(), SIGNAL(fetchCredentialsFinished(bool)),
this, SLOT(slotCredentialsFetched(bool)) );
CredentialStore::instance()->fetchCredentials();
}
if( CredentialStore::instance()->state() == CredentialStore::TooManyAttempts ) {
_errors << tr("Too many attempts to get a valid password.");
emit connectionResult( CredentialsTooManyAttempts );
}
} else {
// Pull credentials from Mirall config.
slotCredentialsFetched( true );
}
}
void ConnectionValidator::slotCredentialsFetched( bool ok )
{
qDebug() << "Credentials successfully fetched: " << ok;
disconnect( CredentialStore::instance(), SIGNAL(fetchCredentialsFinished(bool)) );
if( ! ok ) {
Status stat;
_errors << tr("Error: Could not retrieve the password!");
if( CredentialStore::instance()->state() == CredentialStore::UserCanceled ) {
_errors << tr("Password dialog was canceled!");
stat = CredentialsUserCanceled;
} else {
_errors << CredentialStore::instance()->errorMessage();
stat = CredentialError;
}
qDebug() << "Could not fetch credentials" << _errors;
emit connectionResult( stat );
} else {
QString user, pwd;
if( _connection.isEmpty() ) {
user = CredentialStore::instance()->user();
pwd = CredentialStore::instance()->password();
} else {
// in case of reconfiguration, the _connection is set.
MirallConfigFile cfg(_connection);
user = cfg.ownCloudUser();
pwd = cfg.ownCloudPasswd();
}
ownCloudInfo::instance()->setCredentials( user, pwd );
// Credential fetched ok.
QTimer::singleShot( 0, this, SLOT( slotCheckAuthentication() ));
}
}
void ConnectionValidator::slotCheckAuthentication()
{
connect( ownCloudInfo::instance(), SIGNAL(ownCloudDirExists(QString,QNetworkReply*)),
this, SLOT(slotAuthCheck(QString,QNetworkReply*)));
qDebug() << "# checking for authentication settings.";
ownCloudInfo::instance()->getRequest(QLatin1String("/"), true ); // this call needs to be authenticated.
// simply GET the webdav root, will fail if credentials are wrong.
// continue in slotAuthCheck here :-)
}
void ConnectionValidator::slotAuthCheck( const QString& ,QNetworkReply *reply )
{
bool ok = true;
Status stat = Connected;
if( reply->error() == QNetworkReply::AuthenticationRequiredError ||
reply->error() == QNetworkReply::OperationCanceledError ) { // returned if the user is wrong.
qDebug() << "******** Password is wrong!";
_errors << "The provided credentials are wrong.";
stat = CredentialsWrong;
ok = false;
}
// disconnect from ownCloud Info signals
disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudDirExists(QString,QNetworkReply*)),
this,SLOT(slotAuthCheck(QString,QNetworkReply*)));
emit connectionResult( stat );
}
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* 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 CONNECTIONVALIDATOR_H
#define CONNECTIONVALIDATOR_H
#include <QObject>
#include <QStringList>
class QNetworkReply;
namespace Mirall {
class ConnectionValidator : public QObject
{
Q_OBJECT
public:
explicit ConnectionValidator(QObject *parent = 0);
explicit ConnectionValidator(const QString& connection, QObject *parent = 0);
enum Status {
Undefined,
Connected,
NotConfigured,
ServerVersionMismatch,
CredentialsTooManyAttempts,
CredentialError,
CredentialsUserCanceled,
CredentialsWrong,
StatusNotFound
};
QStringList errors() const;
void checkConnection();
QString statusString( Status );
signals:
void connectionResult( ConnectionValidator::Status );
void connectionAvailable();
void connectionFailed();
public slots:
protected slots:
void slotStatusFound( const QString&, const QString&, const QString&, const QString& );
void slotNoStatusFound(QNetworkReply *);
void slotFetchCredentials();
void slotCredentialsFetched( bool );
void slotCheckAuthentication();
void slotAuthCheck( const QString& ,QNetworkReply * );
private:
QStringList _errors;
QString _connection;
};
}
#endif // CONNECTIONVALIDATOR_H

View File

@@ -1,213 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CreateAnOwncloudPage</class>
<widget class="QWidget" name="CreateAnOwncloudPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>539</width>
<height>346</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../../mirall.qrc">:/mirall/resources/mirall-32.png</pixmap>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<pointsize>14</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Create a new ownCloud</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_17">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Where do you want to create your ownCloud?</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="3">
<widget class="QRadioButton" name="createLocalRadioBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>create ownCloud on this computer</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>22</width>
<height>13</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1" colspan="2">
<widget class="QLabel" name="label_2">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#585858;&quot;&gt;installs the ownCloud on this computer. Other people will not be able to access your data by default.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QRadioButton" name="createPerFTPRadioBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
<underline>false</underline>
</font>
</property>
<property name="text">
<string>create ownCloud on my internet domain</string>
</property>
</widget>
</item>
<item row="3" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>22</width>
<height>13</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#585858;&quot;&gt;installs ownCloud on a domain you control. You need the FTP credentials for the installation.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#585858;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#585858;&quot;&gt;This ownCloud will be accessible from the internet.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="label">
<property name="text">
<string>&amp;Domain:</string>
</property>
<property name="buddy">
<cstring>myDomainEdit</cstring>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLineEdit" name="myDomainEdit">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>388</width>
<height>72</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources>
<include location="../../mirall.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -0,0 +1,400 @@
/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* 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 <QtGui>
#include <QInputDialog>
#include "config.h"
#include "mirall/credentialstore.h"
#include "mirall/mirallconfigfile.h"
#include "mirall/theme.h"
#ifdef WITH_QTKEYCHAIN
#include <qtkeychain/keychain.h>
using namespace QKeychain;
#endif
#define MAX_LOGIN_ATTEMPTS 3
namespace Mirall {
CredentialStore *CredentialStore::_instance=0;
CredentialStore::CredState CredentialStore::_state = NotFetched;
QString CredentialStore::_passwd = QString::null;
QString CredentialStore::_user = QString::null;
QString CredentialStore::_url = QString::null;
QString CredentialStore::_errorMsg = QString::null;
int CredentialStore::_tries = 0;
#ifdef WITH_QTKEYCHAIN
CredentialStore::CredentialType CredentialStore::_type = KeyChain;
#else
CredentialStore::CredentialType CredentialStore::_type = Settings;
#endif
CredentialStore::CredentialStore(QObject *parent) :
QObject(parent)
{
}
CredentialStore *CredentialStore::instance()
{
if( !CredentialStore::_instance ) CredentialStore::_instance = new CredentialStore;
return CredentialStore::_instance;
}
QString CredentialStore::password() const
{
return _passwd;
}
QString CredentialStore::user() const
{
return _user;
}
CredentialStore::CredState CredentialStore::state()
{
return _state;
}
bool CredentialStore::canTryAgain()
{
bool canDoIt = false;
if( _tries > MAX_LOGIN_ATTEMPTS ) {
qDebug() << "canTryAgain: Max attempts reached.";
return false;
}
/* Since QtKeyChain is required now, it makes to only
* query once. */
if( _state == NotFetched || _state == AsyncWriting ) {
return true;
} else {
return false;
}
}
void CredentialStore::fetchCredentials()
{
MirallConfigFile cfgFile;
if( ++_tries > MAX_LOGIN_ATTEMPTS ) {
qDebug() << "Too many attempts to enter password!";
_state = TooManyAttempts;
emit( fetchCredentialsFinished(false) );
return;
}
bool ok = false;
QString pwd;
_user = cfgFile.ownCloudUser();
_url = cfgFile.ownCloudUrl();
if( !cfgFile.passwordStorageAllowed() ) {
_type = CredentialStore::User;
}
QString key = keyChainKey(_url);
if( key.isNull() ) {
qDebug() << "Can not fetch credentials, url is zero!";
_state = Error;
emit( fetchCredentialsFinished(false) );
return;
}
switch( _type ) {
case CredentialStore::User: {
/* Ask the user for the password */
/* Fixme: Move user interaction out here. */
_state = AsyncFetching;
_inputDialog = new QInputDialog;
_inputDialog->setWindowTitle(QApplication::translate("MirallConfigFile","Password Required") );
_inputDialog->setLabelText( QApplication::translate("MirallConfigFile","Please enter your %1 password:")
.arg(Theme::instance()->appNameGUI()));
_inputDialog->setInputMode( QInputDialog::TextInput );
_inputDialog->setTextEchoMode( QLineEdit::Password );
connect(_inputDialog, SIGNAL(finished(int)), SLOT(slotUserDialogDone(int)));
_inputDialog->exec();
break;
}
case CredentialStore::Settings: {
/* Read from config file. */
_state = Fetching;
pwd = cfgFile.ownCloudPasswd();
ok = true;
break;
}
case CredentialStore::KeyChain: {
// If the credentials are here already, return.
if( _state == Ok || _state == AsyncWriting ) {
emit(fetchCredentialsFinished(true));
return;
}
// otherwise fetch asynchronious.
#ifdef WITH_QTKEYCHAIN
_state = AsyncFetching;
if( !_user.isEmpty() ) {
ReadPasswordJob *job = new ReadPasswordJob(Theme::instance()->appName());
job->setKey( key );
connect( job, SIGNAL(finished(QKeychain::Job*)), this,
SLOT(slotKeyChainReadFinished(QKeychain::Job*)));
job->start();
}
#else
qDebug() << "QtKeyChain: Not yet implemented!";
_state = Error;
#endif
break;
}
default: {
break;
}
}
if( _state == Fetching ) { // ...but not AsyncFetching
if( ok ) {
_passwd = pwd;
_state = Ok;
}
if( !ok && _state == Fetching ) {
_state = Error;
}
emit( fetchCredentialsFinished(ok) );
} else {
// in case of AsyncFetching nothing happens here. The finished-Slot
// will emit the finish signal.
}
}
void CredentialStore::slotUserDialogDone( int result )
{
if( result == QDialog::Accepted ) {
_passwd = _inputDialog->textValue();
_state = Ok;
} else {
_state = UserCanceled;
_passwd = QString::null;
}
_inputDialog->deleteLater();
emit(fetchCredentialsFinished(_state == Ok));
}
void CredentialStore::reset()
{
_state = NotFetched;
_user = QString::null;
_passwd = QString::null;
_tries = 0;
}
QString CredentialStore::keyChainKey( const QString& url ) const
{
QString u(url);
if( u.isEmpty() ) {
qDebug() << "Empty url in keyChain, error!";
return QString::null;
}
if( _user.isEmpty() ) {
qDebug() << "Error: User is emty!";
return QString::null;
}
if( !u.endsWith(QChar('/')) ) {
u.append(QChar('/'));
}
QString key = _user+QLatin1Char(':')+u;
return key;
}
void CredentialStore::slotKeyChainReadFinished(QKeychain::Job* job)
{
#ifdef WITH_QTKEYCHAIN
ReadPasswordJob *pwdJob = static_cast<ReadPasswordJob*>(job);
if( pwdJob ) {
switch( pwdJob->error() ) {
case QKeychain::NoError:
_passwd = pwdJob->textData();
#ifdef Q_OS_LINUX
// Currently there is a bug in the keychain on linux that if no
// entry is there, an empty password comes back, but no error.
if( _passwd.isEmpty() ) {
_state = EntryNotFound;
_errorMsg = tr("No password entry found in keychain. Please reconfigure.");
} else
#endif
_state = Ok;
break;
case QKeychain::EntryNotFound:
_state = EntryNotFound;
break;
case QKeychain::CouldNotDeleteEntry:
_state = Error;
break;
case QKeychain::AccessDeniedByUser:
_state = AccessDeniedByUser;
break;
case QKeychain::AccessDenied:
_state = AccessDenied;
break;
case QKeychain::NoBackendAvailable:
_state = NoKeychainBackend;
break;
case QKeychain::NotImplemented:
_state = NoKeychainBackend;
break;
case QKeychain::OtherError:
default:
_state = Error;
}
/* In case there is no backend, tranparentely switch to Settings file. */
if( _state == NoKeychainBackend ) {
qDebug() << "No Storage Backend, falling back to Settings mode.";
_type = CredentialStore::Settings;
fetchCredentials();
return;
}
if( _state == EntryNotFound ) {
// try to migrate.
}
if( _state != Ok ) {
qDebug() << "Error with keychain: " << pwdJob->errorString();
if(_errorMsg.isEmpty()) _errorMsg = pwdJob->errorString();
} else {
_errorMsg = QString::null;
}
} else {
_state = Error;
qDebug() << "Error: KeyChain Read Password Job failed!";
}
emit(fetchCredentialsFinished(_state == Ok));
#else
(void) job;
#endif
}
QString CredentialStore::errorMessage()
{
return _errorMsg;
}
void CredentialStore::setCredentials( const QString& url, const QString& user,
const QString& pwd, bool allowToStore )
{
_passwd = pwd;
_user = user;
if( allowToStore ) {
#ifdef WITH_QTKEYCHAIN
_type = KeyChain;
#else
_type = Settings;
#endif
} else {
_type = User;
}
_url = url;
_state = Ok;
}
void CredentialStore::saveCredentials( )
{
MirallConfigFile cfgFile;
QString key = keyChainKey(_url);
if( key.isNull() ) {
qDebug() << "Error: Can not save credentials, URL is zero!";
return;
}
#ifdef WITH_QTKEYCHAIN
WritePasswordJob *job = NULL;
#endif
switch( _type ) {
case CredentialStore::User:
deleteKeyChainCredential( key );
break;
case CredentialStore::KeyChain:
#ifdef WITH_QTKEYCHAIN
// Set password in KeyChain
job = new WritePasswordJob(Theme::instance()->appName());
job->setKey( key );
job->setTextData(_passwd);
connect( job, SIGNAL(finished(QKeychain::Job*)), this,
SLOT(slotKeyChainWriteFinished(QKeychain::Job*)));
_state = AsyncWriting;
job->start();
#endif
break;
case CredentialStore::Settings:
cfgFile.writePassword( _passwd );
reset();
break;
default:
// unsupported.
break;
}
}
void CredentialStore::slotKeyChainWriteFinished( QKeychain::Job *job )
{
#ifdef WITH_QTKEYCHAIN
WritePasswordJob *pwdJob = static_cast<WritePasswordJob*>(job);
if( pwdJob ) {
QKeychain::Error err = pwdJob->error();
if( err != QKeychain::NoError ) {
qDebug() << "Error with keychain: " << pwdJob->errorString();
if( err == NoBackendAvailable || err == NotImplemented ||
pwdJob->errorString().contains(QLatin1String("Could not open wallet"))) {
_type = Settings;
saveCredentials();
_state = NoKeychainBackend;
} else {
_state = Error;
}
} else {
qDebug() << "Successfully stored password for user " << _user;
// Try to remove password formerly stored in the config file.
MirallConfigFile cfgFile;
cfgFile.clearPasswordFromConfig();
_state = NotFetched;
_tries = 0;
}
} else {
qDebug() << "Error: KeyChain Write Password Job failed!";
_state = Error;
}
#else
(void) job;
#endif
}
// Called if a user chooses to not store the password locally.
void CredentialStore::deleteKeyChainCredential( const QString& key )
{
#ifdef WITH_QTKEYCHAIN
// Start the remove job, do not care so much about the result.
DeletePasswordJob *job = new DeletePasswordJob(Theme::instance()->appName());
job->setKey( key );
job->start();
#endif
}
}

View File

@@ -0,0 +1,147 @@
/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* 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 CREDENTIALSTORE_H
#define CREDENTIALSTORE_H
#include <QObject>
#include <QInputDialog>
namespace QKeychain {
class Job;
}
namespace Mirall {
/*
* This object holds the credential information of the ownCloud connection. It
* is implemented as a singleton.
* At startup of the client, at first the fetchCredentials() method must be called
* which tries to get credentials from one of the supported backends. To determine
* which backend should be used, MirallConfigFile::credentialType() is called as
* the backend is configured in the config file.
*
* The fetchCredentials() call changes the internal state of the credential store
* to one of
* Ok: There are credentials. Note that it's unknown if they are correct!!
* UserCanceled: The fetching involved user interaction and the user canceled
* the operation. No valid credentials are there.
* TooManyAttempts: The user tried to often to enter a password.
* Fetching: The fetching is not yet finished.
* Error: A general error happened.
* After fetching has finished, signal fetchCredentialsFinished(bool) is emitted.
* The result can be retrieved with state() and password() and user() methods.
*/
class CredentialStore : public QObject
{
Q_OBJECT
public:
enum CredState { NotFetched = 0,
Ok,
UserCanceled,
Fetching,
AsyncFetching,
EntryNotFound,
AccessDeniedByUser,
AccessDenied,
NoKeychainBackend,
Error,
AsyncWriting,
TooManyAttempts };
enum CredentialType {
User = 0,
Settings,
KeyChain
};
QString password( ) const;
QString user( ) const;
/**
* @brief state
* @return the state of the Credentialstore.
*/
CredState state();
/**
* @brief fetchCredentials - start to retrieve user credentials.
*
* This method must be called first to retrieve the credentials.
* At the end, this method emits the fetchKeyChainFinished() signal.
*/
void fetchCredentials();
/**
* @brief instance - singleton pointer.
* @return the singleton pointer to access the object.
*/
static CredentialStore *instance();
/**
* @brief setCredentials - sets the user credentials.
*
* This function is called from the setup wizard to set the credentials
* int this store. Note that it does not store the password.
* The function also sets the state to ok.
* @param url - the connection url
* @param user - the user name
* @param password - the password.
*/
void setCredentials( const QString&, const QString&, const QString&, bool );
void saveCredentials( );
QString errorMessage();
/**
* @brief canTryAgain - check if another try to get credentials makes sense.
*/
bool canTryAgain();
void reset();
signals:
/**
* @brief fetchCredentialsFinished
*
* emitted as soon as the fetching of the credentials has finished.
* If the parameter is true, there is a password and user. This does
* however, not say if the credentials are valid log in data.
* If false, the user pressed cancel.
*/
void fetchCredentialsFinished(bool);
protected slots:
void slotKeyChainReadFinished( QKeychain::Job* );
void slotKeyChainWriteFinished( QKeychain::Job* );
void slotUserDialogDone(int);
private:
explicit CredentialStore(QObject *parent = 0);
void deleteKeyChainCredential( const QString& );
QString keyChainKey( const QString& ) const;
static CredentialStore *_instance;
static CredState _state;
static QString _passwd;
static QString _user;
static QString _url;
static QString _errorMsg;
static int _tries;
static CredentialType _type;
QInputDialog *_inputDialog;
};
}
#endif // CREDENTIALSTORE_H

View File

@@ -1,102 +0,0 @@
/*
* Copyright (C) by Duncan Mac-Vicar P. <duncan@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "mirall/csyncfolder.h"
#include "mirall/csyncthread.h"
#include "mirall/mirallconfigfile.h"
#include <csync.h>
#include <QDebug>
#include <QDir>
#include <QMutexLocker>
#include <QThread>
#include <QStringList>
#include <QTextStream>
namespace Mirall {
CSyncFolder::CSyncFolder(const QString &alias,
const QString &path,
const QString &secondPath,
QObject *parent)
: Folder(alias, path, secondPath, parent)
, _csync(0)
, _thread(0)
, _csyncError(false)
{
}
CSyncFolder::~CSyncFolder()
{
}
bool CSyncFolder::isBusy() const
{
return (_csync && _thread && _thread->isRunning() );
}
void CSyncFolder::startSync(const QStringList &pathList)
{
if (_thread && _thread->isRunning()) {
qCritical() << "* ERROR csync is still running and new sync requested.";
return;
}
delete _csync;
delete _thread;
_errors.clear();
_csyncError = false;
_thread = new QThread(this);
_csync = new CSyncThread( path(), secondPath() );
connect(_csync, SIGNAL(started()), SLOT(slotCSyncStarted()), Qt::QueuedConnection);
connect(_csync, SIGNAL(finished()), SLOT(slotCSyncFinished()), Qt::QueuedConnection);
connect(_csync, SIGNAL(csyncError(QString)), SLOT(slotCSyncError(QString)), Qt::QueuedConnection);
_csync->moveToThread(_thread);
_thread->start();
QMetaObject::invokeMethod(_csync, "startSync", Qt::QueuedConnection);
}
void CSyncFolder::slotTerminateSync()
{
if( _thread ) {
_thread->terminate();
}
}
void CSyncFolder::slotCSyncStarted()
{
qDebug() << " * csync thread started";
emit syncStarted();
}
void CSyncFolder::slotCSyncFinished()
{
SyncResult res(SyncResult::Success);
if( _csyncError ) {
res.setStatus( SyncResult::Error );
res.setErrorString( _errors.join(QLatin1String("\\n")));
}
emit syncFinished( res );
}
void CSyncFolder::slotCSyncError( const QString& errorStr )
{
_errors.append( errorStr );
_csyncError = true;
}
} // ns

View File

@@ -1,57 +0,0 @@
#ifndef CSYNCFOLDER_H
#define CSYNCFOLDER_H
/*
* Copyright (C) by Duncan Mac-Vicar P. <duncan@kde.org>
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "mirall/csyncthread.h"
#include "mirall/folder.h"
#include <QMutex>
#include <QThread>
#include <QString>
namespace Mirall {
class CSyncFolder : public Folder
{
Q_OBJECT
public:
CSyncFolder(const QString &alias,
const QString &path,
const QString &secondPath, QObject *parent = 0L);
virtual ~CSyncFolder();
virtual void startSync(const QStringList &pathList);
virtual bool isBusy() const;
public slots:
void slotTerminateSync();
protected slots:
void slotCSyncStarted();
void slotCSyncFinished();
void slotCSyncError( const QString& );
private:
bool _csyncError;
CSyncThread *_csync;
QThread *_thread;
QStringList _errors;
};
}
#endif

View File

@@ -16,8 +16,19 @@
#include "mirall/csyncthread.h"
#include "mirall/mirallconfigfile.h"
#include "mirall/theme.h"
#include "mirall/logger.h"
#include "mirall/owncloudinfo.h"
#ifdef Q_OS_WIN
#include <windows.h>
#else
#include <unistd.h>
#endif
#include <assert.h>
#include <QDebug>
#include <QSslSocket>
#include <QDir>
#include <QMutexLocker>
#include <QThread>
@@ -25,107 +36,20 @@
#include <QTextStream>
#include <QTime>
#include <QApplication>
#include <QUrl>
#include <QSslCertificate>
namespace Mirall {
/* static variables to hold the credentials */
QString CSyncThread::_user;
QString CSyncThread::_passwd;
QNetworkProxy CSyncThread::_proxy;
QString CSyncThread::_csyncConfigDir; // to be able to remove the lock file.
QMutex CSyncThread::_mutex;
QMutex CSyncThread::_syncMutex;
struct proxyInfo_s {
char *proxyType;
char *proxyHost;
char *proxyPort;
char *proxyUser;
char *proxyPwd;
};
typedef proxyInfo_s ProxyInfo;
int CSyncThread::checkPermissions( TREE_WALK_FILE* file, void *data )
{
WalkStats *wStats = static_cast<WalkStats*>(data);
if( !wStats ) {
qDebug() << "WalkStats is zero - must not be!";
return -1;
}
wStats->seenFiles++;
switch(file->instruction) {
case CSYNC_INSTRUCTION_NONE:
break;
case CSYNC_INSTRUCTION_EVAL:
wStats->eval++;
break;
case CSYNC_INSTRUCTION_REMOVE:
wStats->removed++;
break;
case CSYNC_INSTRUCTION_RENAME:
wStats->renamed++;
break;
case CSYNC_INSTRUCTION_NEW:
wStats->newFiles++;
break;
case CSYNC_INSTRUCTION_CONFLICT:
wStats->conflicts++;
break;
case CSYNC_INSTRUCTION_IGNORE:
wStats->ignores++;
break;
case CSYNC_INSTRUCTION_SYNC:
wStats->sync++;
break;
case CSYNC_INSTRUCTION_STAT_ERROR:
case CSYNC_INSTRUCTION_ERROR:
/* instructions for the propagator */
case CSYNC_INSTRUCTION_DELETED:
case CSYNC_INSTRUCTION_UPDATED:
wStats->error++;
wStats->errorType = WALK_ERROR_INSTRUCTIONS;
break;
default:
wStats->error++;
wStats->errorType = WALK_ERROR_WALK;
break;
}
if( file ) {
QString source = QString::fromUtf8(wStats->sourcePath);
source.append(QString::fromUtf8(file->path));
QFileInfo fi(source);
if( fi.isDir()) { // File type directory.
if( !(fi.isWritable() && fi.isExecutable()) ) {
wStats->dirPermErrors++;
wStats->errorType = WALK_ERROR_DIR_PERMS;
}
}
}
// qDebug() << wStats->seenFiles << ". Path: " << file->path << ": uid= " << file->uid << " - type: " << file->type;
if( !( wStats->errorType == WALK_ERROR_NONE || wStats->errorType == WALK_ERROR_DIR_PERMS )) {
return -1;
}
return 0;
}
CSyncThread::CSyncThread(const QString &source, const QString &target, bool localCheckOnly)
: _source(source)
, _target(target)
, _localCheckOnly( localCheckOnly )
CSyncThread::CSyncThread(CSYNC *csync)
{
_mutex.lock();
if( ! _source.endsWith(QLatin1Char('/'))) _source.append(QLatin1Char('/'));
_csync_ctx = csync;
_mutex.unlock();
}
@@ -134,282 +58,314 @@ CSyncThread::~CSyncThread()
}
static char* proxyTypeToCStr(QNetworkProxy::ProxyType type)
QString CSyncThread::csyncErrorToString( CSYNC_ERROR_CODE err, const char *errString )
{
switch (type) {
case QNetworkProxy::NoProxy:
return qstrdup("NoProxy");
case QNetworkProxy::DefaultProxy:
return qstrdup("DefaultProxy");
case QNetworkProxy::Socks5Proxy:
return qstrdup("Socks5Proxy");
case QNetworkProxy::HttpProxy:
return qstrdup("HttpProxy");
case QNetworkProxy::HttpCachingProxy:
return qstrdup("HttpCachingProxy");
case QNetworkProxy::FtpCachingProxy:
return qstrdup("FtpCachingProxy");
QString errStr;
switch( err ) {
case CSYNC_ERR_NONE:
errStr = tr("Success.");
break;
case CSYNC_ERR_LOG:
errStr = tr("CSync Logging setup failed.");
break;
case CSYNC_ERR_LOCK:
errStr = tr("CSync failed to create a lock file.");
break;
case CSYNC_ERR_STATEDB_LOAD:
errStr = tr("CSync failed to load the state db.");
break;
case CSYNC_ERR_MODULE:
errStr = tr("<p>The %1 plugin for csync could not be loaded.<br/>Please verify the installation!</p>").arg(Theme::instance()->appNameGUI());
break;
case CSYNC_ERR_TIMESKEW:
errStr = tr("The system time on this client is different than the system time on the server. "
"Please use a time synchronization service (NTP) on the server and client machines "
"so that the times remain the same.");
break;
case CSYNC_ERR_FILESYSTEM:
errStr = tr("CSync could not detect the filesystem type.");
break;
case CSYNC_ERR_TREE:
errStr = tr("CSync got an error while processing internal trees.");
break;
case CSYNC_ERR_MEM:
errStr = tr("CSync failed to reserve memory.");
break;
case CSYNC_ERR_PARAM:
errStr = tr("CSync fatal parameter error.");
break;
case CSYNC_ERR_UPDATE:
errStr = tr("CSync processing step update failed.");
break;
case CSYNC_ERR_RECONCILE:
errStr = tr("CSync processing step reconcile failed.");
break;
case CSYNC_ERR_PROPAGATE:
errStr = tr("CSync processing step propagate failed.");
break;
case CSYNC_ERR_ACCESS_FAILED:
errStr = tr("<p>The target directory does not exist.</p><p>Please check the sync setup.</p>");
// this is critical. The database has to be removed.
emit wipeDb();
break;
case CSYNC_ERR_REMOTE_CREATE:
case CSYNC_ERR_REMOTE_STAT:
errStr = tr("A remote file can not be written. Please check the remote access.");
break;
case CSYNC_ERR_LOCAL_CREATE:
case CSYNC_ERR_LOCAL_STAT:
errStr = tr("The local filesystem can not be written. Please check permissions.");
break;
case CSYNC_ERR_PROXY:
errStr = tr("CSync failed to connect through a proxy.");
break;
case CSYNC_ERR_LOOKUP:
errStr = tr("CSync failed to lookup proxy or server.");
break;
case CSYNC_ERR_AUTH_SERVER:
errStr = tr("CSync failed to authenticate at the %1 server.").arg(Theme::instance()->appNameGUI());
break;
case CSYNC_ERR_AUTH_PROXY:
errStr = tr("CSync failed to authenticate at the proxy.");
break;
case CSYNC_ERR_CONNECT:
errStr = tr("CSync failed to connect to the network.");
break;
case CSYNC_ERR_TIMEOUT:
errStr = tr("A network connection timeout happend.");
break;
case CSYNC_ERR_HTTP:
errStr = tr("A HTTP transmission error happened.");
break;
case CSYNC_ERR_PERM:
errStr = tr("CSync failed due to not handled permission deniend.");
break;
case CSYNC_ERR_NOT_FOUND:
errStr = tr("CSync failed to find a specific file.");
break;
case CSYNC_ERR_EXISTS:
errStr = tr("CSync tried to create a directory that already exists.");
break;
case CSYNC_ERR_NOSPC:
errStr = tr("CSync: No space on %1 server available.").arg(Theme::instance()->appNameGUI());
break;
case CSYNC_ERR_UNSPEC:
errStr = tr("CSync unspecified error.");
default:
return qstrdup("NoProxy");
errStr = tr("An internal error number %1 happend.").arg( (int) err );
}
if( errString ) {
errStr += tr("<br/>Backend Message: ")+QString::fromUtf8(errString);
}
return errStr;
}
int CSyncThread::treewalkLocal( TREE_WALK_FILE* file, void *data )
{
return static_cast<CSyncThread*>(data)->treewalkFile( file, false );
}
int CSyncThread::treewalkRemote( TREE_WALK_FILE* file, void *data )
{
return static_cast<CSyncThread*>(data)->treewalkFile( file, true );
}
int CSyncThread::walkFinalize(TREE_WALK_FILE* file, void *data )
{
return static_cast<CSyncThread*>(data)->treewalkError( file);
}
int CSyncThread::treewalkFile( TREE_WALK_FILE *file, bool remote )
{
if( ! file ) return -1;
SyncFileItem item;
item._file = QString::fromUtf8( file->path );
item._instruction = file->instruction;
item._dir = SyncFileItem::None;
SyncFileItem::Direction dir;
int re = 0;
switch(file->instruction) {
case CSYNC_INSTRUCTION_NONE:
case CSYNC_INSTRUCTION_IGNORE:
break;
default:
if (!_needsUpdate)
_needsUpdate = true;
}
switch(file->instruction) {
case CSYNC_INSTRUCTION_NONE:
// No need to do anything.
return re;
break;
case CSYNC_INSTRUCTION_RENAME:
dir = !remote ? SyncFileItem::Down : SyncFileItem::Up;
item._renameTarget = QString::fromUtf8( file->rename_path );
break;
case CSYNC_INSTRUCTION_REMOVE:
dir = !remote ? SyncFileItem::Down : SyncFileItem::Up;
break;
case CSYNC_INSTRUCTION_CONFLICT:
case CSYNC_INSTRUCTION_IGNORE:
case CSYNC_INSTRUCTION_ERROR:
dir = SyncFileItem::None;
break;
case CSYNC_INSTRUCTION_EVAL:
case CSYNC_INSTRUCTION_NEW:
case CSYNC_INSTRUCTION_SYNC:
case CSYNC_INSTRUCTION_STAT_ERROR:
case CSYNC_INSTRUCTION_DELETED:
case CSYNC_INSTRUCTION_UPDATED:
default:
dir = remote ? SyncFileItem::Down : SyncFileItem::Up;
break;
}
item._dir = dir;
_mutex.lock();
_syncedItems.append(item);
_mutex.unlock();
return re;
}
int CSyncThread::treewalkError(TREE_WALK_FILE* file)
{
SyncFileItem item;
item._file= QString::fromUtf8(file->path);
int indx = _syncedItems.indexOf(item);
if ( indx == -1 )
return 0;
if( file &&
file->instruction == CSYNC_INSTRUCTION_STAT_ERROR ||
file->instruction == CSYNC_INSTRUCTION_ERROR ) {
_mutex.lock();
_syncedItems[indx]._instruction = file->instruction;
_mutex.unlock();
}
return 0;
}
struct CSyncRunScopeHelper {
CSyncRunScopeHelper(CSYNC *ctx, CSyncThread *parent)
: _ctx(ctx), _parent(parent)
{
_t.start();
}
~CSyncRunScopeHelper() {
csync_commit(_ctx);
qDebug() << "CSync run took " << _t.elapsed() << " Milliseconds";
emit(_parent->finished());
_parent->_syncMutex.unlock();
}
CSYNC *_ctx;
QTime _t;
CSyncThread *_parent;
};
void CSyncThread::handleSyncError(CSYNC *ctx, const char *state) {
CSYNC_ERROR_CODE err = csync_get_error( ctx );
const char *errMsg = csync_get_error_string( ctx );
QString errStr = csyncErrorToString(err, errMsg);
qDebug() << " #### ERROR during "<< state << ": " << errStr;
switch (err) {
case CSYNC_ERR_SERVICE_UNAVAILABLE:
case CSYNC_ERR_CONNECT:
emit csyncUnavailable();
break;
default:
emit csyncError(errStr);
}
}
void CSyncThread::startSync()
{
if (!_syncMutex.tryLock()) {
qDebug() << Q_FUNC_INFO << "WARNING: Another sync seems to be running. Not starting a new one.";
return;
}
if( ! _csync_ctx ) {
qDebug() << "XXXXXXXXXXXXXXXX FAIL: do not have csync_ctx!";
}
qDebug() << Q_FUNC_INFO << "Sync started";
qDebug() << "starting to sync " << qApp->thread() << QThread::currentThread();
CSYNC *csync;
WalkStats *wStats = new WalkStats;
QTime walkTime;
wStats->sourcePath = 0;
wStats->errorType = 0;
wStats->eval = 0;
wStats->removed = 0;
wStats->renamed = 0;
wStats->newFiles = 0;
wStats->ignores = 0;
wStats->sync = 0;
wStats->seenFiles = 0;
wStats->conflicts = 0;
wStats->error = 0;
wStats->dirPermErrors = 0;
ProxyInfo proxyInfo;
_mutex.lock();
proxyInfo.proxyType = proxyTypeToCStr( _proxy.type() );
proxyInfo.proxyHost = qstrdup( _proxy.hostName().toAscii().constData() );
proxyInfo.proxyPort = qstrdup( QByteArray::number( _proxy.port() ).constData() );
proxyInfo.proxyUser = qstrdup( _proxy.user().toAscii().constData() );
proxyInfo.proxyPwd = qstrdup( _proxy.password().toAscii().constData() );
emit(started());
if( csync_create(&csync,
_source.toUtf8().data(),
_target.toUtf8().data()) < 0 ) {
emit csyncError( tr("CSync create failed.") );
}
// FIXME: Check if we really need this stringcopy!
wStats->sourcePath = qstrdup( _source.toUtf8().constData() );
_csyncConfigDir = QString::fromUtf8( csync_get_config_dir( csync ));
_syncedItems.clear();
_needsUpdate = false;
_mutex.unlock();
qDebug() << "## CSync Thread local only: " << _localCheckOnly;
csync_set_auth_callback( csync, getauth );
csync_enable_conflictcopys(csync);
// cleans up behind us and emits finished() to ease error handling
CSyncRunScopeHelper helper(_csync_ctx, this);
csync_set_userdata(_csync_ctx, this);
MirallConfigFile cfg;
QString excludeList = cfg.excludeFile();
if( !excludeList.isEmpty() ) {
qDebug() << "==== added CSync exclude List: " << excludeList.toAscii();
csync_add_exclude_list( csync, excludeList.toAscii() );
}
csync_set_config_dir( csync, cfg.configPath().toUtf8() );
QTime t;
t.start();
_mutex.lock();
if( _localCheckOnly ) {
csync_set_local_only( csync, true );
}
csync_set_userdata(csync, (void*) &proxyInfo);
_mutex.unlock();
if( csync_init(csync) < 0 ) {
CSYNC_ERROR_CODE err = csync_get_error( csync );
QString errStr;
switch( err ) {
case CSYNC_ERR_LOCK:
errStr = tr("CSync failed to create a lock file.");
break;
case CSYNC_ERR_STATEDB_LOAD:
errStr = tr("CSync failed to load the state db.");
break;
case CSYNC_ERR_TIMESKEW:
errStr = tr("The system time on this client is different than the system time on the server. "
"Please use a time synchronization service (NTP) on the server and client machines "
"so that the times remain the same.");
break;
case CSYNC_ERR_FILESYSTEM:
errStr = tr("CSync could not detect the filesystem type.");
break;
case CSYNC_ERR_TREE:
errStr = tr("CSync got an error while processing internal trees.");
break;
case CSYNC_ERR_ACCESS_FAILED:
errStr = tr("<p>The target directory %1 does not exist.</p><p>Please check the sync setup.</p>").arg(_target);
// this is critical. The database has to be removed.
emitStateDb(csync); // to make the name of the csync db known.
emit wipeDb();
break;
case CSYNC_ERR_MODULE:
errStr = tr("<p>The %1 plugin for csync could not be loaded.<br/>Please verify the installation!</p>").arg(Theme::instance()->appName());
break;
case CSYNC_ERR_LOCAL_CREATE:
case CSYNC_ERR_LOCAL_STAT:
errStr = tr("The local filesystem can not be written. Please check permissions.");
break;
case CSYNC_ERR_REMOTE_CREATE:
case CSYNC_ERR_REMOTE_STAT:
errStr = tr("A remote file can not be written. Please check the remote access.");
break;
default:
errStr = tr("An internal error number %1 happend.").arg( (int) err );
}
qDebug() << " #### ERROR String emitted: " << errStr;
emit csyncError(errStr);
goto cleanup;
}
emitStateDb(csync);
// csync_set_auth_callback( _csync_ctx, getauth );
csync_set_progress_callback( _csync_ctx, progress );
qDebug() << "#### Update start #################################################### >>";
if( csync_update(csync) < 0 ) {
CSYNC_ERROR_CODE err = csync_get_error( csync );
QString errStr;
switch( err ) {
case CSYNC_ERR_PROXY:
errStr = tr("CSync failed to reach the host. Either host or proxy settings are not valid.");
break;
default:
errStr = tr("CSync Update failed.");
break;
}
emit csyncError( errStr );
goto cleanup;
if( csync_update(_csync_ctx) < 0 ) {
handleSyncError(_csync_ctx, "csync_update");
return;
}
qDebug() << "<<#### Update end ###########################################################";
csync_set_userdata(csync, wStats);
walkTime.start();
if( csync_walk_local_tree(csync, &checkPermissions, 0) < 0 ) {
qDebug() << "Error in treewalk.";
if( wStats->errorType == WALK_ERROR_WALK ) {
emit csyncError(tr("CSync encountered an error while examining the file system.\n"
"Syncing is not possible."));
} else if( wStats->errorType == WALK_ERROR_INSTRUCTIONS ) {
emit csyncError(tr("CSync update generated a strange instruction.\n"
"Please write a bug report."));
}
emit csyncError(tr("Local filesystem problems. Better disable Syncing and check."));
goto cleanup;
} else {
// only warn, do not stop the sync process.
if( wStats->errorType == WALK_ERROR_DIR_PERMS ) {
emit csyncError(tr("The local filesystem has %1 write protected directories."
"That can hinder successful syncing.<p/>"
"Please make sure that all local directories are writeable.").arg(wStats->dirPermErrors));
}
if( csync_reconcile(_csync_ctx) < 0 ) {
handleSyncError(_csync_ctx, "cysnc_reconcile");
return;
}
// emit the treewalk results. Do not touch the wStats after this.
emit treeWalkResult(wStats);
_mutex.lock();
if( _localCheckOnly ) {
_mutex.unlock();
qDebug() << " ..... Local only walk finished: " << walkTime.elapsed();
// we have to go out here as its local check only.
goto cleanup;
} else {
_mutex.unlock();
// check if we can write all over.
if( csync_reconcile(csync) < 0 ) {
emit csyncError(tr("CSync reconcile failed."));
goto cleanup;
}
if( csync_propagate(csync) < 0 ) {
emit csyncError(tr("CSync propagate failed."));
goto cleanup;
}
bool walkOk = true;
if( csync_walk_local_tree(_csync_ctx, &treewalkLocal, 0) < 0 ) {
qDebug() << "Error in local treewalk.";
walkOk = false;
}
cleanup:
csync_destroy(csync);
if( proxyInfo.proxyType ) delete[] proxyInfo.proxyType;
if( proxyInfo.proxyHost ) delete[] proxyInfo.proxyHost;
if( proxyInfo.proxyPort ) delete[] proxyInfo.proxyPort;
if( proxyInfo.proxyUser ) delete[] proxyInfo.proxyUser;
if( proxyInfo.proxyPwd ) delete[] proxyInfo.proxyPwd ;
/*
* Attention: do not delete the wStat memory here. it is deleted in the
* slot catching the signel treeWalkResult because this thread can faster
* die than the slot has read out the data.
*/
qDebug() << "CSync run took " << t.elapsed() << " Milliseconds";
emit(finished());
}
void CSyncThread::emitStateDb( CSYNC *csync )
{
// After csync_init the statedb file name can be emitted
const char *statedb = csync_get_statedb_file( csync );
if( statedb ) {
QString stateDbFile = QString::fromUtf8(statedb);
free((void*)statedb);
emit csyncStateDbFile( stateDbFile );
} else {
qDebug() << "WRN: Unable to get csync statedb file name";
if( walkOk && csync_walk_remote_tree(_csync_ctx, &treewalkRemote, 0) < 0 ) {
qDebug() << "Error in remote treewalk.";
}
}
void CSyncThread::setConnectionDetails( const QString &user, const QString &passwd, const QNetworkProxy &proxy )
{
_mutex.lock();
_user = user;
_passwd = passwd;
_proxy = proxy;
_mutex.unlock();
}
if (_needsUpdate)
emit(started());
QString CSyncThread::csyncConfigDir()
{
return _csyncConfigDir;
}
if( csync_propagate(_csync_ctx) < 0 ) {
handleSyncError(_csync_ctx, "cysnc_reconcile");
return;
}
int CSyncThread::getauth(const char *prompt,
char *buf,
size_t len,
int echo,
int verify,
void *userdata
)
{
int re = 0;
QString qPrompt = QString::fromLocal8Bit( prompt ).trimmed();
_mutex.lock();
if( qPrompt == QLatin1String("Enter your username:") ) {
// qDebug() << "OOO Username requested!";
qstrncpy( buf, _user.toUtf8().constData(), len );
} else if( qPrompt == QLatin1String("Enter your password:") ) {
// qDebug() << "OOO Password requested!";
qstrncpy( buf, _passwd.toUtf8().constData(), len );
} else {
if( qPrompt.startsWith( QLatin1String("There are problems with the SSL certificate:"))) {
// SSL is requested. If the program came here, the SSL check was done by mirall
// the answer is simply yes here.
qstrcpy( buf, "yes" );
if( walkOk ) {
if( csync_walk_local_tree(_csync_ctx, &walkFinalize, 0) < 0 ||
csync_walk_remote_tree( _csync_ctx, &walkFinalize, 0 ) < 0 ) {
qDebug() << "Error in finalize treewalk.";
} else {
qDebug() << "Unknown prompt: <" << prompt << ">";
re = -1;
// emit the treewalk results.
emit treeWalkResult(_syncedItems);
}
}
_mutex.unlock();
return re;
qDebug() << Q_FUNC_INFO << "Sync finished";
}
void CSyncThread::progress(const char *remote_url, enum csync_notify_type_e kind,
long long o1, long long o2, void *userdata)
{
(void) o1; (void) o2;
if (kind == CSYNC_NOTIFY_FINISHED_DOWNLOAD) {
QString path = QUrl::fromEncoded(remote_url).toString();
CSyncThread *thread = static_cast<CSyncThread*>(userdata);
thread->fileReceived(path);
}
}
}

View File

@@ -1,6 +1,3 @@
#ifndef CSYNCTHREAD_H
#define CSYNCTHREAD_H
/*
* Copyright (C) by Duncan Mac-Vicar P. <duncan@kde.org>
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
@@ -16,6 +13,9 @@
* for more details.
*/
#ifndef CSYNCTHREAD_H
#define CSYNCTHREAD_H
#include <stdint.h>
#include <QMutex>
@@ -25,52 +25,30 @@
#include <csync.h>
#include "mirall/syncfileitem.h"
class QProcess;
namespace Mirall {
enum walkErrorTypes {
WALK_ERROR_NONE = 0,
WALK_ERROR_WALK,
WALK_ERROR_INSTRUCTIONS,
WALK_ERROR_DIR_PERMS
};
struct walkStats_s {
const char *sourcePath;
int errorType;
ulong eval;
ulong removed;
ulong renamed;
ulong newFiles;
ulong conflicts;
ulong ignores;
ulong sync;
ulong error;
ulong dirPermErrors;
ulong seenFiles;
};
typedef walkStats_s WalkStats;
class CSyncThread : public QObject
{
Q_OBJECT
public:
CSyncThread(const QString &source, const QString &target, bool = false);
CSyncThread(CSYNC *);
~CSyncThread();
static void setConnectionDetails( const QString&, const QString&, const QNetworkProxy& );
static QString csyncConfigDir();
QString csyncErrorToString( CSYNC_ERROR_CODE, const char * );
Q_INVOKABLE void startSync();
signals:
void treeWalkResult(WalkStats*);
void fileReceived( const QString& );
void fileRemoved( const QString& );
void csyncError( const QString& );
void csyncWarning( const QString& );
void csyncUnavailable();
void treeWalkResult(const SyncFileItemVector&);
void csyncStateDbFile( const QString& );
void wipeDb();
@@ -79,27 +57,29 @@ signals:
void started();
private:
static int checkPermissions( TREE_WALK_FILE* file, void *data);
void emitStateDb( CSYNC *csync );
void handleSyncError(CSYNC *ctx, const char *state);
static void progress(const char *remote_url,
enum csync_notify_type_e kind,
long long o1, long long o2,
void *userdata);
static int treewalkLocal( TREE_WALK_FILE*, void *);
static int treewalkRemote( TREE_WALK_FILE*, void *);
int treewalkFile( TREE_WALK_FILE*, bool );
int treewalkError( TREE_WALK_FILE* );
static int walkFinalize(TREE_WALK_FILE*, void* );
static int getauth(const char *prompt,
char *buf,
size_t len,
int echo,
int verify,
void *userdata
);
static QMutex _mutex;
static QString _user;
static QString _passwd;
static QNetworkProxy _proxy;
static QMutex _syncMutex;
SyncFileItemVector _syncedItems;
static QString _csyncConfigDir;
CSYNC *_csync_ctx;
bool _needsUpdate;
QString _source;
QString _target;
bool _localCheckOnly;
friend class CSyncRunScopeHelper;
};
}

View File

@@ -0,0 +1,301 @@
/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* 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 <QtGui>
#include "mirall/fileitemdialog.h"
#include "mirall/theme.h"
#include "mirall/syncresult.h"
#include "mirall/logger.h"
#define TYPE_SUCCESS 1
#define TYPE_CONFLICT 2
#define TYPE_NEW 3
#define TYPE_DELETED 4
#define TYPE_ERROR 5
#define TYPE_RENAME 6
#define TYPE_IGNORE 7
#define FILE_TYPE 100
namespace Mirall {
FileItemDialog::FileItemDialog(Theme *theme, QWidget *parent) :
QDialog(parent),
_theme(theme)
{
setupUi(this);
connect(_dialogButtonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()),
this, SLOT(accept()));
QStringList header;
header << tr("Files");
QString firstColString = tr("File Count");
header << firstColString;
_treeWidget->setHeaderLabels( header );
_treeWidget->setColumnWidth(0, 480);
_timer.setInterval(1000);
connect(&_timer, SIGNAL(timeout()), this, SLOT(slotSetFolderMessage()));
connect(this, SIGNAL(guiLog(QString,QString)), Logger::instance(), SIGNAL(guiLog(QString,QString)));
QPushButton *copyBtn = _dialogButtonBox->addButton(tr("Copy"), QDialogButtonBox::ActionRole);
connect(copyBtn, SIGNAL(clicked()), SLOT(copyToClipboard()));
setWindowTitle(tr("Sync Protocol"));
}
void FileItemDialog::setSyncResult( const SyncResult& result )
{
QString folderMessage;
SyncResult::Status syncStatus = result.status();
switch( syncStatus ) {
case SyncResult::Undefined:
folderMessage = tr( "Undefined Folder State" );
break;
case SyncResult::NotYetStarted:
folderMessage = tr( "The folder waits to start syncing." );
break;
case SyncResult::SyncPrepare:
folderMessage = tr( "Determining which files to sync." );
break;
case SyncResult::Unavailable:
folderMessage = tr( "Server is currently not available." );
break;
case SyncResult::SyncRunning:
folderMessage = tr("Sync is running.");
break;
case SyncResult::Success:
folderMessage = tr("Last Sync was successful.");
break;
case SyncResult::Error:
folderMessage = tr( "Syncing Error." );
break;
case SyncResult::SetupError:
folderMessage = tr( "Setup Error." );
break;
default:
folderMessage = tr( "Undefined Error State." );
}
_folderMessage = folderMessage;
_lastSyncTime = result.syncTime();
if( result.errorStrings().count() ) {
_errorLabel->setVisible(true);
_errorLabel->setTextFormat(Qt::RichText);
QString errStr;
foreach( QString err, result.errorStrings() ) {
errStr.append(QString("<p>%1</p>").arg(err));
}
_errorLabel->setText(errStr);
} else {
_errorLabel->setText(QString::null);
_errorLabel->setVisible(false);
}
slotSetFolderMessage();
if( syncStatus == SyncResult::SyncRunning ) {
_timer.stop();
} else {
_timer.start();
}
setSyncFileItems( result.syncFileItemVector() );
}
void FileItemDialog::slotSetFolderMessage()
{
QDateTime now = QDateTime::currentDateTime();
int secs = _lastSyncTime.secsTo(now);
_timelabel->setText(tr("%1 (finished %n sec. ago)", "", secs).arg(_folderMessage));
}
void FileItemDialog::copyToClipboard()
{
QString text;
QTextStream ts(&text);
int topLevelItems = _treeWidget->topLevelItemCount();
for (int i = 0; i < topLevelItems; i++) {
QTreeWidgetItem *item = _treeWidget->topLevelItem(i);
ts << left << qSetFieldWidth(50)
<< item->data(0, Qt::DisplayRole).toString()
<< right << qSetFieldWidth(6)
<< item->data(1, Qt::DisplayRole).toString()
<< endl;
int childItems = item->childCount();
for (int j = 0; j < childItems; j++) {
QTreeWidgetItem *child =item->child(j);
ts << left << qSetFieldWidth(0) << QLatin1String(" ")
<< child->data(0,Qt::DisplayRole).toString()
<< QString::fromLatin1(" (%1)").arg(
child->data(1, Qt::DisplayRole).toString()
)
<< endl;
}
}
QApplication::clipboard()->setText(text);
emit guiLog(tr("Copied to clipboard"), tr("The sync protocol has been copied to the clipboard."));
}
void FileItemDialog::accept()
{
_timer.stop();
QDialog::accept();
}
void FileItemDialog::setSyncFileItems( const SyncFileItemVector& list )
{
_treeWidget->clear();
QStringList strings;
QFont headerFont;
headerFont.setWeight(QFont::Bold);
strings.clear();
strings.append(tr("Synced Files"));
_syncedFileItem = new QTreeWidgetItem( _treeWidget, strings, TYPE_SUCCESS );
_syncedFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
_treeWidget->addTopLevelItem(_syncedFileItem);
strings.clear();
strings.append(tr("New Files"));
_newFileItem = new QTreeWidgetItem( _treeWidget, strings, TYPE_NEW );
_newFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
_treeWidget->addTopLevelItem(_newFileItem);
strings.clear();
strings.append(tr("Deleted Files"));
_deletedFileItem = new QTreeWidgetItem( _treeWidget, strings, TYPE_DELETED );
_deletedFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
_treeWidget->addTopLevelItem(_deletedFileItem);
strings.clear();
strings.append(tr("Renamed Files"));
_renamedFileItem = new QTreeWidgetItem( _treeWidget, strings, TYPE_RENAME);
_renamedFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
_treeWidget->addTopLevelItem(_renamedFileItem);
strings.clear();
strings.append(tr("Ignored Files"));
_ignoredFileItem = new QTreeWidgetItem( _treeWidget, strings, TYPE_IGNORE);
_ignoredFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
_treeWidget->addTopLevelItem(_renamedFileItem);
strings.clear();
strings.append(tr("Errors"));
_errorFileItem = new QTreeWidgetItem( _treeWidget, strings, TYPE_ERROR );
_errorFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
_treeWidget->addTopLevelItem(_errorFileItem);
strings.clear();
strings.append(tr("Conflicts"));
_conflictFileItem = new QTreeWidgetItem( _treeWidget, strings, TYPE_CONFLICT);
_conflictFileItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
_treeWidget->addTopLevelItem(_conflictFileItem);
QList<QTreeWidgetItem*> syncedItems;
QList<QTreeWidgetItem*> renamedItems;
QList<QTreeWidgetItem*> newItems;
QList<QTreeWidgetItem*> deletedItems;
QList<QTreeWidgetItem*> ignoredItems;
QList<QTreeWidgetItem*> conflictItems;
QList<QTreeWidgetItem*> errorItems;
quint64 overall_files = 0;
foreach( SyncFileItem item, list ) {
overall_files++;
QString dir;
QStringList str( item._file );
if( item._dir == SyncFileItem::Up ) dir = tr("Uploaded");
if( item._dir == SyncFileItem::Down ) dir = tr("Downloaded");
str << dir;
switch( item._instruction ) {
case CSYNC_INSTRUCTION_NONE:
// do nothing.
break;
case CSYNC_INSTRUCTION_EVAL:
// should not happen
break;
case CSYNC_INSTRUCTION_REMOVE:
case CSYNC_INSTRUCTION_DELETED:
deletedItems.append( new QTreeWidgetItem(_deletedFileItem, str, FILE_TYPE) );
break;
case CSYNC_INSTRUCTION_RENAME:
renamedItems.append( new QTreeWidgetItem(_renamedFileItem, str, FILE_TYPE) );
break;
case CSYNC_INSTRUCTION_NEW:
newItems.append( new QTreeWidgetItem(_newFileItem, str, FILE_TYPE) );
break;
case CSYNC_INSTRUCTION_CONFLICT:
conflictItems.append( new QTreeWidgetItem(_conflictFileItem, str, FILE_TYPE) );
break;
case CSYNC_INSTRUCTION_IGNORE:
ignoredItems.append( new QTreeWidgetItem(_ignoredFileItem, str, FILE_TYPE) );
break;
case CSYNC_INSTRUCTION_SYNC:
case CSYNC_INSTRUCTION_UPDATED:
syncedItems.append( new QTreeWidgetItem(_syncedFileItem, str, FILE_TYPE) );
break;
case CSYNC_INSTRUCTION_STAT_ERROR:
case CSYNC_INSTRUCTION_ERROR:
errorItems.append( new QTreeWidgetItem(_errorFileItem, str, FILE_TYPE) );
break;
default:
break;
}
}
formatHeaderItem( _syncedFileItem, syncedItems );
formatHeaderItem( _newFileItem, newItems );
formatHeaderItem( _deletedFileItem, deletedItems );
formatHeaderItem( _renamedFileItem, renamedItems );
formatHeaderItem( _errorFileItem, errorItems );
formatHeaderItem( _conflictFileItem, conflictItems );
formatHeaderItem( _ignoredFileItem, ignoredItems );
}
void FileItemDialog::formatHeaderItem( QTreeWidgetItem *header, const QList<QTreeWidgetItem*>& list )
{
if( !header ) return;
header->addChildren( list );
int count = list.count();
#if LEAVE_THAT_TO_DESIGNERS
QColor col("#adc5d3");
header->setBackgroundColor(0, col);
header->setBackgroundColor(1, col);
#endif
header->setText(1, QString::number( count ));
if( count ) {
QFont font;
font.setWeight( QFont::Bold );
header->setFont(0, font);
header->setFont(1, font);
header->setExpanded(true);
} else {
header->setExpanded(false);
}
}
}

View File

@@ -0,0 +1,68 @@
/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* 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 FILEITEMDIALOG_H
#define FILEITEMDIALOG_H
#include <QDialog>
#include <QDateTime>
#include <QTimer>
#include "mirall/syncfileitem.h"
#include "ui_fileitemdialog.h"
namespace Mirall {
class Theme;
class SyncResult;
class FileItemDialog : public QDialog, public Ui::_fileItemDialog
{
Q_OBJECT
public:
explicit FileItemDialog(Theme*, QWidget *parent = 0);
void setSyncResult( const SyncResult& );
signals:
public slots:
void accept();
protected slots:
void slotSetFolderMessage();
void copyToClipboard();
signals:
void guiLog(const QString&, const QString&);
private:
void setSyncFileItems( const SyncFileItemVector& list );
void formatHeaderItem( QTreeWidgetItem *, const QList<QTreeWidgetItem*>& );
QTreeWidgetItem *_newFileItem;
QTreeWidgetItem *_syncedFileItem;
QTreeWidgetItem *_deletedFileItem;
QTreeWidgetItem *_renamedFileItem;
QTreeWidgetItem *_errorFileItem;
QTreeWidgetItem *_conflictFileItem;
QTreeWidgetItem *_ignoredFileItem;
Theme *_theme;
QString _folderMessage;
QDateTime _lastSyncTime;
QTimer _timer;
};
}
#endif // FILEITEMDIALOG_H

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>_fileItemDialog</class>
<widget class="QWidget" name="_fileItemDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>612</width>
<height>543</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="text">
<string>Detailed Sync Protocol</string>
</property>
</widget>
</item>
<item>
<widget class="QTreeWidget" name="_treeWidget">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="rootIsDecorated">
<bool>true</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="columnCount">
<number>2</number>
</property>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
</property>
</column>
</widget>
</item>
<item>
<widget class="QLabel" name="_timelabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="_errorLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="_dialogButtonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -25,7 +25,7 @@ QStringList FileUtils::subFoldersList(QString folder,
SubFolderListOptions options)
{
QDir dir(folder);
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
QFileInfoList list = dir.entryInfoList();
QStringList dirList;

Some files were not shown because too many files have changed in this diff Show More