diff -r 000000000000 -r 094583676ce7 wvuing/wvuieng/EngSrc/CCAGroupWrapper.cpp --- /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 +#include // 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