271 lines
5.2 KiB
C++
271 lines
5.2 KiB
C++
#include "stdafx.h"
|
|
#include "CommData.h"
|
|
|
|
static LPCTSTR MSGID_NAME = _T("__msgid");
|
|
static LPCTSTR USING_POOL_THREAD = _T("__upt");
|
|
static LPCTSTR SERIALID_NAME = _T("__serial");
|
|
static LPCTSTR BYTEDATA_NAME = _T("__data");
|
|
static LPCTSTR SERIAL_BYTESECTION = _T("\n__data=");
|
|
|
|
CommData::CommData()
|
|
: m_msgid(INVALID_MSGID)
|
|
, m_serialid(0)
|
|
, m_bUsePoolThread(FALSE)
|
|
{
|
|
|
|
}
|
|
|
|
CommData::~CommData()
|
|
{
|
|
|
|
}
|
|
|
|
void CommData::SetMsgID( MSGID msgid )
|
|
{
|
|
m_msgid = msgid;
|
|
}
|
|
|
|
void CommData::SetData( LPCTSTR name, LPCTSTR value )
|
|
{
|
|
m_map[name] = value;
|
|
}
|
|
|
|
void CommData::SetData( LPCTSTR name, UINT64 value )
|
|
{
|
|
TCHAR buffer[64] = {0};
|
|
_stprintf_s(buffer, _T("%I64u"), value);
|
|
m_map[name] = buffer;
|
|
}
|
|
|
|
BOOL CommData::GetStrData( LPCTSTR name, tstring& value ) const
|
|
{
|
|
KeyValueMap::const_iterator finditer = m_map.find(name);
|
|
if (finditer == m_map.end())
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
value = finditer->second;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CommData::GetUint64Data( LPCTSTR name, UINT64& value ) const
|
|
{
|
|
tstring strVal;
|
|
if (! GetStrData(name, strVal))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (1 == _stscanf_s(strVal.c_str(), _T("%I64u"), &value))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CommData::Parse( const LPBYTE pData, DWORD dwSize )
|
|
{
|
|
typedef enum
|
|
{
|
|
PARSE_READING_NAME = 0,
|
|
PARSE_READING_VALUE,
|
|
} PARSE_STATUS;
|
|
|
|
TCHAR* p = (TCHAR*) pData;
|
|
|
|
PARSE_STATUS parseStatus = PARSE_READING_NAME;
|
|
tstring name;
|
|
tstring val;
|
|
for (DWORD index = 0; index < (dwSize/sizeof(TCHAR)); index++, p++)
|
|
{
|
|
TCHAR b = *p;
|
|
|
|
if (_T('\r') == b)
|
|
{
|
|
continue;
|
|
}
|
|
else if (_T('\n') == b)
|
|
{
|
|
if (name.size() > 0) m_map[name.c_str()] = val.c_str();
|
|
name.clear();
|
|
val.clear();
|
|
|
|
parseStatus = PARSE_READING_NAME;
|
|
}
|
|
else if (_T('=') == b)
|
|
{
|
|
if (name == BYTEDATA_NAME)
|
|
{
|
|
LONG dataLength = dwSize - index - 1;
|
|
if (dataLength > 0)
|
|
{
|
|
m_byteData.Alloc(dataLength);
|
|
memcpy((LPBYTE)m_byteData, p + 1, dataLength);
|
|
}
|
|
|
|
name.clear();
|
|
break;
|
|
}
|
|
|
|
parseStatus = PARSE_READING_VALUE;
|
|
}
|
|
else
|
|
{
|
|
if (PARSE_READING_NAME == parseStatus)
|
|
{
|
|
name += b;
|
|
}
|
|
else if (PARSE_READING_VALUE == parseStatus)
|
|
{
|
|
val += b;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (name.size() > 0) m_map[name.c_str()] = val.c_str();
|
|
|
|
/*std::string temp((LPCSTR)pData, dwSize);
|
|
tstring src = s2ws(temp);
|
|
|
|
TStringVector parts;
|
|
splitByChar(src.c_str(), parts, '\n');
|
|
|
|
m_map.clear();
|
|
TStringVector::iterator iter = parts.begin();
|
|
for (; iter != parts.end(); iter++)
|
|
{
|
|
tstring& line = *iter;
|
|
trim(line, '\r');
|
|
if (line.size() == 0) continue;
|
|
|
|
tstring::size_type pos = line.find('=');
|
|
if (pos == tstring::npos) continue;
|
|
|
|
tstring name = line.substr(0, pos);
|
|
tstring val;
|
|
if (line.size() > pos + 1) val = line.substr(pos + 1);
|
|
|
|
m_map[name] = val;
|
|
}*/
|
|
|
|
m_msgid = INVALID_MSGID;
|
|
GetUint64Data(MSGID_NAME, m_msgid);
|
|
|
|
GetUint64Data(SERIALID_NAME, m_serialid);
|
|
|
|
tstring upt;
|
|
GetStrData(USING_POOL_THREAD, upt);
|
|
if (upt == _T("true")) m_bUsePoolThread = TRUE;
|
|
|
|
GetStrData(_T("clientid"),m_clientid);
|
|
|
|
return (INVALID_MSGID != m_msgid);
|
|
}
|
|
|
|
void CommData::Serialize( ByteBuffer& buffer ) const
|
|
{
|
|
static DWORD s_dwByteSectionSize = lstrlen(SERIAL_BYTESECTION)*sizeof(TCHAR);
|
|
|
|
tostringstream ss;
|
|
|
|
ss << MSGID_NAME << _T("=") << m_msgid;
|
|
ss << _T("\n") << SERIALID_NAME << _T("=") << m_serialid;
|
|
if (m_bUsePoolThread) ss << _T("\n") << USING_POOL_THREAD << _T("=true");
|
|
|
|
KeyValueMap::const_iterator iter = m_map.begin();
|
|
for (; iter != m_map.end(); iter++)
|
|
{
|
|
if (_tcscmp(SERIALID_NAME, iter->first.c_str()) == 0
|
|
|| _tcscmp(MSGID_NAME, iter->first.c_str()) == 0
|
|
|| _tcscmp(USING_POOL_THREAD, iter->first.c_str()) == 0) continue;
|
|
ss << _T("\n") << iter->first.c_str() << _T("=") << iter->second.c_str();
|
|
}
|
|
|
|
tstring wdata = ss.str();
|
|
DWORD dwSize = wdata.size()*sizeof(TCHAR);
|
|
|
|
DWORD dwDataSectionSize = 0;
|
|
if (m_byteData.Size() > 0)
|
|
{
|
|
dwDataSectionSize = s_dwByteSectionSize + m_byteData.Size();
|
|
}
|
|
buffer.Alloc(dwSize + dwDataSectionSize);
|
|
memcpy((LPBYTE)buffer, wdata.c_str(), dwSize);
|
|
|
|
if (m_byteData.Size() > 0)
|
|
{
|
|
LPBYTE pTarget = (LPBYTE) buffer;
|
|
pTarget += dwSize;
|
|
|
|
memcpy(pTarget, SERIAL_BYTESECTION, s_dwByteSectionSize);
|
|
pTarget += s_dwByteSectionSize;
|
|
|
|
memcpy(pTarget, (const LPBYTE)m_byteData, m_byteData.Size());
|
|
}
|
|
}
|
|
|
|
MSGID CommData::GetMsgID() const
|
|
{
|
|
return m_msgid;
|
|
}
|
|
|
|
void CommData::SetUsingPoolThread()
|
|
{
|
|
m_bUsePoolThread = TRUE;
|
|
}
|
|
|
|
BOOL CommData::UsingPoolThread() const
|
|
{
|
|
return m_bUsePoolThread;
|
|
}
|
|
|
|
void CommData::SetSerialID( MSGSERIALID serialID )
|
|
{
|
|
m_serialid = serialID;
|
|
}
|
|
|
|
MSGSERIALID CommData::GetSerialID() const
|
|
{
|
|
return m_serialid;
|
|
}
|
|
|
|
void CommData::ListNames( TStringVector& names ) const
|
|
{
|
|
KeyValueMap::const_iterator iter = m_map.begin();
|
|
for (; iter != m_map.end(); iter++)
|
|
{
|
|
names.push_back(iter->first);
|
|
}
|
|
}
|
|
|
|
void CommData::Reply( const CommData& data )
|
|
{
|
|
m_msgid = data.m_msgid;
|
|
m_serialid = data.m_serialid;
|
|
}
|
|
|
|
void CommData::SetClientID( LPCTSTR clientid )
|
|
{
|
|
m_clientid = clientid;
|
|
SetData(_T("clientid"),clientid);
|
|
}
|
|
|
|
LPCTSTR CommData::GetClientID() const
|
|
{
|
|
return m_clientid.c_str();
|
|
}
|
|
|
|
const ByteBuffer& CommData::GetByteData() const
|
|
{
|
|
return m_byteData;
|
|
}
|
|
|
|
void CommData::SetByteData( const LPBYTE pData, DWORD dwSize )
|
|
{
|
|
m_byteData.Alloc(dwSize);
|
|
memcpy((LPBYTE)m_byteData, pData, dwSize);
|
|
}
|