diff -r 000000000000 -r e6b17d312c8b imservices/instantmessagingcache/imcacheclient/src/cimcacheeventhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imservices/instantmessagingcache/imcacheclient/src/cimcacheeventhandler.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,344 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: cache message change observer +* +*/ + + +// INCLUDE FILES + +#include "cimcacheeventhandler.h" +#include "mimcacheclient.h" +#include "mimcacheeventhandler.h" +// logs +#include "imcachedebugtrace.h" + +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::NewL +// ----------------------------------------------------------------------------- +// +CIMCacheEventHandler* CIMCacheEventHandler::NewL( + MIMCacheClient& aRegistrar, + MIMCacheEventHandler& aHandler) + { + TRACE( T_LIT("CIMCacheEventHandler::NewL() begin") ); + CIMCacheEventHandler* self = new ( ELeave ) CIMCacheEventHandler( aRegistrar ,aHandler ) ; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); //self + TRACE( T_LIT("CIMCacheEventHandler::NewL() end") ); + return self; + } + +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::ConstructL +// ----------------------------------------------------------------------------- +// +void CIMCacheEventHandler::ConstructL() + { + TRACE( T_LIT("CIMCacheEventHandler::ConstructL() begin") ); + iContinueObserving = ETrue ; + CActiveScheduler::Add( this ); + iRegistrar.RegisterObserverToServerL( iStatus ,EIMCacheObserveMessageUpdateRegister ); + SetActive(); + TRACE( T_LIT("CIMCacheEventHandler::ConstructL() end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::~CIMCacheEventHandler +// ----------------------------------------------------------------------------- +// +CIMCacheEventHandler::~CIMCacheEventHandler() + { + TRACE( T_LIT("CIMCacheEventHandler::~CIMCacheEventHandler() begin") ); + Cancel(); + TRACE( T_LIT("CIMCacheEventHandler::~CIMCacheEventHandler() end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::CIMCacheEventHandler( +// ----------------------------------------------------------------------------- +// +CIMCacheEventHandler::CIMCacheEventHandler( + MIMCacheClient& aRegistrar , + MIMCacheEventHandler& aHandler ) : + CActive( CActive::EPriorityIdle ), + iRegistrar( aRegistrar ), + iUpdateHandler( aHandler ) + { + TRACE( T_LIT("CIMCacheEventHandler::CIMCacheEventHandler()") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::RunL +// ----------------------------------------------------------------------------- +// +void CIMCacheEventHandler::RunL() + { + TRACE( T_LIT("CIMCacheEventHandler::RunL() begin") ); + TRACE( T_LIT("CIMCacheEventHandler::RunL() iStatus code = "),iStatus.Int() ); + + switch( iStatus.Int() ) + { + case EIMOperationUnreadMessage : + case EIMOperationDataAvailable : + case EIMOperationMessageAdded : + { + // message data available get the data + GetBufferChatDataL(); + break; + } + case EIMOperationCompleted : + { + iUpdateHandler.HandleIMCacheEventL( EIMCacheRequestCompleted, NULL ); + } + case EIMOperationChatStarted : + { + iUpdateHandler.HandleIMCacheEventL( EIMCacheRequestCompleted, NULL ); + break; + } + case EIMOperationUnreadChange: + { + iUpdateHandler.HandleIMCacheEventL( EIMCacheRequestCompleted, NULL ); + break; + } + case EIMOperationChatAdded : + { + // chat information + GetBufferedChatItemL(EIMCacheNewChat); + break; + } + case EIMOperationChatDeleted : + { + // message data available get the data + GetBufferedChatItemL(EIMCacheChatClosed ); + break; + } + case EIMOperationAllChatDeleted: + { + iUpdateHandler.HandleIMCacheEventL( EIMCacheAllChatClosed, NULL ); + break; + } + case EIMOperationUnRegistered: + { + TRACE( T_LIT("CIMCacheEventHandler::RunL() EIMOperationUnRegistered") ); + iContinueObserving = EFalse; + break; + } + default : + { + TRACE( T_LIT("CIMCacheEventHandler::RunL() default") ); + break; + } + } + + TRACE( T_LIT("CIMCacheEventHandler::RunL() iContinueObserving iContinueObserving = %d") ,iContinueObserving); + // check need to continue observing to server + if( iContinueObserving ) + { + iRegistrar.RegisterObserverToServerL( iStatus ,EIMCacheObserveMessageUpdateRegister ); + SetActive(); + } + TRACE( T_LIT("CIMCacheEventHandler::RunL() end") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::DoCancel +// ----------------------------------------------------------------------------- +// +void CIMCacheEventHandler::DoCancel() + { + TRACE( T_LIT("CIMCacheEventHandler::DoCancel() ") ); + if( IsActive() ) + { + TRAP_IGNORE(iRegistrar.CancelRequestL( iStatus ,EIMCacheCancelRequest )); + } + } +// --------------------------------------------------------- +// CIMCacheEventHandler::RunError() +// --------------------------------------------------------- +// +TInt CIMCacheEventHandler::RunError( TInt /* aError */) + { + TRACE( T_LIT("CVIMPSTEngineCVListener::RunError() start")); + return KErrNone; + } +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::UnRegisterObserver +// ----------------------------------------------------------------------------- +// +void CIMCacheEventHandler::UnRegisterObserver() + { + TRACE( T_LIT("CIMCacheEventHandler::UnRegisterObserver() begin") ); + if( IsActive() ) + { + TRACE( T_LIT("CIMCacheEventHandler::UnRegisterObserver() active") ); + TRAP_IGNORE(iRegistrar.UnRegisterObserverToServerL( iStatus ,EIMCacheObserveMessageUpdateUnRegister )); + } + TRACE( T_LIT("CIMCacheEventHandler::UnRegisterObserver() end") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::GetBufferChatDataL +// ----------------------------------------------------------------------------- +// +void CIMCacheEventHandler::GetBufferChatDataL( ) + { + TRACE( T_LIT("CIMCacheEventHandler::GetBufferChatDataL() begin") ); + TBool more = ETrue; + while(more) + { + TPtr8 bufferPtr = iRegistrar.GetBufferedDataL( EIMCacheGetBufferedPackets ); + InternalizeChatDataL( bufferPtr , more ); + } + TRACE( T_LIT("CIMCacheEventHandler::GetBufferChatDataL() end") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::InternalizeChatDataL +// ----------------------------------------------------------------------------- +void CIMCacheEventHandler::InternalizeChatDataL( TPtr8 aChatDataBuffer , TBool& aMore ) + { + TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL() Start") ); + if( 0 == aChatDataBuffer.Length()) + { + TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL() aChatDataBuffer is zeor, hence returning ") ); + return; + } + RDesReadStream readAllStream ; + RDesReadStream readStream ; + + readAllStream.Open( aChatDataBuffer ); + CleanupClosePushL(readAllStream); + + TInt messageCount = readAllStream.ReadInt16L(); + + for( TInt i=0; i< messageCount; i++) + { + SIMCacheMessageData chatData = + { + TIMCacheMessageType(0), + }; + + TInt size = readAllStream.ReadInt16L() ; + HBufC8* mBuffer = HBufC8::NewLC( size ); + TPtr8 mBufferPtr = mBuffer->Des(); + + readAllStream.ReadL( mBufferPtr , size ); + + readStream.Open( *mBuffer ); + CleanupClosePushL(readStream) ; + + chatData.iMessageType = static_cast( readStream.ReadInt16L() ); + chatData.iMessagerType = static_cast( readStream.ReadInt16L() ); + chatData.iContentType = static_cast( readStream.ReadInt16L() ); + chatData.iTime = static_cast( readStream.ReadReal64L() ); + + TInt buddyLength = readStream.ReadInt16L(); + HBufC* buddy = HBufC::NewLC( buddyLength ); + TPtr buddyPtr = buddy->Des(); + readStream.ReadL( buddyPtr , buddyLength ); + chatData.iBuddyId = buddy; + + TInt textSize = readStream.ReadInt16L(); + HBufC* text = HBufC::NewLC( textSize ); + TPtr textPtr = text->Des(); + readStream.ReadL( textPtr , textSize); + chatData.iText = text; + + iUpdateHandler.HandleIMCacheEventL(EIMCacheNewMessage , &chatData); + + CleanupStack::PopAndDestroy(4);//close read stream, delete mBuffer, text, buddy + } + + aMore = static_cast( readAllStream.ReadInt16L() ); + + CleanupStack::PopAndDestroy();//readAllStream. + + TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL() End") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::GetBufferedChatItemL +// ----------------------------------------------------------------------------- +// +void CIMCacheEventHandler::GetBufferedChatItemL( TIMCacheEventType aEventType ) + { + TRACE( T_LIT("CIMCacheAccessEventHandler::GetBufferedChatItemL() begin") ); + + TPtr8 bufferPtr = iRegistrar.GetBufferedDataL( EIMCacheGetBufferedPackets ); + + InternalizeChatItemL( aEventType, bufferPtr ); + + TRACE( T_LIT("CIMCacheAccessEventHandler::GetBufferedChatItemL() end") ); + } + + +// ----------------------------------------------------------------------------- +// CIMCacheEventHandler::InternalizeChatItemL +// ----------------------------------------------------------------------------- +// +void CIMCacheEventHandler::InternalizeChatItemL( TIMCacheEventType aEventType, + TPtr8 aContactBuffer ) + { + TRACE( T_LIT("CIMCacheClient::InternalizeChatItemL() begin") ); + if( 0 == aContactBuffer.Length()) + { + TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL() aChatDataBuffer is zeor, hence returning ") ); + return; + } + RDesReadStream readAllStream ; + RDesReadStream readStream ; + + readAllStream.Open( aContactBuffer ); + CleanupClosePushL(readAllStream); + + TInt messageCount = readAllStream.ReadInt16L(); + + for( TInt i=0; i< messageCount; i++) + { + SIMCacheChatItem chatItem = + { + 0, + }; + + TInt size = readAllStream.ReadInt16L() ; + HBufC8* mBuffer = HBufC8::NewLC( size ); + TPtr8 mBufferPtr = mBuffer->Des(); + + readAllStream.ReadL( mBufferPtr , size ); + + readStream.Open( *mBuffer ); + CleanupClosePushL(readStream) ; + + chatItem.iServiceId = static_cast( readStream.ReadInt16L() ); + + TInt textSize = readStream.ReadInt16L(); + HBufC* buddyId = HBufC::NewLC( textSize ); + TPtr buddyIdPtr = buddyId->Des(); + readStream.ReadL( buddyIdPtr , textSize); + + chatItem.iBuddyId = buddyId; + + iUpdateHandler.HandleIMCacheEventL( aEventType , &chatItem ); + + CleanupStack::PopAndDestroy(3);//buddyId , close read stream, delete mBuffer. + + } + + CleanupStack::PopAndDestroy();//readAllStream. + + TRACE( T_LIT("CIMCacheClient::InternalizeChatItemL() End") ); + } + + + +// end of file +