wvuing/wvuiave/AppSrc/CCAInviteEditor.cpp
changeset 0 094583676ce7
--- /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
+