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 + -
显示快捷键?