aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/cloud/onedrive/onedrivestorage.cpp43
-rw-r--r--backends/cloud/onedrive/onedrivestorage.h6
-rw-r--r--backends/networking/curl/connectionmanager.cpp2
-rw-r--r--backends/networking/curl/networkreadstream.cpp1
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());