aboutsummaryrefslogtreecommitdiff
path: root/backends/cloud
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/cloud
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/cloud')
-rw-r--r--backends/cloud/curl/connectionmanager.cpp72
-rw-r--r--backends/cloud/curl/connectionmanager.h47
-rw-r--r--backends/cloud/curl/networkreadstream.cpp83
-rw-r--r--backends/cloud/curl/networkreadstream.h76
-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
8 files changed, 11 insertions, 288 deletions
diff --git a/backends/cloud/curl/connectionmanager.cpp b/backends/cloud/curl/connectionmanager.cpp
deleted file mode 100644
index d0a0ad8b5c..0000000000
--- a/backends/cloud/curl/connectionmanager.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
-#include "backends/cloud/curl/connectionmanager.h"
-#include "backends/cloud/curl/networkreadstream.h"
-#include "common/debug.h"
-#include <curl/curl.h>
-
-namespace Cloud {
-
-ConnectionManager::ConnectionManager(): _multi(0) {
- curl_global_init(CURL_GLOBAL_ALL);
- _multi = curl_multi_init();
-}
-
-ConnectionManager::~ConnectionManager() {
- curl_multi_cleanup(_multi);
- curl_global_cleanup();
-}
-
-NetworkReadStream *ConnectionManager::makeRequest(const char *url) {
- NetworkReadStream *stream = new NetworkReadStream(url);
- curl_multi_add_handle(_multi, stream->getEasyHandle());
- return stream;
-}
-
-void ConnectionManager::handle() {
- int U;
- curl_multi_perform(_multi, &U);
-
- int Q;
- CURLMsg *curlMsg;
- while ((curlMsg = curl_multi_info_read(_multi, &Q))) {
- if (curlMsg->msg == CURLMSG_DONE) {
- CURL *e = curlMsg->easy_handle;
-
- NetworkReadStream *stream;
- curl_easy_getinfo(e, CURLINFO_PRIVATE, &stream);
- 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 {
- debug("ConnectionManager: FAILURE (CURLMsg (%d))", curlMsg->msg);
- //TODO: notify stream on this case also
- }
- }
-}
-
-} //end of namespace Cloud
diff --git a/backends/cloud/curl/connectionmanager.h b/backends/cloud/curl/connectionmanager.h
deleted file mode 100644
index 0ea27201f2..0000000000
--- a/backends/cloud/curl/connectionmanager.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#ifndef BACKENDS_CLOUD_CURL_CONNECTIONMANAGER_H
-#define BACKENDS_CLOUD_CURL_CONNECTIONMANAGER_H
-
-#include "common/str.h"
-
-typedef void CURLM;
-
-namespace Cloud {
-
-class NetworkReadStream;
-
-class ConnectionManager {
- CURLM *_multi;
-
-public:
- ConnectionManager();
- virtual ~ConnectionManager();
-
- NetworkReadStream *makeRequest(const char *url);
- void handle();
-};
-
-} //end of namespace Cloud
-
-#endif
diff --git a/backends/cloud/curl/networkreadstream.cpp b/backends/cloud/curl/networkreadstream.cpp
deleted file mode 100644
index 8adac67569..0000000000
--- a/backends/cloud/curl/networkreadstream.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
-#include "backends/cloud/curl/networkreadstream.h"
-#include "common/debug.h"
-#include <curl/curl.h>
-
-namespace Cloud {
-
-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);
- return 0;
-}
-
-NetworkReadStream::NetworkReadStream(const char *url): _easy(0), _eos(false), _requestComplete(false) {
- _easy = curl_easy_init();
- curl_easy_setopt(_easy, CURLOPT_WRITEFUNCTION, curlDataCallback);
- curl_easy_setopt(_easy, CURLOPT_WRITEDATA, this); //so callback can call us
- curl_easy_setopt(_easy, CURLOPT_PRIVATE, this); //so ConnectionManager can call us when request is complete
- curl_easy_setopt(_easy, CURLOPT_HEADER, 0L);
- curl_easy_setopt(_easy, CURLOPT_URL, url);
- curl_easy_setopt(_easy, CURLOPT_VERBOSE, 0L);
-}
-
-NetworkReadStream::~NetworkReadStream() {
- curl_easy_cleanup(_easy);
-}
-
-bool NetworkReadStream::eos() const {
- return _eos;
-}
-
-uint32 NetworkReadStream::read(void *dataPtr, uint32 dataSize) {
- uint32 available = _bytes.size();
-
- if (available == 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;
-}
-
-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/cloud/curl/networkreadstream.h
deleted file mode 100644
index e469784e28..0000000000
--- a/backends/cloud/curl/networkreadstream.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#ifndef BACKENDS_CLOUD_CURL_NETWORKREADSTREAM_H
-#define BACKENDS_CLOUD_CURL_NETWORKREADSTREAM_H
-
-#include "common/stream.h"
-#include "common/str.h"
-
-typedef void CURL;
-
-namespace Cloud {
-
-class NetworkReadStream: public Common::ReadStream {
- CURL *_easy;
- bool _eos, _requestComplete;
- Common::String _bytes;
-
-public:
- NetworkReadStream(const char *url);
- virtual ~NetworkReadStream();
-
- CURL *getEasyHandle() const { return _easy; }
-
- /**
- * Returns true if a read failed because the stream end has been reached.
- * This flag is cleared by clearErr().
- * For a SeekableReadStream, it is also cleared by a successful seek.
- *
- * @note The semantics of any implementation of this method are
- * supposed to match those of ISO C feof(). In particular, in a stream
- * with N bytes, reading exactly N bytes from the start should *not*
- * set eos; only reading *beyond* the available data should set it.
- */
- virtual bool eos() const;
-
- /**
- * Read data from the stream. Subclasses must implement this
- * method; all other read methods are implemented using it.
- *
- * @note The semantics of any implementation of this method are
- * supposed to match those of ISO C fread(), in particular where
- * it concerns setting error and end of file/stream flags.
- *
- * @param dataPtr pointer to a buffer into which the data is read
- * @param dataSize number of bytes to be read
- * @return the number of bytes which were actually read.
- */
- virtual uint32 read(void *dataPtr, uint32 dataSize);
-
- void done();
- size_t dataCallback(char *d, size_t n, size_t l);
-};
-
-} //end of namespace Cloud
-
-#endif
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();