diff -r 000000000000 -r 094583676ce7 wvuing/wvuiave/AppSrc/CCAInviteEditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiave/AppSrc/CCAInviteEditor.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,326 @@ +/* +* 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: Editor for invites +* +*/ + + +// INCLUDE FILES +#include "CCAInviteEditor.h" // header for this .cpp. +#include "IMDialogUtils.h" +#include "ChatDefinitions.h" +#include "CCAApp.h" +#include "CCAAppUi.h" +#include "CCAVariantFactory.h" +#include "ChatDebugPrint.h" +#include "IMPSBuildDefinitions.h" +#include "CCAContactSelectionDialog.h" +#include "MCAInviteConflictResolver.h" +#include "MCASettingsPC.h" +#include "MCAMainViewArrayPC.h" +#include "MCAProcessManager.h" +#include "MCAInviteEditorPC.h" +#include "MCAServerContactsArrayPC.h" +#include "ImpsCSPAllErrors.h" +#include "CCAPCUtils.h" + +#include +#include +#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" + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCAInviteEditor* CCAInviteEditor::NewL( const TDesC& aGroup ) + { + CCAInviteEditor* self = new ( ELeave ) CCAInviteEditor( ); + + CleanupStack::PushL( self ); + self->ConstructL( aGroup ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCAInviteEditor* CCAInviteEditor::NewLC( const TDesC& aGroup ) + { + CCAInviteEditor* self = new ( ELeave ) CCAInviteEditor( ); + + CleanupStack::PushL( self ); + self->ConstructL( aGroup ); + return self; + } + +// Destructor +CCAInviteEditor::~CCAInviteEditor() + { + delete iGroupID; + delete iInviteEditorPC; + } + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::CreateAndSendInvitation +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCAInviteEditor::CreateAndSendInvitation( MCAInviteConflictResolver& aResolver, + const TDesC& aReceiver ) + { + TRAPD( err, CreateAndSendInvitationL( aResolver, aReceiver ) ); + + if ( err != KErrNone ) + { + TRAPD( ign, ShowErrorNoteL() ); + + if ( ign ) + { + // propagate system errors to current active scheduler, + CActiveScheduler::Current()->Error( ign ); + } + } + + return ( err == KErrNone ); + } + + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::PopulateInviteListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAInviteEditor::PopulateInviteListL( CDesCArray& aInviteList, + const MCAServerContactsArrayPC& aRawOnlineList, + const CArrayFixFlat& aSelectionArray ) + { + iInviteEditorPC->PopulateInviteListL( aInviteList, + aRawOnlineList, + aSelectionArray ); + + } + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::QueryInviteMessageL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +HBufC* CCAInviteEditor::QueryInviteMessageL() + { + HBufC* message = HBufC::NewLC( KInviteMessageMaxLength ); + TPtr messagePtr( message->Des() ); + + if ( !IMDialogUtils::DisplayTextQueryDialogL( messagePtr, + R_CHAT_INVITE_MSG_DQ, R_CHAT_INVITE_MESSAGE_QUERY, + ETrue /* T9 */, + EFalse, // Show LSK only when needed + IMDialogUtils::ESend + ) ) + { + CleanupStack::PopAndDestroy( message ); + return NULL; + } + else + { + CleanupStack::Pop( message ); + return message; + } + } + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::ShowErrorNoteL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAInviteEditor::ShowErrorNoteL() + { + HBufC* prompt = CEikonEnv::Static()->AllocReadResourceLC( + R_CHAT_INVITE_SEND_ERROR ); + IMDialogUtils::DisplayErrorNoteL( *prompt ); + CleanupStack::PopAndDestroy( prompt ); + } + + +// ----------------------------------------------------------------------------- +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCAInviteEditor::CCAInviteEditor( ) + { + } + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCAInviteEditor::ConstructL( const TDesC& aGroup ) + { + iGroupID = aGroup.AllocL(); + CCAAppUi* appUi = static_cast( CCoeEnv::Static()->AppUi() ); + iInviteEditorPC = appUi->GetProcessManager().CreateInviteEditorPCL(); + } + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::CreateAndSendInvitationL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCAInviteEditor::CreateAndSendInvitationL( MCAInviteConflictResolver& aResolver, + const TDesC& aReceiver + ) + { + + CDesCArray* inviteList = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( inviteList ); + + + if ( aReceiver.Length() == 0 ) + { + CCAAppUi* appUi = static_cast( CCoeEnv::Static()->AppUi() ); + CDesCArray* selectedContacts = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( selectedContacts ); + MCASkinVariant* skinVar = static_cast( appUi->Application() ) + ->VariantFactory()->SkinVariantL(); + + + MCASettingsPC* settingsPC = appUi->GetProcessManager().GetSettingsInterface(); + MCAMainViewArrayPC* mainViewArrayPC = appUi->GetProcessManager().GetArrayInterface(); + if ( ! CCAContactSelectionDialog::ShowDialogL( *selectedContacts, + *mainViewArrayPC, + *skinVar, *settingsPC, + appUi->MbmFullPath(), + TEnumsPC::EMultiSelect, + R_CONTACT_SELECTION_DIALOG, + *appUi->CAStatusPane(), + NULL ) ) + { + // no contacts + CleanupStack::PopAndDestroy( 2 ); // selectedContacts.Close(), inviteList + return; + } + + // handle selected contacts (if any) + TInt count( selectedContacts->MdcaCount() ); + CHAT_DP( D_CHAT_LIT( "selection count %d" ), count ); + for ( TInt i( 0 ); i < count; ++i ) + { + + TPtrC wvid( selectedContacts->MdcaPoint( i ) ); + + CHAT_DP( D_CHAT_LIT( "..adding %S to invite list" ), &wvid ); + // Prevent duplicates and don't add if user canceled offline notification + TInt pos( KErrNone ); + if ( inviteList->Find( wvid, pos ) != KErrNone ) + { + inviteList->AppendL( wvid ); + } + } + + CleanupStack::PopAndDestroy(); // selectedContacts.Close() + } + else + { + inviteList->AppendL( aReceiver ); + } + + // If user selected something, then proceed... + if ( inviteList->MdcaCount() > 0 ) + { + // Ask for invite message + HBufC* message = QueryInviteMessageL(); + + if ( message ) + { + CleanupStack::PushL( message ); + + // Resolve invite conflicts + aResolver.ResolveInviteConflictL( *iGroupID, *inviteList ); + + TInt inviteeCount = inviteList->MdcaCount(); + if ( inviteeCount > 0 ) + { + // Create invitation + // Show wait-note + CCAAppUi* appUi = + static_cast< CCAAppUi* >( CCoeEnv::Static()->AppUi() ); + + // Show wait-note. Error state dismisses it. + appUi->ShowWaitDialogL( inviteList->MdcaCount() > 1 ? + R_QTN_CHAT_INVITE_SENDING_MANY : R_QTN_CHAT_INVITE_SENDING, + ETrue ); + // Send invitation + TRAPD( retval, iInviteEditorPC->SendInvitationL( *inviteList, + *iGroupID, + *message ) ); + + CleanupStack::PopAndDestroy( message ); + // Get rid of wait-note + if ( retval == ECSPRecipientBlockedSender ) + { + for ( TInt cnt = 0; cnt < inviteeCount; cnt++ ) + { + appUi->DismissWaitDialogL( retval, EFalse, + CCAPCUtils::DisplayId( inviteList->MdcaPoint( cnt ) ) ); + } + } + else + { + appUi->DismissWaitDialogL( retval ); + } + + } + else + { + CleanupStack::PopAndDestroy( message ); + } + + } + else + { + // User cancelled invite message query, + // return to contact selection view + CleanupStack::PopAndDestroy( inviteList ); + return; + } + } + CleanupStack::PopAndDestroy( inviteList ); + + } + +// ----------------------------------------------------------------------------- +// CCAInviteEditor::GetOnlineFriendsLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +MCAServerContactsArrayPC* CCAInviteEditor::GetOnlineFriendsLC() + { + MCAServerContactsArrayPC* pairsArray = iInviteEditorPC->GetOnlineFriendsLC( KIconTabulator ); + return pairsArray; + } + +// End of File +