diff -r 000000000000 -r e6b17d312c8b imservices/instantmessagingcache/imcacheclient/src/cimcacheupdater.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imservices/instantmessagingcache/imcacheclient/src/cimcacheupdater.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,318 @@ +/* +* 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: write right class implemetation +* +*/ + +// INCLUDE FILES +#include "cimcacheupdater.h" + +#include +// logs +#include "imcachedebugtrace.h" + +#include +#include + +//Received message maximum length is 400 character if received message is +//longer than 400 character truncate it to 400 character +//This must always be in sync with imcvuiapp KReceiveMsgMaxLength +const TInt KReceiveMsgMaxLength = 400; +_LIT(KPercentage, "%"); +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CIMCacheUpdater* CIMCacheUpdater::NewL(TInt aServiceId, + const TDesC& aSenderId ,TBool aRegistrationNeeded ) + { + TRACE( T_LIT("CIMCacheUpdater::NewL begin") ); + CIMCacheUpdater* self = new ( ELeave ) CIMCacheUpdater( aServiceId ) ; + CleanupStack::PushL( self ); + self->ConstructL( aSenderId, aRegistrationNeeded ); + CleanupStack::Pop( self ); //self + TRACE( T_LIT("CIMCacheUpdater::NewL end") ); + return self; + } +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::ConstructL() +// Symbian OS default constructor can leave. +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::ConstructL( const TDesC& aSenderId ,TBool aRegistrationNeeded ) + { + TRACE( T_LIT("CIMCacheUpdater::ConstructL begin") ); + iUserId = aSenderId.AllocL(); + User::LeaveIfError( iClient.Connect() ); + EIMCacheOperations opration = EIMCacheInitUpdate; + if( aRegistrationNeeded ) + { + opration = EIMCacheInitConvesation; + } + iClient.StartTransactionL(opration, iServiceId, *iUserId ); + TRACE( T_LIT("CIMCacheUpdater::ConstructL end") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::~CIMCacheUpdater() +// Destructor +// ----------------------------------------------------------------------------- +// +CIMCacheUpdater::~CIMCacheUpdater() + { + TRACE( T_LIT("CIMCacheUpdater::~CIMCacheUpdater begin") ); + delete iUserId; + //do not close the client session here. since there is also accessor class which is closing the session + //moved this part of code which is common to both udpater and Accessor i.e, client ~CIMCacheClient() + //iClient.Close(); + TRACE( T_LIT("CIMCacheUpdater::~CIMCacheUpdater end") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::CIMCacheUpdater() +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CIMCacheUpdater::CIMCacheUpdater(TInt aServiceId ) + :iServiceId( aServiceId ) + { + TRACE( T_LIT("CIMCacheUpdater::CIMCacheUpdater ") ); + } + + +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::StartNewConversationL() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::StartNewConversationL(const TDesC& aBuddyId ) + { + TRACE( T_LIT("CIMCacheUpdater::StartNewConversationL begin") ); + if( !aBuddyId.Length() ) + { + User::Leave( KErrArgument ) ; + } + iClient.StartTransactionL(EIMCacheStartNewConversation, iServiceId , aBuddyId ); + + TRACE( T_LIT("CIMCacheUpdater::StartNewConversationL end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::AppendReceiveMessageL() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::AppendReceiveMessageL( const TDesC& aBuddyId, + const TDesC& aText ) + { + TRACE( T_LIT("CIMCacheUpdater::AppendReceiveMessageL begin") ); + if( !aBuddyId.Length() ) + { + User::Leave( KErrArgument ) ; + } + TInt len = aText.Length(); + HBufC* bigmsg = NULL; + bigmsg = HBufC::NewLC(KReceiveMsgMaxLength + 1) ; // 1 for % + if( bigmsg ) + { + TRACE( T_LIT("Inside if( bigmsg )") ); + TPtr bigmsgPtr = bigmsg->Des(); + //If message is more than 400 character take only first 400 character + //rest of the message will be lost + bigmsgPtr.Append( aText.Left( KReceiveMsgMaxLength ) ); + if( len > KReceiveMsgMaxLength) + { + //append % as 401st character to identify on UI that it is a + //long message which is truncated + bigmsgPtr.Append(KPercentage); + } + + iClient.StartTransactionL(EIMCacheAppendReceiveMessage, iServiceId, aBuddyId , bigmsgPtr ); + + CleanupStack::PopAndDestroy(bigmsg); // bigmsg + } + TRACE( T_LIT("CIMCacheUpdater::AppendReceiveMessageL end") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::AppendSendMessageL() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::AppendSendMessageL(const TDesC& aText ) + { + TRACE( T_LIT("CIMCacheUpdater::AppendSendMessageL begin") ); + + iClient.StartTransactionL( EIMCacheAppendSendMessage , aText); + TRACE( T_LIT("CIMCacheUpdater::AppendSendMessageL end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::AppendMessageL() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::AppendMessageL(const TDesC& aBuddyId, const TDesC& aText ) + { + TRACE( T_LIT("CIMCacheUpdater::AppendMessageL begin") ); + if( !aBuddyId.Length() ) + { + User::Leave( KErrArgument ) ; + } + iClient.StartTransactionL(EIMCacheAppendMessage, iServiceId, aBuddyId, aText); + TRACE( T_LIT("CIMCacheUpdater::AppendMessageL end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::CloseConversation() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::CloseConversationL( const TDesC& aBuddyId ) + { + TRACE( T_LIT("CIMCacheUpdater::CloseConversationL begin") ); + + if( !aBuddyId.Length() ) + { + User::Leave( KErrArgument ) ; + } + iClient.StartTransactionL( EIMCacheCloseConversation, + iServiceId, + aBuddyId + ); + TRACE( T_LIT("CIMCacheUpdater::CloseConversationL end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::CloseConversation() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::CloseAllConversationL() + { + TRACE( T_LIT("CIMCacheUpdater::CloseAllConversationL begin") ); + iClient.StartTransactionL( EIMCacheCloseAllConversation ); + TRACE( T_LIT("CIMCacheUpdater::CloseAllConversationL end") ); + } +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::DeactivateConversationL() +// ----------------------------------------------------------------------------- +// +TInt CIMCacheUpdater::DeactivateConversationL( ) + { + TRACE( T_LIT("CIMCacheUpdater::DeactivateConversationL begin") ); + + TInt error = iClient.StartTransactionL( EIMCacheDeactivateConversation ); + + TRACE( T_LIT("CIMCacheUpdater::DeactivateAllConversationsL end") ); + return error; + } +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::ServiceId() +// ----------------------------------------------------------------------------- +// +TInt CIMCacheUpdater::ServiceId() const + { + return iServiceId; + } + +// ----------------------------------------------------------------------------- +// CIMCacheAccess::RegisterObserverL() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::RegisterObserverL( MIMCacheEventHandler& aObserver ) + { + TRACE( T_LIT("CIMCacheAccess::RegisterObserverL begin") ); + // update case ETrue says CV is active + // cch need not to register + iClient.RegisterUpdateObserverL( aObserver ); + TRACE( T_LIT("CIMCacheAccess::RegisterObserverL end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheAccess::UnRegisterObserverL() +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::UnRegisterObserver( MIMCacheEventHandler& aObserver ) + { + TRACE( T_LIT("CIMCacheAccess::UnRegisterObserverL begin") ); + iClient.UnRegisterUpdateObserver( aObserver ); + TRACE( T_LIT("CIMCacheAccess::UnRegisterObserverL end") ); + } + +// ----------------------------------------------------------------------------- +// CIMCacheAccess::GetChatListL() +// ----------------------------------------------------------------------------- +// +RArray CIMCacheUpdater::GetChatListL( const TInt aServiceId ) + { + TRACE( T_LIT("CIMCacheUpdater::GetChatListL") ); + RArray chatListArray;//array to hold chat item + TBool more = EFalse; + TPtr8 bufferPtr = iClient.GetChatListL( aServiceId ); + InternalizeChatListL( chatListArray, bufferPtr, more ); + + while( more) + { + bufferPtr = iClient.GetBufferedDataL( EIMCacheGetBufferedPackets ); + InternalizeChatListL( chatListArray, bufferPtr, more ); + } + return chatListArray; + } + +// ----------------------------------------------------------------------------- +// CIMCacheUpdater::InternalizeChatListL +// ----------------------------------------------------------------------------- +// +void CIMCacheUpdater::InternalizeChatListL(RArray& aChatArray, TPtr8 aChatListBuffer ,TBool& aMore ) + { + TRACE( T_LIT("CIMCacheUpdater::InternalizeChatListL() begin") ); + + RDesReadStream readAllStream ; + RDesReadStream readStream ; + + readAllStream.Open( aChatListBuffer ); + 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; + CleanupStack::Pop(buddyId); // ownership to structure variable + aChatArray.Insert(chatItem, 0); + CleanupStack::PopAndDestroy(2);//close read stream, delete mBuffer. + } + aMore = static_cast( readAllStream.ReadInt16L() ); + + CleanupStack::PopAndDestroy();//readAllStream. + + TRACE( T_LIT("CIMCacheUpdater::InternalizeChatListL() End") ); + } + +// END OF FILE