diff -r 000000000000 -r 094583676ce7 wvuing/wvuiprocess/Src/CCAGroupUtilsPC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiprocess/Src/CCAGroupUtilsPC.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,1304 @@ +/* +* 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: Group handling utilities +* +*/ + + +//INCLUDES + +#include "PublicEngineDefinitions.h" +#include "CCAEngine.h" +#include "CCAGroupUtilsPC.h" +#include "ChatDebugPrint.h" +#include "MCAGroupManagerInterface.h" +#include "MCAGroupOperations.h" +#include "MCAStoredGroups.h" +#include "MCAExtendedStoredGroup.h" +#include "CCAStorageManagerFactory.h" +#include "CCAGroupPropertiesDialog.h" +#include "ImpsCSPAllErrors.h" +#include "MCASettings.h" +#include "StringLoader.h" +#include "CCAChatInfoArray.h" +#include "CAArrayUtils.h" +#include "IMUtils.h" +#include "MCAInvite.h" +#include "CAUtils.h" +#include "MCAStoredContacts.h" +#include "CCAStorageManagerFactory.h" +#include "MCAConversationMessage.h" +#include "MCAProcessManager.h" +#include "CCAProcessManagerFactory.h" +#include "CCAGroupPropertiesPC.h" +#include "MCAChatInterface.h" + + +#include +#include +#include +#include +#include +#include +#include "CCAPCUtils.h" +#include "CCAUINGUtils.h" +#include "ccagrouputilspc.h" +#include + +// The Settings have been moved to Cenrep (also retained in the Resource file), +// so the enums for keys and central repository header is added here +#include "VariantKeys.h" +#include + +const TInt KGranularity = 2; + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::CCAGroupUtilsPC +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCAGroupUtilsPC::CCAGroupUtilsPC( CCAEngine& aEngine ) + : iEngine( aEngine ) + + + { + + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCAGroupUtilsPC* CCAGroupUtilsPC::NewLC( CCAEngine& aEngine ) + { + CCAGroupUtilsPC* temp = new( ELeave )CCAGroupUtilsPC( aEngine ); + CleanupStack::PushL( temp ); + temp->ConstructL(); + return temp; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCAGroupUtilsPC* CCAGroupUtilsPC::NewL( CCAEngine& aEngine ) + { + CCAGroupUtilsPC* self = CCAGroupUtilsPC::NewLC( aEngine ); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC: ConstructL +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::ConstructL( ) + { + iStoredGroups = CCAStorageManagerFactory::GroupListInterfaceL(); + iGroupManagerInterface = iEngine.GetGroupInterface(); + } +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::~CCAGroupUtilsPC +// ----------------------------------------------------------------------------- +// +CCAGroupUtilsPC::~ CCAGroupUtilsPC( ) + { + + } +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetChatInfoArrayLC +// ----------------------------------------------------------------------------- +// +CCAChatInfoArray* CCAGroupUtilsPC::GetChatInfoArrayL( const TDesC& aGroupId ) + { + + // create listbox item array + CCAChatInfoArray* itemArray = CCAChatInfoArray::NewL(); + CleanupStack::PushL( itemArray ); + + //get the group + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + if ( !group ) + { + CleanupStack::PopAndDestroy(); //itemArray + return NULL;// leave from here + } + + + CDesCArray* userList = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( userList ); + CDesCArray* screenNames = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( screenNames ); + CDesCArray* moders = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( moders ); + CDesCArray* admins = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( admins ); + + //Getting group properties and members + MCAGroupOperations* grOps = + iGroupManagerInterface->GroupOperationsL( aGroupId ); + CImpsCommonGroupProps* groupProps = NULL; + CImpsPrivateGroupProps* privateProps = NULL; + + TInt err( grOps->GetPropertiesL( groupProps, privateProps ) ); + if ( err == KErrNone && group->IsAdmin() ) + { + err = grOps->GetMembersL( *userList, *screenNames, *moders, *admins ); + } + + if ( err != KErrNone ) + { + if ( err == ECSPInsufficientGroupPrivileges ) + { + // Show general server error note, if user has + // insufficient privileges. + err = ECSPInternalOrNetworkError; + } + CleanupStack::PopAndDestroy( 4, userList ); + CleanupStack::PopAndDestroy(); //itemArray + + User::Leave( err ); + + return NULL; + + } + + CHAT_DP( D_CHAT_LIT( " %d users, %d screenNames, %d moders, %d admins" ), + userList->Count(), screenNames->Count(), moders->Count(), + admins->Count() ); + + + + // load participants text with correct numbers (two items in partiarray) + CArrayFixFlat* partiArray = new ( ELeave ) CArrayFixFlat( KGranularity ); + CleanupStack::PushL( partiArray ); + partiArray->AppendL( group->NumParticipants() ); + partiArray->AppendL( groupProps->MaxNbrOfUsers() ); + HBufC* partiBuf = StringLoader::LoadLC( R_CHATLIST_VIEW_INFO_NUMB_PARTI, + *partiArray ); + + // add items to item array + TPtrC displayId( CCAPCUtils::DisplayId( aGroupId ) ); + itemArray->AddLabelAndTextL( R_CHATLIST_VIEW_INFO_GID, displayId ); + + itemArray->AddLabelAndTextL( R_CHATLIST_VIEW_INFO_TOP, + groupProps->Topic() ); + + itemArray->AddLabelAndTextL( R_CHATLIST_VIEW_INFO_NUMB, *partiBuf ); + CleanupStack::PopAndDestroy( partiBuf ); + CleanupStack::PopAndDestroy( partiArray ); + + // add admins + HBufC* adminBuf = CCAPCUtils::CreateBufLC( *admins, ETrue ); + itemArray->AddLabelAndTextL( R_CHATLIST_VIEW_INFO_ADMIN, *adminBuf ); + CleanupStack::PopAndDestroy( adminBuf ); + + // add banned users + if ( group->IsAdmin() || group->IsOwnGroup() ) + { + CHAT_DP_TXT( "displaying reject list" ); + CDesCArray* rejectList = new ( ELeave ) CDesCArrayFlat( + KArrayGranularity ); + CleanupStack::PushL( rejectList ); + + err = grOps->GetRejectListL( *rejectList ); + if ( err == KErrNone ) + { + HBufC* banBuf = CCAPCUtils::CreateBufLC( *rejectList, ETrue ); + itemArray->AddLabelAndTextL( R_CHATLIST_VIEW_INFO_BANNED, *banBuf ); + CleanupStack::PopAndDestroy( banBuf ); + } + + CleanupStack::PopAndDestroy( rejectList ); + } + + // load the whisper text + HBufC* whispBuf = NULL; + if ( groupProps->IsPrivateAllowed() == EImpsPropYes ) + { + whispBuf = CCoeEnv::Static()-> + AllocReadResourceLC( R_CHATLIST_VIEW_INFO_WHIS_YES ); + } + else + { + whispBuf = CCoeEnv::Static()-> + AllocReadResourceLC( R_CHATLIST_VIEW_INFO_WHIS_NO ); + } + + // append to listbox + itemArray->AddLabelAndTextL( R_CHATLIST_VIEW_INFO_WHIS, *whispBuf ); + + CleanupStack::PopAndDestroy( 5, userList ); // admins, moders, + // screenNames, userList,whispBuf + + CleanupStack::Pop( itemArray ); + return itemArray; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetCreatedChatRoomListL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::GetCreatedChatRoomListL( CDesCArray& aTempArray, CDesCArray& aGroupIds ) + { + TInt err = KErrNone; + + iGroupManagerInterface->PopulateCreatedGroupsL( aGroupIds ); + + + HBufC* itemText = HBufC::NewLC( KMaxChatGroupLenght + KMaxTabLength ); + TPtr itemTextPtr( itemText->Des() ); + TInt count( aGroupIds.MdcaCount() ); + for ( TInt i( 0 ); i < count; i++ ) + { + itemTextPtr.Append( KIconTabulator ); + itemTextPtr.Append( + CCAStorageManagerFactory::ContactListInterfaceL()->Identification( + aGroupIds.MdcaPoint( i ) ) ); + aTempArray.AppendL( *itemText ); + itemTextPtr.Zero(); + } + CleanupStack::PopAndDestroy( itemText ); + return err; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::DeleteChatGroupFromNetworkL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::DeleteChatGroupFromNetworkL( const TDesC& aGroupId, TBool aDeleteFromNetwork ) + { + MCAStoredGroups* groups = + CCAStorageManagerFactory::GroupListInterfaceL(); + MCAStoredGroup* group = groups->FindGroup( aGroupId ); + if ( !group ) + { + // Because the groups that user selected are fetched from + // network, and though they might not be in our local storage, + // we need to create those groups to make sure that storage + // does also network operations. + group = groups->CreateGroupL(); + static_cast( group )->SetVisible( + EFalse ); + static_cast( group )->SetGroupIdL( + aGroupId ); + } + return iGroupManagerInterface->DeleteGroupL( aGroupId, aDeleteFromNetwork ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::DeleteGroupL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::DeleteGroupL( const TDesC& aGroupId, + TBool aDeleteFromNetwork ) + { + return iGroupManagerInterface->DeleteGroupL( aGroupId, + aDeleteFromNetwork ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::SwitchToJoinedGroupL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::SwitchToJoinedGroupL( const TDesC& aGroupID, + TCADnlChatViewBuf& aViewDnl , + const MCAConversationMessage* aFwdMessage, + TBool aInviteQuery ) + + { + + if ( !iEngine.ChatInterface().ChatExistsL( KNullDesC, KNullDesC, aGroupID ) ) + { + return R_CHATLIST_VIEW_JOIN_ERROR; + } + + TCADnlChatView viewDnl; + if ( aFwdMessage ) + { + viewDnl.iIsForwarded = ETrue; + viewDnl.iForwardedMessage = aFwdMessage; + } + else + { + viewDnl.iIsForwarded = EFalse; + } + + viewDnl.iInviteQuery = aInviteQuery; + viewDnl.iSwitchTab = EFalse; + + MCAStoredGroup* group = CCAStorageManagerFactory:: + GroupListInterfaceL()->FindGroup( aGroupID ); + viewDnl.iGroupId = aGroupID.Left( viewDnl.iGroupId.MaxLength() ); + viewDnl.iGroupName = + group->GroupName().Left( viewDnl.iGroupName.MaxLength() ); + + aViewDnl = viewDnl; + + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetDefaultGroupNameL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- + +void CCAGroupUtilsPC::GetDefaultGroupNameL( TPtr& aChatGroupName, + TEnumsPC::TListSelectionType aSelType ) + { + // Construct default group name for query + + switch ( aSelType ) + { + case TEnumsPC::ESingleListMultiSelect: + { + HBufC* listGroupName = StringLoader::LoadLC( + RSC_CHAT_GROUP_DEFAULT_LIST, + aChatGroupName + ); + aChatGroupName.Copy( listGroupName->Left( KMaxChatGroupLenght ) ); + + CleanupStack::PopAndDestroy( listGroupName ); + break; + } + default: + { + TInt nbrOfChats = iGroupManagerInterface-> + NumberOfCreatedGroupsDuringSession(); + MCAStoredContacts* contactlist = + CCAStorageManagerFactory::ContactListInterfaceL(); + + TPtrC ownId = contactlist->OwnStatus().Identification(); + HBufC* groupName = StringLoader::LoadLC( RSC_CHAT_GROUP_DEFAULT, + ownId, + nbrOfChats + 1 ); + aChatGroupName.Copy( groupName->Left( KMaxChatGroupLenght ) ); + + // convert numbers to local language. + // Exclude indentification part of text. + TInt pos = aChatGroupName.Find( ownId ); + if ( pos != KErrNotFound ) + { + TInt end = pos + ownId.Length(); + + // after id part + if ( end < aChatGroupName.Length() ) + { + TPtr nonIdPart = aChatGroupName.MidTPtr( end ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( + nonIdPart ); + } + + // before id part + if ( pos > 0 ) + { + TPtr nonIdPart = aChatGroupName.LeftTPtr( pos ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( + nonIdPart ); + } + } + + CleanupStack::PopAndDestroy( groupName ); + break; + } + + } + + } + + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::ScreenNameQueryL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- + +void CCAGroupUtilsPC::ScreenNameQueryL( TDes& aScreenName ) + { + TInt askScreenName = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_SCREENNAME_QUERY ); + TInt screenNameStrategy = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_SCREENNAME_DEFAULT ); + TInt snSettings = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_SCREENNAME_SETTING ); + TBool isSnSet = iEngine.GetInternalSettingsInterface()->Value( + MCASettings::EDefaultScreenNameInUse ); + TInt aliasEnabled = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_HAVE_ALIAS ); + + TInt snMaxLen = aScreenName.MaxLength(); + TInt copyLen = snMaxLen < KScreenNameQueryMaxLength ? + snMaxLen : KScreenNameQueryMaxLength; + + switch ( screenNameStrategy ) + { + case 0 : + { + // use empty screen name + aScreenName.Copy( KNullDesC() ); + break; + } + + case 1 : + { + // userid, overwrite screen name buffer with userid + HBufC* ownWVIDbuf = iEngine.GetInternalSettingsInterface()-> + ValueL( MCASettings::EOwnWVUserID ); + CleanupStack::PushL( ownWVIDbuf ); + // make sure it can fit + TPtrC displayId( CCAPCUtils::DisplayId( *ownWVIDbuf ) ); + aScreenName.Copy( displayId.Left( copyLen ) ); + CleanupStack::PopAndDestroy( ownWVIDbuf ); + + break; + } + + case 2 : + { + // screen name, default behaviour + if ( snSettings && isSnSet ) + { + HBufC* sn = iEngine.GetInternalSettingsInterface()->ValueL( + MCASettings::EDefaultScreenName ); + if ( sn->Length() > 0 ) + { + aScreenName.Copy( sn->Left( copyLen ) ); + } + delete sn; + } + + break; + } + + case 3 : + { + // alias + if ( aliasEnabled ) + { + HBufC* alias = iEngine.GetInternalSettingsInterface()->OwnAliasL(); + if ( alias && alias->Length() > 0 ) + { + aScreenName.Copy( alias->Left( copyLen ) ); + } + else + { + // If alias is not defined, we need to query screenname. + askScreenName = ETrue; + } + delete alias; + } + + break; + } + + default : + { + break; + } + } + } + +// pcside_complete +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::MoveOwnIdToFirstL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::MoveOwnIdToFirstL( CDesCArray& aList ) + { + // find the own wvid from list and move it to the beginning + HBufC* ownWVIDbuf = iEngine.GetInternalSettingsInterface()-> + ValueL( MCASettings::EOwnWVUserID ); + CleanupStack::PushL( ownWVIDbuf ); + TInt listLen = aList.Count(); + // must traverse list backwards + for ( TInt i = listLen - 1; i >= 0; i-- ) + { + if ( 0 == CAUtils::NeutralCompare( aList.MdcaPoint( i ), *ownWVIDbuf ) ) + { + // found own id, delete it + aList.Delete( i ); + } + } + aList.InsertL( 0, *ownWVIDbuf ); + CleanupStack::PopAndDestroy( ownWVIDbuf ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::UpdateGroupMembersL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::UpdateGroupMembersL( const TDesC& aGroupId, + const CDesCArray& aOldAdmins, const CDesCArray& aAdmins, + const CDesCArray& aOldUserList, const CDesCArray& aUserList, + const CDesCArray& aOldRejected, const CDesCArray& aRejected ) + { + MCAGroupOperations* grOps = + iGroupManagerInterface->GroupOperationsL( aGroupId ); + + if ( !grOps ) + { + return; + } + // added admins + CHAT_DP_TXT( "**addedAdmins**" ); + CDesCArray* addedAdmins = CAArrayUtils::CreateDiffLC( aAdmins, aOldAdmins ); + // removed admins + CHAT_DP_TXT( "**removedAdmins**" ); + CDesCArray* removedAdmins = CAArrayUtils::CreateDiffLC( aOldAdmins, + aAdmins ); + + // -- removed users -- + CHAT_DP_TXT( "**removedUsers**" ); + CDesCArray* removed = CAArrayUtils::CreateDiffLC( aOldUserList, aUserList ); + // removed admins + CAArrayUtils::AppendArrayL( *removedAdmins, *removed ); + TInt err( KErrNone ); + if ( removed->Count() > 0 ) + { + CHAT_DP_FUNC_DP( "EditChatGroupPropertiesL", "..removed users.." ); + err = grOps->RemoveMembersL( *removed ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy( 3, addedAdmins ); + User::Leave( err );// leaves on errors + } + } + CleanupStack::PopAndDestroy( removed ); + + // -- added users -- + CHAT_DP_TXT( "**addedUsers**" ); + CDesCArray* added = CAArrayUtils::CreateDiffLC( aUserList, aOldUserList ); + CDesCArray* empty = new( ELeave )CDesCArrayFlat( 1 ); + CleanupStack::PushL( empty ); + // admins must be added first as ordinary users + CDesCArray* addedUsers = CAArrayUtils::CloneArrayLC( *added ); + CAArrayUtils::AppendArrayL( *addedAdmins, *addedUsers ); + if ( addedUsers->Count() > 0 ) + { + CHAT_DP_FUNC_DP( "EditChatGroupPropertiesL", "..added users.." ); + err = grOps->AddMembersL( *addedUsers, *empty ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy( 5, addedAdmins ); + User::Leave( err );// leaves on errors + } + } + CleanupStack::PopAndDestroy( addedUsers ); + CleanupStack::PopAndDestroy( empty ); + + // -- modify the rights for new admins -- + if ( addedAdmins->Count() > 0 ) + { + CHAT_DP_FUNC_DP( "EditChatGroupPropertiesL", "..added admins.." ); + err = grOps->ModifyMembersL( addedAdmins, NULL, NULL ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy( 3, addedAdmins ); + User::Leave( err );// leaves on errors + } + + } + + CleanupStack::PopAndDestroy( 3, addedAdmins ); + + // -- added or removed banned users -- + CHAT_DP_TXT( "**addedRejected**" ); + CDesCArray* addedBan = CAArrayUtils::CreateDiffLC( aRejected, + aOldRejected ); + CHAT_DP_TXT( "**removedRejected**" ); + CDesCArray* removedBan = CAArrayUtils::CreateDiffLC( aOldRejected, + aRejected ); + if ( ( addedBan->Count() > 0 ) || ( removedBan->Count() > 0 ) ) + { + CHAT_DP_FUNC_DP( "EditChatGroupPropertiesL", "..added/removed ban.." ); + err = grOps->SetRejectListL( *addedBan, *removedBan ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy( 2, addedBan ); + User::Leave( err );// leaves on errors + } + } + + CleanupStack::PopAndDestroy( 2, addedBan ); + + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::AddGroupMembersL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::AddGroupMembersL( const TDesC& aGroupId, + CDesCArray& aAdmins, + const CDesCArray& aUserList, + const CDesCArray& aRejected ) + { + MCAGroupOperations* grOps = iGroupManagerInterface-> + GroupOperationsL( aGroupId ); + + if ( !grOps ) + { + return; + } + if ( aAdmins.Count() > 0 ) + { + // remove own wvid from list + aAdmins.Delete( 0 ); + aAdmins.Compress(); + } + + TInt err( KErrNone ); + CDesCArray* empty = new( ELeave )CDesCArrayFlat( 1 ); + CleanupStack::PushL( empty ); + CDesCArray* added = CAArrayUtils::CloneArrayLC( aUserList ); + CAArrayUtils::AppendArrayL( aAdmins, *added ); + if ( added->MdcaCount() > 0 ) // added users + { + err = grOps->AddMembersL( *added, *empty ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy( 2, empty ); + User::Leave( err );// leaves on errors + } + } + CleanupStack::PopAndDestroy( added ); + + // -- modify the rights for new admins (ignore own wvid) -- + if ( aAdmins.Count() > 0 ) + { + err = grOps->ModifyMembersL( &aAdmins, NULL, NULL ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy(); //empty + User::Leave( err );// leaves on errors + } + + } + // -- added banned users -- + if ( aRejected.Count() > 0 ) + { + err = grOps->SetRejectListL( aRejected, *empty ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy(); //empty + User::Leave( err );// leaves on errors + } + + } + CleanupStack::PopAndDestroy(); //empty + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetRejectListL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::GetRejectListL( CDesCArray& aRejectList, + const TDesC& aGroup ) + { + // populate lists and get the properties + MCAGroupOperations* grOps = iGroupManagerInterface->GroupOperationsL( aGroup ); + return grOps->GetRejectListL( aRejectList ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetMembersL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::GetMembersL( CDesCArray& aUserList, + CDesCArray& aScreenNames, + CDesCArray& aModers, + CDesCArray& aAdmins , const TDesC& aGroup ) + { + MCAGroupOperations* grOps = iGroupManagerInterface->GroupOperationsL( aGroup ); + return grOps->GetMembersL( aUserList, + aScreenNames, + aModers, + aAdmins ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetIdentificationL +// ----------------------------------------------------------------------------- +// +const TPtrC CCAGroupUtilsPC::GetIdentificationL( const TDesC& aContactId ) + { + MCAStoredContacts* contacts = + CCAStorageManagerFactory::ContactListInterfaceL(); + return contacts->Identification( aContactId ) ; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::CreateGroupSimpleL +// ----------------------------------------------------------------------------- +// +HBufC* CCAGroupUtilsPC::CreateGroupSimpleL( const TDesC& aScreenName, + TBool aJoinGroup, + TBool aIsWhisperingEnabled, TInt& aErrorCode ) + { + CImpsPrivateGroupProps* newPrivateProps = CImpsPrivateGroupProps::NewL(); + CleanupStack::PushL( newPrivateProps ); + + MCAProcessManager* processManager + = CCAProcessManagerFactory::InstanceL()->GetProcessManager(); + + CCAGroupPropertiesPC* groupPropsDialogPC + = dynamic_cast( processManager->GetGroupPropertiesPC() ); + + HBufC* groupID = iGroupManagerInterface->CreateGroupL( + groupPropsDialogPC->GetEdittedProperties(), + newPrivateProps, + aScreenName, + aJoinGroup, + aIsWhisperingEnabled, + aErrorCode ); + + CleanupStack::PopAndDestroy( newPrivateProps ); + return groupID; + } + + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::CreateGroupL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +HBufC* CCAGroupUtilsPC::CreateGroupL( const TDesC& aScreenName, const TDesC& aGroupName, + TInt& aError ) + { + // finalize chat group creation and join it, then send all the + // invitations + // create chat group with default properties + CImpsCommonGroupProps* groupProps = + CImpsCommonGroupProps::NewL(); + CleanupStack::PushL( groupProps ); + CImpsPrivateGroupProps* privateProps = + CImpsPrivateGroupProps::NewL(); + CleanupStack::PushL( privateProps ); + + // set properties: + // no search, open group, no whisper, empty topic and welcome + groupProps->SetMaxNbrOfUsers( + IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_GROUP_SIZE ) ); + groupProps->SetSearchable( + IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_GROUP_SEARCH ) == 1 ? + EImpsPropYes : EImpsPropNo ); + groupProps->SetOpen( + IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_GROUP_OPEN ) == 1 ? + EImpsPropYes : EImpsPropNo ); + groupProps->SetPrivateAllowed( + IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_GROUP_WHISPER ) == 1 ? + EImpsPropYes : EImpsPropNo ); + groupProps->SetGroupNameL( aGroupName ); + + HBufC* topic = StringLoader::LoadLC( RSC_CRRSS_CHAT_VARIATION_START_ID + + RSC_CHAT_VARIATION_GROUP_TOPIC ); + HBufC* welcome = StringLoader::LoadLC( RSC_CRRSS_CHAT_VARIATION_START_ID + + RSC_CHAT_VARIATION_GROUP_WELCOME_NOTE ); + groupProps->SetTopicL( *topic ); + groupProps->SetWelcomeL( *welcome ); + CleanupStack::PopAndDestroy( 2, topic ); // welcome, topic + + + // check the autodeletion variation flag + if ( IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_GROUP_AUTODELETE ) ) + { + groupProps->SetAutoDelete( EImpsPropYes ); + } + + CleanupStack::Pop( 2, groupProps ); // privateProps, groupProps + + // CreateGroupL takes ownership + TBool whisperingAllowed = + IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_GROUP_WHISPER ) == 1; + return iGroupManagerInterface->CreateGroupL( groupProps, + privateProps, + aScreenName, + EFalse, + whisperingAllowed, + aError ) ; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::JoinGroupL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::JoinGroupL( const TDesC& aGroupId, + const TDesC& aScreenName, + TBool aUsers, TBool aIsFavourite ) + + { + + TBool whisperingAllowed = IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_GROUP_WHISPER ) == 1; + return iGroupManagerInterface->JoinGroupL( + aGroupId, aScreenName, aUsers, + aIsFavourite, whisperingAllowed ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetGroupDataL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::GetGroupDataL( const TDesC& aGroupId, + CDesCArray& aUserList, CDesCArray& aScreenNames, + CDesCArray& aModerators, CDesCArray& aAdmins, + CDesCArray& aRejected ) + { + + // populate lists and get the properties + MCAGroupOperations* grOps = + iGroupManagerInterface->GroupOperationsL( aGroupId ); + + + + CImpsCommonGroupProps* groupProps = NULL; + CImpsPrivateGroupProps* privateProps = NULL; + + TInt errMem = grOps->GetMembersL( aUserList, aScreenNames, aModerators, aAdmins ); + TInt errRej = grOps->GetRejectListL( aRejected ); + TInt errProp = grOps->GetPropertiesL( groupProps, privateProps ); + + CHAT_DP( D_CHAT_LIT( + "CCAGroupUtilsPC::GetGroupDataL: GetMembers(%d), GetRejectList(%d), GetProperties(%d)" ), + errMem, errRej, errProp ); + + if ( errProp != KErrNone ) + { + return ( errProp == ECSPInsufficientGroupPrivileges ) ? + ECSPInternalOrNetworkError : errProp; + } + + // Ignore other errors + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::ProcessEditedGroupPropertiesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::ProcessEditedGroupPropertiesL( const TDesC& aGroupId, + CDesCArray& aOldAdmins, + CDesCArray& aNewAdmins, + CDesCArray& aOldUsers, + CDesCArray& aNewUsers, + CDesCArray& aOldRejected, + CDesCArray& aNewRejected ) + { + + // In the case of an open group, we must 1. update properties, 2. update members + // In the case of a closed group, we must 1. update members, 2. update properties + // Otherwise we end up kicking people out in one of the cases + // populate lists and get the properties + MCAGroupOperations* grOps = + iGroupManagerInterface->GroupOperationsL( aGroupId ); + MCAProcessManager* processManager + = CCAProcessManagerFactory::InstanceL()->GetProcessManager(); + CCAGroupPropertiesPC* groupPropsDialogPC = dynamic_cast + ( processManager->GetGroupPropertiesPC() ); + TInt err( KErrNone ); + TBool isOpen = ( groupPropsDialogPC-> + GetEdittedProperties()->IsOpen() == TEnumsPC::EImpsPropYes ); + + CImpsPrivateGroupProps* newPrivateProps = CImpsPrivateGroupProps::NewL(); + CleanupStack::PushL( newPrivateProps ); + + + if ( isOpen ) + { + // open group + + // Update properties + err = grOps->UpdatePropertiesL( + groupPropsDialogPC->GetEdittedProperties(), + newPrivateProps ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy(); //newPrivateProps + return err; + } + + // Update group members + UpdateGroupMembersL( aGroupId, aOldAdmins, aNewAdmins, + aOldUsers, aNewUsers, aOldRejected, aNewRejected ); + } + else + { + // closed group + + // Update group members + UpdateGroupMembersL( aGroupId, aOldAdmins, aNewAdmins, + aOldUsers, aNewUsers, aOldRejected, aNewRejected ); + + // Update properties + err = grOps->UpdatePropertiesL( groupPropsDialogPC->GetEdittedProperties(), + newPrivateProps ); + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy(); //newPrivateProps + return err; + } + } + + // update the group name + MCAExtendedStoredGroup* group = static_cast + ( iStoredGroups->FindGroup( aGroupId ) ); + + if ( group ) + { + group->SetGroupNameL( groupPropsDialogPC-> + GetEdittedProperties()->GroupName() ); + if ( group->StorageType() == TStorageManagerGlobals::EStoragePersistent ) + { + group->SaveChangesL(); + } + // signal the ui of changed group + iStoredGroups->SignalGroupChangedL( aGroupId ); + } + + CleanupStack::PopAndDestroy( 1, newPrivateProps ); + + return KErrNone; + } +// --------------------------------------------------------- +// CCAGroupUtilsPC::SaveAsFavouriteL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAGroupUtilsPC::SaveAsFavouriteL( const TDesC& aGroupId ) + { + + MCAStoredGroup* chatGroup = iStoredGroups->FindGroup( aGroupId ); + if ( chatGroup ) + { + MCAExtendedStoredGroup* exGrp = static_cast < + MCAExtendedStoredGroup* > ( chatGroup ); + if ( exGrp ) + { + exGrp->SaveChangesL(); + } + } + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::CreateOrJoinGroupL +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::CreateOrJoinGroupL( const TDesC& aGroupId, + TBool& aIsJoined, TBool& aIsFavourite ) + { + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + + if ( group ) + { + aIsJoined = group->IsJoined(); + + aIsFavourite = ( group->StorageType() == + TStorageManagerGlobals::EStoragePersistent ); + } + else + { + // if the group doesn't exist, create it + CHAT_DP_FUNC_DP( "JoinGroupL", "created new group" ); + // Ownership not transferred to caller + MCAExtendedStoredGroup* extGroup = iStoredGroups->CreateGroupL(); + // CSI: 35 # Comment above + + extGroup->SetGroupIdL( aGroupId ); + extGroup->SetGroupNameL( KNullDesC ); + + group = extGroup; + } + currentGroup = group; + + // set the group visible, just in case + static_cast( group )->SetVisible( ETrue ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetEngineDefaultGroupName +// ----------------------------------------------------------------------------- +// +TPtrC CCAGroupUtilsPC::GetEngineDefaultGroupName( const TDesC& aGroupId ) const + { + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + if ( group ) + { + return group->GroupName(); + } + else + { + + CImpsCommonGroupProps* commonProps = NULL; + + // if the group doesn't exist, create a temp one + CHAT_DP_FUNC_DP( "JoinGroupL", "created new group" ); + + TRAPD( error, + // Ownership not transferred to caller + MCAExtendedStoredGroup* extGroup = iStoredGroups->CreateGroupL(); + + extGroup->SetGroupIdL( aGroupId ); + extGroup->SetGroupNameL( KNullDesC ); + + // Set the group invisible + static_cast( extGroup )->SetVisible( EFalse ); + + MCAGroupOperations* grOps = iGroupManagerInterface->GroupOperationsL( aGroupId ); + + // if we created the group, fetch the name for it + CImpsPrivateGroupProps* privProps = NULL; + TInt err = grOps->GetPropertiesL( commonProps, privProps ); + ); + + if ( error == KErrNone && commonProps != NULL ) + { + return commonProps->GroupName(); + } + // If we can not get the group name return KNullDesC + else + { + return KNullDesC(); + } + } + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::SetGroupNameL +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::SetGroupNameL( const TDesC& aGroupId ) + { + MCAGroupOperations* grOps = iGroupManagerInterface->GroupOperationsL( aGroupId ); + // if we created the group, fetch the name for it + CImpsCommonGroupProps* commonProps = NULL; + CImpsPrivateGroupProps* privProps = NULL; + TInt err = grOps->GetPropertiesL( commonProps, privProps ); + + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + + if ( err == KErrNone && commonProps ) + { + static_cast( currentGroup ) + ->SetGroupNameL( commonProps->GroupName() ); + } + + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetAliasL +// ----------------------------------------------------------------------------- +// +HBufC* CCAGroupUtilsPC::GetAliasL() + { + return iEngine.GetInternalSettingsInterface()->ValueL( MCASettings::EOwnAlias ); + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::GetGroupNameForJoinedGroupL +// ----------------------------------------------------------------------------- +// +TPtrC CCAGroupUtilsPC::GetGroupNameForJoinedGroupL( const TDesC& aGroupId ) + { + // update the group name + + MCAGroupOperations* grOps = iGroupManagerInterface->GroupOperationsL( aGroupId ); + + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + + // prefer showing the group name + if ( group->GroupName().Length() == 0 ) + { + // no group name, use Group ID + return CCAPCUtils::DisplayId( aGroupId ); + } + else + { + // group name exists + return group->GroupName(); + } + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::DeleteFailedGroupL +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::DeleteFailedGroupL( const TDesC& aGroupId, + TBool aDeleteFromNetwork ) + { + + // update the group name + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + + if ( ( !group->IsOwnGroup() ) && + ( group->StorageType() != + TStorageManagerGlobals::EStoragePersistent ) && + ( !group->IsJoined() ) ) + { + + iStoredGroups->SetGroupDeleted( ETrue ); + // if join was not succesfull and group is not own nor saved, + // remove the group from manager + iGroupManagerInterface->DeleteGroupL( aGroupId, aDeleteFromNetwork ); + + iStoredGroups->SetGroupDeleted( EFalse ); + } + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::SendInvitationsL +// ----------------------------------------------------------------------------- +// +TInt CCAGroupUtilsPC::SendInvitationsL( const CDesCArray& aUserIDs, + const TDesC& aGroupID, + const TDesC& aMessage ) + { + TInt retVal = KErrNone; + // we have invitations, so send them + CCAInvitationRequest* invitation = + CCAInvitationRequest::NewL( aUserIDs, + aGroupID, + aMessage ); + + CleanupStack::PushL( invitation ); + + + MCAInvite* inviteAPI = iEngine.GetInvitationInterface(); + // Send invitation + inviteAPI->SendInvitationL( *invitation ); + CleanupStack::PopAndDestroy( invitation ); + return retVal; + } + + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC: FindGroup +// ----------------------------------------------------------------------------- +// +TBool CCAGroupUtilsPC::FindGroup( const TDesC& aId ) + { + MCAStoredGroup* group = iStoredGroups->FindGroup( aId ); + if ( group ) + { + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC: GetParticipantsL +// ----------------------------------------------------------------------------- +// +void CCAGroupUtilsPC::GetParticipantsL( CDesCArray& aParticipantList, + const TDesC& aGroupID ) const + { + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupID ); + if ( group ) + { + group->GetParticipantsL( aParticipantList ); + } + } + + +// --------------------------------------------------------- +// CCAGroupUtilsPC::LeaveGroupL +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CCAGroupUtilsPC::LeaveGroupL( const TDesC& aGroupId ) + { + return iGroupManagerInterface->LeaveGroupL( aGroupId ) ; + } + + +// ----------------------------------------------------------------------------- +// CCAGroupUtilsPC::IsFavouriteChatGroup +// ----------------------------------------------------------------------------- +// +TBool CCAGroupUtilsPC::IsFavouriteChatGroup( const TDesC& aGroupId ) const + { + TBool isFavourite( EFalse ); + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + if ( group ) + { + isFavourite = ( group->StorageType() == + TStorageManagerGlobals::EStoragePersistent ); + } + return isFavourite; + } + +// --------------------------------------------------------- +// CCAGroupUtilsPC::IsOwnGroup +// --------------------------------------------------------- +// +TBool CCAGroupUtilsPC::IsOwnGroup( const TDesC& aGroupId ) const + { + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + + if ( group ) + { + return group->IsOwnGroup(); + } + else + { + return EFalse; + } + } + + +// --------------------------------------------------------- +// CCAGroupUtilsPC::IsJoined +// --------------------------------------------------------- +// +TBool CCAGroupUtilsPC::IsJoined( const TDesC& aGroupId ) const + { + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + + if ( group ) + { + return group->IsJoined(); + } + else + { + return EFalse; + } + } + + +// --------------------------------------------------------- +// CCAGroupUtilsPC::IsAdmin +// --------------------------------------------------------- +// +TBool CCAGroupUtilsPC::IsAdmin( const TDesC& aGroupId ) const + { + MCAStoredGroup* group = iStoredGroups->FindGroup( aGroupId ); + if ( group ) + { + return group->IsAdmin(); + } + else + { + return EFalse; + } + } + +// End of File