diff options
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. */ |