Danbias/Code/Network/NetworkAPI/NetworkSession.cpp

242 lines
4.8 KiB
C++
Raw Normal View History

2014-01-28 09:00:02 +01:00
/////////////////////////////////////////////////////////////////////
// Created by [Dennis Andersen] [2013]
/////////////////////////////////////////////////////////////////////
#include "NetworkSession.h"
#include "..\..\Misc\Utilities.h"
#include "..\..\Misc\DynamicArray.h"
#include "..\..\Misc\GID.h"
#include "CustomNetProtocol.h"
#include <vector>
#include <mutex>
2014-01-29 10:18:01 +01:00
using namespace Utility::DynamicMemory;
2014-01-28 09:00:02 +01:00
using namespace Oyster::Network;
struct NetworkSession::PrivateSessionData
{
NetworkClient::ClientEventFunction messageCallback;
std::mutex clientListLock;
NetworkSession* owner; //Where clients end up when session is closed.
int id;
NetworkSession::PrivateSessionData()
: owner(0)
2014-01-28 09:00:02 +01:00
, id(GID())
{}
};
NetworkSession::NetworkSession()
2014-01-29 10:18:01 +01:00
: data(new PrivateSessionData())
2014-01-28 09:00:02 +01:00
{}
NetworkSession::NetworkSession(const NetworkSession& orig)
{
this->clients = orig.clients;
2014-01-28 09:00:02 +01:00
this->data->owner = orig.data->owner;
this->clientCount = orig.clientCount;
2014-01-28 09:00:02 +01:00
this->data->id = orig.data->id;
this->data->messageCallback = orig.data->messageCallback;
}
const NetworkSession& NetworkSession::operator=(const NetworkSession& orig)
{
this->clients = orig.clients;
2014-01-28 09:00:02 +01:00
this->data->owner = orig.data->owner;
this->clientCount = orig.clientCount;
2014-01-28 09:00:02 +01:00
this->data->id = orig.data->id;
this->data->messageCallback = orig.data->messageCallback;
return *this;
}
NetworkSession::~NetworkSession()
{
this->clients.Clear();
this->clientCount = 0;
2014-01-28 09:00:02 +01:00
this->data->messageCallback = 0;
2014-01-29 10:18:01 +01:00
delete this->data;
this->data = 0;
2014-01-28 09:00:02 +01:00
}
void NetworkSession::ProcessClients()
{
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-28 09:00:02 +01:00
{
if(this->clients[i]) this->clients[i]->Update();
2014-01-28 09:00:02 +01:00
}
}
2014-01-29 10:18:01 +01:00
bool NetworkSession::Attach(NetClient client)
2014-01-28 09:00:02 +01:00
{
this->data->clientListLock.lock();
int k = -1;
for (unsigned int i = 0; (k == -1) && i < this->clients.Size(); i++)
2014-01-28 09:00:02 +01:00
{
if(!this->clients[i]->IsConnected()) //TODO: Dont check connection status, check more general status..
2014-01-28 09:00:02 +01:00
k = i;
}
if(k == -1)
{
this->clients.Push(client);
2014-01-28 09:00:02 +01:00
}
else
{
this->clients[k] = client;
2014-01-28 09:00:02 +01:00
}
this->clientCount++;
2014-01-28 09:00:02 +01:00
2014-01-29 10:18:01 +01:00
client->SetOwner(this);
2014-01-28 09:00:02 +01:00
this->data->clientListLock.unlock();
return true;
}
void NetworkSession::DetachAll()
2014-01-29 10:18:01 +01:00
{
if(this->data->owner)
{
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-29 10:18:01 +01:00
{
this->data->owner->Attach(this->clients[i]);
this->clients[i] = 0;
2014-01-29 10:18:01 +01:00
}
}
else
{
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-29 10:18:01 +01:00
{
this->clients[i]->Disconnect();
this->clients[i] = 0;
2014-01-29 10:18:01 +01:00
}
}
this->clientCount = 0;
2014-01-29 10:18:01 +01:00
}
NetClient NetworkSession::Detach(const NetworkClient* client)
2014-01-28 09:00:02 +01:00
{
2014-01-29 10:18:01 +01:00
NetClient val;
2014-01-28 09:00:02 +01:00
this->data->clientListLock.lock();
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-28 09:00:02 +01:00
{
if(this->clients[i] && this->clients[0]->GetID() == client->GetID())
2014-01-28 09:00:02 +01:00
{
val = this->clients[i];
this->clients[i] = 0;
this->clientCount--;
2014-01-28 09:00:02 +01:00
}
}
this->data->clientListLock.unlock();
return val;
}
2014-01-29 10:18:01 +01:00
NetClient NetworkSession::Detach(short ID)
2014-01-28 09:00:02 +01:00
{
2014-01-29 10:18:01 +01:00
NetClient val;
2014-01-28 09:00:02 +01:00
this->data->clientListLock.lock();
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-28 09:00:02 +01:00
{
if(this->clients[i] && this->clients[0]->GetID() == ID)
2014-01-28 09:00:02 +01:00
{
val = this->clients[i];
this->clients[i] = 0;
this->clientCount--;
}
}
this->data->clientListLock.unlock();
return val;
}
NetClient NetworkSession::Detach()
{
NetClient val;
this->data->clientListLock.lock();
for (unsigned int i = 0; i < this->clients.Size(); i++)
{
if(this->clients[i])
{
val = this->clients[i];
this->clients[i] = 0;
this->clientCount--;
break;
2014-01-28 09:00:02 +01:00
}
}
this->data->clientListLock.unlock();
return val;
}
bool NetworkSession::Send(Oyster::Network::CustomNetProtocol& protocol)
{
bool returnValue = false;
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-28 09:00:02 +01:00
{
if(this->clients[i])
2014-01-29 10:18:01 +01:00
{
this->clients[i]->Send(&protocol);
2014-01-29 10:18:01 +01:00
returnValue = true;
}
2014-01-28 09:00:02 +01:00
}
return returnValue;
}
bool NetworkSession::Send(Oyster::Network::CustomNetProtocol& protocol, int ID)
{
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-28 09:00:02 +01:00
{
if(this->clients[i] && this->clients[i]->GetID() == ID)
2014-01-28 09:00:02 +01:00
{
this->clients[i]->Send(&protocol);
2014-01-28 09:00:02 +01:00
return true;
}
}
return false;
}
void NetworkSession::CloseSession(bool dissconnectClients)
{
this->data->clientListLock.lock();
for (unsigned int i = 0; i < this->clients.Size(); i++)
2014-01-28 09:00:02 +01:00
{
if(this->clients[i])
2014-01-29 10:18:01 +01:00
{
if(dissconnectClients) this->clients[i]->Disconnect();
else if(this->data->owner) this->data->owner->Attach(this->clients[i]);
else this->clients[i]->Disconnect(); //Idiot check, clients have to go somewhere..
2014-01-29 10:18:01 +01:00
}
2014-01-28 09:00:02 +01:00
}
this->clients.Clear();
this->clientCount = 0;
2014-01-28 09:00:02 +01:00
this->data->clientListLock.unlock();
}
2014-01-29 10:18:01 +01:00
void NetworkSession::SetOwner(NetworkSession* owner)
{
this->data->owner = owner;
}
void NetworkSession::ClientConnectedEvent(NetClient client)
{
this->Attach(client);
}
2014-01-28 09:00:02 +01:00