aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorAlexander Tkachev2016-05-16 01:05:40 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commit9c22b7cc64a3bd074f7cec012bd2f29f210d4ccf (patch)
treeacadc794ca373710e6e6a69d23867feb03f19c50 /backends
parent01abba4f1dc9febbe99a4af6af19eb2afa3f618a (diff)
downloadscummvm-rg350-9c22b7cc64a3bd074f7cec012bd2f29f210d4ccf.tar.gz
scummvm-rg350-9c22b7cc64a3bd074f7cec012bd2f29f210d4ccf.tar.bz2
scummvm-rg350-9c22b7cc64a3bd074f7cec012bd2f29f210d4ccf.zip
CLOUD: Rewrite NetworkReadStream
Now it is based on MemoryReadWriteStream, which is introduced by this commit. This stream is using ring buffer and is dynamically increasing its size when necessary.
Diffstat (limited to 'backends')
-rw-r--r--backends/cloud/dropbox/curlrequest.cpp4
-rw-r--r--backends/cloud/dropbox/curlrequest.h9
-rw-r--r--backends/cloud/request.h4
-rw-r--r--backends/cloud/storage.h4
-rw-r--r--backends/module.mk10
-rw-r--r--backends/networking/curl/connectionmanager.cpp (renamed from backends/cloud/curl/connectionmanager.cpp)11
-rw-r--r--backends/networking/curl/connectionmanager.h (renamed from backends/cloud/curl/connectionmanager.h)6
-rw-r--r--backends/networking/curl/networkreadstream.cpp (renamed from backends/cloud/curl/networkreadstream.cpp)23
-rw-r--r--backends/networking/curl/networkreadstream.h (renamed from backends/cloud/curl/networkreadstream.h)11
9 files changed, 36 insertions, 46 deletions
diff --git a/backends/cloud/dropbox/curlrequest.cpp b/backends/cloud/dropbox/curlrequest.cpp
index 1dfdd9e25f..ecc868cb51 100644
--- a/backends/cloud/dropbox/curlrequest.cpp
+++ b/backends/cloud/dropbox/curlrequest.cpp
@@ -23,7 +23,7 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "backends/cloud/dropbox/curlrequest.h"
-#include "backends/cloud/curl/networkreadstream.h"
+#include "backends/networking/curl/networkreadstream.h"
#include "common/debug.h"
#include <curl/curl.h>
@@ -38,7 +38,7 @@ CurlRequest::~CurlRequest() {
if (_stream) delete _stream;
}
-bool CurlRequest::handle(ConnectionManager& manager) {
+bool CurlRequest::handle(Networking::ConnectionManager &manager) {
if (_firstTime) {
_stream = manager.makeRequest(_url);
_firstTime = false;
diff --git a/backends/cloud/dropbox/curlrequest.h b/backends/cloud/dropbox/curlrequest.h
index 2c8ab6b8f8..3d5d4adb72 100644
--- a/backends/cloud/dropbox/curlrequest.h
+++ b/backends/cloud/dropbox/curlrequest.h
@@ -25,22 +25,23 @@
#include "backends/cloud/request.h"
-namespace Cloud {
-
+namespace Networking {
class NetworkReadStream;
+}
+namespace Cloud {
namespace Dropbox {
class CurlRequest : public Cloud::Request {
bool _firstTime;
const char *_url;
- NetworkReadStream *_stream;
+ Networking::NetworkReadStream *_stream;
public:
CurlRequest(Callback cb, const char *url);
virtual ~CurlRequest();
- virtual bool handle(ConnectionManager& manager);
+ virtual bool handle(Networking::ConnectionManager &manager);
};
} //end of namespace Dropbox
diff --git a/backends/cloud/request.h b/backends/cloud/request.h
index b4f5ccab0b..d85a68d570 100644
--- a/backends/cloud/request.h
+++ b/backends/cloud/request.h
@@ -23,7 +23,7 @@
#ifndef BACKENDS_CLOUD_REQUEST_H
#define BACKENDS_CLOUD_REQUEST_H
-#include "backends/cloud/curl/connectionmanager.h"
+#include "backends/networking/curl/connectionmanager.h"
namespace Cloud {
@@ -47,7 +47,7 @@ public:
* @return true if request's work is complete and it may be removed from Storage's list
*/
- virtual bool handle(ConnectionManager& manager) = 0;
+ virtual bool handle(Networking::ConnectionManager &manager) = 0;
};
} //end of namespace Cloud
diff --git a/backends/cloud/storage.h b/backends/cloud/storage.h
index 0949ff8505..84b6157a22 100644
--- a/backends/cloud/storage.h
+++ b/backends/cloud/storage.h
@@ -26,7 +26,7 @@
#include "common/str.h"
#include "common/array.h"
#include "backends/cloud/request.h"
-#include "backends/cloud/curl/connectionmanager.h"
+#include "backends/networking/curl/connectionmanager.h"
namespace Cloud {
@@ -36,7 +36,7 @@ class Storage {
protected:
Common::Array<Request *> _requests;
- ConnectionManager _connectionManager;
+ Networking::ConnectionManager _connectionManager;
virtual void addRequest(Request *request); //starts the timer if it's not started
virtual void handler();
diff --git a/backends/module.mk b/backends/module.mk
index cf100892f5..0be8ef90a5 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -24,9 +24,13 @@ MODULE_OBJS += \
cloud/manager.o \
cloud/storage.o \
cloud/dropbox/dropboxstorage.o \
- cloud/dropbox/curlrequest.o \
- cloud/curl/connectionmanager.o \
- cloud/curl/networkreadstream.o
+ cloud/dropbox/curlrequest.o
+endif
+
+ifdef USE_LIBCURL
+MODULE_OBJS += \
+ networking/curl/connectionmanager.o \
+ networking/curl/networkreadstream.o
endif
ifdef USE_ELF_LOADER
diff --git a/backends/cloud/curl/connectionmanager.cpp b/backends/networking/curl/connectionmanager.cpp
index d0a0ad8b5c..b7b7112c7f 100644
--- a/backends/cloud/curl/connectionmanager.cpp
+++ b/backends/networking/curl/connectionmanager.cpp
@@ -22,12 +22,12 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL
-#include "backends/cloud/curl/connectionmanager.h"
-#include "backends/cloud/curl/networkreadstream.h"
+#include "backends/networking/curl/connectionmanager.h"
+#include "backends/networking/curl/networkreadstream.h"
#include "common/debug.h"
#include <curl/curl.h>
-namespace Cloud {
+namespace Networking {
ConnectionManager::ConnectionManager(): _multi(0) {
curl_global_init(CURL_GLOBAL_ALL);
@@ -60,9 +60,8 @@ void ConnectionManager::handle() {
if (stream) stream->done();
debug("ConnectionManager: SUCCESS (%d - %s)", curlMsg->data.result, curl_easy_strerror(curlMsg->data.result));
- curl_multi_remove_handle(_multi, e);
- }
- else {
+ curl_multi_remove_handle(_multi, e);
+ } else {
debug("ConnectionManager: FAILURE (CURLMsg (%d))", curlMsg->msg);
//TODO: notify stream on this case also
}
diff --git a/backends/cloud/curl/connectionmanager.h b/backends/networking/curl/connectionmanager.h
index 0ea27201f2..fadcdf1372 100644
--- a/backends/cloud/curl/connectionmanager.h
+++ b/backends/networking/curl/connectionmanager.h
@@ -20,14 +20,14 @@
*
*/
-#ifndef BACKENDS_CLOUD_CURL_CONNECTIONMANAGER_H
-#define BACKENDS_CLOUD_CURL_CONNECTIONMANAGER_H
+#ifndef BACKENDS_NETWORKING_CURL_CONNECTIONMANAGER_H
+#define BACKENDS_NETWORKING_CURL_CONNECTIONMANAGER_H
#include "common/str.h"
typedef void CURLM;
-namespace Cloud {
+namespace Networking {
class NetworkReadStream;
diff --git a/backends/cloud/curl/networkreadstream.cpp b/backends/networking/curl/networkreadstream.cpp
index 8adac67569..5049ae507b 100644
--- a/backends/cloud/curl/networkreadstream.cpp
+++ b/backends/networking/curl/networkreadstream.cpp
@@ -22,15 +22,15 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL
-#include "backends/cloud/curl/networkreadstream.h"
+#include "backends/networking/curl/networkreadstream.h"
#include "common/debug.h"
#include <curl/curl.h>
-namespace Cloud {
+namespace Networking {
static size_t curlDataCallback(char *d, size_t n, size_t l, void *p) {
NetworkReadStream *stream = (NetworkReadStream *)p;
- if (stream) return stream->dataCallback(d, n, l);
+ if (stream) return stream->write(d, n*l);
return 0;
}
@@ -53,18 +53,13 @@ bool NetworkReadStream::eos() const {
}
uint32 NetworkReadStream::read(void *dataPtr, uint32 dataSize) {
- uint32 available = _bytes.size();
+ uint32 actuallyRead = MemoryReadWriteStream::read(dataPtr, dataSize);
- if (available == 0) {
+ if (actuallyRead == 0) {
if (_requestComplete) _eos = true;
return 0;
}
- char *data = (char *)dataPtr;
- uint32 actuallyRead = (dataSize < available ? dataSize : available);
- for (uint32 i = 0; i < actuallyRead; ++i) data[i] = _bytes[i];
- data[actuallyRead] = 0;
- _bytes.erase(0, actuallyRead);
return actuallyRead;
}
@@ -72,12 +67,4 @@ void NetworkReadStream::done() {
_requestComplete = true;
}
-size_t NetworkReadStream::dataCallback(char *d, size_t n, size_t l) {
- //TODO: return CURL_WRITEFUNC_PAUSE if _bytes is too long
- //TODO: remember https://curl.haxx.se/libcurl/c/curl_easy_pause.html (Memory Use / compressed data case)
- //TODO: if using pause, don't forget to unpause it somehow from read() up there
- _bytes += Common::String(d, n*l);
- return n*l;
-}
-
} //end of namespace Cloud
diff --git a/backends/cloud/curl/networkreadstream.h b/backends/networking/curl/networkreadstream.h
index e469784e28..9c7d8f83b6 100644
--- a/backends/cloud/curl/networkreadstream.h
+++ b/backends/networking/curl/networkreadstream.h
@@ -20,20 +20,20 @@
*
*/
-#ifndef BACKENDS_CLOUD_CURL_NETWORKREADSTREAM_H
-#define BACKENDS_CLOUD_CURL_NETWORKREADSTREAM_H
+#ifndef BACKENDS_NETWORKING_CURL_NETWORKREADSTREAM_H
+#define BACKENDS_NETWORKING_CURL_NETWORKREADSTREAM_H
+#include "common/memstream.h"
#include "common/stream.h"
#include "common/str.h"
typedef void CURL;
-namespace Cloud {
+namespace Networking {
-class NetworkReadStream: public Common::ReadStream {
+class NetworkReadStream: public Common::MemoryReadWriteStream {
CURL *_easy;
bool _eos, _requestComplete;
- Common::String _bytes;
public:
NetworkReadStream(const char *url);
@@ -68,7 +68,6 @@ public:
virtual uint32 read(void *dataPtr, uint32 dataSize);
void done();
- size_t dataCallback(char *d, size_t n, size_t l);
};
} //end of namespace Cloud