imchatrecordview.cpp

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

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

#include  <aknviewappui.h>
#include  <avkon.hrh>
#include  <ImClientExam.rsg>
#include "SocketsAppUi.h"
#include  "ImChatRecordView.h"
#include  "ImChatRecordContainer.h"
#include "sockets.hrh"
#include "ImMsgCommandID.h"
#include "ImSendNotifyMessageBody.h"
#include "ImFriendListView.h"

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CImChatRecordView::ConstructL(const TRect& aRect)
// EPOC two-phased constructor
// ---------------------------------------------------------
//
void CImChatRecordView::ConstructL()
    {
    BaseConstructL( R_IMCLIENT_IMCHATRECORD_VIEW );
    }

// ---------------------------------------------------------
// CImChatRecordView::~CImChatRecordView()
// destructor
// ---------------------------------------------------------
//
CImChatRecordView::~CImChatRecordView()
    {
    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        }

    delete iContainer;
    if(m_pBufRecord)
    	delete m_pBufRecord;
    }

// ---------------------------------------------------------
// TUid CImChatRecordView::Id()
//
// ---------------------------------------------------------
//
TUid CImChatRecordView::Id() const
    {
    return KImChatRecordViewId;
    }

// ---------------------------------------------------------
// CImChatRecordView::HandleCommandL(TInt aCommand)
// takes care of view command handling
// ---------------------------------------------------------
//
void CImChatRecordView::HandleCommandL(TInt aCommand)
    {   
    switch ( aCommand )
        {
        case EImCmdSendMessage:
        	{
        	TBuf<256> buf;
        	buf.Copy(_L("self: "));
        	iContainer->GetInputBoxText(buf);
        	this->SendImMessage(this->m_bufFriendAcc,buf);
        	
        	TBuf<300> bufRecord;
        	bufRecord.Copy(_L("self: "));
        	bufRecord.Append(buf);
        	iContainer->AddChatRecord(bufRecord);
        	}
        	break;
        case EAknSoftkeyOk:
            {
            iEikonEnv->InfoMsg( _L("view1 ok") );
            break;
            }
        case EAknSoftkeyBack:
            {
            AppUi()->ActivateLocalViewL(KImFriendListViewId);
            //AppUi()->HandleCommandL(EEikCmdExit);
            break;
            }
        default:
            {
            //AppUi()->HandleCommandL( aCommand );
            break;
            }
        }
    }

// ---------------------------------------------------------
// CImChatRecordView::HandleClientRectChange()
// ---------------------------------------------------------
//
void CImChatRecordView::HandleClientRectChange()
    {
    if ( iContainer )
        {
        iContainer->SetRect( ClientRect() );
        }
    }

// ---------------------------------------------------------
// CImChatRecordView::DoActivateL(...)
// 
// ---------------------------------------------------------
//
void CImChatRecordView::DoActivateL(
   const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
   const TDesC8& /*aCustomMessage*/)
    {
    if (!iContainer)
        {
        iContainer = new (ELeave) CImChatRecordContainer(this);
        iContainer->SetMopParent(this);
        iContainer->ConstructL( ClientRect() );
        AppUi()->AddToStackL( *this, iContainer );
        
        if(m_pBufRecord)
        	{
        	iContainer->AddChatRecord(*m_pBufRecord);
        	delete m_pBufRecord;
        	m_pBufRecord=NULL;
        	}
        } 
   }

// ---------------------------------------------------------
// CImChatRecordView::DoDeactivate()
// 
// ---------------------------------------------------------
//
void CImChatRecordView::DoDeactivate()
    {
    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        }
    
    delete iContainer;
    iContainer = NULL;
    }

void CImChatRecordView::SendImMessage(const TDesC& desFriendAcc,
		const TDesC& desContent)
	{
	CSocketsAppUi* pAppUi=(CSocketsAppUi*)AppUi();
	TBuf8<10> bufMyAcc;
	bufMyAcc.Copy(pAppUi->m_bufMyAcc);
	
	TBuf8<10> bufDestAcc;
	bufDestAcc.Copy(desFriendAcc);
	
	//--------------------------------------------
	//构建请求消息
	CImMsg* pImMsg=CImMsg::NewLC();
	pImMsg->m_nCommandID=ImSendMessageReq;
	pImMsg->m_nSeqNo=1;
	memcpy(pImMsg->m_strSrcUser,bufMyAcc.Ptr(),bufMyAcc.Length());
	memcpy(pImMsg->m_strDstUser,bufDestAcc.Ptr(),bufDestAcc.Length());
	
	//构建消息体
	CImSendNotifyMessageBody* pBody=new CImSendNotifyMessageBody;
	pImMsg->m_pBody=pBody;
	pBody->m_nContentLen=desContent.Length()*2;
	pBody->m_pContent=new TUint8[pBody->m_nContentLen];
	
	int nLen=desContent.Size();
	TPtrC8 ptr8Content((TUint8*)desContent.Ptr(),pBody->m_nContentLen);
	memcpy(pBody->m_pContent,ptr8Content.Ptr(),pBody->m_nContentLen);
	
	//发送消息
	pAppUi->SendImMessage(pImMsg);
	
	CleanupStack::PopAndDestroy(1);
	}

void CImChatRecordView::HandleImMessageNotify(CImMsgBody* pMsgBody)
	{
	CImSendNotifyMessageBody* pBody=(CImSendNotifyMessageBody*)pMsgBody;
	
	int nContentLen=pBody->m_nContentLen;
	TUint8* pContent=pBody->m_pContent;
	
	HBufC* pBuf=HBufC::NewLC(nContentLen/2);
	TPtr8 ptr8((TUint8*)pBuf->Ptr(),nContentLen);
	memcpy((void*)ptr8.Ptr(),(void*)pContent,nContentLen);
	pBuf->Des().SetLength(nContentLen/2);
		
	HBufC* pBufRecord=HBufC::NewLC(nContentLen/2+15);
	pBufRecord->Des().AppendFormat(_L("%S: %S"),&m_bufFriendAcc,pBuf);
	if(iContainer)
		{
		iContainer->AddChatRecord(*pBufRecord);
		CleanupStack::PopAndDestroy(1);
		}
	else
		{
		CleanupStack::Pop(1);
		m_pBufRecord=pBufRecord;
		}
	}

// End of File

⌨️ 快捷键说明

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