Danbias/Code/Network/OysterNetworkServer/IServer.cpp

197 lines
2.8 KiB
C++
Raw Normal View History

#include "IServer.h"
2013-12-08 23:56:17 +01:00
#include "../NetworkDependencies/Listener.h"
#include "IClient.h"
#include "../NetworkDependencies/PostBox.h"
#include "../../Misc/Utilities.h"
#include "../../Misc/Thread/OysterThread.h"
2013-12-08 23:56:17 +01:00
using namespace Oyster::Network;
using namespace ::Server;
using namespace Utility::DynamicMemory;
using namespace Oyster::Thread;
2013-12-08 23:56:17 +01:00
/*************************************
PrivateData
*************************************/
struct IServer::PrivateData : public IThreadObject
{
2013-12-08 23:56:17 +01:00
PrivateData();
~PrivateData();
bool Init(INIT_DESC& initDesc);
bool Start();
bool Stop();
bool Shutdown();
void CheckForNewClient();
virtual bool DoWork();
2013-12-08 23:56:17 +01:00
//
IListener* listener;
INIT_DESC initDesc;
bool started;
//Postbox for new clients
IPostBox<int> *postBox;
//Server thread
OysterThread thread;
2013-12-08 23:56:17 +01:00
};
IServer::PrivateData::PrivateData()
{
listener = 0;
started = false;
postBox = new PostBox<int>;
2013-12-08 23:56:17 +01:00
}
2013-12-08 23:56:17 +01:00
IServer::PrivateData::~PrivateData()
{
Shutdown();
}
2013-12-08 23:56:17 +01:00
bool IServer::PrivateData::Init(INIT_DESC& initDesc)
{
//Check if it's a valid port
if(initDesc.port == 0)
{
return false;
}
this->initDesc = initDesc;
//Initiate listener
listener = new Listener(postBox);
2013-12-08 23:56:17 +01:00
((Listener*)listener)->Init(this->initDesc.port, false);
thread.Create(this, false);
2013-12-08 23:56:17 +01:00
return true;
}
bool IServer::PrivateData::Start()
{
2013-12-08 23:56:17 +01:00
//Start listener
((Listener*)listener)->Start();
started = true;
thread.Start();
2013-12-08 23:56:17 +01:00
return true;
}
bool IServer::PrivateData::Stop()
{
if(listener)
{
((Listener*)listener)->Stop();
}
started = false;
thread.Stop();
2013-12-08 23:56:17 +01:00
return true;
}
bool IServer::PrivateData::Shutdown()
{
//Stop server main thread
thread.Stop();
2013-12-08 23:56:17 +01:00
if(listener)
{
delete listener;
listener = NULL;
}
if(postBox)
{
delete postBox;
postBox = NULL;
}
2013-12-08 23:56:17 +01:00
started = false;
return true;
}
//Checks for new clients and sends them to the proc function.
void IServer::PrivateData::CheckForNewClient()
{
if(postBox->IsFull())
{
int clientSocketNum;
postBox->FetchMessage(clientSocketNum);
//Safety check that is probably not needed.
if(clientSocketNum == -1)
{
return;
}
//Create the new client
IClient* client = new IClient();
initDesc.proc(client);
}
}
bool IServer::PrivateData::DoWork()
{
CheckForNewClient();
return true;
}
2013-12-08 23:56:17 +01:00
/*************************************
IServer
*************************************/
IServer::IServer()
{
privateData = new PrivateData();
}
IServer::~IServer()
{
if(privateData)
{
delete privateData;
}
}
bool IServer::Init(INIT_DESC& initDesc)
{
2013-12-08 23:56:17 +01:00
privateData->Init(initDesc);
return true;
}
bool IServer::Start()
{
2013-12-08 23:56:17 +01:00
privateData->Start();
return true;
}
bool IServer::Stop()
{
2013-12-08 23:56:17 +01:00
privateData->Stop();
return true;
}
bool IServer::Shutdown()
{
2013-12-08 23:56:17 +01:00
privateData->Shutdown();
return true;
}
2013-12-08 23:56:17 +01:00
bool IServer::IsStarted() const
{
return privateData->started;
}