diff -r 000000000000 -r 094583676ce7 wvuing/wvuieng/EngSrc/CCAMessageContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuieng/EngSrc/CCAMessageContainer.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,945 @@ +/* +* Copyright (c) 2004-2005 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: Container class for messages. +* +*/ + + +#include "CCAMessageContainer.h" +#include "PublicEngineDefinitions.h" +#include "CAUtils.h" +#include "MCABufferMemoryHandler.h" +#include "MCAMessageObserver.h" +#include "MCAChatObserver.h" +#include "CCAStorageManagerFactory.h" +#include "MCAStoredGroups.h" +#include "MCAStoredGroup.h" +#include "MCALoggerWriteInterface.h" +#include "ChatDebugPrint.h" +#include "CCALoggerMessageHeader.h" +#include "CALoggerManagerFactory.h" +#include "MCAChatInterface.h" // KSendBufferId +#include "CCAMessageBase.h" +#include "MCAStoredContact.h" +#include "MCAStoredContacts.h" + +#include "impsbuilddefinitions.h" + +#include "ChatDebugAssert.h" + +#include + +_LIT( KGroupIdPart, "/" ); + +//----------------------------------------------------------------------------- +// CCAMessageContainer::CCAMessageContainer +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +CCAMessageContainer::CCAMessageContainer( + MCABufferMemoryHandler& aMemoryHandler ) + : iMemoryHandler( aMemoryHandler ), iAddToContactAsked( EFalse ) + { + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::~CCAMessageContainer +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +CCAMessageContainer::~CCAMessageContainer() + { + if ( iObserver ) + { + iObserver->HandleMessageEvent( MCAMessageObserver::EChatDeleted ); + } + + for ( TInt a( 0 ); a < iMessageContainer.Count(); ++a ) + { + if ( iMessageContainer[ a ]->DecreaseOwnerCount() ) + { + delete iMessageContainer[ a ]; + } + } + iMessageContainer.Reset(); + + NotifyContactForPending(); + + delete iLogger; + delete iServerAddress; + delete iUserId; + delete iTargetId; + delete iScreenName; + delete iDecodedTargetId; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::NewL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +CCAMessageContainer* CCAMessageContainer::NewL( + const TDesC& aServerAddress, + const TDesC& aUserId, + const TDesC& aTargetId, + MCABufferMemoryHandler& aMemoryHandler, + TContainerType aType ) + { + CCAMessageContainer* self = CCAMessageContainer::NewLC( aServerAddress, + aUserId, + aTargetId, + aMemoryHandler, + aType ); + CleanupStack::Pop( self ); + return self; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::NewLC +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +CCAMessageContainer* CCAMessageContainer::NewLC( + const TDesC& aServerAddress, + const TDesC& aUserId, + const TDesC& aTargetId, + MCABufferMemoryHandler& aMemoryHandler, + TContainerType aType ) + { + CCAMessageContainer* self = + new ( ELeave ) CCAMessageContainer( aMemoryHandler ); + CleanupStack::PushL( self ); + self->ConstructL( aServerAddress, aUserId, aTargetId, aType ); + return self; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ConstructL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::ConstructL( const TDesC& aServerAddress, + const TDesC& aUserId, + const TDesC& aTargetId, + TContainerType aType ) + { + iServerAddress = aServerAddress.AllocL(); + iUserId = aUserId.AllocL(); + iTargetId = aTargetId.AllocL(); + iDecodedTargetId = EscapeUtils::EscapeDecodeL( *iTargetId ); + iScreenName = KNullDesC().AllocL(); + + ResolveType( aType ); + + iLogger = CALoggerManagerFactory::WriteInstanceL(); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::UnreadCount +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CCAMessageContainer::UnreadCount( + MCAMessagesReadInterface::TUnreadFilter aUnreadFilter ) const + { + TInt countOfAll = iMessageContainer.Count(); + TInt unreadCount = countOfAll - iUnreadOffset; + if ( aUnreadFilter != EUnreadAll ) + { + for ( TInt a = countOfAll - 1; a >= iUnreadOffset; --a ) + { + if ( iMessageContainer[ a ]->MessagerType() == MCAMessage::EMessageSent ) + { + unreadCount--; + } + } + } + return unreadCount; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::MessageCount +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CCAMessageContainer::MessageCount() const + { + // Offset is index to first unread message. It is exatly same as count of + // read messages. + return iUnreadOffset; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::Read +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::Read( TReadType aReadType, TInt aAmount /* = 0 */ ) + { + TInt messageCount( iMessageContainer.Count() ); + TInt originalUnreadCount = UnreadCount( ); + + switch ( aReadType ) + { + case EReadAll: + iUnreadOffset = messageCount; + break; + case EReadAmount: + iUnreadOffset += aAmount; + break; + case EReadOne: + ++iUnreadOffset; + break; + default: + __CHAT_ASSERT_DEBUG( EFalse ); + return; + } + + // Cannot be more than messageCount + if ( iUnreadOffset > messageCount ) + { + iUnreadOffset = messageCount; + } + + // Inform observers only if unreadcount is changed. + if ( originalUnreadCount != UnreadCount() ) + { + if ( iChatObserver ) + { + iChatObserver->HandleChatEvent( + MCAChatObserver::EUnreadCountChanged ); + } + } + + NotifyContactForPending(); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::Message +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +MCAMessage& CCAMessageContainer::Message( TInt aIndex ) const + { + __CHAT_ASSERT_DEBUG( aIndex >= 0 && aIndex < MessageCount() ); + return *iMessageContainer[ aIndex ]; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ReadNextUnread +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +MCAMessage& CCAMessageContainer::ReadNextUnread() + { + __CHAT_ASSERT_DEBUG( UnreadCount() != 0 ); + Read( EReadOne ); + return *iMessageContainer[ MessageCount() - 1 ]; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ReadUnreadFromIndex +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +MCAMessage& CCAMessageContainer::ReadUnreadFromIndex( TInt aIndex ) + { + __CHAT_ASSERT_DEBUG( UnreadCount() != 0 ); + __CHAT_ASSERT_DEBUG( aIndex >= 0 && aIndex < iMessageContainer.Count() ); + Read( EReadOne ); + return *iMessageContainer[aIndex]; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::SetObserver +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::SetObserver( MCAMessageObserver* aObserver ) + { + iObserver = aObserver; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::SetObserver +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TPtrC CCAMessageContainer::Name() const + { + // Resolve name + switch ( iContainerType ) + { + case EChatContainer: + { + return CAUtils::DisplayId( *iTargetId ); + } + case EGroupContainer: + { + MCAStoredGroup* group = NULL; + TRAPD( err, group = + CCAStorageManagerFactory::GroupListInterfaceL()->FindGroup( + *iTargetId ) ); + if ( err != KErrNone ) + { + CActiveScheduler::Current()->Error( err ); + } + if ( group ) + { + return group->GroupName(); + } + return *iTargetId; + } + default: + { + __CHAT_ASSERT_DEBUG( EFalse ); + return KNullDesC(); + } + } + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::DeleteMessage +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::DeleteMessage( TInt aIndex ) + { + MCAMessage* target = &Message( aIndex ); + iMessageContainer.Remove( aIndex ); + iContainerSizeInBytes -= target->SizeInBytes(); + --iUnreadOffset; + + if ( iObserver ) + { + iObserver->HandleMessageEvent( MCAMessageObserver::EMessageDeleted, + aIndex ); + } + + if ( target->DecreaseOwnerCount() ) + { + delete target; + } + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::AppendL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::AppendL( MCAMessage* aMessage, TBool aSharedOwnership ) + { + if ( !aMessage ) + { + User::Leave( KErrArgument ); + } + + if ( !aSharedOwnership ) + { + CleanupDeletePushL( aMessage ); + } + + // Check memory status + // if failes, leave with KErrNoMemory + if ( !iMemoryHandlingLocked ) + { + if ( !iMemoryHandler.FreeMemoryIfNeededL( aMessage->SizeInBytes() ) ) + { + User::Leave( KErrNoMemory ); + } + } + + iMessageContainer.AppendL( aMessage ); + iContainerSizeInBytes += aMessage->SizeInBytes(); + + if ( !aSharedOwnership ) + { + CleanupStack::Pop( aMessage ); + } + + aMessage->IncreaseOwnerCount(); + + aMessage->SetContainerInfo( this ); + + // Record message if logging is on + if ( iLogger->IsLoggingOn() ) + { + iLogger->MakeLogL( aMessage->LoggerMessage() ); + } + + CHAT_DP( D_CHAT_LIT( "Address: %s, UserId: %s, Sender %s, Recipient %s" ), + &aMessage->ServerAddress(), + &aMessage->UserId(), + &aMessage->Sender(), + &aMessage->Recipient() ); + + CCAMessageBase* messageBase = static_cast< CCAMessageBase* >( aMessage ); + messageBase->SetContentProcessObserver( this ); + + if ( iObserver ) + { + iObserver->HandleMessageEvent( MCAMessageObserver::ENewMessage ); + } + + if ( iChatObserver ) + { + iChatObserver->HandleChatEvent( MCAChatObserver::EUnreadCountChanged, + aMessage ); + } + + NotifyContactForPending(); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::SetScreenNameL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::SetScreenNameL( const TDesC& aScreenName ) + { + HBufC* newSn = aScreenName.AllocL(); + delete iScreenName; + iScreenName = newSn; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::OwnScreenName +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +const TDesC& CCAMessageContainer::OwnScreenName() const + { + return ScreenName(); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::LockBufferMemoryHandling +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +// +void CCAMessageContainer::LockBufferMemoryHandling( TBool aLocked ) + { + iMemoryHandlingLocked = aLocked; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ServerAddress +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +// +TTime CCAMessageContainer::Time() + { + TTime time = Time::NullTTime(); + TInt count = iMessageContainer.Count(); + if ( count == 0 ) + { + // no messages, return null + return time; + } + return iMessageContainer[count - 1]->TimeStamp(); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ServerAddress +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +const TDesC& CCAMessageContainer::ServerAddress() const + { + if ( !iServerAddress ) + { + return KNullDesC; + } + return *iServerAddress; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::UserId +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +const TDesC& CCAMessageContainer::UserId() const + { + if ( !iUserId ) + { + return KNullDesC; + } + return *iUserId; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::Target +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +const TDesC& CCAMessageContainer::Target() const + { + if ( !iTargetId ) + { + return KNullDesC; + } + return *iTargetId; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ScreenName +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +const TDesC& CCAMessageContainer::ScreenName() const + { + if ( iScreenName ) + { + return *iScreenName; + } + return KNullDesC; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::SetAddToContactAsked +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::SetAddToContactAsked( TBool aIsAsked ) + { + iAddToContactAsked = aIsAsked; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::IsAddToContactAsked +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TBool CCAMessageContainer::IsAddToContactAsked() const + { + return iAddToContactAsked; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::Target +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::HandleProcessingComplete( + MCAContentProcessor& /* aProcessor */, + MCAMessage& aMessage, TInt /* aStatus */ ) + { + TInt count( iMessageContainer.Count() ); + if ( !iObserver ) // No observer. No need of informing anything. + { + return; + } + for ( TInt index( count - 1 ); index >= 0; --index ) + { + if ( iMessageContainer[ index ] == &aMessage ) + { + iObserver->HandleMessageEvent( MCAMessageObserver::EMessageChanged, + index ); + return; + } + } + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::OrderUid +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CCAMessageContainer::OrderUid( const CCAMessageContainer& aSourceA, + const CCAMessageContainer& aSourceB ) + { + // First Server + // Then UserId + // Last Target + + + /* TInt res = CAUtils::NeutralCompare( aSourceA.ServerAddress(), + aSourceB.ServerAddress() ); + if( res != 0 ) + { + return res; + } + res = CAUtils::NeutralCompare( aSourceA.UserId(), aSourceB.UserId() ); + if( res != 0 ) + { + return res; + }*/ + + return CAUtils::NeutralCompare( aSourceA.ComparableTarget(), + aSourceB.ComparableTarget() ); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ContainerType +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +MCAMessagesReadInterface::TContainerType CCAMessageContainer::ContainerType() const + { + return iContainerType; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ResolveType +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::ChangeIdL( const TDesC& aServerAddress, + const TDesC& aUserId, + const TDesC& aTargetId, + TContainerType aType ) + { + HBufC* newServer = aServerAddress.AllocLC(); + HBufC* newUser = aUserId.AllocLC(); + HBufC* newTarget = aTargetId.AllocLC(); + HBufC* newDecoded = EscapeUtils::EscapeDecodeL( *newTarget ); + CleanupStack::Pop( 3, newServer ); + + delete iServerAddress; + delete iUserId; + delete iTargetId; + delete iDecodedTargetId; + + iServerAddress = newServer; + iUserId = newUser; + iTargetId = newTarget; + iDecodedTargetId = newDecoded; + + ResolveType( aType ); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ResolveType +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +const TDesC& CCAMessageContainer::MessageRecipient( TInt aOperationCode, + TInt& aStatus ) const + { + TInt index = FindIndex( aOperationCode ); + if ( index >= 0 ) + { + aStatus = KErrNone; + return iMessageContainer[ index ]->Recipient(); + } + aStatus = index; + return KNullDesC; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ResolveType +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::SetChatObserver( MCAChatObserver* aObserver ) + { + iChatObserver = aObserver; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ResolveType +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::ResolveType( TContainerType aType ) + { + if ( aType != ENoneContainer ) + { + iContainerType = aType; + } + else if ( iTargetId->Compare( KSendBufferId ) == 0 + || iTargetId->Compare( KLoggerBufferId ) == 0 ) + { + iContainerType = ESendContainer; + } + else if ( iTargetId->FindC( KGroupIdPart ) == KErrNotFound ) + { + iContainerType = EChatContainer; + } + else + { + iContainerType = EGroupContainer; + } + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::StartLoggingL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::StartLoggingL( const TDesC& aLogFilename ) + { + CHAT_DP_FUNC_ENTER( "StartLoggingL" ); + __CHAT_ASSERT_DEBUG( iLogger ); + + if ( iLogger->IsLoggingOn() ) + { + User::Leave( KErrInUse ); + } + + TChatType type = ( iContainerType == EGroupContainer ) + ? EGroupChat : EPTOPChat; + //Create new headermessage for history file. + CCALoggerMessageHeader* file = + CCALoggerMessageHeader::NewL( aLogFilename, + Name(), + type ); + //Start logging. The ownership of the file is transferred + iLogger->StartLoggingL( file ); + + // Flush already got messages to logfile. + if ( iLogger->IsLoggingOn() ) + { + // Write the contents of message buffer to log + TInt count( iMessageContainer.Count() ); + for ( TInt a( 0 ); a < count; ++a ) + { + iLogger->MakeLogL( iMessageContainer[ a ]->LoggerMessage() ); + } + } + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::EndLoggingL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::EndLoggingL() + { + CHAT_DP_FUNC_ENTER( "EndLoggingL" ); + + //If logging is not on. we do not call endlogging. + //Endlogging will leave with KErrNotReady if we call it without + //logging on. + if ( !iLogger->IsLoggingOn() ) + { + CHAT_DP_FUNC_DONE( "EndLoggingL" ); + return; + } + + //End logging. + iLogger->EndLoggingL(); + CHAT_DP_FUNC_DONE( "EndLoggingL" ); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::IsLoggingL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TBool CCAMessageContainer::IsLoggingOn() const + { + return iLogger->IsLoggingOn(); + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::FindIndex +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CCAMessageContainer::FindIndex( TInt aOperationCode ) const + { + // Use count of all messages when finding with operationcode. + TInt count( iMessageContainer.Count() ); + for ( TInt a( 0 ); a < count; ++a ) + { + if ( iMessageContainer[ a ]->OperationCode() == aOperationCode ) + { + return a; + } + } + return KErrNotFound; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::FindIndex +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CCAMessageContainer::FindIndex( MCAMessage& aMessage ) const + { + // Use count of all messages when finding with operationcode. + TInt count( iMessageContainer.Count() ); + for ( TInt a( 0 ); a < count; ++a ) + { + if ( iMessageContainer[ a ] == &aMessage ) + { + return a; + } + } + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CCAMessageContainer::TargetId +// ( Other items commented in header ) +// ----------------------------------------------------------------------------- +// +MCAMessageContainerInfo& CCAMessageContainer::TargetId() + { + return *this; + } + + + +// ----------------------------------------------------------------------------- +// CCAMessageContainer::Lock +// locks messagecontainer if needed. +// ----------------------------------------------------------------------------- +// +void CCAMessageContainer::Lock( TBool aLocked ) + { + iLocked = aLocked; + } + +// ----------------------------------------------------------------------------- +// CCAMessageContainer::MakeLogL +// Tries to make log if possible. +// ----------------------------------------------------------------------------- +// +void CCAMessageContainer::MakeLogL( MCALoggerMessage& aMessage ) + { + CHAT_DP_FUNC_ENTER( "MakeLogL" ); + if ( iLogger->IsLoggingOn() ) + { + TRAPD( ret, iLogger->MakeLogL( aMessage ) ) + if ( ret != KErrNone ) + { + TInt ignore; + TRAP( ignore, iLogger->EndLoggingL() ) + CActiveScheduler::Current()->Error( ret ); + } + } + CHAT_DP_FUNC_DONE( "MakeLogL" ); + } + +// ----------------------------------------------------------------------------- +// CCAMessageContainer::NotifyContactForPending +// ( Other items commented in header ) +// ----------------------------------------------------------------------------- +// +void CCAMessageContainer::NotifyContactForPending() const + { + TInt ignore; + TRAP( ignore, + CCAStorageManagerFactory::ContactListInterfaceL()-> + SetPendingMessages( *iTargetId, UnreadCount( + MCAMessagesReadInterface::EUnreadReceived ) ) ); + } + +// ----------------------------------------------------------------------------- +// CCAMessageContainer::ComparableTarget +// ( Other items commented in header ) +// ----------------------------------------------------------------------------- +// +const TDesC& CCAMessageContainer::ComparableTarget() const + { + if ( !iDecodedTargetId ) + { + return KNullDesC; + } + return *iDecodedTargetId; + } + +// ----------------------------------------------------------------------------- +// CCAMessageContainer::AllMessagesCount +// ( Other items commented in header ) +// ----------------------------------------------------------------------------- +// +TInt CCAMessageContainer::AllMessagesCount() const + { + return iMessageContainer.Count(); + } + +// ----------------------------------------------------------------------------- +// CCABufferManager::NotifyContactForPending +// ( Other items commented in header ) +// ----------------------------------------------------------------------------- +// +MCAMessage& CCAMessageContainer::MessageFromAll( TInt aIndex ) const + { + __CHAT_ASSERT_DEBUG( aIndex >= 0 && aIndex < AllMessagesCount() ); + return *iMessageContainer[ aIndex ]; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::DeleteMessageFromAll +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +// +void CCAMessageContainer::DeleteMessageFromAll( TInt aIndex ) + { + MCAMessage* target = &MessageFromAll( aIndex ); + iMessageContainer.Remove( aIndex ); + iContainerSizeInBytes -= target->SizeInBytes(); + if ( iUnreadOffset > aIndex ) + { + --iUnreadOffset; + } + + if ( iObserver ) + { + iObserver->HandleMessageEvent( MCAMessageObserver::EMessageDeleted, + aIndex ); + } + + if ( target->DecreaseOwnerCount() ) + { + delete target; + } + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::IsLocked +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +// +TBool CCAMessageContainer::IsLocked() const + { + return iLocked || iMemoryHandlingLocked; + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::ContainerSizeInBytes +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +// +TInt CCAMessageContainer::ContainerSizeInBytes() const + { + return iContainerSizeInBytes; + } + +//fix - refer Ui Spec Approved Version 1.0 (Instant Messaging NG 001 151006.pdf) +//Section 10.2.10 Pg 131 - +//"In case user has saved the image already or sent it by himself, +// this option(save) is not available." +//----------------------------------------------------------------------------- +// CCAMessageContainer::ReLoggingL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +// +void CCAMessageContainer::ReLoggingL( MCALoggerMessageHeader& aFile ) + { + CHAT_DP_FUNC_ENTER( "ReLoggingL" ); + __CHAT_ASSERT_DEBUG( iLogger ); + + if ( iLogger->IsLoggingOn() ) + { + User::Leave( KErrInUse ); + } + + //Start logging. The ownership of the file is transferred + iLogger->ReLoggingL( aFile ); + + // Flush already got messages to logfile. + if ( iLogger->IsLoggingOn() ) + { + // Write the contents of message buffer to log + TInt count( iMessageContainer.Count() ); + for ( TInt a( 0 ); a < count; ++a ) + { + iLogger->MakeLogL( iMessageContainer[ a ]->LoggerMessage() ); + } + } + } + +//----------------------------------------------------------------------------- +// CCAMessageContainer::EndReLoggingL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CCAMessageContainer::EndReLoggingL() + { + CHAT_DP_FUNC_ENTER( "EndReLoggingL" ); + + //If logging is not on. we do not call endlogging. + //Endlogging will leave with KErrNotReady if we call it without + //logging on. + if ( !iLogger->IsLoggingOn() ) + { + CHAT_DP_FUNC_DONE( "EndReLoggingL" ); + return; + } + + //End logging. + iLogger->EndReLogging(); + CHAT_DP_FUNC_DONE( "EndReLoggingL" ); + } + + +// end of file