wvuing/wvuiprocess/Src/ccagrouppc.cpp
changeset 0 094583676ce7
--- /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<MCAStoredGroup> 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
+