diff options
author | Alexander Tkachev | 2016-06-01 12:39:10 +0600 |
---|---|---|
committer | Alexander Tkachev | 2016-08-24 16:07:55 +0600 |
commit | a66322408f95ff7b29cf6967eaecaac06dfe5b31 (patch) | |
tree | a55a9390a3ab12566aec0478e633d30ae988103d /backends/networking/curl | |
parent | 4b3a8be0b9db448971e6095a24501c66714c484f (diff) | |
download | scummvm-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.cpp | 11 | ||||
-rw-r--r-- | backends/networking/curl/connectionmanager.h | 13 |
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. */ |