⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traninfomodule.cpp

📁 C++ patterns设计模式
💻 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 + -