diff -r 000000000000 -r 094583676ce7 wvuing/wvuiprocess/Src/ccagrouppc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiprocess/Src/ccagrouppc.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,612 @@ +/* +* 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: Implementation for PC Group Interface +* +*/ + + + +// INCLUDE FILES +#include "ccagrouppc.h" +#include "MCAStoredGroups.h" +#include "CCAStorageManagerFactory.h" +#include "mcagroupobserverpc.h" +#include "CCAEngine.h" +#include "MCAChatInterface.h" +#include "mcamessageswriteinterface.h" +#include "mcamessagecontainerinfo.h" +#include "MCAStoredGroup.h" +#include "MCAMessage.h" +#include "MCAStoredContacts.h" +#include "MCAGroupEventObserverPC.h" +#include "MCAGroupOperations.h" +#include "MCAGroupManagerInterface.h" +#include "MCAExtendedStoredGroup.h" +#include "MCAMessageUtils.h" +#include "MCAMessageErrorInformer.h" +#include "MCAMessageCreator.h" +#include "CAUtils.h" +#include "CCAServerContactsArrayPC.h" +#include "CAPresenceManager.h" +#include "MCAPresence.h" + + + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CCAGroupPC: Constructor +// ----------------------------------------------------------------------------- +// +CCAGroupPC::CCAGroupPC( MCAGroupManagerInterface* aGroupInterface, + MCAChatInterface& aChatInterface, + const MCAMessageUtils& aMessageUtils ) + : iGroupInterface( aGroupInterface ), + iChatInterface( aChatInterface ), + iMessageUtils( aMessageUtils ) + + { + } + + +// ----------------------------------------------------------------------------- +// CCAGroupPC: NewL +// ----------------------------------------------------------------------------- +// +CCAGroupPC* CCAGroupPC::NewL( MCAGroupManagerInterface* aGroupInterface, + MCAChatInterface& aChatInterface, + const MCAMessageUtils& aMessageUtils ) + { + CCAGroupPC* self = new ( ELeave ) CCAGroupPC( aGroupInterface, + aChatInterface, aMessageUtils ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: ConstructL +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::ConstructL( ) + { + iStoredGroups = CCAStorageManagerFactory::GroupListInterfaceL(); + iStoredContacts = CCAStorageManagerFactory::ContactListInterfaceL(); + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: Destructor +// ----------------------------------------------------------------------------- +// +CCAGroupPC::~CCAGroupPC() + { + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: RegisterGroupObserver +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::RegisterGroupObserver( MCAGroupObserverPC* aGroupObserverPC ) + { + ASSERT( aGroupObserverPC ); + iGroupObserverPC = aGroupObserverPC; + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: UnRegisterGroupObserver +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::UnRegisterGroupObserver() + { + iGroupObserverPC = NULL; + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: SetGroupEventObserverL +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::SetGroupEventObserverL( MCAGroupEventObserverPC* aGroupEventObserverPC, + const TDesC& aGroupId ) + { + iGroupEventObserverPC = aGroupEventObserverPC; + + if ( !iGroupInterface ) + { + return; + } + + // Register this as chat observer + if ( iGroupEventObserverPC ) + { + iGroupInterface->SetGroupEventObserverL( aGroupId, this ); + } + else + { + iGroupInterface->SetGroupEventObserverL( aGroupId, NULL ); + } + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: ActiveGroupId +// ----------------------------------------------------------------------------- +// +const TDesC& CCAGroupPC::ActiveGroupId() + { + return iReadInterface->TargetId().Target(); + } + + +// ----------------------------------------------------------------------------- +// CCAGroupPC: ScreenName +// ----------------------------------------------------------------------------- +// +const TDesC& CCAGroupPC::ScreenName() const + { + + if ( iReadInterface ) + { + return iReadInterface->TargetId().ScreenName(); + } + + + // Fix warning: #940-D: missing return statement at end of non-void function + else + { + return KNullDesC(); + } + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: IsLoggingOn +// ----------------------------------------------------------------------------- +// +TBool CCAGroupPC::IsLoggingOn() const + { + return iReadInterface->IsLoggingOn(); + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: EndLoggingL +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::EndLoggingL() + { + iReadInterface->EndLoggingL(); + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: SaveChatL +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::SaveChatL( const TDesC& aLogFilename ) + { + iReadInterface->StartLoggingL( aLogFilename ); + + if ( iReadInterface->IsLoggingOn() ) + { + iReadInterface->EndLoggingL(); + } + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: GetPropertiesL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupPC::GetPropertiesL( TBool& aIsGroupProps ) + { + if ( !iGrOps ) + { + return KErrGeneral; + } + + TInt err( KErrNone ); + err = iGrOps->GetPropertiesL( iGroupProps, iPrivateProps ); + if ( iGroupProps ) + { + aIsGroupProps = ETrue; + } + else + { + aIsGroupProps = EFalse; + } + return err; + + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: GroupName +// ----------------------------------------------------------------------------- +// +TPtrC CCAGroupPC::GroupName( ) const + { + if ( !iGroupProps ) + { + return KNullDesC(); + } + return iGroupProps->GroupName(); + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: IsPrivateAllowed +// ----------------------------------------------------------------------------- +// +TEnumsPC::TImpsPropertyBoolPC CCAGroupPC::IsPrivateAllowed() + { + return ConvertTImpsPropertyBoolToTEnumsPC( iGroupProps->IsPrivateAllowed() ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: IsOpen +// ----------------------------------------------------------------------------- +// +TEnumsPC::TImpsPropertyBoolPC CCAGroupPC::IsOpen() + { + return ConvertTImpsPropertyBoolToTEnumsPC( iGroupProps->IsOpen() ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC::ConvertTImpsPropertyBoolToTEnumsPC +// ----------------------------------------------------------------------------- +// +TEnumsPC::TImpsPropertyBoolPC CCAGroupPC::ConvertTImpsPropertyBoolToTEnumsPC +( TImpsPropertyBool aEventSource ) + { + + switch ( aEventSource ) + { + case EImpsPropUndef: + { + return TEnumsPC::EImpsPropUndef; + } + case EImpsPropNo: + { + return TEnumsPC::EImpsPropNo; + } + case EImpsPropYes: + { + return TEnumsPC::EImpsPropYes; + } + + default: + { + return TEnumsPC::EImpsPropUndef; + } + } + } + + +// --------------------------------------------------------- +// CCAGroupPC::GroupCount +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CCAGroupPC::GroupCount( TBool aOnlyVisible ) const + { + return iStoredGroups->GroupCount( aOnlyVisible ); + } + + +// --------------------------------------------------------- +// CCAGroupPC::ContactCount +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CCAGroupPC::ContactCount( TBool aSkipOfflineContacts ) const + { + return iStoredContacts->ContactCount( aSkipOfflineContacts ); + } + + +// ----------------------------------------------------------------------------- +// CCAGroupPC: InitialiseResourcesL +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::InitialiseResourcesL( const TDesC& aGroupId ) + { + //can be used as data member if used many times + if ( iGroupId ) + { + delete iGroupId ; + iGroupId = NULL; + } + iGroupId = aGroupId.AllocL(); + + // resolve message read interface + //read/write interface can be done in ctor after complete refactoring + iReadInterface = + &( iChatInterface.MessageReadInterfaceL( KNullDesC, KNullDesC, *iGroupId ) ); + iWriteInterface = + &( iChatInterface.MessageWriteInterfaceL( KNullDesC, KNullDesC ) ); + + iStoredGroup = iStoredGroups->FindGroup( *iGroupId ); + if ( iGroupInterface ) + { + iGrOps = iGroupInterface->GroupOperationsL( *iGroupId ); + } + // Register this as chat observer + iChatInterface.RegisterChatObserver( this ); + //register this as message error observer + iMessageUtils.MessageErrorInformer().RegisterObserver( this ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: ReleaseResources +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::ReleaseResources() + { + iChatInterface.UnregisterChatObserver( this ); + iMessageUtils.MessageErrorInformer().UnregisterObserver( this ); + + delete iGroupId; + iGroupId = NULL; + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: ReadInterface +// ----------------------------------------------------------------------------- +// +MCAMessagesReadInterface& CCAGroupPC::ReadInterfaceL() const + { + if ( !iReadInterface ) + { + User::Leave( KErrGeneral ); + } + return *iReadInterface; + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: WriteInterface +// ----------------------------------------------------------------------------- +// +MCAMessagesWriteInterface& CCAGroupPC::WriteInterfaceL() const + { + if ( !iWriteInterface ) + { + User::Leave( KErrGeneral ); + } + return *iWriteInterface; + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC: HandleChatEvent +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::HandleChatEvent( TChatEventType aEvent, MCAMessage* aMessage ) + { + + 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; + } + + const TDesC& wvid( aMessage->Sender() ); + + // nickname or wv-less contact id + + if ( iGroupObserverPC && iStoredContacts ) + { + iGroupObserverPC->HandleChatEvent( wvid , + iStoredContacts->Identification( wvid ) ) ; + } + } + } + +// --------------------------------------------------------- +// CCAGroupPC::HandleGroupLeft +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAGroupPC::HandleGroupLeft( TInt aReason ) + { + if ( iGroupEventObserverPC ) + { + iGroupEventObserverPC->HandleGroupLeft( aReason ); + } + } + +// --------------------------------------------------------- +// CCAGroupPC::HandleGroupPropertiesChanged() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAGroupPC::HandleGroupPropertiesChanged() + { + if ( iGroupEventObserverPC ) + { + iGroupEventObserverPC->HandleGroupPropertiesChanged( ); + } + + } + +// --------------------------------------------------------- +// CCAGroupPC::HandleMessageError() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAGroupPC::HandleMessageError( TInt aError, MCAMessage* aMessage ) + { + TPtrC nick( KNullDesC ); + + if ( !iGroupObserverPC ) + { + return; + } + + if ( aMessage ) + { + if ( aMessage->ContentType() == MCAMessage::EContentPicture ) + { + iGroupObserverPC->HandleMessageError( aError ); + + return; + } + + nick.Set( iStoredContacts->Identification( aMessage->Recipient() ) ); + } + + iGroupObserverPC->HandleMessageError( aError, nick ); + } + + +// ----------------------------------------------------------------------------- +// CCAGroupPC: SendMessageL +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::SendMessageL( const TDesC& aMessageBuffer, + CDesCArrayFlat& aRecipients ) + { + + MCAMessageCreator& creator = iMessageUtils.MessageCreator(); + + const MCAMessageContainerInfo& info = iReadInterface->TargetId(); + + MCAMessageCreator::SMessageData data = + { + KMessageDataVersion, + 0, + KNullDesC, + KNullDesC, + info.ScreenName(), // Sender + info.Target(), // Recipient + NULL, + &aRecipients, + aMessageBuffer, + KNullDesC8, + KNullDesC8, + MCAMessage::EMessageSent + }; + + iWriteInterface->AppendL( creator.CreateMessageL( data ) ); + } + + +// ----------------------------------------------------------------------------- +// CCAGroupPC: SetActiveGroupChatL +// ----------------------------------------------------------------------------- +// +void CCAGroupPC::SetActiveGroupChatL( const TDesC& aGroupId ) + { + if ( iGroupId ) + { + delete iGroupId; + + iGroupId = NULL; + } + + + iGroupId = aGroupId.AllocL(); + + iReadInterface = + &( iChatInterface.MessageReadInterfaceL( KNullDesC, KNullDesC, *iGroupId ) ); + + iStoredGroup = iStoredGroups->FindGroup( *iGroupId ); + + iGrOps = iGroupInterface->GroupOperationsL( *iGroupId ); + + + if ( !iGroupId ) + { + iGroupId = KNullDesC().AllocL(); + } + + } + +// ----------------------------------------------------------------------------- +// CCAGroupPC::GetGroupPairArrayLC +// ----------------------------------------------------------------------------- +// +MCAServerContactsArrayPC* CCAGroupPC::GetGroupPairArrayLC() + { + RPointerArray groupList; + + CDesCArray* groupNames = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupNames ); + CDesCArray* groupIds = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupIds ); + + CleanupClosePushL( groupList ); + iStoredGroups->PopulateGroupsListL( groupList ); + + TInt count( groupList.Count() ); + for ( TInt index( 0 ); index < count; index++ ) + { + if ( 0 != groupList[ index ]->GroupId().CompareC( *iGroupId ) ) + { + // other than current group + groupNames->AppendL( groupList[ index ]->GroupName() ); + groupIds->AppendL( groupList[ index ]->GroupId() ); + } + } + //Codescanner warning ignored + CleanupStack::PopAndDestroy(); // groupList.Close() + //Codescanner warning ignored + 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; + } + + +// ----------------------------------------------------------------------------- +// CCAGroupPC::IsActiveGroupChat +// ----------------------------------------------------------------------------- +// +TBool CCAGroupPC::IsActiveGroupChat( const TDesC& aGroupId ) + + { + TBool retValue = EFalse; + + if ( iGroupId ) + { + if ( !CAUtils::NeutralCompare( aGroupId, *iGroupId ) ) + { + retValue = ETrue; + } + } + + return retValue; + } + + +//----------------------------------------------------------- +//CCAGroupPC::MessageCount +//----------------------------------------------------------- +TInt CCAGroupPC::MessageCount() + { + if ( iReadInterface ) + { + return iReadInterface->MessageCount(); + } + + return 0; + + } + +// End of File +