diff options
Diffstat (limited to 'backends/networking/curl/connectionmanager.cpp')
-rw-r--r-- | backends/networking/curl/connectionmanager.cpp | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/backends/networking/curl/connectionmanager.cpp b/backends/networking/curl/connectionmanager.cpp index d34eab23e8..31e99f989c 100644 --- a/backends/networking/curl/connectionmanager.cpp +++ b/backends/networking/curl/connectionmanager.cpp @@ -25,11 +25,16 @@ #include "backends/networking/curl/connectionmanager.h" #include "backends/networking/curl/networkreadstream.h" #include "common/debug.h" +#include "common/system.h" +#include "common/timer.h" #include <curl/curl.h> +using Common::Singleton; + +DECLARE_SINGLETON(Networking::ConnectionManager); namespace Networking { -ConnectionManager::ConnectionManager(): _multi(0) { +ConnectionManager::ConnectionManager(): _multi(0), _timerStarted(false) { curl_global_init(CURL_GLOBAL_ALL); _multi = curl_multi_init(); } @@ -39,13 +44,57 @@ ConnectionManager::~ConnectionManager() { curl_global_cleanup(); } -NetworkReadStream *ConnectionManager::makeRequest(const char *url, curl_slist *headersList, Common::String postFields) { - NetworkReadStream *stream = new NetworkReadStream(url, headersList, postFields); - curl_multi_add_handle(_multi, stream->getEasyHandle()); - return stream; +void ConnectionManager::registerEasyHandle(CURL *easy) { + curl_multi_add_handle(_multi, easy); +} + +void ConnectionManager::addRequest(Request *request) { + _requests.push_back(request); + if (!_timerStarted) startTimer(); +} + +//private goes here: + +void connectionsThread(void *ignored) { + ConnMan.handle(); +} + +void ConnectionManager::startTimer(int interval) { + Common::TimerManager *manager = g_system->getTimerManager(); + if (manager->installTimerProc(connectionsThread, interval, 0, "Networking::ConnectionManager's Timer")) { + _timerStarted = true; + } else { + warning("Failed to install Networking::ConnectionManager's timer"); + } +} + +void ConnectionManager::stopTimer() { + Common::TimerManager *manager = g_system->getTimerManager(); + manager->removeTimerProc(connectionsThread); + _timerStarted = false; } void ConnectionManager::handle() { + //TODO: lock mutex here (in case another handle() would be called before this one ends) + interateRequests(); + processTransfers(); + //TODO: unlock mutex here +} + +void ConnectionManager::interateRequests() { + //call handle() of all running requests (so they can do their work) + debug("handler's here"); + for (Common::Array<Request *>::iterator i = _requests.begin(); i != _requests.end();) { + if ((*i)->handle()) { + delete (*i); + _requests.erase(i); + } else ++i; + } + if (_requests.empty()) stopTimer(); +} + +void ConnectionManager::processTransfers() { + //check libcurl's transfers and notify requests of messages from queue (transfer completion or failure) int transfersRunning; curl_multi_perform(_multi, &transfersRunning); @@ -59,9 +108,9 @@ void ConnectionManager::handle() { if (stream) stream->finished(); if (curlMsg->msg == CURLMSG_DONE) { - debug("ConnectionManager: SUCCESS (%d - %s)", curlMsg->data.result, curl_easy_strerror(curlMsg->data.result)); + debug("ConnectionManager: SUCCESS (%d - %s)", curlMsg->data.result, curl_easy_strerror(curlMsg->data.result)); } else { - debug("ConnectionManager: FAILURE (CURLMsg (%d))", curlMsg->msg); + debug("ConnectionManager: FAILURE (CURLMsg (%d))", curlMsg->msg); } curl_multi_remove_handle(_multi, easyHandle); |