imfriendlistview.cpp

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

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

#include  <aknviewappui.h>
#include  <avkon.hrh>
#include <aknnotewrappers.h>
#include <stringloader.h> 
#include <aknquerydialog.h> 
#include  <ImClientExam.rsg>
#include  "socketsappui.h"
#include  "ImFriendListView.h"
#include  "ImChatRecordView.h"
#include  "ImFriendListContainer.h"
#include  "sockets.hrh"
#include "ImPublic.h"
#include "ImMsgCommandID.h"
#include "ImMsg.h"
#include "ImAddDelFriendReq.h"
#include "ImGetFriendListResp.h"
#include "ImNotifyFriendStatusChangeBody.h"

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

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

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

    delete iContainer;
    
    m_lstFriend.ResetAndDestroy();
    }

// ---------------------------------------------------------
// TUid CImFriendListView::Id()
//
// ---------------------------------------------------------
//
TUid CImFriendListView::Id() const
    {
    return KImFriendListViewId;
    }

// ---------------------------------------------------------
// CImFriendListView::HandleCommandL(TInt aCommand)
// takes care of view command handling
// ---------------------------------------------------------
//
void CImFriendListView::HandleCommandL(TInt aCommand)
    {   
    switch ( aCommand )
        {
        case EImCmdSendMessage:
        	{
        	int nIndex=iContainer->GetSelectedFriendIndex();
        	if(nIndex>=0 && nIndex<m_lstFriend.Count())
        		{
        		TPtr ptrFriendAcc=m_lstFriend[nIndex]->Des();
        		
        		CSocketsAppUi* pAppUi=(CSocketsAppUi*)AppUi();
        		pAppUi->m_viewChatRecord->m_bufFriendAcc.Copy(ptrFriendAcc);
        		pAppUi->ActivateLocalViewL(KImChatRecordViewId);
        		}
        	}
        	break;
        	
        case EImCmdAddFriend:
        	{
        	TBuf<30> buf;
    		CAknTextQueryDialog* pInputNameQuery = CAknTextQueryDialog::NewL(buf);
    		CleanupStack::PushL(pInputNameQuery);
    		
    		HBufC* prompt;
    		prompt = StringLoader::LoadLC(R_CHAT_INPUT_ACC_PROMPT);	// Pushes prompt onto the Cleanup Stack.
    		pInputNameQuery->SetPromptL(*prompt);
    		CleanupStack::PopAndDestroy(prompt);
    		CleanupStack::Pop(pInputNameQuery);
    		
    		if (pInputNameQuery->ExecuteLD(R_REGISTER_INPUT_QUERY))
    			{
    			this->m_lstFriend.AppendL(buf.Alloc());
    			SendAddDelFriendMessage(ImAddFriendReq,buf);
    			this->iContainer->AddFriendItemL(buf,0);
    			}
        	}
            break;
                	
        case EImCmdDelFriend:
        	{
        	TInt nIndex=iContainer->DeleteSelectedL();
        	HBufC* pUserAcc=m_lstFriend[nIndex];
        	SendAddDelFriendMessage(ImDelFriendReq,pUserAcc->Des());
        	
        	m_lstFriend.Remove(nIndex);
        	delete pUserAcc;
        	}
            break;
                	
        case EImCmdDisplayMyAcc:
        	CSocketsAppUi* pAppUi=(CSocketsAppUi*)AppUi();
        	
        	CAknInformationNote* informationNote;
			informationNote = new ( ELeave ) CAknInformationNote;
			informationNote->ExecuteLD( pAppUi->m_bufMyAcc);
        	break;
        	
        case EAknSoftkeyOk:
            {
            iEikonEnv->InfoMsg( _L("view1 ok") );
            break;
            }
        case EAknSoftkeyBack:
        case EEikCmdExit:
            {
            AppUi()->HandleCommandL(EEikCmdExit);
            break;
            }
        default:
            {
            //AppUi()->HandleCommandL( aCommand );
            break;
            }
        }
    }

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

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

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

void CImFriendListView::SendAddDelFriendMessage(int nCmdID,const TDesC& desUserAcc)
	{
	CSocketsAppUi* pAppUi=(CSocketsAppUi*)AppUi();
	TBuf8<10> bufMyAcc;
	bufMyAcc.Copy(pAppUi->m_bufMyAcc);
	
	HBufC8* pUser=HBufC8::NewLC(desUserAcc.Length());
	TPtr8 ptrUser=pUser->Des();
	ptrUser.Append(desUserAcc);
		
	//--------------------------------------------
	//构建请求消息
	CImMsg* pImMsg=CImMsg::NewL();
	CleanupStack::PushL(pImMsg);
	pImMsg->m_nCommandID=nCmdID;
	pImMsg->m_nSeqNo=1;
	memcpy(pImMsg->m_strSrcUser,bufMyAcc.Ptr(),bufMyAcc.Length());
	memcpy(pImMsg->m_strDstUser,ptrUser.Ptr(),ptrUser.Length());
	
	pImMsg->m_nRespResult=0;
	
	CImAddDelFriendReq* pReqBody=new (ELeave) CImAddDelFriendReq();
	memcpy(pReqBody->m_strUserAcc,ptrUser.Ptr(),ptrUser.Length());
	pImMsg->m_pBody=pReqBody;
	
	//发送消息
	pAppUi->SendImMessage(pImMsg);
	
	CleanupStack::PopAndDestroy(2);
	}


void CImFriendListView::SendGetFriendListMessage()
	{	
	CSocketsAppUi* pAppUi=(CSocketsAppUi*)AppUi();
	TBuf8<10> bufMyAcc;
	bufMyAcc.Copy(pAppUi->m_bufMyAcc);
	
	//--------------------------------------------
	//构建请求消息
	CImMsg* pImMsg=CImMsg::NewLC();
	pImMsg->m_nCommandID=ImGetFriendListReq;
	pImMsg->m_nSeqNo=1;
	int nLen=bufMyAcc.Length();
	memcpy(pImMsg->m_strSrcUser,bufMyAcc.Ptr(),nLen);
	memset(pImMsg->m_strDstUser,0,11);
	
	//发送消息
	pAppUi->SendImMessage(pImMsg);
	
	CleanupStack::PopAndDestroy(1);
	}

void CImFriendListView::HandleFriendListMessage(CImMsgBody* pMsgBody)
	{
	CImGetFriendListResp* pFriendListResp=(CImGetFriendListResp*)pMsgBody;
	
	int nFriendCount=pFriendListResp->m_nFriendCount;
	TUint8* pUserAcc=pFriendListResp->m_pUserAcc;
	TInt* pStatus=pFriendListResp->m_pStatus;
	
	for(int i=0;i<nFriendCount;i++)
		{
		TUint8* pTemp=pUserAcc+i*10;
		TInt nLen=StringLen(pTemp);
		if(nLen>10)
			nLen=10;
		TPtr8 ptrAcc(pTemp,nLen,nLen);
		
		TBuf<10> bufAcc;
		bufAcc.Copy(ptrAcc);
		
		m_lstFriend.Append(bufAcc.Alloc());
		this->iContainer->AddFriendItemL(bufAcc,pStatus[i]);
		}
	}

void CImFriendListView::HandleImNotifyFriendStatusChange(CImMsgBody* pMsgBody)
	{
	CImNotifyFriendStatusChangeBody* pBody=
			(CImNotifyFriendStatusChangeBody*)pMsgBody;
	
	TUint8* pUserAcc=pBody->m_strUserAcc;
	int nStatus=pBody->m_nUserStatus;
	TPtr8 ptrAcc(pUserAcc,StringLen(pUserAcc),StringLen(pUserAcc));
	
	TBuf<10> bufAcc;
	bufAcc.Copy(ptrAcc);
	
	int nIndex=0;
	bool bFind=false;
	for(int i=0;i<m_lstFriend.Count();i++)
		{
		if(m_lstFriend[i]->Des().Compare(bufAcc)==0)
			{
			bFind=true;
			nIndex=i;
			break;
			}
		}
	if(bFind)
		{
		
		this->iContainer->ModifyFriendItemL(nIndex,bufAcc,nStatus);
		}
		
	}

// End of File

⌨️ 快捷键说明

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