diff -r 000000000000 -r 094583676ce7 wvuing/wvuiprocess/Src/CCAConversationPC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiprocess/Src/CCAConversationPC.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,678 @@ +/* +* Copyright (c) 2006 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: Process Component for Conversations/Groups +* +*/ + + + +// INCLUDE FILES + +#include "CCAConversationPC.h" + +#include "MCAGroupManagerInterface.h" +#include "MCAConversationObserverPC.h" +#include "CCAStorageManagerFactory.h" +#include "ChatDebugPrint.h" +#include "ChatDefinitions.h" +#include "MCAStoredContacts.h" +#include "MCAStoredContact.h" +#include "CAUtils.h" +#include "MCAMessage.h" +#include "MCAChatInterface.h" +#include "MCAMessagesWriteInterface.h" +#include "MCAMessagesReadInterface.h" +#include "MCAMessageContainerInfo.h" +#include "PublicEngineDefinitions.h" +#include "MCAStoredGroups.h" +#include "MCAStoredGroup.h" +#include "CCAEngine.h" +#include "ImpsCSPAllErrors.h" +#include "MCAMessageUtils.h" +#include "MCAMessageErrorInformer.h" +#include "MCASettings.h" +#include "MCAMessageCreator.h" +#include "TEnumsPC.h" +#include "CCAServerContactsArrayPC.h" +#include "MCAServerContactsArrayPC.h" + + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CCAConversationPC::NewL +// ----------------------------------------------------------------------------- +// +CCAConversationPC* CCAConversationPC::NewL( CCAEngine& aEngine ) + { + + CCAConversationPC* self = new ( ELeave ) CCAConversationPC( aEngine ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CCAConversationPC::~CCAConversationPC() + { + delete iContactId; + + iObserver = NULL; + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC::CCAConversationPC +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCAConversationPC::CCAConversationPC( CCAEngine& aEngine ) + : iEngine( aEngine ) + { + + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC::ConstructL +// ----------------------------------------------------------------------------- +void CCAConversationPC::ConstructL() + { + iContacts = CCAStorageManagerFactory::ContactListInterfaceL(); + + iGroups = CCAStorageManagerFactory::GroupListInterfaceL(); + + iChatInterface = &iEngine.ChatInterface(); + + } + + + +// ----------------------------------------------------------------------------- +// CCAConversationPC::CloseConversations +// ----------------------------------------------------------------------------- +// + +void CCAConversationPC::CloseConversations() + { + iChatInterface->CloseAllContainers(); + } + +// ----------------------------------------------------------------------------- +// CCAConversationPC::LeaveJoinedGroupsL +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::LeaveJoinedGroupsL() + { + iEngine.GetGroupInterface()->LeaveJoinedGroupsL(); + } + + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: HandleContactDelete +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::HandleContactDelete( const TDesC& aContact ) + { + + iObserver->HandleContactChange( aContact ); + + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: HandleAddition +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::HandleAddition( MCAContactList& /*aList*/, MCAStoredContact& aContact ) + { + + if ( CAUtils::NeutralCompare( aContact.UserId(), *iContactId ) == 0 ) + { + iObserver->HandleContactChange( aContact.UserId() ); + + } + + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: HandleChange +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::HandleChange( MCAContactList* /*aList*/, MCAStoredContact* aContact, + TStorageManagerGlobals::TCAObserverEventType aEventType, + TBool /*aUserIdChanged*/ ) + { + + const TDesC& userId = ( aContact ? aContact->UserId() : KNullDesC ); + + if ( aContact ) + { + + + if ( !iContactId ) + { + return; + } + if ( CAUtils::NeutralCompare( userId, *iContactId ) == 0 ) + { + // TO be added later. If required. + + } + } + else if ( aEventType == TStorageManagerGlobals::EStorageEventMultipleChanges ) + { + // TO be added later. If required. + // multiple contacts were added, update title + + } + + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: HandleChatEvent +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::HandleChatEvent( TChatEventType aEvent, + MCAMessage* aMessage /*= NULL*/ ) + { + + const TDesC& wvid( aMessage ? aMessage->Sender() : KNullDesC ); + const TPtrC& identification( aMessage ? iContacts->Identification( wvid ) : KNullDesC() ); + + if ( aEvent == EUnreadCountChanged && aMessage ) + { + if ( aMessage->MessageType() != MCAMessage::EMessagePTOP ) + { + // don't show flasher if this isn't p2p message + // or if there's no container (this view isn't active) + return; + } + + //fix - When image is sent within our application + //the wvid is KNullDesC(), + //This is to avoid adding this KNullDesC to our chat store + if ( !CAUtils::NeutralCompare( wvid, KNullDesC ) ) + { + return; + } + + // Show flasher if sender is not iContactId or own id + if ( ( CAUtils::NeutralCompare( wvid, *iContactId ) != 0 ) && + ( CAUtils::NeutralCompare( + wvid, iContacts->OwnStatus().UserId() ) != 0 ) ) + { + iObserver->HandleChatEvent( wvid , identification ); + } + } + } + + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: HandleMessageError +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::HandleMessageError( TInt aError, MCAMessage* aMessage ) + { + + TPtrC nick( KNullDesC ); + if ( aMessage ) + { + if ( aMessage->ContentType() == MCAMessage::EContentPicture ) + { + iObserver->HandleMessageError( aError, KNullDesC(), TEnumsPC::EContentPicture ); + return; + } + + nick.Set( iContacts->Identification( aMessage->Recipient() ) ); + } + + CHAT_DP( D_CHAT_LIT( "CCAConversationsContainer::\ + DoHandleMessageErrorL %d %S" ), + aError, &nick ); + + if ( aError == ECSPUnknownUserId ) + { + // This way error can be recognized in note mapper + aError += Imps_ERROR_BASE; + } + + iObserver->HandleMessageError( aError, nick, TEnumsPC::EContentOther ); + + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: DeleteChatL +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::DeleteChatL( const TDesC& aServerAddress, + const TDesC& aUserId, + const TDesC& aTargetId /*= KSendBufferId*/ ) + { + iChatInterface->DeleteChatL( aServerAddress, + aUserId, + aTargetId ); + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: InitialiseResourcesL +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::InitialiseResourcesL( const TDesC& aContactId ) + { + + iContactId = aContactId.AllocL(); + + // resolve message read interface + iReadInterface = + &iChatInterface->MessageReadInterfaceL( KNullDesC, KNullDesC, *iContactId ); + iWriteInterface = + &iChatInterface->MessageWriteInterfaceL( KNullDesC, KNullDesC ); + + + iContacts->AddObserverL( this );// listen these events.. + // Register this as chat observer + iChatInterface->RegisterChatObserver( this ); + + const MCAMessageUtils& mUtils = iEngine.MessageUtils(); + mUtils.MessageErrorInformer().RegisterObserver( this ); + + iMsgContainerInfo = &iReadInterface->TargetId(); + + } + + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: ReleaseResources +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::ReleaseResources() + { + + iContacts->RemoveObserver( this ); + + iChatInterface->UnregisterChatObserver( this ); + + const MCAMessageUtils& mUtils = iEngine.MessageUtils(); + mUtils.MessageErrorInformer().UnregisterObserver( this ); + + if ( iContactId ) + { + delete iContactId; + + iContactId = NULL; + } + + } + + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: GetIdentification +// ----------------------------------------------------------------------------- +// +const TPtrC CCAConversationPC:: +GetIdentification( const TDesC& aContactId ) + { + return iContacts->Identification( aContactId ); + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: GetActiveConversationReadInterfaceId +// ----------------------------------------------------------------------------- +// +const TDesC& CCAConversationPC::GetReadInterfaceId() + { + return iMsgContainerInfo->Target(); + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: GetLogFileName +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::GetLogFileName( TPtr& aLogFileNamePtr ) + { + aLogFileNamePtr.Copy( iContacts->Identification( + iMsgContainerInfo->Target() ).Left( KMaxLogFileName ) ); + + + } + + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: StartLoggingL +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::RecordChatL( const TDesC& aLogFilename ) + { + iReadInterface->StartLoggingL( aLogFilename ); + + if ( iReadInterface->IsLoggingOn() ) + { + iReadInterface->EndLoggingL(); + } + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: SendMessageL +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::SendMessageL( const TDesC& aMessageBuffer ) + { + + MCAMessageCreator& creator = iEngine.MessageUtils().MessageCreator(); + + HBufC* ownId = iEngine.GetInternalSettingsInterface()->ValueL( + MCASettings::EOwnWVUserID ); + CleanupStack::PushL( ownId ); + + MCAMessageCreator::SMessageData data = + { + KMessageDataVersion, + 0, + KNullDesC, + KNullDesC, + *ownId, + iMsgContainerInfo->Target(), // Recipient + NULL, + NULL, + aMessageBuffer, + KNullDesC8, + KNullDesC8, + MCAMessage::EMessageSent + }; + + iWriteInterface->AppendL( creator.CreateMessageL( data ) ); + + CleanupStack::PopAndDestroy( ownId ); + + } + + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: PopulateGroupDetailsLC +// ----------------------------------------------------------------------------- +// +MCAServerContactsArrayPC* CCAConversationPC::PopulateGroupDetailsLC() + { + RPointerArray groupList; + + CDesCArray* groupNames = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupNames ); + + CDesCArray* groupIds = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupIds ); + + CleanupClosePushL( groupList ); + iGroups->PopulateGroupsListL( groupList ); + + // there's no need to skip groups in this case. but we do need to make sure + // the pairs are in correct order after sorting + + // we can use CCAServerContactsArray, as we deal with descriptor tuple + // just as with contacts. the class naming is a bit misleading + + TInt count( groupList.Count() ); + for ( TInt index( 0 ); index < count; index++ ) + { + groupNames->AppendL( groupList[ index ]->GroupName() ); + groupIds->AppendL( groupList[ index ]->GroupId() ); + } + + CleanupStack::PopAndDestroy(); // groupList.Close() + + CleanupStack::Pop( 2, groupNames ); // groupIds,groupNames + + CCAServerContactsArrayPC* pairsArray = + CCAServerContactsArrayPC::NewL( groupNames, groupIds, KNullDesC ); + + //Not owned. Transfer ownership of pairsArray to the caller. + //since we return as MCAServerContactsArrayPC object sliciing will happen + //so its better to push the original data onto stack + CleanupStack::PushL( pairsArray ); + + return pairsArray; + + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: AddObserverL +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::AddObserver( + MCAConversationObserverPC* aObserver ) + { + + ASSERT( aObserver ); + + iObserver = aObserver; + + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: RemoveObserver +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::RemoveObserver() + { + iObserver = NULL; + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: GetReadInterfaceName +// ----------------------------------------------------------------------------- +// +TPtrC CCAConversationPC::GetReadInterfaceName() + { + return iReadInterface->Name() ; + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: ReadInterface +// ----------------------------------------------------------------------------- +// +MCAMessagesReadInterface& CCAConversationPC::ReadInterfaceL() const + { + if ( !iReadInterface ) + { + User::Leave( KErrGeneral ); + } + return *iReadInterface; + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: WriteInterface +// ----------------------------------------------------------------------------- +// +MCAMessagesWriteInterface& CCAConversationPC::WriteInterfaceL() const + { + if ( !iWriteInterface ) + { + User::Leave( KErrGeneral ); + } + return *iWriteInterface; + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: SetActiveConversationL +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::SetActiveConversationL( const TDesC& aWvId ) + { + + if ( iContactId ) + { + delete iContactId; + + iContactId = NULL; + } + + iContactId = aWvId.AllocL(); + + // resolve message read interface + iReadInterface = + &iChatInterface->MessageReadInterfaceL( KNullDesC, KNullDesC, *iContactId ); + + iMsgContainerInfo = &iReadInterface->TargetId(); + + } + +// ----------------------------------------------------------------------------- +// CCAConversationPC: GroupCount +// ----------------------------------------------------------------------------- +// +TInt CCAConversationPC::GroupCount( TBool aOnlyVisible ) + { + return iGroups->GroupCount( aOnlyVisible ) ; + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: ContactCount +// ----------------------------------------------------------------------------- +// +TInt CCAConversationPC::ContactCount() + { + return iContacts->ContactCount(); + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: CheckReply +// ----------------------------------------------------------------------------- +// +void CCAConversationPC::CheckReply( TPtrC& aWvid, TBool& aContactInlist ) + { + if ( !iReadInterface->TargetId().IsAddToContactAsked() ) + { + // Set true, so we do not try to check this one again. + iReadInterface->TargetId().SetAddToContactAsked( ETrue ); + + if ( iReadInterface->MessageCount() ) + { + aWvid.Set( iMsgContainerInfo->Target() ); + + if ( !iContacts->FindAnyContact( aWvid ) ) + { + aContactInlist = EFalse; + } + + } + } + } + +// ----------------------------------------------------------------------------- +// CCAConversationPC: FindAnyContact +// ----------------------------------------------------------------------------- +// +TBool CCAConversationPC::FindAnyContact( const TDesC& aContactId ) + { + + if ( iContacts->FindAnyContact( aContactId ) ) + { + return ETrue; + } + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CCAConversationPC: IsActiveConversation +// ----------------------------------------------------------------------------- +// +TBool CCAConversationPC::IsActiveConversation( const TDesC& aContactId ) + + { + TBool retValue = EFalse; + + if ( iContactId ) + { + if ( !CAUtils::NeutralCompare( aContactId, *iContactId ) ) + { + retValue = ETrue; + } + } + + return retValue; + } + + + +//----------------------------------------------------------- +//CCAConversationPC::SetMessageReadInterfaceL +//----------------------------------------------------------- +void CCAConversationPC::SetMessageReadInterfaceL( const TDesC& aWvId ) + { + + CHAT_DP( D_CHAT_LIT( " Trying to find chat data for %S" ), aWvId ); + + iReadInterface = &iChatInterface->MessageReadInterfaceL( KNullDesC, KNullDesC, aWvId ); + + iMsgContainerInfo = &iReadInterface->TargetId(); + + } + + + +//----------------------------------------------------------- +//CCAConversationPC::SetMessageReadInterfaceL +//----------------------------------------------------------- +void CCAConversationPC::SetMessageWriteInterfaceL() + { + + iWriteInterface = &iChatInterface->MessageWriteInterfaceL( KNullDesC, KNullDesC ); + + } + + +//----------------------------------------------------------- +//CCAConversationPC::MessageCount +//----------------------------------------------------------- +TInt CCAConversationPC::MessageCount() + { + if ( iReadInterface ) + { + return iReadInterface->MessageCount(); + } + + return 0; + + } +// End of File