2016-05-15 11:22:35 +06:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2016-05-16 01:05:40 +06:00
|
|
|
#ifndef BACKENDS_NETWORKING_CURL_CONNECTIONMANAGER_H
|
|
|
|
#define BACKENDS_NETWORKING_CURL_CONNECTIONMANAGER_H
|
2016-05-15 11:22:35 +06:00
|
|
|
|
2016-05-18 15:21:09 +06:00
|
|
|
#include "backends/networking/curl/request.h"
|
2016-05-15 11:22:35 +06:00
|
|
|
#include "common/str.h"
|
2016-05-18 15:21:09 +06:00
|
|
|
#include "common/singleton.h"
|
2016-05-26 17:12:40 +06:00
|
|
|
#include "common/hashmap.h"
|
2016-06-01 14:07:50 +06:00
|
|
|
#include "common/mutex.h"
|
2016-05-15 11:22:35 +06:00
|
|
|
|
2016-05-18 15:21:09 +06:00
|
|
|
typedef void CURL;
|
2016-05-15 11:22:35 +06:00
|
|
|
typedef void CURLM;
|
2016-05-18 14:08:05 +06:00
|
|
|
struct curl_slist;
|
2016-05-15 11:22:35 +06:00
|
|
|
|
2016-05-16 01:05:40 +06:00
|
|
|
namespace Networking {
|
2016-05-15 11:22:35 +06:00
|
|
|
|
|
|
|
class NetworkReadStream;
|
|
|
|
|
2016-05-18 15:21:09 +06:00
|
|
|
class ConnectionManager : public Common::Singleton<ConnectionManager> {
|
|
|
|
friend void connectionsThread(void *); //calls handle()
|
|
|
|
|
2016-06-01 12:39:10 +06:00
|
|
|
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) {}
|
|
|
|
};
|
|
|
|
|
2016-05-18 15:21:09 +06:00
|
|
|
CURLM *_multi;
|
|
|
|
bool _timerStarted;
|
2016-06-01 12:39:10 +06:00
|
|
|
Common::Array<RequestWithCallback> _requests;
|
2016-06-01 14:07:50 +06:00
|
|
|
Common::Mutex _handleMutex;
|
2016-05-18 15:21:09 +06:00
|
|
|
|
|
|
|
void startTimer(int interval = 1000000); //1 second is the default interval
|
|
|
|
void stopTimer();
|
|
|
|
void handle();
|
|
|
|
void interateRequests();
|
|
|
|
void processTransfers();
|
2016-05-15 11:22:35 +06:00
|
|
|
|
|
|
|
public:
|
|
|
|
ConnectionManager();
|
|
|
|
virtual ~ConnectionManager();
|
|
|
|
|
2016-05-18 15:21:09 +06:00
|
|
|
/**
|
2016-05-28 20:10:38 +02:00
|
|
|
* All libcurl transfers are going through this ConnectionManager.
|
|
|
|
* So, if you want to start any libcurl transfer, you must create
|
|
|
|
* an easy handle and register it using this method.
|
|
|
|
*/
|
2016-05-18 15:21:09 +06:00
|
|
|
void registerEasyHandle(CURL *easy);
|
|
|
|
|
|
|
|
/**
|
2016-05-28 20:10:38 +02:00
|
|
|
* Use this method to add new Request into manager's queue.
|
|
|
|
* Manager will periodically call handle() method of these
|
|
|
|
* Requests until they set their state to FINISHED.
|
|
|
|
*
|
|
|
|
* If Request's state is RETRY, handleRetry() is called instead.
|
|
|
|
*
|
|
|
|
* @note This method starts the timer if it's not started yet.
|
|
|
|
*
|
|
|
|
* @return the same Request pointer, just as a shortcut
|
|
|
|
*/
|
2016-06-01 12:39:10 +06:00
|
|
|
Request *addRequest(Request *request, RequestCallback callback = nullptr);
|
2016-05-15 11:22:35 +06:00
|
|
|
};
|
|
|
|
|
2016-05-18 15:21:09 +06:00
|
|
|
/** Shortcut for accessing the connection manager. */
|
|
|
|
#define ConnMan Networking::ConnectionManager::instance()
|
|
|
|
|
2016-05-28 20:10:38 +02:00
|
|
|
} // End of namespace Networking
|
2016-05-15 11:22:35 +06:00
|
|
|
|
|
|
|
#endif
|