aboutsummaryrefslogtreecommitdiff
path: root/backends/networking/curl
diff options
context:
space:
mode:
authorAlexander Tkachev2016-06-01 12:39:10 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commita66322408f95ff7b29cf6967eaecaac06dfe5b31 (patch)
treea55a9390a3ab12566aec0478e633d30ae988103d /backends/networking/curl
parent4b3a8be0b9db448971e6095a24501c66714c484f (diff)
downloadscummvm-rg350-a66322408f95ff7b29cf6967eaecaac06dfe5b31.tar.gz
scummvm-rg350-a66322408f95ff7b29cf6967eaecaac06dfe5b31.tar.bz2
scummvm-rg350-a66322408f95ff7b29cf6967eaecaac06dfe5b31.zip
CLOUD: Implement Storage's isWorking()
It now keeps track of how many Requests are running. To achieve that, we had to pass a callback to ConnectionManager, so each Request has a callback paired with it. If that's one of Storage's Requests, it has a callback, which would decrease a counter. When Storage adds a Request, it also increases a counter and passes that callback. Callback is called by ConnMan when Request is deleted. isWorking() returns true if there is at least one Request running.
Diffstat (limited to 'backends/networking/curl')
-rw-r--r--backends/networking/curl/connectionmanager.cpp11
-rw-r--r--backends/networking/curl/connectionmanager.h13
2 files changed, 17 insertions, 7 deletions
diff --git a/backends/networking/curl/connectionmanager.cpp b/backends/networking/curl/connectionmanager.cpp
index 949dc949f1..ef3c858bec 100644
--- a/backends/networking/curl/connectionmanager.cpp
+++ b/backends/networking/curl/connectionmanager.cpp
@@ -51,8 +51,8 @@ void ConnectionManager::registerEasyHandle(CURL *easy) {
curl_multi_add_handle(_multi, easy);
}
-Request *ConnectionManager::addRequest(Request *request) {
- _requests.push_back(request);
+Request *ConnectionManager::addRequest(Request *request, RequestCallback callback) {
+ _requests.push_back(RequestWithCallback(request, callback));
if (!_timerStarted) startTimer();
return request;
}
@@ -89,10 +89,11 @@ void ConnectionManager::handle() {
void ConnectionManager::interateRequests() {
//call handle() of all running requests (so they can do their work)
debug("handling %d request(s)", _requests.size());
- for (Common::Array<Request *>::iterator i = _requests.begin(); i != _requests.end();) {
- Request *request = *i;
+ for (Common::Array<RequestWithCallback>::iterator i = _requests.begin(); i != _requests.end();) {
+ Request *request = i->request;
if (!request || request->state() == FINISHED) {
- delete (*i);
+ delete (i->request);
+ if (i->callback) (*i->callback)(i->request); //that's not a mistake (we're passing an address and that method knows there is no object anymore)
_requests.erase(i);
continue;
}
diff --git a/backends/networking/curl/connectionmanager.h b/backends/networking/curl/connectionmanager.h
index c632fa54ef..b39a779558 100644
--- a/backends/networking/curl/connectionmanager.h
+++ b/backends/networking/curl/connectionmanager.h
@@ -39,9 +39,18 @@ class NetworkReadStream;
class ConnectionManager : public Common::Singleton<ConnectionManager> {
friend void connectionsThread(void *); //calls handle()
+ typedef Common::BaseCallback<Request *> *RequestCallback;
+
+ struct RequestWithCallback { //I'm completely out of ideas
+ Request *request;
+ RequestCallback callback;
+
+ RequestWithCallback(Request *rq = nullptr, RequestCallback cb = nullptr): request(rq), callback(cb) {}
+ };
+
CURLM *_multi;
bool _timerStarted;
- Common::Array<Request *> _requests;
+ Common::Array<RequestWithCallback> _requests;
void startTimer(int interval = 1000000); //1 second is the default interval
void stopTimer();
@@ -71,7 +80,7 @@ public:
*
* @return the same Request pointer, just as a shortcut
*/
- Request *addRequest(Request *request);
+ Request *addRequest(Request *request, RequestCallback callback = nullptr);
};
/** Shortcut for accessing the connection manager. */