📄 traninfomodule.cpp
字号:
#include "stdafx.h"
#include "traninfomodule.h"
#include "patterns/util/janitor.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
namespace acl
{
THREAD_HANDLER_DECL(ThreadAgent, param)
{
TranInfoModule *owner = reinterpret_cast<TranInfoModule *>(param);
owner->pullProcess();
return 0;
}
TranInfoPackage::TranInfoPackage(unsigned int receiver, CTtranInfo &tranInfo)
{
m_sender = receiver;
m_tranInfo = tranInfo;
}
bool TranInfoPackage::fromStream(protocol::BaseStream &stream, int startPos /*= 0*/)
{
sockaddr_in stuff;
u32 length;
// 去掉总长度字段
stream.dec32(length);
// 剩下的CTtranInfo的长度是总长度减去长度字段本身的长度(4字节)
return m_tranInfo.String2TranInfo(stuff, stream.getWriteBuffer(startPos), length-4) == CT_errorOK;
}
bool TranInfoPackage::toStream(protocol::BaseStream &stream)
{
u32 length = m_tranInfo.GetLength();
stream.resize(length + 4);
// 打包长度,总长度是CTtranInfo的长度加上自己本身的长度
stream.enc32(length + 4);
m_tranInfo.TranInfo2String(stream.getWriteBuffer(4), stream.size());
return true;
}
TranInfoModule::TranInfoModule(PackageServer<TranInfoPackage> *server)
{
assert(server);
m_server = server;
}
TranInfoModule::~TranInfoModule()
{
delete m_pullThread;
}
void TranInfoModule::start()
{
createPullThread();
}
void TranInfoModule::stop()
{
TranInfoPackage *pkg = new TranInfoPackage(SequenceGenerator::getSelf(),
CTtranInfo(SequenceGenerator::getSelf(), SequenceGenerator::getSelf(), EvtComm_SUNTEK_Stop));
m_server->putPackageAtHead(pkg);
}
void TranInfoModule::createPullThread()
{
m_pullThread = new CTThread(ThreadAgent, this);
}
void TranInfoModule::pullProcess()
{
bool continueFlag = true;
TranInfoPackage *pkg = NULL;
while(continueFlag)
{
pkg = m_server->getPackage();
stk::Janitor<TranInfoPackage> janPkg(pkg); //guard and delete the package
if(pkg)
{
continueFlag = defaultHandleMessage(pkg->m_sender, pkg->m_tranInfo);
// delete pkg;
// pkg = NULL;
}
}
}
bool TranInfoModule::defaultHandleMessage(unsigned int sender, CTtranInfo &tranInfo)
{
switch(tranInfo.messageID)
{
case EvtComm_SUNTEK_Stop:
if(SequenceGenerator::isSelf(sender))
return false;
break;
default:
handleMessage(sender, tranInfo);
break;
}
return true;
}
bool TranInfoModule::sendMessage(unsigned int receiver, CTtranInfo &tranInfo)
{
TranInfoPackage pkg(receiver, tranInfo);
return m_server->sendPackage(&pkg);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -