aboutsummaryrefslogtreecommitdiff
path: root/backends/networking/curl/connectionmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/networking/curl/connectionmanager.cpp')
-rw-r--r--backends/networking/curl/connectionmanager.cpp63
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);