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:
hilnius
2013-06-19 14:01:25 +00:00
parent 6b1e1b94a5
commit 3d62fd1214
10 changed files with 60 additions and 55 deletions

View File

@@ -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

View File

@@ -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=";

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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;
};

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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();
};

View File

@@ -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 ()

View File

@@ -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");