From 8738bd0e7665cf25fb23037f79bdd0cc786ffb10 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Thu, 27 Oct 2016 23:58:19 +0200 Subject: [PATCH 1/6] Remove leading & trailing spaces before adding task As the keyboard's autocorrect usually appends a space to the completed word, sometimes already existing tasks haven't been reopened properly. contributes to #82 --- qml/pages/TaskPage.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qml/pages/TaskPage.qml b/qml/pages/TaskPage.qml index d8b0193..893f23a 100644 --- a/qml/pages/TaskPage.qml +++ b/qml/pages/TaskPage.qml @@ -311,6 +311,9 @@ Page { function addTask(newTask) { var taskNew = (typeof newTask !== 'undefined') ? newTask : taskAdd.text + if(taskNew.trim) { + taskNew = taskNew.trim() + } if (taskNew.length > 0) { // add task to db and tasklist var result = DB.writeTask(listid, taskNew, 1, 0, 0, DB.PRIORITY_DEFAULT, "") From 8a58039f422a230c814de4644d60c4e3c1cde417 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Sun, 13 Nov 2016 02:15:53 +0100 Subject: [PATCH 2/6] also trim tasks on EditPage - also moved trimmed() function to own module --- qml/common.js | 5 +++++ qml/pages/EditPage.qml | 5 +++-- qml/pages/TaskPage.qml | 6 ++---- 3 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 qml/common.js diff --git a/qml/common.js b/qml/common.js new file mode 100644 index 0000000..7be4818 --- /dev/null +++ b/qml/common.js @@ -0,0 +1,5 @@ + +function trimmed(obj) { + if(obj.trim) + return obj.trim() +} diff --git a/qml/pages/EditPage.qml b/qml/pages/EditPage.qml index 881f394..1ca2f53 100644 --- a/qml/pages/EditPage.qml +++ b/qml/pages/EditPage.qml @@ -20,6 +20,7 @@ import QtQuick 2.1 import Sailfish.Silica 1.0 import "../localdb.js" as DB +import "../common.js" as Common import "." Dialog { @@ -59,7 +60,7 @@ Dialog { function checkContent() { var ok = true var listId = listModel.get(list.currentIndex).id - var name = task.text + var name = Common.trimmed(task.text) var count = DB.checkTask(listId, name) // if task already exists in target list, display warning @@ -115,7 +116,7 @@ Dialog { onAccepted: { var ok = DB.updateTask(params.taskid, listModel.get(list.currentIndex).id, - task.text, taskListWindow.statusOpen(status.checked) ? 1 : 0, + Common.trimmed(task.text), taskListWindow.statusOpen(status.checked) ? 1 : 0, params.dueDate, 0, priorityBox.selectedPriority(), notes.text, DB.REPETITION_VARIANTS[repeat.currentIndex].key) if (ok) diff --git a/qml/pages/TaskPage.qml b/qml/pages/TaskPage.qml index 893f23a..1e0bd91 100644 --- a/qml/pages/TaskPage.qml +++ b/qml/pages/TaskPage.qml @@ -20,6 +20,7 @@ import QtQuick 2.1 import Sailfish.Silica 1.0 import "../localdb.js" as DB +import "../common.js" as Common import "." Page { @@ -310,10 +311,7 @@ Page { EnterKey.enabled: text.length > 0 function addTask(newTask) { - var taskNew = (typeof newTask !== 'undefined') ? newTask : taskAdd.text - if(taskNew.trim) { - taskNew = taskNew.trim() - } + var taskNew = Common.trimmed((typeof newTask !== 'undefined') ? newTask : taskAdd.text) if (taskNew.length > 0) { // add task to db and tasklist var result = DB.writeTask(listid, taskNew, 1, 0, 0, DB.PRIORITY_DEFAULT, "") From 23fc23197dc5a460c0833c52a70e7f13db69ee0e Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Thu, 17 Nov 2016 12:07:03 +0100 Subject: [PATCH 3/6] non-trimmable objects shall be returned unchanged --- qml/common.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qml/common.js b/qml/common.js index 7be4818..3d93837 100644 --- a/qml/common.js +++ b/qml/common.js @@ -1,5 +1,7 @@ +//trim objects if they provide a trim() function (e. g. strings), else just the original object function trimmed(obj) { if(obj.trim) return obj.trim() + return obj } From fc7241f69dc0c7fc1d2d862a0ed5682e6bfe1a40 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Wed, 21 Dec 2016 13:37:39 +0100 Subject: [PATCH 4/6] restructured project to include tests - split up rpoject into two subprojects with their own .pro files, but sharing one spec/ yaml file - project structure inspired by https://github.com/amarchen/helloworld-pro-sailfish - include testing instructions into README --- .gitignore | 2 + .gitmodules | 4 +- README.md | 11 + harbour-tasklist.pro | 66 +- rpm/harbour-tasklist.yaml | 25 +- gen-qm.sh => src/gen-qm.sh | 0 gen-ts.sh => src/gen-ts.sh | 0 .../harbour-tasklist.desktop | 0 .../harbour-tasklist.png | Bin .../harbour-tasklist_ca.ts | 0 .../harbour-tasklist_cs_CZ.ts | 0 .../harbour-tasklist_da_DK.ts | 0 .../harbour-tasklist_de_DE.ts | 0 .../harbour-tasklist_en_US.ts | 0 .../harbour-tasklist_es_ES.ts | 0 .../harbour-tasklist_fi_FI.ts | 0 .../harbour-tasklist_fr_FR.ts | 0 .../harbour-tasklist_hu.ts | 0 .../harbour-tasklist_it_IT.ts | 0 .../harbour-tasklist_ku_IQ.ts | 0 .../harbour-tasklist_lt.ts | 0 .../harbour-tasklist_nl_NL.ts | 0 .../harbour-tasklist_pl_PL.ts | 0 .../harbour-tasklist_ru_RU.ts | 0 .../harbour-tasklist_sv_SE.ts | 0 .../harbour-tasklist_tr_TR.ts | 0 .../harbour-tasklist_zh_CN.ts | 0 src/qml/TestCases.qml | 5 + {qml => src/qml}/common.js | 0 {qml => src/qml}/harbour-tasklist.qml | 0 {qml => src/qml}/images/coverbg.png | Bin {qml => src/qml}/images/harbour-tasklist.png | Bin {qml => src/qml}/localdb.js | 0 {qml => src/qml}/pages/AboutPage.qml | 0 {qml => src/qml}/pages/CoverPage.qml | 0 {qml => src/qml}/pages/EditPage.qml | 0 {qml => src/qml}/pages/ExportPage.qml | 0 {qml => src/qml}/pages/HelpPage.qml | 0 {qml => src/qml}/pages/ListPage.qml | 0 {qml => src/qml}/pages/SettingsPage.qml | 0 {qml => src/qml}/pages/TagDialog.qml | 0 {qml => src/qml}/pages/TagPage.qml | 0 {qml => src/qml}/pages/TaskListItem.qml | 0 {qml => src/qml}/pages/TaskPage.qml | 0 {qml => src/qml}/pages/sync/DropboxAuth.qml | 0 {qml => src/qml}/pages/sync/DropboxSync.qml | 0 src/src.pro | 69 + src/third_party/QtDropbox/.gitignore | 14 + src/third_party/QtDropbox/.travis.yml | 30 + src/third_party/QtDropbox/AUTHORS.md | 11 + src/third_party/QtDropbox/GPL | 674 +++ src/third_party/QtDropbox/INSTALL.md | 48 + src/third_party/QtDropbox/LICENCE | 165 + .../QtDropbox/QtDropbox-Info.plist | 30 + src/third_party/QtDropbox/README.md | 88 + src/third_party/QtDropbox/doc/DEVELOPMENT.md | 82 + src/third_party/QtDropbox/doc/design.uml | 4690 +++++++++++++++++ src/third_party/QtDropbox/doc/doxygen.conf | 1749 ++++++ src/third_party/QtDropbox/libqtdropbox.pri | 13 + .../QtDropbox/qtdropbox.config.pri | 21 + src/third_party/QtDropbox/qtdropbox.pri | 23 + src/third_party/QtDropbox/qtdropbox.pro | 34 + src/third_party/QtDropbox/src/qdropbox.cpp | 1257 +++++ src/third_party/QtDropbox/src/qdropbox.h | 664 +++ .../QtDropbox/src/qdropboxaccount.cpp | 146 + .../QtDropbox/src/qdropboxaccount.h | 114 + .../QtDropbox/src/qdropboxdeltaresponse.cpp | 63 + .../QtDropbox/src/qdropboxdeltaresponse.h | 67 + .../QtDropbox/src/qdropboxfile.cpp | 586 ++ src/third_party/QtDropbox/src/qdropboxfile.h | 269 + .../QtDropbox/src/qdropboxfileinfo.cpp | 178 + .../QtDropbox/src/qdropboxfileinfo.h | 183 + .../QtDropbox/src/qdropboxjson.cpp | 747 +++ src/third_party/QtDropbox/src/qdropboxjson.h | 259 + src/third_party/QtDropbox/src/qtdropbox.h | 11 + .../QtDropbox/src/qtdropbox_global.h | 23 + src/third_party/QtDropbox/tests/README.md | 34 + .../QtDropbox/tests/qtdropboxtest.cpp | 378 ++ .../QtDropbox/tests/qtdropboxtest.hpp | 44 + src/third_party/QtDropbox/tests/tests.pro | 31 + tests/main.cpp | 4 + tests/runTestsOnDevice.sh | 7 + tests/tests.pro | 37 + tests/tst_NonUiTests.qml | 29 + third_party/QtDropbox | 1 - 85 files changed, 12921 insertions(+), 65 deletions(-) rename gen-qm.sh => src/gen-qm.sh (100%) rename gen-ts.sh => src/gen-ts.sh (100%) rename harbour-tasklist.desktop => src/harbour-tasklist.desktop (100%) rename harbour-tasklist.png => src/harbour-tasklist.png (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_ca.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_cs_CZ.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_da_DK.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_de_DE.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_en_US.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_es_ES.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_fi_FI.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_fr_FR.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_hu.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_it_IT.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_ku_IQ.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_lt.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_nl_NL.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_pl_PL.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_ru_RU.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_sv_SE.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_tr_TR.ts (100%) rename {localization-sources => src/localization-sources}/harbour-tasklist_zh_CN.ts (100%) create mode 100644 src/qml/TestCases.qml rename {qml => src/qml}/common.js (100%) rename {qml => src/qml}/harbour-tasklist.qml (100%) rename {qml => src/qml}/images/coverbg.png (100%) rename {qml => src/qml}/images/harbour-tasklist.png (100%) rename {qml => src/qml}/localdb.js (100%) rename {qml => src/qml}/pages/AboutPage.qml (100%) rename {qml => src/qml}/pages/CoverPage.qml (100%) rename {qml => src/qml}/pages/EditPage.qml (100%) rename {qml => src/qml}/pages/ExportPage.qml (100%) rename {qml => src/qml}/pages/HelpPage.qml (100%) rename {qml => src/qml}/pages/ListPage.qml (100%) rename {qml => src/qml}/pages/SettingsPage.qml (100%) rename {qml => src/qml}/pages/TagDialog.qml (100%) rename {qml => src/qml}/pages/TagPage.qml (100%) rename {qml => src/qml}/pages/TaskListItem.qml (100%) rename {qml => src/qml}/pages/TaskPage.qml (100%) rename {qml => src/qml}/pages/sync/DropboxAuth.qml (100%) rename {qml => src/qml}/pages/sync/DropboxSync.qml (100%) create mode 100644 src/src.pro create mode 100644 src/third_party/QtDropbox/.gitignore create mode 100644 src/third_party/QtDropbox/.travis.yml create mode 100644 src/third_party/QtDropbox/AUTHORS.md create mode 100644 src/third_party/QtDropbox/GPL create mode 100644 src/third_party/QtDropbox/INSTALL.md create mode 100644 src/third_party/QtDropbox/LICENCE create mode 100644 src/third_party/QtDropbox/QtDropbox-Info.plist create mode 100644 src/third_party/QtDropbox/README.md create mode 100644 src/third_party/QtDropbox/doc/DEVELOPMENT.md create mode 100644 src/third_party/QtDropbox/doc/design.uml create mode 100644 src/third_party/QtDropbox/doc/doxygen.conf create mode 100644 src/third_party/QtDropbox/libqtdropbox.pri create mode 100644 src/third_party/QtDropbox/qtdropbox.config.pri create mode 100644 src/third_party/QtDropbox/qtdropbox.pri create mode 100644 src/third_party/QtDropbox/qtdropbox.pro create mode 100644 src/third_party/QtDropbox/src/qdropbox.cpp create mode 100644 src/third_party/QtDropbox/src/qdropbox.h create mode 100644 src/third_party/QtDropbox/src/qdropboxaccount.cpp create mode 100644 src/third_party/QtDropbox/src/qdropboxaccount.h create mode 100644 src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp create mode 100644 src/third_party/QtDropbox/src/qdropboxdeltaresponse.h create mode 100644 src/third_party/QtDropbox/src/qdropboxfile.cpp create mode 100644 src/third_party/QtDropbox/src/qdropboxfile.h create mode 100644 src/third_party/QtDropbox/src/qdropboxfileinfo.cpp create mode 100644 src/third_party/QtDropbox/src/qdropboxfileinfo.h create mode 100644 src/third_party/QtDropbox/src/qdropboxjson.cpp create mode 100644 src/third_party/QtDropbox/src/qdropboxjson.h create mode 100644 src/third_party/QtDropbox/src/qtdropbox.h create mode 100644 src/third_party/QtDropbox/src/qtdropbox_global.h create mode 100644 src/third_party/QtDropbox/tests/README.md create mode 100644 src/third_party/QtDropbox/tests/qtdropboxtest.cpp create mode 100644 src/third_party/QtDropbox/tests/qtdropboxtest.hpp create mode 100644 src/third_party/QtDropbox/tests/tests.pro create mode 100644 tests/main.cpp create mode 100644 tests/runTestsOnDevice.sh create mode 100644 tests/tests.pro create mode 100644 tests/tst_NonUiTests.qml delete mode 160000 third_party/QtDropbox diff --git a/.gitignore b/.gitignore index 082e8a8..91dbac8 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ rpm/harbour-tasklist.spec *.o localization *.qm +build/ +.directory diff --git a/.gitmodules b/.gitmodules index 7588979..8dc9880 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "third_party/QtDropbox"] - path = third_party/QtDropbox +[submodule "src/third_party/QtDropbox"] + path = src/third_party/QtDropbox url = https://github.com/lycis/QtDropbox.git diff --git a/README.md b/README.md index 5911464..b1575b2 100755 --- a/README.md +++ b/README.md @@ -6,6 +6,17 @@ Developing ================ Have a look here to prepare your build environment for TaskList: https://github.com/Armadill0/harbour-tasklist/wiki +### Running tests +* Option 1: In the emulator console, just run `/usr/share/tst-harbour-tasklist/runTestsOnDevice.sh` Here are instructions on connecting to the emulator's console - https://sailfishos.org/develop-faq.html + +* Option 2: Inside SailfishOS IDE + + 1. Toolbar -> Projects -> i486 -> Run -> Run Settings -> Run -> Run configuration -> "src (on Mer Device)" -> "Use this command instead" + + 2. Set "Alternate executable on device:" to `/usr/share/tst-harbour-tasklist/runTestsOnDevice.sh` + + 3. Run the project again, see test results in the console + Pull-Requests ================ Pull-Requests are always welcome. But please respect the following rules to make the life of the collaborators easier. ;-) diff --git a/harbour-tasklist.pro b/harbour-tasklist.pro index 771620b..c74f3f0 100644 --- a/harbour-tasklist.pro +++ b/harbour-tasklist.pro @@ -1,62 +1,6 @@ -# The name of your app. -# NOTICE: name defined in TARGET has a corresponding QML filename. -# If name defined in TARGET is changed, following needs to be -# done to match new name: -# - corresponding QML filename must be changed -# - desktop icon filename must be changed -# - desktop filename must be changed -# - icon definition filename in desktop file must be changed -TARGET = harbour-tasklist +TEMPLATE = subdirs +SUBDIRS = src tests -CONFIG += sailfishapp c++11 -QT += dbus - -SOURCES += src/harbour-tasklist.cpp \ - src/tasksexport.cpp - -OTHER_FILES += qml/harbour-tasklist.qml \ - qml/pages/CoverPage.qml \ - rpm/harbour-tasklist.yaml \ - harbour-tasklist.desktop \ - qml/localdb.js \ - qml/pages/AboutPage.qml \ - qml/pages/EditPage.qml \ - qml/pages/TaskPage.qml \ - qml/pages/ListPage.qml \ - qml/pages/SettingsPage.qml \ - qml/pages/TaskListItem.qml \ - qml/pages/ExportPage.qml \ - qml/pages/TagPage.qml \ - qml/pages/TagDialog.qml \ - qml/pages/sync/DropboxAuth.qml \ - qml/pages/sync/DropboxSync.qml \ - qml/pages/HelpPage.qml - -include(third_party/QtDropbox/qtdropbox.pri) - -!defined(TASKLIST_DROPBOX_APPKEY, var) { - error("Please provide Dropbox appkey as argument of qmake, e.g. 'qmake TASKLIST_DROPBOX_APPKEY='") -} -!defined(TASKLIST_DROPBOX_SHAREDSECRET, var) { - error("Please provide Dropbox shared secret as argument of qmake, e.g. 'qmake TASKLIST_DROPBOX_SHAREDSECRET='") -} - -DEFINES += TASKLIST_DROPBOX_APPKEY=$$TASKLIST_DROPBOX_APPKEY TASKLIST_DROPBOX_SHAREDSECRET=$$TASKLIST_DROPBOX_SHAREDSECRET - -localization.files = localization -localization.path = /usr/share/$${TARGET} - -INSTALLS += localization - -CONFIG += sailfishapp_i18n_idbased - -lupdate_only { - SOURCES = qml/*.qml \ - qml/*.js \ - qml/pages/*.qml \ - qml/pages/sync/*.qml - TRANSLATIONS = localization-sources/*.ts -} - -HEADERS += \ - src/tasksexport.h +# ordered makes sure projects are built in the order specified in SUBDIRS. +# Usually it makes sense to build tests only if main component can be built +CONFIG += ordered diff --git a/rpm/harbour-tasklist.yaml b/rpm/harbour-tasklist.yaml index bc9f767..c73f6a8 100644 --- a/rpm/harbour-tasklist.yaml +++ b/rpm/harbour-tasklist.yaml @@ -17,6 +17,9 @@ Configure: none # The qtc5 builder inserts macros to allow QtCreator to have fine # control over qmake/make execution Builder: qtc5 +QMakeOptions: +- VERSION=%{version} +- RELEASE=%{release} # This section specifies build dependencies that are resolved using pkgconfig. # This is the preferred way of specifying build dependencies for your package. @@ -36,10 +39,30 @@ Requires: # All installed files Files: - - '%{_bindir}' +# Do not include whole %{_datadir}/applications as that would include tests too + - '%defattr(0644,root,root,0755)' - '%{_datadir}/%{name}' - '%{_datadir}/applications/%{name}.desktop' - '%{_datadir}/icons/hicolor/86x86/apps/%{name}.png' + - '%attr(0755,-,-) %{_bindir}/%{name}' + +SubPackages: + - Name: harbour-tasklist-test + Summary: harbour-tasklist tests + Group: Qt/Qt + Description: |- + Tests for the harbour-tasklist package + AutoDepend: true + PkgConfigBR: + - Qt5QuickTest + Requires: + - qt5-qtdeclarative-import-qttest + Files: + - '%{_bindir}/tst-harbour-tasklist' + - '%{_datadir}/tst-harbour-tasklist/*.qml' + # Script for starting tests on emulator and device + - '%attr(0755,-,-) %{_datadir}/tst-harbour-tasklist/*.sh' + # For more information about yaml and what's supported in Sailfish OS # build system, please see https://wiki.merproject.org/wiki/Spectacle diff --git a/gen-qm.sh b/src/gen-qm.sh similarity index 100% rename from gen-qm.sh rename to src/gen-qm.sh diff --git a/gen-ts.sh b/src/gen-ts.sh similarity index 100% rename from gen-ts.sh rename to src/gen-ts.sh diff --git a/harbour-tasklist.desktop b/src/harbour-tasklist.desktop similarity index 100% rename from harbour-tasklist.desktop rename to src/harbour-tasklist.desktop diff --git a/harbour-tasklist.png b/src/harbour-tasklist.png similarity index 100% rename from harbour-tasklist.png rename to src/harbour-tasklist.png diff --git a/localization-sources/harbour-tasklist_ca.ts b/src/localization-sources/harbour-tasklist_ca.ts similarity index 100% rename from localization-sources/harbour-tasklist_ca.ts rename to src/localization-sources/harbour-tasklist_ca.ts diff --git a/localization-sources/harbour-tasklist_cs_CZ.ts b/src/localization-sources/harbour-tasklist_cs_CZ.ts similarity index 100% rename from localization-sources/harbour-tasklist_cs_CZ.ts rename to src/localization-sources/harbour-tasklist_cs_CZ.ts diff --git a/localization-sources/harbour-tasklist_da_DK.ts b/src/localization-sources/harbour-tasklist_da_DK.ts similarity index 100% rename from localization-sources/harbour-tasklist_da_DK.ts rename to src/localization-sources/harbour-tasklist_da_DK.ts diff --git a/localization-sources/harbour-tasklist_de_DE.ts b/src/localization-sources/harbour-tasklist_de_DE.ts similarity index 100% rename from localization-sources/harbour-tasklist_de_DE.ts rename to src/localization-sources/harbour-tasklist_de_DE.ts diff --git a/localization-sources/harbour-tasklist_en_US.ts b/src/localization-sources/harbour-tasklist_en_US.ts similarity index 100% rename from localization-sources/harbour-tasklist_en_US.ts rename to src/localization-sources/harbour-tasklist_en_US.ts diff --git a/localization-sources/harbour-tasklist_es_ES.ts b/src/localization-sources/harbour-tasklist_es_ES.ts similarity index 100% rename from localization-sources/harbour-tasklist_es_ES.ts rename to src/localization-sources/harbour-tasklist_es_ES.ts diff --git a/localization-sources/harbour-tasklist_fi_FI.ts b/src/localization-sources/harbour-tasklist_fi_FI.ts similarity index 100% rename from localization-sources/harbour-tasklist_fi_FI.ts rename to src/localization-sources/harbour-tasklist_fi_FI.ts diff --git a/localization-sources/harbour-tasklist_fr_FR.ts b/src/localization-sources/harbour-tasklist_fr_FR.ts similarity index 100% rename from localization-sources/harbour-tasklist_fr_FR.ts rename to src/localization-sources/harbour-tasklist_fr_FR.ts diff --git a/localization-sources/harbour-tasklist_hu.ts b/src/localization-sources/harbour-tasklist_hu.ts similarity index 100% rename from localization-sources/harbour-tasklist_hu.ts rename to src/localization-sources/harbour-tasklist_hu.ts diff --git a/localization-sources/harbour-tasklist_it_IT.ts b/src/localization-sources/harbour-tasklist_it_IT.ts similarity index 100% rename from localization-sources/harbour-tasklist_it_IT.ts rename to src/localization-sources/harbour-tasklist_it_IT.ts diff --git a/localization-sources/harbour-tasklist_ku_IQ.ts b/src/localization-sources/harbour-tasklist_ku_IQ.ts similarity index 100% rename from localization-sources/harbour-tasklist_ku_IQ.ts rename to src/localization-sources/harbour-tasklist_ku_IQ.ts diff --git a/localization-sources/harbour-tasklist_lt.ts b/src/localization-sources/harbour-tasklist_lt.ts similarity index 100% rename from localization-sources/harbour-tasklist_lt.ts rename to src/localization-sources/harbour-tasklist_lt.ts diff --git a/localization-sources/harbour-tasklist_nl_NL.ts b/src/localization-sources/harbour-tasklist_nl_NL.ts similarity index 100% rename from localization-sources/harbour-tasklist_nl_NL.ts rename to src/localization-sources/harbour-tasklist_nl_NL.ts diff --git a/localization-sources/harbour-tasklist_pl_PL.ts b/src/localization-sources/harbour-tasklist_pl_PL.ts similarity index 100% rename from localization-sources/harbour-tasklist_pl_PL.ts rename to src/localization-sources/harbour-tasklist_pl_PL.ts diff --git a/localization-sources/harbour-tasklist_ru_RU.ts b/src/localization-sources/harbour-tasklist_ru_RU.ts similarity index 100% rename from localization-sources/harbour-tasklist_ru_RU.ts rename to src/localization-sources/harbour-tasklist_ru_RU.ts diff --git a/localization-sources/harbour-tasklist_sv_SE.ts b/src/localization-sources/harbour-tasklist_sv_SE.ts similarity index 100% rename from localization-sources/harbour-tasklist_sv_SE.ts rename to src/localization-sources/harbour-tasklist_sv_SE.ts diff --git a/localization-sources/harbour-tasklist_tr_TR.ts b/src/localization-sources/harbour-tasklist_tr_TR.ts similarity index 100% rename from localization-sources/harbour-tasklist_tr_TR.ts rename to src/localization-sources/harbour-tasklist_tr_TR.ts diff --git a/localization-sources/harbour-tasklist_zh_CN.ts b/src/localization-sources/harbour-tasklist_zh_CN.ts similarity index 100% rename from localization-sources/harbour-tasklist_zh_CN.ts rename to src/localization-sources/harbour-tasklist_zh_CN.ts diff --git a/src/qml/TestCases.qml b/src/qml/TestCases.qml new file mode 100644 index 0000000..9c36e13 --- /dev/null +++ b/src/qml/TestCases.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Item { + +} diff --git a/qml/common.js b/src/qml/common.js similarity index 100% rename from qml/common.js rename to src/qml/common.js diff --git a/qml/harbour-tasklist.qml b/src/qml/harbour-tasklist.qml similarity index 100% rename from qml/harbour-tasklist.qml rename to src/qml/harbour-tasklist.qml diff --git a/qml/images/coverbg.png b/src/qml/images/coverbg.png similarity index 100% rename from qml/images/coverbg.png rename to src/qml/images/coverbg.png diff --git a/qml/images/harbour-tasklist.png b/src/qml/images/harbour-tasklist.png similarity index 100% rename from qml/images/harbour-tasklist.png rename to src/qml/images/harbour-tasklist.png diff --git a/qml/localdb.js b/src/qml/localdb.js similarity index 100% rename from qml/localdb.js rename to src/qml/localdb.js diff --git a/qml/pages/AboutPage.qml b/src/qml/pages/AboutPage.qml similarity index 100% rename from qml/pages/AboutPage.qml rename to src/qml/pages/AboutPage.qml diff --git a/qml/pages/CoverPage.qml b/src/qml/pages/CoverPage.qml similarity index 100% rename from qml/pages/CoverPage.qml rename to src/qml/pages/CoverPage.qml diff --git a/qml/pages/EditPage.qml b/src/qml/pages/EditPage.qml similarity index 100% rename from qml/pages/EditPage.qml rename to src/qml/pages/EditPage.qml diff --git a/qml/pages/ExportPage.qml b/src/qml/pages/ExportPage.qml similarity index 100% rename from qml/pages/ExportPage.qml rename to src/qml/pages/ExportPage.qml diff --git a/qml/pages/HelpPage.qml b/src/qml/pages/HelpPage.qml similarity index 100% rename from qml/pages/HelpPage.qml rename to src/qml/pages/HelpPage.qml diff --git a/qml/pages/ListPage.qml b/src/qml/pages/ListPage.qml similarity index 100% rename from qml/pages/ListPage.qml rename to src/qml/pages/ListPage.qml diff --git a/qml/pages/SettingsPage.qml b/src/qml/pages/SettingsPage.qml similarity index 100% rename from qml/pages/SettingsPage.qml rename to src/qml/pages/SettingsPage.qml diff --git a/qml/pages/TagDialog.qml b/src/qml/pages/TagDialog.qml similarity index 100% rename from qml/pages/TagDialog.qml rename to src/qml/pages/TagDialog.qml diff --git a/qml/pages/TagPage.qml b/src/qml/pages/TagPage.qml similarity index 100% rename from qml/pages/TagPage.qml rename to src/qml/pages/TagPage.qml diff --git a/qml/pages/TaskListItem.qml b/src/qml/pages/TaskListItem.qml similarity index 100% rename from qml/pages/TaskListItem.qml rename to src/qml/pages/TaskListItem.qml diff --git a/qml/pages/TaskPage.qml b/src/qml/pages/TaskPage.qml similarity index 100% rename from qml/pages/TaskPage.qml rename to src/qml/pages/TaskPage.qml diff --git a/qml/pages/sync/DropboxAuth.qml b/src/qml/pages/sync/DropboxAuth.qml similarity index 100% rename from qml/pages/sync/DropboxAuth.qml rename to src/qml/pages/sync/DropboxAuth.qml diff --git a/qml/pages/sync/DropboxSync.qml b/src/qml/pages/sync/DropboxSync.qml similarity index 100% rename from qml/pages/sync/DropboxSync.qml rename to src/qml/pages/sync/DropboxSync.qml diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..a318051 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,69 @@ +# The name of your app. +# NOTICE: name defined in TARGET has a corresponding QML filename. +# If name defined in TARGET is changed, following needs to be +# done to match new name: +# - corresponding QML filename must be changed +# - desktop icon filename must be changed +# - desktop filename must be changed +# - icon definition filename in desktop file must be changed +TARGET = harbour-tasklist + +CONFIG += sailfishapp c++11 +QT += dbus + +DEFINES += APP_VERSION=\\\"$$VERSION\\\" +DEFINES += APP_BUILDNUM=\\\"$$RELEASE\\\" + +SOURCES += harbour-tasklist.cpp \ + tasksexport.cpp + +OTHER_FILES += qml/harbour-tasklist.qml \ + qml/pages/CoverPage.qml \ + harbour-tasklist.desktop \ + qml/localdb.js \ + qml/pages/AboutPage.qml \ + qml/pages/EditPage.qml \ + qml/pages/TaskPage.qml \ + qml/pages/ListPage.qml \ + qml/pages/SettingsPage.qml \ + qml/pages/TaskListItem.qml \ + qml/pages/ExportPage.qml \ + qml/pages/TagPage.qml \ + qml/pages/TagDialog.qml \ + qml/pages/sync/DropboxAuth.qml \ + qml/pages/sync/DropboxSync.qml \ + qml/pages/HelpPage.qml +# You DO NOT want .yaml be listed here as Qt Creator's editor is completely not ready for multi package .yaml's +# +# Also Qt Creator as of Nov 2013 will anyway try to rewrite your .yaml whenever you change your .pro +# Well, you will just have to restore .yaml from version control again and again unless you figure out +# how to kill this particular Creator's plugin + +include(third_party/QtDropbox/qtdropbox.pri) + +!defined(TASKLIST_DROPBOX_APPKEY, var) { + error("Please provide Dropbox appkey as argument of qmake, e.g. 'qmake TASKLIST_DROPBOX_APPKEY='") +} +!defined(TASKLIST_DROPBOX_SHAREDSECRET, var) { + error("Please provide Dropbox shared secret as argument of qmake, e.g. 'qmake TASKLIST_DROPBOX_SHAREDSECRET='") +} + +DEFINES += TASKLIST_DROPBOX_APPKEY=$$TASKLIST_DROPBOX_APPKEY TASKLIST_DROPBOX_SHAREDSECRET=$$TASKLIST_DROPBOX_SHAREDSECRET + +localization.files = localization +localization.path = /usr/share/$${TARGET} + +INSTALLS += localization + +CONFIG += sailfishapp_i18n_idbased + +lupdate_only { + SOURCES = qml/*.qml \ + qml/*.js \ + qml/pages/*.qml \ + qml/pages/sync/*.qml + TRANSLATIONS = localization-sources/*.ts +} + +HEADERS += \ + tasksexport.h diff --git a/src/third_party/QtDropbox/.gitignore b/src/third_party/QtDropbox/.gitignore new file mode 100644 index 0000000..aa8e55e --- /dev/null +++ b/src/third_party/QtDropbox/.gitignore @@ -0,0 +1,14 @@ +*.user +*~ +*.pdb +build-tests-Desktop_Qt_5_4_0_MSVC2013_64bit-Debug/Makefile +*.Debug +build-tests-Desktop_Qt_5_4_0_MSVC2013_64bit-Debug/Makefile.Release +moc_* +qtdropbox.sdf +*.sln +qtdropbox.v12.suo +*.vcxproj +qtdropbox.vcxproj.filters +x64/* +*.opensdf \ No newline at end of file diff --git a/src/third_party/QtDropbox/.travis.yml b/src/third_party/QtDropbox/.travis.yml new file mode 100644 index 0000000..9e276f9 --- /dev/null +++ b/src/third_party/QtDropbox/.travis.yml @@ -0,0 +1,30 @@ +language: cpp + +compiler: + - gcc + - clang + +env: + global: + # The next declration is the encrypted COVERITY_SCAN_TOKEN, created + # via the "travis encrypt" command using the project repo's public key + - secure: "JHeF0oqVGey6FAfBEkmubhuQlsPnTtuD61A8l8AmkHo1ZosU00hE8bUwsux6JDLpmuwdY5TFzVWwayp8p9A5YxsvypbdyXqMv02uoYrUTyjP5iEQ3LVcrivxce8ElOTpV/LSnSX8RoS7EZXxVDFe0hmDSosC60dxLW8QSVUw5hY=" + +addons: + coverity_scan: + project: + name: "lycis/QtDropbox" + description: "Your project description here" + notification_email: daniel@deder.at + build_command_prepend: qmake + build_command: make + branch_pattern: master + +install: + - sudo apt-add-repository --yes ppa:ubuntu-sdk-team/ppa + - sudo apt-get update + - sudo apt-get install qt5-default + +script: + - qmake + - make \ No newline at end of file diff --git a/src/third_party/QtDropbox/AUTHORS.md b/src/third_party/QtDropbox/AUTHORS.md new file mode 100644 index 0000000..5469793 --- /dev/null +++ b/src/third_party/QtDropbox/AUTHORS.md @@ -0,0 +1,11 @@ +# Authors +All these people did some great work the project. This file is meant to appreciate their efforts and involvement in the project. + +## MAINTAINER +Daniel Eder (lycis) + +## CONTRIBUTORS +Special thanks to all the contributors! You brought some real great enhancement to the project. + +Mehrez Kristou (anjinkristou) +Aldama Pérez (leptonverde) diff --git a/src/third_party/QtDropbox/GPL b/src/third_party/QtDropbox/GPL new file mode 100644 index 0000000..20d40b6 --- /dev/null +++ b/src/third_party/QtDropbox/GPL @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/src/third_party/QtDropbox/INSTALL.md b/src/third_party/QtDropbox/INSTALL.md new file mode 100644 index 0000000..030c313 --- /dev/null +++ b/src/third_party/QtDropbox/INSTALL.md @@ -0,0 +1,48 @@ +# QtDropbox Installation Guide + +## Dependencies +To build and use QtDropbox you'll need the Qt C++ Framework with +version 4.7 or higher available for download at +[Qt Project](http://qt-project.org/). + +To generate a documentation you need to have doxygen installed. + +## Building +QtDropbox is built by using these commands: + + qmake + make + +If you want to generate a documentation use + + make documentation + +After all binaries are compiled use + + make install + +This will create the directories lib/ and qtdropbox/. + +The lib/ directory contains the compiled QtDropbox library. These are +not automatically copied to your global library directory +(/usr/local/lib or /usr/lib on Linux) - you'll have to do this manually +if you wish them to be available system wide. + +The qtdropbox/ directory contains all header files and the +libqtdropbox.pri project definitions file. You'll need to copy this +folder into your project that will use QtDropbox as it contains all +necessary definitions. See _Usage_ below for details. + +## Usage +### Using with Qt projects +When including QtDropbox into your project you have to +include the libqtdropbox.pri project definitions file. This will add +all necessary header files to your project and link with the library. + +The network module of Qt will automatically be added to your project +as it is required to run QtDropbox. + +### Using with other C++ projects +QtDropbox is not intended to be used with non-Qt projects. If you +make it run - tell me :) + diff --git a/src/third_party/QtDropbox/LICENCE b/src/third_party/QtDropbox/LICENCE new file mode 100644 index 0000000..02bbb60 --- /dev/null +++ b/src/third_party/QtDropbox/LICENCE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. \ No newline at end of file diff --git a/src/third_party/QtDropbox/QtDropbox-Info.plist b/src/third_party/QtDropbox/QtDropbox-Info.plist new file mode 100644 index 0000000..2bf3601 --- /dev/null +++ b/src/third_party/QtDropbox/QtDropbox-Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + de_DE + CFBundleIdentifier + lycis.github.io.QtDropbox + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + QtDropbox + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + CFBundleGetInfoString + Created by Alexander Saal + CFBundleSignature + ???? + CFBundleExecutable + QtDropbox + NSHumanReadableCopyright + QtDropbox - by Daniel Eder and/or its subsidiary(-ies) + +Copyright © 2013 Daniel Eder. All rights reserved. + + diff --git a/src/third_party/QtDropbox/README.md b/src/third_party/QtDropbox/README.md new file mode 100644 index 0000000..522e2f3 --- /dev/null +++ b/src/third_party/QtDropbox/README.md @@ -0,0 +1,88 @@ +[![Build Status](https://travis-ci.org/lycis/QtDropbox.png?branch=master)](https://travis-ci.org/lycis/QtDropbox) +[![Coverity Scan Build Status](https://scan.coverity.com/projects/1639/badge.svg)](https://scan.coverity.com/projects/1639) + +# QtDropbox + +## In short +QtDropbox is an API for the well known cloud storage service [Dropbox](http://www.dropbox.com). + +## A bit longer +Basically QtDropbox aims to provide an easy to use possibility to access the REST API of +Dropbox. All HTTP calls are hidden behind the curtains of neat C++/Qt classes with nice +method names and specific uses. + +## Different Qt versions +The project is targeting the most recent version of Qt and thus was ported to Qt5. In the +beginning the project was developed for Qt4 and as there are some projects based on Qt4 +out there the legacy version is still being supported. + +The master branch always provides the most recent version of the project and at the moment +this is the Qt5 version. + +### Checking out legacy versions +Legacy versions such as the one supporting Qt4 are provided in specific branches. Here is a +short list of which branch to check out for the specific legacy versions: + +* Qt4.x -> qt4 + +Mind that the branch with name `qt5` is currently an unused stub! + +### Support for legacy versions +The ongoing development focuses on the `master` branch first. This means that legacy versions +are usually not further improved with new features. Bugfixes will be provided though! + +This should not indicate that legacy versions won't receive important new features but they +are rather implemented on request only. If there is a specific feature that is already +implemented in the most recent version but you need it in a legacy version (e.g. Qt4.x) +just open an issue. + +## Development +QtDropbox is in ongoing development so not all features provided by the Dropbox API are available +right now. If you have some knowledge about C++ (with Qt framework and/or the Dropbox REST API) you +are welcome to contribute to this project. For details take a look at the +[project webpage](http://lycis.github.com/QtDropbox/) + +### Current status +QtDropbox is constantly improved and developed further to include all possible requests you could +send to Dropbox and to simplify access. Below is a list of features that are currently available and +tested: + +Currently in progress: +* Complete documentation +* Examples + +## Features +### General +* Connect to Dropbox +* Access user account information (quotas, user name, share links, ...) +* Parse JSON strings + +### File Access +* Access files like a local QFile to read and write data +* Access file and directory metadata +* Access file revisions +* Reading file information and metadata + +Postponed to next version: +* Acessing and traversing the directory structure + +## Documentation +You can generate a documentation of all classes by: + + qmake + make documentation + +This will generate a directory called doxy/ that contains a HTML documentation. Input files +to generate a LaTeX based configuration are supplied as well. + +## Further information +There are some files apart this README that may provide some useful information: + +* LICENSE + It's LGPL v3 although that is currently not mentioned in the files +* INSTALL.md + Installation and usage instructions +* doc/ + Generally everthing inside this directory is information. +* doc/DEVELOPMENT.md + Development guidelines. Please read if you want to contribute! diff --git a/src/third_party/QtDropbox/doc/DEVELOPMENT.md b/src/third_party/QtDropbox/doc/DEVELOPMENT.md new file mode 100644 index 0000000..f5554e3 --- /dev/null +++ b/src/third_party/QtDropbox/doc/DEVELOPMENT.md @@ -0,0 +1,82 @@ +# Development Guidelines + +## Introduction +This document describes guidelines for the contribution and development of QtDropbox. +Please read on if you plan to contribute your ideas and/or code to the project as many things will be clarified in here. + +> This document contains guidelines! So please treat it like this. +> Guidelines are no fixed rules, so if you see need to break them do so - but only do so if absolutely necessary not just because +> they seem to be inconvenient. + +## Project Philosophy +### Mission +> Our mission is to create a library for C++/Qt to provide easy access to the services of [Dropbox](http://www.dropbox.com/). + +### Linking External Libraries +A great part about providing *easy* access is to keep the projects dependencies as little as possible. There are many +really cool libraries out there that would provide great enhancement to the features of the features. Whenever you +think that a certain library would make things easier for us keep one thing in mind: *Just because it is easy for us +it will be more complex for the users of QtDropbox as they have to satisfy another dependency.* + +So how to add third party libraries? If you add them make sure the user of QtDropbox has to activate the library with a +specific switch. So the user can always choose to disable a specific third party library and just go by using the plain +old features provided by QtDropbox itself. As you can guess this requires you to *extend* and *not replace* the feature +set provided by QtDropbox. + +#### Example +You found a great library that could be used to enhance the capabilities of QDropboxJson (used to interpret JSON objects +returned by Dropbox). Of course you can use this library th extend QDropboxJson but make sure the user has a possibility +to exclude the third party library from the project: The user has to compile QtDropbox with a specific switch (e.g. +the user has to add `DEFINES += USE_EXT_JSONLIB` to `qtdropbox.pro`). + +Now you can extend QDropboxJson to use the external library when the switch is defined. Else the standard QDropboxJson +is used. + +### Adding Qt Modules +As with external libraries try to link as few Qt modules as possible. Whenever you add new functionality that requires +an other Qt module than Network or XML provide a possibility to exclude these modules. If a feature that is provided +by including a new module is so great that we won't miss it, we'll consider adding it to the fixed dependencies of the +library. + +### Communication +I usually think writing about a polite and friendly tone is not necessary but... Please be polite and friendly in your +communication - if you are not we feel free to ignore and/or delete your requests. Furthermore keep in mind that we +are working on this project in our spare time and that we are all working in different time zones. Communication can +be slow but your requests will be answered. We apologise for any inconvenience caused thereby. + +### E-Mail +You can reach the maintainer of the project by mailing to qtdropbox (at) deder (dot) at. If you want to join the team +use this possibility. If you want to file a bug report you can do this to by mail but filing an issue via github.com is +preferred. + +Beware that the project mailing address is only looked after by the principal maintainer of the project. It may take +some time to process your mails. In case of problems it may be faster to open a new issue because there's a higher +possibility that somebody might read it. + +### Bug Reports +Whenever you want to file a bug report and hence broken or missing functionality please open a new issue at github. If +you want to request a feature please do so by opening an issue too. + +### Patches +You can contribute your code in two ways: + 1. Create a Pull Request on github + 1. Send your patch to the project mailing address: qtdropbox (at) deder (dot) at +We will look into your changes and decide to either accept or refuse them. You will be notified in both cases. Please +keep in mind that the project mailing address is only read by the principal maintainer and may take more time (see above). + +## Coding Conventions +The coding conventions of QtDropbox are not very strict. There are only a few requirements to the code: + +1. Indentation has to be 4 characters wide. +1. Add meaningful debug output to functions. +1. Keep nested statements simple. (rule of thumb: not more than 2 nested statements) +1. Private member start with _ (underscore) +1. Add doxygen comments to public items. (also use \todo, \warning and \bug gotchas!) + +For all other issues use your built-in common sense or refer to a [C++ Coding Standard](http://www.possibility.com/Cpp/CppCodingStandard.html). + +The main goal of every code is to work and to be maintainable - so please keep it readable! + +## Unit Testing +Whenever you change any functionality you should execute all unit test cases as a form of regression testing. Additionally +you should create new unit tests for not yet covered test cases (e.g. newly implemented functions) and fixed user problems. diff --git a/src/third_party/QtDropbox/doc/design.uml b/src/third_party/QtDropbox/doc/design.uml new file mode 100644 index 0000000..a566e56 --- /dev/null +++ b/src/third_party/QtDropbox/doc/design.uml @@ -0,0 +1,4690 @@ + + + + + + +UMLStandard + + + + +Untitled +5 + +Use Case Model +UMLStandard +useCaseModel +7nMF4TYiyE2tufmAssy54AAA +1 + +Main +fX9UkuhtY02dWHAFkfkj7gAA + +WSoU045WWEiC+6qrTuWUYAAA + + + + +Analysis Model +UMLStandard +analysisModel +7nMF4TYiyE2tufmAssy54AAA +1 + +Main +True +RobustnessDiagram +0KUxpJ9OL0KWm6nUpZkbIQAA + +4ce++F1r+UqAdXl5aV3A6wAA + + + + +Design Model +UMLStandard +designModel +7nMF4TYiyE2tufmAssy54AAA +2 + +Main +True +N2j+7nhBQEq+mO8YqFlxXAAA + +Kln0kjBxhkixAd0S80umLgAA + + + +Overview of Design Model +N2j+7nhBQEq+mO8YqFlxXAAA + +1QENY9/iWEKShKNWMAtZ5QAA +36 + +clMaroon +$00B9FFFF +56 +240 +164 +108 +o/YVcpgbbUmwpN4wodhPTAAA + + +1 +qdropbox_request + + +<<CppStruct>> + + +False + + + +o/YVcpgbbUmwpN4wodhPTAAA + + +o/YVcpgbbUmwpN4wodhPTAAA + + +False +o/YVcpgbbUmwpN4wodhPTAAA + + + +clMaroon +$00B9FFFF +2092 +532 +126 +82 +Salq1uHht0SrITdCzNgz8gAA + + +1 +qdropboxjson_value + + +<<CppUnion>> + + +False + + + +Salq1uHht0SrITdCzNgz8gAA + + +Salq1uHht0SrITdCzNgz8gAA + + +False +Salq1uHht0SrITdCzNgz8gAA + + + +clMaroon +$00B9FFFF +1824 +404 +173 +82 +rzEAq8I6FE+PpXanPndneQAA + + +1 +qdropboxjson_entry + + +<<CppStruct>> + + +False + + + +rzEAq8I6FE+PpXanPndneQAA + + +rzEAq8I6FE+PpXanPndneQAA + + +False +rzEAq8I6FE+PpXanPndneQAA + + + +clMaroon +$00B9FFFF +64 +132 +148 +56 +/d+HCPT/kEWbrwf4YZSB6wAA + + +1 +qdropbox_request_type + + +<<CppTypedef: int>> + + +False + + + +/d+HCPT/kEWbrwf4YZSB6wAA + + +/d+HCPT/kEWbrwf4YZSB6wAA + + +False +/d+HCPT/kEWbrwf4YZSB6wAA + + + +clMaroon +$00B9FFFF +2080 +308 +159 +56 +ivoGuCI+nU+pxM1i7fml2wAA + + +1 +qdropboxjson_entry_type + + +<<CppTypedef: char>> + + +False + + + +ivoGuCI+nU+pxM1i7fml2wAA + + +ivoGuCI+nU+pxM1i7fml2wAA + + +False +ivoGuCI+nU+pxM1i7fml2wAA + + + +clMaroon +$00B9FFFF +380 +108 +510 +849 +W0IFCTrokkm6wkpDiDO1ogAA + + +1 +QDropbox + + +False + + +False + + + +W0IFCTrokkm6wkpDiDO1ogAA + + +W0IFCTrokkm6wkpDiDO1ogAA + + +False +W0IFCTrokkm6wkpDiDO1ogAA + + + +clMaroon +$00B9FFFF +964 +264 +294 +355 +sFX2E/MBlUO0Eb/e07cRggAA + + +1 +QDropbxAccount + + +False + + +False + + + +sFX2E/MBlUO0Eb/e07cRggAA + + +sFX2E/MBlUO0Eb/e07cRggAA + + +False +sFX2E/MBlUO0Eb/e07cRggAA + + + +clMaroon +$00B9FFFF +1468 +300 +290 +290 +3ldG67+ChU+zoMSfNP9q2wAA + + +1 +QDropboxJson + + +False + + +False + + + +3ldG67+ChU+zoMSfNP9q2wAA + + +3ldG67+ChU+zoMSfNP9q2wAA + + +False +3ldG67+ChU+zoMSfNP9q2wAA + + + +clMaroon +$00B9FFFF +2095,363;1996,406 +VOlKTB1AvEaHTlhVfnU5rQAA +udGn3QfWsk66VA2UGYIflQAA +oWy/EB6NVEu1satRlEtRCQAA + +False +1,5707963267949 +15 +VOlKTB1AvEaHTlhVfnU5rQAA + + +False +1,5707963267949 +30 +VOlKTB1AvEaHTlhVfnU5rQAA + + +False +-1,5707963267949 +15 +VOlKTB1AvEaHTlhVfnU5rQAA + + +False +-0,523598775598299 +30 +epHead +RxpcKin3lkqsU8zB5Y4M/AAA + + +False +0,523598775598299 +30 +epTail +cCBCNiyDXkmOtC2DhJJV0AAA + + +False +0,523598775598299 +25 +epHead +RxpcKin3lkqsU8zB5Y4M/AAA + + +False +-0,523598775598299 +25 +epTail +cCBCNiyDXkmOtC2DhJJV0AAA + + +False +-0,785398163397448 +40 +epHead +RxpcKin3lkqsU8zB5Y4M/AAA + + +False +0,785398163397448 +40 +epTail +cCBCNiyDXkmOtC2DhJJV0AAA + + +False +-1000 +-1000 +50 +8 +RxpcKin3lkqsU8zB5Y4M/AAA + + +False +-1000 +-1000 +50 +8 +cCBCNiyDXkmOtC2DhJJV0AAA + + + +clMaroon +$00B9FFFF +2092,539;1989,485 +3Zi5rozxKkiJPK0G4b2WtwAA +udGn3QfWsk66VA2UGYIflQAA +J9krYyYLt0GkMrlUcNnDSQAA + +False +1,5707963267949 +15 +3Zi5rozxKkiJPK0G4b2WtwAA + + +False +1,5707963267949 +30 +3Zi5rozxKkiJPK0G4b2WtwAA + + +False +-1,5707963267949 +15 +3Zi5rozxKkiJPK0G4b2WtwAA + + +False +-0,523598775598299 +30 +epHead +atST4kLuZkugkRTnYjJOfQAA + + +False +0,523598775598299 +30 +epTail +w4a52oBqSUaVRdbIme4AXwAA + + +False +0,523598775598299 +25 +epHead +atST4kLuZkugkRTnYjJOfQAA + + +False +-0,523598775598299 +25 +epTail +w4a52oBqSUaVRdbIme4AXwAA + + +False +-0,785398163397448 +40 +epHead +atST4kLuZkugkRTnYjJOfQAA + + +False +0,785398163397448 +40 +epTail +w4a52oBqSUaVRdbIme4AXwAA + + +False +-1000 +-1000 +50 +8 +atST4kLuZkugkRTnYjJOfQAA + + +False +-1000 +-1000 +50 +8 +w4a52oBqSUaVRdbIme4AXwAA + + + +clMaroon +$00B9FFFF +1824,444;1757,444 +NxUJykImGEWbIsX5U6genQAA +wjFp+lbpQ0SnrIsXCR3AKwAA +udGn3QfWsk66VA2UGYIflQAA + +False +1,5707963267949 +15 +NxUJykImGEWbIsX5U6genQAA + + +False +1,5707963267949 +30 +NxUJykImGEWbIsX5U6genQAA + + +False +-1,5707963267949 +15 +NxUJykImGEWbIsX5U6genQAA + + +False +-0,523598775598299 +30 +epHead +M8LtzaCkj0uA37CAetQEfAAA + + +False +0,523598775598299 +30 +epTail +PTo3BruOskCRO4OIKJ1lowAA + + +False +0,523598775598299 +25 +epHead +M8LtzaCkj0uA37CAetQEfAAA + + +False +-0,523598775598299 +25 +epTail +PTo3BruOskCRO4OIKJ1lowAA + + +False +-0,785398163397448 +40 +epHead +M8LtzaCkj0uA37CAetQEfAAA + + +False +0,785398163397448 +40 +epTail +PTo3BruOskCRO4OIKJ1lowAA + + +False +-1000 +-1000 +50 +8 +M8LtzaCkj0uA37CAetQEfAAA + + +False +-1000 +-1000 +50 +8 +PTo3BruOskCRO4OIKJ1lowAA + + + +clMaroon +$00B9FFFF +137,187;137,240 +U9kmFCZ0gUSdYHEaayZEvQAA +/LiUQAimsEu0FUq6ze2IvgAA +5EizNq5SCEClSQJZxerjOQAA + +False +1,5707963267949 +15 +U9kmFCZ0gUSdYHEaayZEvQAA + + +False +1,5707963267949 +30 +U9kmFCZ0gUSdYHEaayZEvQAA + + +False +-1,5707963267949 +15 +U9kmFCZ0gUSdYHEaayZEvQAA + + +False +-0,523598775598299 +30 +epHead +NZL1/floAU6ZzHTPyQilyQAA + + +False +0,523598775598299 +30 +epTail +EfswkUxaeUyInrcPDUKnfQAA + + +False +0,523598775598299 +25 +epHead +NZL1/floAU6ZzHTPyQilyQAA + + +False +-0,523598775598299 +25 +epTail +EfswkUxaeUyInrcPDUKnfQAA + + +False +-0,785398163397448 +40 +epHead +NZL1/floAU6ZzHTPyQilyQAA + + +False +0,785398163397448 +40 +epTail +EfswkUxaeUyInrcPDUKnfQAA + + +False +-1000 +-1000 +50 +8 +NZL1/floAU6ZzHTPyQilyQAA + + +False +-1000 +-1000 +50 +8 +EfswkUxaeUyInrcPDUKnfQAA + + + +clMaroon +$00B9FFFF +219,332;380,410 +Kyb9wub+W0K//wRXxXR+8wAA +ZQwGc20gJUK2YJ2LtwcTMgAA +/LiUQAimsEu0FUq6ze2IvgAA + +1,5707963267949 +15 +used in requestMap +Kyb9wub+W0K//wRXxXR+8wAA + + +False +1,5707963267949 +30 +Kyb9wub+W0K//wRXxXR+8wAA + + +False +-1,5707963267949 +15 +Kyb9wub+W0K//wRXxXR+8wAA + + +False +-0,523598775598299 +30 +epHead +RiUuUvyZOUS+flTYkM/BJgAA + + +False +0,523598775598299 +30 +epTail +nGz2fNtAiECky4y27651lQAA + + +False +0,523598775598299 +25 +epHead +RiUuUvyZOUS+flTYkM/BJgAA + + +False +-0,523598775598299 +25 +epTail +nGz2fNtAiECky4y27651lQAA + + +False +-0,785398163397448 +40 +epHead +RiUuUvyZOUS+flTYkM/BJgAA + + +False +0,785398163397448 +40 +epTail +nGz2fNtAiECky4y27651lQAA + + +False +-1000 +-1000 +50 +8 +RiUuUvyZOUS+flTYkM/BJgAA + + +False +-1000 +-1000 +50 +8 +nGz2fNtAiECky4y27651lQAA + + + +clMaroon +$00B9FFFF +140 +372 +96 +69 +qk1BGGqjnkSnhKy4dM5cdwAA + + +1 +errorOccured + + +<<signal>> + + +False + + + +qk1BGGqjnkSnhKy4dM5cdwAA + + +qk1BGGqjnkSnhKy4dM5cdwAA + + + +clMaroon +$00B9FFFF +208 +464 +85 +56 ++/W13Cj9q0CX8sXB5mCpCwAA + + +1 +tokenExpired + + +<<signal>> + + +False + + + ++/W13Cj9q0CX8sXB5mCpCwAA + + ++/W13Cj9q0CX8sXB5mCpCwAA + + + +clMaroon +$00B9FFFF +168 +632 +80 +56 +lHzz4UFjMEGbYtbZkKiWcgAA + + +1 +fileNotFound + + +<<signal>> + + +False + + + +lHzz4UFjMEGbYtbZkKiWcgAA + + +lHzz4UFjMEGbYtbZkKiWcgAA + + + +clMaroon +$00B9FFFF +92 +752 +111 +69 +PkX3MuawrUOgUybeiHMd4AAA + + +1 +operationFinished + + +<<signal>> + + +False + + + +PkX3MuawrUOgUybeiHMd4AAA + + +PkX3MuawrUOgUybeiHMd4AAA + + + +clMaroon +$00B9FFFF +296 +984 +135 +82 +GEINB+W8lUi6WPX9cbLO6QAA + + +1 +requestTokenFinished + + +<<signal>> + + +False + + + +GEINB+W8lUi6WPX9cbLO6QAA + + +GEINB+W8lUi6WPX9cbLO6QAA + + + +clMaroon +$00B9FFFF +44 +536 +129 +82 +hBjoYmz+wkOFeo0G33HYTAAA + + +1 +accessTokenFinished + + +<<signal>> + + +False + + + +hBjoYmz+wkOFeo0G33HYTAAA + + +hBjoYmz+wkOFeo0G33HYTAAA + + + +clMaroon +$00B9FFFF +520 +996 +92 +82 +fGcMDHG0HUKA3XRLyM1/+AAA + + +1 +tokenChanged + + +<<signal>> + + +False + + + +fGcMDHG0HUKA3XRLyM1/+AAA + + +fGcMDHG0HUKA3XRLyM1/+AAA + + + +clMaroon +$00B9FFFF +180 +860 +121 +69 +RuXWIak58U6HssZVXcXdpAAA + + +1 +accountInfo + + +<<signal>> + + +False + + + +RuXWIak58U6HssZVXcXdpAAA + + +RuXWIak58U6HssZVXcXdpAAA + + + +clMaroon +$00B9FFFF +235,420;380,461 +BqJXqZ8et0ewcZz7gJsiJwAA +ZQwGc20gJUK2YJ2LtwcTMgAA +y470jG5/1kWKyTvmvBSciwAA + +1,5707963267949 +15 +emit +BqJXqZ8et0ewcZz7gJsiJwAA + + +False +1,5707963267949 +30 +BqJXqZ8et0ewcZz7gJsiJwAA + + +False +-1,5707963267949 +15 +BqJXqZ8et0ewcZz7gJsiJwAA + + +False +-0,523598775598299 +30 +epHead +w6uuXFzF+UuyUhUFsfq4mwAA + + +False +0,523598775598299 +30 +epTail +6USFEKS3dkeTgjyDb/0IrAAA + + +False +0,523598775598299 +25 +epHead +w6uuXFzF+UuyUhUFsfq4mwAA + + +False +-0,523598775598299 +25 +epTail +6USFEKS3dkeTgjyDb/0IrAAA + + +False +-0,785398163397448 +40 +epHead +w6uuXFzF+UuyUhUFsfq4mwAA + + +False +0,785398163397448 +40 +epTail +6USFEKS3dkeTgjyDb/0IrAAA + + +False +-1000 +-1000 +50 +8 +w6uuXFzF+UuyUhUFsfq4mwAA + + +False +-1000 +-1000 +50 +8 +6USFEKS3dkeTgjyDb/0IrAAA + + + +clMaroon +$00B9FFFF +292,495;380,505 +vklRY+kLBUi4eci/v1uFiQAA +ZQwGc20gJUK2YJ2LtwcTMgAA +0MG3H44vP0u6GuUhqp/PDAAA + +1,5707963267949 +15 +emit +vklRY+kLBUi4eci/v1uFiQAA + + +False +1,5707963267949 +30 +vklRY+kLBUi4eci/v1uFiQAA + + +False +-1,5707963267949 +15 +vklRY+kLBUi4eci/v1uFiQAA + + +False +-0,523598775598299 +30 +epHead +RsBp0DIz3k2VkIanXnx5LAAA + + +False +0,523598775598299 +30 +epTail +7Yrk3YeMBki9CB5raHefMwAA + + +False +0,523598775598299 +25 +epHead +RsBp0DIz3k2VkIanXnx5LAAA + + +False +-0,523598775598299 +25 +epTail +7Yrk3YeMBki9CB5raHefMwAA + + +False +-0,785398163397448 +40 +epHead +RsBp0DIz3k2VkIanXnx5LAAA + + +False +0,785398163397448 +40 +epTail +7Yrk3YeMBki9CB5raHefMwAA + + +False +-1000 +-1000 +50 +8 +RsBp0DIz3k2VkIanXnx5LAAA + + +False +-1000 +-1000 +50 +8 +7Yrk3YeMBki9CB5raHefMwAA + + + +clMaroon +$00B9FFFF +172,571;380,553 +PzNmZJmtHE2pdK6tfw/wcQAA +ZQwGc20gJUK2YJ2LtwcTMgAA +XSbsnT/NBki2/tfPi21woQAA + +1,5707963267949 +15 +emit +PzNmZJmtHE2pdK6tfw/wcQAA + + +False +1,5707963267949 +30 +PzNmZJmtHE2pdK6tfw/wcQAA + + +False +-1,5707963267949 +15 +PzNmZJmtHE2pdK6tfw/wcQAA + + +False +-0,523598775598299 +30 +epHead +3CBhQ/ETW0OoFrfOxALo/AAA + + +False +0,523598775598299 +30 +epTail +2xpWl3PtHk2x1n3TdHoNKQAA + + +False +0,523598775598299 +25 +epHead +3CBhQ/ETW0OoFrfOxALo/AAA + + +False +-0,523598775598299 +25 +epTail +2xpWl3PtHk2x1n3TdHoNKQAA + + +False +-0,785398163397448 +40 +epHead +3CBhQ/ETW0OoFrfOxALo/AAA + + +False +0,785398163397448 +40 +epTail +2xpWl3PtHk2x1n3TdHoNKQAA + + +False +-1000 +-1000 +50 +8 +3CBhQ/ETW0OoFrfOxALo/AAA + + +False +-1000 +-1000 +50 +8 +2xpWl3PtHk2x1n3TdHoNKQAA + + + +clMaroon +$00B9FFFF +247,647;380,607 +hrJIc6Szbk6vbvDCEFkAUgAA +ZQwGc20gJUK2YJ2LtwcTMgAA +d/LcpSgLCUOq+LACpXa0pgAA + +1,5707963267949 +15 +emit +hrJIc6Szbk6vbvDCEFkAUgAA + + +False +1,5707963267949 +30 +hrJIc6Szbk6vbvDCEFkAUgAA + + +False +-1,5707963267949 +15 +hrJIc6Szbk6vbvDCEFkAUgAA + + +False +-0,523598775598299 +30 +epHead +OYDVVYkCiUOSqYdTAuHF9gAA + + +False +0,523598775598299 +30 +epTail +ThFMbzFeI02U2Kdg4mtC0gAA + + +False +0,523598775598299 +25 +epHead +OYDVVYkCiUOSqYdTAuHF9gAA + + +False +-0,523598775598299 +25 +epTail +ThFMbzFeI02U2Kdg4mtC0gAA + + +False +-0,785398163397448 +40 +epHead +OYDVVYkCiUOSqYdTAuHF9gAA + + +False +0,785398163397448 +40 +epTail +ThFMbzFeI02U2Kdg4mtC0gAA + + +False +-1000 +-1000 +50 +8 +OYDVVYkCiUOSqYdTAuHF9gAA + + +False +-1000 +-1000 +50 +8 +ThFMbzFeI02U2Kdg4mtC0gAA + + + +clMaroon +$00B9FFFF +570,996;576,956 +OcPT6iodY0mVCE0RmyoedAAA +ZQwGc20gJUK2YJ2LtwcTMgAA +Q23OA5Ja10mcv/znj6MUDwAA + +1,5707963267949 +15 +emit +OcPT6iodY0mVCE0RmyoedAAA + + +False +1,5707963267949 +30 +OcPT6iodY0mVCE0RmyoedAAA + + +False +-1,5707963267949 +15 +OcPT6iodY0mVCE0RmyoedAAA + + +False +-0,523598775598299 +30 +epHead +6ubOpnxC3EeJQrXGa2B87QAA + + +False +0,523598775598299 +30 +epTail ++PzW1voGeEiJof5Tf+zPeAAA + + +False +0,523598775598299 +25 +epHead +6ubOpnxC3EeJQrXGa2B87QAA + + +False +-0,523598775598299 +25 +epTail ++PzW1voGeEiJof5Tf+zPeAAA + + +False +-0,785398163397448 +40 +epHead +6ubOpnxC3EeJQrXGa2B87QAA + + +False +0,785398163397448 +40 +epTail ++PzW1voGeEiJof5Tf+zPeAAA + + +False +-1000 +-1000 +50 +8 +6ubOpnxC3EeJQrXGa2B87QAA + + +False +-1000 +-1000 +50 +8 ++PzW1voGeEiJof5Tf+zPeAAA + + + +clMaroon +$00B9FFFF +202,757;380,664 +787xJAPCtkWj9kozxlj32gAA +ZQwGc20gJUK2YJ2LtwcTMgAA +DbOb8jdSYU2DaQgSpSw7ewAA + +1,5707963267949 +15 +emit +787xJAPCtkWj9kozxlj32gAA + + +False +1,5707963267949 +30 +787xJAPCtkWj9kozxlj32gAA + + +False +-1,5707963267949 +15 +787xJAPCtkWj9kozxlj32gAA + + +False +-0,523598775598299 +30 +epHead +LT5Bak4GOUmdsHw3CnpfFgAA + + +False +0,523598775598299 +30 +epTail +3TTDOAqcVUeHLjV5YanQ4wAA + + +False +0,523598775598299 +25 +epHead +LT5Bak4GOUmdsHw3CnpfFgAA + + +False +-0,523598775598299 +25 +epTail +3TTDOAqcVUeHLjV5YanQ4wAA + + +False +-0,785398163397448 +40 +epHead +LT5Bak4GOUmdsHw3CnpfFgAA + + +False +0,785398163397448 +40 +epTail +3TTDOAqcVUeHLjV5YanQ4wAA + + +False +-1000 +-1000 +50 +8 +LT5Bak4GOUmdsHw3CnpfFgAA + + +False +-1000 +-1000 +50 +8 +3TTDOAqcVUeHLjV5YanQ4wAA + + + +clMaroon +$00B9FFFF +277,860;380,765 +IU2f7CMDW0aUHQ0vbnw6xQAA +ZQwGc20gJUK2YJ2LtwcTMgAA +jE8S89+ECUatE1B7MTZIFwAA + +1,5707963267949 +15 +emit +IU2f7CMDW0aUHQ0vbnw6xQAA + + +False +1,5707963267949 +30 +IU2f7CMDW0aUHQ0vbnw6xQAA + + +False +-1,5707963267949 +15 +IU2f7CMDW0aUHQ0vbnw6xQAA + + +False +-0,523598775598299 +30 +epHead +e3fE6NMvn06WkrRwGAWA2gAA + + +False +0,523598775598299 +30 +epTail +eNFl7eT+5kWwfL71FCj0tAAA + + +False +0,523598775598299 +25 +epHead +e3fE6NMvn06WkrRwGAWA2gAA + + +False +-0,523598775598299 +25 +epTail +eNFl7eT+5kWwfL71FCj0tAAA + + +False +-0,785398163397448 +40 +epHead +e3fE6NMvn06WkrRwGAWA2gAA + + +False +0,785398163397448 +40 +epTail +eNFl7eT+5kWwfL71FCj0tAAA + + +False +-1000 +-1000 +50 +8 +e3fE6NMvn06WkrRwGAWA2gAA + + +False +-1000 +-1000 +50 +8 +eNFl7eT+5kWwfL71FCj0tAAA + + + +clMaroon +$00B9FFFF +385,984;400,956 +k3xJIyemAUqZ/4cSnWz0XAAA +ZQwGc20gJUK2YJ2LtwcTMgAA +y8uYGkGLTEKrIy8t3qnPDgAA + +1,5707963267949 +15 +emit +k3xJIyemAUqZ/4cSnWz0XAAA + + +False +1,5707963267949 +30 +k3xJIyemAUqZ/4cSnWz0XAAA + + +False +-1,5707963267949 +15 +k3xJIyemAUqZ/4cSnWz0XAAA + + +False +-0,523598775598299 +30 +epHead +Zgoa5OVdjEi2XYfHaIUImQAA + + +False +0,523598775598299 +30 +epTail +D7k1/msjHkK5wIpSkUtuyAAA + + +False +0,523598775598299 +25 +epHead +Zgoa5OVdjEi2XYfHaIUImQAA + + +False +-0,523598775598299 +25 +epTail +D7k1/msjHkK5wIpSkUtuyAAA + + +False +-0,785398163397448 +40 +epHead +Zgoa5OVdjEi2XYfHaIUImQAA + + +False +0,785398163397448 +40 +epTail +D7k1/msjHkK5wIpSkUtuyAAA + + +False +-1000 +-1000 +50 +8 +Zgoa5OVdjEi2XYfHaIUImQAA + + +False +-1000 +-1000 +50 +8 +D7k1/msjHkK5wIpSkUtuyAAA + + + +clMaroon +$00B9FFFF +1064 +908 +184 +59 +IAbNseYeoEit8L/hehUKxQAA + + +1 +QNetworkAccessManager + + +False + + +False + + + +IAbNseYeoEit8L/hehUKxQAA + + +IAbNseYeoEit8L/hehUKxQAA + + +IAbNseYeoEit8L/hehUKxQAA + + + +clMaroon +$00B9FFFF +1000 +744 +130 +69 +1RNSGyN9pUmj5s8PPq5uxgAA + + +1 +finished + + +<<signal>> + + +False + + + +1RNSGyN9pUmj5s8PPq5uxgAA + + +1RNSGyN9pUmj5s8PPq5uxgAA + + + +clMaroon +$00B9FFFF +1138,908;1083,812 +K2cEmXPiO0GdwZSsxaRw9QAA +vXpkVGBpuU6uFrfUC+MkTgAA +TFZSwFd6v0Gn7TdqXdwwEAAA + +1,5707963267949 +15 +emit +K2cEmXPiO0GdwZSsxaRw9QAA + + +False +1,5707963267949 +30 +K2cEmXPiO0GdwZSsxaRw9QAA + + +False +-1,5707963267949 +15 +K2cEmXPiO0GdwZSsxaRw9QAA + + +False +-0,523598775598299 +30 +epHead +MKFKr2BoWEOP6PDAxRUvGAAA + + +False +0,523598775598299 +30 +epTail +orUirPbVqkmjufhsKG6ZmwAA + + +False +0,523598775598299 +25 +epHead +MKFKr2BoWEOP6PDAxRUvGAAA + + +False +-0,523598775598299 +25 +epTail +orUirPbVqkmjufhsKG6ZmwAA + + +False +-0,785398163397448 +40 +epHead +MKFKr2BoWEOP6PDAxRUvGAAA + + +False +0,785398163397448 +40 +epTail +orUirPbVqkmjufhsKG6ZmwAA + + +False +-1000 +-1000 +50 +8 +MKFKr2BoWEOP6PDAxRUvGAAA + + +False +-1000 +-1000 +50 +8 +orUirPbVqkmjufhsKG6ZmwAA + + + +clMaroon +$00B9FFFF +1005,744;889,678 +HqLKEdCIAUSt8J3/YuUQmwAA +ZQwGc20gJUK2YJ2LtwcTMgAA +vXpkVGBpuU6uFrfUC+MkTgAA + +1,5707963267949 +15 +receive +HqLKEdCIAUSt8J3/YuUQmwAA + + +False +1,5707963267949 +30 +HqLKEdCIAUSt8J3/YuUQmwAA + + +False +-1,5707963267949 +15 +HqLKEdCIAUSt8J3/YuUQmwAA + + +False +-0,523598775598299 +30 +epHead +ZAQTYN9xN06gJoIbtBd0EAAA + + +False +0,523598775598299 +30 +epTail +lwOOm8mItUKc9RSfv+MG7AAA + + +False +0,523598775598299 +25 +epHead +ZAQTYN9xN06gJoIbtBd0EAAA + + +False +-0,523598775598299 +25 +epTail +lwOOm8mItUKc9RSfv+MG7AAA + + +False +-0,785398163397448 +40 +epHead +ZAQTYN9xN06gJoIbtBd0EAAA + + +False +0,785398163397448 +40 +epTail +lwOOm8mItUKc9RSfv+MG7AAA + + +False +-1000 +-1000 +50 +8 +ZAQTYN9xN06gJoIbtBd0EAAA + + +False +-1000 +-1000 +50 +8 +lwOOm8mItUKc9RSfv+MG7AAA + + + +clMaroon +$00B9FFFF +1572 +688 +375 +368 +Jy85dFa4H0mNGCk17axsXQAA + + +1 +QDropboxFile + + +False + + +False + + + +Jy85dFa4H0mNGCk17axsXQAA + + +Jy85dFa4H0mNGCk17axsXQAA + + +False +Jy85dFa4H0mNGCk17axsXQAA + + + +clMaroon +$00B9FFFF +2088 +844 +140 +59 +fKdwvFAhRES1bUHbkladewAA + + +1 +QIODevice + + +False + + +False + + + +fKdwvFAhRES1bUHbkladewAA + + +fKdwvFAhRES1bUHbkladewAA + + +fKdwvFAhRES1bUHbkladewAA + + + +clMaroon +$00B9FFFF +2088,873;1946,872 +jN1Jscw+pEumBPW4E+/MrAAA +YYj3pOVpJEO4ERe8D85K6gAA +iVqhIMWw2kOENBS6i1bzRAAA + +False +1,5707963267949 +15 +jN1Jscw+pEumBPW4E+/MrAAA + + +False +1,5707963267949 +30 +jN1Jscw+pEumBPW4E+/MrAAA + + +False +-1,5707963267949 +15 +jN1Jscw+pEumBPW4E+/MrAAA + + + + +46 + +qdropbox_request +Cpp +CppStruct +N2j+7nhBQEq+mO8YqFlxXAAA +4 +/LiUQAimsEu0FUq6ze2IvgAA +lFrU7E0xN0CbkDNlsrrIxAAA +F3BzoyQSIk2E90qbpUXYQQAA +7lq650JCP0KhR6Qw2XufRwAA +5 +JGFDztX88E+FX11ma2sviwAA +MSiK0RkyXkqnF4zZg9NCbgAA +NZL1/floAU6ZzHTPyQilyQAA +Q5tbe22oqEun4hTkQRO7ggAA +nGz2fNtAiECky4y27651lQAA +4 + +type +/d+HCPT/kEWbrwf4YZSB6wAA +o/YVcpgbbUmwpN4wodhPTAAA + + +method +QString +o/YVcpgbbUmwpN4wodhPTAAA + + +host +QString +o/YVcpgbbUmwpN4wodhPTAAA + + +linked +int +o/YVcpgbbUmwpN4wodhPTAAA + + + +qdropboxjson_value +Cpp +CppUnion +N2j+7nhBQEq+mO8YqFlxXAAA +4 +J9krYyYLt0GkMrlUcNnDSQAA +6LUIiS1LM0+t6xC+4SlKgAAA +4KeOQc8h0k+H7fBdY8tibAAA +Lrkmj/kRj0Gpo6D/IgHOXgAA +1 +1GvxXRSoPU6pMyMjAH9ZGwAA +1 +w4a52oBqSUaVRdbIme4AXwAA +2 + +json +QDropboxJson +3ldG67+ChU+zoMSfNP9q2wAA +Salq1uHht0SrITdCzNgz8gAA +1 + +Cpp +CppPointer +CppPointer +* +I00RMOFlV0ejXPOzctOXYwAA + + + +value +QString +Salq1uHht0SrITdCzNgz8gAA +1 + +Cpp +CppPointer +CppPointer +* +NhSRZYYMoUujPcyxa272aQAA + + + + +qdropboxjson_entry +Cpp +CppStruct +N2j+7nhBQEq+mO8YqFlxXAAA +4 +udGn3QfWsk66VA2UGYIflQAA +kvAN5izhqUKOV/NyX1Sn7wAA +kQ8gLa+P1kuiWXGxbFMjXgAA +uUBlGmwUpkSb31dsz6Y9TAAA +3 +RxpcKin3lkqsU8zB5Y4M/AAA +atST4kLuZkugkRTnYjJOfQAA +PTo3BruOskCRO4OIKJ1lowAA +2 + +type +ivoGuCI+nU+pxM1i7fml2wAA +rzEAq8I6FE+PpXanPndneQAA + + +value +Salq1uHht0SrITdCzNgz8gAA +rzEAq8I6FE+PpXanPndneQAA + + + +qdropbox_request_type +CppTypedef: int +N2j+7nhBQEq+mO8YqFlxXAAA +4 +5EizNq5SCEClSQJZxerjOQAA +DIDxbnegBkynTwLc6H67/wAA +dQFyuSMwp06XoGAIwx9qaAAA +vVTeKj/SGEGEu8tE2iOsZgAA +1 + +Cpp +CppTypedef +CppTypedefDefinition +int +/d+HCPT/kEWbrwf4YZSB6wAA + +1 +tazAWWv2BE2htiJhRN6ItAAA +4 +K4qhFq8TC0WB1uKDSfw+7AAA +W9vwqXT2BUOo4ymqHvd2HgAA +Jnk+MkPorUi0I4dAvj5+oAAA +EfswkUxaeUyInrcPDUKnfQAA + + +qdropboxjson_entry_type +CppTypedef: char +N2j+7nhBQEq+mO8YqFlxXAAA +4 +oWy/EB6NVEu1satRlEtRCQAA +skofbkhZ30WXLXp82V2udAAA +kjNhHYcdAEq1quntLUOM1QAA +tXwdUIi5l0Oejc1WGfiIRAAA +1 + +Cpp +CppTypedef +CppTypedefDefinition +char +ivoGuCI+nU+pxM1i7fml2wAA + +1 +ImLXgvUDUkqMKJ4xFK7JLgAA +1 +dlWRgohk6Uu4RLKDuJTqRQAA +1 +cCBCNiyDXkmOtC2DhJJV0AAA + + +QDropbox +N2j+7nhBQEq+mO8YqFlxXAAA +4 +ZQwGc20gJUK2YJ2LtwcTMgAA +zzZMTftxuEWUjXBHJOHfiQAA +AeDEhg68N0K7OAP6PG1ktgAA +FkjwoPe6FkSDWjpmD3aHLgAA +2 + +OAuthMethod +W0IFCTrokkm6wkpDiDO1ogAA +1 +Z4JR1nYNJE25eK5LG+085AAA +3 +wkCjlj5oZk+l6/o59oA1vQAA +jdEGCANr1kOmAezVRKG5QgAA +3OMarGX7zE2k46UTjltTvwAA +2 + +Plaintext +DzKJ2ayprEqYf6J8gHjXywAA + + +HMACSHA1 +DzKJ2ayprEqYf6J8gHjXywAA + + + +Error +W0IFCTrokkm6wkpDiDO1ogAA +2 +n2L7HgrUckWndIygX1YrrAAA +H4ZJ3njnOkiA4Gt5GoDqyAAA +1 +k9qCa72EPkeJjrHYWmRp0QAA +12 + +NoError +Apdq3G0RkUm9YikPh0QWrwAA + + +CommunicationError +Apdq3G0RkUm9YikPh0QWrwAA + + +VersionNotSupported +Apdq3G0RkUm9YikPh0QWrwAA + + +UnknownAuthMethod +Apdq3G0RkUm9YikPh0QWrwAA + + +ResponseToUnknownRequest +Apdq3G0RkUm9YikPh0QWrwAA + + +APIError +Apdq3G0RkUm9YikPh0QWrwAA + + +UnknownQueryMethod +Apdq3G0RkUm9YikPh0QWrwAA + + +BadInput +Apdq3G0RkUm9YikPh0QWrwAA + + +BadOAuthRequest +Apdq3G0RkUm9YikPh0QWrwAA + + +WrongHttpMethod +Apdq3G0RkUm9YikPh0QWrwAA + + +MaxRequestsExeeded +Apdq3G0RkUm9YikPh0QWrwAA + + +UserOverQuota +Apdq3G0RkUm9YikPh0QWrwAA + + +44 + +Cpp +CppMacro +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA + + +QDropbox +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +1 + +parent +QObject +rMeZPITBaEWGs91eaPmyqwAA +1 + +Cpp +CppPointer +CppPointer +* +e8cu2p8bl0m7Bk8k3U6uRQAA + + + + +QDropbox +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +5 + +key +QString +P64bMPLlWUiHjDDpNp39pAAA + + +sharedSecret +QString +P64bMPLlWUiHjDDpNp39pAAA + + +method +P64bMPLlWUiHjDDpNp39pAAA +DzKJ2ayprEqYf6J8gHjXywAA + + +url +QString +P64bMPLlWUiHjDDpNp39pAAA + + +parent +QObject +P64bMPLlWUiHjDDpNp39pAAA +1 + +Cpp +CppPointer +CppPointer +* +f29v9TyxWkKLPplHLLh6RAAA + + + + +test +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +void +HPDBfR+KVkWnPCoHUKPRMgAA + + + +error +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +qint64 +h/Nf8AYA8UCnn+wKCyqgowAA + + + +errorString +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +QString +UUUj64TabEGTvsLeRP0L4AAA + + + +setApiUrl +W0IFCTrokkm6wkpDiDO1ogAA +2 + +url +QString +tteWW/FnXka3PxUYtRiXOQAA + + +return +pdkReturn +void +tteWW/FnXka3PxUYtRiXOQAA + + + +apiUrl +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +QString +834zVOE8a0GEL6gSs9jleQAA + + + +setAuthMethod +W0IFCTrokkm6wkpDiDO1ogAA +2 + +m +12vyVcUagUq/ngCL1Vh1KAAA +DzKJ2ayprEqYf6J8gHjXywAA + + +return +pdkReturn +void +12vyVcUagUq/ngCL1Vh1KAAA + + + +authMethod +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +Zh3jR88LBEiCbTBcm2mavwAA +DzKJ2ayprEqYf6J8gHjXywAA + + + +setApiVersion +W0IFCTrokkm6wkpDiDO1ogAA +2 + +apiversion +QString +Ce2ff2TBXU2dv8f+Zaf0OwAA + + +return +pdkReturn +void +Ce2ff2TBXU2dv8f+Zaf0OwAA + + + +apiVersion +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +QString +EeEhexaoC0y+d6IdYxxQVAAA + + + +setKey +W0IFCTrokkm6wkpDiDO1ogAA +2 + +key +QString +RJSrszmm2EasQuFA2fSW0AAA + + +return +pdkReturn +void +RJSrszmm2EasQuFA2fSW0AAA + + + +key +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +QString +J1yvCZ4C60Ch58uq2jlQGgAA + + + +setSharedSecret +W0IFCTrokkm6wkpDiDO1ogAA +2 + +sharedSecret +QString +7HeaCBYJl0K8ylVyJOURUQAA + + +return +pdkReturn +void +7HeaCBYJl0K8ylVyJOURUQAA + + + +sharedSecret +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +QString +hO3aO2dw/UWWF7zp9ISb1wAA + + + +requestToken +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +int +UE2kjPcmtk6wRehdu8zQiwAA + + + +authorize +W0IFCTrokkm6wkpDiDO1ogAA +3 + +mail +QString +euTknuuB1UauIW4WBwDhCgAA + + +password +QString +euTknuuB1UauIW4WBwDhCgAA + + +return +pdkReturn +int +euTknuuB1UauIW4WBwDhCgAA + + + +authorizeLink +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +QUrl +d/b5PDBVBEyR/E0DhSqO9gAA + + + +requestAccessToken +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +int +tsqq3hSMXEy3n/VVdSjVogAA + + + +requestAccountInfo +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +int +lBP/IJe6DkmWJmJ+wPBbQAAA + + + +errorOccured +W0IFCTrokkm6wkpDiDO1ogAA +2 + +errorcode +oL6TVcoL/EePVB0eYRaH2AAA +Apdq3G0RkUm9YikPh0QWrwAA + + +return +pdkReturn +void +oL6TVcoL/EePVB0eYRaH2AAA + + + +tokenExpired +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +void +Z/hJAWMGekC9RpSK940WYAAA + + + +fileNotFound +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +void +Pyli6BguaEamJKwH7OPXKQAA + + + +operationFinished +W0IFCTrokkm6wkpDiDO1ogAA +2 + +requestnr +int +ib0X4Hew3kO60CkdS8leFwAA + + +return +pdkReturn +void +ib0X4Hew3kO60CkdS8leFwAA + + + +requestTokenFinished +W0IFCTrokkm6wkpDiDO1ogAA +3 + +token +QString +1nNXMBkhhk6s+LKg5RvIKgAA + + +secret +QString +1nNXMBkhhk6s+LKg5RvIKgAA + + +return +pdkReturn +void +1nNXMBkhhk6s+LKg5RvIKgAA + + + +accessTokenFinished +W0IFCTrokkm6wkpDiDO1ogAA +3 + +token +QString +928jTUX4u0yjS//w5gBsGAAA + + +secret +QString +928jTUX4u0yjS//w5gBsGAAA + + +return +pdkReturn +void +928jTUX4u0yjS//w5gBsGAAA + + + +tokenChanged +W0IFCTrokkm6wkpDiDO1ogAA +3 + +token +QString +4MYNQ4ARQkio/YEcSS9trAAA + + +secret +QString +4MYNQ4ARQkio/YEcSS9trAAA + + +return +pdkReturn +void +4MYNQ4ARQkio/YEcSS9trAAA + + + +accountInfo +W0IFCTrokkm6wkpDiDO1ogAA +2 + +accountJson +QString +9b9mQAL59kC+OvLH5NI6yQAA + + +return +pdkReturn +void +9b9mQAL59kC+OvLH5NI6yQAA + + + +requestFinished +W0IFCTrokkm6wkpDiDO1ogAA +3 + +nr +int +sFjy2jg99k6Sf33zFDfIGAAA + + +rply +QNetworkReply +sFjy2jg99k6Sf33zFDfIGAAA +1 + +Cpp +CppPointer +CppPointer +* +2ORbw7z3QkKSE07rSYoVpgAA + + + +return +pdkReturn +void +sFjy2jg99k6Sf33zFDfIGAAA + + + +networkReplyFinished +W0IFCTrokkm6wkpDiDO1ogAA +2 + +rply +QNetworkReply +Qb3vLAceAUiyR3Rd/LQ0bAAA +1 + +Cpp +CppPointer +CppPointer +* +8jHBwloghkqXk3Qms24QVgAA + + + +return +pdkReturn +void +Qb3vLAceAUiyR3Rd/LQ0bAAA + + + +hmacsha1 +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +3 + +key +QByteArray +OK0RwGNre0ig0DeyE065/AAA + + +baseString +QByteArray +OK0RwGNre0ig0DeyE065/AAA + + +return +pdkReturn +QString +OK0RwGNre0ig0DeyE065/AAA + + + +generateNonce +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +2 + +length +qint32 +ey3VHCbEeEiClhOT1h9B5AAA + + +return +pdkReturn +QString +ey3VHCbEeEiClhOT1h9B5AAA + + + +oAuthSign +W0IFCTrokkm6wkpDiDO1ogAA +3 + +base +QUrl +xCDI13CNpk+ulExvshvcZgAA + + +method +QString +xCDI13CNpk+ulExvshvcZgAA + + +return +pdkReturn +QString +xCDI13CNpk+ulExvshvcZgAA + + + +prepareApiUrl +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +void +j+k5biyLckGMB5PwM1OgggAA + + + +sendRequest +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +5 + +request +QUrl +kdQyBRVRh0CKhj4xwa8dHAAA + + +type +QString +kdQyBRVRh0CKhj4xwa8dHAAA + + +postdata +QByteArray +kdQyBRVRh0CKhj4xwa8dHAAA + + +host +QString +kdQyBRVRh0CKhj4xwa8dHAAA + + +return +pdkReturn +int +kdQyBRVRh0CKhj4xwa8dHAAA + + + +responseTokenRequest +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +2 + +response +QString +/YL869vGS0uT2OjAkB5+VQAA + + +return +pdkReturn +void +/YL869vGS0uT2OjAkB5+VQAA + + + +responseDropboxLogin +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +3 + +response +QString +lpO80T7FZ065151y3fpIYAAA + + +reqnr +int +lpO80T7FZ065151y3fpIYAAA + + +return +pdkReturn +int +lpO80T7FZ065151y3fpIYAAA + + + +responseAccessToken +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +2 + +response +QString +X/JNnQKc/UiKBcjJVDU3AwAA + + +return +pdkReturn +void +X/JNnQKc/UiKBcjJVDU3AwAA + + + +signatureMethodString +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +1 + +return +pdkReturn +QString +NNJCJrC1zkSg7ZhYSeBiBAAA + + + +parseToken +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +2 + +response +QString +/Dk8IsD3jkSCCc/KrGcs/QAA + + +return +pdkReturn +void +/Dk8IsD3jkSCCc/KrGcs/QAA + + + +parseAccountInfo +vkPrivate +W0IFCTrokkm6wkpDiDO1ogAA +2 + +response +QString +u8ja0Lvt6U2LC822vcGzdgAA + + +return +pdkReturn +void +u8ja0Lvt6U2LC822vcGzdgAA + + + +appKey +W0IFCTrokkm6wkpDiDO1ogAA +1 + +pdkReturn +QString +l65sPxW2b0SIgl33OqIKxgAA + + + +appSharedSecret +W0IFCTrokkm6wkpDiDO1ogAA +1 + +pdkReturn +QString +S5GC430qbkqOAIObF9OIUQAA + + +1 +wOhoxHaCFk6cIGBTzHfrXAAA +14 +/XZHT+D6kU+IS2qm+KMbIwAA +ZGRRLJ5j2EWX2iraBMG3pQAA +RiUuUvyZOUS+flTYkM/BJgAA +w6uuXFzF+UuyUhUFsfq4mwAA +RsBp0DIz3k2VkIanXnx5LAAA +3CBhQ/ETW0OoFrfOxALo/AAA +OYDVVYkCiUOSqYdTAuHF9gAA +6ubOpnxC3EeJQrXGa2B87QAA +LT5Bak4GOUmdsHw3CnpfFgAA +e3fE6NMvn06WkrRwGAWA2gAA +Zgoa5OVdjEi2XYfHaIUImQAA +ZAQTYN9xN06gJoIbtBd0EAAA +iY72rs0Ip0iV+xqYE3stRQAA ++EzqPosbe0i8n1xANmif4wAA +18 + +conManager +vkPrivate +QNetworkAccessManager +W0IFCTrokkm6wkpDiDO1ogAA + + +errorState +vkPrivate +Apdq3G0RkUm9YikPh0QWrwAA +W0IFCTrokkm6wkpDiDO1ogAA + + +errorText +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +_appKey +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +_appSharedSecret +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +apiurl +vkPrivate +QUrl +W0IFCTrokkm6wkpDiDO1ogAA + + +nonce +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +timestamp +vkPrivate +long +W0IFCTrokkm6wkpDiDO1ogAA + + +oauthMethod +vkPrivate +DzKJ2ayprEqYf6J8gHjXywAA +W0IFCTrokkm6wkpDiDO1ogAA + + +version +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +oauthToken +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +oauthTokenSecret +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +replynrMap +vkPrivate +QMap <QNetworkReply*,int> +W0IFCTrokkm6wkpDiDO1ogAA + + +lastreply +vkPrivate +int +W0IFCTrokkm6wkpDiDO1ogAA + + +requestMap +vkPrivate +QMap<int,qdropbox_request> +W0IFCTrokkm6wkpDiDO1ogAA + + +delayMap +vkPrivate +QMap<int,int> +W0IFCTrokkm6wkpDiDO1ogAA + + +mail +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + +password +vkPrivate +QString +W0IFCTrokkm6wkpDiDO1ogAA + + + +QDropbxAccount +N2j+7nhBQEq+mO8YqFlxXAAA +4 +Awaho9FPYkW7L1LuJ3v6ZgAA +qVbfSsc2uE6bGzuXdIckJgAA +ErAEpmTzhECwO2kMbffX+gAA +qu8ikA8AjEacCY0Ljoal8gAA +14 + +QDropboxAccount +vkPrivate +sFX2E/MBlUO0Eb/e07cRggAA +1 + +parent +QObject +3cD/SSErKES96/SgTLptugAA +1 + +Cpp +CppPointer +CppPointer +* +fX2cWmmNakSMDYu1dwFOFQAA + + + + +QDropboxAccount +vkPrivate +sFX2E/MBlUO0Eb/e07cRggAA +2 + +json +pxT3SnzmdkWDVhTI/heefAAA +3ldG67+ChU+zoMSfNP9q2wAA + + +parent +QObject +pxT3SnzmdkWDVhTI/heefAAA + + + +QDropboxAccount +vkPrivate +sFX2E/MBlUO0Eb/e07cRggAA +2 + +jsonString +QString +JFF2f7km4Ea66pO7p12C5wAA + + +parent +QObject +JFF2f7km4Ea66pO7p12C5wAA +1 + +Cpp +CppPointer +CppPointer +* +mXgAG8GCOkqkCUW/YpB35gAA + + + + +QDropboxAccount +vkPrivate +sFX2E/MBlUO0Eb/e07cRggAA +1 + +other +QDropboxAccount +8u+RXkolNkSWWkXVFtQjFQAA +1 + +Cpp +CppPointer +CppPointer +& +EaOGQLzetkmR4q+uKPhcZAAA + + + + +setJson +sFX2E/MBlUO0Eb/e07cRggAA +2 + +pdkReturn +void +U7KbofoduEu/vl1pymaqgAAA + + +json +U7KbofoduEu/vl1pymaqgAAA +3ldG67+ChU+zoMSfNP9q2wAA + + + +isValid +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +bool +mJS6rYfIdUaPCLATAlv1yQAA + + + +referralLink +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +QUrl +MgxvqfiNZ0ahIO1APWDXiQAA + + + +displayName +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +QString +x5qwi99Nx0iAQgtrHG2ZEAAA + + + +uid +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +qint64 +DHFO3dXkPUm8wcNH4C+d8wAA + + + +country +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +QString +AKwhcsaxSkC6VFBVpQgcQAAA + + + +email +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +QString +vWeDwQHknUKCxDep6Yx0mgAA + + + +quotaShared +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +quint64 +A4knr3HKKUeJmBq/4AM9jQAA + + + +quota +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +quint64 +OEEO/oKRjUKolzr7n/x3vQAA + + + +quotaNormal +sFX2E/MBlUO0Eb/e07cRggAA +1 + +return +pdkReturn +quint64 +5MkKRZjbh0OsrgXSfdUCwgAA + + +2 +BGv1WDNq7Uax5tzOLN2pagAA +Gy7sTkVK/0yx2LS0eNHdMQAA +9 + +valid +vkPrivate +bool +sFX2E/MBlUO0Eb/e07cRggAA + + +_referralLink +vkPrivate +QUrl +sFX2E/MBlUO0Eb/e07cRggAA + + +_displayName +vkPrivate +QString +sFX2E/MBlUO0Eb/e07cRggAA + + +_uid +vkPrivate +quint64 +sFX2E/MBlUO0Eb/e07cRggAA + + +_country +vkPrivate +QString +sFX2E/MBlUO0Eb/e07cRggAA + + +_email +vkPrivate +QString +sFX2E/MBlUO0Eb/e07cRggAA + + +_quotaShared +vkPrivate +quint64 +sFX2E/MBlUO0Eb/e07cRggAA + + +_quota +vkPrivate +quint64 +sFX2E/MBlUO0Eb/e07cRggAA + + +_quotaNormal +vkPrivate +quint64 +sFX2E/MBlUO0Eb/e07cRggAA + + + +QDropboxJson +N2j+7nhBQEq+mO8YqFlxXAAA +4 +wjFp+lbpQ0SnrIsXCR3AKwAA +/cV5CgsDvEqXr69TYWi0NAAA +iXNf7/IH9U2FW6QL/MP4XwAA +egn01yrWqUaaoVRtgXRrRgAA +1 + +DataType +3ldG67+ChU+zoMSfNP9q2wAA +1 +f4mrJTlrt0icduHrJgXNYwAA +8 + +NumberType +Sl18qfZdjUWhnKsQRSh7PQAA + + +StringType +Sl18qfZdjUWhnKsQRSh7PQAA + + +JsonType +Sl18qfZdjUWhnKsQRSh7PQAA + + +ArrayType +Sl18qfZdjUWhnKsQRSh7PQAA + + +FloatType +Sl18qfZdjUWhnKsQRSh7PQAA + + +BoolType +Sl18qfZdjUWhnKsQRSh7PQAA + + +UnsignedIntType +Sl18qfZdjUWhnKsQRSh7PQAA + + +UnknownType +Sl18qfZdjUWhnKsQRSh7PQAA + + +17 + +Cpp +CppMacro +vkPrivate +3ldG67+ChU+zoMSfNP9q2wAA + + +QDropboxJson +vkPrivate +3ldG67+ChU+zoMSfNP9q2wAA +1 + +parent +QObject +c7gtOn3E4UqEnEadhozoEQAA +1 + +Cpp +CppPointer +CppPointer +* +hm4Ji4hGIkSE6aH4xm8BTwAA + + + + +QDropboxJson +vkPrivate +3ldG67+ChU+zoMSfNP9q2wAA +2 + +strJson +QString +BCU8doJ93UeX6BZiieJ4PwAA + + +parent +QObject +BCU8doJ93UeX6BZiieJ4PwAA +1 + +Cpp +CppPointer +CppPointer +* +LCmWG6qknkyfRnHEByJVygAA + + + + +QDropboxJson +UMLStandard +destroy +vkPrivate +3ldG67+ChU+zoMSfNP9q2wAA + + +parseString +3ldG67+ChU+zoMSfNP9q2wAA +2 + +strJson +QString +nlXHD5wwCUOZjUo6CgzNDQAA + + +return +pdkReturn +void +nlXHD5wwCUOZjUo6CgzNDQAA + + + +clear +3ldG67+ChU+zoMSfNP9q2wAA +1 + +return +pdkReturn +void +Ok4EnzhajUymTWy8Ke+t0QAA + + + +isValid +3ldG67+ChU+zoMSfNP9q2wAA +1 + +return +pdkReturn +bool +Zs8zocZRcEOc2Bik5JqbGgAA + + + +hasKey +3ldG67+ChU+zoMSfNP9q2wAA +2 + +key +QString +u1gwPLwuCUitHRxb1jijWAAA + + +return +pdkReturn +bool +u1gwPLwuCUitHRxb1jijWAAA + + + +type +3ldG67+ChU+zoMSfNP9q2wAA +2 + +key +QString +7vCIK9t3EEyMPL3TP5WvRQAA + + +return +pdkReturn +7vCIK9t3EEyMPL3TP5WvRQAA +Sl18qfZdjUWhnKsQRSh7PQAA + + + +getInt +3ldG67+ChU+zoMSfNP9q2wAA +3 + +key +QString +9T3eFVBtaEmYjP0u7IWA1wAA + + +force +bool +9T3eFVBtaEmYjP0u7IWA1wAA + + +return +pdkReturn +int +9T3eFVBtaEmYjP0u7IWA1wAA + + + +getUInt +3ldG67+ChU+zoMSfNP9q2wAA +3 + +key +QString +JWhauatDR0SQsqIhnuQjVwAA + + +force +bool +JWhauatDR0SQsqIhnuQjVwAA + + +return +pdkReturn +quint32 +JWhauatDR0SQsqIhnuQjVwAA + + + +getString +3ldG67+ChU+zoMSfNP9q2wAA +3 + +key +QString +0GvmbSPd0UKf68NbFGBKiwAA + + +force +bool +0GvmbSPd0UKf68NbFGBKiwAA + + +return +pdkReturn +QString +0GvmbSPd0UKf68NbFGBKiwAA + + + +getJson +3ldG67+ChU+zoMSfNP9q2wAA +2 + +key +QString +dmA3eBFET0qIKMkHvtuN4wAA + + +return +pdkReturn +dmA3eBFET0qIKMkHvtuN4wAA +1 + +Cpp +CppPointer +CppPointer +* +CZbCVV0PYESpLzNDyH3BDwAA + + + + +getDouble +3ldG67+ChU+zoMSfNP9q2wAA +3 + +key +QString +ufM8egbLvUKMWOQZYquSlQAA + + +force +bool +ufM8egbLvUKMWOQZYquSlQAA + + +return +pdkReturn +double +ufM8egbLvUKMWOQZYquSlQAA + + + +getBool +3ldG67+ChU+zoMSfNP9q2wAA +3 + +key +QString ++xq7xMRquEeirZfZ+jr53wAA + + +force +bool ++xq7xMRquEeirZfZ+jr53wAA + + +return +pdkReturn +bool ++xq7xMRquEeirZfZ+jr53wAA + + + +emptyList +vkPrivate +3ldG67+ChU+zoMSfNP9q2wAA +1 + +return +pdkReturn +void +mnIGhRuACk2+LnN0B90BzQAA + + + +interpretType +vkPrivate +3ldG67+ChU+zoMSfNP9q2wAA +2 + +value +QString +5ue1OIJOa0GzCHY/TebuGQAA + + +return +pdkReturn +5ue1OIJOa0GzCHY/TebuGQAA +ivoGuCI+nU+pxM1i7fml2wAA + + +1 +I00RMOFlV0ejXPOzctOXYwAA +2 +TZF5NL3vBkyUsJHad4mKygAA +AMPATP8f5kGCcit6gmQ23AAA +3 +cxFRPyXGi0itBgMed0h3+AAA +NEXj/BgYxUyBQUCVUq3RGQAA +M8LtzaCkj0uA37CAetQEfAAA +2 + +valueMap +vkPrivate +QMap<QString, qdropboxjson_entry> +3ldG67+ChU+zoMSfNP9q2wAA + + +valid +vkPrivate +bool +3ldG67+ChU+zoMSfNP9q2wAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +3JeZPAV6mUCL4MLEpDnT0QAA +3ldG67+ChU+zoMSfNP9q2wAA + + +3JeZPAV6mUCL4MLEpDnT0QAA +sFX2E/MBlUO0Eb/e07cRggAA + + + +used in +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +PS053f8SjkeNeXdA0r+XEAAA +sFX2E/MBlUO0Eb/e07cRggAA + + +PS053f8SjkeNeXdA0r+XEAAA +3ldG67+ChU+zoMSfNP9q2wAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +4 +as4/yIRjY0OGQZDrr0PmCQAA +NO2xmGlziE2c8hCnY/CxfgAA +KsOpYzyxN0a4eO7aktfvPwAA +FkmcghoLrESBTZWDCgtQJwAA +2 + +VOlKTB1AvEaHTlhVfnU5rQAA +ivoGuCI+nU+pxM1i7fml2wAA +4 +uyM7ffL9HkauJYV2kmvL+AAA +nQ67sYwfPUiJkgnXRi6OjQAA +aaVdJlxtQEqxPVB9tOeFxQAA +it3W24BWgkyfqJedQuERVQAA + + +akAggregate +VOlKTB1AvEaHTlhVfnU5rQAA +rzEAq8I6FE+PpXanPndneQAA +4 +zZPd3yQlDEqtzqPR8GLfJQAA +Wc1Hr6IwEkaXimuch9WobgAA +zWnzgFWnb0uE4jUnhYhSKgAA +Cg+jsDPDi0mUQzulDyyzUgAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +4 +RszJlyzTvUyoX0071nCVwgAA +ejID/Zn+GEO5H18t7GIH0gAA +kYUh8EFJWEKbCGvVvltPrgAA +gc1dpixR302jRRv1uy5W3QAA +2 + +3Zi5rozxKkiJPK0G4b2WtwAA +Salq1uHht0SrITdCzNgz8gAA +4 +aG6oVlTMpUiq+3dgEkdvSAAA +y2XxF12YfU6LXeKAs3eNBgAA +MLvpmc8HpEuFjoviMeFCIwAA +9LyxkddOpUiCRm617MaLlgAA + + +akAggregate +3Zi5rozxKkiJPK0G4b2WtwAA +rzEAq8I6FE+PpXanPndneQAA +4 +fiRS+QXvT0W7BLfhX7gLXAAA +8CR52ji/CEq5HDmpQpX3DwAA +t6p3SjqzE0WNY31ns1vjagAA +wWc023kHy02Ijy9DHZMglQAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +4 +Ffakr8Kjs06kcm4z0mmNsAAA +wZvYqHseUEuKAZPk4oTEcwAA +bYtRpAEX10myQd4aPP5dqwAA +4U9gEtoVjUyxGmNGv4l2mQAA +2 + +NxUJykImGEWbIsX5U6genQAA +rzEAq8I6FE+PpXanPndneQAA +4 +sx+fc7jmQEet7ppZr2303gAA +0Z1VeHgLzU2Zml138Z2M1AAA +GK4uy0b+KEuh5fcuYopgfQAA +d1S98A8c5EOCk6dLi7JJDgAA + + +NxUJykImGEWbIsX5U6genQAA +3ldG67+ChU+zoMSfNP9q2wAA +4 +yBQJF8Qq+0yVcoXlpc0e2wAA +gtj5IVJlDkKSt3kDFFDZ/QAA +JaAnqVZmGkKCgkViXzrtAwAA +p0acNsqBtkyPKF6I0cv0fgAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +IUlear54M0mtzZWceSWFYQAA +/d+HCPT/kEWbrwf4YZSB6wAA + + +IUlear54M0mtzZWceSWFYQAA +/d+HCPT/kEWbrwf4YZSB6wAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +TbgvcCKkqkCHBCJbeqXqcwAA +/d+HCPT/kEWbrwf4YZSB6wAA + + +TbgvcCKkqkCHBCJbeqXqcwAA +o/YVcpgbbUmwpN4wodhPTAAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +j6VCJLZUYE6qnebB79uqeQAA +o/YVcpgbbUmwpN4wodhPTAAA + + +akAggregate +j6VCJLZUYE6qnebB79uqeQAA +W0IFCTrokkm6wkpDiDO1ogAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +4 +BeZHwQN34k6h+tq1av34fAAA +Gd6O7K1ook60uIU8v4yaJAAA +oQfVTwbVRk+XPS1LzJSx9wAA +joSGI27VWE60wuw4Z0zk0gAA +2 + +U9kmFCZ0gUSdYHEaayZEvQAA +/d+HCPT/kEWbrwf4YZSB6wAA +4 +QWkHlnDei0aeSl3nJZxYngAA +OmDfRz90v0+Zq8318UtaZAAA +NzKOYe2KIUKHyGpNGT3tiAAA +3My1T2PPoUq5ZHAUluJpyAAA + + +akAggregate +U9kmFCZ0gUSdYHEaayZEvQAA +o/YVcpgbbUmwpN4wodhPTAAA +4 +JXQCOIsf20eNuoM12vW4oAAA +1iCAhp625UGm0MTHMVSELQAA +Fzdce/RF+E+N4eXyYWiTZAAA +dsW+c0W2J0G5bramWMKPvAAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +jYiEnYJRNE6S40ZA0XefAQAA +o/YVcpgbbUmwpN4wodhPTAAA + + +jYiEnYJRNE6S40ZA0XefAQAA +W0IFCTrokkm6wkpDiDO1ogAA + + + +used in requestMap +N2j+7nhBQEq+mO8YqFlxXAAA +4 +vtKCyBo1DUCqqV24HN28LQAA +Qmi53U0+0k+QkpttsDsIVAAA +UZdarQnwJ0qr/oLqWcPMcQAA +K90s+FqrzUSZxKyJkm1n9gAA +2 + +Kyb9wub+W0K//wRXxXR+8wAA +o/YVcpgbbUmwpN4wodhPTAAA +4 +JRCXvjB9AU+wzuND8o15CQAA +JfUU8Lm1B0+d13nGctneKwAA ++ytMC9q3Kky55lm1Sr4xcwAA +QWYcr4R0IkyIJgSxibGtxwAA + + +Kyb9wub+W0K//wRXxXR+8wAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +Ex0rMs6GLEO/uW4MqXtIUwAA +YwhsvrydXEK3QH1y0tcI8AAA +TJ1TkPC99EOsPriYFKuNEQAA +9zToiokH5EOEYAVGTde0fQAA + + + +errorOccured +N2j+7nhBQEq+mO8YqFlxXAAA +3 +y470jG5/1kWKyTvmvBSciwAA +Pj9vbuYx+0KrHJU4029tFAAA +hlISvXV+tUadhZUvrh1RVwAA +1 +6USFEKS3dkeTgjyDb/0IrAAA +1 + +errorcode +Error +Apdq3G0RkUm9YikPh0QWrwAA +qk1BGGqjnkSnhKy4dM5cdwAA + + + +tokenExpired +N2j+7nhBQEq+mO8YqFlxXAAA +3 +0MG3H44vP0u6GuUhqp/PDAAA +BmANhxUGB0yr5/qAY3J9igAA ++5EXzLoU+UaXHl7RHjuExgAA +1 +7Yrk3YeMBki9CB5raHefMwAA + + +fileNotFound +N2j+7nhBQEq+mO8YqFlxXAAA +3 +d/LcpSgLCUOq+LACpXa0pgAA +Yi4yeB715kWAzNmK6ioaewAA +y5Yeg2cKjUmPN9fhhQ/yywAA +1 +ThFMbzFeI02U2Kdg4mtC0gAA + + +operationFinished +N2j+7nhBQEq+mO8YqFlxXAAA +3 +DbOb8jdSYU2DaQgSpSw7ewAA +P1rzfaxZlUGklraQkE6aIAAA +W/Y/8AAvK0OuFnTn8qB//gAA +1 +3TTDOAqcVUeHLjV5YanQ4wAA +1 + +requestnr +int +PkX3MuawrUOgUybeiHMd4AAA + + + +requestTokenFinished +N2j+7nhBQEq+mO8YqFlxXAAA +3 +y8uYGkGLTEKrIy8t3qnPDgAA +hrIbA/jpf0eXNr4jmqzQTAAA +LpvBHSClMkiSKIIKGorLaAAA +1 +D7k1/msjHkK5wIpSkUtuyAAA +2 + +token +Qstring +GEINB+W8lUi6WPX9cbLO6QAA + + +secret +QString +GEINB+W8lUi6WPX9cbLO6QAA + + + +accessTokenFinished +N2j+7nhBQEq+mO8YqFlxXAAA +3 +XSbsnT/NBki2/tfPi21woQAA +G7AFkrcb2kmgngToQtRBrAAA +vPuQfzIpkkqLQnAeHASjIgAA +1 +2xpWl3PtHk2x1n3TdHoNKQAA +2 + +token +QString +hBjoYmz+wkOFeo0G33HYTAAA + + +secret +QString +hBjoYmz+wkOFeo0G33HYTAAA + + + +tokenChanged +N2j+7nhBQEq+mO8YqFlxXAAA +3 +Q23OA5Ja10mcv/znj6MUDwAA +NJmKT7fvZEqgIDPCOT4v5gAA +/5/Vy0rgfUq/nkSFswxqkgAA +1 ++PzW1voGeEiJof5Tf+zPeAAA +2 + +token +QString +fGcMDHG0HUKA3XRLyM1/+AAA + + +scret +QString +fGcMDHG0HUKA3XRLyM1/+AAA + + + +accountInfo +N2j+7nhBQEq+mO8YqFlxXAAA +3 +jE8S89+ECUatE1B7MTZIFwAA +7yONQVEdBUuUOMStrWhFPAAA +W+ajrd0tJEqiF4A6AU/0FgAA +1 +eNFl7eT+5kWwfL71FCj0tAAA +1 + +accountJson +QString +RuXWIak58U6HssZVXcXdpAAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +Z256p1bkwkanXjjCNlYzkAAA +ZVRTGTP/7EK3e5uLi4pgZAAA +5QwCE0hx/UqkcDhirJoAlAAA +CE3Ovn1ByE6f/sTcj0nLVwAA +2 + +BqJXqZ8et0ewcZz7gJsiJwAA +qk1BGGqjnkSnhKy4dM5cdwAA +4 +UsLe+DrPaEqF2UyckmkQCgAA +slf5mvWeF06IlEoamjZaCwAA +V++NLsJnoUG65Xog8uUSPQAA +dcKH9BViGUuP7tCOm9ZG1wAA + + +BqJXqZ8et0ewcZz7gJsiJwAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +cVzspbWQ5UWf37XYf4VTUAAA +4nRoqd8D7Eudh3nISyuxFgAA +uthKGQmnEkO7ICyiy7SbcgAA +YnaplBs1jkWfjwBCDQtbQAAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +zhH7qIEWU0aVW9eobHmrVQAA +LnhuXq8yBUy+nNW6h4DihgAA +VPzkLOfQkkGPtEd9az63uwAA +j93s9f6q00S+NB6pg95/2gAA +2 + +vklRY+kLBUi4eci/v1uFiQAA ++/W13Cj9q0CX8sXB5mCpCwAA +4 +bOiEup2aBkiDabZTWrEKhQAA +mdUzivme/Ealz05DAFYsggAA ++0LGobpRHUiavBovkVjFrgAA +TDuIvjtajUuRx3N3wMCiNAAA + + +vklRY+kLBUi4eci/v1uFiQAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +iU6CrCDxOkmG+y3/f+5YCgAA +Ac1bH6MQfUWgrsqe93KniwAA +Do/p1nhkH0uNUEMiesjusQAA +Z+MixH2S9EmHnNLFDYa4EQAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +JStSFmZSx060KtrSh6JoQwAA +Bc8LwFkQFk68HQRlN8D5SgAA +0ITdr2cT0EO7pq0j+6mfVAAA +nDQO1BOAGkaqMkZ7nayPywAA +2 + +PzNmZJmtHE2pdK6tfw/wcQAA +hBjoYmz+wkOFeo0G33HYTAAA +4 +GgYqouGJTE+WuhNZFaJc2QAA +9jD8vHmt/ka2h270PeHhdgAA +BysU/NkTSkKnIKY1gKnhVAAA +qpyAoLZ9kEycVW6es+jcKAAA + + +PzNmZJmtHE2pdK6tfw/wcQAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +EK+RNGbsyUC4uKp0XaZX9gAA +ulasKlMNUkqPzUYY+TYFyAAA +gQY6yjs7SEaiRl5y4w5v/gAA +JUz9PCuTq0eNe4o7GS+FawAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +waw7e7QrGkq/9cpqfVBDgwAA +8cT0Q7rzW0CG5o6y8uonNwAA +6QUND/Xq0U2B7/blILpFXAAA +onV16DVwQU6lJsc+eV6CiQAA +2 + +hrJIc6Szbk6vbvDCEFkAUgAA +lHzz4UFjMEGbYtbZkKiWcgAA +4 +g20VbEI/T0OwHkOqFmP+kAAA +bb7y33Sw0Eud8nwuExrN4wAA +1o/GNY1czEKAxT13IN+TQQAA +6HMnfTCeG0SfAwm+4ytPvgAA + + +hrJIc6Szbk6vbvDCEFkAUgAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +MQVieLQSUE+RsGLai/iqGQAA +VTvjEscgLUe4dXzOn7zUbQAA +/vPCr+gR9UmdEJdDwrYIvgAA +xz4lU1phhEik549mR5d6SAAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +KHPRify1ZUKmgl0b5xKfIwAA +PWu+7pScfUq4Bg/u82JdHQAA +8x2dF50al0WAQQkIiGFAbQAA +DYaEM6hBUkKT20/URsKsHQAA +2 + +OcPT6iodY0mVCE0RmyoedAAA +fGcMDHG0HUKA3XRLyM1/+AAA +4 +bQ5oII1cwEu8HjervNJOYAAA +Qjbemm+skkyhFY/bXHKTkQAA +b0mZ0PChmka4NBs1BX2oDgAA +yxDE5qHu9E+bBTewtyBy8wAA + + +OcPT6iodY0mVCE0RmyoedAAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +1grLKBxkf0K8IiNZWcx8TgAA +OkDT47Dc70OVmk9GDGxOyQAA +wzlXP1OCT0aQxUmKN5eAyAAA +02QxCHcg7E+HaVGo1RN4twAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +M84qdg+B4UKnfSlUxxoAKwAA +hv2hIFrNZkS7fu4nXpOL7QAA +adgRPEYrHEOxUObifDVFRgAA +yXU9Bls5FUiDooxaEkN3zQAA +2 + +787xJAPCtkWj9kozxlj32gAA +PkX3MuawrUOgUybeiHMd4AAA +4 +0fsVtFsumU63wCIf47zHeQAA +1R+MAuqjU0uH8EEpDLk15AAA +dYC/mE+mYEqAaImjVFlJPwAA +0rBhva1vF0y6Tn0jOVEbRQAA + + +787xJAPCtkWj9kozxlj32gAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +uhAqE128FEKffyzQasxRUQAA +DizGqHCpGUKETNySypGkKgAA +E/ih7S/akU6zr6JaTZDz2gAA +rMK/aqLKkUigW9hNlrZajwAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +U3sxL7aeV0qHvD0Ai+0EbgAA +303Z3dVV40OngRdSj46nDwAA +HRi92UAFkUq6dSmkP+y0HwAA +jMKxuGKc3UCPb2ieJ9xFtwAA +2 + +IU2f7CMDW0aUHQ0vbnw6xQAA +RuXWIak58U6HssZVXcXdpAAA +4 +4Nx5sT7lK06ZWwlZy+EAPAAA +kMyStFNfHEKakTN4PzUXAQAA +dx+loCUlYk6rtzdbtSjm/gAA +AGETsdxP0EKKVtf3uwl5FQAA + + +IU2f7CMDW0aUHQ0vbnw6xQAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +gjq4uIm7OEK/mjYt5W66rwAA +xzsluMLZnEaNH4GCoSgAQQAA +ulZkjTwJF0aNu8XyTN2spAAA +fhN1kfOfP0Cb7YzbGQSWNgAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +T2/NfL+iJE2gNuvSKR68sgAA +TqgeAxk2o0CC0Fi9+n4YYwAA +fTThGCBMTECB2WLkgSeVkgAA +ZDyZXhaJikmmYJYJtKdwVwAA +2 + +k3xJIyemAUqZ/4cSnWz0XAAA +GEINB+W8lUi6WPX9cbLO6QAA +4 +6El+bD9eYkicxo2z9/CxxgAA +YKzCFuLXlU+axgmoHDOWFAAA +KeLOYYQEGEO00KVBDxSOvAAA +eFapM88qh0CMPWycVL6wjQAA + + +k3xJIyemAUqZ/4cSnWz0XAAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +lj1NvZBxjEuEHSntmafkAwAA +w1AsYnvUZkWri8hu4UokOQAA +tfhQYeR/xk2urcCjybkeLwAA +hLxJfDVqMEqVuGplME2zHwAA + + + +Lee, Minkyu +N2j+7nhBQEq+mO8YqFlxXAAA + + +QNetworkAccessManager +N2j+7nhBQEq+mO8YqFlxXAAA +4 +TFZSwFd6v0Gn7TdqXdwwEAAA +d6gsFWDgD0Kd2Rae44wqfAAA +Mdg1h+joB06Xvz9WUhzbGAAA +GZliktnBMUO63q7eFe4gVQAA +1 + +QtNetwork +IAbNseYeoEit8L/hehUKxQAA + +1 +42P/6HIwV0GJlnGAbQS/bAAA +5 +VLU+Sg2GI0O2sy/HAj/OHAAA +fFXfiXSitU2ULoVhxIak2AAA +orUirPbVqkmjufhsKG6ZmwAA +S2oIEoMO3Umk602ItRnV0AAA +dQ2dHg6S50KOGmxpXyjRwQAA + + +finished +N2j+7nhBQEq+mO8YqFlxXAAA +3 +vXpkVGBpuU6uFrfUC+MkTgAA +qqHucX46j0meiMXQSvv1VAAA +8JbdpXq7806hfR/Ea0e3kAAA +2 +MKFKr2BoWEOP6PDAxRUvGAAA +lwOOm8mItUKc9RSfv+MG7AAA +1 + +reply +QNetworkReply* +1RNSGyN9pUmj5s8PPq5uxgAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +3QVnpdi6ykitroavY6MHogAA +IAbNseYeoEit8L/hehUKxQAA + + +3QVnpdi6ykitroavY6MHogAA +IAbNseYeoEit8L/hehUKxQAA + + + +emit +N2j+7nhBQEq+mO8YqFlxXAAA +4 +uWGmdDdnukuzbI76evBytgAA +XtXZ9mi7kUuU8SBnDK6N7wAA +j2isnslre0SqbGLv5WM2IQAA +PvTYOf3IC0iyGhveqfzUSAAA +2 + +K2cEmXPiO0GdwZSsxaRw9QAA +IAbNseYeoEit8L/hehUKxQAA +4 +I79FuaNO/USbvGlIt6PgbAAA +YISyuLSrzEuVgmN7BlJIOAAA +LMnON83gt0ySK2g7Dcv3EwAA +IpiUtmhGGUCpLSqW2ZgPOgAA + + +K2cEmXPiO0GdwZSsxaRw9QAA +1RNSGyN9pUmj5s8PPq5uxgAA +4 +Q8dDFSfVd0eW0prR+wDz2wAA +7rs5SNJiC0S/3tckmhn4+wAA +Wg2Qu3nZekalqwuBq8nMOwAA +tObeMMwNuU+9mKy+WeI03wAA + + + +receive +N2j+7nhBQEq+mO8YqFlxXAAA +4 +IRi9ub5p+0+0HtAknDhRVwAA +Lz6AQ1eak0eW4dCBWpYuDwAA +xCyaVNrmNU+3Ks8Q67Dj5AAA +IPgm7PrkZUOYgag+dsH2IAAA +2 + +HqLKEdCIAUSt8J3/YuUQmwAA +1RNSGyN9pUmj5s8PPq5uxgAA +4 +hWLnuPUEzEKrqPMfzK6CZgAA +Q4r06s5mqE+vePzYT6tVxwAA +P7PkKSkXDUuEoo5K4fnXUQAA +DMc65Zv2hEGxRRkDCLnGVgAA + + +HqLKEdCIAUSt8J3/YuUQmwAA +W0IFCTrokkm6wkpDiDO1ogAA +4 +Bl6WU9oZ+E+trTJ5HfhucgAA +EwRPs3nhmE228BfeJNhcewAA +m3wm4COdxUat6MXUp4ZKsgAA +Q4Ie7kD73EO6HqV2ZB6bmQAA + + + +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +4TBJauA67EqSLeA+g6uAkwAA +IAbNseYeoEit8L/hehUKxQAA + + +akAggregate +4TBJauA67EqSLeA+g6uAkwAA +W0IFCTrokkm6wkpDiDO1ogAA + + + +conManager: QNetworkAccessManager +N2j+7nhBQEq+mO8YqFlxXAAA +2 + +9W4JC9U/bkOttzWRw/aMLgAA +W0IFCTrokkm6wkpDiDO1ogAA + + +akAggregate +9W4JC9U/bkOttzWRw/aMLgAA +IAbNseYeoEit8L/hehUKxQAA + + + +QDropboxFile +N2j+7nhBQEq+mO8YqFlxXAAA +4 +YYj3pOVpJEO4ERe8D85K6gAA +Gi1WCzjeSEefQ/m9sAsOkgAA +ZJol5W0YGk2emO9dCEpaKQAA +XBydwX3znUubHG85/LZnEgAA +1 +jN1Jscw+pEumBPW4E+/MrAAA +19 + +QDropboxFile +Jy85dFa4H0mNGCk17axsXQAA +1 + +parent +QObject* +fauSGazmrkmaqLP6SAvqqwAA + + + +QDropboxFile +Jy85dFa4H0mNGCk17axsXQAA +2 + +dropbox +QDropbox* +Q73JHn1wBEuNKwCuxv1TyQAA + + +parent +QObject* +Q73JHn1wBEuNKwCuxv1TyQAA + + + +QDropboxFile +Jy85dFa4H0mNGCk17axsXQAA +3 + +filename +QString +TD1buVz8GEufjp4ay+KAlAAA + + +dropbox +QDropbox* +TD1buVz8GEufjp4ay+KAlAAA + + +parent +QObject* +TD1buVz8GEufjp4ay+KAlAAA + + + +QDropboxFile +vkPackage +Jy85dFa4H0mNGCk17axsXQAA + + +setApi +Jy85dFa4H0mNGCk17axsXQAA +2 + +pdkReturn +void +uoLlwsuXHkStXoy5BOpWGQAA + + +dropbox +QDropbox* +uoLlwsuXHkStXoy5BOpWGQAA + + + +api +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +QDropbox* +n3D3hZJPe0m87d2G1deuZwAA + + + +readData +vkProtected +Jy85dFa4H0mNGCk17axsXQAA +3 + +pdkReturn +qint64 +jASX9u05l0GH1BlZetsSPQAA + + +data +char* +jASX9u05l0GH1BlZetsSPQAA + + +maxSize +qint64 +jASX9u05l0GH1BlZetsSPQAA + + + +writeData +vkProtected +Jy85dFa4H0mNGCk17axsXQAA +3 + +pdkReturn +qint64 +tKV4j1D3KE6+V4hIO4MErgAA + + +data +const char* +tKV4j1D3KE6+V4hIO4MErgAA + + +maxSize +qint64 +tKV4j1D3KE6+V4hIO4MErgAA + + + +isSequential +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +bool +3bEC6CXx80e0zEtc25yzyAAA + + + +open +Jy85dFa4H0mNGCk17axsXQAA +2 + +pdkReturn +bool +HEmZBEERSU6rHyk99gLQ1gAA + + +mode +OpenMode +HEmZBEERSU6rHyk99gLQ1gAA + + + +close +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +void +oKlbHjbySUylG387FEIOLQAA + + + +flush +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +bool +NBj3q81B20uyIyIwJ1teqwAA + + + +obtainToken +vkPrivate +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +void +m5kNmppoc0e7KGVxtP1xlAAA + + + +isMode +vkPrivate +Jy85dFa4H0mNGCk17axsXQAA +2 + +pdkReturn +bool +gV13dsTCP02tCO54bBchEQAA + + +mode +OpenMode +gV13dsTCP02tCO54bBchEQAA + + + +setFilename +Jy85dFa4H0mNGCk17axsXQAA +1 + +filename +QString +7kM9ehRZyUWtENVOR1kcpQAA + + + +filename +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +QString +mi2SMzJ9UEijYDVF3ymswQAA + + + +getFileContent +vkPrivate +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +bool +v+MB4NreiUSNLRw9gae6agAA + + + +connectSignals +vkPrivate +Jy85dFa4H0mNGCk17axsXQAA +1 + +pdkReturn +void +Yrg3sc4fb0ePMmEwMDcK6wAA + + + +networkRequestFinished +vkPrivate +Jy85dFa4H0mNGCk17axsXQAA +2 + +pdkReturn +void +I0HG86OJHUea9z3yd/rk0QAA + + +rply +QNetworkReply* +I0HG86OJHUea9z3yd/rk0QAA + + +6 + +_token +vkPrivate +QString +Jy85dFa4H0mNGCk17axsXQAA + + +_tokenSecret +vkPrivate +QString +Jy85dFa4H0mNGCk17axsXQAA + + +_api +vkPrivate +QDropbox* +Jy85dFa4H0mNGCk17axsXQAA + + +_conManager +vkPrivate +QNetworkAccessManager +IAbNseYeoEit8L/hehUKxQAA +Jy85dFa4H0mNGCk17axsXQAA + + +_buffer +vkPrivate +QByteArray* +Jy85dFa4H0mNGCk17axsXQAA + + +_filename +vkPrivate +QString +Jy85dFa4H0mNGCk17axsXQAA + + + +QIODevice +N2j+7nhBQEq+mO8YqFlxXAAA +4 +iVqhIMWw2kOENBS6i1bzRAAA +6yYazEp32UOKl6oBnmrtOwAA +yAApwgjwZU6LdLLy6Jc/rwAA +gUTkywmnpUyZfVIvoa89jQAA +1 + +QtCore +fKdwvFAhRES1bUHbkladewAA + +1 +jN1Jscw+pEumBPW4E+/MrAAA + + +N2j+7nhBQEq+mO8YqFlxXAAA +fKdwvFAhRES1bUHbkladewAA +Jy85dFa4H0mNGCk17axsXQAA +4 +1pVuDU+NJkSP73zSk3Q7mgAA +bSoR90svHkaJ+KhvkVX/3QAA +NZ31b1CEQ0eE3+B1C1P00gAA +n7nbD0IB8Ei5NagRDYjC+gAA + + + +Implementation Model +UMLStandard +implementationModel +7nMF4TYiyE2tufmAssy54AAA +1 + +Main +0pcWzk2fi0K5IOlu0sKohgAA + +wetG99yhWEqRb6CFaCvmqwAA + + + + +Deployment Model +UMLStandard +deploymentModel +7nMF4TYiyE2tufmAssy54AAA +1 + +Main +/JNjEUsUG0aUm+Qezqsr4AAA + ++9JmREHV6kmgujrAnwC7ewAA + + + + + + diff --git a/src/third_party/QtDropbox/doc/doxygen.conf b/src/third_party/QtDropbox/doc/doxygen.conf new file mode 100644 index 0000000..1b1fddf --- /dev/null +++ b/src/third_party/QtDropbox/doc/doxygen.conf @@ -0,0 +1,1749 @@ +# Doxyfile 1.7.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = QtDropbox + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.1 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "An API for accessing the Dropbox API by using the Qt C++ Framework" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 27 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = NO + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = NO + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./src + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = NO + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = NO + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is adviced to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/src/third_party/QtDropbox/libqtdropbox.pri b/src/third_party/QtDropbox/libqtdropbox.pri new file mode 100644 index 0000000..e563afc --- /dev/null +++ b/src/third_party/QtDropbox/libqtdropbox.pri @@ -0,0 +1,13 @@ +INCLUDEPATH += qtdropbox +LIBS += -lQtDropbox + +HEADERS += qtdropbox_global.h\ + qdropbox.h \ + qtdropbox.h \ + qdropboxjson.h \ + qdropboxaccount.h \ + qdropboxfile.h \ + qdropboxfileinfo.h \ + qdropboxdeltaresponse.h + +CONFIG += network diff --git a/src/third_party/QtDropbox/qtdropbox.config.pri b/src/third_party/QtDropbox/qtdropbox.config.pri new file mode 100644 index 0000000..a02738d --- /dev/null +++ b/src/third_party/QtDropbox/qtdropbox.config.pri @@ -0,0 +1,21 @@ +OTHER_FILES += libqtdropbox.pri + +target.path = lib/ + +#------------------------------------------------- +# Documentation target +#------------------------------------------------- +documentation.commands = doxygen doc/doxygen.conf +QMAKE_EXTRA_TARGETS += documentation + +#------------------------------------------------- +# Package target +#------------------------------------------------- +package.files = libqtdropbox.pri \ + src/*.h +package.path = qtdropbox + +#------------------------------------------------- +# install definitions +#------------------------------------------------- +INSTALLS += target package diff --git a/src/third_party/QtDropbox/qtdropbox.pri b/src/third_party/QtDropbox/qtdropbox.pri new file mode 100644 index 0000000..4abb1b6 --- /dev/null +++ b/src/third_party/QtDropbox/qtdropbox.pri @@ -0,0 +1,23 @@ +QT += network xml + +INCLUDEPATH += $$PWD/src + +SOURCES += \ + $$PWD/src/qdropbox.cpp \ + $$PWD/src/qdropboxjson.cpp \ + $$PWD/src/qdropboxaccount.cpp \ + $$PWD/src/qdropboxfile.cpp \ + $$PWD/src/qdropboxfileinfo.cpp \ + $$PWD/src/qdropboxdeltaresponse.cpp + +HEADERS += \ + $$PWD/src/qtdropbox_global.h \ + $$PWD/src/qdropbox.h \ + $$PWD/src/qdropboxjson.h \ + $$PWD/src/qdropboxaccount.h \ + $$PWD/src/qdropboxfile.h \ + $$PWD/src/qtdropbox.h \ + $$PWD/src/qdropboxfileinfo.h \ + $$PWD/src/qdropboxdeltaresponse.h + +CONFIG += network diff --git a/src/third_party/QtDropbox/qtdropbox.pro b/src/third_party/QtDropbox/qtdropbox.pro new file mode 100644 index 0000000..959675a --- /dev/null +++ b/src/third_party/QtDropbox/qtdropbox.pro @@ -0,0 +1,34 @@ +#------------------------------------------------- +# General definitions and dependencies +#------------------------------------------------- + +QT += network xml + +QT -= gui + +TEMPLATE = lib + +DEFINES += QTDROPBOX_LIBRARY +# QTDROPBOX_DEBUG + +SOURCES += \ + src/qdropbox.cpp \ + src/qdropboxjson.cpp \ + src/qdropboxaccount.cpp \ + src/qdropboxfile.cpp \ + src/qdropboxfileinfo.cpp \ + src/qdropboxdeltaresponse.cpp + +HEADERS += \ + src/qtdropbox_global.h \ + src/qdropbox.h \ + src/qdropboxjson.h \ + src/qdropboxaccount.h \ + src/qdropboxfile.h \ + src/qtdropbox.h \ + src/qdropboxfileinfo.h \ + src/qdropboxdeltaresponse.h + +TARGET = QtDropbox + +include(qtdropbox.config.pri) diff --git a/src/third_party/QtDropbox/src/qdropbox.cpp b/src/third_party/QtDropbox/src/qdropbox.cpp new file mode 100644 index 0000000..cb17e07 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropbox.cpp @@ -0,0 +1,1257 @@ +#include "qdropbox.h" + +QDropbox::QDropbox(QObject *parent) : + QObject(parent), + conManager(this) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "creating dropbox api" << endl; +#endif + + errorState = QDropbox::NoError; + errorText = ""; + setApiVersion("1.0"); + setApiUrl("api.dropbox.com"); + setAuthMethod(QDropbox::Plaintext); + + oauthToken = ""; + oauthTokenSecret = ""; + + lastreply = 0; + + connect(&conManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReplyFinished(QNetworkReply*))); + + // needed for nonce generation + qsrand(QDateTime::currentMSecsSinceEpoch()); + + _evLoop = NULL; + _saveFinishedRequests = false; +} + +QDropbox::QDropbox(QString key, QString sharedSecret, OAuthMethod method, QString url, QObject *parent) : + QObject(parent), + conManager(this) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "creating api with key, shared secret and method" << endl; +#endif + + errorState = QDropbox::NoError; + errorText = ""; + setKey(key); + setSharedSecret(sharedSecret); + setAuthMethod(method); + setApiVersion("1.0"); + setApiUrl(url); + + oauthToken = ""; + oauthTokenSecret = ""; + + lastreply = 0; + + connect(&conManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReplyFinished(QNetworkReply*))); + + // needed for nonce generation + qsrand(QDateTime::currentMSecsSinceEpoch()); + + _evLoop = NULL; + _saveFinishedRequests = false; +} + +QDropbox::Error QDropbox::error() +{ + return errorState; +} + +QString QDropbox::errorString() +{ + return errorText; +} + +void QDropbox::setApiUrl(QString url) +{ + apiurl.setUrl(QString("//%1").arg(url)); + prepareApiUrl(); + return; +} + +QString QDropbox::apiUrl() +{ + return apiurl.toString(); +} + +void QDropbox::setAuthMethod(OAuthMethod m) +{ + oauthMethod = m; + prepareApiUrl(); + return; +} + +QDropbox::OAuthMethod QDropbox::authMethod() +{ + return oauthMethod; +} + +void QDropbox::setApiVersion(QString apiversion) +{ + if(apiversion.compare("1.0")) + { + errorState = QDropbox::VersionNotSupported; + errorText = "Only version 1.0 is supported."; + emit errorOccured(QDropbox::VersionNotSupported); + return; + } + + _version = apiversion; + return; +} + +void QDropbox::requestFinished(int nr, QNetworkReply *rply) +{ + rply->deleteLater(); +#ifdef QTDROPBOX_DEBUG + int resp_bytes = rply->bytesAvailable(); +#endif + QByteArray buff = rply->readAll(); + QString response = QString(buff); +#ifdef QTDROPBOX_DEBUG + qDebug() << "request " << nr << "finished." << endl; + qDebug() << "request was: " << rply->url().toString() << endl; +#endif +#ifdef QTDROPBOX_DEBUG + qDebug() << "response: " << resp_bytes << "bytes" << endl; + qDebug() << "status code: " << rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString() << endl; + qDebug() << "== begin response ==" << endl << response << endl << "== end response ==" << endl; + qDebug() << "req#" << nr << " is of type " << requestMap[nr].type << endl; +#endif + // drop box error handling based on return codes + switch(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()) + { + case QDROPBOX_ERROR_BAD_INPUT: + errorState = QDropbox::BadInput; + errorText = ""; + emit errorOccured(errorState); + checkReleaseEventLoop(nr); + return; + break; + case QDROPBOX_ERROR_EXPIRED_TOKEN: + errorState = QDropbox::TokenExpired; + errorText = ""; + emit tokenExpired(); + checkReleaseEventLoop(nr); + return; + break; + case QDROPBOX_ERROR_BAD_OAUTH_REQUEST: + errorState = QDropbox::BadOAuthRequest; + errorText = ""; + emit errorOccured(errorState); + checkReleaseEventLoop(nr); + return; + break; + case QDROPBOX_ERROR_FILE_NOT_FOUND: + emit fileNotFound(); + checkReleaseEventLoop(nr); + return; + break; + case QDROPBOX_ERROR_WRONG_METHOD: + errorState = QDropbox::WrongHttpMethod; + errorText = ""; + emit errorOccured(errorState); + checkReleaseEventLoop(nr); + return; + break; + case QDROPBOX_ERROR_REQUEST_CAP: + errorState = QDropbox::MaxRequestsExceeded; + errorText = ""; + emit errorOccured(errorState); + checkReleaseEventLoop(nr); + return; + break; + case QDROPBOX_ERROR_USER_OVER_QUOTA: + errorState = QDropbox::UserOverQuota; + errorText = ""; + emit errorOccured(errorState); + checkReleaseEventLoop(nr); + return; + break; + default: + break; + } + + if(rply->error() != QNetworkReply::NoError) + { + + errorState = QDropbox::CommunicationError; + errorText = QString("%1 - %2").arg(rply->error()).arg(rply->errorString()); +#ifdef QTDROPBOX_DEBUG + qDebug() << "error " << errorState << "(" << errorText << ") in request" << endl; +#endif + emit errorOccured(errorState); + checkReleaseEventLoop(nr); + return; + } + + // ignore connection requests + if(requestMap[nr].type == QDROPBOX_REQ_CONNECT) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "- answer to connection request ignored" << endl; +#endif + removeRequestFromMap(nr); + return; + } + + bool delayed_finish = false; + int delayed_nr; + + if(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 302) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "redirection received" << endl; +#endif + // redirection handling + QUrl newlocation(rply->header(QNetworkRequest::LocationHeader).toString(), QUrl::StrictMode); +#ifdef QTDROPBOX_DEBUG + qDebug() << "new url: " << newlocation.toString() << endl; +#endif + int oldnr = nr; + nr = sendRequest(newlocation, requestMap[nr].method, 0, requestMap[nr].host); + requestMap[nr].type = QDROPBOX_REQ_REDIREC; + requestMap[nr].linked = oldnr; + return; + } + else + { + if(requestMap[nr].type == QDROPBOX_REQ_REDIREC) + { + // change values if this is the answert to a redirect + qdropbox_request redir = requestMap[nr]; + qdropbox_request orig = requestMap[redir.linked]; + requestMap[nr] = orig; + removeRequestFromMap(nr); + nr = redir.linked; + } + + // standard handling depending on message type + switch(requestMap[nr].type) + { + case QDROPBOX_REQ_CONNECT: + // was only a connect request - so drop it + break; + case QDROPBOX_REQ_RQTOKEN: + // requested a tiken + responseTokenRequest(response); + break; + case QDROPBOX_REQ_RQBTOKN: + responseBlockedTokenRequest(response); + break; + case QDROPBOX_REQ_AULOGIN: + delayed_nr = responseDropboxLogin(response, nr); + delayed_finish = true; + break; + case QDROPBOX_REQ_ACCTOKN: + responseAccessToken(response); + break; + case QDROPBOX_REQ_METADAT: + parseMetadata(response); + break; + case QDROPBOX_REQ_BMETADA: + parseBlockingMetadata(response); + break; + case QDROPBOX_REQ_BACCTOK: + responseBlockingAccessToken(response); + break; + case QDROPBOX_REQ_ACCINFO: + parseAccountInfo(response); + break; + case QDROPBOX_REQ_BACCINF: + parseBlockingAccountInfo(response); + break; + case QDROPBOX_REQ_SHRDLNK: + parseSharedLink(response); + break; + case QDROPBOX_REQ_BSHRDLN: + parseBlockingSharedLink(response); + break; + case QDROPBOX_REQ_REVISIO: + parseRevisions(response); + break; + case QDROPBOX_REQ_BREVISI: + parseBlockingRevisions(response); + break; + case QDROPBOX_REQ_DELTA: + parseDelta(response); + break; + case QDROPBOX_REQ_BDELTA: + parseBlockingDelta(response); + break; + default: + errorState = QDropbox::ResponseToUnknownRequest; + errorText = "Received a response to an unknown request"; + emit errorOccured(errorState); + break; + } + } + + if(delayed_finish) + delayMap[delayed_nr] = nr; + else + { + if(delayMap[nr]) + { + int drq = delayMap[nr]; + while(drq!=0) + { + emit operationFinished(delayMap[drq]); + delayMap.remove(drq); + drq = delayMap[drq]; + } + } + + removeRequestFromMap(nr); + emit operationFinished(nr); + } + + return; +} + +void QDropbox::networkReplyFinished(QNetworkReply *rply) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "reply finished" << endl; +#endif + int reqnr = replynrMap[rply]; + requestFinished(reqnr, rply); + rply->deleteLater(); // release memory +} + + +QString QDropbox::hmacsha1(QString baseString, QString key) +{ + int blockSize = 64; // HMAC-::hmacsha1SHA-1 block size, defined in SHA-1 standard + if (key.length() > blockSize) { // if key is longer than block size (64), reduce key length with SHA-1 compression + key = QCryptographicHash::hash(key.toLatin1(), QCryptographicHash::Sha1); + } + + QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char "6" + QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char "\" + // ascii characters 0x36 ("6") and 0x5c ("\") are selected because they have large + // Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance) + + for (int i = 0; i < key.length(); i++) { + innerPadding[i] = innerPadding[i] ^ key.toLatin1().at(i); // XOR operation between every byte in key and innerpadding, of key length + outerPadding[i] = outerPadding[i] ^ key.toLatin1().at(i); // XOR operation between every byte in key and outerpadding, of key length + } + + // result = hash ( outerPadding CONCAT hash ( innerPadding CONCAT baseString ) ).toBase64 + QByteArray total = outerPadding; + QByteArray part = innerPadding; + part.append(baseString.toLatin1()); + total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1)); + QByteArray hashed = QCryptographicHash::hash(total, QCryptographicHash::Sha1); + return hashed.toBase64(); +} + +QString QDropbox::generateNonce(qint32 length) +{ + QString clng = ""; + for(int i=0; i request #" << lastreply << " sent." << endl; +#endif + emit operationStarted(lastreply); // fire signal for operation start + return lastreply; +} + +void QDropbox::responseTokenRequest(QString response) +{ + parseToken(response); + emit requestTokenFinished(oauthToken, oauthTokenSecret); + return; +} + +int QDropbox::responseDropboxLogin(QString response, int reqnr) +{ + Q_UNUSED(reqnr); + + // extract login form + QDomDocument xml; + QString err; + int lnr, cnr; + if(!xml.setContent(response, false, &err, &lnr, &cnr)) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "invalid xml (" << lnr << "," << cnr << "): " << err << "dump:" << endl; + qDebug() << xml.toString() << endl; +#endif + return 0; + } + return 0; +} + +void QDropbox::responseAccessToken(QString response) +{ + parseToken(response); + emit accessTokenFinished(oauthToken, oauthTokenSecret); + return; +} + +QString QDropbox::signatureMethodString() +{ + QString sigmeth; + switch(oauthMethod) + { + case QDropbox::Plaintext: + sigmeth = "PLAINTEXT"; + break; + case QDropbox::HMACSHA1: + sigmeth = "HMAC-SHA1"; + break; + default: + errorState = QDropbox::UnknownAuthMethod; + errorText = QString("Authentication method %1 is unknown").arg(oauthMethod); + emit errorOccured(errorState); + return ""; + break; + } + return sigmeth; +} + +void QDropbox::parseToken(QString response) +{ + clearError(); +#ifdef QTDROPBOX_DEBUG + qDebug() << "processing token request" << endl; +#endif + + QStringList split = response.split("&"); + if(split.size() < 2) + { + errorState = QDropbox::APIError; + errorText = "The Dropbox API did not respond as expected."; + emit errorOccured(errorState); +#ifdef QTDROPBOX_DEBUG + qDebug() << "error " << errorState << "(" << errorText << ") in request" << endl; +#endif + return; + } + + if(!split.at(0).startsWith("oauth_token_secret") || + !split.at(1).startsWith("oauth_token")) + { + errorState = QDropbox::APIError; + errorText = "The Dropbox API did not respond as expected."; + emit errorOccured(errorState); +#ifdef QTDROPBOX_DEBUG + qDebug() << "error " << errorState << "(" << errorText << ") in request" << endl; +#endif + return; + } + + QStringList tokenSecretList = split.at(0).split("="); + oauthTokenSecret = tokenSecretList.at(1); + QStringList tokenList = split.at(1).split("="); + oauthToken = tokenList.at(1); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "token = " << oauthToken << endl << "token_secret = " << oauthTokenSecret << endl; +#endif + + emit tokenChanged(oauthToken, oauthTokenSecret); + return; +} + +void QDropbox::parseAccountInfo(QString response) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "== account info ==" << response << "== account info end =="; +#endif + + QDropboxJson json; + json.parseString(response); + _tempJson.parseString(response); + if(!json.isValid()) + { + errorState = QDropbox::APIError; + errorText = "Dropbox API did not send correct answer for account information."; +#ifdef QTDROPBOX_DEBUG + qDebug() << "error: " << errorText << endl; +#endif + emit errorOccured(errorState); + return; + } + + emit accountInfoReceived(response); + return; +} + +void QDropbox::parseSharedLink(QString response) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "== shared link ==" << response << "== shared link end =="; +#endif + + //QDropboxJson json; + //json.parseString(response); + _tempJson.parseString(response); + if(!_tempJson.isValid()) + { + errorState = QDropbox::APIError; + errorText = "Dropbox API did not send correct answer for file/directory shared link."; +#ifdef QTDROPBOX_DEBUG + qDebug() << "error: " << errorText << endl; +#endif + emit errorOccured(errorState); + stopEventLoop(); + return; + } + emit sharedLinkReceived(response); +} + +void QDropbox::parseMetadata(QString response) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "== metadata ==" << response << "== metadata end =="; +#endif + + QDropboxJson json; + json.parseString(response); + _tempJson.parseString(response); + if(!json.isValid()) + { + errorState = QDropbox::APIError; + errorText = "Dropbox API did not send correct answer for file/directory metadata."; +#ifdef QTDROPBOX_DEBUG + qDebug() << "error: " << errorText << endl; +#endif + emit errorOccured(errorState); + stopEventLoop(); + return; + } + + emit metadataReceived(response); + return; +} + +void QDropbox::parseDelta(QString response) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "== metadata ==" << response << "== metadata end =="; +#endif + + QDropboxJson json; + json.parseString(response); + _tempJson.parseString(response); + if(!json.isValid()) + { + errorState = QDropbox::APIError; + errorText = "Dropbox API did not send correct answer for delta."; +#ifdef QTDROPBOX_DEBUG + qDebug() << "error: " << errorText << endl; +#endif + emit errorOccured(errorState); + stopEventLoop(); + return; + } + + emit deltaReceived(response); + return; +} + +void QDropbox::setKey(QString key) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "appKey = " << key; +#endif + _appKey = key; +} + +QString QDropbox::key() +{ + return _appKey; +} + +void QDropbox::setSharedSecret(QString sharedSecret) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "appSharedSecret = " << sharedSecret; +#endif + _appSharedSecret = sharedSecret; +} + +QString QDropbox::sharedSecret() +{ + return _appSharedSecret; +} + +void QDropbox::setToken(QString t) +{ + oauthToken = t; +} + +QString QDropbox::token() +{ + return oauthToken; +} + +void QDropbox::setTokenSecret(QString s) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "oauthTokenSecret = " << oauthTokenSecret; +#endif + oauthTokenSecret = s; +} + +QString QDropbox::tokenSecret() +{ + return oauthTokenSecret; +} + +QString QDropbox::appKey() +{ + return _appKey; +} + +QString QDropbox::appSharedSecret() +{ + return _appSharedSecret; +} + +QString QDropbox::apiVersion() +{ + return _version; +} + +int QDropbox::requestToken(bool blocking) +{ + clearError(); + QString sigmeth = signatureMethodString(); + + timestamp = QDateTime::currentMSecsSinceEpoch()/1000; + nonce = generateNonce(128); + + QUrl url; + url.setUrl(apiurl.toString()); + url.setPath(QString("/%1/oauth/request_token").arg(_version.left(1))); + + QUrlQuery query; + query.addQueryItem("oauth_consumer_key",_appKey); + query.addQueryItem("oauth_nonce", nonce); + query.addQueryItem("oauth_signature_method", sigmeth); + query.addQueryItem("oauth_timestamp", QString::number(timestamp)); + query.addQueryItem("oauth_version", _version); + + QString signature = oAuthSign(url); + query.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); + + url.setQuery(query); +#ifdef QTDROPBOX_DEBUG + qDebug() << "request token url: " << url.toString() << endl << "sig: " << signature << endl; + qDebug() << "sending request " << url.toString() << " to " << apiurl.toString() << endl; +#endif + + int reqnr = sendRequest(url); + if(blocking) + { + requestMap[reqnr].type = QDROPBOX_REQ_RQBTOKN; + startEventLoop(); + } + else + requestMap[reqnr].type = QDROPBOX_REQ_RQTOKEN; + + return reqnr; +} + +bool QDropbox::requestTokenAndWait() +{ + requestToken(true); + return (error() == NoError); +} + +int QDropbox::authorize(QString email, QString pwd) +{ + QUrl dropbox_authorize; + dropbox_authorize.setPath(QString("/%1/oauth/authorize") + .arg(_version.left(1))); +#ifdef QTDROPBOX_DEBUG + qDebug() << "oauthToken = " << oauthToken << endl; +#endif + + QUrlQuery query; + query.addQueryItem("oauth_token", oauthToken); + dropbox_authorize.setQuery(query); + int reqnr = sendRequest(dropbox_authorize, "GET", 0, "www.dropbox.com"); + requestMap[reqnr].type = QDROPBOX_REQ_AULOGIN; + mail = email; + password = pwd; + return reqnr; +} + +QUrl QDropbox::authorizeLink() +{ + QUrl link; + link.setScheme("https"); + link.setHost("www.dropbox.com"); + link.setPath(QString("/%1/oauth/authorize") + .arg(_version.left(1))); + + QUrlQuery query; + query.addQueryItem("oauth_token", oauthToken); + link.setQuery(query); + return link; +} + +int QDropbox::requestAccessToken(bool blocking) +{ + clearError(); + + QUrl url; + url.setUrl(apiurl.toString()); + + QUrlQuery query; + query.addQueryItem("oauth_consumer_key",_appKey); + query.addQueryItem("oauth_nonce", nonce); + query.addQueryItem("oauth_signature_method", signatureMethodString()); + query.addQueryItem("oauth_timestamp", QString::number(timestamp)); + query.addQueryItem("oauth_token", oauthToken); + query.addQueryItem("oauth_version", _version); + + url.setPath(QString("/%1/oauth/access_token"). + arg(_version.left(1))); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "requestToken = " << query.queryItemValue("oauth_token"); +#endif + + QString signature = oAuthSign(url); + query.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); + + url.setQuery(query); + + QString dataString = url.toString(QUrl::RemoveScheme|QUrl::RemoveAuthority| + QUrl::RemovePath).mid(1); +#ifdef QTDROPBOX_DEBUG + qDebug() << "dataString = " << dataString << endl; +#endif + + QByteArray postData; + postData.append(dataString.toUtf8()); + + QUrl xQuery(url.toString(QUrl::RemoveQuery)); + int reqnr = sendRequest(xQuery, "POST", postData); + + if(blocking) + { + requestMap[reqnr].type = QDROPBOX_REQ_BACCTOK; + startEventLoop(); + } + else + requestMap[reqnr].type = QDROPBOX_REQ_ACCTOKN; + + return reqnr; +} + +bool QDropbox::requestAccessTokenAndWait() +{ + requestAccessToken(true); +#ifdef QTDROPBOX_DEBUG + qDebug() << "requestTokenAndWait() finished: error = " << error() << endl; +#endif + return (error() == NoError); +} + +void QDropbox::requestAccountInfo(bool blocking) +{ + clearError(); + + timestamp = QDateTime::currentMSecsSinceEpoch()/1000; + + QUrl url; + url.setUrl(apiurl.toString()); + + QUrlQuery urlQuery; + urlQuery.addQueryItem("oauth_consumer_key",_appKey); + urlQuery.addQueryItem("oauth_nonce", nonce); + urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); + urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); + urlQuery.addQueryItem("oauth_token", oauthToken); + urlQuery.addQueryItem("oauth_version", _version); + + QString signature = oAuthSign(url); + urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); + + url.setPath(QString("/%1/account/info").arg(_version.left(1))); + url.setQuery(urlQuery); + + int reqnr = sendRequest(url); + if(blocking) + { + requestMap[reqnr].type = QDROPBOX_REQ_BACCINF; + startEventLoop(); + } + else + requestMap[reqnr].type = QDROPBOX_REQ_ACCINFO; + return; +} + +QDropboxAccount QDropbox::requestAccountInfoAndWait() +{ + requestAccountInfo(true); + QDropboxAccount a(_tempJson.strContent(), this); + _account = a; + return _account; +} + +void QDropbox::parseBlockingAccountInfo(QString response) +{ + clearError(); + parseAccountInfo(response); + stopEventLoop(); + return; +} + +void QDropbox::requestMetadata(QString file, bool blocking) +{ + clearError(); + + timestamp = QDateTime::currentMSecsSinceEpoch()/1000; + + QUrl url; + url.setUrl(apiurl.toString()); + + QUrlQuery urlQuery; + urlQuery.addQueryItem("oauth_consumer_key",_appKey); + urlQuery.addQueryItem("oauth_nonce", nonce); + urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); + urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); + urlQuery.addQueryItem("oauth_token", oauthToken); + urlQuery.addQueryItem("oauth_version", _version); + + QString signature = oAuthSign(url); + urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); + + url.setQuery(urlQuery); + url.setPath(QString("/%1/metadata/%2").arg(_version.left(1), file)); + + int reqnr = sendRequest(url); + if(blocking) + { + requestMap[reqnr].type = QDROPBOX_REQ_BMETADA; + startEventLoop(); + } + else + requestMap[reqnr].type = QDROPBOX_REQ_METADAT; + //QDropboxFileInfo fi(_tempJson.strContent(), this); + return; +} + +QDropboxFileInfo QDropbox::requestMetadataAndWait(QString file) +{ + requestMetadata(file, true); + QDropboxFileInfo fi(_tempJson.strContent(), this); + return fi; +} + +void QDropbox::requestSharedLink(QString file, bool blocking) +{ + clearError(); + + QUrl url; + url.setUrl(apiurl.toString()); + + QUrlQuery urlQuery; + urlQuery.addQueryItem("oauth_consumer_key",_appKey); + urlQuery.addQueryItem("oauth_nonce", nonce); + urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); + urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); + urlQuery.addQueryItem("oauth_token", oauthToken); + urlQuery.addQueryItem("oauth_version", _version); + + QString signature = oAuthSign(url); + urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); + + url.setPath(QString("/%1/shares/%2").arg(_version.left(1), file)); + url.setQuery(urlQuery); + + int reqnr = sendRequest(url); + if(blocking) + { + requestMap[reqnr].type = QDROPBOX_REQ_BSHRDLN; + startEventLoop(); + } + else + requestMap[reqnr].type = QDROPBOX_REQ_SHRDLNK; + + return; +} + +QUrl QDropbox::requestSharedLinkAndWait(QString file) +{ + requestSharedLink(file,true); + QDropboxJson json(_tempJson.strContent()); + QString urlString = json.getString("url"); + return QUrl(urlString); +} + +void QDropbox::requestDelta(QString cursor, QString path_prefix, bool blocking) +{ + clearError(); + + timestamp = QDateTime::currentMSecsSinceEpoch()/1000; + + QUrl url; + url.setUrl(apiurl.toString()); + + QUrlQuery urlQuery; + urlQuery.addQueryItem("oauth_consumer_key",_appKey); + urlQuery.addQueryItem("oauth_nonce", nonce); + urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); + urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); + urlQuery.addQueryItem("oauth_token", oauthToken); + urlQuery.addQueryItem("oauth_version", _version); + if(cursor.length() > 0) + { + urlQuery.addQueryItem("cursor", cursor); + } + if(path_prefix.length() > 0) + { + urlQuery.addQueryItem("path_prefix", path_prefix); + } + + QString signature = oAuthSign(url); + urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); + + url.setQuery(urlQuery); + url.setPath(QString("/%1/delta").arg(_version.left(1))); + + QString dataString = url.toString(QUrl::RemoveScheme|QUrl::RemoveAuthority| + QUrl::RemovePath).mid(1); +#ifdef QTDROPBOX_DEBUG + qDebug() << "dataString = " << dataString << endl; +#endif + + QByteArray postData; + postData.append(dataString.toUtf8()); + + QUrl xQuery(url.toString(QUrl::RemoveQuery)); + int reqnr = sendRequest(xQuery, "POST", postData); + + if(blocking) + { + requestMap[reqnr].type = QDROPBOX_REQ_BDELTA; + startEventLoop(); + } + else + requestMap[reqnr].type = QDROPBOX_REQ_DELTA; + return; +} + +QDropboxDeltaResponse QDropbox::requestDeltaAndWait(QString cursor, QString path_prefix) +{ + requestDelta(cursor, path_prefix, true); + QDropboxDeltaResponse r(_tempJson.strContent()); + + return r; +} + +void QDropbox::startEventLoop() +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropbox::startEventLoop()" << endl; +#endif + if(_evLoop == NULL) + _evLoop = new QEventLoop(this); + _evLoop->exec(); + return; +} + +void QDropbox::stopEventLoop() +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropbox::stopEventLoop()" << endl; +#endif + if(_evLoop == NULL) + return; +#ifdef QTDROPBOX_DEBUG + qDebug() << "loop ended" << endl; +#endif + _evLoop->exit(); + return; +} + +void QDropbox::responseBlockedTokenRequest(QString response) +{ + clearError(); + responseTokenRequest(response); + stopEventLoop(); + return; +} + +void QDropbox::responseBlockingAccessToken(QString response) +{ + clearError(); + responseAccessToken(response); + stopEventLoop(); + return; +} + +void QDropbox::parseBlockingMetadata(QString response) +{ + clearError(); + parseMetadata(response); + stopEventLoop(); + return; +} + +void QDropbox::parseBlockingDelta(QString response) +{ + clearError(); + parseDelta(response); + stopEventLoop(); + return; +} + +void QDropbox::parseBlockingSharedLink(QString response) +{ + clearError(); + parseSharedLink(response); + stopEventLoop(); + return; +} + +// check if the event loop has to be stopped after a blocking request was sent +void QDropbox::checkReleaseEventLoop(int reqnr) +{ + switch(requestMap[reqnr].type) + { + case QDROPBOX_REQ_RQBTOKN: + case QDROPBOX_REQ_BACCTOK: + case QDROPBOX_REQ_BACCINF: + case QDROPBOX_REQ_BMETADA: + case QDROPBOX_REQ_BREVISI: + stopEventLoop(); // release local event loop + break; + default: + break; + } + return; +} + +void QDropbox::requestRevisions(QString file, int max, bool blocking) +{ + clearError(); + + QUrl url; + url.setUrl(apiurl.toString()); + + QUrlQuery urlQuery; + urlQuery.addQueryItem("oauth_consumer_key",_appKey); + urlQuery.addQueryItem("oauth_nonce", nonce); + urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); + urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); + urlQuery.addQueryItem("oauth_token", oauthToken); + urlQuery.addQueryItem("oauth_version", _version); + urlQuery.addQueryItem("rev_limit", QString::number(max)); + + QString signature = oAuthSign(url); + urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); + + url.setPath(QString("/%1/revisions/%2").arg(_version.left(1), file)); + url.setQuery(urlQuery); + + int reqnr = sendRequest(url); + if(blocking) + { + requestMap[reqnr].type = QDROPBOX_REQ_BREVISI; + startEventLoop(); + } + else + requestMap[reqnr].type = QDROPBOX_REQ_REVISIO; + + return; +} + +QList QDropbox::requestRevisionsAndWait(QString file, int max) +{ + clearError(); + requestRevisions(file, max, true); + QList revisionList; + + if(errorState != QDropbox::NoError || !_tempJson.isValid()) + return revisionList; + + QStringList responseList = _tempJson.getArray(); + for(int i=0; i +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef QTDROPBOX_DEBUG +#include +#endif + +#include "qtdropbox_global.h" +#include "qdropboxjson.h" +#include "qdropboxaccount.h" +#include "qdropboxfileinfo.h" +#include "qdropboxdeltaresponse.h" + +typedef int qdropbox_request_type; + +const qdropbox_request_type QDROPBOX_REQ_INVALID = 0x00; +const qdropbox_request_type QDROPBOX_REQ_CONNECT = 0x01; +const qdropbox_request_type QDROPBOX_REQ_RQTOKEN = 0x02; +const qdropbox_request_type QDROPBOX_REQ_AULOGIN = 0x03; +const qdropbox_request_type QDROPBOX_REQ_REDIREC = 0x04; +const qdropbox_request_type QDROPBOX_REQ_ACCTOKN = 0x05; +const qdropbox_request_type QDROPBOX_REQ_ACCINFO = 0x06; +const qdropbox_request_type QDROPBOX_REQ_RQBTOKN = 0x07; +const qdropbox_request_type QDROPBOX_REQ_BACCTOK = 0x08; +const qdropbox_request_type QDROPBOX_REQ_METADAT = 0x09; +const qdropbox_request_type QDROPBOX_REQ_BACCINF = 0x0A; +const qdropbox_request_type QDROPBOX_REQ_BMETADA = 0x0B; +const qdropbox_request_type QDROPBOX_REQ_SHRDLNK = 0x0C; +const qdropbox_request_type QDROPBOX_REQ_BSHRDLN = 0x0D; +const qdropbox_request_type QDROPBOX_REQ_REVISIO = 0x0E; +const qdropbox_request_type QDROPBOX_REQ_BREVISI = 0x0F; +const qdropbox_request_type QDROPBOX_REQ_DELTA = 0x10; +const qdropbox_request_type QDROPBOX_REQ_BDELTA = 0x11; + +//! Internally used struct to handle network requests sent from QDropbox +/*! + This structure is used internally by QDropbox. It is used to connect network + requests that are sent to the Dropbox API server with the asynchronous queries + made to the QtDropbox API. + */ +struct qdropbox_request{ + qdropbox_request_type type; //!< Type of the request + QString method; //!< Used method to send the request (POST/GET) + QString host; //!< Host that received the request + int linked; //!< ID of any linked request (for forwarded requests) +}; + +//! The main entry point of QtDropbox API. Provides various connection facilities and general information. +/*! + QDropbox provides you with all utilities required to connect to any Dropbox account. For purposes of + connection this class provides an asynchronous, signal and slot based, interface. + +

Connection to new account

+ If you want to initiate a new connection to an account that did not authorize your application to + access it you use requestToken() and then you have to call requestAccessToken as soon as the signal + requestTokenFinished() is emitted. + + If the token you are using is not authorized or is expired the signal tokenExpired() will be emitted. + In this case you have to prompt the user for reauthorization of your application. A link to the + authoriziation interface of Dropbox is provided by the function authorizeLink(). This API does not + automatise the authorization process as this feature is not provided by Dropbox. So you have to + display the link in a web browser. + + To reconnect to an account on a later use of your application you have to save the token and token + secret obtained after requestAccessToken(). These values are provided by the functions token() and + tokenSecret(). + +

Connection to authorized account

+ If the account you want to connect to has already authorized your application and you already + have obtained an authorized token and token secret you will use a shortcut to connect. You have + to set the token and token secret you obtained by a prior use of the API with the according + functions setToken() and setTokenSecret(). You do not need to invoke requestToken() or + requestAccessToken(). These functions are only called at first use or if no token and token secret + are available. + + Should the token or token secret you are using be already expired the signal tokenExpired() + will be emitted. In that case you have to prompt the user for reauthorization. + +

Using blocking requests

+ Every function that requests information from the server has a blocking and non-blocking function. + A blocking request will wait until the server has responded to your query before returning while a + non-blocking request will return immediately. Usually a blocking function directly returns a result + and a non-blocking function will emit an according signal as the request has finished. + + \warning The use of a blocking function will reset the current error flag. So after calling a blocking + function the function error() will return QDropbox::NoError if no error occurred or the error that + occurred when processing the blocking request. + + \bug HMAC-SHA1 authentication is not working (does not have to be in 1.0) + + */ +class QTDROPBOXSHARED_EXPORT QDropbox : public QObject +{ + Q_OBJECT +public: + //! Method for oAuth authentication + /*! These methods are used for authentication with the oAuth protocol + \bug Currently HMAC-SHA1 encoding does not work. (does not have to be in 1.0) + */ + enum OAuthMethod{ + Plaintext, /*!< Plaintext authentication, HTTPS is automatically used. */ + HMACSHA1 /*!< HMAC-SHA1 encoded authentication */ + }; + + //! Error state of QDropbox + /*! + This enum is used to determine the current error state of the Dropbox connection. + If an error occurs it can be access by using the error() function. + */ + enum Error{ + NoError, /*!< No error occured */ + CommunicationError, /*!< Error while communicating with the server */ + VersionNotSupported, /*!< The used Dropbox API version is not supported by the server */ + UnknownAuthMethod, /*!< The used authentication method is not supported */ + ResponseToUnknownRequest, /*!< QtDropbox API received an unexpected response from the server */ + APIError, /*!< The remote server violated the Dropbox REST API protocol by sending wrong data. */ + UnknownQueryMethod, /*!< Internal error. The API tried to send with a not supported HTTP Query method. */ + BadInput, /*!< A wrong input parameter was sent to the Dropbox REST API. Dropbox API error 400*/ + BadOAuthRequest, /*!< A wrong oAuth request was received by the server (expired time stamp, + bad nonce etc.). Dropbox API error 403 */ + WrongHttpMethod, /*!< The REST API request used a wrong HTTP method. Dropbox API error 405 */ + MaxRequestsExceeded, /*!< The maximum amount of requests was exceeded. Dropbox API error 503 */ + UserOverQuota, /*!< The user exceeded his or her storage quota. Dropbox API error 507 */ + TokenExpired /*!< The access token has expired. Dropbox API error 401*/ + }; + + /*! + This constructor creates an unconfigured instance of QDropbox. The server URL is set to api.dropbpx.com, + the REST API version 1.0 is used (currently the only one supported) and the authentication method is + QDropbox::Plaintext. + + You need to set your API key and shared secret by using setKey(QString key) and setSharedSecret(QString sharedSecret). + + \param parent The parent object QDropbox depends on. + */ + explicit QDropbox(QObject *parent = 0); + + /*! + This constructor initializes QDropbox with your key and shared secret. The selected authentication method and + API URL will be set as well. + + \param key API key of your application (provided by Dropbox) + \param sharedSecret Your app's secret (provided by Dropbox + \param method Used authentication method + \param url URL of the API server + \param parent Parent object of QDropbox + + */ + explicit QDropbox(QString key, QString sharedSecret, + OAuthMethod method = QDropbox::Plaintext, + QString url = "api.dropbox.com", QObject *parent = 0); + + /*! + If an error occured you can access the last error code by using this function. + */ + Error error(); + + /*! + After an error occured you'll get a description of the last error by using this + function. + */ + QString errorString(); + + /*! + Use this function if you want to change the URL of the API server you are + accessing. This won't usually be necessary as QtDropbox automatically chooses the + official Dropbox API server according to the request. This is usually + http://api.dropbox.com + + \param url URL of the API server. Usually this is api.dropbox.com + */ + void setApiUrl(QString url); + + /*! + Provides you with the address of the API server. + */ + QString apiUrl(); + + /*! + This function is used to changed the used authentication method. You can use it + even if you want to change the authentication method during an already existing + connection. + + \param m Authentication method. + */ + void setAuthMethod(OAuthMethod m); + + /*! + Returns the currently used authentication method. + */ + OAuthMethod authMethod(); + + /*! + Set the version of the Dropbox API to be used. 1.0 is default. Usually you don't + need to use this function as currently only version 1.0 is supported by Dropbox. + + \param apiversion Version string of the API + */ + void setApiVersion(QString apiversion); + + /*! + Returns the currently used API version. + */ + QString apiVersion(); + + /*! + Use this function to set your applications API key if you did not already when + using the constructor. The API key is provided when you register your application + with Dropbox. + + \param key API key of your application. + */ + void setKey(QString key); + + /*! + Returns the used API key of the application. + */ + QString key(); + + /*! + Use this function to set your applications API secret if you did not when using + the constructor. The API secret is provided when you register your application + with Dopbox. + + \param sharedSecret API secret of your application + */ + void setSharedSecret(QString sharedSecret); + + /*! + Returns the used API secret. + */ + QString sharedSecret(); + + /*! + If you have an already verified and authorized token to communicate with the + Dropbox API you can set it by using this function. By setting a token you + do not need to use requestToken() and requestAccessToken() to iniate a + connection. + + \param t token string + */ + void setToken(QString t); + /*! + Returns the used token. This function may be used to get an authorized token + after iniating a new connection (e.g. to save it for later use). + */ + QString token(); + + /*! + If you have an already verified and authorized token and token secret to + communicate with the Dropbox API you can set the secret by using this + function. By setting token and secret you do not need to use requestToken() + and requestAccessToken() to iniaite a connection. + + \param s token secret string + */ + void setTokenSecret(QString s); + /*! + Returns the currently used token secret. This function may be used to get an + authorized token secret after iniating a new connection (e.g. to save it). + */ + QString tokenSecret(); + + /*! + Returns the Dropbox API key that is used. + */ + QString appKey(); + + /*! + Returns the currently used Dropbox API shared secret of your application. + */ + QString appSharedSecret(); + + /*! + This functions requests a request token that will be valid for the rest of the + authentication process. When the token is received the signal + requestTokenFinished(...) will be emitted. + + After the request token was obtained you can continue with the authentication by + prompting the user to authorize your application. + + It is not necessary to call this function when the user already authenticated + your application. In this case just provide the token and token secret received + by using requestAccessToken() to QDropbox. + + \param blocking internal only indidicates if the call should block + */ + int requestToken(bool blocking = false); + + /*! + This functions works exactly like requestToken(...) but will block until the + answer (e.g. the token or an error) has arrived from the server. + + \return true if the token was received successfully or false if an + error occured + */ + bool requestTokenAndWait(); + /*! + This function should do automatic authorization. + \warning This functions is currently not supported by the Dropbox API. You need + the user to authenticate by using the URL provided by authorizeLink(). + */ + int authorize(QString mail, QString password); + /*! + Returns an URL the user will have to use to authorize the connection to your + application. You may use that link in connection with QDesktopServices::openUrl(...) + to open a web browser with the returned URL. + */ + QUrl authorizeLink(); + + /*! + This function should be invoked after the user authorized your application. It + retrieves an access token from the Dropbox API that you'll have to use to access + Dropbox services. + + \param blocking internal only indidicates if the call should block + */ + int requestAccessToken(bool blocking = false); + + /*! + This functions works exactly like requestAccessToken(...) but blocks until the answer + from the server was received. + + \return true if the access token could be requested without error or false + if an error occured. + */ + bool requestAccessTokenAndWait(); + + /*! + By using this function the account information of the connected user will be + retrieved. When the account information was obtained the signal QDropbox::accountInfoReceived() + will be emitted. + + \param blocking internal only indidicates if the call should block + */ + void requestAccountInfo(bool blocking = false); + + /*! + Works exactly like accountInfo() but blocks until the data was received from the server. + It returns an instance of QDropboxAccount containing the requested data. You do not have + to react on the accountInfoReceived() signal when using this function. + */ + QDropboxAccount requestAccountInfoAndWait(); + + /*! + This function is public for internal QtDropbox API use. It is used to sign + requests to the Dropbox API and thus is required by most other QtDropbox + classes for their requests. + + \param base Complete unsigned request URL + \param method Request method (currently only POST or GET) + */ + QString oAuthSign(QUrl base, QString method = "GET"); + + /*! + Returns the authentication method as string. + */ + QString signatureMethodString(); + + /*! + This functions generates and returns a nonce with the given length. The + generated nonce is a random hex based string. + + \param length Length of the nonce. + */ + static QString generateNonce(qint32 length); + + /*! + Get the file metadata for a file speciified by the filename. When the Dropbox + API server answeres the request the signal QDropbox::metadataReceived() will be + emitted. + + \param file The absoulte path of the file (e.g. /dropbox/test.txt) + \param blocking internal only indidicates if the call should block + */ + void requestMetadata(QString file, bool blocking = false); + + /*! + Works exactly like QDropbox::requestMetadata() but blocks until the metadata + was received from the Dropbox server and returns an instance of QDropboxFileInfo + that contains the metadata of the requested file. + + \param file The absoulte path of the file (e.g. /dropbox/test.txt) + */ + QDropboxFileInfo requestMetadataAndWait(QString file); + + /*! + * \brief Creates and returns a Dropbox link to files or folders users can use to view a preview of the file in a web browser. + * \param path from the file i.e. /dropbox/hello.txt + * \param blocking + */ + void requestSharedLink(QString file, bool blocking = false); + + /*! + * \brief Works exactly like QDropbox::requestSharedLink() but blocks until link + * was receivied from the Dropbox Server. + * \param path from the file i.e. /dropbox/hello.txt + * \return Url to the file + */ + QUrl requestSharedLinkAndWait(QString file); + + /*! + Resets the last error. Use this when you reacted on an error to delete the error flag. + */ + void clearError(); + + /*! + Requests the latest revisions of a file. When the request is answered by the Dropbox server + the signal QDropbox::revisionsReceived() will be emitted. + + \param file The absoulte path of the file (e.g. /dropbox/test.txt) + \param max Defines the maximum amount of revisions to be requested. + \param blocking internal only indidicates if the call should block + */ + void requestRevisions(QString file, int max = 10, bool blocking = false); + + /*! + Works exactly like QDropbox::requestRevisions but blocks until the list of revisisions was + received. + + \param file The absoulte path of the file (e.g. /dropbox/test.txt) + \param max Defines the maximum amount of revisions to be requested. + */ + QList requestRevisionsAndWait(QString file, int max = 10); + + + /*! + \brief Produces a list of delta entries. When the request is answered by the Dropbox server + the signal QDropbox::deltaEntriesReceived() will be emitted. + + \param cursor A string used to keep track of current delta state. + \param path_prefix If non-empty, only include entries with given prefix. + + */ + void requestDelta(QString cursor, QString path_prefix, bool blocking = false); + + /*! + \brief Works exactly like QDropbox::requestDelta but blocks until the list of delta + entries was received. + + \param cursor A string used to keep track of current delta state. + \param path_prefix If non-empty, only includes entries with given prefix. + + \return a QDropboxDeltaResponse representing the API response. + + */ + QDropboxDeltaResponse requestDeltaAndWait(QString cursor, QString path_prefix); + + /*! + \brief Provides information about a request. + + This function can be used if you wish to obtain further information regarding a request. + It provides technical information for requests so it is mostly about debugging information. + + Requesting information about a request number that does not exist will return invalid information. + + Requesting information on a request that has been finished already will return an invalid record. + + \param rqnr number of the request + */ + qdropbox_request requestInfo(int rqnr); + + /*! + \brief For debugging: Save finished requests so information can be requested on them. + + This function is for debugging errors. When the setting is changed to true records of already + finished requests to Dropbox will be saved. Usually they are deleted as soon as they are + processed. Saving them will allow you to use requestInfo(...) on already finished requests. + + Activating this setting may have an impact about long-time performance and used memory. + + Old records will not be deleted when the setting is turned off! + + \param save set to true if you want to persist request information + */ + void setSaveFinishedRequests(bool save); + + /*! + \brief Indicates if information about finished requests is to be persisted. + */ + bool saveFinishedRequests(); + +signals: + /*! + This signal is emitted whenever an error occurs. The error is passed + as parameter to the slot. To retrieve descriptive information about + the error use errorString(). + + \param errorcode The occured error. + */ + void errorOccured(QDropbox::Error errorcode); + /*! + Emitted when the used token is expired. Reauthorize the user connection + by prompting the URL provided by authorizeUrl() to your user to reauthorize. + */ + void tokenExpired(); + /*! + Should never be emitted by QDropbox as there is no functionality that accesses + files in QDropbox but all implemented in QDropboxFile. + */ + void fileNotFound(); + + /*! + QDropbox uses an operation based asynchronous interface for reacting to messages. + This signal is emitted whenever a request to the Dropbox API is finished. + + \param requestnr Number of the finished request. + */ + void operationFinished(int requestnr); + + /*! + When an asynchronous operation (actually any operation) that requests or transfers + information from or to Dropbox is started this signal is emitted. The passed + request number can be used to link operations with the operationFinished(...) signal. + + \param requestnr number of the started request. + */ + void operationStarted(int requestnr); + + /*! + This signal is emitted when the function requestToken() is finished and a + token and token scret (valid for authorization only) is received. + + \param token Temporary token + \param secret Temporary token secret + */ + void requestTokenFinished(QString token, QString secret); + /*! + This signal is emitted when the function requestAccessToken() is finished and + a valid and authorized token used for the connection was received. + + \param token Token used for the connection to Dropbox + \param secret Secret used for the connection to Dropbox + */ + void accessTokenFinished(QString token, QString secret); + /*! + Emitted whenever the token changes. + + \param token New token. + \param secret New secret. + */ + void tokenChanged(QString token, QString secret); + + /*! + Emitted when account information was received. Only relevant for non-blocking + use of accountInfo(). + + \param accountJson JSON that contains the account information data. + */ + void accountInfoReceived(QString accountJson); + + /*! + Emitted when metadata information about a file or directory was received. This will + only be relevant for non-blocking use of metadata(...); + + \param metadataJson JSON string that contains the metadata information + */ + void metadataReceived(QString metadataJson); + + /*! + Emmited when shared link was received. Only relevant for non-blocking use of sharedLink() + \param sharedLinkJson string than contains the share link information. + */ + void sharedLinkReceived(QString sharedLink); + + /*! + Emitted when revisions of a file were received. Only relevant for non-blocking use + of requestRevisions(). + */ + void revisionsReceived(QString revisionJson); + + /*! + Emitted when a delta response is received. + */ + void deltaReceived(QString deltaJson); + +public slots: + +private slots: + void requestFinished(int nr, QNetworkReply* rply); + void networkReplyFinished(QNetworkReply* rply); + +private: + enum { + SHA1_DIGEST_LENGTH = 20, + SHA1_BLOCK_SIZE = 64, + HMAC_BUF_LEN = 4096 + } ; + + QNetworkAccessManager conManager; + + Error errorState; + QString errorText; + + QString _appKey; + QString _appSharedSecret; + + QUrl apiurl; + QString nonce; + long timestamp; + OAuthMethod oauthMethod; + QString _version; + + QString oauthToken; + QString oauthTokenSecret; + + QMap replynrMap; + int lastreply; + QMap requestMap; + QMap delayMap; + + QString mail; + QString password; + + // for blocked functions + QEventLoop *_evLoop; + void startEventLoop(); + void stopEventLoop(); + + // temporary memory + QDropboxJson _tempJson; + + QDropboxAccount _account; + + // indicates wether finished request shall be saved for debugging + // mind the possible performance impact! + bool _saveFinishedRequests; + + QString hmacsha1(QString key, QString baseString); + void prepareApiUrl(); + int sendRequest(QUrl request, QString type = "GET", QByteArray postdata = 0, QString host = ""); + void responseTokenRequest(QString response); + void responseBlockedTokenRequest(QString response); + int responseDropboxLogin(QString response, int reqnr); + void responseAccessToken(QString response); + void responseBlockingAccessToken(QString response); + void parseToken(QString response); + void parseAccountInfo(QString response); + void parseSharedLink(QString response); + void checkReleaseEventLoop(int reqnr); + void parseMetadata(QString response); + void parseBlockingAccountInfo(QString response); + void parseBlockingMetadata(QString response); + void parseBlockingSharedLink(QString response); + void parseRevisions(QString response); + void parseBlockingRevisions(QString response); + void parseDelta(QString response); + void parseBlockingDelta(QString response); + void removeRequestFromMap(int rqnr); +}; + +#endif // QDROPBOX_H diff --git a/src/third_party/QtDropbox/src/qdropboxaccount.cpp b/src/third_party/QtDropbox/src/qdropboxaccount.cpp new file mode 100644 index 0000000..1cef98b --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxaccount.cpp @@ -0,0 +1,146 @@ +#include "qdropboxaccount.h" + +QDropboxAccount::QDropboxAccount(QObject *parent) : + QDropboxJson(parent) +{ + _quotaShared = 0; + _quota = 0; + _quotaNormal = 0; + _uid = 0; +} + +QDropboxAccount::QDropboxAccount(QString jsonString, QObject *parent) : + QDropboxJson(jsonString, parent) +{ + _init(); +} + +QDropboxAccount::QDropboxAccount(const QDropboxAccount& other) : + QDropboxJson() +{ + copyFrom(other); +} + +void QDropboxAccount::_init() +{ + if(!isValid()) + { + valid = false; + return; + } + + if(!hasKey("referral_link") || + !hasKey("display_name") || + !hasKey("uid") || + !hasKey("country") || + !hasKey("quota_info") || + !hasKey("email")) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "json invalid 1" << endl; +#endif + valid = false; + return; + } + + QDropboxJson* quota = getJson("quota_info"); + if(!quota->hasKey("shared") || + !quota->hasKey("quota") || + !quota->hasKey("normal")) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "json invalid 2" << endl; +#endif + valid = false; + return; + } + + _referralLink.setUrl(getString("referral_link"), QUrl::StrictMode); + _displayName = getString("display_name"); + _uid = getInt("uid"); + _country = getString("country"); + _email = getString("email"); + + _quotaShared = quota->getUInt("shared", true); + _quota = quota->getUInt("quota", true); + _quotaNormal = quota->getUInt("normal", true); + + valid = true; + +#ifdef QTDROPBOX_DEBUG + qDebug() << "== account data ==" << endl; + qDebug() << "reflink: " << _referralLink << endl; + qDebug() << "displayname: " << _displayName << endl; + qDebug() << "uid: " << _uid << endl; + qDebug() << "country: " << _country << endl; + qDebug() << "email: " << _email << endl; + qDebug() << "quotaShared: " << _quotaShared << endl; + qDebug() << "quotaNormal: " << _quotaNormal << endl; + qDebug() << "quotaUsed: " << _quota << endl; + qDebug() << "== account data end ==" << endl; +#endif + return; +} + +QUrl QDropboxAccount::referralLink() const +{ + return _referralLink; +} + +QString QDropboxAccount::displayName() const +{ + return _displayName; +} + +qint64 QDropboxAccount::uid() const +{ + return _uid; +} + +QString QDropboxAccount::country() const +{ + return _country; +} + +QString QDropboxAccount::email() const +{ + return _email; +} + +quint64 QDropboxAccount::quotaShared() const +{ + return _quotaShared; +} + +quint64 QDropboxAccount::quota() const +{ + return _quota; +} + +quint64 QDropboxAccount::quotaNormal() const +{ + return _quotaNormal; +} + +QDropboxAccount &QDropboxAccount::operator =(QDropboxAccount &a) +{ + copyFrom(a); + return *this; +} + +void QDropboxAccount::copyFrom(const QDropboxAccount &other) +{ + this->setParent(other.parent()); +#ifdef QTDROPBOX_DEBUG + qDebug() << "creating account from account" << endl; + qDebug() << "taken reflink: " << other.referralLink().toString() << endl; +#endif + _referralLink = other.referralLink(); + _displayName = other.displayName(); + _uid = other.uid(); + _country = other.country(); + _email = other.email(); + _quotaShared = other.quotaShared(); + _quota = other.quota(); + _quotaNormal = other.quotaNormal(); +} diff --git a/src/third_party/QtDropbox/src/qdropboxaccount.h b/src/third_party/QtDropbox/src/qdropboxaccount.h new file mode 100644 index 0000000..0025ac3 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxaccount.h @@ -0,0 +1,114 @@ +#ifndef QDROPBOXACCOUNT_H +#define QDROPBOXACCOUNT_H + +#include +#include +#include "qdropboxjson.h" + +//! Stores information about a user account +/*! + This class is used to store user account information retrieved by using + QDropbox::accountInfo(). The stored data directly correspond to the + Dropbox API request account_info. + + QDropboxAccount interprets given data based on a QDropboxJson. If the data + could be interpreted and hence is valid the resulting object will be valid. + If any error occurs while interpreting the data the resultung QDropboxAccount + object will be invalid. This can checked by using isValid(). + + See https://www.dropbox.com/developers/reference/api#account-info for details. + + */ +class QTDROPBOXSHARED_EXPORT QDropboxAccount : public QDropboxJson +{ + Q_OBJECT +public: + /*! + Creates an empty instance of the object. It is automatically invalid + and does not contain useful data. + + \param parent Parent QObject. + */ + QDropboxAccount(QObject *parent = 0); + + /*! + This constructor creates an object based on the data contained in the + given string that is in valid JSON format. + + \param jsonString JSON data in string representation + \param parent Parent QObject. + */ + QDropboxAccount(QString jsonString, QObject *parent = 0); + + /*! + Use this constructor to create a copy of an other QDropboxAccount. + + \param other Original QDropboxAccount + */ + QDropboxAccount(const QDropboxAccount& other); + + /*! + Returns the referal link of the user. + */ + QUrl referralLink() const; + + /*! + Returns the display name of the account. + */ + QString displayName() const; + + /*! + Returns the Dropbox UID of the account. + */ + qint64 uid() const; + + /*! + Returns the country the account is associated to. + */ + QString country() const; + + /*! + Returns the E-Mail address the owner of the account uses. + */ + QString email() const; + + /*! + Returns the user's used quota in shared folders in bytes. + */ + quint64 quotaShared() const; + + /*! + Returns the user's total quota of allocated bytes. + */ + quint64 quota() const; + + /*! + Returns the user's quota outside of shared folders in bytes. + */ + quint64 quotaNormal() const; + + /*! + Overloaded operator to copy a QDropboxAccount by using =. Internally + copyFrom() is called. + */ + QDropboxAccount& operator =(QDropboxAccount&); + + /*! + This function is used to copy the data from an other QDropboxAccount. + */ + void copyFrom(const QDropboxAccount& a); + +private: + QUrl _referralLink; + QString _displayName; + quint64 _uid; + QString _country; + QString _email; + quint64 _quotaShared; + quint64 _quota; + quint64 _quotaNormal; + + void _init(); +}; + +#endif // QDROPBOXACCOUNT_H diff --git a/src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp b/src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp new file mode 100644 index 0000000..337a152 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp @@ -0,0 +1,63 @@ +#include "qdropboxdeltaresponse.h" +#include "qdropboxjson.h" + +QDropboxDeltaResponse::QDropboxDeltaResponse() +{ + _init(); +} + +QDropboxDeltaResponse::QDropboxDeltaResponse(QString response) +{ + _init(); + + QDropboxJson js(response); + + this->_reset = js.getBool("reset"); + this->_cursor = js.getString("cursor"); + this->_has_more = js.getBool("has_more"); + + QStringList entriesList = js.getArray("entries"); + + for(QStringList::iterator i = entriesList.begin(); + i != entriesList.end(); + i++) + { + QDropboxJson s(*i); + QStringList pair = s.getArray(); + + QSharedPointer val( + new QDropboxFileInfo( + pair.value(1) + ) + ); + this->_entries.insert(pair.value(0), val); + } +} + +const QDropboxDeltaEntryMap QDropboxDeltaResponse::getEntries() const +{ + return this->_entries; +} + +bool QDropboxDeltaResponse::shouldReset() const +{ + return this->_reset; +} + +QString QDropboxDeltaResponse::getNextCursor() const +{ + return this->_cursor; +} + + +bool QDropboxDeltaResponse::hasMore() const +{ + return this->_has_more; +} + +void QDropboxDeltaResponse::_init() +{ + _reset = false; + _cursor = ""; + _has_more = false; +} diff --git a/src/third_party/QtDropbox/src/qdropboxdeltaresponse.h b/src/third_party/QtDropbox/src/qdropboxdeltaresponse.h new file mode 100644 index 0000000..79ab398 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxdeltaresponse.h @@ -0,0 +1,67 @@ +#ifndef QDROPBOXDELTARESPONSE_H +#define QDROPBOXDELTARESPONSE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qtdropbox_global.h" +#include "qdropboxjson.h" +#include "qdropboxfileinfo.h" + +//! Type for a mapping from file paths to file metadata info. +typedef QMap > QDropboxDeltaEntryMap; + +//! Response from a /delta call. +/*! + This structure is used to carry the (multi-part) response from a call to the delta API. + */ +class QDropboxDeltaResponse +{ +public: + //! Constructs a blank QDropboxDeltaResponse object. + QDropboxDeltaResponse(); + + //! Constructs a QDropboxDeltaResponse object from a JSON response. + QDropboxDeltaResponse(QString response); + + //! Retrieves the string-to-metadata map. + /*! + This is a mapping from file paths to metadata (QDropboxFileInfo) entries. + + \note The values in the mapping are allowed to be 'null' QSharedPointer objects, + which represent entries that should be deleted from the local state tracking. + */ + const QDropboxDeltaEntryMap getEntries() const; + + //! Returns whether the local state tracking mechanism should clear its current state. + bool shouldReset() const; + + //! Returns the cursor that should be passed to the next delta API call. + QString getNextCursor() const; + + //! Returns whether or not a subsequent delta API call is part of the same response. + /*! + \return if true: make a delta API call with the same cursor and treat it as + part of the same response; + if false: wait some time (e.g. 5 minutes) before making another delta call. + */ + bool hasMore() const; + + +private: + QDropboxDeltaEntryMap _entries; + bool _reset; + QString _cursor; + bool _has_more; + + void _init(); +}; + +#endif // QDROPBOXDELTA_H diff --git a/src/third_party/QtDropbox/src/qdropboxfile.cpp b/src/third_party/QtDropbox/src/qdropboxfile.cpp new file mode 100644 index 0000000..f1f645b --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxfile.cpp @@ -0,0 +1,586 @@ +#include "qdropboxfile.h" + +QDropboxFile::QDropboxFile(QObject *parent) : + QIODevice(parent), + _conManager(this) +{ + _init(NULL, "", 1024); + connectSignals(); +} + +QDropboxFile::QDropboxFile(QDropbox *api, QObject *parent) : + QIODevice(parent), + _conManager(this) +{ + _init(api, "", 1024); + obtainToken(); + connectSignals(); +} + +QDropboxFile::QDropboxFile(QString filename, QDropbox *api, QObject *parent) : + QIODevice(parent), + _conManager(this) +{ + _init(api, filename, 1024); + obtainToken(); + connectSignals(); +} + +QDropboxFile::~QDropboxFile() +{ + if(_buffer != NULL) + delete _buffer; + if(_evLoop != NULL) + delete _evLoop; +} + +bool QDropboxFile::isSequential() const +{ + return true; +} + +bool QDropboxFile::open(QIODevice::OpenMode mode) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::open(...)" << endl; +#endif + if(!QIODevice::open(mode)) + return false; + + /* if(isMode(QIODevice::NotOpen)) + return true; */ + + if(_buffer == NULL) + _buffer = new QByteArray(); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile: opening file" << endl; +#endif + + // clear buffer and reset position if this file was opened in write mode + // with truncate - or if append was not set + if(isMode(QIODevice::WriteOnly) && + (isMode(QIODevice::Truncate) || !isMode(QIODevice::Append)) + ) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile: _buffer cleared." << endl; +#endif + _buffer->clear(); + _position = 0; + } + else + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile: reading file content" << endl; +#endif + if(!getFileContent(_filename)) + return false; + + if(isMode(QIODevice::WriteOnly)) // write mode here means append + _position = _buffer->size(); + else if(isMode(QIODevice::ReadOnly)) // read mode here means start at the beginning + _position = 0; + } + + obtainMetadata(); + + return true; +} + +void QDropboxFile::close() +{ + if(isMode(QIODevice::WriteOnly)) + flush(); + QIODevice::close(); + return; +} + +void QDropboxFile::setApi(QDropbox *dropbox) +{ + _api = dropbox; + return; +} + +QDropbox *QDropboxFile::api() +{ + return _api; +} + +void QDropboxFile::setFilename(QString filename) +{ + _filename = filename; + return; +} + +QString QDropboxFile::filename() +{ + return _filename; +} + +bool QDropboxFile::flush() +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::flush()" << endl; +#endif + + return putFile(); +} + +bool QDropboxFile::event(QEvent *event) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "processing event: " << event->type() << endl; +#endif + return QIODevice::event(event); +} + +void QDropboxFile::setFlushThreshold(qint64 num) +{ + if(num<0) + num = 0; + _bufferThreshold = num; + return; +} + +qint64 QDropboxFile::flushThreshold() +{ + return _bufferThreshold; +} + +void QDropboxFile::setOverwrite(bool overwrite) +{ + _overwrite = overwrite; + return; +} + +bool QDropboxFile::overwrite() +{ + return _overwrite; +} + +qint64 QDropboxFile::readData(char *data, qint64 maxlen) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::readData(...), maxlen = " << maxlen << endl; + QString buff_str = QString(*_buffer); + qDebug() << "old bytes = " << _buffer->toHex() << ", str: " << buff_str << endl; + qDebug() << "old size = " << _buffer->size() << endl; +#endif + + if(_buffer->size() == 0 || _position >= _buffer->size()) + return 0; + + if(_buffer->size() < maxlen) + maxlen = _buffer->size(); + + QByteArray tmp = _buffer->mid(_position, maxlen); + const qint64 read = tmp.size(); + memcpy(data, tmp.data(), read); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "new size = " << _buffer->size() << endl; + qDebug() << "new bytes = " << _buffer->toHex() << endl; +#endif + + _position += read; + + return read; +} + +qint64 QDropboxFile::writeData(const char *data, qint64 len) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "old content: " << _buffer->toHex() << endl; +#endif + + qint64 oldlen = _buffer->size(); + _buffer->insert(_position, data, len); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "new content: " << _buffer->toHex() << endl; +#endif + + // flush if the threshold is reached + _currentThreshold += len; + if(_currentThreshold > _bufferThreshold) + flush(); + + int written_bytes = len; + + if(_buffer->size() != oldlen+len) + written_bytes = (oldlen-_buffer->size()); + + _position += written_bytes; + + return written_bytes; +} + +void QDropboxFile::networkRequestFinished(QNetworkReply *rply) +{ + rply->deleteLater(); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::networkRequestFinished(...)" << endl; +#endif + + if (rply->error() != QNetworkReply::NoError) + { + lastErrorCode = rply->error(); + stopEventLoop(); + return; + } + + switch(_waitMode) + { + case waitForRead: + rplyFileContent(rply); + stopEventLoop(); + break; + case waitForWrite: + rplyFileWrite(rply); + stopEventLoop(); + break; + case notWaiting: + break; // when we are not waiting for anything, we don't do anything - simple! + default: +#ifdef QTDROPBOX_DEBUG + // debug information only - this should not happen, but if it does we + // ignore replies when not waiting for anything + qDebug() << "QDropboxFile::networkRequestFinished(...) got reply in unknown state (" << _waitMode << ")" << endl; +#endif + break; + } +} + +void QDropboxFile::obtainToken() +{ + _token = _api->token(); + _tokenSecret = _api->tokenSecret(); + return; +} + +void QDropboxFile::connectSignals() +{ + connect(&_conManager, SIGNAL(finished(QNetworkReply*)), + this, SLOT(networkRequestFinished(QNetworkReply*))); + return; +} + +bool QDropboxFile::isMode(QIODevice::OpenMode mode) +{ + return ( (openMode()&mode) == mode ); +} + +bool QDropboxFile::getFileContent(QString filename) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::getFileContent(...)" << endl; +#endif + QUrl request; + request.setUrl(QDROPBOXFILE_CONTENT_URL, QUrl::StrictMode); + request.setPath(QString("/%1/files/%2") + .arg(_api->apiVersion().left(1)) + .arg(filename)); + + QUrlQuery query; + query.addQueryItem("oauth_consumer_key", _api->appKey()); + query.addQueryItem("oauth_nonce", QDropbox::generateNonce(128)); + query.addQueryItem("oauth_signature_method", _api->signatureMethodString()); + query.addQueryItem("oauth_timestamp", QString::number((int) QDateTime::currentMSecsSinceEpoch()/1000)); + query.addQueryItem("oauth_token", _api->token()); + query.addQueryItem("oauth_version", _api->apiVersion()); + + QString signature = _api->oAuthSign(request); + query.addQueryItem("oauth_signature", signature); + + request.setQuery(query); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::getFileContent " << request.toString() << endl; +#endif + + QNetworkRequest rq(request); + QNetworkReply *reply = _conManager.get(rq); + connect(this, &QDropboxFile::operationAborted, reply, &QNetworkReply::abort); + connect(reply, &QNetworkReply::downloadProgress, this, &QDropboxFile::downloadProgress); + + _waitMode = waitForRead; + startEventLoop(); + + if(lastErrorCode != 0) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::getFileContent ReadError: " << lastErrorCode << lastErrorMessage << endl; +#endif + if(lastErrorCode == QDROPBOX_ERROR_FILE_NOT_FOUND) + { + _buffer->clear(); +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::getFileContent: file does not exist" << endl; +#endif + } + else + return false; + } + + return true; +} + +void QDropboxFile::rplyFileContent(QNetworkReply *rply) +{ + lastErrorCode = 0; + + QByteArray response = rply->readAll(); + QString resp_str; + QDropboxJson json; + +#ifdef QTDROPBOX_DEBUG + resp_str = QString(response.toHex()); + qDebug() << "QDropboxFile::rplyFileContent response = " << resp_str << endl; + +#endif + + switch(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()) + { + case QDROPBOX_ERROR_BAD_INPUT: + case QDROPBOX_ERROR_EXPIRED_TOKEN: + case QDROPBOX_ERROR_BAD_OAUTH_REQUEST: + case QDROPBOX_ERROR_FILE_NOT_FOUND: + case QDROPBOX_ERROR_WRONG_METHOD: + case QDROPBOX_ERROR_REQUEST_CAP: + case QDROPBOX_ERROR_USER_OVER_QUOTA: + resp_str = QString(response); + json.parseString(response.trimmed()); + lastErrorCode = rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::rplyFileContent jason.valid = " << json.isValid() << endl; +#endif + if(json.isValid()) + lastErrorMessage = json.getString("error"); + else + lastErrorMessage = ""; + return; + break; + default: + break; + } + + _buffer->clear(); + _buffer->append(response); + emit readyRead(); + return; +} + +void QDropboxFile::rplyFileWrite(QNetworkReply *rply) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::rplyFileWrite(...)" << endl; +#endif + + lastErrorCode = 0; + + QByteArray response = rply->readAll(); + QString resp_str; + QDropboxJson json; + +#ifdef QTDROPBOX_DEBUG + resp_str = response; + qDebug() << "QDropboxFile::rplyFileWrite response = " << resp_str << endl; + +#endif + + switch(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()) + { + case QDROPBOX_ERROR_BAD_INPUT: + case QDROPBOX_ERROR_EXPIRED_TOKEN: + case QDROPBOX_ERROR_BAD_OAUTH_REQUEST: + case QDROPBOX_ERROR_FILE_NOT_FOUND: + case QDROPBOX_ERROR_WRONG_METHOD: + case QDROPBOX_ERROR_REQUEST_CAP: + case QDROPBOX_ERROR_USER_OVER_QUOTA: + resp_str = QString(response); + json.parseString(response.trimmed()); + lastErrorCode = rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::rplyFileWrite jason.valid = " << json.isValid() << endl; +#endif + if(json.isValid()) + lastErrorMessage = json.getString("error"); + else + lastErrorMessage = ""; + return; + break; + default: + delete _metadata; + + _metadata = new QDropboxFileInfo{QString{response}.trimmed(), this}; + if (!_metadata->isValid()) + _metadata->clear(); + break; + } + + emit bytesWritten(_buffer->size()); + return; +} + +void QDropboxFile::startEventLoop() +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::startEventLoop()" << endl; +#endif + if(_evLoop == NULL) + _evLoop = new QEventLoop(this); + _evLoop->exec(); + return; +} + +void QDropboxFile::stopEventLoop() +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::stopEventLoop()" << endl; +#endif + if(_evLoop == NULL) + return; + _evLoop->exit(); + return; +} + +bool QDropboxFile::putFile() +{ + +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::putFile()" << endl; +#endif + + QUrl request; + request.setUrl(QDROPBOXFILE_CONTENT_URL, QUrl::StrictMode); + request.setPath(QString("/%1/files_put/%2") + .arg(_api->apiVersion().left(1)) + .arg(_filename)); + + QUrlQuery urlQuery; + urlQuery.addQueryItem("oauth_consumer_key", _api->appKey()); + urlQuery.addQueryItem("oauth_nonce", QDropbox::generateNonce(128)); + urlQuery.addQueryItem("oauth_signature_method", _api->signatureMethodString()); + urlQuery.addQueryItem("oauth_timestamp", QString::number((int) QDateTime::currentMSecsSinceEpoch()/1000)); + urlQuery.addQueryItem("oauth_token", _api->token()); + urlQuery.addQueryItem("oauth_version", _api->apiVersion()); + urlQuery.addQueryItem("overwrite", (_overwrite?"true":"false")); + + QString signature = _api->oAuthSign(request); + urlQuery.addQueryItem("oauth_signature", signature); + + request.setQuery(urlQuery); + +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::put " << request.toString() << endl; +#endif + + QNetworkRequest rq(request); + QNetworkReply *reply = _conManager.put(rq, *_buffer); + connect(this, &QDropboxFile::operationAborted, reply, &QNetworkReply::abort); + connect(reply, &QNetworkReply::uploadProgress, this, &QDropboxFile::uploadProgress); + + _waitMode = waitForWrite; + startEventLoop(); + + if(lastErrorCode != 0) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::putFile WriteError: " << lastErrorCode << lastErrorMessage << endl; +#endif + return false; + } + + _currentThreshold = 0; + + return true; +} + +void QDropboxFile::_init(QDropbox *api, QString filename, qint64 bufferTh) +{ + _api = api; + _buffer = NULL; + _filename = filename; + _evLoop = NULL; + _waitMode = notWaiting; + _bufferThreshold = bufferTh; + _overwrite = true; + _metadata = NULL; + lastErrorCode = 0; + lastErrorMessage = ""; + _position = 0; + _currentThreshold = 0; + return; +} + + +QDropboxFileInfo QDropboxFile::metadata() +{ + if(_metadata == NULL) + obtainMetadata(); + + return _api->requestMetadataAndWait(_filename); +} + +bool QDropboxFile::hasChanged() +{ + if(_metadata == NULL) + { + if(!metadata().isValid()) // get metadata + return false; // if metadata was invalid + } + + QDropboxFileInfo serverMetadata = _api->requestMetadataAndWait(_filename); +#ifdef QTDROPBOX_DEBUG + qDebug() << "QDropboxFile::hasChanged() local revision hash = " << _metadata->revisionHash() << endl; + qDebug() << "QDropboxFile::hasChanged() remote revision hash = " << serverMetadata.revisionHash() << endl; +#endif + return serverMetadata.revisionHash().compare(_metadata->revisionHash())!=0; +} + +void QDropboxFile::obtainMetadata() +{ + // get metadata of this file + _metadata = new QDropboxFileInfo(_api->requestMetadataAndWait(_filename).strContent(), this); + if(!_metadata->isValid()) + _metadata->clear(); + return; +} + +QList QDropboxFile::revisions(int max) +{ + QList revisions = _api->requestRevisionsAndWait(_filename, max); + if(_api->error() != QDropbox::NoError) + revisions.clear(); + + return revisions; +} + +bool QDropboxFile::seek(qint64 pos) +{ + if(pos > _buffer->size()) + return false; + + QIODevice::seek(pos); + _position = pos; + return true; +} + +qint64 QDropboxFile::pos() const +{ + return _position; +} + +bool QDropboxFile::reset() +{ + QIODevice::reset(); + _position = 0; + return true; +} + +void QDropboxFile::abort() +{ + emit operationAborted(); +} diff --git a/src/third_party/QtDropbox/src/qdropboxfile.h b/src/third_party/QtDropbox/src/qdropboxfile.h new file mode 100644 index 0000000..4add0e0 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxfile.h @@ -0,0 +1,269 @@ +#ifndef QDROPBOXFILE_H +#define QDROPBOXFILE_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qtdropbox_global.h" +#include "qdropboxjson.h" +#include "qdropbox.h" +#include "qdropboxfileinfo.h" + +const QString QDROPBOXFILE_CONTENT_URL = "https://api-content.dropbox.com"; + +//! Allows access to files stored on Dropbox +/*! + QDropboxFile allows you to access files that are stored on Dropbox. You can + use this class as any QIODevice, very similar to the default QFile class. It is + usable in connection with QTextStream and QDataStream to access the file contents. + + When accessing files on Dropbox remember to use valid Dropbox paths. Such a path + begins with either /dropbox/ or /sandbox/ depending on the access level of your + application. + + It is important to know that QDropboxFile buffers the content of the remote file + locally when using open(). This means that the file content is not automatically + updated if it changed on the Dropbox server which in return means that you may not + always have the most current version of the file content. + + \todo implement utilities for revision access (get a list of revisions and get actual + revisions) + + */ +class QTDROPBOXSHARED_EXPORT QDropboxFile : public QIODevice +{ + Q_OBJECT +public: + /*! + Default constructor. Use setApi() and setFilename() to access Dropbox. + + \param parent Parent QObject + */ + QDropboxFile(QObject* parent = 0); + + /*! + Creates an instance of QDropboxFile that may connect to Dropbox if the passed + QDropbox is already connected. Use setFilename() before you try to access any + file. + + \param api Pointer to a QDropbox that is connected to an account. + \param parent Parent QObject + */ + QDropboxFile(QDropbox* api, QObject* parent = 0); + + /*! + Creates an instance of QDropboxFile that may access a file on Dropbox. + + \param filename Dropbox path of the file you want to access. + \param api A QDropbox that is connected to an user account. + \param parent Parent QObject + */ + QDropboxFile(QString filename, QDropbox* api, QObject* parent = 0); + + /*! + This deconstructor cleans up on destruction of the object. + */ + ~QDropboxFile(); + + /*! + QDropboxFile is currently implemented as sequential device. That will + change in time. + */ + bool isSequential() const; + + /*! + Fetches the file content from the Dropbox server and buffers it locally. Depending + on the OpenMode read or write access will be granted. + + \param mode The access mode of the file. Equivalent to QIODevice. + */ + bool open(OpenMode mode); + + /*! + Closes the file buffer. If the file was opened with QIODevice::WriteOnly (or + QIODevice::ReadWrite) the file content buffer will be flushed and written to + the file. + */ + void close(); + + /*! + Sets the QDropbox instance that is used to access Dropbox. + + \param dropbox Pointer to the QDropbox object + */ + void setApi(QDropbox* dropbox); + + /*! + Returns a pointer to the QDropbox instance that is used to connect to Dropbox. + */ + QDropbox* api(); + + /*! + Set the name of the file you want to access. Remember to use correct Dropbox path + beginning with either /dropbox/ or /sandbox/. + + \param filename Path of the file. + */ + void setFilename(QString filename); + + /*! + Returns the path of the file that is accessed by this instance. + */ + QString filename(); + + /*! + Writes the content of the buffer to the file (only if the file is opened in + write mode). + */ + bool flush(); + + /*! + Reimplemented from QIODEvice. + */ + bool event(QEvent* event); + + /*! + Usually the file content is automatically flushed whenever the internal buffer + has more than 1024 new byte or on using close(). If you want QDropboxFile to + automatically flush earlier than those 1024 byte use this function to reduce + this threshold. + + \param num QDropboxFile will automatically flush the file buffer when there are + more than num new byte of data. + */ + void setFlushThreshold(qint64 num); + + /*! + Returns the current flush threshold setting. + */ + qint64 flushThreshold(); + + /*! + By default an already existing file will be overwritten. If you don't want to + let this happen use this function to set the overwrite flag to false. If a file + with the same name already exists it will be automatically renamed by Dropbox to + something like "file (1).txt". + + \param overwrite Overwrite flag + */ + void setOverwrite(bool overwrite); + + /*! + Returns the current state of the overwrite flag. + */ + bool overwrite(); + + /*! + Return the metadata of the file as a QDropboxFileInfo object. + */ + QDropboxFileInfo metadata(); + + /*! + Check if the file has changed on the dropbox while it was opened locally. + This function will return false if the file was not previously opened and an error + occured during the retrieval of the file metadata. Hence it is safer to open the file + first and then check hasChanged() + + \returns true if the file has changed or false if it has not. + */ + bool hasChanged(); + + /*! + Gets and returns all available revisions of the file. + \param max When defined the function will only list up to the specified amount of revisions. + \returns A list of the latest revisions of the file. + */ + QList revisions(int max = 10); + + /*! + Reimplemented from QIODevice::seek(). + Foreward to the given (byte) position in the file. Unlike QFile::seek() this function does + not seek beyond the file end. When seeking beyond the end of a file this function stops beyond + the last byte of the current content and returns false. + */ + bool seek(qint64 pos); + + /*! + Reimplemented from QIODevice::pos(). + Returns the current position in the file. + */ + qint64 pos() const; + + /*! + Reimplemented from QIODevice::reset(). + Seeks to the beginning of the file. See seek(). + */ + bool reset(); + +public slots: + void abort(); + +signals: + void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); + void uploadProgress(qint64 bytesReceived, qint64 bytesTotal); + + void operationAborted(); + +protected: + qint64 readData(char *data, qint64 maxlen); + qint64 writeData(const char *data, qint64 len); + +private slots: + void networkRequestFinished(QNetworkReply* rply); + +private: + QNetworkAccessManager _conManager; + + QByteArray *_buffer; + + QString _token; + QString _tokenSecret; + QString _filename; + + QDropbox *_api; + + + enum WaitState{ + notWaiting, + waitForRead, + waitForWrite + }; + + WaitState _waitMode; + + QEventLoop* _evLoop; + + int lastErrorCode; + QString lastErrorMessage; + + qint64 _bufferThreshold; + qint64 _currentThreshold; + + bool _overwrite; + + int _position; + + QDropboxFileInfo *_metadata; + + void obtainToken(); + void connectSignals(); + + bool isMode(QIODevice::OpenMode mode); + bool getFileContent(QString filename); + void rplyFileContent(QNetworkReply* rply); + void rplyFileWrite(QNetworkReply* rply); + void startEventLoop(); + void stopEventLoop(); + bool putFile(); + void obtainMetadata(); + + void _init(QDropbox *api, QString filename, qint64 bufferTh); +}; + +#endif // QDROPBOXFILE_H diff --git a/src/third_party/QtDropbox/src/qdropboxfileinfo.cpp b/src/third_party/QtDropbox/src/qdropboxfileinfo.cpp new file mode 100644 index 0000000..a0cbf53 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxfileinfo.cpp @@ -0,0 +1,178 @@ +#include "qdropboxfileinfo.h" + +QDropboxFileInfo::QDropboxFileInfo(QObject *parent) : + QDropboxJson(parent) +{ + _init(); +} + +QDropboxFileInfo::QDropboxFileInfo(QString jsonStr, QObject *parent) : + QDropboxJson(jsonStr, parent) +{ + _init(); + dataFromJson(); +} + +QDropboxFileInfo::QDropboxFileInfo(const QDropboxFileInfo &other) : + QDropboxJson(0) +{ + _init(); + copyFrom(other); +} + +QDropboxFileInfo::~QDropboxFileInfo() +{ + if(_content != NULL) + delete _content; +} + +void QDropboxFileInfo::copyFrom(const QDropboxFileInfo &other) +{ + parseString(other.strContent()); + dataFromJson(); + setParent(other.parent()); + return; +} + +QDropboxFileInfo &QDropboxFileInfo::operator=(const QDropboxFileInfo &other) +{ + copyFrom(other); + return *this; +} + +void QDropboxFileInfo::dataFromJson() +{ + if(!isValid()) + return; + + _size = getString("size"); + _revision = getUInt("revision"); + _thumbExists = getBool("thumb_exists"); + _bytes = getUInt("bytes"); + _icon = getString("icon"); + _root = getString("root"); + _path = getString("path"); + _isDir = getBool("is_dir"); + _mimeType = getString("mime_type"); + _isDeleted = getBool("is_deleted"); + _revisionHash = getString("rev"); + _modified = getTimestamp("modified"); + _clientModified = getTimestamp("client_mtime"); + + // create content list + if(_isDir) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "fileinfo: generating contents list"; +#endif + _content = new QList(); + QStringList contentsArray = getArray("contents"); + for(qint32 i = 0; iappend(contentInfo); + } + } + + return; +} + +void QDropboxFileInfo::_init() +{ + _size = ""; + _revision = 0; + _thumbExists = false; + _bytes = 0; + _modified = QDateTime::currentDateTime(); + _clientModified = QDateTime::currentDateTime(); + _icon = ""; + _root = ""; + _path = ""; + _isDir = false; + _mimeType = ""; + _isDeleted = false; + _revisionHash = ""; + _content = NULL; + return; +} + +QString QDropboxFileInfo::revisionHash() const +{ + return _revisionHash; +} + +bool QDropboxFileInfo::isDeleted() const +{ + return _isDeleted; +} + + +QString QDropboxFileInfo::mimeType() const +{ + return _mimeType; +} + +bool QDropboxFileInfo::isDir() const +{ + return _isDir; +} + +QString QDropboxFileInfo::path() const +{ + return _path; +} + +QString QDropboxFileInfo::root() const +{ + return _root; +} + +QString QDropboxFileInfo::icon() const +{ + return _icon; +} + +QDateTime QDropboxFileInfo::clientModified() +{ + return _clientModified; +} + +QDateTime QDropboxFileInfo::modified() +{ + return _modified; +} + +quint64 QDropboxFileInfo::bytes() const +{ + return _bytes; +} + +bool QDropboxFileInfo::thumbExists() const +{ + return _thumbExists; +} + +quint64 QDropboxFileInfo::revision() const +{ + return _revision; +} + +QString QDropboxFileInfo::size() const +{ + return _size; +} + +QList QDropboxFileInfo::contents() const +{ + if(_content == NULL || !isDir()) + { + QList l; + l.clear(); + return l; + } + + return *_content; +} diff --git a/src/third_party/QtDropbox/src/qdropboxfileinfo.h b/src/third_party/QtDropbox/src/qdropboxfileinfo.h new file mode 100644 index 0000000..1f0d19a --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxfileinfo.h @@ -0,0 +1,183 @@ +#ifndef QDROPBOXFILEINFO_H +#define QDROPBOXFILEINFO_H + +#include +#include +#include +#include + +#ifdef QTDROPBOX_DEBUG +#include +#endif + +#include "qdropboxjson.h" + +//! Provides information and metadata about files and directories +/*! + This class is a more specialised version of QDropboxJson. It provides access to + the metadata of a file or directory that is stored on the Dropbox. + + To obtain metadata information about any kind of file stored on the Dropbox you + have to use QDropbox::metadata() or QDropboxFile::metadata(). Those functions + return an instance of this class that contains the required information. If an + error occured while obtaining the metadata the functon isValid() will return + false. + + Traversing the Dropbox file system + Walking through the filetree on Dropbox is possible by using the isDir() and contents() + functions. The function contents() provides you with the metadata of all the files and + directories in a directory. Due to a limitation of the Dropbox REST API these metadata + do not contain contents of subdirectories. Calling contents() on metadata that you + retrieved by using a previous contents() call will return an empty list. You have to + query the metadata of a subdirectory again by using QDropbox::requestMetadata() or + QDropbox::requestMetadataAndWait(). + + \bug modified() and clientModified() are currently not working due to a bug in + QDropboxJson + */ +class QTDROPBOXSHARED_EXPORT QDropboxFileInfo : public QDropboxJson +{ + Q_OBJECT +public: + + /*! + Creates an empty instance of QDropboxFileInfo. + \warning internal use only + \param parent parent QObject + */ + QDropboxFileInfo(QObject *parent = 0); + + /*! + Creates an instance of QDropboxFileInfo based on the data provided + in the JSON in string representation. + + \param jsonStr metadata JSON in string representation + \param parent pointer to the parent QObject + */ + QDropboxFileInfo(QString jsonStr, QObject *parent = 0); + + /*! + Creates a copy of an other QDropboxFileInfo instance. + + \param other original instance + */ + QDropboxFileInfo(const QDropboxFileInfo &other); + + /*! + Default destructor. Takes care of cleaning up when the object is destroyed. + */ + ~QDropboxFileInfo(); + + /*! + Copies the values from an other QDropboxFileInfo instance to the + current instance. + + \param other original instance + */ + void copyFrom(const QDropboxFileInfo &other); + + /*! + Works exactly like copyFrom() only as an operator. + + \param other original instance + */ + QDropboxFileInfo& operator=(const QDropboxFileInfo& other); + + /*! + Human readable file size. + */ + QString size() const; + + /*! + Current revision number. + */ + quint64 revision() const; + + /*! + Indicates whether a thumbnail is available. + */ + bool thumbExists() const; + + /*! + File size in bytes. + */ + quint64 bytes() const; + + /*! + Timestamp of last modification. + \bug Currently not working + */ + QDateTime modified(); + + /*! + Timestamp of desktop client upload. + */ + QDateTime clientModified(); + + /*! + Icon name. + */ + QString icon() const; + + /*! + Root directors. Can be either /dropbox or /sandbox + */ + QString root() const; + + /*! + Full canonical path of the file. + */ + QString path() const; + + /*! + Indicates whether the selected item is a directory. + */ + bool isDir() const; + + /*! + Mime-Type of the item. + */ + QString mimeType() const; + + /*! + Indiciates that the item was deleted from the server. + */ + bool isDeleted() const; + + /*! + Current revision as hash string. Use this for e.g. change check. + */ + QString revisionHash() const; + + /*! + Returns the content of a directory. + This function will return a list with length 0 (zero) if the item is no + directory. + */ + QList contents() const; + +signals: + +public slots: + +private: + void dataFromJson(); + void _init(); + + QString _size; + quint64 _revision; + bool _thumbExists; + quint64 _bytes; + QDateTime _modified; + QDateTime _clientModified; + QString _icon; + QString _root; + QString _path; + bool _isDir; + QString _mimeType; + bool _isDeleted; + QString _revisionHash; + QList* _content; +}; + +#endif // QDROPBOXFILEINFO_H diff --git a/src/third_party/QtDropbox/src/qdropboxjson.cpp b/src/third_party/QtDropbox/src/qdropboxjson.cpp new file mode 100644 index 0000000..1f85782 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxjson.cpp @@ -0,0 +1,747 @@ +#include + +#include "qdropboxjson.h" + +QDropboxJson::QDropboxJson(QObject *parent) : + QObject(parent) +{ + _init(); +} + +QDropboxJson::QDropboxJson(QString strJson, QObject *parent) : + QObject(parent) +{ + _init(); + parseString(strJson); +} + +QDropboxJson::QDropboxJson(const QDropboxJson &other) : + QObject(other.parent()) +{ + _init(); + parseString(other.strContent()); +} + +QDropboxJson::~QDropboxJson() +{ + emptyList(); +} + +void QDropboxJson::_init() +{ + valid = false; + _anonymousArray = false; +} + +void QDropboxJson::parseString(QString strJson) +{ +#ifdef QTDROPBOX_DEBUG + qDebug() << "parse string = " << strJson << endl; +#endif + + // clear all existing data + emptyList(); + + // basically a json is valid until it is invalidated + valid = true; + + if(!strJson.startsWith("{") || + !strJson.endsWith("}")) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "string does not start with { " << endl; +#endif + + if(strJson.startsWith("[") && strJson.endsWith("]")) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "JSON is anonymous array" << endl; +#endif + _anonymousArray = true; + // fix json to be parseable by the algorithm below + strJson = "{\"_anonArray\":"+strJson+"}"; + } + else + { + valid = false; + return; + } + } + + QString buffer = ""; + QString key = ""; + QString value = ""; + + bool isKey = true; + bool insertValue = false; + bool isJson = false; + bool isArray = false; + bool openQuotes = false; + + + for(int i=0; i parse array + bool inString = false; + bool arrayEnd = false; + int arrayDepth = 0; + int j = i+1; + buffer = "["; + for(;!arrayEnd && jtoInt(); +} + +void QDropboxJson::setInt(QString key, qint64 value) +{ + if(valueMap.contains(key)){ + valueMap[key].value.value->setNum(value); + }else{ + qdropboxjson_entry e; + QString *valuePointer = new QString(); + valuePointer->setNum(value); + e.value.value = valuePointer; + e.type = QDROPBOXJSON_TYPE_NUM; + valueMap[key] = e; + } +} + +quint64 QDropboxJson::getUInt(QString key, bool force) +{ + if(!valueMap.contains(key)) + return 0; + + qdropboxjson_entry e; + e = valueMap.value(key); + + if(!force && e.type != QDROPBOXJSON_TYPE_UINT) + return 0; + + return e.value.value->toUInt(); +} + +void QDropboxJson::setUInt(QString key, quint64 value) +{ + if(valueMap.contains(key)){ + valueMap[key].value.value->setNum(value); + }else{ + qdropboxjson_entry e; + QString *valuePointer = new QString(); + valuePointer->setNum(value); + e.value.value = valuePointer; + e.type = QDROPBOXJSON_TYPE_UINT; + valueMap[key] = e; + } +} + +QString QDropboxJson::getString(QString key, bool force) +{ + if(!valueMap.contains(key)) + return ""; + + qdropboxjson_entry e; + e = valueMap.value(key); + + if(!force && e.type != QDROPBOXJSON_TYPE_STR) + return ""; + + QString value = e.value.value->mid(1, e.value.value->size()-2); + return value; +} + +void QDropboxJson::setString(QString key, QString value) +{ + if(valueMap.contains(key)){ + *(valueMap[key].value.value) = value; + }else{ + qdropboxjson_entry e; + QString *valuePointer = new QString(value); + e.value.value = valuePointer; + e.type = QDROPBOXJSON_TYPE_STR; + valueMap[key] = e; + } +} + +QDropboxJson* QDropboxJson::getJson(QString key) +{ + if(!valueMap.contains(key)) + return NULL; + + qdropboxjson_entry e; + e = valueMap.value(key); + + if(e.type != QDROPBOXJSON_TYPE_JSON) + return NULL; + + + return e.value.json; +} + +void QDropboxJson::setJson(QString key, QDropboxJson value) +{ + if(valueMap.contains(key)){ + *(valueMap[key].value.json) = value; + }else{ + qdropboxjson_entry e; + QDropboxJson *valuePointer = new QDropboxJson(value); + e.value.json = valuePointer; + e.type = QDROPBOXJSON_TYPE_JSON; + valueMap[key] = e; + } +} + +double QDropboxJson::getDouble(QString key, bool force) +{ + if(!valueMap.contains(key)) + return 0.0f; + + qdropboxjson_entry e; + e = valueMap.value(key); + + if(!force && e.type != QDROPBOXJSON_TYPE_FLOAT) + return 0.0f; + + return e.value.value->toDouble(); +} + +void QDropboxJson::setDouble(QString key, double value) +{ + if(valueMap.contains(key)){ + valueMap[key].value.value->setNum(value); + }else{ + qdropboxjson_entry e; + QString *valuePointer = new QString(); + valuePointer->setNum(value); + e.value.value = valuePointer; + e.type = QDROPBOXJSON_TYPE_FLOAT; + valueMap[key] = e; + } +} + +bool QDropboxJson::getBool(QString key, bool force) +{ + if(!valueMap.contains(key)) + return false; + + qdropboxjson_entry e; + e = valueMap.value(key); + + if(!force && e.type != QDROPBOXJSON_TYPE_BOOL) + return false; + + if(!e.value.value->compare("false")) + return false; + + return true; +} + +void QDropboxJson::setBool(QString key, bool value) +{ + if(valueMap.contains(key)){ + *(valueMap[key].value.value) = value ? "true" : "false"; + }else{ + qdropboxjson_entry e; + QString *valuePointer = new QString(value ? "true" : "false"); + e.value.value = valuePointer; + e.type = QDROPBOXJSON_TYPE_BOOL; + valueMap[key] = e; + } +} + +QDateTime QDropboxJson::getTimestamp(QString key, bool force) +{ + if(!valueMap.contains(key)) + return QDateTime(); + + qdropboxjson_entry e; + e = valueMap.value(key); + + if(!force && e.type != QDROPBOXJSON_TYPE_STR) + return QDateTime(); + + const QString dtFormat = "dd MMM yyyy HH:mm:ss"; + + QDateTime res = QLocale(QLocale::English).toDateTime(e.value.value->mid(6, dtFormat.size()), dtFormat); + res.setTimeSpec(Qt::UTC); + + return res; +} + +void QDropboxJson::setTimestamp(QString key, QDateTime value) +{ + const QString dtFormat = "ddd, dd MMM yyyy hh:mm:ss '+0000'"; + + value = value.toUTC(); + + if(valueMap.contains(key)){ + *(valueMap[key].value.value) = value.toString(dtFormat); + }else{ + qdropboxjson_entry e; + QString *valuePointer = new QString(QLocale{QLocale::English}.toString(value, dtFormat)); + e.value.value = valuePointer; + e.value.value = valuePointer; + e.type = QDROPBOXJSON_TYPE_STR; + valueMap[key] = e; + } +} + +QString QDropboxJson::strContent() const +{ + if(valueMap.size() == 0) + return ""; + + QString content = "{"; + QList keys = valueMap.keys(); + for(int i=0; istrContent(); + + content.append(QString("\"%1\": %2").arg(keys.at(i)).arg(value)); + if(i != keys.size()-1) + content.append(", "); + } + content.append("}"); + return content; +} + +void QDropboxJson::emptyList() +{ + QList keys = valueMap.keys(); + for(qint32 i=0; imid(1, e.value.value->length()-2); + QString buffer = ""; + bool inString = false; + int inJson = 0; + int inArray = 0; + for(int i=0; i 0 || inArray > 0)) + buffer += c; + switch(c.toLatin1()) + { + case '"': + if(i > 0 && arrayStr.at(i-1).toLatin1() == '\\') + { + buffer += c; + break; + } + else + inString = !inString; + break; + case '{': + inJson++; + break; + case '}': + inJson--; + break; + case '[': + inArray++; + break; + case ']': + inArray--; + break; + case ',': + if(inJson == 0 && inArray == 0 && !inString) + { + list.append(buffer); + buffer = ""; + } + break; + } + } + + if(!buffer.isEmpty()) + list.append(buffer); + + return list; +} + +int QDropboxJson::parseSubJson(QString strJson, int start, qdropboxjson_entry *jsonEntry) +{ + int openBrackets = 1; + QString buffer = ""; + QDropboxJson* jsonValue = NULL; + + int j; + for(j=start+1; openBrackets > 0 && j < strJson.size(); ++j) + { + if(strJson.at(j).toLatin1() == '{') + openBrackets++; + else if(strJson.at(j).toLatin1() == '}') + openBrackets--; + } + + buffer = strJson.mid(start, j-start); +#ifdef QTDROPBOX_DEBUG + qDebug() << "brackets = " << openBrackets << endl; + qDebug() << "json data(" << start << ":" << j-start << ") = " << buffer << endl; +#endif + jsonValue = new QDropboxJson(); + jsonValue->parseString(buffer); + + // invalid sub json means invalid json + if(!jsonValue->isValid()) + { +#ifdef QTDROPBOX_DEBUG + qDebug() << "subjson invalid!" << endl; +#endif + valid = false; + return j; + } + + // insert new + jsonEntry->value.json = jsonValue; + jsonEntry->type = QDROPBOXJSON_TYPE_JSON; + return j; +} + +bool QDropboxJson::isAnonymousArray() +{ + return _anonymousArray; +} + +QStringList QDropboxJson::getArray() +{ + if(!isAnonymousArray()) + return QStringList(); + + return getArray("_anonArray"); +} + +int QDropboxJson::compare(const QDropboxJson& other) +{ + if(valueMap.size() != other.valueMap.size()) + return 1; + + QMap yourMap = other.valueMap; + + QList keys = valueMap.keys(); + for(int i=0; icompare(*yourEntry.value.json) != 0) + return 1; + } + else + { + if(myEntry.value.value->compare(yourEntry.value.value) != 0) + return 1; + } + } + + return 0; +} diff --git a/src/third_party/QtDropbox/src/qdropboxjson.h b/src/third_party/QtDropbox/src/qdropboxjson.h new file mode 100644 index 0000000..74799d8 --- /dev/null +++ b/src/third_party/QtDropbox/src/qdropboxjson.h @@ -0,0 +1,259 @@ +#ifndef QDROPBOXJSON_H +#define QDROPBOXJSON_H + +#include "qtdropbox_global.h" + +#include +#include +#include +#include +#include + +#ifdef QTDROPBOX_DEBUG +#include +#endif + +typedef char qdropboxjson_entry_type; + +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_NUM = 'N'; +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_STR = 'S'; +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_JSON = 'J'; +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_ARRAY = 'A'; +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_FLOAT = 'F'; +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_BOOL = 'B'; +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_UINT = 'U'; +const qdropboxjson_entry_type QDROPBOXJSON_TYPE_UNKNOWN = '?'; + +class QDropboxJson; + +//! Keeps values of a JSON +union qdropboxjson_value{ + QDropboxJson *json; //!< Used to store subjsons (JSON in JSON) + QString *value; //!< used to store a real value, all values are converted from QString +}; + +//! Keeps keys of a JSON +struct qdropboxjson_entry{ + qdropboxjson_entry_type type; //!< Datatype of value + qdropboxjson_value value; //!< Reference to the value struct +}; + +//! Used to store JSON data that is returned from Dropbox. +/*! + Most of the communication with Dropbox is handled by using JSON data structures. JSON is + originally method of complex data description used for JavaScript and PHP and thus it is + designed to work with typeless languages. QDropboxJson provides an interface that maps + the mixed type values of a JSON to native C++ data types as good as possible. + + A JSON is usually passed as string and can be parsed by either passing that string to the + constructor or using parseString(). If any error occurs the QDropboxJson will be marked as + invalid (see isValid()). + + The data of a valid QDropboxJson can be accessed by using one of the get-functions. If the + value you want to access is not mapped to the datatype you requested an empty value will be + returned. You can always set a force flag. If you do the returned value will be converted but + may return nonsense data. Use this flag with care and only if you know what you're doing. + + \warning Currently arrays in JSONs are not supported. + \todo Implemement setter functions and toString() for JSON generation (altough not necessary it + would be a nice feature) + */ +class QTDROPBOXSHARED_EXPORT QDropboxJson : public QObject +{ + Q_OBJECT +public: + /*! + Creates an empty JSON object. + + \param parent Pointer to the parent QObject. + */ + QDropboxJson(QObject *parent = 0); + + /*! + This constructor interprets the given string as JSON. + + \param strJson JSON as string. + \param parent Parent QObject. + */ + QDropboxJson(QString strJson, QObject *parent = 0); + + /*! + Copies the data of another QDropboxJSon. + + \param other The QDropboxJson to be copied. + */ + QDropboxJson(const QDropboxJson &other); + + /*! + Cleans up the JSON on destruction. + */ + ~QDropboxJson(); + + /*! + This enum is used to categorize the data type of JSON values. + */ + enum DataType{ + NumberType, //!< Number based type (interpreted as qint64) + StringType, //!< String based type of variable length + JsonType, //!< A subjson + ArrayType, //!< Array data type (currently not supported!) + FloatType, //!< Floating point based datatype + BoolType, //!< Boolean based types. + UnsignedIntType, //!< Number based type unsigned (only applied if NumberType does not match) + UnknownType //!< Data type could not be identified. + }; + + /*! + Interprets a string as JSON - or at least tries to. If this is not possible + the QDropboxJson will be invalidated. + + \parem strJson JSON in string representation. + */ + void parseString(QString strJson); + + /*! + Drops all stored JSON data. + */ + void clear(); + + /*! + Returns true if the QDropboxJson contains valid data from a JSON. If an error occurs + during the parsing of a JSON string this function will return false. + */ + bool isValid(); + + /*! + Returns true if the QDropboxJson contains the given key. + + \param key The requested key. + */ + bool hasKey(QString key); + + /*! + Returns the data type of the value mapped to the key. + \param key The key to be checked. + */ + DataType type(QString key); + + /*! + Returns a stored integer value identified by the given key. If the key does + not map 0 is returned. If the force flag is set the check of the data type + is omitted and it is tried to convert the value regardless of the real data type. + */ + qint64 getInt(QString key, bool force = false); + + void setInt(QString key, qint64 value); + + /*! + Returns a stored unsigned integer value identified by the given key. If the key does + not map 0 is returned. If the force flag is set the check of the data type + is omitted and it is tried to convert the value regardless of the real data type. + */ + quint64 getUInt(QString key, bool force = false); + + void setUInt(QString key, quint64 value); + + /*! + Returns a stored string value identified by the given key. If the key does + not map an empty QString is returned. If the force flag is set the check of the data type + is omitted and it is tried to convert the value regardless of the real data type. + */ + QString getString(QString key, bool force = false); + + void setString(QString key, QString value); + + /*! + Returns a sub JSON identified by the given key. If the key does not map to a + JSON a NULL pointer will be returned. It is not possible to force a conversion. + */ + QDropboxJson *getJson(QString key); + + void setJson(QString key, QDropboxJson value); + + /*! + Returns a stored floating point value identified by the given key. If the key does + not map 0.0 is returned. If the force flag is set the check of the data type + is omitted and it is tried to convert the value regardless of the real data type. + */ + double getDouble(QString key, bool force = false); + + void setDouble(QString key, double value); + + /*! + Returns a stored boolean value identified by the given key. If the key does + not map false is returned. If the force flag is set the check of the data type + is omitted and it is tried to convert the value regardless of the real data type. + */ + bool getBool(QString key, bool force = false); + + void setBool(QString key, bool value); + + /*! + Returns the stored JSON's string representation. + */ + QString strContent() const; + + /*! + Returns a stored string values as QDateTime timestamp. The timestamp will be invalid + if the string could not be converted. + */ + QDateTime getTimestamp(QString key, bool force = false); + + void setTimestamp(QString key, QDateTime value); + + /*! + Returnes a stored array as a list of string items. If the key does not exist or is not + stored as array the function returns an empty list. If you need the items in a specific + data type you have to do equivalent casting your self! + */ + QStringList getArray(QString key, bool force = false); + + /*! + Returns the content of a stored array as a list of string items if the JSON contains + an anynmous array (see also isAnonymousArray()). As with getArray(QString key, bool force = false) + you have to parse the content of the array your self. + */ + QStringList getArray(); + + /**! + Overloaded operator to copy a QDropboxJson. + */ + QDropboxJson& operator =(QDropboxJson&); + + /**! + A JSON may be an anonymous array like this: + \code + [ + "a": "valueA", + "b": "valueB" + ] + \endcode + + Use this function to identify a JSON that is an anonymous array. + \returns true if the JSON is an anonymous array. + */ + bool isAnonymousArray(); + + /**! + Compares two JSON objects if they are the same. + This means that they have the same keys with the same values. + + \param other the JSON you wish to compare to + \returns 0 if the JSON objects are equals + */ + int compare(const QDropboxJson& other); + +protected: + bool valid; + +private: + QMap valueMap; + bool _anonymousArray; + + void emptyList(); + qdropboxjson_entry_type interpretType(QString value); + int parseSubJson(QString str, int start, qdropboxjson_entry *jsonEntry); + void _init(); +}; + +#endif // QDROPBOXJSON_H diff --git a/src/third_party/QtDropbox/src/qtdropbox.h b/src/third_party/QtDropbox/src/qtdropbox.h new file mode 100644 index 0000000..de2bf1a --- /dev/null +++ b/src/third_party/QtDropbox/src/qtdropbox.h @@ -0,0 +1,11 @@ +#ifndef QTDROPBOX_H +#define QTDROPBOX_H + +#include "qtdropbox_global.h" +#include "qdropbox.h" +#include "qdropboxjson.h" +#include "qdropboxfile.h" +#include "qdropboxfileinfo.h" +#include "qdropboxdeltaresponse.h" + +#endif // QTDROPBOX_H diff --git a/src/third_party/QtDropbox/src/qtdropbox_global.h b/src/third_party/QtDropbox/src/qtdropbox_global.h new file mode 100644 index 0000000..fab9772 --- /dev/null +++ b/src/third_party/QtDropbox/src/qtdropbox_global.h @@ -0,0 +1,23 @@ +#ifndef QTDROPBOX_GLOBAL_H +#define QTDROPBOX_GLOBAL_H + +#include + +#if defined(QTDROPBOX_LIBRARY) +# define QTDROPBOXSHARED_EXPORT Q_DECL_EXPORT +#else +# define QTDROPBOXSHARED_EXPORT Q_DECL_IMPORT +#endif + +#ifndef QDROPBOX_HTTP_ERROR_CODES +#define QDROPBOX_HTTP_ERROR_CODES +const qint32 QDROPBOX_ERROR_BAD_INPUT = 400; +const qint32 QDROPBOX_ERROR_EXPIRED_TOKEN = 401; +const qint32 QDROPBOX_ERROR_BAD_OAUTH_REQUEST = 403; +const qint32 QDROPBOX_ERROR_FILE_NOT_FOUND = 404; +const qint32 QDROPBOX_ERROR_WRONG_METHOD = 405; +const qint32 QDROPBOX_ERROR_REQUEST_CAP = 503; +const qint32 QDROPBOX_ERROR_USER_OVER_QUOTA = 507; +#endif + +#endif // QTDROPBOX_GLOBAL_H diff --git a/src/third_party/QtDropbox/tests/README.md b/src/third_party/QtDropbox/tests/README.md new file mode 100644 index 0000000..20d5367 --- /dev/null +++ b/src/third_party/QtDropbox/tests/README.md @@ -0,0 +1,34 @@ +# Qt Dropbox: Unit Tests + +## Introduction +This subproject builds a test application that verifies if QtDropbox is working correctly. + +## Dropbox App Keys +In order to compile and execute the tests you need to create a custom header file called keys.hpp +This file defines two macros that provide the Dropbox application key and shared secret for accessing Dropbox. These keys are needed to connect to Dropbox. + +Example: +``` +#define APP_KEY "myappkey" +#define APP_SECRET "mysecret" +``` + +## Build & Execute +You have to build QtDropbox first by using: + +``` +qmake +make +make install +``` + +Afterwards change to this subdirectory and execute: +``` +cd tests # unless you've done that already +qmake +make +make install +cd ../lib +./qtdropboxtest +``` + diff --git a/src/third_party/QtDropbox/tests/qtdropboxtest.cpp b/src/third_party/QtDropbox/tests/qtdropboxtest.cpp new file mode 100644 index 0000000..d5cc98d --- /dev/null +++ b/src/third_party/QtDropbox/tests/qtdropboxtest.cpp @@ -0,0 +1,378 @@ +#include "qtdropboxtest.hpp" + +typedef QMap > QDropboxFileInfoMap; + +QtDropboxTest::QtDropboxTest() +{ +} + + +/*! + * \brief QDropboxJson: Simple string read + * JSON represents an object with single string value. The test + * tries to read the string value. + */ +void QtDropboxTest::jsonCase1() +{ + QDropboxJson json("{\"string\":\"asdf\"}"); + QVERIFY2(json.isValid(), "json validity"); + QVERIFY2(json.getString("string").compare("asdf") == 0, "string value does not match"); +} + +/*! + * \brief QDropboxJson: Simple int read + * JSON represents an object with a single integer value. The test + * tries to read that value. + */ +void QtDropboxTest::jsonCase2() +{ + QDropboxJson json("{\"int\":1234}"); + QVERIFY2(json.isValid(), "json validity"); + QVERIFY2(json.getInt("int") == 1234, "integer value does not match"); +} + +/*! + * \brief QDropboxJson: Injson validity check + * JSON is invalid. Test confirms invalidity of the JSON. + */ +void QtDropboxTest::jsonCase3() +{ + QDropboxJson json("{\"test\":\"foo\""); + QVERIFY2(!json.isValid(), "injson validity not confirmed"); +} + +/*! + * \brief QDropboxJson: Simple boolean read + * JSON contains a single boolean value. Test accesses this value. + */ +void QtDropboxTest::jsonCase4() +{ + QDropboxJson json("{\"bool\":true}"); + QVERIFY2(json.isValid(), "json validity"); + QVERIFY2(json.getBool("bool"), "boolean value does not match"); +} + +/*! + * \brief QDropboxJson: Simple floating point read + * JSON contains a single double value. Test reads it. + */ +void QtDropboxTest::jsonCase5() +{ + QDropboxJson json("{\"double\":14.323667}"); + QVERIFY2(json.isValid(), "json validity"); + QVERIFY2(json.getDouble("double"), "double value does not match"); +} + +/*! + * \brief QDropboxJson: Subjson read + * JSON contains a subjson that is read, but not evaluated. + */ +void QtDropboxTest::jsonCase6() +{ + QDropboxJson json("{\"json\": {\"string\":\"abcd\"}}"); + QVERIFY2(json.isValid(), "json validity"); + + QDropboxJson* subjson = json.getJson("json"); + + QVERIFY2(subjson!=NULL, "subjson is null"); + QVERIFY2(subjson->isValid(), "subjson invalid"); +} + +/*! + * \brief QDropboxJson: Simple unsigned integer read. + * JSON contains single unsigned integer that is read. + */ +void QtDropboxTest::jsonCase7() +{ + QDropboxJson json("{\"uint\":4294967295}"); + QVERIFY2(json.isValid(), "json validity"); + QVERIFY2(json.getUInt("uint") == 4294967295, "unsigned int value does not match"); +} + +/** + * @brief QDropboxJson: Test if clear works correctly + */ +void QtDropboxTest::jsonCase8() +{ + QDropboxJson json("{\"uint\":4294967295}"); + QVERIFY2(json.isValid(), "json validity"); + json.clear(); + QVERIFY2(json.getUInt("uint") == 0, "internal list not cleared"); + QVERIFY2(json.strContent().isEmpty(), "json string is not cleared"); +} + +/** + * @brief QDropboxJson: Test if array interpretation and access are working. + */ +void QtDropboxTest::jsonCase9() +{ + QDropboxJson json("{\"array\": [1, \"test\", true, 7.3]}"); + QVERIFY2(json.isValid(), "json validity"); + + QStringList l = json.getArray("array"); + QVERIFY2(l.size() == 4, "array list has wrong size"); + QVERIFY2(l.at(0).compare("1") == 0, "int element not correctly formatted"); + QVERIFY2(l.at(1).compare("test") == 0, "string element not correctly formatted"); + QVERIFY2(l.at(2).compare("true") == 0, "boolean element not correctly formatted"); + QVERIFY2(l.at(3).compare("7.3") == 0, "double element not correctly formatted"); +} + +/** + * @brief QDropboxJson: Test if json in array is accessible. + */ +void QtDropboxTest::jsonCase10() +{ + QDropboxJson json("{\"jsonarray\":[{\"key\":\"value\"}]}"); + QVERIFY2(json.isValid(), "json validity"); + + QStringList l = json.getArray("jsonarray"); + QVERIFY2(l.size() == 1, "array list has wrong size"); + + QDropboxJson arrayJson(l.at(0)); + QVERIFY2(arrayJson.isValid(), "json from array is invalid"); + QVERIFY2(arrayJson.getString("key").compare("value") == 0, "json from array contains wrong value"); +} + +/** + * @brief QDropboxJson: Checks if compare() is working by doing a self-comparison. + */ +void QtDropboxTest::jsonCase11() +{ + QString jsonStr = "{\"int\": 1, \"string\": \"test\", \"bool\": true, \"json\": {\"key\": \"value\"}, " + "\"array\": [1, 3.5, {\"arraykey\": \"arrayvalue\"}]}"; + QDropboxJson json(jsonStr); + QVERIFY2(json.isValid(), "json validity"); + QVERIFY2(json.compare(json) == 0, "comparing the same json resulted in negative comparison"); +} + +/** + * @brief QDropboxJson: Test whether strContent() returns the correct JSON + * The test case creates a JSON and another JSON that is based on the return value of strContent() of + * the first JSON. Both JSONs are compared afterwards and expected to be equal. + */ +void QtDropboxTest::jsonCase12() +{ + QString jsonStr = "{\"int\": 1, \"string\": \"test\", \"bool\": true, \"json\": {\"key\": \"value\"}, " + "\"array\": [1, 3.5, {\"arraykey\": \"arrayvalue\"}], \"timestamp\": \"Sat, 21 Aug 2010 22:31:20 +0000\"}"; + QDropboxJson json(jsonStr); + QVERIFY2(json.isValid(), "json validity"); + + QString jsonContent = json.strContent(); + QDropboxJson json2(jsonContent); + QString j2c = json2.strContent(); + + int compare = json.compare(json2); + + QVERIFY2(compare == 0, "string content of json is incorrect or compare is broken"); +} + +/** + * @brief QDropboxJson: Setter functions + * The test verifies if the setter functions are working correctly by setting a value and + * reading it afterwards. + */ +void QtDropboxTest::jsonCase13() +{ + QDropboxJson json; + json.setInt("testInt", 10); + QVERIFY2(json.getInt("testInt") == 10, "setInt of json is incorrect"); + + json.setUInt("testUInt", 10); + QVERIFY2(json.getUInt("testUInt") == 10, "setUInt of json is incorrect"); + + json.setDouble("testDouble", 10.0); + QVERIFY2(json.getDouble("testDouble") == 10.0, "setDouble of json is incorrect"); + + json.setBool("testBool", true); + QVERIFY2(json.getBool("testBool"), "setBool of json is incorrect"); + + json.setString("testString", "10"); + QVERIFY2(json.getString("testString").compare("10"), "setString of json is incorrect"); + + QDateTime time = QDateTime::currentDateTime(); + json.setTimestamp("testTimestamp", time); + QVERIFY2(json.getTimestamp("testTimestamp").daysTo(time) == 0, "setTimestamp of json is incorrect"); +} + +/** + * @brief QDropboxJson: [] in strings + * Verify that square brackets in strings are working correctly. + */ +void QtDropboxTest::jsonCase14() +{ + QDropboxJson json("{\"string\": \"[asdf]abcd\"}"); + QVERIFY2(json.isValid(), "json could not be parsed"); + QVERIFY2(json.getString("string").compare("[asdf]abcd") == 0, "square brackets in string not parsed correctly"); +} + +/** + * @brief QDropboxJson: {} in strings + * Verify that curly brackets within a string are parsed correctly + */ +void QtDropboxTest::jsonCase15() +{ + QDropboxJson json("{\"string\": \"{asdf}abcd\"}"); + QVERIFY2(json.isValid(), "json could not be parsed"); + QVERIFY2(json.getString("string").compare("{asdf}abcd") == 0, + QString("curly brackets in string not parsed correctly [%1]").arg(json.getString("string")).toStdString().c_str()); +} + +/** + * @brief QDropbox: Plaintext Connection + * This test connects to Dropbox and sends a dummy request to check that the connection in + * Plaintext mode. The request is not processed any further! You are required to authorize + * the application for access! The Authorization URI will be printed to you and manual interaction + * is required to pass this test! + */ +void QtDropboxTest::dropboxCase1() +{ + QDropbox dropbox(APP_KEY, APP_SECRET); + QVERIFY2(connectDropbox(&dropbox, QDropbox::Plaintext), "connection error"); + QDropboxAccount accInf = dropbox.requestAccountInfoAndWait(); + QVERIFY2(dropbox.error() == QDropbox::NoError, "error on request"); + return; +} + +/** + * @brief QDropbox: delta + * This test connects to Dropbox and tests the delta API. + * + * You are required to authorize + * the application for access! The Authorization URI will be printed to you and manual interaction + * is required to pass this test! + */ +void QtDropboxTest::dropboxCase2() +{ + QTextStream strout(stdout); + QDropbox dropbox(APP_KEY, APP_SECRET); + QVERIFY2(connectDropbox(&dropbox, QDropbox::Plaintext), "connection error"); + + QString cursor = ""; + bool hasMore = true; + QDropboxFileInfoMap file_cache; + + strout << "requesting delta...\n"; + do + { + QDropboxDeltaResponse r = dropbox.requestDeltaAndWait(cursor, ""); + cursor = r.getNextCursor(); + hasMore = r.hasMore(); + + const QDropboxDeltaEntryMap entries = r.getEntries(); + for(QDropboxDeltaEntryMap::const_iterator i = entries.begin(); i != entries.end(); i++) + { + if(i.value().isNull()) + { + file_cache.remove(i.key()); + } + else + { + strout << "inserting file " << i.key() << "\n"; + file_cache.insert(i.key(), i.value()); + } + } + + } while (hasMore); + strout << "next cursor: " << cursor << "\n"; + for(QDropboxFileInfoMap::const_iterator i = file_cache.begin(); i != file_cache.end(); i++) + { + strout << "file " << i.key() << " last modified " << i.value()->clientModified().toString() << "\n"; + } + + return; +} + +/** + * @brief Prompt the user for authorization. + */ +void QtDropboxTest::authorizeApplication(QDropbox* d) +{ + QTextStream strout(stdout); + QTextStream strin(stdin); + + strout << "##########################################" << endl; + strout << "# You need to grant this test access to #" << endl; + strout << "# your Dropbox! #" << endl; + strout << "# #" << endl; + strout << "# Go to the following URL to do so. #" << endl; + strout << "##########################################" << endl << endl; + + strout << "URL: " << d->authorizeLink().toString() << endl; + QDesktopServices::openUrl(d->authorizeLink()); + strout << "Press ENTER after you authorized the application!"; + strout.flush(); + strin.readLine(); + strout << endl; + d->requestAccessTokenAndWait(); +} + +/** + * @brief Connect a QDropbox to the Dropbox service + * @param d QDropbox object to be connected + * @param m Authentication Method + * @return true on success + */ +bool QtDropboxTest::connectDropbox(QDropbox *d, QDropbox::OAuthMethod m) +{ + QFile tokenFile("tokens"); + + if(tokenFile.exists()) // reuse old tokens + { + if(tokenFile.open(QIODevice::ReadOnly|QIODevice::Text)) + { + QTextStream instream(&tokenFile); + QString token = instream.readLine().trimmed(); + QString secret = instream.readLine().trimmed(); + if(!token.isEmpty() && !secret.isEmpty()) + { + d->setToken(token); + d->setTokenSecret(secret); + tokenFile.close(); + return true; + } + } + tokenFile.close(); + } + + // acquire new token + if(!d->requestTokenAndWait()) + { + qCritical() << "error on token request"; + return false; + } + + d->setAuthMethod(m); + if(!d->requestAccessTokenAndWait()) + { + int i = 0; + for(;i<3; ++i) // we try three times + { + if(d->error() != QDropbox::TokenExpired) + break; + authorizeApplication(d); + } + + if(i>3) + { + qCritical() << "too many tries for authentication"; + return false; + } + + if(d->error() != QDropbox::NoError) + { + qCritical() << "Error: " << d->error() << " - " << d->errorString() << endl; + return false; + } + } + + if(!tokenFile.open(QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text)) + return true; + + QTextStream outstream(&tokenFile); + outstream << d->token() << endl; + outstream << d->tokenSecret() << endl; + tokenFile.close(); + return true; +} + +QTEST_MAIN(QtDropboxTest) diff --git a/src/third_party/QtDropbox/tests/qtdropboxtest.hpp b/src/third_party/QtDropbox/tests/qtdropboxtest.hpp new file mode 100644 index 0000000..045cb48 --- /dev/null +++ b/src/third_party/QtDropbox/tests/qtdropboxtest.hpp @@ -0,0 +1,44 @@ +#ifndef QDROPBOXJSONTEST_H +#define QDROPBOXJSONTEST_H + +#include +#include +#include "qtdropbox.h" +#include "keys.hpp" + +class QtDropboxTest : public QObject +{ + Q_OBJECT + +public: + QtDropboxTest(); + +private Q_SLOTS: + + /* QDropboxJson */ + void jsonCase1(); + void jsonCase2(); + void jsonCase3(); + void jsonCase4(); + void jsonCase5(); + void jsonCase6(); + void jsonCase7(); + void jsonCase8(); + void jsonCase9(); + void jsonCase10(); + void jsonCase11(); + void jsonCase12(); + void jsonCase13(); + void jsonCase14(); + void jsonCase15(); + + /* QDropbox */ + void dropboxCase1(); + void dropboxCase2(); + +private: + void authorizeApplication(QDropbox *d); + bool connectDropbox(QDropbox* d, QDropbox::OAuthMethod m); +}; + +#endif // QDROPBOXJSONTEST_H diff --git a/src/third_party/QtDropbox/tests/tests.pro b/src/third_party/QtDropbox/tests/tests.pro new file mode 100644 index 0000000..e8639fa --- /dev/null +++ b/src/third_party/QtDropbox/tests/tests.pro @@ -0,0 +1,31 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2013-01-29T00:05:24 +# +#------------------------------------------------- + +QT += network testlib xml gui + +TARGET = qtdropboxtest +CONFIG += console +CONFIG -= app_bundle + +TEMPLATE = app + + +SOURCES += \ + qtdropboxtest.cpp +DEFINES += SRCDIR=\\\"$$PWD/\\\" + +HEADERS += \ + qtdropboxtest.hpp \ + keys.hpp \ + keys.hpp + +LIBS += -L../../build-qtdropbox-Desktop-Debug +INCLUDEPATH += ../src/ + +include(../libqtdropbox.pri) + +target.path = ../lib/ +INSTALLS += target diff --git a/tests/main.cpp b/tests/main.cpp new file mode 100644 index 0000000..1043e1d --- /dev/null +++ b/tests/main.cpp @@ -0,0 +1,4 @@ +#include + +// SailCalcTestSet is just a convenient name for reports - not linked to any of the main project entities +QUICK_TEST_MAIN(TasklistTestSet) diff --git a/tests/runTestsOnDevice.sh b/tests/runTestsOnDevice.sh new file mode 100644 index 0000000..4ebc943 --- /dev/null +++ b/tests/runTestsOnDevice.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Script for running tests. That's for specifying just one argument in QtCreator's configuration +/usr/bin/tst-harbour-tasklist -input /usr/share/tst-harbour-tasklist + +# When you'll get some QML components in the main app, you'll need to import them to the test run +# /usr/bin/tst-harbour-tasklist -input /usr/share/tst-harbour-tasklist -import /usr/share/harbour-tasklist/qml/components \ No newline at end of file diff --git a/tests/tests.pro b/tests/tests.pro new file mode 100644 index 0000000..c14feb0 --- /dev/null +++ b/tests/tests.pro @@ -0,0 +1,37 @@ +TEMPLATE = app + +# The name of your app +TARGET = tst-harbour-tasklist + +CONFIG += qmltestcase + +TARGETPATH = /usr/bin +target.path = $$TARGETPATH + +DEPLOYMENT_PATH = /usr/share/$$TARGET +qml.path = $$DEPLOYMENT_PATH + +extra.path = $$DEPLOYMENT_PATH +extra.files = runTestsOnDevice.sh + +# defining QUICK_TEST_SOURCE_DIR here doesn't work QtCreator keeps injecting another definition to command line (from CONFIG += qmltestcase ?) +#DEFINES += QUICK_TEST_SOURCE_DIR=\"\\\"\"$${DEPLOYMENT_PATH}/\"\\\"\" +DEFINES += DEPLOYMENT_PATH=\"\\\"\"$${DEPLOYMENT_PATH}/\"\\\"\" + +# C++ sources +SOURCES += main.cpp + +# C++ headers +HEADERS += + +INSTALLS += target qml extra + +# QML files and folders +qml.files = *.qml + +OTHER_FILES += \ + tst_RealUiTest.qml \ + tst_NonUiTests.qml + + + diff --git a/tests/tst_NonUiTests.qml b/tests/tst_NonUiTests.qml new file mode 100644 index 0000000..3fa48b0 --- /dev/null +++ b/tests/tst_NonUiTests.qml @@ -0,0 +1,29 @@ +/** + * Tests that operate with instantiated QML components, yet don't really need Application Window to be created + * That will produce a lot of warnings, UI utilities such as mouseClick won't work, but the test code becomes simpler + * and runs faster + * And if you do want to operate on the muse level, you can get almost there via e.g. triggering clicked(null) signal handler + * + */ + +import QtQuick 2.0 +import QtTest 1.0 + +// At runtime proper folder to import is "../harbour-tasklist/qml/pages" +// You can check the main app deployment folder from it's DEPLOYMENT_PATH qmake var in .pro +// Faster to check from .spec file, however + +// At design-time I uncomment import "../src/qml/pages" so that QtCreator auto-completion would work + +//import "../src/qml/pages" +import "../harbour-tasklist/qml/pages" + +TestCase { + name: "footest" + + function test_fail() { + fail() + } +} + + diff --git a/third_party/QtDropbox b/third_party/QtDropbox deleted file mode 160000 index 8f09551..0000000 --- a/third_party/QtDropbox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8f09551f335a0961f10b95cf43a879c486479622 From 62b697bb69fc4b4b91f1778bf5d2016770683134 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Thu, 12 Jan 2017 21:32:28 +0100 Subject: [PATCH 5/6] fixing supmodules part1 --- .gitmodules | 3 - src/third_party/QtDropbox/.gitignore | 14 - src/third_party/QtDropbox/.travis.yml | 30 - src/third_party/QtDropbox/AUTHORS.md | 11 - src/third_party/QtDropbox/GPL | 674 --- src/third_party/QtDropbox/INSTALL.md | 48 - src/third_party/QtDropbox/LICENCE | 165 - .../QtDropbox/QtDropbox-Info.plist | 30 - src/third_party/QtDropbox/README.md | 88 - src/third_party/QtDropbox/doc/DEVELOPMENT.md | 82 - src/third_party/QtDropbox/doc/design.uml | 4690 ----------------- src/third_party/QtDropbox/doc/doxygen.conf | 1749 ------ src/third_party/QtDropbox/libqtdropbox.pri | 13 - .../QtDropbox/qtdropbox.config.pri | 21 - src/third_party/QtDropbox/qtdropbox.pri | 23 - src/third_party/QtDropbox/qtdropbox.pro | 34 - src/third_party/QtDropbox/src/qdropbox.cpp | 1257 ----- src/third_party/QtDropbox/src/qdropbox.h | 664 --- .../QtDropbox/src/qdropboxaccount.cpp | 146 - .../QtDropbox/src/qdropboxaccount.h | 114 - .../QtDropbox/src/qdropboxdeltaresponse.cpp | 63 - .../QtDropbox/src/qdropboxdeltaresponse.h | 67 - .../QtDropbox/src/qdropboxfile.cpp | 586 -- src/third_party/QtDropbox/src/qdropboxfile.h | 269 - .../QtDropbox/src/qdropboxfileinfo.cpp | 178 - .../QtDropbox/src/qdropboxfileinfo.h | 183 - .../QtDropbox/src/qdropboxjson.cpp | 747 --- src/third_party/QtDropbox/src/qdropboxjson.h | 259 - src/third_party/QtDropbox/src/qtdropbox.h | 11 - .../QtDropbox/src/qtdropbox_global.h | 23 - src/third_party/QtDropbox/tests/README.md | 34 - .../QtDropbox/tests/qtdropboxtest.cpp | 378 -- .../QtDropbox/tests/qtdropboxtest.hpp | 44 - src/third_party/QtDropbox/tests/tests.pro | 31 - 34 files changed, 12729 deletions(-) delete mode 100644 .gitmodules delete mode 100644 src/third_party/QtDropbox/.gitignore delete mode 100644 src/third_party/QtDropbox/.travis.yml delete mode 100644 src/third_party/QtDropbox/AUTHORS.md delete mode 100644 src/third_party/QtDropbox/GPL delete mode 100644 src/third_party/QtDropbox/INSTALL.md delete mode 100644 src/third_party/QtDropbox/LICENCE delete mode 100644 src/third_party/QtDropbox/QtDropbox-Info.plist delete mode 100644 src/third_party/QtDropbox/README.md delete mode 100644 src/third_party/QtDropbox/doc/DEVELOPMENT.md delete mode 100644 src/third_party/QtDropbox/doc/design.uml delete mode 100644 src/third_party/QtDropbox/doc/doxygen.conf delete mode 100644 src/third_party/QtDropbox/libqtdropbox.pri delete mode 100644 src/third_party/QtDropbox/qtdropbox.config.pri delete mode 100644 src/third_party/QtDropbox/qtdropbox.pri delete mode 100644 src/third_party/QtDropbox/qtdropbox.pro delete mode 100644 src/third_party/QtDropbox/src/qdropbox.cpp delete mode 100644 src/third_party/QtDropbox/src/qdropbox.h delete mode 100644 src/third_party/QtDropbox/src/qdropboxaccount.cpp delete mode 100644 src/third_party/QtDropbox/src/qdropboxaccount.h delete mode 100644 src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp delete mode 100644 src/third_party/QtDropbox/src/qdropboxdeltaresponse.h delete mode 100644 src/third_party/QtDropbox/src/qdropboxfile.cpp delete mode 100644 src/third_party/QtDropbox/src/qdropboxfile.h delete mode 100644 src/third_party/QtDropbox/src/qdropboxfileinfo.cpp delete mode 100644 src/third_party/QtDropbox/src/qdropboxfileinfo.h delete mode 100644 src/third_party/QtDropbox/src/qdropboxjson.cpp delete mode 100644 src/third_party/QtDropbox/src/qdropboxjson.h delete mode 100644 src/third_party/QtDropbox/src/qtdropbox.h delete mode 100644 src/third_party/QtDropbox/src/qtdropbox_global.h delete mode 100644 src/third_party/QtDropbox/tests/README.md delete mode 100644 src/third_party/QtDropbox/tests/qtdropboxtest.cpp delete mode 100644 src/third_party/QtDropbox/tests/qtdropboxtest.hpp delete mode 100644 src/third_party/QtDropbox/tests/tests.pro diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 8dc9880..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "src/third_party/QtDropbox"] - path = src/third_party/QtDropbox - url = https://github.com/lycis/QtDropbox.git diff --git a/src/third_party/QtDropbox/.gitignore b/src/third_party/QtDropbox/.gitignore deleted file mode 100644 index aa8e55e..0000000 --- a/src/third_party/QtDropbox/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.user -*~ -*.pdb -build-tests-Desktop_Qt_5_4_0_MSVC2013_64bit-Debug/Makefile -*.Debug -build-tests-Desktop_Qt_5_4_0_MSVC2013_64bit-Debug/Makefile.Release -moc_* -qtdropbox.sdf -*.sln -qtdropbox.v12.suo -*.vcxproj -qtdropbox.vcxproj.filters -x64/* -*.opensdf \ No newline at end of file diff --git a/src/third_party/QtDropbox/.travis.yml b/src/third_party/QtDropbox/.travis.yml deleted file mode 100644 index 9e276f9..0000000 --- a/src/third_party/QtDropbox/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: cpp - -compiler: - - gcc - - clang - -env: - global: - # The next declration is the encrypted COVERITY_SCAN_TOKEN, created - # via the "travis encrypt" command using the project repo's public key - - secure: "JHeF0oqVGey6FAfBEkmubhuQlsPnTtuD61A8l8AmkHo1ZosU00hE8bUwsux6JDLpmuwdY5TFzVWwayp8p9A5YxsvypbdyXqMv02uoYrUTyjP5iEQ3LVcrivxce8ElOTpV/LSnSX8RoS7EZXxVDFe0hmDSosC60dxLW8QSVUw5hY=" - -addons: - coverity_scan: - project: - name: "lycis/QtDropbox" - description: "Your project description here" - notification_email: daniel@deder.at - build_command_prepend: qmake - build_command: make - branch_pattern: master - -install: - - sudo apt-add-repository --yes ppa:ubuntu-sdk-team/ppa - - sudo apt-get update - - sudo apt-get install qt5-default - -script: - - qmake - - make \ No newline at end of file diff --git a/src/third_party/QtDropbox/AUTHORS.md b/src/third_party/QtDropbox/AUTHORS.md deleted file mode 100644 index 5469793..0000000 --- a/src/third_party/QtDropbox/AUTHORS.md +++ /dev/null @@ -1,11 +0,0 @@ -# Authors -All these people did some great work the project. This file is meant to appreciate their efforts and involvement in the project. - -## MAINTAINER -Daniel Eder (lycis) - -## CONTRIBUTORS -Special thanks to all the contributors! You brought some real great enhancement to the project. - -Mehrez Kristou (anjinkristou) -Aldama Pérez (leptonverde) diff --git a/src/third_party/QtDropbox/GPL b/src/third_party/QtDropbox/GPL deleted file mode 100644 index 20d40b6..0000000 --- a/src/third_party/QtDropbox/GPL +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/src/third_party/QtDropbox/INSTALL.md b/src/third_party/QtDropbox/INSTALL.md deleted file mode 100644 index 030c313..0000000 --- a/src/third_party/QtDropbox/INSTALL.md +++ /dev/null @@ -1,48 +0,0 @@ -# QtDropbox Installation Guide - -## Dependencies -To build and use QtDropbox you'll need the Qt C++ Framework with -version 4.7 or higher available for download at -[Qt Project](http://qt-project.org/). - -To generate a documentation you need to have doxygen installed. - -## Building -QtDropbox is built by using these commands: - - qmake - make - -If you want to generate a documentation use - - make documentation - -After all binaries are compiled use - - make install - -This will create the directories lib/ and qtdropbox/. - -The lib/ directory contains the compiled QtDropbox library. These are -not automatically copied to your global library directory -(/usr/local/lib or /usr/lib on Linux) - you'll have to do this manually -if you wish them to be available system wide. - -The qtdropbox/ directory contains all header files and the -libqtdropbox.pri project definitions file. You'll need to copy this -folder into your project that will use QtDropbox as it contains all -necessary definitions. See _Usage_ below for details. - -## Usage -### Using with Qt projects -When including QtDropbox into your project you have to -include the libqtdropbox.pri project definitions file. This will add -all necessary header files to your project and link with the library. - -The network module of Qt will automatically be added to your project -as it is required to run QtDropbox. - -### Using with other C++ projects -QtDropbox is not intended to be used with non-Qt projects. If you -make it run - tell me :) - diff --git a/src/third_party/QtDropbox/LICENCE b/src/third_party/QtDropbox/LICENCE deleted file mode 100644 index 02bbb60..0000000 --- a/src/third_party/QtDropbox/LICENCE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - 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. \ No newline at end of file diff --git a/src/third_party/QtDropbox/QtDropbox-Info.plist b/src/third_party/QtDropbox/QtDropbox-Info.plist deleted file mode 100644 index 2bf3601..0000000 --- a/src/third_party/QtDropbox/QtDropbox-Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - de_DE - CFBundleIdentifier - lycis.github.io.QtDropbox - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - QtDropbox - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1.0 - CFBundleGetInfoString - Created by Alexander Saal - CFBundleSignature - ???? - CFBundleExecutable - QtDropbox - NSHumanReadableCopyright - QtDropbox - by Daniel Eder and/or its subsidiary(-ies) - -Copyright © 2013 Daniel Eder. All rights reserved. - - diff --git a/src/third_party/QtDropbox/README.md b/src/third_party/QtDropbox/README.md deleted file mode 100644 index 522e2f3..0000000 --- a/src/third_party/QtDropbox/README.md +++ /dev/null @@ -1,88 +0,0 @@ -[![Build Status](https://travis-ci.org/lycis/QtDropbox.png?branch=master)](https://travis-ci.org/lycis/QtDropbox) -[![Coverity Scan Build Status](https://scan.coverity.com/projects/1639/badge.svg)](https://scan.coverity.com/projects/1639) - -# QtDropbox - -## In short -QtDropbox is an API for the well known cloud storage service [Dropbox](http://www.dropbox.com). - -## A bit longer -Basically QtDropbox aims to provide an easy to use possibility to access the REST API of -Dropbox. All HTTP calls are hidden behind the curtains of neat C++/Qt classes with nice -method names and specific uses. - -## Different Qt versions -The project is targeting the most recent version of Qt and thus was ported to Qt5. In the -beginning the project was developed for Qt4 and as there are some projects based on Qt4 -out there the legacy version is still being supported. - -The master branch always provides the most recent version of the project and at the moment -this is the Qt5 version. - -### Checking out legacy versions -Legacy versions such as the one supporting Qt4 are provided in specific branches. Here is a -short list of which branch to check out for the specific legacy versions: - -* Qt4.x -> qt4 - -Mind that the branch with name `qt5` is currently an unused stub! - -### Support for legacy versions -The ongoing development focuses on the `master` branch first. This means that legacy versions -are usually not further improved with new features. Bugfixes will be provided though! - -This should not indicate that legacy versions won't receive important new features but they -are rather implemented on request only. If there is a specific feature that is already -implemented in the most recent version but you need it in a legacy version (e.g. Qt4.x) -just open an issue. - -## Development -QtDropbox is in ongoing development so not all features provided by the Dropbox API are available -right now. If you have some knowledge about C++ (with Qt framework and/or the Dropbox REST API) you -are welcome to contribute to this project. For details take a look at the -[project webpage](http://lycis.github.com/QtDropbox/) - -### Current status -QtDropbox is constantly improved and developed further to include all possible requests you could -send to Dropbox and to simplify access. Below is a list of features that are currently available and -tested: - -Currently in progress: -* Complete documentation -* Examples - -## Features -### General -* Connect to Dropbox -* Access user account information (quotas, user name, share links, ...) -* Parse JSON strings - -### File Access -* Access files like a local QFile to read and write data -* Access file and directory metadata -* Access file revisions -* Reading file information and metadata - -Postponed to next version: -* Acessing and traversing the directory structure - -## Documentation -You can generate a documentation of all classes by: - - qmake - make documentation - -This will generate a directory called doxy/ that contains a HTML documentation. Input files -to generate a LaTeX based configuration are supplied as well. - -## Further information -There are some files apart this README that may provide some useful information: - -* LICENSE - It's LGPL v3 although that is currently not mentioned in the files -* INSTALL.md - Installation and usage instructions -* doc/ - Generally everthing inside this directory is information. -* doc/DEVELOPMENT.md - Development guidelines. Please read if you want to contribute! diff --git a/src/third_party/QtDropbox/doc/DEVELOPMENT.md b/src/third_party/QtDropbox/doc/DEVELOPMENT.md deleted file mode 100644 index f5554e3..0000000 --- a/src/third_party/QtDropbox/doc/DEVELOPMENT.md +++ /dev/null @@ -1,82 +0,0 @@ -# Development Guidelines - -## Introduction -This document describes guidelines for the contribution and development of QtDropbox. -Please read on if you plan to contribute your ideas and/or code to the project as many things will be clarified in here. - -> This document contains guidelines! So please treat it like this. -> Guidelines are no fixed rules, so if you see need to break them do so - but only do so if absolutely necessary not just because -> they seem to be inconvenient. - -## Project Philosophy -### Mission -> Our mission is to create a library for C++/Qt to provide easy access to the services of [Dropbox](http://www.dropbox.com/). - -### Linking External Libraries -A great part about providing *easy* access is to keep the projects dependencies as little as possible. There are many -really cool libraries out there that would provide great enhancement to the features of the features. Whenever you -think that a certain library would make things easier for us keep one thing in mind: *Just because it is easy for us -it will be more complex for the users of QtDropbox as they have to satisfy another dependency.* - -So how to add third party libraries? If you add them make sure the user of QtDropbox has to activate the library with a -specific switch. So the user can always choose to disable a specific third party library and just go by using the plain -old features provided by QtDropbox itself. As you can guess this requires you to *extend* and *not replace* the feature -set provided by QtDropbox. - -#### Example -You found a great library that could be used to enhance the capabilities of QDropboxJson (used to interpret JSON objects -returned by Dropbox). Of course you can use this library th extend QDropboxJson but make sure the user has a possibility -to exclude the third party library from the project: The user has to compile QtDropbox with a specific switch (e.g. -the user has to add `DEFINES += USE_EXT_JSONLIB` to `qtdropbox.pro`). - -Now you can extend QDropboxJson to use the external library when the switch is defined. Else the standard QDropboxJson -is used. - -### Adding Qt Modules -As with external libraries try to link as few Qt modules as possible. Whenever you add new functionality that requires -an other Qt module than Network or XML provide a possibility to exclude these modules. If a feature that is provided -by including a new module is so great that we won't miss it, we'll consider adding it to the fixed dependencies of the -library. - -### Communication -I usually think writing about a polite and friendly tone is not necessary but... Please be polite and friendly in your -communication - if you are not we feel free to ignore and/or delete your requests. Furthermore keep in mind that we -are working on this project in our spare time and that we are all working in different time zones. Communication can -be slow but your requests will be answered. We apologise for any inconvenience caused thereby. - -### E-Mail -You can reach the maintainer of the project by mailing to qtdropbox (at) deder (dot) at. If you want to join the team -use this possibility. If you want to file a bug report you can do this to by mail but filing an issue via github.com is -preferred. - -Beware that the project mailing address is only looked after by the principal maintainer of the project. It may take -some time to process your mails. In case of problems it may be faster to open a new issue because there's a higher -possibility that somebody might read it. - -### Bug Reports -Whenever you want to file a bug report and hence broken or missing functionality please open a new issue at github. If -you want to request a feature please do so by opening an issue too. - -### Patches -You can contribute your code in two ways: - 1. Create a Pull Request on github - 1. Send your patch to the project mailing address: qtdropbox (at) deder (dot) at -We will look into your changes and decide to either accept or refuse them. You will be notified in both cases. Please -keep in mind that the project mailing address is only read by the principal maintainer and may take more time (see above). - -## Coding Conventions -The coding conventions of QtDropbox are not very strict. There are only a few requirements to the code: - -1. Indentation has to be 4 characters wide. -1. Add meaningful debug output to functions. -1. Keep nested statements simple. (rule of thumb: not more than 2 nested statements) -1. Private member start with _ (underscore) -1. Add doxygen comments to public items. (also use \todo, \warning and \bug gotchas!) - -For all other issues use your built-in common sense or refer to a [C++ Coding Standard](http://www.possibility.com/Cpp/CppCodingStandard.html). - -The main goal of every code is to work and to be maintainable - so please keep it readable! - -## Unit Testing -Whenever you change any functionality you should execute all unit test cases as a form of regression testing. Additionally -you should create new unit tests for not yet covered test cases (e.g. newly implemented functions) and fixed user problems. diff --git a/src/third_party/QtDropbox/doc/design.uml b/src/third_party/QtDropbox/doc/design.uml deleted file mode 100644 index a566e56..0000000 --- a/src/third_party/QtDropbox/doc/design.uml +++ /dev/null @@ -1,4690 +0,0 @@ - - - - - - -UMLStandard - - - - -Untitled -5 - -Use Case Model -UMLStandard -useCaseModel -7nMF4TYiyE2tufmAssy54AAA -1 - -Main -fX9UkuhtY02dWHAFkfkj7gAA - -WSoU045WWEiC+6qrTuWUYAAA - - - - -Analysis Model -UMLStandard -analysisModel -7nMF4TYiyE2tufmAssy54AAA -1 - -Main -True -RobustnessDiagram -0KUxpJ9OL0KWm6nUpZkbIQAA - -4ce++F1r+UqAdXl5aV3A6wAA - - - - -Design Model -UMLStandard -designModel -7nMF4TYiyE2tufmAssy54AAA -2 - -Main -True -N2j+7nhBQEq+mO8YqFlxXAAA - -Kln0kjBxhkixAd0S80umLgAA - - - -Overview of Design Model -N2j+7nhBQEq+mO8YqFlxXAAA - -1QENY9/iWEKShKNWMAtZ5QAA -36 - -clMaroon -$00B9FFFF -56 -240 -164 -108 -o/YVcpgbbUmwpN4wodhPTAAA - - -1 -qdropbox_request - - -<<CppStruct>> - - -False - - - -o/YVcpgbbUmwpN4wodhPTAAA - - -o/YVcpgbbUmwpN4wodhPTAAA - - -False -o/YVcpgbbUmwpN4wodhPTAAA - - - -clMaroon -$00B9FFFF -2092 -532 -126 -82 -Salq1uHht0SrITdCzNgz8gAA - - -1 -qdropboxjson_value - - -<<CppUnion>> - - -False - - - -Salq1uHht0SrITdCzNgz8gAA - - -Salq1uHht0SrITdCzNgz8gAA - - -False -Salq1uHht0SrITdCzNgz8gAA - - - -clMaroon -$00B9FFFF -1824 -404 -173 -82 -rzEAq8I6FE+PpXanPndneQAA - - -1 -qdropboxjson_entry - - -<<CppStruct>> - - -False - - - -rzEAq8I6FE+PpXanPndneQAA - - -rzEAq8I6FE+PpXanPndneQAA - - -False -rzEAq8I6FE+PpXanPndneQAA - - - -clMaroon -$00B9FFFF -64 -132 -148 -56 -/d+HCPT/kEWbrwf4YZSB6wAA - - -1 -qdropbox_request_type - - -<<CppTypedef: int>> - - -False - - - -/d+HCPT/kEWbrwf4YZSB6wAA - - -/d+HCPT/kEWbrwf4YZSB6wAA - - -False -/d+HCPT/kEWbrwf4YZSB6wAA - - - -clMaroon -$00B9FFFF -2080 -308 -159 -56 -ivoGuCI+nU+pxM1i7fml2wAA - - -1 -qdropboxjson_entry_type - - -<<CppTypedef: char>> - - -False - - - -ivoGuCI+nU+pxM1i7fml2wAA - - -ivoGuCI+nU+pxM1i7fml2wAA - - -False -ivoGuCI+nU+pxM1i7fml2wAA - - - -clMaroon -$00B9FFFF -380 -108 -510 -849 -W0IFCTrokkm6wkpDiDO1ogAA - - -1 -QDropbox - - -False - - -False - - - -W0IFCTrokkm6wkpDiDO1ogAA - - -W0IFCTrokkm6wkpDiDO1ogAA - - -False -W0IFCTrokkm6wkpDiDO1ogAA - - - -clMaroon -$00B9FFFF -964 -264 -294 -355 -sFX2E/MBlUO0Eb/e07cRggAA - - -1 -QDropbxAccount - - -False - - -False - - - -sFX2E/MBlUO0Eb/e07cRggAA - - -sFX2E/MBlUO0Eb/e07cRggAA - - -False -sFX2E/MBlUO0Eb/e07cRggAA - - - -clMaroon -$00B9FFFF -1468 -300 -290 -290 -3ldG67+ChU+zoMSfNP9q2wAA - - -1 -QDropboxJson - - -False - - -False - - - -3ldG67+ChU+zoMSfNP9q2wAA - - -3ldG67+ChU+zoMSfNP9q2wAA - - -False -3ldG67+ChU+zoMSfNP9q2wAA - - - -clMaroon -$00B9FFFF -2095,363;1996,406 -VOlKTB1AvEaHTlhVfnU5rQAA -udGn3QfWsk66VA2UGYIflQAA -oWy/EB6NVEu1satRlEtRCQAA - -False -1,5707963267949 -15 -VOlKTB1AvEaHTlhVfnU5rQAA - - -False -1,5707963267949 -30 -VOlKTB1AvEaHTlhVfnU5rQAA - - -False --1,5707963267949 -15 -VOlKTB1AvEaHTlhVfnU5rQAA - - -False --0,523598775598299 -30 -epHead -RxpcKin3lkqsU8zB5Y4M/AAA - - -False -0,523598775598299 -30 -epTail -cCBCNiyDXkmOtC2DhJJV0AAA - - -False -0,523598775598299 -25 -epHead -RxpcKin3lkqsU8zB5Y4M/AAA - - -False --0,523598775598299 -25 -epTail -cCBCNiyDXkmOtC2DhJJV0AAA - - -False --0,785398163397448 -40 -epHead -RxpcKin3lkqsU8zB5Y4M/AAA - - -False -0,785398163397448 -40 -epTail -cCBCNiyDXkmOtC2DhJJV0AAA - - -False --1000 --1000 -50 -8 -RxpcKin3lkqsU8zB5Y4M/AAA - - -False --1000 --1000 -50 -8 -cCBCNiyDXkmOtC2DhJJV0AAA - - - -clMaroon -$00B9FFFF -2092,539;1989,485 -3Zi5rozxKkiJPK0G4b2WtwAA -udGn3QfWsk66VA2UGYIflQAA -J9krYyYLt0GkMrlUcNnDSQAA - -False -1,5707963267949 -15 -3Zi5rozxKkiJPK0G4b2WtwAA - - -False -1,5707963267949 -30 -3Zi5rozxKkiJPK0G4b2WtwAA - - -False --1,5707963267949 -15 -3Zi5rozxKkiJPK0G4b2WtwAA - - -False --0,523598775598299 -30 -epHead -atST4kLuZkugkRTnYjJOfQAA - - -False -0,523598775598299 -30 -epTail -w4a52oBqSUaVRdbIme4AXwAA - - -False -0,523598775598299 -25 -epHead -atST4kLuZkugkRTnYjJOfQAA - - -False --0,523598775598299 -25 -epTail -w4a52oBqSUaVRdbIme4AXwAA - - -False --0,785398163397448 -40 -epHead -atST4kLuZkugkRTnYjJOfQAA - - -False -0,785398163397448 -40 -epTail -w4a52oBqSUaVRdbIme4AXwAA - - -False --1000 --1000 -50 -8 -atST4kLuZkugkRTnYjJOfQAA - - -False --1000 --1000 -50 -8 -w4a52oBqSUaVRdbIme4AXwAA - - - -clMaroon -$00B9FFFF -1824,444;1757,444 -NxUJykImGEWbIsX5U6genQAA -wjFp+lbpQ0SnrIsXCR3AKwAA -udGn3QfWsk66VA2UGYIflQAA - -False -1,5707963267949 -15 -NxUJykImGEWbIsX5U6genQAA - - -False -1,5707963267949 -30 -NxUJykImGEWbIsX5U6genQAA - - -False --1,5707963267949 -15 -NxUJykImGEWbIsX5U6genQAA - - -False --0,523598775598299 -30 -epHead -M8LtzaCkj0uA37CAetQEfAAA - - -False -0,523598775598299 -30 -epTail -PTo3BruOskCRO4OIKJ1lowAA - - -False -0,523598775598299 -25 -epHead -M8LtzaCkj0uA37CAetQEfAAA - - -False --0,523598775598299 -25 -epTail -PTo3BruOskCRO4OIKJ1lowAA - - -False --0,785398163397448 -40 -epHead -M8LtzaCkj0uA37CAetQEfAAA - - -False -0,785398163397448 -40 -epTail -PTo3BruOskCRO4OIKJ1lowAA - - -False --1000 --1000 -50 -8 -M8LtzaCkj0uA37CAetQEfAAA - - -False --1000 --1000 -50 -8 -PTo3BruOskCRO4OIKJ1lowAA - - - -clMaroon -$00B9FFFF -137,187;137,240 -U9kmFCZ0gUSdYHEaayZEvQAA -/LiUQAimsEu0FUq6ze2IvgAA -5EizNq5SCEClSQJZxerjOQAA - -False -1,5707963267949 -15 -U9kmFCZ0gUSdYHEaayZEvQAA - - -False -1,5707963267949 -30 -U9kmFCZ0gUSdYHEaayZEvQAA - - -False --1,5707963267949 -15 -U9kmFCZ0gUSdYHEaayZEvQAA - - -False --0,523598775598299 -30 -epHead -NZL1/floAU6ZzHTPyQilyQAA - - -False -0,523598775598299 -30 -epTail -EfswkUxaeUyInrcPDUKnfQAA - - -False -0,523598775598299 -25 -epHead -NZL1/floAU6ZzHTPyQilyQAA - - -False --0,523598775598299 -25 -epTail -EfswkUxaeUyInrcPDUKnfQAA - - -False --0,785398163397448 -40 -epHead -NZL1/floAU6ZzHTPyQilyQAA - - -False -0,785398163397448 -40 -epTail -EfswkUxaeUyInrcPDUKnfQAA - - -False --1000 --1000 -50 -8 -NZL1/floAU6ZzHTPyQilyQAA - - -False --1000 --1000 -50 -8 -EfswkUxaeUyInrcPDUKnfQAA - - - -clMaroon -$00B9FFFF -219,332;380,410 -Kyb9wub+W0K//wRXxXR+8wAA -ZQwGc20gJUK2YJ2LtwcTMgAA -/LiUQAimsEu0FUq6ze2IvgAA - -1,5707963267949 -15 -used in requestMap -Kyb9wub+W0K//wRXxXR+8wAA - - -False -1,5707963267949 -30 -Kyb9wub+W0K//wRXxXR+8wAA - - -False --1,5707963267949 -15 -Kyb9wub+W0K//wRXxXR+8wAA - - -False --0,523598775598299 -30 -epHead -RiUuUvyZOUS+flTYkM/BJgAA - - -False -0,523598775598299 -30 -epTail -nGz2fNtAiECky4y27651lQAA - - -False -0,523598775598299 -25 -epHead -RiUuUvyZOUS+flTYkM/BJgAA - - -False --0,523598775598299 -25 -epTail -nGz2fNtAiECky4y27651lQAA - - -False --0,785398163397448 -40 -epHead -RiUuUvyZOUS+flTYkM/BJgAA - - -False -0,785398163397448 -40 -epTail -nGz2fNtAiECky4y27651lQAA - - -False --1000 --1000 -50 -8 -RiUuUvyZOUS+flTYkM/BJgAA - - -False --1000 --1000 -50 -8 -nGz2fNtAiECky4y27651lQAA - - - -clMaroon -$00B9FFFF -140 -372 -96 -69 -qk1BGGqjnkSnhKy4dM5cdwAA - - -1 -errorOccured - - -<<signal>> - - -False - - - -qk1BGGqjnkSnhKy4dM5cdwAA - - -qk1BGGqjnkSnhKy4dM5cdwAA - - - -clMaroon -$00B9FFFF -208 -464 -85 -56 -+/W13Cj9q0CX8sXB5mCpCwAA - - -1 -tokenExpired - - -<<signal>> - - -False - - - -+/W13Cj9q0CX8sXB5mCpCwAA - - -+/W13Cj9q0CX8sXB5mCpCwAA - - - -clMaroon -$00B9FFFF -168 -632 -80 -56 -lHzz4UFjMEGbYtbZkKiWcgAA - - -1 -fileNotFound - - -<<signal>> - - -False - - - -lHzz4UFjMEGbYtbZkKiWcgAA - - -lHzz4UFjMEGbYtbZkKiWcgAA - - - -clMaroon -$00B9FFFF -92 -752 -111 -69 -PkX3MuawrUOgUybeiHMd4AAA - - -1 -operationFinished - - -<<signal>> - - -False - - - -PkX3MuawrUOgUybeiHMd4AAA - - -PkX3MuawrUOgUybeiHMd4AAA - - - -clMaroon -$00B9FFFF -296 -984 -135 -82 -GEINB+W8lUi6WPX9cbLO6QAA - - -1 -requestTokenFinished - - -<<signal>> - - -False - - - -GEINB+W8lUi6WPX9cbLO6QAA - - -GEINB+W8lUi6WPX9cbLO6QAA - - - -clMaroon -$00B9FFFF -44 -536 -129 -82 -hBjoYmz+wkOFeo0G33HYTAAA - - -1 -accessTokenFinished - - -<<signal>> - - -False - - - -hBjoYmz+wkOFeo0G33HYTAAA - - -hBjoYmz+wkOFeo0G33HYTAAA - - - -clMaroon -$00B9FFFF -520 -996 -92 -82 -fGcMDHG0HUKA3XRLyM1/+AAA - - -1 -tokenChanged - - -<<signal>> - - -False - - - -fGcMDHG0HUKA3XRLyM1/+AAA - - -fGcMDHG0HUKA3XRLyM1/+AAA - - - -clMaroon -$00B9FFFF -180 -860 -121 -69 -RuXWIak58U6HssZVXcXdpAAA - - -1 -accountInfo - - -<<signal>> - - -False - - - -RuXWIak58U6HssZVXcXdpAAA - - -RuXWIak58U6HssZVXcXdpAAA - - - -clMaroon -$00B9FFFF -235,420;380,461 -BqJXqZ8et0ewcZz7gJsiJwAA -ZQwGc20gJUK2YJ2LtwcTMgAA -y470jG5/1kWKyTvmvBSciwAA - -1,5707963267949 -15 -emit -BqJXqZ8et0ewcZz7gJsiJwAA - - -False -1,5707963267949 -30 -BqJXqZ8et0ewcZz7gJsiJwAA - - -False --1,5707963267949 -15 -BqJXqZ8et0ewcZz7gJsiJwAA - - -False --0,523598775598299 -30 -epHead -w6uuXFzF+UuyUhUFsfq4mwAA - - -False -0,523598775598299 -30 -epTail -6USFEKS3dkeTgjyDb/0IrAAA - - -False -0,523598775598299 -25 -epHead -w6uuXFzF+UuyUhUFsfq4mwAA - - -False --0,523598775598299 -25 -epTail -6USFEKS3dkeTgjyDb/0IrAAA - - -False --0,785398163397448 -40 -epHead -w6uuXFzF+UuyUhUFsfq4mwAA - - -False -0,785398163397448 -40 -epTail -6USFEKS3dkeTgjyDb/0IrAAA - - -False --1000 --1000 -50 -8 -w6uuXFzF+UuyUhUFsfq4mwAA - - -False --1000 --1000 -50 -8 -6USFEKS3dkeTgjyDb/0IrAAA - - - -clMaroon -$00B9FFFF -292,495;380,505 -vklRY+kLBUi4eci/v1uFiQAA -ZQwGc20gJUK2YJ2LtwcTMgAA -0MG3H44vP0u6GuUhqp/PDAAA - -1,5707963267949 -15 -emit -vklRY+kLBUi4eci/v1uFiQAA - - -False -1,5707963267949 -30 -vklRY+kLBUi4eci/v1uFiQAA - - -False --1,5707963267949 -15 -vklRY+kLBUi4eci/v1uFiQAA - - -False --0,523598775598299 -30 -epHead -RsBp0DIz3k2VkIanXnx5LAAA - - -False -0,523598775598299 -30 -epTail -7Yrk3YeMBki9CB5raHefMwAA - - -False -0,523598775598299 -25 -epHead -RsBp0DIz3k2VkIanXnx5LAAA - - -False --0,523598775598299 -25 -epTail -7Yrk3YeMBki9CB5raHefMwAA - - -False --0,785398163397448 -40 -epHead -RsBp0DIz3k2VkIanXnx5LAAA - - -False -0,785398163397448 -40 -epTail -7Yrk3YeMBki9CB5raHefMwAA - - -False --1000 --1000 -50 -8 -RsBp0DIz3k2VkIanXnx5LAAA - - -False --1000 --1000 -50 -8 -7Yrk3YeMBki9CB5raHefMwAA - - - -clMaroon -$00B9FFFF -172,571;380,553 -PzNmZJmtHE2pdK6tfw/wcQAA -ZQwGc20gJUK2YJ2LtwcTMgAA -XSbsnT/NBki2/tfPi21woQAA - -1,5707963267949 -15 -emit -PzNmZJmtHE2pdK6tfw/wcQAA - - -False -1,5707963267949 -30 -PzNmZJmtHE2pdK6tfw/wcQAA - - -False --1,5707963267949 -15 -PzNmZJmtHE2pdK6tfw/wcQAA - - -False --0,523598775598299 -30 -epHead -3CBhQ/ETW0OoFrfOxALo/AAA - - -False -0,523598775598299 -30 -epTail -2xpWl3PtHk2x1n3TdHoNKQAA - - -False -0,523598775598299 -25 -epHead -3CBhQ/ETW0OoFrfOxALo/AAA - - -False --0,523598775598299 -25 -epTail -2xpWl3PtHk2x1n3TdHoNKQAA - - -False --0,785398163397448 -40 -epHead -3CBhQ/ETW0OoFrfOxALo/AAA - - -False -0,785398163397448 -40 -epTail -2xpWl3PtHk2x1n3TdHoNKQAA - - -False --1000 --1000 -50 -8 -3CBhQ/ETW0OoFrfOxALo/AAA - - -False --1000 --1000 -50 -8 -2xpWl3PtHk2x1n3TdHoNKQAA - - - -clMaroon -$00B9FFFF -247,647;380,607 -hrJIc6Szbk6vbvDCEFkAUgAA -ZQwGc20gJUK2YJ2LtwcTMgAA -d/LcpSgLCUOq+LACpXa0pgAA - -1,5707963267949 -15 -emit -hrJIc6Szbk6vbvDCEFkAUgAA - - -False -1,5707963267949 -30 -hrJIc6Szbk6vbvDCEFkAUgAA - - -False --1,5707963267949 -15 -hrJIc6Szbk6vbvDCEFkAUgAA - - -False --0,523598775598299 -30 -epHead -OYDVVYkCiUOSqYdTAuHF9gAA - - -False -0,523598775598299 -30 -epTail -ThFMbzFeI02U2Kdg4mtC0gAA - - -False -0,523598775598299 -25 -epHead -OYDVVYkCiUOSqYdTAuHF9gAA - - -False --0,523598775598299 -25 -epTail -ThFMbzFeI02U2Kdg4mtC0gAA - - -False --0,785398163397448 -40 -epHead -OYDVVYkCiUOSqYdTAuHF9gAA - - -False -0,785398163397448 -40 -epTail -ThFMbzFeI02U2Kdg4mtC0gAA - - -False --1000 --1000 -50 -8 -OYDVVYkCiUOSqYdTAuHF9gAA - - -False --1000 --1000 -50 -8 -ThFMbzFeI02U2Kdg4mtC0gAA - - - -clMaroon -$00B9FFFF -570,996;576,956 -OcPT6iodY0mVCE0RmyoedAAA -ZQwGc20gJUK2YJ2LtwcTMgAA -Q23OA5Ja10mcv/znj6MUDwAA - -1,5707963267949 -15 -emit -OcPT6iodY0mVCE0RmyoedAAA - - -False -1,5707963267949 -30 -OcPT6iodY0mVCE0RmyoedAAA - - -False --1,5707963267949 -15 -OcPT6iodY0mVCE0RmyoedAAA - - -False --0,523598775598299 -30 -epHead -6ubOpnxC3EeJQrXGa2B87QAA - - -False -0,523598775598299 -30 -epTail -+PzW1voGeEiJof5Tf+zPeAAA - - -False -0,523598775598299 -25 -epHead -6ubOpnxC3EeJQrXGa2B87QAA - - -False --0,523598775598299 -25 -epTail -+PzW1voGeEiJof5Tf+zPeAAA - - -False --0,785398163397448 -40 -epHead -6ubOpnxC3EeJQrXGa2B87QAA - - -False -0,785398163397448 -40 -epTail -+PzW1voGeEiJof5Tf+zPeAAA - - -False --1000 --1000 -50 -8 -6ubOpnxC3EeJQrXGa2B87QAA - - -False --1000 --1000 -50 -8 -+PzW1voGeEiJof5Tf+zPeAAA - - - -clMaroon -$00B9FFFF -202,757;380,664 -787xJAPCtkWj9kozxlj32gAA -ZQwGc20gJUK2YJ2LtwcTMgAA -DbOb8jdSYU2DaQgSpSw7ewAA - -1,5707963267949 -15 -emit -787xJAPCtkWj9kozxlj32gAA - - -False -1,5707963267949 -30 -787xJAPCtkWj9kozxlj32gAA - - -False --1,5707963267949 -15 -787xJAPCtkWj9kozxlj32gAA - - -False --0,523598775598299 -30 -epHead -LT5Bak4GOUmdsHw3CnpfFgAA - - -False -0,523598775598299 -30 -epTail -3TTDOAqcVUeHLjV5YanQ4wAA - - -False -0,523598775598299 -25 -epHead -LT5Bak4GOUmdsHw3CnpfFgAA - - -False --0,523598775598299 -25 -epTail -3TTDOAqcVUeHLjV5YanQ4wAA - - -False --0,785398163397448 -40 -epHead -LT5Bak4GOUmdsHw3CnpfFgAA - - -False -0,785398163397448 -40 -epTail -3TTDOAqcVUeHLjV5YanQ4wAA - - -False --1000 --1000 -50 -8 -LT5Bak4GOUmdsHw3CnpfFgAA - - -False --1000 --1000 -50 -8 -3TTDOAqcVUeHLjV5YanQ4wAA - - - -clMaroon -$00B9FFFF -277,860;380,765 -IU2f7CMDW0aUHQ0vbnw6xQAA -ZQwGc20gJUK2YJ2LtwcTMgAA -jE8S89+ECUatE1B7MTZIFwAA - -1,5707963267949 -15 -emit -IU2f7CMDW0aUHQ0vbnw6xQAA - - -False -1,5707963267949 -30 -IU2f7CMDW0aUHQ0vbnw6xQAA - - -False --1,5707963267949 -15 -IU2f7CMDW0aUHQ0vbnw6xQAA - - -False --0,523598775598299 -30 -epHead -e3fE6NMvn06WkrRwGAWA2gAA - - -False -0,523598775598299 -30 -epTail -eNFl7eT+5kWwfL71FCj0tAAA - - -False -0,523598775598299 -25 -epHead -e3fE6NMvn06WkrRwGAWA2gAA - - -False --0,523598775598299 -25 -epTail -eNFl7eT+5kWwfL71FCj0tAAA - - -False --0,785398163397448 -40 -epHead -e3fE6NMvn06WkrRwGAWA2gAA - - -False -0,785398163397448 -40 -epTail -eNFl7eT+5kWwfL71FCj0tAAA - - -False --1000 --1000 -50 -8 -e3fE6NMvn06WkrRwGAWA2gAA - - -False --1000 --1000 -50 -8 -eNFl7eT+5kWwfL71FCj0tAAA - - - -clMaroon -$00B9FFFF -385,984;400,956 -k3xJIyemAUqZ/4cSnWz0XAAA -ZQwGc20gJUK2YJ2LtwcTMgAA -y8uYGkGLTEKrIy8t3qnPDgAA - -1,5707963267949 -15 -emit -k3xJIyemAUqZ/4cSnWz0XAAA - - -False -1,5707963267949 -30 -k3xJIyemAUqZ/4cSnWz0XAAA - - -False --1,5707963267949 -15 -k3xJIyemAUqZ/4cSnWz0XAAA - - -False --0,523598775598299 -30 -epHead -Zgoa5OVdjEi2XYfHaIUImQAA - - -False -0,523598775598299 -30 -epTail -D7k1/msjHkK5wIpSkUtuyAAA - - -False -0,523598775598299 -25 -epHead -Zgoa5OVdjEi2XYfHaIUImQAA - - -False --0,523598775598299 -25 -epTail -D7k1/msjHkK5wIpSkUtuyAAA - - -False --0,785398163397448 -40 -epHead -Zgoa5OVdjEi2XYfHaIUImQAA - - -False -0,785398163397448 -40 -epTail -D7k1/msjHkK5wIpSkUtuyAAA - - -False --1000 --1000 -50 -8 -Zgoa5OVdjEi2XYfHaIUImQAA - - -False --1000 --1000 -50 -8 -D7k1/msjHkK5wIpSkUtuyAAA - - - -clMaroon -$00B9FFFF -1064 -908 -184 -59 -IAbNseYeoEit8L/hehUKxQAA - - -1 -QNetworkAccessManager - - -False - - -False - - - -IAbNseYeoEit8L/hehUKxQAA - - -IAbNseYeoEit8L/hehUKxQAA - - -IAbNseYeoEit8L/hehUKxQAA - - - -clMaroon -$00B9FFFF -1000 -744 -130 -69 -1RNSGyN9pUmj5s8PPq5uxgAA - - -1 -finished - - -<<signal>> - - -False - - - -1RNSGyN9pUmj5s8PPq5uxgAA - - -1RNSGyN9pUmj5s8PPq5uxgAA - - - -clMaroon -$00B9FFFF -1138,908;1083,812 -K2cEmXPiO0GdwZSsxaRw9QAA -vXpkVGBpuU6uFrfUC+MkTgAA -TFZSwFd6v0Gn7TdqXdwwEAAA - -1,5707963267949 -15 -emit -K2cEmXPiO0GdwZSsxaRw9QAA - - -False -1,5707963267949 -30 -K2cEmXPiO0GdwZSsxaRw9QAA - - -False --1,5707963267949 -15 -K2cEmXPiO0GdwZSsxaRw9QAA - - -False --0,523598775598299 -30 -epHead -MKFKr2BoWEOP6PDAxRUvGAAA - - -False -0,523598775598299 -30 -epTail -orUirPbVqkmjufhsKG6ZmwAA - - -False -0,523598775598299 -25 -epHead -MKFKr2BoWEOP6PDAxRUvGAAA - - -False --0,523598775598299 -25 -epTail -orUirPbVqkmjufhsKG6ZmwAA - - -False --0,785398163397448 -40 -epHead -MKFKr2BoWEOP6PDAxRUvGAAA - - -False -0,785398163397448 -40 -epTail -orUirPbVqkmjufhsKG6ZmwAA - - -False --1000 --1000 -50 -8 -MKFKr2BoWEOP6PDAxRUvGAAA - - -False --1000 --1000 -50 -8 -orUirPbVqkmjufhsKG6ZmwAA - - - -clMaroon -$00B9FFFF -1005,744;889,678 -HqLKEdCIAUSt8J3/YuUQmwAA -ZQwGc20gJUK2YJ2LtwcTMgAA -vXpkVGBpuU6uFrfUC+MkTgAA - -1,5707963267949 -15 -receive -HqLKEdCIAUSt8J3/YuUQmwAA - - -False -1,5707963267949 -30 -HqLKEdCIAUSt8J3/YuUQmwAA - - -False --1,5707963267949 -15 -HqLKEdCIAUSt8J3/YuUQmwAA - - -False --0,523598775598299 -30 -epHead -ZAQTYN9xN06gJoIbtBd0EAAA - - -False -0,523598775598299 -30 -epTail -lwOOm8mItUKc9RSfv+MG7AAA - - -False -0,523598775598299 -25 -epHead -ZAQTYN9xN06gJoIbtBd0EAAA - - -False --0,523598775598299 -25 -epTail -lwOOm8mItUKc9RSfv+MG7AAA - - -False --0,785398163397448 -40 -epHead -ZAQTYN9xN06gJoIbtBd0EAAA - - -False -0,785398163397448 -40 -epTail -lwOOm8mItUKc9RSfv+MG7AAA - - -False --1000 --1000 -50 -8 -ZAQTYN9xN06gJoIbtBd0EAAA - - -False --1000 --1000 -50 -8 -lwOOm8mItUKc9RSfv+MG7AAA - - - -clMaroon -$00B9FFFF -1572 -688 -375 -368 -Jy85dFa4H0mNGCk17axsXQAA - - -1 -QDropboxFile - - -False - - -False - - - -Jy85dFa4H0mNGCk17axsXQAA - - -Jy85dFa4H0mNGCk17axsXQAA - - -False -Jy85dFa4H0mNGCk17axsXQAA - - - -clMaroon -$00B9FFFF -2088 -844 -140 -59 -fKdwvFAhRES1bUHbkladewAA - - -1 -QIODevice - - -False - - -False - - - -fKdwvFAhRES1bUHbkladewAA - - -fKdwvFAhRES1bUHbkladewAA - - -fKdwvFAhRES1bUHbkladewAA - - - -clMaroon -$00B9FFFF -2088,873;1946,872 -jN1Jscw+pEumBPW4E+/MrAAA -YYj3pOVpJEO4ERe8D85K6gAA -iVqhIMWw2kOENBS6i1bzRAAA - -False -1,5707963267949 -15 -jN1Jscw+pEumBPW4E+/MrAAA - - -False -1,5707963267949 -30 -jN1Jscw+pEumBPW4E+/MrAAA - - -False --1,5707963267949 -15 -jN1Jscw+pEumBPW4E+/MrAAA - - - - -46 - -qdropbox_request -Cpp -CppStruct -N2j+7nhBQEq+mO8YqFlxXAAA -4 -/LiUQAimsEu0FUq6ze2IvgAA -lFrU7E0xN0CbkDNlsrrIxAAA -F3BzoyQSIk2E90qbpUXYQQAA -7lq650JCP0KhR6Qw2XufRwAA -5 -JGFDztX88E+FX11ma2sviwAA -MSiK0RkyXkqnF4zZg9NCbgAA -NZL1/floAU6ZzHTPyQilyQAA -Q5tbe22oqEun4hTkQRO7ggAA -nGz2fNtAiECky4y27651lQAA -4 - -type -/d+HCPT/kEWbrwf4YZSB6wAA -o/YVcpgbbUmwpN4wodhPTAAA - - -method -QString -o/YVcpgbbUmwpN4wodhPTAAA - - -host -QString -o/YVcpgbbUmwpN4wodhPTAAA - - -linked -int -o/YVcpgbbUmwpN4wodhPTAAA - - - -qdropboxjson_value -Cpp -CppUnion -N2j+7nhBQEq+mO8YqFlxXAAA -4 -J9krYyYLt0GkMrlUcNnDSQAA -6LUIiS1LM0+t6xC+4SlKgAAA -4KeOQc8h0k+H7fBdY8tibAAA -Lrkmj/kRj0Gpo6D/IgHOXgAA -1 -1GvxXRSoPU6pMyMjAH9ZGwAA -1 -w4a52oBqSUaVRdbIme4AXwAA -2 - -json -QDropboxJson -3ldG67+ChU+zoMSfNP9q2wAA -Salq1uHht0SrITdCzNgz8gAA -1 - -Cpp -CppPointer -CppPointer -* -I00RMOFlV0ejXPOzctOXYwAA - - - -value -QString -Salq1uHht0SrITdCzNgz8gAA -1 - -Cpp -CppPointer -CppPointer -* -NhSRZYYMoUujPcyxa272aQAA - - - - -qdropboxjson_entry -Cpp -CppStruct -N2j+7nhBQEq+mO8YqFlxXAAA -4 -udGn3QfWsk66VA2UGYIflQAA -kvAN5izhqUKOV/NyX1Sn7wAA -kQ8gLa+P1kuiWXGxbFMjXgAA -uUBlGmwUpkSb31dsz6Y9TAAA -3 -RxpcKin3lkqsU8zB5Y4M/AAA -atST4kLuZkugkRTnYjJOfQAA -PTo3BruOskCRO4OIKJ1lowAA -2 - -type -ivoGuCI+nU+pxM1i7fml2wAA -rzEAq8I6FE+PpXanPndneQAA - - -value -Salq1uHht0SrITdCzNgz8gAA -rzEAq8I6FE+PpXanPndneQAA - - - -qdropbox_request_type -CppTypedef: int -N2j+7nhBQEq+mO8YqFlxXAAA -4 -5EizNq5SCEClSQJZxerjOQAA -DIDxbnegBkynTwLc6H67/wAA -dQFyuSMwp06XoGAIwx9qaAAA -vVTeKj/SGEGEu8tE2iOsZgAA -1 - -Cpp -CppTypedef -CppTypedefDefinition -int -/d+HCPT/kEWbrwf4YZSB6wAA - -1 -tazAWWv2BE2htiJhRN6ItAAA -4 -K4qhFq8TC0WB1uKDSfw+7AAA -W9vwqXT2BUOo4ymqHvd2HgAA -Jnk+MkPorUi0I4dAvj5+oAAA -EfswkUxaeUyInrcPDUKnfQAA - - -qdropboxjson_entry_type -CppTypedef: char -N2j+7nhBQEq+mO8YqFlxXAAA -4 -oWy/EB6NVEu1satRlEtRCQAA -skofbkhZ30WXLXp82V2udAAA -kjNhHYcdAEq1quntLUOM1QAA -tXwdUIi5l0Oejc1WGfiIRAAA -1 - -Cpp -CppTypedef -CppTypedefDefinition -char -ivoGuCI+nU+pxM1i7fml2wAA - -1 -ImLXgvUDUkqMKJ4xFK7JLgAA -1 -dlWRgohk6Uu4RLKDuJTqRQAA -1 -cCBCNiyDXkmOtC2DhJJV0AAA - - -QDropbox -N2j+7nhBQEq+mO8YqFlxXAAA -4 -ZQwGc20gJUK2YJ2LtwcTMgAA -zzZMTftxuEWUjXBHJOHfiQAA -AeDEhg68N0K7OAP6PG1ktgAA -FkjwoPe6FkSDWjpmD3aHLgAA -2 - -OAuthMethod -W0IFCTrokkm6wkpDiDO1ogAA -1 -Z4JR1nYNJE25eK5LG+085AAA -3 -wkCjlj5oZk+l6/o59oA1vQAA -jdEGCANr1kOmAezVRKG5QgAA -3OMarGX7zE2k46UTjltTvwAA -2 - -Plaintext -DzKJ2ayprEqYf6J8gHjXywAA - - -HMACSHA1 -DzKJ2ayprEqYf6J8gHjXywAA - - - -Error -W0IFCTrokkm6wkpDiDO1ogAA -2 -n2L7HgrUckWndIygX1YrrAAA -H4ZJ3njnOkiA4Gt5GoDqyAAA -1 -k9qCa72EPkeJjrHYWmRp0QAA -12 - -NoError -Apdq3G0RkUm9YikPh0QWrwAA - - -CommunicationError -Apdq3G0RkUm9YikPh0QWrwAA - - -VersionNotSupported -Apdq3G0RkUm9YikPh0QWrwAA - - -UnknownAuthMethod -Apdq3G0RkUm9YikPh0QWrwAA - - -ResponseToUnknownRequest -Apdq3G0RkUm9YikPh0QWrwAA - - -APIError -Apdq3G0RkUm9YikPh0QWrwAA - - -UnknownQueryMethod -Apdq3G0RkUm9YikPh0QWrwAA - - -BadInput -Apdq3G0RkUm9YikPh0QWrwAA - - -BadOAuthRequest -Apdq3G0RkUm9YikPh0QWrwAA - - -WrongHttpMethod -Apdq3G0RkUm9YikPh0QWrwAA - - -MaxRequestsExeeded -Apdq3G0RkUm9YikPh0QWrwAA - - -UserOverQuota -Apdq3G0RkUm9YikPh0QWrwAA - - -44 - -Cpp -CppMacro -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA - - -QDropbox -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -1 - -parent -QObject -rMeZPITBaEWGs91eaPmyqwAA -1 - -Cpp -CppPointer -CppPointer -* -e8cu2p8bl0m7Bk8k3U6uRQAA - - - - -QDropbox -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -5 - -key -QString -P64bMPLlWUiHjDDpNp39pAAA - - -sharedSecret -QString -P64bMPLlWUiHjDDpNp39pAAA - - -method -P64bMPLlWUiHjDDpNp39pAAA -DzKJ2ayprEqYf6J8gHjXywAA - - -url -QString -P64bMPLlWUiHjDDpNp39pAAA - - -parent -QObject -P64bMPLlWUiHjDDpNp39pAAA -1 - -Cpp -CppPointer -CppPointer -* -f29v9TyxWkKLPplHLLh6RAAA - - - - -test -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -void -HPDBfR+KVkWnPCoHUKPRMgAA - - - -error -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -qint64 -h/Nf8AYA8UCnn+wKCyqgowAA - - - -errorString -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -QString -UUUj64TabEGTvsLeRP0L4AAA - - - -setApiUrl -W0IFCTrokkm6wkpDiDO1ogAA -2 - -url -QString -tteWW/FnXka3PxUYtRiXOQAA - - -return -pdkReturn -void -tteWW/FnXka3PxUYtRiXOQAA - - - -apiUrl -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -QString -834zVOE8a0GEL6gSs9jleQAA - - - -setAuthMethod -W0IFCTrokkm6wkpDiDO1ogAA -2 - -m -12vyVcUagUq/ngCL1Vh1KAAA -DzKJ2ayprEqYf6J8gHjXywAA - - -return -pdkReturn -void -12vyVcUagUq/ngCL1Vh1KAAA - - - -authMethod -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -Zh3jR88LBEiCbTBcm2mavwAA -DzKJ2ayprEqYf6J8gHjXywAA - - - -setApiVersion -W0IFCTrokkm6wkpDiDO1ogAA -2 - -apiversion -QString -Ce2ff2TBXU2dv8f+Zaf0OwAA - - -return -pdkReturn -void -Ce2ff2TBXU2dv8f+Zaf0OwAA - - - -apiVersion -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -QString -EeEhexaoC0y+d6IdYxxQVAAA - - - -setKey -W0IFCTrokkm6wkpDiDO1ogAA -2 - -key -QString -RJSrszmm2EasQuFA2fSW0AAA - - -return -pdkReturn -void -RJSrszmm2EasQuFA2fSW0AAA - - - -key -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -QString -J1yvCZ4C60Ch58uq2jlQGgAA - - - -setSharedSecret -W0IFCTrokkm6wkpDiDO1ogAA -2 - -sharedSecret -QString -7HeaCBYJl0K8ylVyJOURUQAA - - -return -pdkReturn -void -7HeaCBYJl0K8ylVyJOURUQAA - - - -sharedSecret -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -QString -hO3aO2dw/UWWF7zp9ISb1wAA - - - -requestToken -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -int -UE2kjPcmtk6wRehdu8zQiwAA - - - -authorize -W0IFCTrokkm6wkpDiDO1ogAA -3 - -mail -QString -euTknuuB1UauIW4WBwDhCgAA - - -password -QString -euTknuuB1UauIW4WBwDhCgAA - - -return -pdkReturn -int -euTknuuB1UauIW4WBwDhCgAA - - - -authorizeLink -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -QUrl -d/b5PDBVBEyR/E0DhSqO9gAA - - - -requestAccessToken -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -int -tsqq3hSMXEy3n/VVdSjVogAA - - - -requestAccountInfo -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -int -lBP/IJe6DkmWJmJ+wPBbQAAA - - - -errorOccured -W0IFCTrokkm6wkpDiDO1ogAA -2 - -errorcode -oL6TVcoL/EePVB0eYRaH2AAA -Apdq3G0RkUm9YikPh0QWrwAA - - -return -pdkReturn -void -oL6TVcoL/EePVB0eYRaH2AAA - - - -tokenExpired -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -void -Z/hJAWMGekC9RpSK940WYAAA - - - -fileNotFound -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -void -Pyli6BguaEamJKwH7OPXKQAA - - - -operationFinished -W0IFCTrokkm6wkpDiDO1ogAA -2 - -requestnr -int -ib0X4Hew3kO60CkdS8leFwAA - - -return -pdkReturn -void -ib0X4Hew3kO60CkdS8leFwAA - - - -requestTokenFinished -W0IFCTrokkm6wkpDiDO1ogAA -3 - -token -QString -1nNXMBkhhk6s+LKg5RvIKgAA - - -secret -QString -1nNXMBkhhk6s+LKg5RvIKgAA - - -return -pdkReturn -void -1nNXMBkhhk6s+LKg5RvIKgAA - - - -accessTokenFinished -W0IFCTrokkm6wkpDiDO1ogAA -3 - -token -QString -928jTUX4u0yjS//w5gBsGAAA - - -secret -QString -928jTUX4u0yjS//w5gBsGAAA - - -return -pdkReturn -void -928jTUX4u0yjS//w5gBsGAAA - - - -tokenChanged -W0IFCTrokkm6wkpDiDO1ogAA -3 - -token -QString -4MYNQ4ARQkio/YEcSS9trAAA - - -secret -QString -4MYNQ4ARQkio/YEcSS9trAAA - - -return -pdkReturn -void -4MYNQ4ARQkio/YEcSS9trAAA - - - -accountInfo -W0IFCTrokkm6wkpDiDO1ogAA -2 - -accountJson -QString -9b9mQAL59kC+OvLH5NI6yQAA - - -return -pdkReturn -void -9b9mQAL59kC+OvLH5NI6yQAA - - - -requestFinished -W0IFCTrokkm6wkpDiDO1ogAA -3 - -nr -int -sFjy2jg99k6Sf33zFDfIGAAA - - -rply -QNetworkReply -sFjy2jg99k6Sf33zFDfIGAAA -1 - -Cpp -CppPointer -CppPointer -* -2ORbw7z3QkKSE07rSYoVpgAA - - - -return -pdkReturn -void -sFjy2jg99k6Sf33zFDfIGAAA - - - -networkReplyFinished -W0IFCTrokkm6wkpDiDO1ogAA -2 - -rply -QNetworkReply -Qb3vLAceAUiyR3Rd/LQ0bAAA -1 - -Cpp -CppPointer -CppPointer -* -8jHBwloghkqXk3Qms24QVgAA - - - -return -pdkReturn -void -Qb3vLAceAUiyR3Rd/LQ0bAAA - - - -hmacsha1 -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -3 - -key -QByteArray -OK0RwGNre0ig0DeyE065/AAA - - -baseString -QByteArray -OK0RwGNre0ig0DeyE065/AAA - - -return -pdkReturn -QString -OK0RwGNre0ig0DeyE065/AAA - - - -generateNonce -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -2 - -length -qint32 -ey3VHCbEeEiClhOT1h9B5AAA - - -return -pdkReturn -QString -ey3VHCbEeEiClhOT1h9B5AAA - - - -oAuthSign -W0IFCTrokkm6wkpDiDO1ogAA -3 - -base -QUrl -xCDI13CNpk+ulExvshvcZgAA - - -method -QString -xCDI13CNpk+ulExvshvcZgAA - - -return -pdkReturn -QString -xCDI13CNpk+ulExvshvcZgAA - - - -prepareApiUrl -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -void -j+k5biyLckGMB5PwM1OgggAA - - - -sendRequest -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -5 - -request -QUrl -kdQyBRVRh0CKhj4xwa8dHAAA - - -type -QString -kdQyBRVRh0CKhj4xwa8dHAAA - - -postdata -QByteArray -kdQyBRVRh0CKhj4xwa8dHAAA - - -host -QString -kdQyBRVRh0CKhj4xwa8dHAAA - - -return -pdkReturn -int -kdQyBRVRh0CKhj4xwa8dHAAA - - - -responseTokenRequest -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -2 - -response -QString -/YL869vGS0uT2OjAkB5+VQAA - - -return -pdkReturn -void -/YL869vGS0uT2OjAkB5+VQAA - - - -responseDropboxLogin -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -3 - -response -QString -lpO80T7FZ065151y3fpIYAAA - - -reqnr -int -lpO80T7FZ065151y3fpIYAAA - - -return -pdkReturn -int -lpO80T7FZ065151y3fpIYAAA - - - -responseAccessToken -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -2 - -response -QString -X/JNnQKc/UiKBcjJVDU3AwAA - - -return -pdkReturn -void -X/JNnQKc/UiKBcjJVDU3AwAA - - - -signatureMethodString -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -1 - -return -pdkReturn -QString -NNJCJrC1zkSg7ZhYSeBiBAAA - - - -parseToken -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -2 - -response -QString -/Dk8IsD3jkSCCc/KrGcs/QAA - - -return -pdkReturn -void -/Dk8IsD3jkSCCc/KrGcs/QAA - - - -parseAccountInfo -vkPrivate -W0IFCTrokkm6wkpDiDO1ogAA -2 - -response -QString -u8ja0Lvt6U2LC822vcGzdgAA - - -return -pdkReturn -void -u8ja0Lvt6U2LC822vcGzdgAA - - - -appKey -W0IFCTrokkm6wkpDiDO1ogAA -1 - -pdkReturn -QString -l65sPxW2b0SIgl33OqIKxgAA - - - -appSharedSecret -W0IFCTrokkm6wkpDiDO1ogAA -1 - -pdkReturn -QString -S5GC430qbkqOAIObF9OIUQAA - - -1 -wOhoxHaCFk6cIGBTzHfrXAAA -14 -/XZHT+D6kU+IS2qm+KMbIwAA -ZGRRLJ5j2EWX2iraBMG3pQAA -RiUuUvyZOUS+flTYkM/BJgAA -w6uuXFzF+UuyUhUFsfq4mwAA -RsBp0DIz3k2VkIanXnx5LAAA -3CBhQ/ETW0OoFrfOxALo/AAA -OYDVVYkCiUOSqYdTAuHF9gAA -6ubOpnxC3EeJQrXGa2B87QAA -LT5Bak4GOUmdsHw3CnpfFgAA -e3fE6NMvn06WkrRwGAWA2gAA -Zgoa5OVdjEi2XYfHaIUImQAA -ZAQTYN9xN06gJoIbtBd0EAAA -iY72rs0Ip0iV+xqYE3stRQAA -+EzqPosbe0i8n1xANmif4wAA -18 - -conManager -vkPrivate -QNetworkAccessManager -W0IFCTrokkm6wkpDiDO1ogAA - - -errorState -vkPrivate -Apdq3G0RkUm9YikPh0QWrwAA -W0IFCTrokkm6wkpDiDO1ogAA - - -errorText -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -_appKey -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -_appSharedSecret -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -apiurl -vkPrivate -QUrl -W0IFCTrokkm6wkpDiDO1ogAA - - -nonce -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -timestamp -vkPrivate -long -W0IFCTrokkm6wkpDiDO1ogAA - - -oauthMethod -vkPrivate -DzKJ2ayprEqYf6J8gHjXywAA -W0IFCTrokkm6wkpDiDO1ogAA - - -version -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -oauthToken -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -oauthTokenSecret -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -replynrMap -vkPrivate -QMap <QNetworkReply*,int> -W0IFCTrokkm6wkpDiDO1ogAA - - -lastreply -vkPrivate -int -W0IFCTrokkm6wkpDiDO1ogAA - - -requestMap -vkPrivate -QMap<int,qdropbox_request> -W0IFCTrokkm6wkpDiDO1ogAA - - -delayMap -vkPrivate -QMap<int,int> -W0IFCTrokkm6wkpDiDO1ogAA - - -mail -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - -password -vkPrivate -QString -W0IFCTrokkm6wkpDiDO1ogAA - - - -QDropbxAccount -N2j+7nhBQEq+mO8YqFlxXAAA -4 -Awaho9FPYkW7L1LuJ3v6ZgAA -qVbfSsc2uE6bGzuXdIckJgAA -ErAEpmTzhECwO2kMbffX+gAA -qu8ikA8AjEacCY0Ljoal8gAA -14 - -QDropboxAccount -vkPrivate -sFX2E/MBlUO0Eb/e07cRggAA -1 - -parent -QObject -3cD/SSErKES96/SgTLptugAA -1 - -Cpp -CppPointer -CppPointer -* -fX2cWmmNakSMDYu1dwFOFQAA - - - - -QDropboxAccount -vkPrivate -sFX2E/MBlUO0Eb/e07cRggAA -2 - -json -pxT3SnzmdkWDVhTI/heefAAA -3ldG67+ChU+zoMSfNP9q2wAA - - -parent -QObject -pxT3SnzmdkWDVhTI/heefAAA - - - -QDropboxAccount -vkPrivate -sFX2E/MBlUO0Eb/e07cRggAA -2 - -jsonString -QString -JFF2f7km4Ea66pO7p12C5wAA - - -parent -QObject -JFF2f7km4Ea66pO7p12C5wAA -1 - -Cpp -CppPointer -CppPointer -* -mXgAG8GCOkqkCUW/YpB35gAA - - - - -QDropboxAccount -vkPrivate -sFX2E/MBlUO0Eb/e07cRggAA -1 - -other -QDropboxAccount -8u+RXkolNkSWWkXVFtQjFQAA -1 - -Cpp -CppPointer -CppPointer -& -EaOGQLzetkmR4q+uKPhcZAAA - - - - -setJson -sFX2E/MBlUO0Eb/e07cRggAA -2 - -pdkReturn -void -U7KbofoduEu/vl1pymaqgAAA - - -json -U7KbofoduEu/vl1pymaqgAAA -3ldG67+ChU+zoMSfNP9q2wAA - - - -isValid -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -bool -mJS6rYfIdUaPCLATAlv1yQAA - - - -referralLink -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -QUrl -MgxvqfiNZ0ahIO1APWDXiQAA - - - -displayName -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -QString -x5qwi99Nx0iAQgtrHG2ZEAAA - - - -uid -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -qint64 -DHFO3dXkPUm8wcNH4C+d8wAA - - - -country -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -QString -AKwhcsaxSkC6VFBVpQgcQAAA - - - -email -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -QString -vWeDwQHknUKCxDep6Yx0mgAA - - - -quotaShared -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -quint64 -A4knr3HKKUeJmBq/4AM9jQAA - - - -quota -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -quint64 -OEEO/oKRjUKolzr7n/x3vQAA - - - -quotaNormal -sFX2E/MBlUO0Eb/e07cRggAA -1 - -return -pdkReturn -quint64 -5MkKRZjbh0OsrgXSfdUCwgAA - - -2 -BGv1WDNq7Uax5tzOLN2pagAA -Gy7sTkVK/0yx2LS0eNHdMQAA -9 - -valid -vkPrivate -bool -sFX2E/MBlUO0Eb/e07cRggAA - - -_referralLink -vkPrivate -QUrl -sFX2E/MBlUO0Eb/e07cRggAA - - -_displayName -vkPrivate -QString -sFX2E/MBlUO0Eb/e07cRggAA - - -_uid -vkPrivate -quint64 -sFX2E/MBlUO0Eb/e07cRggAA - - -_country -vkPrivate -QString -sFX2E/MBlUO0Eb/e07cRggAA - - -_email -vkPrivate -QString -sFX2E/MBlUO0Eb/e07cRggAA - - -_quotaShared -vkPrivate -quint64 -sFX2E/MBlUO0Eb/e07cRggAA - - -_quota -vkPrivate -quint64 -sFX2E/MBlUO0Eb/e07cRggAA - - -_quotaNormal -vkPrivate -quint64 -sFX2E/MBlUO0Eb/e07cRggAA - - - -QDropboxJson -N2j+7nhBQEq+mO8YqFlxXAAA -4 -wjFp+lbpQ0SnrIsXCR3AKwAA -/cV5CgsDvEqXr69TYWi0NAAA -iXNf7/IH9U2FW6QL/MP4XwAA -egn01yrWqUaaoVRtgXRrRgAA -1 - -DataType -3ldG67+ChU+zoMSfNP9q2wAA -1 -f4mrJTlrt0icduHrJgXNYwAA -8 - -NumberType -Sl18qfZdjUWhnKsQRSh7PQAA - - -StringType -Sl18qfZdjUWhnKsQRSh7PQAA - - -JsonType -Sl18qfZdjUWhnKsQRSh7PQAA - - -ArrayType -Sl18qfZdjUWhnKsQRSh7PQAA - - -FloatType -Sl18qfZdjUWhnKsQRSh7PQAA - - -BoolType -Sl18qfZdjUWhnKsQRSh7PQAA - - -UnsignedIntType -Sl18qfZdjUWhnKsQRSh7PQAA - - -UnknownType -Sl18qfZdjUWhnKsQRSh7PQAA - - -17 - -Cpp -CppMacro -vkPrivate -3ldG67+ChU+zoMSfNP9q2wAA - - -QDropboxJson -vkPrivate -3ldG67+ChU+zoMSfNP9q2wAA -1 - -parent -QObject -c7gtOn3E4UqEnEadhozoEQAA -1 - -Cpp -CppPointer -CppPointer -* -hm4Ji4hGIkSE6aH4xm8BTwAA - - - - -QDropboxJson -vkPrivate -3ldG67+ChU+zoMSfNP9q2wAA -2 - -strJson -QString -BCU8doJ93UeX6BZiieJ4PwAA - - -parent -QObject -BCU8doJ93UeX6BZiieJ4PwAA -1 - -Cpp -CppPointer -CppPointer -* -LCmWG6qknkyfRnHEByJVygAA - - - - -QDropboxJson -UMLStandard -destroy -vkPrivate -3ldG67+ChU+zoMSfNP9q2wAA - - -parseString -3ldG67+ChU+zoMSfNP9q2wAA -2 - -strJson -QString -nlXHD5wwCUOZjUo6CgzNDQAA - - -return -pdkReturn -void -nlXHD5wwCUOZjUo6CgzNDQAA - - - -clear -3ldG67+ChU+zoMSfNP9q2wAA -1 - -return -pdkReturn -void -Ok4EnzhajUymTWy8Ke+t0QAA - - - -isValid -3ldG67+ChU+zoMSfNP9q2wAA -1 - -return -pdkReturn -bool -Zs8zocZRcEOc2Bik5JqbGgAA - - - -hasKey -3ldG67+ChU+zoMSfNP9q2wAA -2 - -key -QString -u1gwPLwuCUitHRxb1jijWAAA - - -return -pdkReturn -bool -u1gwPLwuCUitHRxb1jijWAAA - - - -type -3ldG67+ChU+zoMSfNP9q2wAA -2 - -key -QString -7vCIK9t3EEyMPL3TP5WvRQAA - - -return -pdkReturn -7vCIK9t3EEyMPL3TP5WvRQAA -Sl18qfZdjUWhnKsQRSh7PQAA - - - -getInt -3ldG67+ChU+zoMSfNP9q2wAA -3 - -key -QString -9T3eFVBtaEmYjP0u7IWA1wAA - - -force -bool -9T3eFVBtaEmYjP0u7IWA1wAA - - -return -pdkReturn -int -9T3eFVBtaEmYjP0u7IWA1wAA - - - -getUInt -3ldG67+ChU+zoMSfNP9q2wAA -3 - -key -QString -JWhauatDR0SQsqIhnuQjVwAA - - -force -bool -JWhauatDR0SQsqIhnuQjVwAA - - -return -pdkReturn -quint32 -JWhauatDR0SQsqIhnuQjVwAA - - - -getString -3ldG67+ChU+zoMSfNP9q2wAA -3 - -key -QString -0GvmbSPd0UKf68NbFGBKiwAA - - -force -bool -0GvmbSPd0UKf68NbFGBKiwAA - - -return -pdkReturn -QString -0GvmbSPd0UKf68NbFGBKiwAA - - - -getJson -3ldG67+ChU+zoMSfNP9q2wAA -2 - -key -QString -dmA3eBFET0qIKMkHvtuN4wAA - - -return -pdkReturn -dmA3eBFET0qIKMkHvtuN4wAA -1 - -Cpp -CppPointer -CppPointer -* -CZbCVV0PYESpLzNDyH3BDwAA - - - - -getDouble -3ldG67+ChU+zoMSfNP9q2wAA -3 - -key -QString -ufM8egbLvUKMWOQZYquSlQAA - - -force -bool -ufM8egbLvUKMWOQZYquSlQAA - - -return -pdkReturn -double -ufM8egbLvUKMWOQZYquSlQAA - - - -getBool -3ldG67+ChU+zoMSfNP9q2wAA -3 - -key -QString -+xq7xMRquEeirZfZ+jr53wAA - - -force -bool -+xq7xMRquEeirZfZ+jr53wAA - - -return -pdkReturn -bool -+xq7xMRquEeirZfZ+jr53wAA - - - -emptyList -vkPrivate -3ldG67+ChU+zoMSfNP9q2wAA -1 - -return -pdkReturn -void -mnIGhRuACk2+LnN0B90BzQAA - - - -interpretType -vkPrivate -3ldG67+ChU+zoMSfNP9q2wAA -2 - -value -QString -5ue1OIJOa0GzCHY/TebuGQAA - - -return -pdkReturn -5ue1OIJOa0GzCHY/TebuGQAA -ivoGuCI+nU+pxM1i7fml2wAA - - -1 -I00RMOFlV0ejXPOzctOXYwAA -2 -TZF5NL3vBkyUsJHad4mKygAA -AMPATP8f5kGCcit6gmQ23AAA -3 -cxFRPyXGi0itBgMed0h3+AAA -NEXj/BgYxUyBQUCVUq3RGQAA -M8LtzaCkj0uA37CAetQEfAAA -2 - -valueMap -vkPrivate -QMap<QString, qdropboxjson_entry> -3ldG67+ChU+zoMSfNP9q2wAA - - -valid -vkPrivate -bool -3ldG67+ChU+zoMSfNP9q2wAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -3JeZPAV6mUCL4MLEpDnT0QAA -3ldG67+ChU+zoMSfNP9q2wAA - - -3JeZPAV6mUCL4MLEpDnT0QAA -sFX2E/MBlUO0Eb/e07cRggAA - - - -used in -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -PS053f8SjkeNeXdA0r+XEAAA -sFX2E/MBlUO0Eb/e07cRggAA - - -PS053f8SjkeNeXdA0r+XEAAA -3ldG67+ChU+zoMSfNP9q2wAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -4 -as4/yIRjY0OGQZDrr0PmCQAA -NO2xmGlziE2c8hCnY/CxfgAA -KsOpYzyxN0a4eO7aktfvPwAA -FkmcghoLrESBTZWDCgtQJwAA -2 - -VOlKTB1AvEaHTlhVfnU5rQAA -ivoGuCI+nU+pxM1i7fml2wAA -4 -uyM7ffL9HkauJYV2kmvL+AAA -nQ67sYwfPUiJkgnXRi6OjQAA -aaVdJlxtQEqxPVB9tOeFxQAA -it3W24BWgkyfqJedQuERVQAA - - -akAggregate -VOlKTB1AvEaHTlhVfnU5rQAA -rzEAq8I6FE+PpXanPndneQAA -4 -zZPd3yQlDEqtzqPR8GLfJQAA -Wc1Hr6IwEkaXimuch9WobgAA -zWnzgFWnb0uE4jUnhYhSKgAA -Cg+jsDPDi0mUQzulDyyzUgAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -4 -RszJlyzTvUyoX0071nCVwgAA -ejID/Zn+GEO5H18t7GIH0gAA -kYUh8EFJWEKbCGvVvltPrgAA -gc1dpixR302jRRv1uy5W3QAA -2 - -3Zi5rozxKkiJPK0G4b2WtwAA -Salq1uHht0SrITdCzNgz8gAA -4 -aG6oVlTMpUiq+3dgEkdvSAAA -y2XxF12YfU6LXeKAs3eNBgAA -MLvpmc8HpEuFjoviMeFCIwAA -9LyxkddOpUiCRm617MaLlgAA - - -akAggregate -3Zi5rozxKkiJPK0G4b2WtwAA -rzEAq8I6FE+PpXanPndneQAA -4 -fiRS+QXvT0W7BLfhX7gLXAAA -8CR52ji/CEq5HDmpQpX3DwAA -t6p3SjqzE0WNY31ns1vjagAA -wWc023kHy02Ijy9DHZMglQAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -4 -Ffakr8Kjs06kcm4z0mmNsAAA -wZvYqHseUEuKAZPk4oTEcwAA -bYtRpAEX10myQd4aPP5dqwAA -4U9gEtoVjUyxGmNGv4l2mQAA -2 - -NxUJykImGEWbIsX5U6genQAA -rzEAq8I6FE+PpXanPndneQAA -4 -sx+fc7jmQEet7ppZr2303gAA -0Z1VeHgLzU2Zml138Z2M1AAA -GK4uy0b+KEuh5fcuYopgfQAA -d1S98A8c5EOCk6dLi7JJDgAA - - -NxUJykImGEWbIsX5U6genQAA -3ldG67+ChU+zoMSfNP9q2wAA -4 -yBQJF8Qq+0yVcoXlpc0e2wAA -gtj5IVJlDkKSt3kDFFDZ/QAA -JaAnqVZmGkKCgkViXzrtAwAA -p0acNsqBtkyPKF6I0cv0fgAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -IUlear54M0mtzZWceSWFYQAA -/d+HCPT/kEWbrwf4YZSB6wAA - - -IUlear54M0mtzZWceSWFYQAA -/d+HCPT/kEWbrwf4YZSB6wAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -TbgvcCKkqkCHBCJbeqXqcwAA -/d+HCPT/kEWbrwf4YZSB6wAA - - -TbgvcCKkqkCHBCJbeqXqcwAA -o/YVcpgbbUmwpN4wodhPTAAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -j6VCJLZUYE6qnebB79uqeQAA -o/YVcpgbbUmwpN4wodhPTAAA - - -akAggregate -j6VCJLZUYE6qnebB79uqeQAA -W0IFCTrokkm6wkpDiDO1ogAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -4 -BeZHwQN34k6h+tq1av34fAAA -Gd6O7K1ook60uIU8v4yaJAAA -oQfVTwbVRk+XPS1LzJSx9wAA -joSGI27VWE60wuw4Z0zk0gAA -2 - -U9kmFCZ0gUSdYHEaayZEvQAA -/d+HCPT/kEWbrwf4YZSB6wAA -4 -QWkHlnDei0aeSl3nJZxYngAA -OmDfRz90v0+Zq8318UtaZAAA -NzKOYe2KIUKHyGpNGT3tiAAA -3My1T2PPoUq5ZHAUluJpyAAA - - -akAggregate -U9kmFCZ0gUSdYHEaayZEvQAA -o/YVcpgbbUmwpN4wodhPTAAA -4 -JXQCOIsf20eNuoM12vW4oAAA -1iCAhp625UGm0MTHMVSELQAA -Fzdce/RF+E+N4eXyYWiTZAAA -dsW+c0W2J0G5bramWMKPvAAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -jYiEnYJRNE6S40ZA0XefAQAA -o/YVcpgbbUmwpN4wodhPTAAA - - -jYiEnYJRNE6S40ZA0XefAQAA -W0IFCTrokkm6wkpDiDO1ogAA - - - -used in requestMap -N2j+7nhBQEq+mO8YqFlxXAAA -4 -vtKCyBo1DUCqqV24HN28LQAA -Qmi53U0+0k+QkpttsDsIVAAA -UZdarQnwJ0qr/oLqWcPMcQAA -K90s+FqrzUSZxKyJkm1n9gAA -2 - -Kyb9wub+W0K//wRXxXR+8wAA -o/YVcpgbbUmwpN4wodhPTAAA -4 -JRCXvjB9AU+wzuND8o15CQAA -JfUU8Lm1B0+d13nGctneKwAA -+ytMC9q3Kky55lm1Sr4xcwAA -QWYcr4R0IkyIJgSxibGtxwAA - - -Kyb9wub+W0K//wRXxXR+8wAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -Ex0rMs6GLEO/uW4MqXtIUwAA -YwhsvrydXEK3QH1y0tcI8AAA -TJ1TkPC99EOsPriYFKuNEQAA -9zToiokH5EOEYAVGTde0fQAA - - - -errorOccured -N2j+7nhBQEq+mO8YqFlxXAAA -3 -y470jG5/1kWKyTvmvBSciwAA -Pj9vbuYx+0KrHJU4029tFAAA -hlISvXV+tUadhZUvrh1RVwAA -1 -6USFEKS3dkeTgjyDb/0IrAAA -1 - -errorcode -Error -Apdq3G0RkUm9YikPh0QWrwAA -qk1BGGqjnkSnhKy4dM5cdwAA - - - -tokenExpired -N2j+7nhBQEq+mO8YqFlxXAAA -3 -0MG3H44vP0u6GuUhqp/PDAAA -BmANhxUGB0yr5/qAY3J9igAA -+5EXzLoU+UaXHl7RHjuExgAA -1 -7Yrk3YeMBki9CB5raHefMwAA - - -fileNotFound -N2j+7nhBQEq+mO8YqFlxXAAA -3 -d/LcpSgLCUOq+LACpXa0pgAA -Yi4yeB715kWAzNmK6ioaewAA -y5Yeg2cKjUmPN9fhhQ/yywAA -1 -ThFMbzFeI02U2Kdg4mtC0gAA - - -operationFinished -N2j+7nhBQEq+mO8YqFlxXAAA -3 -DbOb8jdSYU2DaQgSpSw7ewAA -P1rzfaxZlUGklraQkE6aIAAA -W/Y/8AAvK0OuFnTn8qB//gAA -1 -3TTDOAqcVUeHLjV5YanQ4wAA -1 - -requestnr -int -PkX3MuawrUOgUybeiHMd4AAA - - - -requestTokenFinished -N2j+7nhBQEq+mO8YqFlxXAAA -3 -y8uYGkGLTEKrIy8t3qnPDgAA -hrIbA/jpf0eXNr4jmqzQTAAA -LpvBHSClMkiSKIIKGorLaAAA -1 -D7k1/msjHkK5wIpSkUtuyAAA -2 - -token -Qstring -GEINB+W8lUi6WPX9cbLO6QAA - - -secret -QString -GEINB+W8lUi6WPX9cbLO6QAA - - - -accessTokenFinished -N2j+7nhBQEq+mO8YqFlxXAAA -3 -XSbsnT/NBki2/tfPi21woQAA -G7AFkrcb2kmgngToQtRBrAAA -vPuQfzIpkkqLQnAeHASjIgAA -1 -2xpWl3PtHk2x1n3TdHoNKQAA -2 - -token -QString -hBjoYmz+wkOFeo0G33HYTAAA - - -secret -QString -hBjoYmz+wkOFeo0G33HYTAAA - - - -tokenChanged -N2j+7nhBQEq+mO8YqFlxXAAA -3 -Q23OA5Ja10mcv/znj6MUDwAA -NJmKT7fvZEqgIDPCOT4v5gAA -/5/Vy0rgfUq/nkSFswxqkgAA -1 -+PzW1voGeEiJof5Tf+zPeAAA -2 - -token -QString -fGcMDHG0HUKA3XRLyM1/+AAA - - -scret -QString -fGcMDHG0HUKA3XRLyM1/+AAA - - - -accountInfo -N2j+7nhBQEq+mO8YqFlxXAAA -3 -jE8S89+ECUatE1B7MTZIFwAA -7yONQVEdBUuUOMStrWhFPAAA -W+ajrd0tJEqiF4A6AU/0FgAA -1 -eNFl7eT+5kWwfL71FCj0tAAA -1 - -accountJson -QString -RuXWIak58U6HssZVXcXdpAAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -Z256p1bkwkanXjjCNlYzkAAA -ZVRTGTP/7EK3e5uLi4pgZAAA -5QwCE0hx/UqkcDhirJoAlAAA -CE3Ovn1ByE6f/sTcj0nLVwAA -2 - -BqJXqZ8et0ewcZz7gJsiJwAA -qk1BGGqjnkSnhKy4dM5cdwAA -4 -UsLe+DrPaEqF2UyckmkQCgAA -slf5mvWeF06IlEoamjZaCwAA -V++NLsJnoUG65Xog8uUSPQAA -dcKH9BViGUuP7tCOm9ZG1wAA - - -BqJXqZ8et0ewcZz7gJsiJwAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -cVzspbWQ5UWf37XYf4VTUAAA -4nRoqd8D7Eudh3nISyuxFgAA -uthKGQmnEkO7ICyiy7SbcgAA -YnaplBs1jkWfjwBCDQtbQAAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -zhH7qIEWU0aVW9eobHmrVQAA -LnhuXq8yBUy+nNW6h4DihgAA -VPzkLOfQkkGPtEd9az63uwAA -j93s9f6q00S+NB6pg95/2gAA -2 - -vklRY+kLBUi4eci/v1uFiQAA -+/W13Cj9q0CX8sXB5mCpCwAA -4 -bOiEup2aBkiDabZTWrEKhQAA -mdUzivme/Ealz05DAFYsggAA -+0LGobpRHUiavBovkVjFrgAA -TDuIvjtajUuRx3N3wMCiNAAA - - -vklRY+kLBUi4eci/v1uFiQAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -iU6CrCDxOkmG+y3/f+5YCgAA -Ac1bH6MQfUWgrsqe93KniwAA -Do/p1nhkH0uNUEMiesjusQAA -Z+MixH2S9EmHnNLFDYa4EQAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -JStSFmZSx060KtrSh6JoQwAA -Bc8LwFkQFk68HQRlN8D5SgAA -0ITdr2cT0EO7pq0j+6mfVAAA -nDQO1BOAGkaqMkZ7nayPywAA -2 - -PzNmZJmtHE2pdK6tfw/wcQAA -hBjoYmz+wkOFeo0G33HYTAAA -4 -GgYqouGJTE+WuhNZFaJc2QAA -9jD8vHmt/ka2h270PeHhdgAA -BysU/NkTSkKnIKY1gKnhVAAA -qpyAoLZ9kEycVW6es+jcKAAA - - -PzNmZJmtHE2pdK6tfw/wcQAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -EK+RNGbsyUC4uKp0XaZX9gAA -ulasKlMNUkqPzUYY+TYFyAAA -gQY6yjs7SEaiRl5y4w5v/gAA -JUz9PCuTq0eNe4o7GS+FawAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -waw7e7QrGkq/9cpqfVBDgwAA -8cT0Q7rzW0CG5o6y8uonNwAA -6QUND/Xq0U2B7/blILpFXAAA -onV16DVwQU6lJsc+eV6CiQAA -2 - -hrJIc6Szbk6vbvDCEFkAUgAA -lHzz4UFjMEGbYtbZkKiWcgAA -4 -g20VbEI/T0OwHkOqFmP+kAAA -bb7y33Sw0Eud8nwuExrN4wAA -1o/GNY1czEKAxT13IN+TQQAA -6HMnfTCeG0SfAwm+4ytPvgAA - - -hrJIc6Szbk6vbvDCEFkAUgAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -MQVieLQSUE+RsGLai/iqGQAA -VTvjEscgLUe4dXzOn7zUbQAA -/vPCr+gR9UmdEJdDwrYIvgAA -xz4lU1phhEik549mR5d6SAAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -KHPRify1ZUKmgl0b5xKfIwAA -PWu+7pScfUq4Bg/u82JdHQAA -8x2dF50al0WAQQkIiGFAbQAA -DYaEM6hBUkKT20/URsKsHQAA -2 - -OcPT6iodY0mVCE0RmyoedAAA -fGcMDHG0HUKA3XRLyM1/+AAA -4 -bQ5oII1cwEu8HjervNJOYAAA -Qjbemm+skkyhFY/bXHKTkQAA -b0mZ0PChmka4NBs1BX2oDgAA -yxDE5qHu9E+bBTewtyBy8wAA - - -OcPT6iodY0mVCE0RmyoedAAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -1grLKBxkf0K8IiNZWcx8TgAA -OkDT47Dc70OVmk9GDGxOyQAA -wzlXP1OCT0aQxUmKN5eAyAAA -02QxCHcg7E+HaVGo1RN4twAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -M84qdg+B4UKnfSlUxxoAKwAA -hv2hIFrNZkS7fu4nXpOL7QAA -adgRPEYrHEOxUObifDVFRgAA -yXU9Bls5FUiDooxaEkN3zQAA -2 - -787xJAPCtkWj9kozxlj32gAA -PkX3MuawrUOgUybeiHMd4AAA -4 -0fsVtFsumU63wCIf47zHeQAA -1R+MAuqjU0uH8EEpDLk15AAA -dYC/mE+mYEqAaImjVFlJPwAA -0rBhva1vF0y6Tn0jOVEbRQAA - - -787xJAPCtkWj9kozxlj32gAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -uhAqE128FEKffyzQasxRUQAA -DizGqHCpGUKETNySypGkKgAA -E/ih7S/akU6zr6JaTZDz2gAA -rMK/aqLKkUigW9hNlrZajwAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -U3sxL7aeV0qHvD0Ai+0EbgAA -303Z3dVV40OngRdSj46nDwAA -HRi92UAFkUq6dSmkP+y0HwAA -jMKxuGKc3UCPb2ieJ9xFtwAA -2 - -IU2f7CMDW0aUHQ0vbnw6xQAA -RuXWIak58U6HssZVXcXdpAAA -4 -4Nx5sT7lK06ZWwlZy+EAPAAA -kMyStFNfHEKakTN4PzUXAQAA -dx+loCUlYk6rtzdbtSjm/gAA -AGETsdxP0EKKVtf3uwl5FQAA - - -IU2f7CMDW0aUHQ0vbnw6xQAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -gjq4uIm7OEK/mjYt5W66rwAA -xzsluMLZnEaNH4GCoSgAQQAA -ulZkjTwJF0aNu8XyTN2spAAA -fhN1kfOfP0Cb7YzbGQSWNgAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -T2/NfL+iJE2gNuvSKR68sgAA -TqgeAxk2o0CC0Fi9+n4YYwAA -fTThGCBMTECB2WLkgSeVkgAA -ZDyZXhaJikmmYJYJtKdwVwAA -2 - -k3xJIyemAUqZ/4cSnWz0XAAA -GEINB+W8lUi6WPX9cbLO6QAA -4 -6El+bD9eYkicxo2z9/CxxgAA -YKzCFuLXlU+axgmoHDOWFAAA -KeLOYYQEGEO00KVBDxSOvAAA -eFapM88qh0CMPWycVL6wjQAA - - -k3xJIyemAUqZ/4cSnWz0XAAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -lj1NvZBxjEuEHSntmafkAwAA -w1AsYnvUZkWri8hu4UokOQAA -tfhQYeR/xk2urcCjybkeLwAA -hLxJfDVqMEqVuGplME2zHwAA - - - -Lee, Minkyu -N2j+7nhBQEq+mO8YqFlxXAAA - - -QNetworkAccessManager -N2j+7nhBQEq+mO8YqFlxXAAA -4 -TFZSwFd6v0Gn7TdqXdwwEAAA -d6gsFWDgD0Kd2Rae44wqfAAA -Mdg1h+joB06Xvz9WUhzbGAAA -GZliktnBMUO63q7eFe4gVQAA -1 - -QtNetwork -IAbNseYeoEit8L/hehUKxQAA - -1 -42P/6HIwV0GJlnGAbQS/bAAA -5 -VLU+Sg2GI0O2sy/HAj/OHAAA -fFXfiXSitU2ULoVhxIak2AAA -orUirPbVqkmjufhsKG6ZmwAA -S2oIEoMO3Umk602ItRnV0AAA -dQ2dHg6S50KOGmxpXyjRwQAA - - -finished -N2j+7nhBQEq+mO8YqFlxXAAA -3 -vXpkVGBpuU6uFrfUC+MkTgAA -qqHucX46j0meiMXQSvv1VAAA -8JbdpXq7806hfR/Ea0e3kAAA -2 -MKFKr2BoWEOP6PDAxRUvGAAA -lwOOm8mItUKc9RSfv+MG7AAA -1 - -reply -QNetworkReply* -1RNSGyN9pUmj5s8PPq5uxgAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -3QVnpdi6ykitroavY6MHogAA -IAbNseYeoEit8L/hehUKxQAA - - -3QVnpdi6ykitroavY6MHogAA -IAbNseYeoEit8L/hehUKxQAA - - - -emit -N2j+7nhBQEq+mO8YqFlxXAAA -4 -uWGmdDdnukuzbI76evBytgAA -XtXZ9mi7kUuU8SBnDK6N7wAA -j2isnslre0SqbGLv5WM2IQAA -PvTYOf3IC0iyGhveqfzUSAAA -2 - -K2cEmXPiO0GdwZSsxaRw9QAA -IAbNseYeoEit8L/hehUKxQAA -4 -I79FuaNO/USbvGlIt6PgbAAA -YISyuLSrzEuVgmN7BlJIOAAA -LMnON83gt0ySK2g7Dcv3EwAA -IpiUtmhGGUCpLSqW2ZgPOgAA - - -K2cEmXPiO0GdwZSsxaRw9QAA -1RNSGyN9pUmj5s8PPq5uxgAA -4 -Q8dDFSfVd0eW0prR+wDz2wAA -7rs5SNJiC0S/3tckmhn4+wAA -Wg2Qu3nZekalqwuBq8nMOwAA -tObeMMwNuU+9mKy+WeI03wAA - - - -receive -N2j+7nhBQEq+mO8YqFlxXAAA -4 -IRi9ub5p+0+0HtAknDhRVwAA -Lz6AQ1eak0eW4dCBWpYuDwAA -xCyaVNrmNU+3Ks8Q67Dj5AAA -IPgm7PrkZUOYgag+dsH2IAAA -2 - -HqLKEdCIAUSt8J3/YuUQmwAA -1RNSGyN9pUmj5s8PPq5uxgAA -4 -hWLnuPUEzEKrqPMfzK6CZgAA -Q4r06s5mqE+vePzYT6tVxwAA -P7PkKSkXDUuEoo5K4fnXUQAA -DMc65Zv2hEGxRRkDCLnGVgAA - - -HqLKEdCIAUSt8J3/YuUQmwAA -W0IFCTrokkm6wkpDiDO1ogAA -4 -Bl6WU9oZ+E+trTJ5HfhucgAA -EwRPs3nhmE228BfeJNhcewAA -m3wm4COdxUat6MXUp4ZKsgAA -Q4Ie7kD73EO6HqV2ZB6bmQAA - - - -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -4TBJauA67EqSLeA+g6uAkwAA -IAbNseYeoEit8L/hehUKxQAA - - -akAggregate -4TBJauA67EqSLeA+g6uAkwAA -W0IFCTrokkm6wkpDiDO1ogAA - - - -conManager: QNetworkAccessManager -N2j+7nhBQEq+mO8YqFlxXAAA -2 - -9W4JC9U/bkOttzWRw/aMLgAA -W0IFCTrokkm6wkpDiDO1ogAA - - -akAggregate -9W4JC9U/bkOttzWRw/aMLgAA -IAbNseYeoEit8L/hehUKxQAA - - - -QDropboxFile -N2j+7nhBQEq+mO8YqFlxXAAA -4 -YYj3pOVpJEO4ERe8D85K6gAA -Gi1WCzjeSEefQ/m9sAsOkgAA -ZJol5W0YGk2emO9dCEpaKQAA -XBydwX3znUubHG85/LZnEgAA -1 -jN1Jscw+pEumBPW4E+/MrAAA -19 - -QDropboxFile -Jy85dFa4H0mNGCk17axsXQAA -1 - -parent -QObject* -fauSGazmrkmaqLP6SAvqqwAA - - - -QDropboxFile -Jy85dFa4H0mNGCk17axsXQAA -2 - -dropbox -QDropbox* -Q73JHn1wBEuNKwCuxv1TyQAA - - -parent -QObject* -Q73JHn1wBEuNKwCuxv1TyQAA - - - -QDropboxFile -Jy85dFa4H0mNGCk17axsXQAA -3 - -filename -QString -TD1buVz8GEufjp4ay+KAlAAA - - -dropbox -QDropbox* -TD1buVz8GEufjp4ay+KAlAAA - - -parent -QObject* -TD1buVz8GEufjp4ay+KAlAAA - - - -QDropboxFile -vkPackage -Jy85dFa4H0mNGCk17axsXQAA - - -setApi -Jy85dFa4H0mNGCk17axsXQAA -2 - -pdkReturn -void -uoLlwsuXHkStXoy5BOpWGQAA - - -dropbox -QDropbox* -uoLlwsuXHkStXoy5BOpWGQAA - - - -api -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -QDropbox* -n3D3hZJPe0m87d2G1deuZwAA - - - -readData -vkProtected -Jy85dFa4H0mNGCk17axsXQAA -3 - -pdkReturn -qint64 -jASX9u05l0GH1BlZetsSPQAA - - -data -char* -jASX9u05l0GH1BlZetsSPQAA - - -maxSize -qint64 -jASX9u05l0GH1BlZetsSPQAA - - - -writeData -vkProtected -Jy85dFa4H0mNGCk17axsXQAA -3 - -pdkReturn -qint64 -tKV4j1D3KE6+V4hIO4MErgAA - - -data -const char* -tKV4j1D3KE6+V4hIO4MErgAA - - -maxSize -qint64 -tKV4j1D3KE6+V4hIO4MErgAA - - - -isSequential -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -bool -3bEC6CXx80e0zEtc25yzyAAA - - - -open -Jy85dFa4H0mNGCk17axsXQAA -2 - -pdkReturn -bool -HEmZBEERSU6rHyk99gLQ1gAA - - -mode -OpenMode -HEmZBEERSU6rHyk99gLQ1gAA - - - -close -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -void -oKlbHjbySUylG387FEIOLQAA - - - -flush -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -bool -NBj3q81B20uyIyIwJ1teqwAA - - - -obtainToken -vkPrivate -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -void -m5kNmppoc0e7KGVxtP1xlAAA - - - -isMode -vkPrivate -Jy85dFa4H0mNGCk17axsXQAA -2 - -pdkReturn -bool -gV13dsTCP02tCO54bBchEQAA - - -mode -OpenMode -gV13dsTCP02tCO54bBchEQAA - - - -setFilename -Jy85dFa4H0mNGCk17axsXQAA -1 - -filename -QString -7kM9ehRZyUWtENVOR1kcpQAA - - - -filename -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -QString -mi2SMzJ9UEijYDVF3ymswQAA - - - -getFileContent -vkPrivate -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -bool -v+MB4NreiUSNLRw9gae6agAA - - - -connectSignals -vkPrivate -Jy85dFa4H0mNGCk17axsXQAA -1 - -pdkReturn -void -Yrg3sc4fb0ePMmEwMDcK6wAA - - - -networkRequestFinished -vkPrivate -Jy85dFa4H0mNGCk17axsXQAA -2 - -pdkReturn -void -I0HG86OJHUea9z3yd/rk0QAA - - -rply -QNetworkReply* -I0HG86OJHUea9z3yd/rk0QAA - - -6 - -_token -vkPrivate -QString -Jy85dFa4H0mNGCk17axsXQAA - - -_tokenSecret -vkPrivate -QString -Jy85dFa4H0mNGCk17axsXQAA - - -_api -vkPrivate -QDropbox* -Jy85dFa4H0mNGCk17axsXQAA - - -_conManager -vkPrivate -QNetworkAccessManager -IAbNseYeoEit8L/hehUKxQAA -Jy85dFa4H0mNGCk17axsXQAA - - -_buffer -vkPrivate -QByteArray* -Jy85dFa4H0mNGCk17axsXQAA - - -_filename -vkPrivate -QString -Jy85dFa4H0mNGCk17axsXQAA - - - -QIODevice -N2j+7nhBQEq+mO8YqFlxXAAA -4 -iVqhIMWw2kOENBS6i1bzRAAA -6yYazEp32UOKl6oBnmrtOwAA -yAApwgjwZU6LdLLy6Jc/rwAA -gUTkywmnpUyZfVIvoa89jQAA -1 - -QtCore -fKdwvFAhRES1bUHbkladewAA - -1 -jN1Jscw+pEumBPW4E+/MrAAA - - -N2j+7nhBQEq+mO8YqFlxXAAA -fKdwvFAhRES1bUHbkladewAA -Jy85dFa4H0mNGCk17axsXQAA -4 -1pVuDU+NJkSP73zSk3Q7mgAA -bSoR90svHkaJ+KhvkVX/3QAA -NZ31b1CEQ0eE3+B1C1P00gAA -n7nbD0IB8Ei5NagRDYjC+gAA - - - -Implementation Model -UMLStandard -implementationModel -7nMF4TYiyE2tufmAssy54AAA -1 - -Main -0pcWzk2fi0K5IOlu0sKohgAA - -wetG99yhWEqRb6CFaCvmqwAA - - - - -Deployment Model -UMLStandard -deploymentModel -7nMF4TYiyE2tufmAssy54AAA -1 - -Main -/JNjEUsUG0aUm+Qezqsr4AAA - -+9JmREHV6kmgujrAnwC7ewAA - - - - - - diff --git a/src/third_party/QtDropbox/doc/doxygen.conf b/src/third_party/QtDropbox/doc/doxygen.conf deleted file mode 100644 index 1b1fddf..0000000 --- a/src/third_party/QtDropbox/doc/doxygen.conf +++ /dev/null @@ -1,1749 +0,0 @@ -# Doxyfile 1.7.4 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = QtDropbox - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.1 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "An API for accessing the Dropbox API by using the Qt C++ Framework" - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = ./doc - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 27 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = NO - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = NO - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ./src - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.for \ - *.vhd \ - *.vhdl - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = NO - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = NO - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is adviced to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = YES - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called Helvetica to the output -# directory and reference it in all dot files that doxygen generates. -# When you want a differently looking font you can specify the font name -# using DOT_FONTNAME. You need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/src/third_party/QtDropbox/libqtdropbox.pri b/src/third_party/QtDropbox/libqtdropbox.pri deleted file mode 100644 index e563afc..0000000 --- a/src/third_party/QtDropbox/libqtdropbox.pri +++ /dev/null @@ -1,13 +0,0 @@ -INCLUDEPATH += qtdropbox -LIBS += -lQtDropbox - -HEADERS += qtdropbox_global.h\ - qdropbox.h \ - qtdropbox.h \ - qdropboxjson.h \ - qdropboxaccount.h \ - qdropboxfile.h \ - qdropboxfileinfo.h \ - qdropboxdeltaresponse.h - -CONFIG += network diff --git a/src/third_party/QtDropbox/qtdropbox.config.pri b/src/third_party/QtDropbox/qtdropbox.config.pri deleted file mode 100644 index a02738d..0000000 --- a/src/third_party/QtDropbox/qtdropbox.config.pri +++ /dev/null @@ -1,21 +0,0 @@ -OTHER_FILES += libqtdropbox.pri - -target.path = lib/ - -#------------------------------------------------- -# Documentation target -#------------------------------------------------- -documentation.commands = doxygen doc/doxygen.conf -QMAKE_EXTRA_TARGETS += documentation - -#------------------------------------------------- -# Package target -#------------------------------------------------- -package.files = libqtdropbox.pri \ - src/*.h -package.path = qtdropbox - -#------------------------------------------------- -# install definitions -#------------------------------------------------- -INSTALLS += target package diff --git a/src/third_party/QtDropbox/qtdropbox.pri b/src/third_party/QtDropbox/qtdropbox.pri deleted file mode 100644 index 4abb1b6..0000000 --- a/src/third_party/QtDropbox/qtdropbox.pri +++ /dev/null @@ -1,23 +0,0 @@ -QT += network xml - -INCLUDEPATH += $$PWD/src - -SOURCES += \ - $$PWD/src/qdropbox.cpp \ - $$PWD/src/qdropboxjson.cpp \ - $$PWD/src/qdropboxaccount.cpp \ - $$PWD/src/qdropboxfile.cpp \ - $$PWD/src/qdropboxfileinfo.cpp \ - $$PWD/src/qdropboxdeltaresponse.cpp - -HEADERS += \ - $$PWD/src/qtdropbox_global.h \ - $$PWD/src/qdropbox.h \ - $$PWD/src/qdropboxjson.h \ - $$PWD/src/qdropboxaccount.h \ - $$PWD/src/qdropboxfile.h \ - $$PWD/src/qtdropbox.h \ - $$PWD/src/qdropboxfileinfo.h \ - $$PWD/src/qdropboxdeltaresponse.h - -CONFIG += network diff --git a/src/third_party/QtDropbox/qtdropbox.pro b/src/third_party/QtDropbox/qtdropbox.pro deleted file mode 100644 index 959675a..0000000 --- a/src/third_party/QtDropbox/qtdropbox.pro +++ /dev/null @@ -1,34 +0,0 @@ -#------------------------------------------------- -# General definitions and dependencies -#------------------------------------------------- - -QT += network xml - -QT -= gui - -TEMPLATE = lib - -DEFINES += QTDROPBOX_LIBRARY -# QTDROPBOX_DEBUG - -SOURCES += \ - src/qdropbox.cpp \ - src/qdropboxjson.cpp \ - src/qdropboxaccount.cpp \ - src/qdropboxfile.cpp \ - src/qdropboxfileinfo.cpp \ - src/qdropboxdeltaresponse.cpp - -HEADERS += \ - src/qtdropbox_global.h \ - src/qdropbox.h \ - src/qdropboxjson.h \ - src/qdropboxaccount.h \ - src/qdropboxfile.h \ - src/qtdropbox.h \ - src/qdropboxfileinfo.h \ - src/qdropboxdeltaresponse.h - -TARGET = QtDropbox - -include(qtdropbox.config.pri) diff --git a/src/third_party/QtDropbox/src/qdropbox.cpp b/src/third_party/QtDropbox/src/qdropbox.cpp deleted file mode 100644 index cb17e07..0000000 --- a/src/third_party/QtDropbox/src/qdropbox.cpp +++ /dev/null @@ -1,1257 +0,0 @@ -#include "qdropbox.h" - -QDropbox::QDropbox(QObject *parent) : - QObject(parent), - conManager(this) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "creating dropbox api" << endl; -#endif - - errorState = QDropbox::NoError; - errorText = ""; - setApiVersion("1.0"); - setApiUrl("api.dropbox.com"); - setAuthMethod(QDropbox::Plaintext); - - oauthToken = ""; - oauthTokenSecret = ""; - - lastreply = 0; - - connect(&conManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReplyFinished(QNetworkReply*))); - - // needed for nonce generation - qsrand(QDateTime::currentMSecsSinceEpoch()); - - _evLoop = NULL; - _saveFinishedRequests = false; -} - -QDropbox::QDropbox(QString key, QString sharedSecret, OAuthMethod method, QString url, QObject *parent) : - QObject(parent), - conManager(this) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "creating api with key, shared secret and method" << endl; -#endif - - errorState = QDropbox::NoError; - errorText = ""; - setKey(key); - setSharedSecret(sharedSecret); - setAuthMethod(method); - setApiVersion("1.0"); - setApiUrl(url); - - oauthToken = ""; - oauthTokenSecret = ""; - - lastreply = 0; - - connect(&conManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReplyFinished(QNetworkReply*))); - - // needed for nonce generation - qsrand(QDateTime::currentMSecsSinceEpoch()); - - _evLoop = NULL; - _saveFinishedRequests = false; -} - -QDropbox::Error QDropbox::error() -{ - return errorState; -} - -QString QDropbox::errorString() -{ - return errorText; -} - -void QDropbox::setApiUrl(QString url) -{ - apiurl.setUrl(QString("//%1").arg(url)); - prepareApiUrl(); - return; -} - -QString QDropbox::apiUrl() -{ - return apiurl.toString(); -} - -void QDropbox::setAuthMethod(OAuthMethod m) -{ - oauthMethod = m; - prepareApiUrl(); - return; -} - -QDropbox::OAuthMethod QDropbox::authMethod() -{ - return oauthMethod; -} - -void QDropbox::setApiVersion(QString apiversion) -{ - if(apiversion.compare("1.0")) - { - errorState = QDropbox::VersionNotSupported; - errorText = "Only version 1.0 is supported."; - emit errorOccured(QDropbox::VersionNotSupported); - return; - } - - _version = apiversion; - return; -} - -void QDropbox::requestFinished(int nr, QNetworkReply *rply) -{ - rply->deleteLater(); -#ifdef QTDROPBOX_DEBUG - int resp_bytes = rply->bytesAvailable(); -#endif - QByteArray buff = rply->readAll(); - QString response = QString(buff); -#ifdef QTDROPBOX_DEBUG - qDebug() << "request " << nr << "finished." << endl; - qDebug() << "request was: " << rply->url().toString() << endl; -#endif -#ifdef QTDROPBOX_DEBUG - qDebug() << "response: " << resp_bytes << "bytes" << endl; - qDebug() << "status code: " << rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString() << endl; - qDebug() << "== begin response ==" << endl << response << endl << "== end response ==" << endl; - qDebug() << "req#" << nr << " is of type " << requestMap[nr].type << endl; -#endif - // drop box error handling based on return codes - switch(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()) - { - case QDROPBOX_ERROR_BAD_INPUT: - errorState = QDropbox::BadInput; - errorText = ""; - emit errorOccured(errorState); - checkReleaseEventLoop(nr); - return; - break; - case QDROPBOX_ERROR_EXPIRED_TOKEN: - errorState = QDropbox::TokenExpired; - errorText = ""; - emit tokenExpired(); - checkReleaseEventLoop(nr); - return; - break; - case QDROPBOX_ERROR_BAD_OAUTH_REQUEST: - errorState = QDropbox::BadOAuthRequest; - errorText = ""; - emit errorOccured(errorState); - checkReleaseEventLoop(nr); - return; - break; - case QDROPBOX_ERROR_FILE_NOT_FOUND: - emit fileNotFound(); - checkReleaseEventLoop(nr); - return; - break; - case QDROPBOX_ERROR_WRONG_METHOD: - errorState = QDropbox::WrongHttpMethod; - errorText = ""; - emit errorOccured(errorState); - checkReleaseEventLoop(nr); - return; - break; - case QDROPBOX_ERROR_REQUEST_CAP: - errorState = QDropbox::MaxRequestsExceeded; - errorText = ""; - emit errorOccured(errorState); - checkReleaseEventLoop(nr); - return; - break; - case QDROPBOX_ERROR_USER_OVER_QUOTA: - errorState = QDropbox::UserOverQuota; - errorText = ""; - emit errorOccured(errorState); - checkReleaseEventLoop(nr); - return; - break; - default: - break; - } - - if(rply->error() != QNetworkReply::NoError) - { - - errorState = QDropbox::CommunicationError; - errorText = QString("%1 - %2").arg(rply->error()).arg(rply->errorString()); -#ifdef QTDROPBOX_DEBUG - qDebug() << "error " << errorState << "(" << errorText << ") in request" << endl; -#endif - emit errorOccured(errorState); - checkReleaseEventLoop(nr); - return; - } - - // ignore connection requests - if(requestMap[nr].type == QDROPBOX_REQ_CONNECT) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "- answer to connection request ignored" << endl; -#endif - removeRequestFromMap(nr); - return; - } - - bool delayed_finish = false; - int delayed_nr; - - if(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 302) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "redirection received" << endl; -#endif - // redirection handling - QUrl newlocation(rply->header(QNetworkRequest::LocationHeader).toString(), QUrl::StrictMode); -#ifdef QTDROPBOX_DEBUG - qDebug() << "new url: " << newlocation.toString() << endl; -#endif - int oldnr = nr; - nr = sendRequest(newlocation, requestMap[nr].method, 0, requestMap[nr].host); - requestMap[nr].type = QDROPBOX_REQ_REDIREC; - requestMap[nr].linked = oldnr; - return; - } - else - { - if(requestMap[nr].type == QDROPBOX_REQ_REDIREC) - { - // change values if this is the answert to a redirect - qdropbox_request redir = requestMap[nr]; - qdropbox_request orig = requestMap[redir.linked]; - requestMap[nr] = orig; - removeRequestFromMap(nr); - nr = redir.linked; - } - - // standard handling depending on message type - switch(requestMap[nr].type) - { - case QDROPBOX_REQ_CONNECT: - // was only a connect request - so drop it - break; - case QDROPBOX_REQ_RQTOKEN: - // requested a tiken - responseTokenRequest(response); - break; - case QDROPBOX_REQ_RQBTOKN: - responseBlockedTokenRequest(response); - break; - case QDROPBOX_REQ_AULOGIN: - delayed_nr = responseDropboxLogin(response, nr); - delayed_finish = true; - break; - case QDROPBOX_REQ_ACCTOKN: - responseAccessToken(response); - break; - case QDROPBOX_REQ_METADAT: - parseMetadata(response); - break; - case QDROPBOX_REQ_BMETADA: - parseBlockingMetadata(response); - break; - case QDROPBOX_REQ_BACCTOK: - responseBlockingAccessToken(response); - break; - case QDROPBOX_REQ_ACCINFO: - parseAccountInfo(response); - break; - case QDROPBOX_REQ_BACCINF: - parseBlockingAccountInfo(response); - break; - case QDROPBOX_REQ_SHRDLNK: - parseSharedLink(response); - break; - case QDROPBOX_REQ_BSHRDLN: - parseBlockingSharedLink(response); - break; - case QDROPBOX_REQ_REVISIO: - parseRevisions(response); - break; - case QDROPBOX_REQ_BREVISI: - parseBlockingRevisions(response); - break; - case QDROPBOX_REQ_DELTA: - parseDelta(response); - break; - case QDROPBOX_REQ_BDELTA: - parseBlockingDelta(response); - break; - default: - errorState = QDropbox::ResponseToUnknownRequest; - errorText = "Received a response to an unknown request"; - emit errorOccured(errorState); - break; - } - } - - if(delayed_finish) - delayMap[delayed_nr] = nr; - else - { - if(delayMap[nr]) - { - int drq = delayMap[nr]; - while(drq!=0) - { - emit operationFinished(delayMap[drq]); - delayMap.remove(drq); - drq = delayMap[drq]; - } - } - - removeRequestFromMap(nr); - emit operationFinished(nr); - } - - return; -} - -void QDropbox::networkReplyFinished(QNetworkReply *rply) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "reply finished" << endl; -#endif - int reqnr = replynrMap[rply]; - requestFinished(reqnr, rply); - rply->deleteLater(); // release memory -} - - -QString QDropbox::hmacsha1(QString baseString, QString key) -{ - int blockSize = 64; // HMAC-::hmacsha1SHA-1 block size, defined in SHA-1 standard - if (key.length() > blockSize) { // if key is longer than block size (64), reduce key length with SHA-1 compression - key = QCryptographicHash::hash(key.toLatin1(), QCryptographicHash::Sha1); - } - - QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char "6" - QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char "\" - // ascii characters 0x36 ("6") and 0x5c ("\") are selected because they have large - // Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance) - - for (int i = 0; i < key.length(); i++) { - innerPadding[i] = innerPadding[i] ^ key.toLatin1().at(i); // XOR operation between every byte in key and innerpadding, of key length - outerPadding[i] = outerPadding[i] ^ key.toLatin1().at(i); // XOR operation between every byte in key and outerpadding, of key length - } - - // result = hash ( outerPadding CONCAT hash ( innerPadding CONCAT baseString ) ).toBase64 - QByteArray total = outerPadding; - QByteArray part = innerPadding; - part.append(baseString.toLatin1()); - total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1)); - QByteArray hashed = QCryptographicHash::hash(total, QCryptographicHash::Sha1); - return hashed.toBase64(); -} - -QString QDropbox::generateNonce(qint32 length) -{ - QString clng = ""; - for(int i=0; i request #" << lastreply << " sent." << endl; -#endif - emit operationStarted(lastreply); // fire signal for operation start - return lastreply; -} - -void QDropbox::responseTokenRequest(QString response) -{ - parseToken(response); - emit requestTokenFinished(oauthToken, oauthTokenSecret); - return; -} - -int QDropbox::responseDropboxLogin(QString response, int reqnr) -{ - Q_UNUSED(reqnr); - - // extract login form - QDomDocument xml; - QString err; - int lnr, cnr; - if(!xml.setContent(response, false, &err, &lnr, &cnr)) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "invalid xml (" << lnr << "," << cnr << "): " << err << "dump:" << endl; - qDebug() << xml.toString() << endl; -#endif - return 0; - } - return 0; -} - -void QDropbox::responseAccessToken(QString response) -{ - parseToken(response); - emit accessTokenFinished(oauthToken, oauthTokenSecret); - return; -} - -QString QDropbox::signatureMethodString() -{ - QString sigmeth; - switch(oauthMethod) - { - case QDropbox::Plaintext: - sigmeth = "PLAINTEXT"; - break; - case QDropbox::HMACSHA1: - sigmeth = "HMAC-SHA1"; - break; - default: - errorState = QDropbox::UnknownAuthMethod; - errorText = QString("Authentication method %1 is unknown").arg(oauthMethod); - emit errorOccured(errorState); - return ""; - break; - } - return sigmeth; -} - -void QDropbox::parseToken(QString response) -{ - clearError(); -#ifdef QTDROPBOX_DEBUG - qDebug() << "processing token request" << endl; -#endif - - QStringList split = response.split("&"); - if(split.size() < 2) - { - errorState = QDropbox::APIError; - errorText = "The Dropbox API did not respond as expected."; - emit errorOccured(errorState); -#ifdef QTDROPBOX_DEBUG - qDebug() << "error " << errorState << "(" << errorText << ") in request" << endl; -#endif - return; - } - - if(!split.at(0).startsWith("oauth_token_secret") || - !split.at(1).startsWith("oauth_token")) - { - errorState = QDropbox::APIError; - errorText = "The Dropbox API did not respond as expected."; - emit errorOccured(errorState); -#ifdef QTDROPBOX_DEBUG - qDebug() << "error " << errorState << "(" << errorText << ") in request" << endl; -#endif - return; - } - - QStringList tokenSecretList = split.at(0).split("="); - oauthTokenSecret = tokenSecretList.at(1); - QStringList tokenList = split.at(1).split("="); - oauthToken = tokenList.at(1); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "token = " << oauthToken << endl << "token_secret = " << oauthTokenSecret << endl; -#endif - - emit tokenChanged(oauthToken, oauthTokenSecret); - return; -} - -void QDropbox::parseAccountInfo(QString response) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "== account info ==" << response << "== account info end =="; -#endif - - QDropboxJson json; - json.parseString(response); - _tempJson.parseString(response); - if(!json.isValid()) - { - errorState = QDropbox::APIError; - errorText = "Dropbox API did not send correct answer for account information."; -#ifdef QTDROPBOX_DEBUG - qDebug() << "error: " << errorText << endl; -#endif - emit errorOccured(errorState); - return; - } - - emit accountInfoReceived(response); - return; -} - -void QDropbox::parseSharedLink(QString response) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "== shared link ==" << response << "== shared link end =="; -#endif - - //QDropboxJson json; - //json.parseString(response); - _tempJson.parseString(response); - if(!_tempJson.isValid()) - { - errorState = QDropbox::APIError; - errorText = "Dropbox API did not send correct answer for file/directory shared link."; -#ifdef QTDROPBOX_DEBUG - qDebug() << "error: " << errorText << endl; -#endif - emit errorOccured(errorState); - stopEventLoop(); - return; - } - emit sharedLinkReceived(response); -} - -void QDropbox::parseMetadata(QString response) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "== metadata ==" << response << "== metadata end =="; -#endif - - QDropboxJson json; - json.parseString(response); - _tempJson.parseString(response); - if(!json.isValid()) - { - errorState = QDropbox::APIError; - errorText = "Dropbox API did not send correct answer for file/directory metadata."; -#ifdef QTDROPBOX_DEBUG - qDebug() << "error: " << errorText << endl; -#endif - emit errorOccured(errorState); - stopEventLoop(); - return; - } - - emit metadataReceived(response); - return; -} - -void QDropbox::parseDelta(QString response) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "== metadata ==" << response << "== metadata end =="; -#endif - - QDropboxJson json; - json.parseString(response); - _tempJson.parseString(response); - if(!json.isValid()) - { - errorState = QDropbox::APIError; - errorText = "Dropbox API did not send correct answer for delta."; -#ifdef QTDROPBOX_DEBUG - qDebug() << "error: " << errorText << endl; -#endif - emit errorOccured(errorState); - stopEventLoop(); - return; - } - - emit deltaReceived(response); - return; -} - -void QDropbox::setKey(QString key) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "appKey = " << key; -#endif - _appKey = key; -} - -QString QDropbox::key() -{ - return _appKey; -} - -void QDropbox::setSharedSecret(QString sharedSecret) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "appSharedSecret = " << sharedSecret; -#endif - _appSharedSecret = sharedSecret; -} - -QString QDropbox::sharedSecret() -{ - return _appSharedSecret; -} - -void QDropbox::setToken(QString t) -{ - oauthToken = t; -} - -QString QDropbox::token() -{ - return oauthToken; -} - -void QDropbox::setTokenSecret(QString s) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "oauthTokenSecret = " << oauthTokenSecret; -#endif - oauthTokenSecret = s; -} - -QString QDropbox::tokenSecret() -{ - return oauthTokenSecret; -} - -QString QDropbox::appKey() -{ - return _appKey; -} - -QString QDropbox::appSharedSecret() -{ - return _appSharedSecret; -} - -QString QDropbox::apiVersion() -{ - return _version; -} - -int QDropbox::requestToken(bool blocking) -{ - clearError(); - QString sigmeth = signatureMethodString(); - - timestamp = QDateTime::currentMSecsSinceEpoch()/1000; - nonce = generateNonce(128); - - QUrl url; - url.setUrl(apiurl.toString()); - url.setPath(QString("/%1/oauth/request_token").arg(_version.left(1))); - - QUrlQuery query; - query.addQueryItem("oauth_consumer_key",_appKey); - query.addQueryItem("oauth_nonce", nonce); - query.addQueryItem("oauth_signature_method", sigmeth); - query.addQueryItem("oauth_timestamp", QString::number(timestamp)); - query.addQueryItem("oauth_version", _version); - - QString signature = oAuthSign(url); - query.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); - - url.setQuery(query); -#ifdef QTDROPBOX_DEBUG - qDebug() << "request token url: " << url.toString() << endl << "sig: " << signature << endl; - qDebug() << "sending request " << url.toString() << " to " << apiurl.toString() << endl; -#endif - - int reqnr = sendRequest(url); - if(blocking) - { - requestMap[reqnr].type = QDROPBOX_REQ_RQBTOKN; - startEventLoop(); - } - else - requestMap[reqnr].type = QDROPBOX_REQ_RQTOKEN; - - return reqnr; -} - -bool QDropbox::requestTokenAndWait() -{ - requestToken(true); - return (error() == NoError); -} - -int QDropbox::authorize(QString email, QString pwd) -{ - QUrl dropbox_authorize; - dropbox_authorize.setPath(QString("/%1/oauth/authorize") - .arg(_version.left(1))); -#ifdef QTDROPBOX_DEBUG - qDebug() << "oauthToken = " << oauthToken << endl; -#endif - - QUrlQuery query; - query.addQueryItem("oauth_token", oauthToken); - dropbox_authorize.setQuery(query); - int reqnr = sendRequest(dropbox_authorize, "GET", 0, "www.dropbox.com"); - requestMap[reqnr].type = QDROPBOX_REQ_AULOGIN; - mail = email; - password = pwd; - return reqnr; -} - -QUrl QDropbox::authorizeLink() -{ - QUrl link; - link.setScheme("https"); - link.setHost("www.dropbox.com"); - link.setPath(QString("/%1/oauth/authorize") - .arg(_version.left(1))); - - QUrlQuery query; - query.addQueryItem("oauth_token", oauthToken); - link.setQuery(query); - return link; -} - -int QDropbox::requestAccessToken(bool blocking) -{ - clearError(); - - QUrl url; - url.setUrl(apiurl.toString()); - - QUrlQuery query; - query.addQueryItem("oauth_consumer_key",_appKey); - query.addQueryItem("oauth_nonce", nonce); - query.addQueryItem("oauth_signature_method", signatureMethodString()); - query.addQueryItem("oauth_timestamp", QString::number(timestamp)); - query.addQueryItem("oauth_token", oauthToken); - query.addQueryItem("oauth_version", _version); - - url.setPath(QString("/%1/oauth/access_token"). - arg(_version.left(1))); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "requestToken = " << query.queryItemValue("oauth_token"); -#endif - - QString signature = oAuthSign(url); - query.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); - - url.setQuery(query); - - QString dataString = url.toString(QUrl::RemoveScheme|QUrl::RemoveAuthority| - QUrl::RemovePath).mid(1); -#ifdef QTDROPBOX_DEBUG - qDebug() << "dataString = " << dataString << endl; -#endif - - QByteArray postData; - postData.append(dataString.toUtf8()); - - QUrl xQuery(url.toString(QUrl::RemoveQuery)); - int reqnr = sendRequest(xQuery, "POST", postData); - - if(blocking) - { - requestMap[reqnr].type = QDROPBOX_REQ_BACCTOK; - startEventLoop(); - } - else - requestMap[reqnr].type = QDROPBOX_REQ_ACCTOKN; - - return reqnr; -} - -bool QDropbox::requestAccessTokenAndWait() -{ - requestAccessToken(true); -#ifdef QTDROPBOX_DEBUG - qDebug() << "requestTokenAndWait() finished: error = " << error() << endl; -#endif - return (error() == NoError); -} - -void QDropbox::requestAccountInfo(bool blocking) -{ - clearError(); - - timestamp = QDateTime::currentMSecsSinceEpoch()/1000; - - QUrl url; - url.setUrl(apiurl.toString()); - - QUrlQuery urlQuery; - urlQuery.addQueryItem("oauth_consumer_key",_appKey); - urlQuery.addQueryItem("oauth_nonce", nonce); - urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); - urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); - urlQuery.addQueryItem("oauth_token", oauthToken); - urlQuery.addQueryItem("oauth_version", _version); - - QString signature = oAuthSign(url); - urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); - - url.setPath(QString("/%1/account/info").arg(_version.left(1))); - url.setQuery(urlQuery); - - int reqnr = sendRequest(url); - if(blocking) - { - requestMap[reqnr].type = QDROPBOX_REQ_BACCINF; - startEventLoop(); - } - else - requestMap[reqnr].type = QDROPBOX_REQ_ACCINFO; - return; -} - -QDropboxAccount QDropbox::requestAccountInfoAndWait() -{ - requestAccountInfo(true); - QDropboxAccount a(_tempJson.strContent(), this); - _account = a; - return _account; -} - -void QDropbox::parseBlockingAccountInfo(QString response) -{ - clearError(); - parseAccountInfo(response); - stopEventLoop(); - return; -} - -void QDropbox::requestMetadata(QString file, bool blocking) -{ - clearError(); - - timestamp = QDateTime::currentMSecsSinceEpoch()/1000; - - QUrl url; - url.setUrl(apiurl.toString()); - - QUrlQuery urlQuery; - urlQuery.addQueryItem("oauth_consumer_key",_appKey); - urlQuery.addQueryItem("oauth_nonce", nonce); - urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); - urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); - urlQuery.addQueryItem("oauth_token", oauthToken); - urlQuery.addQueryItem("oauth_version", _version); - - QString signature = oAuthSign(url); - urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); - - url.setQuery(urlQuery); - url.setPath(QString("/%1/metadata/%2").arg(_version.left(1), file)); - - int reqnr = sendRequest(url); - if(blocking) - { - requestMap[reqnr].type = QDROPBOX_REQ_BMETADA; - startEventLoop(); - } - else - requestMap[reqnr].type = QDROPBOX_REQ_METADAT; - //QDropboxFileInfo fi(_tempJson.strContent(), this); - return; -} - -QDropboxFileInfo QDropbox::requestMetadataAndWait(QString file) -{ - requestMetadata(file, true); - QDropboxFileInfo fi(_tempJson.strContent(), this); - return fi; -} - -void QDropbox::requestSharedLink(QString file, bool blocking) -{ - clearError(); - - QUrl url; - url.setUrl(apiurl.toString()); - - QUrlQuery urlQuery; - urlQuery.addQueryItem("oauth_consumer_key",_appKey); - urlQuery.addQueryItem("oauth_nonce", nonce); - urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); - urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); - urlQuery.addQueryItem("oauth_token", oauthToken); - urlQuery.addQueryItem("oauth_version", _version); - - QString signature = oAuthSign(url); - urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); - - url.setPath(QString("/%1/shares/%2").arg(_version.left(1), file)); - url.setQuery(urlQuery); - - int reqnr = sendRequest(url); - if(blocking) - { - requestMap[reqnr].type = QDROPBOX_REQ_BSHRDLN; - startEventLoop(); - } - else - requestMap[reqnr].type = QDROPBOX_REQ_SHRDLNK; - - return; -} - -QUrl QDropbox::requestSharedLinkAndWait(QString file) -{ - requestSharedLink(file,true); - QDropboxJson json(_tempJson.strContent()); - QString urlString = json.getString("url"); - return QUrl(urlString); -} - -void QDropbox::requestDelta(QString cursor, QString path_prefix, bool blocking) -{ - clearError(); - - timestamp = QDateTime::currentMSecsSinceEpoch()/1000; - - QUrl url; - url.setUrl(apiurl.toString()); - - QUrlQuery urlQuery; - urlQuery.addQueryItem("oauth_consumer_key",_appKey); - urlQuery.addQueryItem("oauth_nonce", nonce); - urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); - urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); - urlQuery.addQueryItem("oauth_token", oauthToken); - urlQuery.addQueryItem("oauth_version", _version); - if(cursor.length() > 0) - { - urlQuery.addQueryItem("cursor", cursor); - } - if(path_prefix.length() > 0) - { - urlQuery.addQueryItem("path_prefix", path_prefix); - } - - QString signature = oAuthSign(url); - urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); - - url.setQuery(urlQuery); - url.setPath(QString("/%1/delta").arg(_version.left(1))); - - QString dataString = url.toString(QUrl::RemoveScheme|QUrl::RemoveAuthority| - QUrl::RemovePath).mid(1); -#ifdef QTDROPBOX_DEBUG - qDebug() << "dataString = " << dataString << endl; -#endif - - QByteArray postData; - postData.append(dataString.toUtf8()); - - QUrl xQuery(url.toString(QUrl::RemoveQuery)); - int reqnr = sendRequest(xQuery, "POST", postData); - - if(blocking) - { - requestMap[reqnr].type = QDROPBOX_REQ_BDELTA; - startEventLoop(); - } - else - requestMap[reqnr].type = QDROPBOX_REQ_DELTA; - return; -} - -QDropboxDeltaResponse QDropbox::requestDeltaAndWait(QString cursor, QString path_prefix) -{ - requestDelta(cursor, path_prefix, true); - QDropboxDeltaResponse r(_tempJson.strContent()); - - return r; -} - -void QDropbox::startEventLoop() -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropbox::startEventLoop()" << endl; -#endif - if(_evLoop == NULL) - _evLoop = new QEventLoop(this); - _evLoop->exec(); - return; -} - -void QDropbox::stopEventLoop() -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropbox::stopEventLoop()" << endl; -#endif - if(_evLoop == NULL) - return; -#ifdef QTDROPBOX_DEBUG - qDebug() << "loop ended" << endl; -#endif - _evLoop->exit(); - return; -} - -void QDropbox::responseBlockedTokenRequest(QString response) -{ - clearError(); - responseTokenRequest(response); - stopEventLoop(); - return; -} - -void QDropbox::responseBlockingAccessToken(QString response) -{ - clearError(); - responseAccessToken(response); - stopEventLoop(); - return; -} - -void QDropbox::parseBlockingMetadata(QString response) -{ - clearError(); - parseMetadata(response); - stopEventLoop(); - return; -} - -void QDropbox::parseBlockingDelta(QString response) -{ - clearError(); - parseDelta(response); - stopEventLoop(); - return; -} - -void QDropbox::parseBlockingSharedLink(QString response) -{ - clearError(); - parseSharedLink(response); - stopEventLoop(); - return; -} - -// check if the event loop has to be stopped after a blocking request was sent -void QDropbox::checkReleaseEventLoop(int reqnr) -{ - switch(requestMap[reqnr].type) - { - case QDROPBOX_REQ_RQBTOKN: - case QDROPBOX_REQ_BACCTOK: - case QDROPBOX_REQ_BACCINF: - case QDROPBOX_REQ_BMETADA: - case QDROPBOX_REQ_BREVISI: - stopEventLoop(); // release local event loop - break; - default: - break; - } - return; -} - -void QDropbox::requestRevisions(QString file, int max, bool blocking) -{ - clearError(); - - QUrl url; - url.setUrl(apiurl.toString()); - - QUrlQuery urlQuery; - urlQuery.addQueryItem("oauth_consumer_key",_appKey); - urlQuery.addQueryItem("oauth_nonce", nonce); - urlQuery.addQueryItem("oauth_signature_method", signatureMethodString()); - urlQuery.addQueryItem("oauth_timestamp", QString::number(timestamp)); - urlQuery.addQueryItem("oauth_token", oauthToken); - urlQuery.addQueryItem("oauth_version", _version); - urlQuery.addQueryItem("rev_limit", QString::number(max)); - - QString signature = oAuthSign(url); - urlQuery.addQueryItem("oauth_signature", QUrl::toPercentEncoding(signature)); - - url.setPath(QString("/%1/revisions/%2").arg(_version.left(1), file)); - url.setQuery(urlQuery); - - int reqnr = sendRequest(url); - if(blocking) - { - requestMap[reqnr].type = QDROPBOX_REQ_BREVISI; - startEventLoop(); - } - else - requestMap[reqnr].type = QDROPBOX_REQ_REVISIO; - - return; -} - -QList QDropbox::requestRevisionsAndWait(QString file, int max) -{ - clearError(); - requestRevisions(file, max, true); - QList revisionList; - - if(errorState != QDropbox::NoError || !_tempJson.isValid()) - return revisionList; - - QStringList responseList = _tempJson.getArray(); - for(int i=0; i -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef QTDROPBOX_DEBUG -#include -#endif - -#include "qtdropbox_global.h" -#include "qdropboxjson.h" -#include "qdropboxaccount.h" -#include "qdropboxfileinfo.h" -#include "qdropboxdeltaresponse.h" - -typedef int qdropbox_request_type; - -const qdropbox_request_type QDROPBOX_REQ_INVALID = 0x00; -const qdropbox_request_type QDROPBOX_REQ_CONNECT = 0x01; -const qdropbox_request_type QDROPBOX_REQ_RQTOKEN = 0x02; -const qdropbox_request_type QDROPBOX_REQ_AULOGIN = 0x03; -const qdropbox_request_type QDROPBOX_REQ_REDIREC = 0x04; -const qdropbox_request_type QDROPBOX_REQ_ACCTOKN = 0x05; -const qdropbox_request_type QDROPBOX_REQ_ACCINFO = 0x06; -const qdropbox_request_type QDROPBOX_REQ_RQBTOKN = 0x07; -const qdropbox_request_type QDROPBOX_REQ_BACCTOK = 0x08; -const qdropbox_request_type QDROPBOX_REQ_METADAT = 0x09; -const qdropbox_request_type QDROPBOX_REQ_BACCINF = 0x0A; -const qdropbox_request_type QDROPBOX_REQ_BMETADA = 0x0B; -const qdropbox_request_type QDROPBOX_REQ_SHRDLNK = 0x0C; -const qdropbox_request_type QDROPBOX_REQ_BSHRDLN = 0x0D; -const qdropbox_request_type QDROPBOX_REQ_REVISIO = 0x0E; -const qdropbox_request_type QDROPBOX_REQ_BREVISI = 0x0F; -const qdropbox_request_type QDROPBOX_REQ_DELTA = 0x10; -const qdropbox_request_type QDROPBOX_REQ_BDELTA = 0x11; - -//! Internally used struct to handle network requests sent from QDropbox -/*! - This structure is used internally by QDropbox. It is used to connect network - requests that are sent to the Dropbox API server with the asynchronous queries - made to the QtDropbox API. - */ -struct qdropbox_request{ - qdropbox_request_type type; //!< Type of the request - QString method; //!< Used method to send the request (POST/GET) - QString host; //!< Host that received the request - int linked; //!< ID of any linked request (for forwarded requests) -}; - -//! The main entry point of QtDropbox API. Provides various connection facilities and general information. -/*! - QDropbox provides you with all utilities required to connect to any Dropbox account. For purposes of - connection this class provides an asynchronous, signal and slot based, interface. - -

Connection to new account

- If you want to initiate a new connection to an account that did not authorize your application to - access it you use requestToken() and then you have to call requestAccessToken as soon as the signal - requestTokenFinished() is emitted. - - If the token you are using is not authorized or is expired the signal tokenExpired() will be emitted. - In this case you have to prompt the user for reauthorization of your application. A link to the - authoriziation interface of Dropbox is provided by the function authorizeLink(). This API does not - automatise the authorization process as this feature is not provided by Dropbox. So you have to - display the link in a web browser. - - To reconnect to an account on a later use of your application you have to save the token and token - secret obtained after requestAccessToken(). These values are provided by the functions token() and - tokenSecret(). - -

Connection to authorized account

- If the account you want to connect to has already authorized your application and you already - have obtained an authorized token and token secret you will use a shortcut to connect. You have - to set the token and token secret you obtained by a prior use of the API with the according - functions setToken() and setTokenSecret(). You do not need to invoke requestToken() or - requestAccessToken(). These functions are only called at first use or if no token and token secret - are available. - - Should the token or token secret you are using be already expired the signal tokenExpired() - will be emitted. In that case you have to prompt the user for reauthorization. - -

Using blocking requests

- Every function that requests information from the server has a blocking and non-blocking function. - A blocking request will wait until the server has responded to your query before returning while a - non-blocking request will return immediately. Usually a blocking function directly returns a result - and a non-blocking function will emit an according signal as the request has finished. - - \warning The use of a blocking function will reset the current error flag. So after calling a blocking - function the function error() will return QDropbox::NoError if no error occurred or the error that - occurred when processing the blocking request. - - \bug HMAC-SHA1 authentication is not working (does not have to be in 1.0) - - */ -class QTDROPBOXSHARED_EXPORT QDropbox : public QObject -{ - Q_OBJECT -public: - //! Method for oAuth authentication - /*! These methods are used for authentication with the oAuth protocol - \bug Currently HMAC-SHA1 encoding does not work. (does not have to be in 1.0) - */ - enum OAuthMethod{ - Plaintext, /*!< Plaintext authentication, HTTPS is automatically used. */ - HMACSHA1 /*!< HMAC-SHA1 encoded authentication */ - }; - - //! Error state of QDropbox - /*! - This enum is used to determine the current error state of the Dropbox connection. - If an error occurs it can be access by using the error() function. - */ - enum Error{ - NoError, /*!< No error occured */ - CommunicationError, /*!< Error while communicating with the server */ - VersionNotSupported, /*!< The used Dropbox API version is not supported by the server */ - UnknownAuthMethod, /*!< The used authentication method is not supported */ - ResponseToUnknownRequest, /*!< QtDropbox API received an unexpected response from the server */ - APIError, /*!< The remote server violated the Dropbox REST API protocol by sending wrong data. */ - UnknownQueryMethod, /*!< Internal error. The API tried to send with a not supported HTTP Query method. */ - BadInput, /*!< A wrong input parameter was sent to the Dropbox REST API. Dropbox API error 400*/ - BadOAuthRequest, /*!< A wrong oAuth request was received by the server (expired time stamp, - bad nonce etc.). Dropbox API error 403 */ - WrongHttpMethod, /*!< The REST API request used a wrong HTTP method. Dropbox API error 405 */ - MaxRequestsExceeded, /*!< The maximum amount of requests was exceeded. Dropbox API error 503 */ - UserOverQuota, /*!< The user exceeded his or her storage quota. Dropbox API error 507 */ - TokenExpired /*!< The access token has expired. Dropbox API error 401*/ - }; - - /*! - This constructor creates an unconfigured instance of QDropbox. The server URL is set to api.dropbpx.com, - the REST API version 1.0 is used (currently the only one supported) and the authentication method is - QDropbox::Plaintext. - - You need to set your API key and shared secret by using setKey(QString key) and setSharedSecret(QString sharedSecret). - - \param parent The parent object QDropbox depends on. - */ - explicit QDropbox(QObject *parent = 0); - - /*! - This constructor initializes QDropbox with your key and shared secret. The selected authentication method and - API URL will be set as well. - - \param key API key of your application (provided by Dropbox) - \param sharedSecret Your app's secret (provided by Dropbox - \param method Used authentication method - \param url URL of the API server - \param parent Parent object of QDropbox - - */ - explicit QDropbox(QString key, QString sharedSecret, - OAuthMethod method = QDropbox::Plaintext, - QString url = "api.dropbox.com", QObject *parent = 0); - - /*! - If an error occured you can access the last error code by using this function. - */ - Error error(); - - /*! - After an error occured you'll get a description of the last error by using this - function. - */ - QString errorString(); - - /*! - Use this function if you want to change the URL of the API server you are - accessing. This won't usually be necessary as QtDropbox automatically chooses the - official Dropbox API server according to the request. This is usually - http://api.dropbox.com - - \param url URL of the API server. Usually this is api.dropbox.com - */ - void setApiUrl(QString url); - - /*! - Provides you with the address of the API server. - */ - QString apiUrl(); - - /*! - This function is used to changed the used authentication method. You can use it - even if you want to change the authentication method during an already existing - connection. - - \param m Authentication method. - */ - void setAuthMethod(OAuthMethod m); - - /*! - Returns the currently used authentication method. - */ - OAuthMethod authMethod(); - - /*! - Set the version of the Dropbox API to be used. 1.0 is default. Usually you don't - need to use this function as currently only version 1.0 is supported by Dropbox. - - \param apiversion Version string of the API - */ - void setApiVersion(QString apiversion); - - /*! - Returns the currently used API version. - */ - QString apiVersion(); - - /*! - Use this function to set your applications API key if you did not already when - using the constructor. The API key is provided when you register your application - with Dropbox. - - \param key API key of your application. - */ - void setKey(QString key); - - /*! - Returns the used API key of the application. - */ - QString key(); - - /*! - Use this function to set your applications API secret if you did not when using - the constructor. The API secret is provided when you register your application - with Dopbox. - - \param sharedSecret API secret of your application - */ - void setSharedSecret(QString sharedSecret); - - /*! - Returns the used API secret. - */ - QString sharedSecret(); - - /*! - If you have an already verified and authorized token to communicate with the - Dropbox API you can set it by using this function. By setting a token you - do not need to use requestToken() and requestAccessToken() to iniate a - connection. - - \param t token string - */ - void setToken(QString t); - /*! - Returns the used token. This function may be used to get an authorized token - after iniating a new connection (e.g. to save it for later use). - */ - QString token(); - - /*! - If you have an already verified and authorized token and token secret to - communicate with the Dropbox API you can set the secret by using this - function. By setting token and secret you do not need to use requestToken() - and requestAccessToken() to iniaite a connection. - - \param s token secret string - */ - void setTokenSecret(QString s); - /*! - Returns the currently used token secret. This function may be used to get an - authorized token secret after iniating a new connection (e.g. to save it). - */ - QString tokenSecret(); - - /*! - Returns the Dropbox API key that is used. - */ - QString appKey(); - - /*! - Returns the currently used Dropbox API shared secret of your application. - */ - QString appSharedSecret(); - - /*! - This functions requests a request token that will be valid for the rest of the - authentication process. When the token is received the signal - requestTokenFinished(...) will be emitted. - - After the request token was obtained you can continue with the authentication by - prompting the user to authorize your application. - - It is not necessary to call this function when the user already authenticated - your application. In this case just provide the token and token secret received - by using requestAccessToken() to QDropbox. - - \param blocking internal only indidicates if the call should block - */ - int requestToken(bool blocking = false); - - /*! - This functions works exactly like requestToken(...) but will block until the - answer (e.g. the token or an error) has arrived from the server. - - \return true if the token was received successfully or false if an - error occured - */ - bool requestTokenAndWait(); - /*! - This function should do automatic authorization. - \warning This functions is currently not supported by the Dropbox API. You need - the user to authenticate by using the URL provided by authorizeLink(). - */ - int authorize(QString mail, QString password); - /*! - Returns an URL the user will have to use to authorize the connection to your - application. You may use that link in connection with QDesktopServices::openUrl(...) - to open a web browser with the returned URL. - */ - QUrl authorizeLink(); - - /*! - This function should be invoked after the user authorized your application. It - retrieves an access token from the Dropbox API that you'll have to use to access - Dropbox services. - - \param blocking internal only indidicates if the call should block - */ - int requestAccessToken(bool blocking = false); - - /*! - This functions works exactly like requestAccessToken(...) but blocks until the answer - from the server was received. - - \return true if the access token could be requested without error or false - if an error occured. - */ - bool requestAccessTokenAndWait(); - - /*! - By using this function the account information of the connected user will be - retrieved. When the account information was obtained the signal QDropbox::accountInfoReceived() - will be emitted. - - \param blocking internal only indidicates if the call should block - */ - void requestAccountInfo(bool blocking = false); - - /*! - Works exactly like accountInfo() but blocks until the data was received from the server. - It returns an instance of QDropboxAccount containing the requested data. You do not have - to react on the accountInfoReceived() signal when using this function. - */ - QDropboxAccount requestAccountInfoAndWait(); - - /*! - This function is public for internal QtDropbox API use. It is used to sign - requests to the Dropbox API and thus is required by most other QtDropbox - classes for their requests. - - \param base Complete unsigned request URL - \param method Request method (currently only POST or GET) - */ - QString oAuthSign(QUrl base, QString method = "GET"); - - /*! - Returns the authentication method as string. - */ - QString signatureMethodString(); - - /*! - This functions generates and returns a nonce with the given length. The - generated nonce is a random hex based string. - - \param length Length of the nonce. - */ - static QString generateNonce(qint32 length); - - /*! - Get the file metadata for a file speciified by the filename. When the Dropbox - API server answeres the request the signal QDropbox::metadataReceived() will be - emitted. - - \param file The absoulte path of the file (e.g. /dropbox/test.txt) - \param blocking internal only indidicates if the call should block - */ - void requestMetadata(QString file, bool blocking = false); - - /*! - Works exactly like QDropbox::requestMetadata() but blocks until the metadata - was received from the Dropbox server and returns an instance of QDropboxFileInfo - that contains the metadata of the requested file. - - \param file The absoulte path of the file (e.g. /dropbox/test.txt) - */ - QDropboxFileInfo requestMetadataAndWait(QString file); - - /*! - * \brief Creates and returns a Dropbox link to files or folders users can use to view a preview of the file in a web browser. - * \param path from the file i.e. /dropbox/hello.txt - * \param blocking - */ - void requestSharedLink(QString file, bool blocking = false); - - /*! - * \brief Works exactly like QDropbox::requestSharedLink() but blocks until link - * was receivied from the Dropbox Server. - * \param path from the file i.e. /dropbox/hello.txt - * \return Url to the file - */ - QUrl requestSharedLinkAndWait(QString file); - - /*! - Resets the last error. Use this when you reacted on an error to delete the error flag. - */ - void clearError(); - - /*! - Requests the latest revisions of a file. When the request is answered by the Dropbox server - the signal QDropbox::revisionsReceived() will be emitted. - - \param file The absoulte path of the file (e.g. /dropbox/test.txt) - \param max Defines the maximum amount of revisions to be requested. - \param blocking internal only indidicates if the call should block - */ - void requestRevisions(QString file, int max = 10, bool blocking = false); - - /*! - Works exactly like QDropbox::requestRevisions but blocks until the list of revisisions was - received. - - \param file The absoulte path of the file (e.g. /dropbox/test.txt) - \param max Defines the maximum amount of revisions to be requested. - */ - QList requestRevisionsAndWait(QString file, int max = 10); - - - /*! - \brief Produces a list of delta entries. When the request is answered by the Dropbox server - the signal QDropbox::deltaEntriesReceived() will be emitted. - - \param cursor A string used to keep track of current delta state. - \param path_prefix If non-empty, only include entries with given prefix. - - */ - void requestDelta(QString cursor, QString path_prefix, bool blocking = false); - - /*! - \brief Works exactly like QDropbox::requestDelta but blocks until the list of delta - entries was received. - - \param cursor A string used to keep track of current delta state. - \param path_prefix If non-empty, only includes entries with given prefix. - - \return a QDropboxDeltaResponse representing the API response. - - */ - QDropboxDeltaResponse requestDeltaAndWait(QString cursor, QString path_prefix); - - /*! - \brief Provides information about a request. - - This function can be used if you wish to obtain further information regarding a request. - It provides technical information for requests so it is mostly about debugging information. - - Requesting information about a request number that does not exist will return invalid information. - - Requesting information on a request that has been finished already will return an invalid record. - - \param rqnr number of the request - */ - qdropbox_request requestInfo(int rqnr); - - /*! - \brief For debugging: Save finished requests so information can be requested on them. - - This function is for debugging errors. When the setting is changed to true records of already - finished requests to Dropbox will be saved. Usually they are deleted as soon as they are - processed. Saving them will allow you to use requestInfo(...) on already finished requests. - - Activating this setting may have an impact about long-time performance and used memory. - - Old records will not be deleted when the setting is turned off! - - \param save set to true if you want to persist request information - */ - void setSaveFinishedRequests(bool save); - - /*! - \brief Indicates if information about finished requests is to be persisted. - */ - bool saveFinishedRequests(); - -signals: - /*! - This signal is emitted whenever an error occurs. The error is passed - as parameter to the slot. To retrieve descriptive information about - the error use errorString(). - - \param errorcode The occured error. - */ - void errorOccured(QDropbox::Error errorcode); - /*! - Emitted when the used token is expired. Reauthorize the user connection - by prompting the URL provided by authorizeUrl() to your user to reauthorize. - */ - void tokenExpired(); - /*! - Should never be emitted by QDropbox as there is no functionality that accesses - files in QDropbox but all implemented in QDropboxFile. - */ - void fileNotFound(); - - /*! - QDropbox uses an operation based asynchronous interface for reacting to messages. - This signal is emitted whenever a request to the Dropbox API is finished. - - \param requestnr Number of the finished request. - */ - void operationFinished(int requestnr); - - /*! - When an asynchronous operation (actually any operation) that requests or transfers - information from or to Dropbox is started this signal is emitted. The passed - request number can be used to link operations with the operationFinished(...) signal. - - \param requestnr number of the started request. - */ - void operationStarted(int requestnr); - - /*! - This signal is emitted when the function requestToken() is finished and a - token and token scret (valid for authorization only) is received. - - \param token Temporary token - \param secret Temporary token secret - */ - void requestTokenFinished(QString token, QString secret); - /*! - This signal is emitted when the function requestAccessToken() is finished and - a valid and authorized token used for the connection was received. - - \param token Token used for the connection to Dropbox - \param secret Secret used for the connection to Dropbox - */ - void accessTokenFinished(QString token, QString secret); - /*! - Emitted whenever the token changes. - - \param token New token. - \param secret New secret. - */ - void tokenChanged(QString token, QString secret); - - /*! - Emitted when account information was received. Only relevant for non-blocking - use of accountInfo(). - - \param accountJson JSON that contains the account information data. - */ - void accountInfoReceived(QString accountJson); - - /*! - Emitted when metadata information about a file or directory was received. This will - only be relevant for non-blocking use of metadata(...); - - \param metadataJson JSON string that contains the metadata information - */ - void metadataReceived(QString metadataJson); - - /*! - Emmited when shared link was received. Only relevant for non-blocking use of sharedLink() - \param sharedLinkJson string than contains the share link information. - */ - void sharedLinkReceived(QString sharedLink); - - /*! - Emitted when revisions of a file were received. Only relevant for non-blocking use - of requestRevisions(). - */ - void revisionsReceived(QString revisionJson); - - /*! - Emitted when a delta response is received. - */ - void deltaReceived(QString deltaJson); - -public slots: - -private slots: - void requestFinished(int nr, QNetworkReply* rply); - void networkReplyFinished(QNetworkReply* rply); - -private: - enum { - SHA1_DIGEST_LENGTH = 20, - SHA1_BLOCK_SIZE = 64, - HMAC_BUF_LEN = 4096 - } ; - - QNetworkAccessManager conManager; - - Error errorState; - QString errorText; - - QString _appKey; - QString _appSharedSecret; - - QUrl apiurl; - QString nonce; - long timestamp; - OAuthMethod oauthMethod; - QString _version; - - QString oauthToken; - QString oauthTokenSecret; - - QMap replynrMap; - int lastreply; - QMap requestMap; - QMap delayMap; - - QString mail; - QString password; - - // for blocked functions - QEventLoop *_evLoop; - void startEventLoop(); - void stopEventLoop(); - - // temporary memory - QDropboxJson _tempJson; - - QDropboxAccount _account; - - // indicates wether finished request shall be saved for debugging - // mind the possible performance impact! - bool _saveFinishedRequests; - - QString hmacsha1(QString key, QString baseString); - void prepareApiUrl(); - int sendRequest(QUrl request, QString type = "GET", QByteArray postdata = 0, QString host = ""); - void responseTokenRequest(QString response); - void responseBlockedTokenRequest(QString response); - int responseDropboxLogin(QString response, int reqnr); - void responseAccessToken(QString response); - void responseBlockingAccessToken(QString response); - void parseToken(QString response); - void parseAccountInfo(QString response); - void parseSharedLink(QString response); - void checkReleaseEventLoop(int reqnr); - void parseMetadata(QString response); - void parseBlockingAccountInfo(QString response); - void parseBlockingMetadata(QString response); - void parseBlockingSharedLink(QString response); - void parseRevisions(QString response); - void parseBlockingRevisions(QString response); - void parseDelta(QString response); - void parseBlockingDelta(QString response); - void removeRequestFromMap(int rqnr); -}; - -#endif // QDROPBOX_H diff --git a/src/third_party/QtDropbox/src/qdropboxaccount.cpp b/src/third_party/QtDropbox/src/qdropboxaccount.cpp deleted file mode 100644 index 1cef98b..0000000 --- a/src/third_party/QtDropbox/src/qdropboxaccount.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "qdropboxaccount.h" - -QDropboxAccount::QDropboxAccount(QObject *parent) : - QDropboxJson(parent) -{ - _quotaShared = 0; - _quota = 0; - _quotaNormal = 0; - _uid = 0; -} - -QDropboxAccount::QDropboxAccount(QString jsonString, QObject *parent) : - QDropboxJson(jsonString, parent) -{ - _init(); -} - -QDropboxAccount::QDropboxAccount(const QDropboxAccount& other) : - QDropboxJson() -{ - copyFrom(other); -} - -void QDropboxAccount::_init() -{ - if(!isValid()) - { - valid = false; - return; - } - - if(!hasKey("referral_link") || - !hasKey("display_name") || - !hasKey("uid") || - !hasKey("country") || - !hasKey("quota_info") || - !hasKey("email")) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "json invalid 1" << endl; -#endif - valid = false; - return; - } - - QDropboxJson* quota = getJson("quota_info"); - if(!quota->hasKey("shared") || - !quota->hasKey("quota") || - !quota->hasKey("normal")) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "json invalid 2" << endl; -#endif - valid = false; - return; - } - - _referralLink.setUrl(getString("referral_link"), QUrl::StrictMode); - _displayName = getString("display_name"); - _uid = getInt("uid"); - _country = getString("country"); - _email = getString("email"); - - _quotaShared = quota->getUInt("shared", true); - _quota = quota->getUInt("quota", true); - _quotaNormal = quota->getUInt("normal", true); - - valid = true; - -#ifdef QTDROPBOX_DEBUG - qDebug() << "== account data ==" << endl; - qDebug() << "reflink: " << _referralLink << endl; - qDebug() << "displayname: " << _displayName << endl; - qDebug() << "uid: " << _uid << endl; - qDebug() << "country: " << _country << endl; - qDebug() << "email: " << _email << endl; - qDebug() << "quotaShared: " << _quotaShared << endl; - qDebug() << "quotaNormal: " << _quotaNormal << endl; - qDebug() << "quotaUsed: " << _quota << endl; - qDebug() << "== account data end ==" << endl; -#endif - return; -} - -QUrl QDropboxAccount::referralLink() const -{ - return _referralLink; -} - -QString QDropboxAccount::displayName() const -{ - return _displayName; -} - -qint64 QDropboxAccount::uid() const -{ - return _uid; -} - -QString QDropboxAccount::country() const -{ - return _country; -} - -QString QDropboxAccount::email() const -{ - return _email; -} - -quint64 QDropboxAccount::quotaShared() const -{ - return _quotaShared; -} - -quint64 QDropboxAccount::quota() const -{ - return _quota; -} - -quint64 QDropboxAccount::quotaNormal() const -{ - return _quotaNormal; -} - -QDropboxAccount &QDropboxAccount::operator =(QDropboxAccount &a) -{ - copyFrom(a); - return *this; -} - -void QDropboxAccount::copyFrom(const QDropboxAccount &other) -{ - this->setParent(other.parent()); -#ifdef QTDROPBOX_DEBUG - qDebug() << "creating account from account" << endl; - qDebug() << "taken reflink: " << other.referralLink().toString() << endl; -#endif - _referralLink = other.referralLink(); - _displayName = other.displayName(); - _uid = other.uid(); - _country = other.country(); - _email = other.email(); - _quotaShared = other.quotaShared(); - _quota = other.quota(); - _quotaNormal = other.quotaNormal(); -} diff --git a/src/third_party/QtDropbox/src/qdropboxaccount.h b/src/third_party/QtDropbox/src/qdropboxaccount.h deleted file mode 100644 index 0025ac3..0000000 --- a/src/third_party/QtDropbox/src/qdropboxaccount.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef QDROPBOXACCOUNT_H -#define QDROPBOXACCOUNT_H - -#include -#include -#include "qdropboxjson.h" - -//! Stores information about a user account -/*! - This class is used to store user account information retrieved by using - QDropbox::accountInfo(). The stored data directly correspond to the - Dropbox API request account_info. - - QDropboxAccount interprets given data based on a QDropboxJson. If the data - could be interpreted and hence is valid the resulting object will be valid. - If any error occurs while interpreting the data the resultung QDropboxAccount - object will be invalid. This can checked by using isValid(). - - See https://www.dropbox.com/developers/reference/api#account-info for details. - - */ -class QTDROPBOXSHARED_EXPORT QDropboxAccount : public QDropboxJson -{ - Q_OBJECT -public: - /*! - Creates an empty instance of the object. It is automatically invalid - and does not contain useful data. - - \param parent Parent QObject. - */ - QDropboxAccount(QObject *parent = 0); - - /*! - This constructor creates an object based on the data contained in the - given string that is in valid JSON format. - - \param jsonString JSON data in string representation - \param parent Parent QObject. - */ - QDropboxAccount(QString jsonString, QObject *parent = 0); - - /*! - Use this constructor to create a copy of an other QDropboxAccount. - - \param other Original QDropboxAccount - */ - QDropboxAccount(const QDropboxAccount& other); - - /*! - Returns the referal link of the user. - */ - QUrl referralLink() const; - - /*! - Returns the display name of the account. - */ - QString displayName() const; - - /*! - Returns the Dropbox UID of the account. - */ - qint64 uid() const; - - /*! - Returns the country the account is associated to. - */ - QString country() const; - - /*! - Returns the E-Mail address the owner of the account uses. - */ - QString email() const; - - /*! - Returns the user's used quota in shared folders in bytes. - */ - quint64 quotaShared() const; - - /*! - Returns the user's total quota of allocated bytes. - */ - quint64 quota() const; - - /*! - Returns the user's quota outside of shared folders in bytes. - */ - quint64 quotaNormal() const; - - /*! - Overloaded operator to copy a QDropboxAccount by using =. Internally - copyFrom() is called. - */ - QDropboxAccount& operator =(QDropboxAccount&); - - /*! - This function is used to copy the data from an other QDropboxAccount. - */ - void copyFrom(const QDropboxAccount& a); - -private: - QUrl _referralLink; - QString _displayName; - quint64 _uid; - QString _country; - QString _email; - quint64 _quotaShared; - quint64 _quota; - quint64 _quotaNormal; - - void _init(); -}; - -#endif // QDROPBOXACCOUNT_H diff --git a/src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp b/src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp deleted file mode 100644 index 337a152..0000000 --- a/src/third_party/QtDropbox/src/qdropboxdeltaresponse.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include "qdropboxdeltaresponse.h" -#include "qdropboxjson.h" - -QDropboxDeltaResponse::QDropboxDeltaResponse() -{ - _init(); -} - -QDropboxDeltaResponse::QDropboxDeltaResponse(QString response) -{ - _init(); - - QDropboxJson js(response); - - this->_reset = js.getBool("reset"); - this->_cursor = js.getString("cursor"); - this->_has_more = js.getBool("has_more"); - - QStringList entriesList = js.getArray("entries"); - - for(QStringList::iterator i = entriesList.begin(); - i != entriesList.end(); - i++) - { - QDropboxJson s(*i); - QStringList pair = s.getArray(); - - QSharedPointer val( - new QDropboxFileInfo( - pair.value(1) - ) - ); - this->_entries.insert(pair.value(0), val); - } -} - -const QDropboxDeltaEntryMap QDropboxDeltaResponse::getEntries() const -{ - return this->_entries; -} - -bool QDropboxDeltaResponse::shouldReset() const -{ - return this->_reset; -} - -QString QDropboxDeltaResponse::getNextCursor() const -{ - return this->_cursor; -} - - -bool QDropboxDeltaResponse::hasMore() const -{ - return this->_has_more; -} - -void QDropboxDeltaResponse::_init() -{ - _reset = false; - _cursor = ""; - _has_more = false; -} diff --git a/src/third_party/QtDropbox/src/qdropboxdeltaresponse.h b/src/third_party/QtDropbox/src/qdropboxdeltaresponse.h deleted file mode 100644 index 79ab398..0000000 --- a/src/third_party/QtDropbox/src/qdropboxdeltaresponse.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef QDROPBOXDELTARESPONSE_H -#define QDROPBOXDELTARESPONSE_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "qtdropbox_global.h" -#include "qdropboxjson.h" -#include "qdropboxfileinfo.h" - -//! Type for a mapping from file paths to file metadata info. -typedef QMap > QDropboxDeltaEntryMap; - -//! Response from a /delta call. -/*! - This structure is used to carry the (multi-part) response from a call to the delta API. - */ -class QDropboxDeltaResponse -{ -public: - //! Constructs a blank QDropboxDeltaResponse object. - QDropboxDeltaResponse(); - - //! Constructs a QDropboxDeltaResponse object from a JSON response. - QDropboxDeltaResponse(QString response); - - //! Retrieves the string-to-metadata map. - /*! - This is a mapping from file paths to metadata (QDropboxFileInfo) entries. - - \note The values in the mapping are allowed to be 'null' QSharedPointer objects, - which represent entries that should be deleted from the local state tracking. - */ - const QDropboxDeltaEntryMap getEntries() const; - - //! Returns whether the local state tracking mechanism should clear its current state. - bool shouldReset() const; - - //! Returns the cursor that should be passed to the next delta API call. - QString getNextCursor() const; - - //! Returns whether or not a subsequent delta API call is part of the same response. - /*! - \return if true: make a delta API call with the same cursor and treat it as - part of the same response; - if false: wait some time (e.g. 5 minutes) before making another delta call. - */ - bool hasMore() const; - - -private: - QDropboxDeltaEntryMap _entries; - bool _reset; - QString _cursor; - bool _has_more; - - void _init(); -}; - -#endif // QDROPBOXDELTA_H diff --git a/src/third_party/QtDropbox/src/qdropboxfile.cpp b/src/third_party/QtDropbox/src/qdropboxfile.cpp deleted file mode 100644 index f1f645b..0000000 --- a/src/third_party/QtDropbox/src/qdropboxfile.cpp +++ /dev/null @@ -1,586 +0,0 @@ -#include "qdropboxfile.h" - -QDropboxFile::QDropboxFile(QObject *parent) : - QIODevice(parent), - _conManager(this) -{ - _init(NULL, "", 1024); - connectSignals(); -} - -QDropboxFile::QDropboxFile(QDropbox *api, QObject *parent) : - QIODevice(parent), - _conManager(this) -{ - _init(api, "", 1024); - obtainToken(); - connectSignals(); -} - -QDropboxFile::QDropboxFile(QString filename, QDropbox *api, QObject *parent) : - QIODevice(parent), - _conManager(this) -{ - _init(api, filename, 1024); - obtainToken(); - connectSignals(); -} - -QDropboxFile::~QDropboxFile() -{ - if(_buffer != NULL) - delete _buffer; - if(_evLoop != NULL) - delete _evLoop; -} - -bool QDropboxFile::isSequential() const -{ - return true; -} - -bool QDropboxFile::open(QIODevice::OpenMode mode) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::open(...)" << endl; -#endif - if(!QIODevice::open(mode)) - return false; - - /* if(isMode(QIODevice::NotOpen)) - return true; */ - - if(_buffer == NULL) - _buffer = new QByteArray(); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile: opening file" << endl; -#endif - - // clear buffer and reset position if this file was opened in write mode - // with truncate - or if append was not set - if(isMode(QIODevice::WriteOnly) && - (isMode(QIODevice::Truncate) || !isMode(QIODevice::Append)) - ) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile: _buffer cleared." << endl; -#endif - _buffer->clear(); - _position = 0; - } - else - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile: reading file content" << endl; -#endif - if(!getFileContent(_filename)) - return false; - - if(isMode(QIODevice::WriteOnly)) // write mode here means append - _position = _buffer->size(); - else if(isMode(QIODevice::ReadOnly)) // read mode here means start at the beginning - _position = 0; - } - - obtainMetadata(); - - return true; -} - -void QDropboxFile::close() -{ - if(isMode(QIODevice::WriteOnly)) - flush(); - QIODevice::close(); - return; -} - -void QDropboxFile::setApi(QDropbox *dropbox) -{ - _api = dropbox; - return; -} - -QDropbox *QDropboxFile::api() -{ - return _api; -} - -void QDropboxFile::setFilename(QString filename) -{ - _filename = filename; - return; -} - -QString QDropboxFile::filename() -{ - return _filename; -} - -bool QDropboxFile::flush() -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::flush()" << endl; -#endif - - return putFile(); -} - -bool QDropboxFile::event(QEvent *event) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "processing event: " << event->type() << endl; -#endif - return QIODevice::event(event); -} - -void QDropboxFile::setFlushThreshold(qint64 num) -{ - if(num<0) - num = 0; - _bufferThreshold = num; - return; -} - -qint64 QDropboxFile::flushThreshold() -{ - return _bufferThreshold; -} - -void QDropboxFile::setOverwrite(bool overwrite) -{ - _overwrite = overwrite; - return; -} - -bool QDropboxFile::overwrite() -{ - return _overwrite; -} - -qint64 QDropboxFile::readData(char *data, qint64 maxlen) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::readData(...), maxlen = " << maxlen << endl; - QString buff_str = QString(*_buffer); - qDebug() << "old bytes = " << _buffer->toHex() << ", str: " << buff_str << endl; - qDebug() << "old size = " << _buffer->size() << endl; -#endif - - if(_buffer->size() == 0 || _position >= _buffer->size()) - return 0; - - if(_buffer->size() < maxlen) - maxlen = _buffer->size(); - - QByteArray tmp = _buffer->mid(_position, maxlen); - const qint64 read = tmp.size(); - memcpy(data, tmp.data(), read); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "new size = " << _buffer->size() << endl; - qDebug() << "new bytes = " << _buffer->toHex() << endl; -#endif - - _position += read; - - return read; -} - -qint64 QDropboxFile::writeData(const char *data, qint64 len) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "old content: " << _buffer->toHex() << endl; -#endif - - qint64 oldlen = _buffer->size(); - _buffer->insert(_position, data, len); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "new content: " << _buffer->toHex() << endl; -#endif - - // flush if the threshold is reached - _currentThreshold += len; - if(_currentThreshold > _bufferThreshold) - flush(); - - int written_bytes = len; - - if(_buffer->size() != oldlen+len) - written_bytes = (oldlen-_buffer->size()); - - _position += written_bytes; - - return written_bytes; -} - -void QDropboxFile::networkRequestFinished(QNetworkReply *rply) -{ - rply->deleteLater(); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::networkRequestFinished(...)" << endl; -#endif - - if (rply->error() != QNetworkReply::NoError) - { - lastErrorCode = rply->error(); - stopEventLoop(); - return; - } - - switch(_waitMode) - { - case waitForRead: - rplyFileContent(rply); - stopEventLoop(); - break; - case waitForWrite: - rplyFileWrite(rply); - stopEventLoop(); - break; - case notWaiting: - break; // when we are not waiting for anything, we don't do anything - simple! - default: -#ifdef QTDROPBOX_DEBUG - // debug information only - this should not happen, but if it does we - // ignore replies when not waiting for anything - qDebug() << "QDropboxFile::networkRequestFinished(...) got reply in unknown state (" << _waitMode << ")" << endl; -#endif - break; - } -} - -void QDropboxFile::obtainToken() -{ - _token = _api->token(); - _tokenSecret = _api->tokenSecret(); - return; -} - -void QDropboxFile::connectSignals() -{ - connect(&_conManager, SIGNAL(finished(QNetworkReply*)), - this, SLOT(networkRequestFinished(QNetworkReply*))); - return; -} - -bool QDropboxFile::isMode(QIODevice::OpenMode mode) -{ - return ( (openMode()&mode) == mode ); -} - -bool QDropboxFile::getFileContent(QString filename) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::getFileContent(...)" << endl; -#endif - QUrl request; - request.setUrl(QDROPBOXFILE_CONTENT_URL, QUrl::StrictMode); - request.setPath(QString("/%1/files/%2") - .arg(_api->apiVersion().left(1)) - .arg(filename)); - - QUrlQuery query; - query.addQueryItem("oauth_consumer_key", _api->appKey()); - query.addQueryItem("oauth_nonce", QDropbox::generateNonce(128)); - query.addQueryItem("oauth_signature_method", _api->signatureMethodString()); - query.addQueryItem("oauth_timestamp", QString::number((int) QDateTime::currentMSecsSinceEpoch()/1000)); - query.addQueryItem("oauth_token", _api->token()); - query.addQueryItem("oauth_version", _api->apiVersion()); - - QString signature = _api->oAuthSign(request); - query.addQueryItem("oauth_signature", signature); - - request.setQuery(query); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::getFileContent " << request.toString() << endl; -#endif - - QNetworkRequest rq(request); - QNetworkReply *reply = _conManager.get(rq); - connect(this, &QDropboxFile::operationAborted, reply, &QNetworkReply::abort); - connect(reply, &QNetworkReply::downloadProgress, this, &QDropboxFile::downloadProgress); - - _waitMode = waitForRead; - startEventLoop(); - - if(lastErrorCode != 0) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::getFileContent ReadError: " << lastErrorCode << lastErrorMessage << endl; -#endif - if(lastErrorCode == QDROPBOX_ERROR_FILE_NOT_FOUND) - { - _buffer->clear(); -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::getFileContent: file does not exist" << endl; -#endif - } - else - return false; - } - - return true; -} - -void QDropboxFile::rplyFileContent(QNetworkReply *rply) -{ - lastErrorCode = 0; - - QByteArray response = rply->readAll(); - QString resp_str; - QDropboxJson json; - -#ifdef QTDROPBOX_DEBUG - resp_str = QString(response.toHex()); - qDebug() << "QDropboxFile::rplyFileContent response = " << resp_str << endl; - -#endif - - switch(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()) - { - case QDROPBOX_ERROR_BAD_INPUT: - case QDROPBOX_ERROR_EXPIRED_TOKEN: - case QDROPBOX_ERROR_BAD_OAUTH_REQUEST: - case QDROPBOX_ERROR_FILE_NOT_FOUND: - case QDROPBOX_ERROR_WRONG_METHOD: - case QDROPBOX_ERROR_REQUEST_CAP: - case QDROPBOX_ERROR_USER_OVER_QUOTA: - resp_str = QString(response); - json.parseString(response.trimmed()); - lastErrorCode = rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::rplyFileContent jason.valid = " << json.isValid() << endl; -#endif - if(json.isValid()) - lastErrorMessage = json.getString("error"); - else - lastErrorMessage = ""; - return; - break; - default: - break; - } - - _buffer->clear(); - _buffer->append(response); - emit readyRead(); - return; -} - -void QDropboxFile::rplyFileWrite(QNetworkReply *rply) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::rplyFileWrite(...)" << endl; -#endif - - lastErrorCode = 0; - - QByteArray response = rply->readAll(); - QString resp_str; - QDropboxJson json; - -#ifdef QTDROPBOX_DEBUG - resp_str = response; - qDebug() << "QDropboxFile::rplyFileWrite response = " << resp_str << endl; - -#endif - - switch(rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()) - { - case QDROPBOX_ERROR_BAD_INPUT: - case QDROPBOX_ERROR_EXPIRED_TOKEN: - case QDROPBOX_ERROR_BAD_OAUTH_REQUEST: - case QDROPBOX_ERROR_FILE_NOT_FOUND: - case QDROPBOX_ERROR_WRONG_METHOD: - case QDROPBOX_ERROR_REQUEST_CAP: - case QDROPBOX_ERROR_USER_OVER_QUOTA: - resp_str = QString(response); - json.parseString(response.trimmed()); - lastErrorCode = rply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::rplyFileWrite jason.valid = " << json.isValid() << endl; -#endif - if(json.isValid()) - lastErrorMessage = json.getString("error"); - else - lastErrorMessage = ""; - return; - break; - default: - delete _metadata; - - _metadata = new QDropboxFileInfo{QString{response}.trimmed(), this}; - if (!_metadata->isValid()) - _metadata->clear(); - break; - } - - emit bytesWritten(_buffer->size()); - return; -} - -void QDropboxFile::startEventLoop() -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::startEventLoop()" << endl; -#endif - if(_evLoop == NULL) - _evLoop = new QEventLoop(this); - _evLoop->exec(); - return; -} - -void QDropboxFile::stopEventLoop() -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::stopEventLoop()" << endl; -#endif - if(_evLoop == NULL) - return; - _evLoop->exit(); - return; -} - -bool QDropboxFile::putFile() -{ - -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::putFile()" << endl; -#endif - - QUrl request; - request.setUrl(QDROPBOXFILE_CONTENT_URL, QUrl::StrictMode); - request.setPath(QString("/%1/files_put/%2") - .arg(_api->apiVersion().left(1)) - .arg(_filename)); - - QUrlQuery urlQuery; - urlQuery.addQueryItem("oauth_consumer_key", _api->appKey()); - urlQuery.addQueryItem("oauth_nonce", QDropbox::generateNonce(128)); - urlQuery.addQueryItem("oauth_signature_method", _api->signatureMethodString()); - urlQuery.addQueryItem("oauth_timestamp", QString::number((int) QDateTime::currentMSecsSinceEpoch()/1000)); - urlQuery.addQueryItem("oauth_token", _api->token()); - urlQuery.addQueryItem("oauth_version", _api->apiVersion()); - urlQuery.addQueryItem("overwrite", (_overwrite?"true":"false")); - - QString signature = _api->oAuthSign(request); - urlQuery.addQueryItem("oauth_signature", signature); - - request.setQuery(urlQuery); - -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::put " << request.toString() << endl; -#endif - - QNetworkRequest rq(request); - QNetworkReply *reply = _conManager.put(rq, *_buffer); - connect(this, &QDropboxFile::operationAborted, reply, &QNetworkReply::abort); - connect(reply, &QNetworkReply::uploadProgress, this, &QDropboxFile::uploadProgress); - - _waitMode = waitForWrite; - startEventLoop(); - - if(lastErrorCode != 0) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::putFile WriteError: " << lastErrorCode << lastErrorMessage << endl; -#endif - return false; - } - - _currentThreshold = 0; - - return true; -} - -void QDropboxFile::_init(QDropbox *api, QString filename, qint64 bufferTh) -{ - _api = api; - _buffer = NULL; - _filename = filename; - _evLoop = NULL; - _waitMode = notWaiting; - _bufferThreshold = bufferTh; - _overwrite = true; - _metadata = NULL; - lastErrorCode = 0; - lastErrorMessage = ""; - _position = 0; - _currentThreshold = 0; - return; -} - - -QDropboxFileInfo QDropboxFile::metadata() -{ - if(_metadata == NULL) - obtainMetadata(); - - return _api->requestMetadataAndWait(_filename); -} - -bool QDropboxFile::hasChanged() -{ - if(_metadata == NULL) - { - if(!metadata().isValid()) // get metadata - return false; // if metadata was invalid - } - - QDropboxFileInfo serverMetadata = _api->requestMetadataAndWait(_filename); -#ifdef QTDROPBOX_DEBUG - qDebug() << "QDropboxFile::hasChanged() local revision hash = " << _metadata->revisionHash() << endl; - qDebug() << "QDropboxFile::hasChanged() remote revision hash = " << serverMetadata.revisionHash() << endl; -#endif - return serverMetadata.revisionHash().compare(_metadata->revisionHash())!=0; -} - -void QDropboxFile::obtainMetadata() -{ - // get metadata of this file - _metadata = new QDropboxFileInfo(_api->requestMetadataAndWait(_filename).strContent(), this); - if(!_metadata->isValid()) - _metadata->clear(); - return; -} - -QList QDropboxFile::revisions(int max) -{ - QList revisions = _api->requestRevisionsAndWait(_filename, max); - if(_api->error() != QDropbox::NoError) - revisions.clear(); - - return revisions; -} - -bool QDropboxFile::seek(qint64 pos) -{ - if(pos > _buffer->size()) - return false; - - QIODevice::seek(pos); - _position = pos; - return true; -} - -qint64 QDropboxFile::pos() const -{ - return _position; -} - -bool QDropboxFile::reset() -{ - QIODevice::reset(); - _position = 0; - return true; -} - -void QDropboxFile::abort() -{ - emit operationAborted(); -} diff --git a/src/third_party/QtDropbox/src/qdropboxfile.h b/src/third_party/QtDropbox/src/qdropboxfile.h deleted file mode 100644 index 4add0e0..0000000 --- a/src/third_party/QtDropbox/src/qdropboxfile.h +++ /dev/null @@ -1,269 +0,0 @@ -#ifndef QDROPBOXFILE_H -#define QDROPBOXFILE_H - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "qtdropbox_global.h" -#include "qdropboxjson.h" -#include "qdropbox.h" -#include "qdropboxfileinfo.h" - -const QString QDROPBOXFILE_CONTENT_URL = "https://api-content.dropbox.com"; - -//! Allows access to files stored on Dropbox -/*! - QDropboxFile allows you to access files that are stored on Dropbox. You can - use this class as any QIODevice, very similar to the default QFile class. It is - usable in connection with QTextStream and QDataStream to access the file contents. - - When accessing files on Dropbox remember to use valid Dropbox paths. Such a path - begins with either /dropbox/ or /sandbox/ depending on the access level of your - application. - - It is important to know that QDropboxFile buffers the content of the remote file - locally when using open(). This means that the file content is not automatically - updated if it changed on the Dropbox server which in return means that you may not - always have the most current version of the file content. - - \todo implement utilities for revision access (get a list of revisions and get actual - revisions) - - */ -class QTDROPBOXSHARED_EXPORT QDropboxFile : public QIODevice -{ - Q_OBJECT -public: - /*! - Default constructor. Use setApi() and setFilename() to access Dropbox. - - \param parent Parent QObject - */ - QDropboxFile(QObject* parent = 0); - - /*! - Creates an instance of QDropboxFile that may connect to Dropbox if the passed - QDropbox is already connected. Use setFilename() before you try to access any - file. - - \param api Pointer to a QDropbox that is connected to an account. - \param parent Parent QObject - */ - QDropboxFile(QDropbox* api, QObject* parent = 0); - - /*! - Creates an instance of QDropboxFile that may access a file on Dropbox. - - \param filename Dropbox path of the file you want to access. - \param api A QDropbox that is connected to an user account. - \param parent Parent QObject - */ - QDropboxFile(QString filename, QDropbox* api, QObject* parent = 0); - - /*! - This deconstructor cleans up on destruction of the object. - */ - ~QDropboxFile(); - - /*! - QDropboxFile is currently implemented as sequential device. That will - change in time. - */ - bool isSequential() const; - - /*! - Fetches the file content from the Dropbox server and buffers it locally. Depending - on the OpenMode read or write access will be granted. - - \param mode The access mode of the file. Equivalent to QIODevice. - */ - bool open(OpenMode mode); - - /*! - Closes the file buffer. If the file was opened with QIODevice::WriteOnly (or - QIODevice::ReadWrite) the file content buffer will be flushed and written to - the file. - */ - void close(); - - /*! - Sets the QDropbox instance that is used to access Dropbox. - - \param dropbox Pointer to the QDropbox object - */ - void setApi(QDropbox* dropbox); - - /*! - Returns a pointer to the QDropbox instance that is used to connect to Dropbox. - */ - QDropbox* api(); - - /*! - Set the name of the file you want to access. Remember to use correct Dropbox path - beginning with either /dropbox/ or /sandbox/. - - \param filename Path of the file. - */ - void setFilename(QString filename); - - /*! - Returns the path of the file that is accessed by this instance. - */ - QString filename(); - - /*! - Writes the content of the buffer to the file (only if the file is opened in - write mode). - */ - bool flush(); - - /*! - Reimplemented from QIODEvice. - */ - bool event(QEvent* event); - - /*! - Usually the file content is automatically flushed whenever the internal buffer - has more than 1024 new byte or on using close(). If you want QDropboxFile to - automatically flush earlier than those 1024 byte use this function to reduce - this threshold. - - \param num QDropboxFile will automatically flush the file buffer when there are - more than num new byte of data. - */ - void setFlushThreshold(qint64 num); - - /*! - Returns the current flush threshold setting. - */ - qint64 flushThreshold(); - - /*! - By default an already existing file will be overwritten. If you don't want to - let this happen use this function to set the overwrite flag to false. If a file - with the same name already exists it will be automatically renamed by Dropbox to - something like "file (1).txt". - - \param overwrite Overwrite flag - */ - void setOverwrite(bool overwrite); - - /*! - Returns the current state of the overwrite flag. - */ - bool overwrite(); - - /*! - Return the metadata of the file as a QDropboxFileInfo object. - */ - QDropboxFileInfo metadata(); - - /*! - Check if the file has changed on the dropbox while it was opened locally. - This function will return false if the file was not previously opened and an error - occured during the retrieval of the file metadata. Hence it is safer to open the file - first and then check hasChanged() - - \returns true if the file has changed or false if it has not. - */ - bool hasChanged(); - - /*! - Gets and returns all available revisions of the file. - \param max When defined the function will only list up to the specified amount of revisions. - \returns A list of the latest revisions of the file. - */ - QList revisions(int max = 10); - - /*! - Reimplemented from QIODevice::seek(). - Foreward to the given (byte) position in the file. Unlike QFile::seek() this function does - not seek beyond the file end. When seeking beyond the end of a file this function stops beyond - the last byte of the current content and returns false. - */ - bool seek(qint64 pos); - - /*! - Reimplemented from QIODevice::pos(). - Returns the current position in the file. - */ - qint64 pos() const; - - /*! - Reimplemented from QIODevice::reset(). - Seeks to the beginning of the file. See seek(). - */ - bool reset(); - -public slots: - void abort(); - -signals: - void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); - void uploadProgress(qint64 bytesReceived, qint64 bytesTotal); - - void operationAborted(); - -protected: - qint64 readData(char *data, qint64 maxlen); - qint64 writeData(const char *data, qint64 len); - -private slots: - void networkRequestFinished(QNetworkReply* rply); - -private: - QNetworkAccessManager _conManager; - - QByteArray *_buffer; - - QString _token; - QString _tokenSecret; - QString _filename; - - QDropbox *_api; - - - enum WaitState{ - notWaiting, - waitForRead, - waitForWrite - }; - - WaitState _waitMode; - - QEventLoop* _evLoop; - - int lastErrorCode; - QString lastErrorMessage; - - qint64 _bufferThreshold; - qint64 _currentThreshold; - - bool _overwrite; - - int _position; - - QDropboxFileInfo *_metadata; - - void obtainToken(); - void connectSignals(); - - bool isMode(QIODevice::OpenMode mode); - bool getFileContent(QString filename); - void rplyFileContent(QNetworkReply* rply); - void rplyFileWrite(QNetworkReply* rply); - void startEventLoop(); - void stopEventLoop(); - bool putFile(); - void obtainMetadata(); - - void _init(QDropbox *api, QString filename, qint64 bufferTh); -}; - -#endif // QDROPBOXFILE_H diff --git a/src/third_party/QtDropbox/src/qdropboxfileinfo.cpp b/src/third_party/QtDropbox/src/qdropboxfileinfo.cpp deleted file mode 100644 index a0cbf53..0000000 --- a/src/third_party/QtDropbox/src/qdropboxfileinfo.cpp +++ /dev/null @@ -1,178 +0,0 @@ -#include "qdropboxfileinfo.h" - -QDropboxFileInfo::QDropboxFileInfo(QObject *parent) : - QDropboxJson(parent) -{ - _init(); -} - -QDropboxFileInfo::QDropboxFileInfo(QString jsonStr, QObject *parent) : - QDropboxJson(jsonStr, parent) -{ - _init(); - dataFromJson(); -} - -QDropboxFileInfo::QDropboxFileInfo(const QDropboxFileInfo &other) : - QDropboxJson(0) -{ - _init(); - copyFrom(other); -} - -QDropboxFileInfo::~QDropboxFileInfo() -{ - if(_content != NULL) - delete _content; -} - -void QDropboxFileInfo::copyFrom(const QDropboxFileInfo &other) -{ - parseString(other.strContent()); - dataFromJson(); - setParent(other.parent()); - return; -} - -QDropboxFileInfo &QDropboxFileInfo::operator=(const QDropboxFileInfo &other) -{ - copyFrom(other); - return *this; -} - -void QDropboxFileInfo::dataFromJson() -{ - if(!isValid()) - return; - - _size = getString("size"); - _revision = getUInt("revision"); - _thumbExists = getBool("thumb_exists"); - _bytes = getUInt("bytes"); - _icon = getString("icon"); - _root = getString("root"); - _path = getString("path"); - _isDir = getBool("is_dir"); - _mimeType = getString("mime_type"); - _isDeleted = getBool("is_deleted"); - _revisionHash = getString("rev"); - _modified = getTimestamp("modified"); - _clientModified = getTimestamp("client_mtime"); - - // create content list - if(_isDir) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "fileinfo: generating contents list"; -#endif - _content = new QList(); - QStringList contentsArray = getArray("contents"); - for(qint32 i = 0; iappend(contentInfo); - } - } - - return; -} - -void QDropboxFileInfo::_init() -{ - _size = ""; - _revision = 0; - _thumbExists = false; - _bytes = 0; - _modified = QDateTime::currentDateTime(); - _clientModified = QDateTime::currentDateTime(); - _icon = ""; - _root = ""; - _path = ""; - _isDir = false; - _mimeType = ""; - _isDeleted = false; - _revisionHash = ""; - _content = NULL; - return; -} - -QString QDropboxFileInfo::revisionHash() const -{ - return _revisionHash; -} - -bool QDropboxFileInfo::isDeleted() const -{ - return _isDeleted; -} - - -QString QDropboxFileInfo::mimeType() const -{ - return _mimeType; -} - -bool QDropboxFileInfo::isDir() const -{ - return _isDir; -} - -QString QDropboxFileInfo::path() const -{ - return _path; -} - -QString QDropboxFileInfo::root() const -{ - return _root; -} - -QString QDropboxFileInfo::icon() const -{ - return _icon; -} - -QDateTime QDropboxFileInfo::clientModified() -{ - return _clientModified; -} - -QDateTime QDropboxFileInfo::modified() -{ - return _modified; -} - -quint64 QDropboxFileInfo::bytes() const -{ - return _bytes; -} - -bool QDropboxFileInfo::thumbExists() const -{ - return _thumbExists; -} - -quint64 QDropboxFileInfo::revision() const -{ - return _revision; -} - -QString QDropboxFileInfo::size() const -{ - return _size; -} - -QList QDropboxFileInfo::contents() const -{ - if(_content == NULL || !isDir()) - { - QList l; - l.clear(); - return l; - } - - return *_content; -} diff --git a/src/third_party/QtDropbox/src/qdropboxfileinfo.h b/src/third_party/QtDropbox/src/qdropboxfileinfo.h deleted file mode 100644 index 1f0d19a..0000000 --- a/src/third_party/QtDropbox/src/qdropboxfileinfo.h +++ /dev/null @@ -1,183 +0,0 @@ -#ifndef QDROPBOXFILEINFO_H -#define QDROPBOXFILEINFO_H - -#include -#include -#include -#include - -#ifdef QTDROPBOX_DEBUG -#include -#endif - -#include "qdropboxjson.h" - -//! Provides information and metadata about files and directories -/*! - This class is a more specialised version of QDropboxJson. It provides access to - the metadata of a file or directory that is stored on the Dropbox. - - To obtain metadata information about any kind of file stored on the Dropbox you - have to use QDropbox::metadata() or QDropboxFile::metadata(). Those functions - return an instance of this class that contains the required information. If an - error occured while obtaining the metadata the functon isValid() will return - false. - - Traversing the Dropbox file system - Walking through the filetree on Dropbox is possible by using the isDir() and contents() - functions. The function contents() provides you with the metadata of all the files and - directories in a directory. Due to a limitation of the Dropbox REST API these metadata - do not contain contents of subdirectories. Calling contents() on metadata that you - retrieved by using a previous contents() call will return an empty list. You have to - query the metadata of a subdirectory again by using QDropbox::requestMetadata() or - QDropbox::requestMetadataAndWait(). - - \bug modified() and clientModified() are currently not working due to a bug in - QDropboxJson - */ -class QTDROPBOXSHARED_EXPORT QDropboxFileInfo : public QDropboxJson -{ - Q_OBJECT -public: - - /*! - Creates an empty instance of QDropboxFileInfo. - \warning internal use only - \param parent parent QObject - */ - QDropboxFileInfo(QObject *parent = 0); - - /*! - Creates an instance of QDropboxFileInfo based on the data provided - in the JSON in string representation. - - \param jsonStr metadata JSON in string representation - \param parent pointer to the parent QObject - */ - QDropboxFileInfo(QString jsonStr, QObject *parent = 0); - - /*! - Creates a copy of an other QDropboxFileInfo instance. - - \param other original instance - */ - QDropboxFileInfo(const QDropboxFileInfo &other); - - /*! - Default destructor. Takes care of cleaning up when the object is destroyed. - */ - ~QDropboxFileInfo(); - - /*! - Copies the values from an other QDropboxFileInfo instance to the - current instance. - - \param other original instance - */ - void copyFrom(const QDropboxFileInfo &other); - - /*! - Works exactly like copyFrom() only as an operator. - - \param other original instance - */ - QDropboxFileInfo& operator=(const QDropboxFileInfo& other); - - /*! - Human readable file size. - */ - QString size() const; - - /*! - Current revision number. - */ - quint64 revision() const; - - /*! - Indicates whether a thumbnail is available. - */ - bool thumbExists() const; - - /*! - File size in bytes. - */ - quint64 bytes() const; - - /*! - Timestamp of last modification. - \bug Currently not working - */ - QDateTime modified(); - - /*! - Timestamp of desktop client upload. - */ - QDateTime clientModified(); - - /*! - Icon name. - */ - QString icon() const; - - /*! - Root directors. Can be either /dropbox or /sandbox - */ - QString root() const; - - /*! - Full canonical path of the file. - */ - QString path() const; - - /*! - Indicates whether the selected item is a directory. - */ - bool isDir() const; - - /*! - Mime-Type of the item. - */ - QString mimeType() const; - - /*! - Indiciates that the item was deleted from the server. - */ - bool isDeleted() const; - - /*! - Current revision as hash string. Use this for e.g. change check. - */ - QString revisionHash() const; - - /*! - Returns the content of a directory. - This function will return a list with length 0 (zero) if the item is no - directory. - */ - QList contents() const; - -signals: - -public slots: - -private: - void dataFromJson(); - void _init(); - - QString _size; - quint64 _revision; - bool _thumbExists; - quint64 _bytes; - QDateTime _modified; - QDateTime _clientModified; - QString _icon; - QString _root; - QString _path; - bool _isDir; - QString _mimeType; - bool _isDeleted; - QString _revisionHash; - QList* _content; -}; - -#endif // QDROPBOXFILEINFO_H diff --git a/src/third_party/QtDropbox/src/qdropboxjson.cpp b/src/third_party/QtDropbox/src/qdropboxjson.cpp deleted file mode 100644 index 1f85782..0000000 --- a/src/third_party/QtDropbox/src/qdropboxjson.cpp +++ /dev/null @@ -1,747 +0,0 @@ -#include - -#include "qdropboxjson.h" - -QDropboxJson::QDropboxJson(QObject *parent) : - QObject(parent) -{ - _init(); -} - -QDropboxJson::QDropboxJson(QString strJson, QObject *parent) : - QObject(parent) -{ - _init(); - parseString(strJson); -} - -QDropboxJson::QDropboxJson(const QDropboxJson &other) : - QObject(other.parent()) -{ - _init(); - parseString(other.strContent()); -} - -QDropboxJson::~QDropboxJson() -{ - emptyList(); -} - -void QDropboxJson::_init() -{ - valid = false; - _anonymousArray = false; -} - -void QDropboxJson::parseString(QString strJson) -{ -#ifdef QTDROPBOX_DEBUG - qDebug() << "parse string = " << strJson << endl; -#endif - - // clear all existing data - emptyList(); - - // basically a json is valid until it is invalidated - valid = true; - - if(!strJson.startsWith("{") || - !strJson.endsWith("}")) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "string does not start with { " << endl; -#endif - - if(strJson.startsWith("[") && strJson.endsWith("]")) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "JSON is anonymous array" << endl; -#endif - _anonymousArray = true; - // fix json to be parseable by the algorithm below - strJson = "{\"_anonArray\":"+strJson+"}"; - } - else - { - valid = false; - return; - } - } - - QString buffer = ""; - QString key = ""; - QString value = ""; - - bool isKey = true; - bool insertValue = false; - bool isJson = false; - bool isArray = false; - bool openQuotes = false; - - - for(int i=0; i parse array - bool inString = false; - bool arrayEnd = false; - int arrayDepth = 0; - int j = i+1; - buffer = "["; - for(;!arrayEnd && jtoInt(); -} - -void QDropboxJson::setInt(QString key, qint64 value) -{ - if(valueMap.contains(key)){ - valueMap[key].value.value->setNum(value); - }else{ - qdropboxjson_entry e; - QString *valuePointer = new QString(); - valuePointer->setNum(value); - e.value.value = valuePointer; - e.type = QDROPBOXJSON_TYPE_NUM; - valueMap[key] = e; - } -} - -quint64 QDropboxJson::getUInt(QString key, bool force) -{ - if(!valueMap.contains(key)) - return 0; - - qdropboxjson_entry e; - e = valueMap.value(key); - - if(!force && e.type != QDROPBOXJSON_TYPE_UINT) - return 0; - - return e.value.value->toUInt(); -} - -void QDropboxJson::setUInt(QString key, quint64 value) -{ - if(valueMap.contains(key)){ - valueMap[key].value.value->setNum(value); - }else{ - qdropboxjson_entry e; - QString *valuePointer = new QString(); - valuePointer->setNum(value); - e.value.value = valuePointer; - e.type = QDROPBOXJSON_TYPE_UINT; - valueMap[key] = e; - } -} - -QString QDropboxJson::getString(QString key, bool force) -{ - if(!valueMap.contains(key)) - return ""; - - qdropboxjson_entry e; - e = valueMap.value(key); - - if(!force && e.type != QDROPBOXJSON_TYPE_STR) - return ""; - - QString value = e.value.value->mid(1, e.value.value->size()-2); - return value; -} - -void QDropboxJson::setString(QString key, QString value) -{ - if(valueMap.contains(key)){ - *(valueMap[key].value.value) = value; - }else{ - qdropboxjson_entry e; - QString *valuePointer = new QString(value); - e.value.value = valuePointer; - e.type = QDROPBOXJSON_TYPE_STR; - valueMap[key] = e; - } -} - -QDropboxJson* QDropboxJson::getJson(QString key) -{ - if(!valueMap.contains(key)) - return NULL; - - qdropboxjson_entry e; - e = valueMap.value(key); - - if(e.type != QDROPBOXJSON_TYPE_JSON) - return NULL; - - - return e.value.json; -} - -void QDropboxJson::setJson(QString key, QDropboxJson value) -{ - if(valueMap.contains(key)){ - *(valueMap[key].value.json) = value; - }else{ - qdropboxjson_entry e; - QDropboxJson *valuePointer = new QDropboxJson(value); - e.value.json = valuePointer; - e.type = QDROPBOXJSON_TYPE_JSON; - valueMap[key] = e; - } -} - -double QDropboxJson::getDouble(QString key, bool force) -{ - if(!valueMap.contains(key)) - return 0.0f; - - qdropboxjson_entry e; - e = valueMap.value(key); - - if(!force && e.type != QDROPBOXJSON_TYPE_FLOAT) - return 0.0f; - - return e.value.value->toDouble(); -} - -void QDropboxJson::setDouble(QString key, double value) -{ - if(valueMap.contains(key)){ - valueMap[key].value.value->setNum(value); - }else{ - qdropboxjson_entry e; - QString *valuePointer = new QString(); - valuePointer->setNum(value); - e.value.value = valuePointer; - e.type = QDROPBOXJSON_TYPE_FLOAT; - valueMap[key] = e; - } -} - -bool QDropboxJson::getBool(QString key, bool force) -{ - if(!valueMap.contains(key)) - return false; - - qdropboxjson_entry e; - e = valueMap.value(key); - - if(!force && e.type != QDROPBOXJSON_TYPE_BOOL) - return false; - - if(!e.value.value->compare("false")) - return false; - - return true; -} - -void QDropboxJson::setBool(QString key, bool value) -{ - if(valueMap.contains(key)){ - *(valueMap[key].value.value) = value ? "true" : "false"; - }else{ - qdropboxjson_entry e; - QString *valuePointer = new QString(value ? "true" : "false"); - e.value.value = valuePointer; - e.type = QDROPBOXJSON_TYPE_BOOL; - valueMap[key] = e; - } -} - -QDateTime QDropboxJson::getTimestamp(QString key, bool force) -{ - if(!valueMap.contains(key)) - return QDateTime(); - - qdropboxjson_entry e; - e = valueMap.value(key); - - if(!force && e.type != QDROPBOXJSON_TYPE_STR) - return QDateTime(); - - const QString dtFormat = "dd MMM yyyy HH:mm:ss"; - - QDateTime res = QLocale(QLocale::English).toDateTime(e.value.value->mid(6, dtFormat.size()), dtFormat); - res.setTimeSpec(Qt::UTC); - - return res; -} - -void QDropboxJson::setTimestamp(QString key, QDateTime value) -{ - const QString dtFormat = "ddd, dd MMM yyyy hh:mm:ss '+0000'"; - - value = value.toUTC(); - - if(valueMap.contains(key)){ - *(valueMap[key].value.value) = value.toString(dtFormat); - }else{ - qdropboxjson_entry e; - QString *valuePointer = new QString(QLocale{QLocale::English}.toString(value, dtFormat)); - e.value.value = valuePointer; - e.value.value = valuePointer; - e.type = QDROPBOXJSON_TYPE_STR; - valueMap[key] = e; - } -} - -QString QDropboxJson::strContent() const -{ - if(valueMap.size() == 0) - return ""; - - QString content = "{"; - QList keys = valueMap.keys(); - for(int i=0; istrContent(); - - content.append(QString("\"%1\": %2").arg(keys.at(i)).arg(value)); - if(i != keys.size()-1) - content.append(", "); - } - content.append("}"); - return content; -} - -void QDropboxJson::emptyList() -{ - QList keys = valueMap.keys(); - for(qint32 i=0; imid(1, e.value.value->length()-2); - QString buffer = ""; - bool inString = false; - int inJson = 0; - int inArray = 0; - for(int i=0; i 0 || inArray > 0)) - buffer += c; - switch(c.toLatin1()) - { - case '"': - if(i > 0 && arrayStr.at(i-1).toLatin1() == '\\') - { - buffer += c; - break; - } - else - inString = !inString; - break; - case '{': - inJson++; - break; - case '}': - inJson--; - break; - case '[': - inArray++; - break; - case ']': - inArray--; - break; - case ',': - if(inJson == 0 && inArray == 0 && !inString) - { - list.append(buffer); - buffer = ""; - } - break; - } - } - - if(!buffer.isEmpty()) - list.append(buffer); - - return list; -} - -int QDropboxJson::parseSubJson(QString strJson, int start, qdropboxjson_entry *jsonEntry) -{ - int openBrackets = 1; - QString buffer = ""; - QDropboxJson* jsonValue = NULL; - - int j; - for(j=start+1; openBrackets > 0 && j < strJson.size(); ++j) - { - if(strJson.at(j).toLatin1() == '{') - openBrackets++; - else if(strJson.at(j).toLatin1() == '}') - openBrackets--; - } - - buffer = strJson.mid(start, j-start); -#ifdef QTDROPBOX_DEBUG - qDebug() << "brackets = " << openBrackets << endl; - qDebug() << "json data(" << start << ":" << j-start << ") = " << buffer << endl; -#endif - jsonValue = new QDropboxJson(); - jsonValue->parseString(buffer); - - // invalid sub json means invalid json - if(!jsonValue->isValid()) - { -#ifdef QTDROPBOX_DEBUG - qDebug() << "subjson invalid!" << endl; -#endif - valid = false; - return j; - } - - // insert new - jsonEntry->value.json = jsonValue; - jsonEntry->type = QDROPBOXJSON_TYPE_JSON; - return j; -} - -bool QDropboxJson::isAnonymousArray() -{ - return _anonymousArray; -} - -QStringList QDropboxJson::getArray() -{ - if(!isAnonymousArray()) - return QStringList(); - - return getArray("_anonArray"); -} - -int QDropboxJson::compare(const QDropboxJson& other) -{ - if(valueMap.size() != other.valueMap.size()) - return 1; - - QMap yourMap = other.valueMap; - - QList keys = valueMap.keys(); - for(int i=0; icompare(*yourEntry.value.json) != 0) - return 1; - } - else - { - if(myEntry.value.value->compare(yourEntry.value.value) != 0) - return 1; - } - } - - return 0; -} diff --git a/src/third_party/QtDropbox/src/qdropboxjson.h b/src/third_party/QtDropbox/src/qdropboxjson.h deleted file mode 100644 index 74799d8..0000000 --- a/src/third_party/QtDropbox/src/qdropboxjson.h +++ /dev/null @@ -1,259 +0,0 @@ -#ifndef QDROPBOXJSON_H -#define QDROPBOXJSON_H - -#include "qtdropbox_global.h" - -#include -#include -#include -#include -#include - -#ifdef QTDROPBOX_DEBUG -#include -#endif - -typedef char qdropboxjson_entry_type; - -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_NUM = 'N'; -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_STR = 'S'; -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_JSON = 'J'; -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_ARRAY = 'A'; -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_FLOAT = 'F'; -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_BOOL = 'B'; -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_UINT = 'U'; -const qdropboxjson_entry_type QDROPBOXJSON_TYPE_UNKNOWN = '?'; - -class QDropboxJson; - -//! Keeps values of a JSON -union qdropboxjson_value{ - QDropboxJson *json; //!< Used to store subjsons (JSON in JSON) - QString *value; //!< used to store a real value, all values are converted from QString -}; - -//! Keeps keys of a JSON -struct qdropboxjson_entry{ - qdropboxjson_entry_type type; //!< Datatype of value - qdropboxjson_value value; //!< Reference to the value struct -}; - -//! Used to store JSON data that is returned from Dropbox. -/*! - Most of the communication with Dropbox is handled by using JSON data structures. JSON is - originally method of complex data description used for JavaScript and PHP and thus it is - designed to work with typeless languages. QDropboxJson provides an interface that maps - the mixed type values of a JSON to native C++ data types as good as possible. - - A JSON is usually passed as string and can be parsed by either passing that string to the - constructor or using parseString(). If any error occurs the QDropboxJson will be marked as - invalid (see isValid()). - - The data of a valid QDropboxJson can be accessed by using one of the get-functions. If the - value you want to access is not mapped to the datatype you requested an empty value will be - returned. You can always set a force flag. If you do the returned value will be converted but - may return nonsense data. Use this flag with care and only if you know what you're doing. - - \warning Currently arrays in JSONs are not supported. - \todo Implemement setter functions and toString() for JSON generation (altough not necessary it - would be a nice feature) - */ -class QTDROPBOXSHARED_EXPORT QDropboxJson : public QObject -{ - Q_OBJECT -public: - /*! - Creates an empty JSON object. - - \param parent Pointer to the parent QObject. - */ - QDropboxJson(QObject *parent = 0); - - /*! - This constructor interprets the given string as JSON. - - \param strJson JSON as string. - \param parent Parent QObject. - */ - QDropboxJson(QString strJson, QObject *parent = 0); - - /*! - Copies the data of another QDropboxJSon. - - \param other The QDropboxJson to be copied. - */ - QDropboxJson(const QDropboxJson &other); - - /*! - Cleans up the JSON on destruction. - */ - ~QDropboxJson(); - - /*! - This enum is used to categorize the data type of JSON values. - */ - enum DataType{ - NumberType, //!< Number based type (interpreted as qint64) - StringType, //!< String based type of variable length - JsonType, //!< A subjson - ArrayType, //!< Array data type (currently not supported!) - FloatType, //!< Floating point based datatype - BoolType, //!< Boolean based types. - UnsignedIntType, //!< Number based type unsigned (only applied if NumberType does not match) - UnknownType //!< Data type could not be identified. - }; - - /*! - Interprets a string as JSON - or at least tries to. If this is not possible - the QDropboxJson will be invalidated. - - \parem strJson JSON in string representation. - */ - void parseString(QString strJson); - - /*! - Drops all stored JSON data. - */ - void clear(); - - /*! - Returns true if the QDropboxJson contains valid data from a JSON. If an error occurs - during the parsing of a JSON string this function will return false. - */ - bool isValid(); - - /*! - Returns true if the QDropboxJson contains the given key. - - \param key The requested key. - */ - bool hasKey(QString key); - - /*! - Returns the data type of the value mapped to the key. - \param key The key to be checked. - */ - DataType type(QString key); - - /*! - Returns a stored integer value identified by the given key. If the key does - not map 0 is returned. If the force flag is set the check of the data type - is omitted and it is tried to convert the value regardless of the real data type. - */ - qint64 getInt(QString key, bool force = false); - - void setInt(QString key, qint64 value); - - /*! - Returns a stored unsigned integer value identified by the given key. If the key does - not map 0 is returned. If the force flag is set the check of the data type - is omitted and it is tried to convert the value regardless of the real data type. - */ - quint64 getUInt(QString key, bool force = false); - - void setUInt(QString key, quint64 value); - - /*! - Returns a stored string value identified by the given key. If the key does - not map an empty QString is returned. If the force flag is set the check of the data type - is omitted and it is tried to convert the value regardless of the real data type. - */ - QString getString(QString key, bool force = false); - - void setString(QString key, QString value); - - /*! - Returns a sub JSON identified by the given key. If the key does not map to a - JSON a NULL pointer will be returned. It is not possible to force a conversion. - */ - QDropboxJson *getJson(QString key); - - void setJson(QString key, QDropboxJson value); - - /*! - Returns a stored floating point value identified by the given key. If the key does - not map 0.0 is returned. If the force flag is set the check of the data type - is omitted and it is tried to convert the value regardless of the real data type. - */ - double getDouble(QString key, bool force = false); - - void setDouble(QString key, double value); - - /*! - Returns a stored boolean value identified by the given key. If the key does - not map false is returned. If the force flag is set the check of the data type - is omitted and it is tried to convert the value regardless of the real data type. - */ - bool getBool(QString key, bool force = false); - - void setBool(QString key, bool value); - - /*! - Returns the stored JSON's string representation. - */ - QString strContent() const; - - /*! - Returns a stored string values as QDateTime timestamp. The timestamp will be invalid - if the string could not be converted. - */ - QDateTime getTimestamp(QString key, bool force = false); - - void setTimestamp(QString key, QDateTime value); - - /*! - Returnes a stored array as a list of string items. If the key does not exist or is not - stored as array the function returns an empty list. If you need the items in a specific - data type you have to do equivalent casting your self! - */ - QStringList getArray(QString key, bool force = false); - - /*! - Returns the content of a stored array as a list of string items if the JSON contains - an anynmous array (see also isAnonymousArray()). As with getArray(QString key, bool force = false) - you have to parse the content of the array your self. - */ - QStringList getArray(); - - /**! - Overloaded operator to copy a QDropboxJson. - */ - QDropboxJson& operator =(QDropboxJson&); - - /**! - A JSON may be an anonymous array like this: - \code - [ - "a": "valueA", - "b": "valueB" - ] - \endcode - - Use this function to identify a JSON that is an anonymous array. - \returns true if the JSON is an anonymous array. - */ - bool isAnonymousArray(); - - /**! - Compares two JSON objects if they are the same. - This means that they have the same keys with the same values. - - \param other the JSON you wish to compare to - \returns 0 if the JSON objects are equals - */ - int compare(const QDropboxJson& other); - -protected: - bool valid; - -private: - QMap valueMap; - bool _anonymousArray; - - void emptyList(); - qdropboxjson_entry_type interpretType(QString value); - int parseSubJson(QString str, int start, qdropboxjson_entry *jsonEntry); - void _init(); -}; - -#endif // QDROPBOXJSON_H diff --git a/src/third_party/QtDropbox/src/qtdropbox.h b/src/third_party/QtDropbox/src/qtdropbox.h deleted file mode 100644 index de2bf1a..0000000 --- a/src/third_party/QtDropbox/src/qtdropbox.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef QTDROPBOX_H -#define QTDROPBOX_H - -#include "qtdropbox_global.h" -#include "qdropbox.h" -#include "qdropboxjson.h" -#include "qdropboxfile.h" -#include "qdropboxfileinfo.h" -#include "qdropboxdeltaresponse.h" - -#endif // QTDROPBOX_H diff --git a/src/third_party/QtDropbox/src/qtdropbox_global.h b/src/third_party/QtDropbox/src/qtdropbox_global.h deleted file mode 100644 index fab9772..0000000 --- a/src/third_party/QtDropbox/src/qtdropbox_global.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef QTDROPBOX_GLOBAL_H -#define QTDROPBOX_GLOBAL_H - -#include - -#if defined(QTDROPBOX_LIBRARY) -# define QTDROPBOXSHARED_EXPORT Q_DECL_EXPORT -#else -# define QTDROPBOXSHARED_EXPORT Q_DECL_IMPORT -#endif - -#ifndef QDROPBOX_HTTP_ERROR_CODES -#define QDROPBOX_HTTP_ERROR_CODES -const qint32 QDROPBOX_ERROR_BAD_INPUT = 400; -const qint32 QDROPBOX_ERROR_EXPIRED_TOKEN = 401; -const qint32 QDROPBOX_ERROR_BAD_OAUTH_REQUEST = 403; -const qint32 QDROPBOX_ERROR_FILE_NOT_FOUND = 404; -const qint32 QDROPBOX_ERROR_WRONG_METHOD = 405; -const qint32 QDROPBOX_ERROR_REQUEST_CAP = 503; -const qint32 QDROPBOX_ERROR_USER_OVER_QUOTA = 507; -#endif - -#endif // QTDROPBOX_GLOBAL_H diff --git a/src/third_party/QtDropbox/tests/README.md b/src/third_party/QtDropbox/tests/README.md deleted file mode 100644 index 20d5367..0000000 --- a/src/third_party/QtDropbox/tests/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Qt Dropbox: Unit Tests - -## Introduction -This subproject builds a test application that verifies if QtDropbox is working correctly. - -## Dropbox App Keys -In order to compile and execute the tests you need to create a custom header file called keys.hpp -This file defines two macros that provide the Dropbox application key and shared secret for accessing Dropbox. These keys are needed to connect to Dropbox. - -Example: -``` -#define APP_KEY "myappkey" -#define APP_SECRET "mysecret" -``` - -## Build & Execute -You have to build QtDropbox first by using: - -``` -qmake -make -make install -``` - -Afterwards change to this subdirectory and execute: -``` -cd tests # unless you've done that already -qmake -make -make install -cd ../lib -./qtdropboxtest -``` - diff --git a/src/third_party/QtDropbox/tests/qtdropboxtest.cpp b/src/third_party/QtDropbox/tests/qtdropboxtest.cpp deleted file mode 100644 index d5cc98d..0000000 --- a/src/third_party/QtDropbox/tests/qtdropboxtest.cpp +++ /dev/null @@ -1,378 +0,0 @@ -#include "qtdropboxtest.hpp" - -typedef QMap > QDropboxFileInfoMap; - -QtDropboxTest::QtDropboxTest() -{ -} - - -/*! - * \brief QDropboxJson: Simple string read - * JSON represents an object with single string value. The test - * tries to read the string value. - */ -void QtDropboxTest::jsonCase1() -{ - QDropboxJson json("{\"string\":\"asdf\"}"); - QVERIFY2(json.isValid(), "json validity"); - QVERIFY2(json.getString("string").compare("asdf") == 0, "string value does not match"); -} - -/*! - * \brief QDropboxJson: Simple int read - * JSON represents an object with a single integer value. The test - * tries to read that value. - */ -void QtDropboxTest::jsonCase2() -{ - QDropboxJson json("{\"int\":1234}"); - QVERIFY2(json.isValid(), "json validity"); - QVERIFY2(json.getInt("int") == 1234, "integer value does not match"); -} - -/*! - * \brief QDropboxJson: Injson validity check - * JSON is invalid. Test confirms invalidity of the JSON. - */ -void QtDropboxTest::jsonCase3() -{ - QDropboxJson json("{\"test\":\"foo\""); - QVERIFY2(!json.isValid(), "injson validity not confirmed"); -} - -/*! - * \brief QDropboxJson: Simple boolean read - * JSON contains a single boolean value. Test accesses this value. - */ -void QtDropboxTest::jsonCase4() -{ - QDropboxJson json("{\"bool\":true}"); - QVERIFY2(json.isValid(), "json validity"); - QVERIFY2(json.getBool("bool"), "boolean value does not match"); -} - -/*! - * \brief QDropboxJson: Simple floating point read - * JSON contains a single double value. Test reads it. - */ -void QtDropboxTest::jsonCase5() -{ - QDropboxJson json("{\"double\":14.323667}"); - QVERIFY2(json.isValid(), "json validity"); - QVERIFY2(json.getDouble("double"), "double value does not match"); -} - -/*! - * \brief QDropboxJson: Subjson read - * JSON contains a subjson that is read, but not evaluated. - */ -void QtDropboxTest::jsonCase6() -{ - QDropboxJson json("{\"json\": {\"string\":\"abcd\"}}"); - QVERIFY2(json.isValid(), "json validity"); - - QDropboxJson* subjson = json.getJson("json"); - - QVERIFY2(subjson!=NULL, "subjson is null"); - QVERIFY2(subjson->isValid(), "subjson invalid"); -} - -/*! - * \brief QDropboxJson: Simple unsigned integer read. - * JSON contains single unsigned integer that is read. - */ -void QtDropboxTest::jsonCase7() -{ - QDropboxJson json("{\"uint\":4294967295}"); - QVERIFY2(json.isValid(), "json validity"); - QVERIFY2(json.getUInt("uint") == 4294967295, "unsigned int value does not match"); -} - -/** - * @brief QDropboxJson: Test if clear works correctly - */ -void QtDropboxTest::jsonCase8() -{ - QDropboxJson json("{\"uint\":4294967295}"); - QVERIFY2(json.isValid(), "json validity"); - json.clear(); - QVERIFY2(json.getUInt("uint") == 0, "internal list not cleared"); - QVERIFY2(json.strContent().isEmpty(), "json string is not cleared"); -} - -/** - * @brief QDropboxJson: Test if array interpretation and access are working. - */ -void QtDropboxTest::jsonCase9() -{ - QDropboxJson json("{\"array\": [1, \"test\", true, 7.3]}"); - QVERIFY2(json.isValid(), "json validity"); - - QStringList l = json.getArray("array"); - QVERIFY2(l.size() == 4, "array list has wrong size"); - QVERIFY2(l.at(0).compare("1") == 0, "int element not correctly formatted"); - QVERIFY2(l.at(1).compare("test") == 0, "string element not correctly formatted"); - QVERIFY2(l.at(2).compare("true") == 0, "boolean element not correctly formatted"); - QVERIFY2(l.at(3).compare("7.3") == 0, "double element not correctly formatted"); -} - -/** - * @brief QDropboxJson: Test if json in array is accessible. - */ -void QtDropboxTest::jsonCase10() -{ - QDropboxJson json("{\"jsonarray\":[{\"key\":\"value\"}]}"); - QVERIFY2(json.isValid(), "json validity"); - - QStringList l = json.getArray("jsonarray"); - QVERIFY2(l.size() == 1, "array list has wrong size"); - - QDropboxJson arrayJson(l.at(0)); - QVERIFY2(arrayJson.isValid(), "json from array is invalid"); - QVERIFY2(arrayJson.getString("key").compare("value") == 0, "json from array contains wrong value"); -} - -/** - * @brief QDropboxJson: Checks if compare() is working by doing a self-comparison. - */ -void QtDropboxTest::jsonCase11() -{ - QString jsonStr = "{\"int\": 1, \"string\": \"test\", \"bool\": true, \"json\": {\"key\": \"value\"}, " - "\"array\": [1, 3.5, {\"arraykey\": \"arrayvalue\"}]}"; - QDropboxJson json(jsonStr); - QVERIFY2(json.isValid(), "json validity"); - QVERIFY2(json.compare(json) == 0, "comparing the same json resulted in negative comparison"); -} - -/** - * @brief QDropboxJson: Test whether strContent() returns the correct JSON - * The test case creates a JSON and another JSON that is based on the return value of strContent() of - * the first JSON. Both JSONs are compared afterwards and expected to be equal. - */ -void QtDropboxTest::jsonCase12() -{ - QString jsonStr = "{\"int\": 1, \"string\": \"test\", \"bool\": true, \"json\": {\"key\": \"value\"}, " - "\"array\": [1, 3.5, {\"arraykey\": \"arrayvalue\"}], \"timestamp\": \"Sat, 21 Aug 2010 22:31:20 +0000\"}"; - QDropboxJson json(jsonStr); - QVERIFY2(json.isValid(), "json validity"); - - QString jsonContent = json.strContent(); - QDropboxJson json2(jsonContent); - QString j2c = json2.strContent(); - - int compare = json.compare(json2); - - QVERIFY2(compare == 0, "string content of json is incorrect or compare is broken"); -} - -/** - * @brief QDropboxJson: Setter functions - * The test verifies if the setter functions are working correctly by setting a value and - * reading it afterwards. - */ -void QtDropboxTest::jsonCase13() -{ - QDropboxJson json; - json.setInt("testInt", 10); - QVERIFY2(json.getInt("testInt") == 10, "setInt of json is incorrect"); - - json.setUInt("testUInt", 10); - QVERIFY2(json.getUInt("testUInt") == 10, "setUInt of json is incorrect"); - - json.setDouble("testDouble", 10.0); - QVERIFY2(json.getDouble("testDouble") == 10.0, "setDouble of json is incorrect"); - - json.setBool("testBool", true); - QVERIFY2(json.getBool("testBool"), "setBool of json is incorrect"); - - json.setString("testString", "10"); - QVERIFY2(json.getString("testString").compare("10"), "setString of json is incorrect"); - - QDateTime time = QDateTime::currentDateTime(); - json.setTimestamp("testTimestamp", time); - QVERIFY2(json.getTimestamp("testTimestamp").daysTo(time) == 0, "setTimestamp of json is incorrect"); -} - -/** - * @brief QDropboxJson: [] in strings - * Verify that square brackets in strings are working correctly. - */ -void QtDropboxTest::jsonCase14() -{ - QDropboxJson json("{\"string\": \"[asdf]abcd\"}"); - QVERIFY2(json.isValid(), "json could not be parsed"); - QVERIFY2(json.getString("string").compare("[asdf]abcd") == 0, "square brackets in string not parsed correctly"); -} - -/** - * @brief QDropboxJson: {} in strings - * Verify that curly brackets within a string are parsed correctly - */ -void QtDropboxTest::jsonCase15() -{ - QDropboxJson json("{\"string\": \"{asdf}abcd\"}"); - QVERIFY2(json.isValid(), "json could not be parsed"); - QVERIFY2(json.getString("string").compare("{asdf}abcd") == 0, - QString("curly brackets in string not parsed correctly [%1]").arg(json.getString("string")).toStdString().c_str()); -} - -/** - * @brief QDropbox: Plaintext Connection - * This test connects to Dropbox and sends a dummy request to check that the connection in - * Plaintext mode. The request is not processed any further! You are required to authorize - * the application for access! The Authorization URI will be printed to you and manual interaction - * is required to pass this test! - */ -void QtDropboxTest::dropboxCase1() -{ - QDropbox dropbox(APP_KEY, APP_SECRET); - QVERIFY2(connectDropbox(&dropbox, QDropbox::Plaintext), "connection error"); - QDropboxAccount accInf = dropbox.requestAccountInfoAndWait(); - QVERIFY2(dropbox.error() == QDropbox::NoError, "error on request"); - return; -} - -/** - * @brief QDropbox: delta - * This test connects to Dropbox and tests the delta API. - * - * You are required to authorize - * the application for access! The Authorization URI will be printed to you and manual interaction - * is required to pass this test! - */ -void QtDropboxTest::dropboxCase2() -{ - QTextStream strout(stdout); - QDropbox dropbox(APP_KEY, APP_SECRET); - QVERIFY2(connectDropbox(&dropbox, QDropbox::Plaintext), "connection error"); - - QString cursor = ""; - bool hasMore = true; - QDropboxFileInfoMap file_cache; - - strout << "requesting delta...\n"; - do - { - QDropboxDeltaResponse r = dropbox.requestDeltaAndWait(cursor, ""); - cursor = r.getNextCursor(); - hasMore = r.hasMore(); - - const QDropboxDeltaEntryMap entries = r.getEntries(); - for(QDropboxDeltaEntryMap::const_iterator i = entries.begin(); i != entries.end(); i++) - { - if(i.value().isNull()) - { - file_cache.remove(i.key()); - } - else - { - strout << "inserting file " << i.key() << "\n"; - file_cache.insert(i.key(), i.value()); - } - } - - } while (hasMore); - strout << "next cursor: " << cursor << "\n"; - for(QDropboxFileInfoMap::const_iterator i = file_cache.begin(); i != file_cache.end(); i++) - { - strout << "file " << i.key() << " last modified " << i.value()->clientModified().toString() << "\n"; - } - - return; -} - -/** - * @brief Prompt the user for authorization. - */ -void QtDropboxTest::authorizeApplication(QDropbox* d) -{ - QTextStream strout(stdout); - QTextStream strin(stdin); - - strout << "##########################################" << endl; - strout << "# You need to grant this test access to #" << endl; - strout << "# your Dropbox! #" << endl; - strout << "# #" << endl; - strout << "# Go to the following URL to do so. #" << endl; - strout << "##########################################" << endl << endl; - - strout << "URL: " << d->authorizeLink().toString() << endl; - QDesktopServices::openUrl(d->authorizeLink()); - strout << "Press ENTER after you authorized the application!"; - strout.flush(); - strin.readLine(); - strout << endl; - d->requestAccessTokenAndWait(); -} - -/** - * @brief Connect a QDropbox to the Dropbox service - * @param d QDropbox object to be connected - * @param m Authentication Method - * @return true on success - */ -bool QtDropboxTest::connectDropbox(QDropbox *d, QDropbox::OAuthMethod m) -{ - QFile tokenFile("tokens"); - - if(tokenFile.exists()) // reuse old tokens - { - if(tokenFile.open(QIODevice::ReadOnly|QIODevice::Text)) - { - QTextStream instream(&tokenFile); - QString token = instream.readLine().trimmed(); - QString secret = instream.readLine().trimmed(); - if(!token.isEmpty() && !secret.isEmpty()) - { - d->setToken(token); - d->setTokenSecret(secret); - tokenFile.close(); - return true; - } - } - tokenFile.close(); - } - - // acquire new token - if(!d->requestTokenAndWait()) - { - qCritical() << "error on token request"; - return false; - } - - d->setAuthMethod(m); - if(!d->requestAccessTokenAndWait()) - { - int i = 0; - for(;i<3; ++i) // we try three times - { - if(d->error() != QDropbox::TokenExpired) - break; - authorizeApplication(d); - } - - if(i>3) - { - qCritical() << "too many tries for authentication"; - return false; - } - - if(d->error() != QDropbox::NoError) - { - qCritical() << "Error: " << d->error() << " - " << d->errorString() << endl; - return false; - } - } - - if(!tokenFile.open(QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text)) - return true; - - QTextStream outstream(&tokenFile); - outstream << d->token() << endl; - outstream << d->tokenSecret() << endl; - tokenFile.close(); - return true; -} - -QTEST_MAIN(QtDropboxTest) diff --git a/src/third_party/QtDropbox/tests/qtdropboxtest.hpp b/src/third_party/QtDropbox/tests/qtdropboxtest.hpp deleted file mode 100644 index 045cb48..0000000 --- a/src/third_party/QtDropbox/tests/qtdropboxtest.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef QDROPBOXJSONTEST_H -#define QDROPBOXJSONTEST_H - -#include -#include -#include "qtdropbox.h" -#include "keys.hpp" - -class QtDropboxTest : public QObject -{ - Q_OBJECT - -public: - QtDropboxTest(); - -private Q_SLOTS: - - /* QDropboxJson */ - void jsonCase1(); - void jsonCase2(); - void jsonCase3(); - void jsonCase4(); - void jsonCase5(); - void jsonCase6(); - void jsonCase7(); - void jsonCase8(); - void jsonCase9(); - void jsonCase10(); - void jsonCase11(); - void jsonCase12(); - void jsonCase13(); - void jsonCase14(); - void jsonCase15(); - - /* QDropbox */ - void dropboxCase1(); - void dropboxCase2(); - -private: - void authorizeApplication(QDropbox *d); - bool connectDropbox(QDropbox* d, QDropbox::OAuthMethod m); -}; - -#endif // QDROPBOXJSONTEST_H diff --git a/src/third_party/QtDropbox/tests/tests.pro b/src/third_party/QtDropbox/tests/tests.pro deleted file mode 100644 index e8639fa..0000000 --- a/src/third_party/QtDropbox/tests/tests.pro +++ /dev/null @@ -1,31 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2013-01-29T00:05:24 -# -#------------------------------------------------- - -QT += network testlib xml gui - -TARGET = qtdropboxtest -CONFIG += console -CONFIG -= app_bundle - -TEMPLATE = app - - -SOURCES += \ - qtdropboxtest.cpp -DEFINES += SRCDIR=\\\"$$PWD/\\\" - -HEADERS += \ - qtdropboxtest.hpp \ - keys.hpp \ - keys.hpp - -LIBS += -L../../build-qtdropbox-Desktop-Debug -INCLUDEPATH += ../src/ - -include(../libqtdropbox.pri) - -target.path = ../lib/ -INSTALLS += target From 72c3ab759312c26db62c37a9169b4c6e8419d69e Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Thu, 12 Jan 2017 21:35:33 +0100 Subject: [PATCH 6/6] fixing submodules part2 --- .gitmodules | 3 +++ src/third_party/QtDropbox | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 src/third_party/QtDropbox diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8dc9880 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/third_party/QtDropbox"] + path = src/third_party/QtDropbox + url = https://github.com/lycis/QtDropbox.git diff --git a/src/third_party/QtDropbox b/src/third_party/QtDropbox new file mode 160000 index 0000000..17ad007 --- /dev/null +++ b/src/third_party/QtDropbox @@ -0,0 +1 @@ +Subproject commit 17ad0070e8157fc973a3f3c47c676e73728c26d0