diff options
-rw-r--r-- | backends/cloud/onedrive/onedrivestorage.cpp | 43 | ||||
-rw-r--r-- | backends/cloud/onedrive/onedrivestorage.h | 6 | ||||
-rw-r--r-- | backends/networking/curl/connectionmanager.cpp | 2 | ||||
-rw-r--r-- | backends/networking/curl/networkreadstream.cpp | 1 |
4 files changed, 42 insertions, 10 deletions
diff --git a/backends/cloud/onedrive/onedrivestorage.cpp b/backends/cloud/onedrive/onedrivestorage.cpp index 6f91cadd37..877a1d27d1 100644 --- a/backends/cloud/onedrive/onedrivestorage.cpp +++ b/backends/cloud/onedrive/onedrivestorage.cpp @@ -22,16 +22,17 @@ #define FORBIDDEN_SYMBOL_ALLOW_ALL #include "backends/cloud/onedrive/onedrivestorage.h" +#include "backends/cloud/onedrive/onedrivetokenrefresher.h" +#include "backends/cloud/downloadrequest.h" #include "backends/networking/curl/connectionmanager.h" #include "backends/networking/curl/curljsonrequest.h" +#include "common/cloudmanager.h" #include "common/config-manager.h" #include "common/debug.h" +#include "common/file.h" #include "common/json.h" -#include <curl/curl.h> -#include <common/file.h> #include "common/system.h" -#include "common/cloudmanager.h" -#include "onedrivetokenrefresher.h" +#include <curl/curl.h> namespace Cloud { namespace OneDrive { @@ -125,12 +126,42 @@ void OneDriveStorage::printJson(Networking::RequestJsonPair pair) { delete json; } +Networking::NetworkReadStream *OneDriveStorage::streamFile(Common::String path) { + Common::String url = "https://api.onedrive.com/v1.0/drive/special/approot:/" + path + ":/content"; + //NOT USING OneDriveTokenRefresher, because it's CurlJsonRequest, which saves all contents in memory to parse as JSON + //we actually don't even need a token if the download is "pre-authenticated" (whatever it means) + //still, we'd have to know direct URL (might be found in Item's "@content.downloadUrl", received from the server) + Networking::CurlRequest *request = new Networking::CurlRequest(0, url.c_str()); + request->addHeader("Authorization: Bearer " + _token); + return request->execute(); +} + +int32 OneDriveStorage::download(Common::String remotePath, Common::String localPath, BoolCallback callback) { + Common::DumpFile *f = new Common::DumpFile(); + if (!f->open(localPath, true)) { + warning("OneDriveStorage: unable to open file to download into"); + if (callback) (*callback)(RequestBoolPair(-1, false)); + delete f; + return -1; + } + + return ConnMan.addRequest(new DownloadRequest(callback, streamFile(remotePath), f)); +} + +void OneDriveStorage::fileDownloaded(RequestBoolPair pair) { + if (pair.value) debug("file downloaded!"); + else debug("download failed!"); +} + int32 OneDriveStorage::syncSaves(BoolCallback callback) { - //this is not the real syncSaves() implementation + //this is not the real syncSaves() implementation + /* Networking::JsonCallback innerCallback = new Common::Callback<OneDriveStorage, Networking::RequestJsonPair>(this, &OneDriveStorage::printJson); - Networking::CurlJsonRequest *request = new OneDriveTokenRefresher(this, innerCallback, "https://api.onedrive.com/v1.0/drives/"); + Networking::CurlJsonRequest *request = new OneDriveTokenRefresher(this, innerCallback, "https://api.onedrive.com/v1.0/drive/special/approot"); request->addHeader("Authorization: bearer " + _token); return ConnMan.addRequest(request); + */ + return download("pic.jpg", "local/onedrive/2/doom.jpg", new Common::Callback<OneDriveStorage, RequestBoolPair>(this, &OneDriveStorage::fileDownloaded)); } OneDriveStorage *OneDriveStorage::loadFromConfig(Common::String keyPrefix) { diff --git a/backends/cloud/onedrive/onedrivestorage.h b/backends/cloud/onedrive/onedrivestorage.h index e120691a08..391cabe02a 100644 --- a/backends/cloud/onedrive/onedrivestorage.h +++ b/backends/cloud/onedrive/onedrivestorage.h @@ -48,7 +48,7 @@ class OneDriveStorage: public Cloud::Storage { void codeFlowComplete(RequestBoolPair pair); void printJson(Networking::RequestJsonPair pair); - void printJsonTokenReceived(RequestBoolPair pair); + void fileDownloaded(RequestBoolPair pair); public: virtual ~OneDriveStorage(); @@ -75,10 +75,10 @@ public: virtual int32 upload(Common::String path, Common::ReadStream *contents, BoolCallback callback) { return -1; } //TODO /** Returns pointer to Networking::NetworkReadStream. */ - virtual Networking::NetworkReadStream *streamFile(Common::String path) { return 0; } //TODO + virtual int32 streamFile(Common::String path); /** Calls the callback when finished. */ - virtual int32 download(Common::String remotePath, Common::String localPath, BoolCallback callback) { return -1; } //TODO + virtual int32 download(Common::String remotePath, Common::String localPath, BoolCallback callback); /** Calls the callback when finished. */ virtual int32 remove(Common::String path, BoolCallback callback) { return -1; } //TODO diff --git a/backends/networking/curl/connectionmanager.cpp b/backends/networking/curl/connectionmanager.cpp index 77a46ec518..9d88c59b25 100644 --- a/backends/networking/curl/connectionmanager.cpp +++ b/backends/networking/curl/connectionmanager.cpp @@ -34,7 +34,7 @@ DECLARE_SINGLETON(Networking::ConnectionManager); namespace Networking { -ConnectionManager::ConnectionManager(): _multi(0), _timerStarted(false) { +ConnectionManager::ConnectionManager(): _multi(0), _timerStarted(false), _nextId(0) { curl_global_init(CURL_GLOBAL_ALL); _multi = curl_multi_init(); } diff --git a/backends/networking/curl/networkreadstream.cpp b/backends/networking/curl/networkreadstream.cpp index 9a196b92d2..39316deb7c 100644 --- a/backends/networking/curl/networkreadstream.cpp +++ b/backends/networking/curl/networkreadstream.cpp @@ -45,6 +45,7 @@ NetworkReadStream::NetworkReadStream(const char *url, curl_slist *headersList, C curl_easy_setopt(_easy, CURLOPT_HEADER, 0L); curl_easy_setopt(_easy, CURLOPT_URL, url); curl_easy_setopt(_easy, CURLOPT_VERBOSE, 0L); + curl_easy_setopt(_easy, CURLOPT_FOLLOWLOCATION, 1L); //probably it's OK to have it always on curl_easy_setopt(_easy, CURLOPT_HTTPHEADER, headersList); if (postFields.size() != 0) { curl_easy_setopt(_easy, CURLOPT_POSTFIELDSIZE, postFields.size()); |