--- /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 <eikenv.h>
+#include <chatNG.rsg>
+#include <stringloader.h>
+
+// 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<TInt>& 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<CCAAppUi*>( 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<CCAAppUi*>( CCoeEnv::Static()->AppUi() );
+ CDesCArray* selectedContacts = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+ CleanupStack::PushL( selectedContacts );
+ MCASkinVariant* skinVar = static_cast<CCAApp*>( 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
+