wvuing/wvuieng/EngSrc/CCAGroupWrapper.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuieng/EngSrc/CCAGroupWrapper.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,900 @@
+/*
+* Copyright (c) 2003-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:  Network operations for one chat group handling
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "MCAImpsGroupClient.h"
+#include "MCASettings.h"
+#include "MCAExtendedStoredGroup.h"
+#include "MCAGroupEventObserver.h"
+
+#include "ImpsCSPAllErrors.h"
+#include "CCAGroupWrapper.h"
+#include "CCARequest.h"
+#include "CCARequestMapper.h"
+#include "ChatDebugPrint.h"
+
+#include <ImpsErrors.h>
+#include <coemain.h>     // For CCoeEnv
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCAGroupWrapper::CCAGroupWrapper
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCAGroupWrapper::CCAGroupWrapper( MCASettings& aSettingsAPI,
+                                  MCAExtendedStoredGroup& aGroup,
+                                  CCARequestMapper& aRequestMapper,
+                                  MCAImpsGroupClient* aClient  )
+        : iSettingsAPI( aSettingsAPI ),
+        iGroup( aGroup ),
+        iConeEnv( CCoeEnv::Static() ),
+        iRequestMapper( aRequestMapper ),
+        iImpsGroupClient( aClient ),
+        iOperationError( KErrNone )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCAGroupWrapper::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCAGroupWrapper* CCAGroupWrapper::NewL( MCASettings& aSettingsAPI,
+                                        MCAExtendedStoredGroup& aGroup,
+                                        CCARequestMapper& aRequestMapper,
+                                        MCAImpsGroupClient* aClient )
+    {
+    CCAGroupWrapper* self = new( ELeave ) CCAGroupWrapper( aSettingsAPI, aGroup,
+                                                           aRequestMapper, aClient );
+
+    return self;
+    }
+
+
+// Destructor
+CCAGroupWrapper::~CCAGroupWrapper()
+    {
+    // signal observer to keep UI state in sync
+    if ( iObserver )
+        {
+        iObserver->HandleGroupLeft( KErrNone );
+        }
+
+    delete iCommonProperties;
+    delete iPrivateProperties;
+
+    if ( iOldTopic )
+        {
+        delete iOldTopic;
+        iOldTopic = NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::Group
+// ---------------------------------------------------------
+//
+MCAStoredGroup& CCAGroupWrapper::Group()
+    {
+    return iGroup;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::RegisterEventObserverL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::RegisterEventObserver( MCAGroupEventObserver* aObserver )
+    {
+    iObserver = aObserver;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::LocalPropertiesL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::LocalProperties( CImpsCommonGroupProps*& aCommonProps,
+                                       CImpsPrivateGroupProps*& aPrivateProps )
+    {
+    aCommonProps = iCommonProperties;
+    aPrivateProps = iPrivateProperties;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::SetLocalPropertiesL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::SetLocalProperties( CImpsCommonGroupProps* aCommonProps,
+                                          CImpsPrivateGroupProps* aPrivateProps )
+    {
+    // since we own these, we must get rid of these
+    delete iCommonProperties;
+    iCommonProperties = aCommonProps;
+
+    delete iPrivateProperties;
+    iPrivateProperties = aPrivateProps;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::Requet
+// ---------------------------------------------------------
+//
+CCARequest* CCAGroupWrapper::Request()
+    {
+    return iRequest;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupManager::LastImpsError
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::LastImpsError( TInt aError )
+    {
+    iLastImpsError = aError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupManager::SetTopicShown
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::SetTopicShown( TBool aIsShown )
+    {
+    iTopicShown = aIsShown;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupManager::IsTopicShown
+// ---------------------------------------------------------
+//
+TBool CCAGroupWrapper::IsTopicShown() const
+    {
+    return iTopicShown;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::OperationId
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::OperationId()
+    {
+    return iOperationId;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::JoinL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::JoinL( const TDesC& aScreenName, TBool aUsers,
+                             TBool aIsFavourite )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::JoinGroupL to group %S" ),
+             &iGroup.GroupId() );
+
+    // JOIN PHASE//////////////////////////////////////////////////////////////
+    iOperationId = iImpsGroupClient->JoinGroupL( iGroup.GroupId(), aScreenName,
+                                                 aUsers, ETrue );
+
+
+    // We need additional data e.g. group ID and the screen name
+    // Granularity of two because there will 2 items
+    CDesCArrayFlat* dataArray = new ( ELeave ) CDesCArrayFlat( 2 );
+    CleanupStack::PushL( dataArray );
+    dataArray->AppendL( iGroup.GroupId() );
+    dataArray->AppendL( aScreenName );
+
+    if ( aIsFavourite )
+        {
+        iOperationError = ExecuteRequestL( iOperationId, EJoinGroup,
+                                           dataArray );
+        }
+    else
+        {
+        iOperationError = ExecuteRequestL( iOperationId,
+                                           EJoinToNonFavouriteGroup,
+                                           dataArray );
+        }
+
+    CleanupStack::PopAndDestroy( dataArray );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::CreateGroupL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::CreateGroupL( const TDesC& aScreenName, TBool aJoinGroup )
+    {
+    CHAT_DP_TXT( "CCAGroupWrapper::CreateGroupL...starts" );
+
+    if ( !iCommonProperties )
+        {
+        User::Leave( KErrNotReady );
+        }
+
+    CDesCArrayFlat* dataArray =
+        new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+    CleanupStack::PushL( dataArray );
+
+    iOperationId = iImpsGroupClient->CreateGroupL( iGroup.GroupId(),
+                                                   iCommonProperties,
+                                                   aScreenName,
+                                                   aJoinGroup,
+                                                   ETrue );
+
+    dataArray->AppendL( iGroup.GroupId() );
+    dataArray->AppendL( iCommonProperties->GroupName() );
+
+    if ( aJoinGroup )
+        {
+        dataArray->AppendL( aScreenName );
+        dataArray->AppendL( iCommonProperties->Welcome() );
+        dataArray->AppendL( iCommonProperties->Topic() );
+        iOperationError = ExecuteRequestL( iOperationId,
+                                           ECreateAndJoinGroup,
+                                           dataArray );
+        }
+    else
+        {
+        iOperationError = ExecuteRequestL( iOperationId,
+                                           ECreateGroup,
+                                           dataArray );
+        }
+
+    CleanupStack::PopAndDestroy( dataArray );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::LeaveL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::LeaveL()
+    {
+    CHAT_DP_TXT( "CCAGroupWrapper::LeaveGroupL...starts" );
+
+    iOperationId = iImpsGroupClient->LeaveGroupL( iGroup.GroupId() );
+
+    // In client initiated Leave we must store the group id because it
+    // doesn't exist in the callback. Adding only 1 --> granularity 1
+    CDesCArrayFlat* dataArray = new ( ELeave ) CDesCArrayFlat( 1 );
+    CleanupStack::PushL( dataArray );
+    dataArray->AppendL( iGroup.GroupId() );
+
+    iOperationError = ExecuteRequestL( iOperationId, ELeaveGroup, dataArray );
+
+    CleanupStack::PopAndDestroy( dataArray );
+
+    CHAT_DP_TXT( "CCAGroupWrapper::LeaveGroupL...over" );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::DeleteFromNetworkL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::DeleteFromNetworkL()
+    {
+    CHAT_DP_TXT( "CCAGroupWrapper::DeleteGroupL...starts" );
+
+    iOperationId = iImpsGroupClient->DeleteGroupL( iGroup.GroupId() );
+
+    CDesCArrayFlat* dataArray =
+        new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+    CleanupStack::PushL( dataArray );
+    dataArray->AppendL( iGroup.GroupId() );
+
+    iOperationError = ExecuteRequestL( iOperationId, EDeleteGroup, dataArray );
+
+    CleanupStack::PopAndDestroy( dataArray );
+
+    CHAT_DP_TXT( "CCAGroupWrapper::DeleteGroupL...over" );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::UpdatePropertiesL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::UpdatePropertiesL( CImpsCommonGroupProps* aCommonProps,
+                                         CImpsPrivateGroupProps* aPrivateProps )
+    {
+    CHAT_DP_TXT( "CCAGroupWrapper::UpdatePropertiesL...starts" );
+
+    iOperationId = iImpsGroupClient->SetGroupPropertiesL( iGroup.GroupId(),
+                                                          aCommonProps,
+                                                          aPrivateProps );
+
+    CDesCArrayFlat* dataArray =
+        new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+    CleanupStack::PushL( dataArray );
+    dataArray->AppendL( iGroup.GroupId() );
+
+    iOperationError = ExecuteRequestL( iOperationId,
+                                       ESetGroupProperties, dataArray );
+
+    CleanupStack::PopAndDestroy( dataArray );
+
+    if ( iOperationError == KErrNone || iOperationError == ECSPSuccessful )
+        {
+        if ( aCommonProps )
+            {
+            if ( aCommonProps->Topic().Length() > 0 &&
+                 iOldTopic != NULL &&
+                 0 != aCommonProps->Topic().CompareC( *iOldTopic ) )
+                {
+                // Set new topic not shown, this happens when user
+                // changes topic
+                iTopicShown = EFalse;
+                }
+            }
+
+        // updating was successful, update the local properties
+        CopyPropertiesL( aCommonProps, iCommonProperties,
+                         aPrivateProps, iPrivateProperties );
+        }
+
+    if ( iOldTopic )
+        {
+        delete iOldTopic;
+        iOldTopic = NULL;
+        }
+    iOldTopic = iCommonProperties->Topic().AllocL();
+
+    CHAT_DP_TXT( "CCAGroupWrapper::UpdatePropertiesL...over" );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::AddMembersL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::AddMembersL( const CDesCArray& aUserList,
+                                   const CDesCArray& aScreenNameList )
+    {
+    CHAT_DP_TXT( "CCAGroupWrapper::AddMembersL...starts" );
+
+    if ( ( aUserList.MdcaCount() == 0 ) &&
+         ( aScreenNameList.MdcaCount() == 0 ) )
+        {
+        // Both lists are empty, it's time to leave
+        User::Leave( KErrArgument );
+        }
+
+    iOperationId = iImpsGroupClient->AddMembersL( iGroup.GroupId(),
+                                                  aUserList, aScreenNameList );
+
+    // We need additional data for group ID
+    CDesCArrayFlat* dataArray =
+        new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+    CleanupStack::PushL( dataArray );
+    dataArray->AppendL( iGroup.GroupId() );
+
+    iOperationError = ExecuteRequestL( iOperationId, EAddMembers, dataArray );
+
+    CleanupStack::PopAndDestroy( dataArray );
+
+    CHAT_DP_TXT( "CCAGroupWrapper::AddMembersL...over" );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::RemoveMembersL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::RemoveMembersL( const CDesCArray& aUserList )
+    {
+    CHAT_DP_TXT( "CCAGroupWrapper::RemoveMembersL" );
+
+    iOperationId =
+        iImpsGroupClient->RemoveMembersL( iGroup.GroupId(), aUserList );
+
+    iOperationError = ExecuteRequestL( iOperationId, ERemoveMembers );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::ModifyMembersL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::ModifyMembersL( const CDesCArray* aAdminList,
+                                      const CDesCArray* aModerList,
+                                      const CDesCArray* aOrdinaryList )
+    {
+    CHAT_DP_TXT( "CCAGroupWrapper::ModifyMembersAccessL()...starts" );
+
+    iOperationId = iImpsGroupClient->ModifyMembersAccessL(
+                       iGroup.GroupId(),
+                       aAdminList,
+                       aModerList,
+                       aOrdinaryList );
+
+    iOperationError = ExecuteRequestL( iOperationId, EModifyMembersAccess );
+
+    CHAT_DP_TXT( "CCAGroupWrapper::ModifyMembersAccessL()...over" );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::GetPropertiesL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::GetPropertiesL( CImpsCommonGroupProps*& aCommonProps,
+                                      CImpsPrivateGroupProps*& aPrivateProps )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::PropertiesL to group %S" ),
+             &iGroup.GroupId() );
+
+    if ( ( iCommonProperties ) || ( iPrivateProperties ) )
+        {
+        aCommonProps = iCommonProperties;
+        aPrivateProps = iPrivateProperties;
+        return KErrNone;
+        }
+
+    iOperationId = iImpsGroupClient->GroupPropertiesL( iGroup.GroupId() );
+
+    iOperationError = ExecuteRequestL( iOperationId, EGroupProperties );
+
+    aCommonProps = iCommonProperties;
+    aPrivateProps = iPrivateProperties;
+// if new operation id is created , then set it to zero.
+    iOperationId = KErrNone;
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::GetMembersL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::GetMembersL( CDesCArray& aUserList,
+                                   CDesCArray& aScreenNames,
+                                   CDesCArray& aModers,
+                                   CDesCArray& aAdmins )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::MembersL to group %S" ),
+             &iGroup.GroupId() );
+
+    iMembers = &aUserList;
+    iScreenNames = &aScreenNames;
+    iModers = &aModers;
+    iAdmins = &aAdmins;
+
+    iOperationId = iImpsGroupClient->GroupMembersL( iGroup.GroupId() );
+
+    iOperationError = ExecuteRequestL( iOperationId, EGroupMembers );
+
+    iMembers = NULL;
+    iScreenNames = NULL;
+    iModers = NULL;
+    iAdmins = NULL;
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::GetRejectListL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::GetRejectListL( CDesCArray& aRejectList )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::RejectListL to group %S" ),
+             &iGroup.GroupId() );
+    iRejectedList = &aRejectList;
+
+    iOperationId = iImpsGroupClient->SetRejectListL( iGroup.GroupId(),
+                                                     NULL, NULL );
+
+    iOperationError = ExecuteRequestL( iOperationId, ESetRejectList );
+
+    iRejectedList = NULL;
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::SetRejectListL
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::SetRejectListL( const CDesCArray& aRejectedList,
+                                      const CDesCArray& aEnabledList )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::SetRejectListL to group %S" ),
+             &iGroup.GroupId() );
+
+    iOperationId = iImpsGroupClient->SetRejectListL( iGroup.GroupId(),
+                                                     &aRejectedList, &aEnabledList );
+
+    iOperationError = ExecuteRequestL( iOperationId, ESetRejectList );
+
+    return iOperationError;
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleCompleteL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleCompleteL( TInt aOpId,
+                                       TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleCompleteL OpId = %d" ), aOpId );
+    // If code added before HandleRequest, then make sure that
+    // code does not Leave before HandleRequest, because request
+    // response waiting does not stop (and waitnote) before calling
+    // HandleRequest
+    if ( aOpId != 0 )
+        {
+        iRequestMapper.HandleRequest( aOpId, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleJoinL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleJoinL( TInt aOpId,
+                                   const MDesCArray& /* aUserList */,
+                                   const MDesCArray& aScreenNames,
+                                   const TDesC& /* aWelcomeText */,
+                                   TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleJoinL OpId = %d" ), aOpId );
+    if ( aOpId != 0 )
+        {
+        CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::JoinGroupL" ) );
+
+        TInt status( KErrNone );
+
+        TRAPD( err, iGroup.AddParticipantL( aScreenNames ) );
+
+        if ( err )
+            {
+            status = err;
+            }
+
+        iRequestMapper.HandleRequest( aOpId, status );
+        User::LeaveIfError( err );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleGroupMembersL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleGroupMembersL( TInt aOpId,
+                                           const MDesCArray& aUserList,
+                                           const MDesCArray& aScreenNames,
+                                           const MDesCArray& aModers,
+                                           const MDesCArray& aAdmins,
+                                           TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleGroupMembersL OpId = %d" ),
+             aOpId );
+
+    if ( aOpId != 0 )
+        {
+        TInt status( KErrNone );
+        TRAPD( err,
+               CopyArrayL( aUserList, iMembers );
+               CopyArrayL( aScreenNames, iScreenNames );
+               CopyArrayL( aModers, iModers );
+               CopyArrayL( aAdmins, iAdmins );
+             )
+        if ( err )
+            {
+            status = err;
+            }
+
+        iRequestMapper.HandleRequest( aOpId, status );
+        User::LeaveIfError( err );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleGroupPropertiesL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleGroupPropertiesL( TInt aOpId,
+                                              const TDesC& /*aGroupId*/,
+                                              const CImpsCommonGroupProps& aGroupProps,
+                                              const CImpsPrivateGroupProps& aOwnProps,
+                                              TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleGroupPropertiesL OpId = %d" ),
+             aOpId );
+    // If code added before HandleRequest, then make sure that
+    // code does not Leave before HandleRequest, because request
+    // response waiting does not stop (and waitnote) before calling
+    // HandleRequest
+    if ( aOpId != 0 )
+        {
+        iRequestMapper.HandleRequest( aOpId, KErrNone );
+        }
+
+    // Copy relevant data to properties which are
+    // stored in wrapper. This can be done always, as the properties contain
+    // all fields in every case.
+    CopyPropertiesL( &aGroupProps, iCommonProperties, &aOwnProps,
+                     iPrivateProperties );
+
+    // push event from the network
+    // signal observer
+    if ( iObserver )
+        {
+        iObserver->HandleGroupPropertiesChanged();
+        }
+
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleRejectListL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleRejectListL( TInt aOpId,
+                                         const MDesCArray& aUserList,
+                                         TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleRejectListL OpId = %d" ),
+             aOpId );
+
+    if ( aOpId != 0 )
+        {
+        CHAT_DP( D_CHAT_LIT( " --RejectList count %d -- " ),
+                 aUserList.MdcaCount() );
+        TInt status( KErrNone );
+        TRAPD( err, CopyArrayL( aUserList, iRejectedList ) );
+        if ( err )
+            {
+            status = err;
+            }
+        iRequestMapper.HandleRequest( aOpId, status );
+        User::LeaveIfError( err );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleSubscriptionL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleSubscriptionL( TInt aOpId, TBool /*aIsSubscribed*/,
+                                           TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleSubscriptionL OpId = %d" ),
+             aOpId );
+    // If code added before HandleRequest, then make sure that
+    // code does not Leave before HandleRequest, because request
+    // response waiting does not stop (and waitnote) before calling
+    // HandleRequest
+    if ( aOpId != 0 )
+        {
+        iRequestMapper.HandleRequest( aOpId, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleNewUsersL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleNewUsersL( const TDesC& /* aGroupId */,
+                                       const MDesCArray& /* aUserList */,
+                                       const MDesCArray& aScreenNames,
+                                       TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleNewUsersL" ) );
+    // always push event, so no need to stop request
+    iGroup.AddParticipantL( aScreenNames );
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleLeftUsersL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleLeftUsersL( const TDesC& /* aGroupId */,
+                                        const MDesCArray& aUserList,
+                                        const MDesCArray& aScreenNames,
+                                        TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleLeftUsersL" ) );
+
+    // always push event, so no need to stop request
+
+    CHAT_DP( D_CHAT_LIT( "aUserListCount: %d aScreenNamesCount %d" ),
+             aUserList.MdcaCount(), aScreenNames.MdcaCount() );
+
+    iGroup.RemoveParticipantL( aScreenNames );
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::HandleLeaveL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::HandleLeaveL( TInt aOpId, const TDesC& /* aGroupId */,
+                                    const TDesC& /*aDescription*/,
+                                    TImpsCspIdentifier& /* aCspId */ )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::HandleLeaveL OpId = %d" ), aOpId );
+
+    // If code added before HandleRequest, then make sure that
+    // code does not Leave before HandleRequest, because request
+    // response waiting does not stop (and waitnote) before calling
+    // HandleRequest
+    if ( aOpId != 0 )
+        {
+        iRequestMapper.HandleRequest( aOpId, KErrNone );
+        }
+    else
+        {
+        // push event from the network
+        // signal observer
+        if ( iObserver )
+            {
+            iObserver->HandleGroupLeft( iLastImpsError );
+            //consume error
+            iLastImpsError = KErrNone;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::CopyArrayL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::CopyArrayL( const MDesCArray& aSource, CDesCArray* aDest )
+    {
+    if ( !aDest )
+        {
+        return;
+        }
+
+    aDest->Reset();
+    TInt count( aSource.MdcaCount() );
+    for ( TInt i( 0 ); i < count; i++ )
+        {
+        TPtrC src( aSource.MdcaPoint( i ) );
+        CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::CopyArrayL [%d] %S" ), i, &src );
+        aDest->AppendL( src );
+        }
+    }
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::ExecuteRequest
+// ---------------------------------------------------------
+//
+TInt CCAGroupWrapper::ExecuteRequestL( TInt aOperationId,
+                                       TOperationRequests aRequestType,
+                                       MDesCArray* aAdditionalData )
+    {
+    // creating request
+    iRequest = iRequestMapper.CreateRequestL( aOperationId, EFalse );
+    CCARequestMapper& requestMapper = iRequestMapper;
+    CCARequest* request = iRequest;
+
+    // setting type
+    iRequest->SetRequestType( aRequestType );
+
+    // setting additional data if exists
+    if ( aAdditionalData )
+        {
+        iRequest->SetAdditionalData( *aAdditionalData );
+        }
+
+    // Now when the request type and additional data is set we can
+    // activate the synchronous wait
+    iRequest->StartWait();
+
+    TInt retVal( request->ErrorCode() );
+    requestMapper.RemoveRequest( request );
+    iRequest = NULL;
+    request = NULL;
+
+    return retVal;
+    }
+
+
+// ---------------------------------------------------------
+// CCAGroupWrapper::CopyPropertiesL
+// ---------------------------------------------------------
+//
+void CCAGroupWrapper::CopyPropertiesL(
+    const CImpsCommonGroupProps* aFromCommonProps,
+    CImpsCommonGroupProps* aToCommonProps,
+    const CImpsPrivateGroupProps* aFromPrivateProps,
+    CImpsPrivateGroupProps* aToPrivateProps
+)
+    {
+    CHAT_DP_FUNC_ENTER( "CopyPropertiesL" );
+
+    if ( aToCommonProps && aFromCommonProps )
+        {
+        // copy all relevant fields, ignoring empty fields
+        if ( aFromCommonProps->GroupName().Length() > 0 )
+            {
+            aToCommonProps->SetGroupNameL( aFromCommonProps->GroupName() );
+            }
+
+        if ( aFromCommonProps->Welcome().Length() > 0 )
+            {
+            aToCommonProps->SetWelcomeL( aFromCommonProps->Welcome() );
+            }
+
+        if ( aFromCommonProps->Topic().Length() > 0 )
+            {
+            aToCommonProps->SetTopicL( aFromCommonProps->Topic() );
+            }
+
+        if ( aFromCommonProps->IsPrivateAllowed() != EImpsPropUndef )
+            {
+            CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::CopyPropertiesL - \
+                                  Whispering: %d" ),
+                     aFromCommonProps->IsPrivateAllowed() );
+            aToCommonProps->SetPrivateAllowed(
+                aFromCommonProps->IsPrivateAllowed() );
+            }
+
+        if ( aFromCommonProps->IsSearchable() != EImpsPropUndef )
+            {
+            CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::CopyPropertiesL - \
+                                  Searchable: %d" ),
+                     aFromCommonProps->IsSearchable() );
+            aToCommonProps->SetSearchable( aFromCommonProps->IsSearchable() );
+            }
+
+        if ( aFromCommonProps->MaxNbrOfUsers() >= 0 )
+            {
+            CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::CopyPropertiesL - \
+                                  Max users: %d" ),
+                     aFromCommonProps->MaxNbrOfUsers() );
+            aToCommonProps->SetMaxNbrOfUsers(
+                aFromCommonProps->MaxNbrOfUsers() );
+            }
+
+        if ( aFromCommonProps->IsOpen() != EImpsPropUndef )
+            {
+            CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::CopyPropertiesL - Open: %d" ),
+                     aFromCommonProps->IsOpen() );
+            aToCommonProps->SetOpen( aFromCommonProps->IsOpen() );
+            }
+        }
+
+    if ( aToPrivateProps && aToPrivateProps )
+        {
+        if ( aFromPrivateProps->IsPrivateAllowed() != EImpsPropUndef )
+            {
+            CHAT_DP( D_CHAT_LIT( "CCAGroupWrapper::CopyPropertiesL - (Private) \
+                                  Allowed: %d" ),
+                     aFromPrivateProps->IsPrivateAllowed() );
+            aToPrivateProps->SetPrivateAllowed(
+                aFromPrivateProps->IsPrivateAllowed() );
+            }
+        }
+
+    CHAT_DP_FUNC_DONE( "CopyPropertiesL" );
+    }
+
+
+//  End of File