c75d4c35f7
Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 855 git-svn-id: svn://10.65.10.50/trunk@15071 c028cbd2-c16b-5b4b-a496-9718f37d4682
282 lines
5.6 KiB
C++
Executable File
282 lines
5.6 KiB
C++
Executable File
#include "netutils.h"
|
|
|
|
TLanManager::TLanManager()
|
|
{ }
|
|
|
|
TLanManager::~TLanManager()
|
|
{
|
|
RemoveAllConnections();
|
|
}
|
|
|
|
TConnection* TLanManager::OnCreateConnection(CONNID id)
|
|
{
|
|
return new TConnection(this, id);
|
|
}
|
|
|
|
bool TLanManager::HasConnections() const
|
|
{
|
|
return m_mapConn.items() > 0;
|
|
}
|
|
|
|
|
|
bool TLanManager::Request(CONNID id, const char* cmd)
|
|
{
|
|
TConnection* conn = GetConnection(id) ;
|
|
return conn ? conn->Request(cmd) : false;
|
|
}
|
|
|
|
bool TLanManager::Execute(CONNID id, const char* cmd)
|
|
{
|
|
TConnection* conn = GetConnection(id) ;
|
|
return conn ? conn->Execute(cmd) : false;
|
|
}
|
|
|
|
// Physically disconnect
|
|
bool TLanManager::OnRemoveConnection(CONNID id)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
CONNID TLanManager::AddConnection(TConnection* pConn)
|
|
{
|
|
CONNID id = 0;
|
|
if (pConn)
|
|
{
|
|
id = pConn->Id();
|
|
TString16 key; key.format("%lu", id);
|
|
m_mapConn.add(key, pConn, true);
|
|
}
|
|
return id;
|
|
}
|
|
|
|
bool TLanManager::RemoveConnection(CONNID id)
|
|
{
|
|
TConnection* pConn = GetConnection(id);
|
|
bool ok = false;
|
|
if (pConn != NULL && OnRemoveConnection(id))
|
|
{
|
|
TString16 key; key.format("%lu", id);
|
|
m_mapConn.remove(key);
|
|
ok = true;
|
|
}
|
|
|
|
return ok;
|
|
}
|
|
|
|
void TLanManager::RemoveAllConnections()
|
|
{
|
|
m_mapConn.restart();
|
|
for (TConnection* pConn = (TConnection*)m_mapConn.get();
|
|
pConn != NULL; pConn = (TConnection*)m_mapConn.get())
|
|
OnRemoveConnection(pConn->Id());
|
|
m_mapConn.destroy();
|
|
}
|
|
|
|
TConnection* TLanManager::GetConnection(CONNID id) const
|
|
{
|
|
TString16 key; key.format("%lu", id);
|
|
TConnection* pConn = (TConnection*)m_mapConn.objptr(key);
|
|
return pConn;
|
|
}
|
|
|
|
int TLanManager::ForEachConnection(ConnectionFunction f, void* pJolly)
|
|
{
|
|
int result = 0;
|
|
TConnection* pConn;
|
|
|
|
m_mapConn.restart();
|
|
for (pConn = (TConnection*)m_mapConn.get();
|
|
pConn != NULL;
|
|
pConn = (TConnection*)m_mapConn.get())
|
|
result += f(*pConn, pJolly);
|
|
|
|
return result;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TLanServer
|
|
///////////////////////////////////////////////////////////
|
|
|
|
byte* TLanServer::GetBufferSetString(const char* str)
|
|
{
|
|
if (str == NULL)
|
|
str = "";
|
|
const size_t dwSize = strlen(str)+1;
|
|
byte* buff = GetBuffer(dwSize);
|
|
memcpy(buff, str, dwSize);
|
|
return buff;
|
|
}
|
|
|
|
byte* TLanServer::GetBufferSetBool(bool n)
|
|
{
|
|
const size_t dwSize = sizeof(size_t);
|
|
byte* buff = GetBuffer(dwSize);
|
|
*(size_t*)buff = n ? -1 : 0;
|
|
return buff;
|
|
}
|
|
|
|
byte* TLanServer::GetBufferSetInteger(long n)
|
|
{
|
|
const size_t dwSize = sizeof(size_t);
|
|
byte* buff = GetBuffer(dwSize);
|
|
*(size_t*)buff = n;
|
|
return buff;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TLanClient
|
|
///////////////////////////////////////////////////////////
|
|
|
|
CONNID TLanClient::QueryConnection(const char* service, const char* server)
|
|
{
|
|
TConnection* pConn = OnQueryConnection(service, server);
|
|
return AddConnection(pConn) ;
|
|
}
|
|
|
|
bool TLanClient::Execute(CONNID id, const char* cmd)
|
|
{
|
|
TConnection* pConn = GetConnection(id);
|
|
return pConn ? pConn->Execute(cmd) : false;
|
|
}
|
|
|
|
bool TLanClient::Request(CONNID id, const char* cmd)
|
|
{
|
|
TConnection* pConn = GetConnection(id);
|
|
return pConn ? pConn->Request(cmd) : false;
|
|
}
|
|
|
|
bool TLanClient::RequestString(CONNID id, const char* cmd, TString& res)
|
|
{
|
|
bool valid = Request(id, cmd);
|
|
if (valid)
|
|
{
|
|
size_t dwSize;
|
|
byte* pData = GetBuffer(dwSize);
|
|
char* ptr = res.get_buffer((int)dwSize);
|
|
memcpy(ptr, pData, (size_t)dwSize);
|
|
ReleaseBuffer();
|
|
}
|
|
return valid;
|
|
}
|
|
|
|
bool TLanClient::RequestInteger(CONNID id, const char* cmd, long& num)
|
|
{
|
|
bool valid = Request(id, cmd);
|
|
if (valid)
|
|
{
|
|
size_t dwSize;
|
|
byte* pData = GetBuffer(dwSize);
|
|
num = *(long*)pData;
|
|
ReleaseBuffer();
|
|
}
|
|
return valid;
|
|
}
|
|
|
|
bool TLanClient::RequestBool(CONNID id, const char* cmd, bool& ok)
|
|
{
|
|
bool valid = Request(id, cmd);
|
|
if (valid)
|
|
{
|
|
size_t dwSize;
|
|
byte* pData = GetBuffer(dwSize);
|
|
ok = *pData != 0;
|
|
ReleaseBuffer();
|
|
}
|
|
return valid;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TConnection
|
|
///////////////////////////////////////////////////////////
|
|
|
|
TConnection::TConnection(TLanManager* pManager, CONNID id)
|
|
: m_pManager(pManager), m_dwId(id)
|
|
{
|
|
}
|
|
|
|
TConnection::~TConnection()
|
|
{
|
|
}
|
|
|
|
TLanServer& TConnection::Server() const
|
|
{
|
|
CHECK(Manager().IsServer(), "Can't cast client to server");
|
|
return (TLanServer&)Manager();
|
|
}
|
|
|
|
int TConnection::ParseCommand(const char* cmd, TString_array& argv)
|
|
{
|
|
argv.destroy();
|
|
|
|
bool is_quoted = false;
|
|
char end_quote = '\0';
|
|
TString token;
|
|
const char* token_start = NULL;
|
|
|
|
for (char* c = (char*)cmd; *c; c++)
|
|
{
|
|
if (end_quote)
|
|
{
|
|
if (*c == end_quote)
|
|
{
|
|
*c = '\0';
|
|
token = token_start;
|
|
*c = end_quote;
|
|
end_quote = '\0';
|
|
is_quoted = true;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if (*c == '(' || *c == ')' || *c == ',')
|
|
{
|
|
if (token_start)
|
|
{
|
|
if (is_quoted)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
const char old = *c;
|
|
*c = '\0';
|
|
token = token_start;
|
|
*c = old;
|
|
token.rtrim();
|
|
}
|
|
}
|
|
|
|
argv.add(token);
|
|
|
|
token_start = NULL;
|
|
token = "";
|
|
is_quoted = false;
|
|
continue;
|
|
}
|
|
|
|
if (*c == '"' || *c == '\'' || *c == '|' || byte(*c) >= 254)
|
|
{
|
|
end_quote = *c;
|
|
token_start = c+1;
|
|
}
|
|
|
|
if (token_start == NULL && *c > ' ')
|
|
{
|
|
token_start = c;
|
|
}
|
|
}
|
|
|
|
return argv.items();
|
|
}
|
|
|
|
bool TConnection::Execute(const char* cmd)
|
|
{
|
|
TString_array argv;
|
|
return ParseCommand(cmd, argv) > 0;
|
|
}
|
|
|
|
bool TConnection::Request(const char* cmd)
|
|
{
|
|
TString_array argv;
|
|
return ParseCommand(cmd, argv) > 0;
|
|
}
|