creating inherited singletons
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/hilnius@12887 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -6,9 +6,12 @@
|
||||
|
||||
class ClientNetworkManager : public NetworkManager
|
||||
{
|
||||
friend class Singleton<NetworkManager>;
|
||||
public:
|
||||
ClientNetworkManager();
|
||||
virtual ~ClientNetworkManager();
|
||||
static ClientNetworkManager* getInstance()
|
||||
{
|
||||
return Singleton<NetworkManager>::getInstance<ClientNetworkManager>();
|
||||
}
|
||||
|
||||
virtual void run();
|
||||
|
||||
@@ -18,7 +21,8 @@ class ClientNetworkManager : public NetworkManager
|
||||
virtual void sendPacket(char* data);
|
||||
|
||||
protected:
|
||||
|
||||
ClientNetworkManager();
|
||||
virtual ~ClientNetworkManager();
|
||||
};
|
||||
|
||||
#endif // CLIENT_NETWORK_MANAGER_HPP
|
||||
|
||||
@@ -17,6 +17,7 @@ using namespace std;
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
HTTP::init();
|
||||
|
||||
std::string answer;
|
||||
@@ -25,6 +26,8 @@ int main()
|
||||
cin >> answer;
|
||||
if (answer == "client")
|
||||
{
|
||||
ClientNetworkManager::getInstance();
|
||||
NetworkManager::getInstance()->packetReceived("test");
|
||||
/// NICKNAME :
|
||||
std::string nickname;
|
||||
cout << "Nickname=";
|
||||
|
||||
@@ -2,17 +2,8 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
NetworkManager* NetworkManager::instance = NULL;
|
||||
|
||||
NetworkManager::NetworkManager()
|
||||
{
|
||||
if (NetworkManager::instance)
|
||||
{
|
||||
printf("Warning : a Newtork Manager is being deleted.\n");
|
||||
delete NetworkManager::instance;
|
||||
}
|
||||
NetworkManager::instance = this;
|
||||
printf("New Network Manager created.\n");
|
||||
}
|
||||
|
||||
NetworkManager::~NetworkManager()
|
||||
@@ -26,17 +17,12 @@ void NetworkManager::run()
|
||||
void NetworkManager::setManualSocketsMode(bool manual)
|
||||
{
|
||||
if (manual)
|
||||
instance->getHost()->stopListening();
|
||||
m_localhost->stopListening();
|
||||
else
|
||||
instance->getHost()->startListening();
|
||||
}
|
||||
|
||||
void NetworkManager::receptionCallback(char* data)
|
||||
{
|
||||
instance->packetReceived(data);
|
||||
m_localhost->startListening();
|
||||
}
|
||||
|
||||
STKHost* NetworkManager::getHost()
|
||||
{
|
||||
return instance->m_localhost;
|
||||
return m_localhost;
|
||||
}
|
||||
|
||||
@@ -6,28 +6,24 @@
|
||||
#include <vector>
|
||||
|
||||
#include "protocol_manager.hpp"
|
||||
#include "callback_object.hpp"
|
||||
#include "singleton.hpp"
|
||||
|
||||
class NetworkManager : public CallbackObject
|
||||
class NetworkManager : public Singleton<NetworkManager>
|
||||
{
|
||||
friend class Singleton<NetworkManager>;
|
||||
public:
|
||||
virtual void run() = 0;
|
||||
|
||||
virtual void setManualSocketsMode(bool manual);
|
||||
virtual void packetReceived(char* data) = 0;
|
||||
|
||||
STKHost* getHost();
|
||||
protected:
|
||||
NetworkManager();
|
||||
virtual ~NetworkManager();
|
||||
|
||||
virtual void run() = 0;
|
||||
|
||||
static void setManualSocketsMode(bool manual);
|
||||
static void sendRawPacket(uint8_t* data, int length, unsigned int dstIp, unsigned short dstPort);
|
||||
|
||||
static void receptionCallback(char* data);
|
||||
virtual void packetReceived(char* data) = 0;
|
||||
|
||||
static STKHost* getHost();
|
||||
protected:
|
||||
std::vector<STKPeer*> m_peers;
|
||||
STKHost* m_localhost;
|
||||
|
||||
static NetworkManager* instance;
|
||||
};
|
||||
|
||||
#endif // NETWORKMANAGER_HPP
|
||||
|
||||
@@ -24,8 +24,10 @@ class ProtocolManager : public Singleton<ProtocolManager>
|
||||
uint32_t id;
|
||||
} ProtocolInfo;
|
||||
public:
|
||||
ProtocolManager();
|
||||
virtual ~ProtocolManager();
|
||||
static ProtocolManager* getInstance()
|
||||
{
|
||||
return Singleton<ProtocolManager>::getInstance<ProtocolManager>();
|
||||
}
|
||||
|
||||
virtual void messageReceived(uint8_t* data);
|
||||
|
||||
@@ -41,8 +43,12 @@ class ProtocolManager : public Singleton<ProtocolManager>
|
||||
virtual PROTOCOL_STATE getProtocolState(uint32_t id);
|
||||
|
||||
protected:
|
||||
// protected functions
|
||||
ProtocolManager();
|
||||
virtual ~ProtocolManager();
|
||||
void assignProtocolId(ProtocolInfo& protocolInfo);
|
||||
|
||||
|
||||
// protected members
|
||||
std::vector<ProtocolInfo> m_protocols;
|
||||
std::vector<uint8_t*> m_messagesToProcess;
|
||||
};
|
||||
|
||||
@@ -98,8 +98,6 @@ void ConnectToServer::update()
|
||||
else if (m_state == PEER_ADDRESS_RETREIVED)
|
||||
{
|
||||
// we know the distant address:port, just need to connect.
|
||||
ClientNetworkManager* networkManager = static_cast<ClientNetworkManager*>(m_callbackObject);
|
||||
networkManager->connect(m_serverIp, m_serverPort);
|
||||
m_state = CONNECTED;
|
||||
connected = true;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "get_public_address.hpp"
|
||||
|
||||
#include "../network_manager.hpp"
|
||||
#include "../client_network_manager.hpp"
|
||||
#include "connect_to_server.hpp"
|
||||
#include "../network_interface.hpp"
|
||||
|
||||
@@ -82,14 +83,14 @@ void GetPublicAddress::update()
|
||||
|
||||
printf("__GetPublicAddress> Querrying STUN server 132.177.123.6\n");
|
||||
unsigned int dst = (132<<24)+(177<<16)+(123<<8)+6;
|
||||
NetworkManager::setManualSocketsMode(true);
|
||||
NetworkManager::getHost()->sendRawPacket(bytes, 20, dst, 3478);
|
||||
ClientNetworkManager::getInstance()->setManualSocketsMode(true);
|
||||
ClientNetworkManager::getInstance()->getHost()->sendRawPacket(bytes, 20, dst, 3478);
|
||||
m_state = TEST_SENT;
|
||||
}
|
||||
if (m_state == TEST_SENT)
|
||||
{
|
||||
unsigned int dst = (132<<24)+(177<<16)+(123<<8)+6;
|
||||
uint8_t* data = NetworkManager::getHost()->receiveRawPacket(dst, 3478);
|
||||
uint8_t* data = ClientNetworkManager::getInstance()->getHost()->receiveRawPacket(dst, 3478);
|
||||
assert(data);
|
||||
|
||||
// check that the stun response is a response, contains the magic cookie and the transaction ID
|
||||
@@ -167,7 +168,7 @@ void GetPublicAddress::update()
|
||||
{
|
||||
printf("__The public address has been found : %i.%i.%i.%i:%i\n", address>>24&0xff, address>>16&0xff, address>>8&0xff, address&0xff, port);
|
||||
m_state = ADDRESS_KNOWN;
|
||||
NetworkManager::setManualSocketsMode(false);
|
||||
ClientNetworkManager::getInstance()->setManualSocketsMode(false);
|
||||
TransportAddress* addr = static_cast<TransportAddress*>(m_callbackObject);
|
||||
addr->ip = address;
|
||||
addr->port = port;
|
||||
|
||||
@@ -6,9 +6,12 @@
|
||||
|
||||
class ServerNetworkManager : public NetworkManager
|
||||
{
|
||||
friend class Singleton<NetworkManager>;
|
||||
public:
|
||||
ServerNetworkManager();
|
||||
virtual ~ServerNetworkManager();
|
||||
static ServerNetworkManager* getInstance()
|
||||
{
|
||||
return Singleton<NetworkManager>::getInstance<ServerNetworkManager>();
|
||||
}
|
||||
|
||||
virtual void run();
|
||||
|
||||
@@ -17,6 +20,8 @@ class ServerNetworkManager : public NetworkManager
|
||||
virtual void packetReceived(char* data);
|
||||
virtual void sendPacket(char* data);
|
||||
protected:
|
||||
ServerNetworkManager();
|
||||
virtual ~ServerNetworkManager();
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -8,20 +8,26 @@ class Singleton
|
||||
{
|
||||
protected:
|
||||
Singleton () { }
|
||||
~Singleton () { std::cout << "destroying singleton." << std::endl; }
|
||||
virtual ~Singleton () { std::cout << "destroying singleton." << std::endl; delete m_singleton; }
|
||||
|
||||
public:
|
||||
static T *getInstance ()
|
||||
template<typename S>
|
||||
static S *getInstance ()
|
||||
{
|
||||
if (NULL == m_singleton)
|
||||
if (m_singleton == NULL)
|
||||
m_singleton = new S;
|
||||
|
||||
S* result = (dynamic_cast<S*> (m_singleton));
|
||||
if (result == NULL)
|
||||
{
|
||||
std::cout << "creating singleton." << std::endl;
|
||||
m_singleton = new T;
|
||||
std::cout << "BE CAREFUL : Reallocating singleton" << std::endl;
|
||||
m_singleton = new S;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
return (static_cast<T*> (m_singleton));
|
||||
return (dynamic_cast<S*> (m_singleton));
|
||||
}
|
||||
static T *getInstance()
|
||||
{
|
||||
return (dynamic_cast<T*> (m_singleton));
|
||||
}
|
||||
|
||||
static void kill ()
|
||||
|
||||
@@ -17,7 +17,7 @@ void* STKHost::receive_data(void* self)
|
||||
printf("message received\n");
|
||||
switch (event.type) {
|
||||
case ENET_EVENT_TYPE_RECEIVE:
|
||||
NetworkManager::receptionCallback((char*) event.packet->data);
|
||||
//NetworkManager::receptionCallback((char*) event.packet->data);
|
||||
break;
|
||||
case ENET_EVENT_TYPE_DISCONNECT:
|
||||
printf("Somebody is now disconnected.\n");
|
||||
|
||||
Reference in New Issue
Block a user