immsg.cpp

来自「国内著名嵌入式培训机构内部资料,内含一些实例代码,包括技术专题书籍」· C++ 代码 · 共 161 行

CPP
161
字号
/*
 ============================================================================
 Author	  : hou maoqing
 Version	 : 1.0
 Copyright   : Copyright (c) Hou maoqing 2008
 Mail	: houmqing@163.com
 ============================================================================
 */

#include "ImPublic.h"
#include "ImRegistryResp.h"
#include "ImGetFriendListResp.h"
#include "ImSendNotifyMessageBody.h"
#include "ImNotifyFriendStatusChangeBody.h"

CImMsg::CImMsg()
	{
	m_pBody=NULL;
	}

CImMsg::~CImMsg()
	{
	if(m_pBody)
		delete m_pBody;
	}

CImMsg* CImMsg::NewLC()
	{
	CImMsg* self = new (ELeave)CImMsg();
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

CImMsg* CImMsg::NewL()
	{
	CImMsg* self=CImMsg::NewLC();
	CleanupStack::Pop(); // self;
	return self;
	}

void CImMsg::ConstructL()
	{

	}

int CImMsg::GetHeaderLen(void)
	{
	//4+4+4+10+10+4
	return 36;
	}

bool CImMsg::Encode(TUint8** ppBuf, int& nLen)
	{
	int nHeaderLen=this->GetHeaderLen();
	int nBodyLen=0;
	if(m_pBody)
		nBodyLen=m_pBody->GetBodyLen();
	
	//计算消息长度
	nLen=nHeaderLen+nBodyLen;
	m_nMsgLen=nLen;  
	
	*ppBuf=new (ELeave) TUint8[nLen];
	TUint8* pTemp=*ppBuf;
	
	//编码消息头
	//编码消息长度
	int tmp=HostToNet(m_nMsgLen);
	memcpy(pTemp,(void*)&tmp,4);
	pTemp+=4;

	//命令ID
	tmp=HostToNet(m_nCommandID);
	memcpy(pTemp,(void*)&tmp,4);
	pTemp+=4;

	//消息序列号
	tmp=HostToNet(m_nSeqNo);
	memcpy(pTemp,(void*)&tmp,4);
	pTemp+=4;

	//源用户号码
	memcpy(pTemp,m_strSrcUser,10);
	pTemp+=10;

	//目标用户号码
	memcpy(pTemp,m_strDstUser,10);
	pTemp+=10;

	//响应码
	tmp=HostToNet(m_nRespResult);
	memcpy(pTemp,(void*)&tmp,4);
	pTemp+=4;
	
	//编码消息体
	if(m_pBody)
		{
		int nn;
		m_pBody->Encode(pTemp,nn);
		}
	
	return true;
	}

void CImMsg::Decode(TUint8* pBuf)
	{
	//解码消息头
	TUint8* pTemp=pBuf;
		
	//解码消息长度
	int tmp;
	memcpy((void*)&tmp,pTemp,4);
	m_nMsgLen=NetToHost(tmp);
	pTemp+=4;

	//命令ID
	memcpy((void*)&tmp,pTemp,4);
	m_nCommandID=NetToHost(tmp);
	pTemp+=4;

	//消息序列号
	memcpy((void*)&tmp,pTemp,4);
	m_nSeqNo=NetToHost(tmp);
	pTemp+=4;

	//源用户号码
	memcpy((void*)m_strSrcUser,pTemp,10);
	pTemp+=10;

	//目标用户号码
	memcpy((void*)m_strDstUser,pTemp,10);
	pTemp+=10;

	//响应码
	memcpy((void*)&tmp,pTemp,4);
	m_nRespResult=NetToHost(tmp);
	pTemp+=4;
	
	//解码消息体
	if(m_nCommandID==ImRegisterUserResp)
		{
		m_pBody=new CImRegistryResp;
		m_pBody->Decode(pTemp);
		}
	else if(m_nCommandID==ImGetFriendListResp)
		{
		m_pBody=new CImGetFriendListResp;
		m_pBody->Decode(pTemp);
		}
	else if(m_nCommandID==ImNotifyReceivedMessage)
		{
		m_pBody=new CImSendNotifyMessageBody;
		m_pBody->Decode(pTemp);
		}
	else if(m_nCommandID==ImNotifyFriendStatusChange)
		{
		m_pBody=new CImNotifyFriendStatusChangeBody;
		m_pBody->Decode(pTemp);
		}
	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?