phonebookui/Phonebook2/Commands/src/CPbk2AiwInterestItemPoc.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Commands/src/CPbk2AiwInterestItemPoc.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,490 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 PoC AIW interest item.
+*
+*/
+
+
+#include "CPbk2AiwInterestItemPoc.h"
+
+// Phonebook 2
+#include "CPbk2CallTypeSelector.h"
+#include "CPbk2PocCmd.h"
+#include <TPbk2StoreContactAnalyzer.h>
+#include <MPbk2Command.h>
+#include <Pbk2UIControls.rsg>
+#include <Pbk2Commands.rsg>
+#include <MPbk2ContactUiControl.h>
+#include <Pbk2UID.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+#include "cpbk2storestatechecker.h"
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkContactOperationBase.h>
+
+// System includes
+#include <AiwServiceHandler.h>
+#include <eikmenup.h>
+#include <eikenv.h>
+#include <AiwPoCParameters.h>
+#include <AiwPoCParameters.hrh>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+/**
+ * Standard error handling.
+ *
+ * @param aError    Error code.
+ */
+void HandleError( const TInt aError )
+    {
+    if (aError != KErrNone)
+        {
+        // Get UIKON environment
+        CEikonEnv* eikEnv = CEikonEnv::Static();
+        if (eikEnv)
+            {
+            // Display standard error message
+            eikEnv->HandleError(aError);
+            }
+        }
+    }
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPreCond_ExecuteCommandL = 1,
+    EPanicPreCond_ReadContactL,
+    EPanicLogic_UnknownState
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT( KPanicText, "CPbk2AiwInterestItemPoc" );
+    User::Panic( KPanicText, aReason );
+    }
+#endif // _DEBUG
+
+
+} /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::CPbk2AiwInterestItemPoc
+// --------------------------------------------------------------------------
+//
+inline CPbk2AiwInterestItemPoc::CPbk2AiwInterestItemPoc
+        ( TInt aInterestId, CAiwServiceHandler& aServiceHandler ) :
+            CPbk2AiwInterestItemBase( aInterestId, aServiceHandler )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::~CPbk2AiwInterestItemPoc
+// --------------------------------------------------------------------------
+//
+CPbk2AiwInterestItemPoc::~CPbk2AiwInterestItemPoc()
+    {
+    Cancel();
+    delete iStoreStateChecker;
+    delete iContactLink;
+    delete iStoreContact;
+    delete iSelector;
+    delete iRetriever;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2AiwInterestItemPoc::ConstructL()
+    {
+    iFieldPropertyArray =
+        &Phonebook2::Pbk2AppUi()->ApplicationServices().FieldProperties();
+    iSelector = CPbk2CallTypeSelector::NewL
+        ( Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager() );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2AiwInterestItemPoc* CPbk2AiwInterestItemPoc::NewL
+        ( TInt aInterestId, CAiwServiceHandler& aServiceHandler )
+    {
+    CPbk2AiwInterestItemPoc* self =
+        new (ELeave) CPbk2AiwInterestItemPoc( aInterestId, aServiceHandler );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2AiwInterestItemPoc::DynInitMenuPaneL
+        ( const TInt aResourceId, CEikMenuPane& aMenuPane,
+          const MPbk2ContactUiControl& aControl )
+    {
+    TBool ret = EFalse;
+
+    switch ( aResourceId )
+        {
+        case R_PHONEBOOK2_GROUPVIEWS_POC_MENU:
+            {
+            ret = ETrue;
+
+            if ( aControl.NumberOfContacts() > 0 )
+                {
+                DoInitMenuPaneL( aResourceId, aMenuPane, aControl,
+                    EAiwPoCCmdTalkGroup );
+                }
+            else
+                {
+                aMenuPane.SetItemDimmed( KAiwCmdPoC, ETrue );
+                }
+            break;
+            }
+        case R_PHONEBOOK2_POC_MENU:
+            {
+            ret = ETrue;
+            TBool noPTTField = EFalse;
+
+            // In contact info view, the PoC menu must be filtered
+            // away if there are no PoC fields
+            const MVPbkStoreContact* storeContact =
+                aControl.FocusedStoreContact();
+
+            // Store contact is not available if we are not in contact
+            // info view
+            if ( storeContact )
+                {
+                TPbk2StoreContactAnalyzer analyzer
+                    ( Phonebook2::Pbk2AppUi()->ApplicationServices().
+                      ContactManager(), storeContact );
+
+                if ( analyzer.HasFieldL
+                        ( R_PHONEBOOK2_SIP_MSISDN_SELECTOR ) < 0 )
+                    {
+                    noPTTField = ETrue;
+                    }
+                }
+
+            // If the list is empty hide PoC option.
+            // In contact info view, the contact must also have
+            // a PTT field available.
+            if ( aControl.NumberOfContacts() > 0 && !noPTTField )
+                {
+                DoInitMenuPaneL( aResourceId, aMenuPane, aControl );
+                }
+            else
+                {
+                aMenuPane.SetItemDimmed( KAiwCmdPoC, ETrue );
+                }
+            break;
+            }
+        case R_PHONEBOOK2_POC_CONTEXT_MENU:
+            {
+            ret = ETrue;
+
+            // Hide the item by default
+            aMenuPane.SetItemDimmed( KAiwCmdPoC, ETrue );
+
+            // Get the focused field
+            const MVPbkBaseContactField* field =
+                aControl.FocusedField();
+
+            if ( field )
+                {
+                TInt tmp( KErrNotFound );
+
+                TPbk2StoreContactAnalyzer analyzer
+                    ( Phonebook2::Pbk2AppUi()->ApplicationServices().
+                      ContactManager(), NULL );
+
+                // Pager field is part of SIP_MSISDN selector
+                // so exclude it from the menu here first
+                if ( analyzer.IsFieldTypeIncludedL(
+                        *field, R_PHONEBOOK2_PAGER_SELECTOR ) &&
+                        aMenuPane.MenuItemExists( KAiwCmdPoC, tmp ) )
+                    {
+                    // If we are in pager field let the item be dimmed
+                    }
+
+                // Check are we dealing with a PTT field
+                else if ( analyzer.IsFieldTypeIncludedL(
+                        *field, R_PHONEBOOK2_SIP_MSISDN_SELECTOR ) )
+                    {
+                    aMenuPane.SetItemDimmed( KAiwCmdPoC, EFalse );
+                    DoInitMenuPaneL( aResourceId, aMenuPane, aControl );
+                    }
+                }
+            break;
+            }
+
+        default:
+            {
+            // Do nothing
+            break;
+            }
+        };
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::HandleCommandL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2AiwInterestItemPoc::HandleCommandL
+        ( const TInt aMenuCommandId, MPbk2ContactUiControl& aControl,
+          TInt aServiceCommandId )
+    {
+    TBool ret = EFalse;
+    // Only handle this command if service command is talk
+    if ( aServiceCommandId == KAiwCmdPoC )
+        {
+        ret = ETrue;
+        iMenuCommandId = aMenuCommandId;
+        iControl = &aControl;
+
+        // Retrieve store contact if needed
+        MVPbkStoreContact* storeContact = const_cast<MVPbkStoreContact*>(
+            aControl.FocusedStoreContact() );
+        if ( !storeContact )
+            {
+            // No need to check store state, store always available
+            // if cmd is invoked from nameslist
+            IssueNextAction( ERetrieveContact );
+            }
+        else
+            {
+            // Check store availability
+            CPbk2StoreStateChecker* temp =
+                CPbk2StoreStateChecker::NewL(
+                    storeContact->ParentStore(), *this );
+            delete iStoreStateChecker;
+            iStoreStateChecker = temp;
+            }
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::VPbkSingleContactOperationComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::VPbkSingleContactOperationComplete(
+        MVPbkContactOperationBase& aOperation,
+        MVPbkStoreContact* aContact )
+    {
+    if ( &aOperation == iRetriever )
+        {
+        delete iStoreContact;
+        iStoreContact = aContact;
+
+        IssueNextAction( EExecutePoc );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::VPbkSingleContactOperationFailed
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::VPbkSingleContactOperationFailed(
+        MVPbkContactOperationBase& aOperation,
+        TInt aError )
+    {
+    if ( &aOperation == iRetriever )
+        {
+        HandleError( aError );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::StoreState
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::StoreState
+        ( MPbk2StoreStateCheckerObserver::TState aState )
+    {
+    if ( aState == MPbk2StoreStateCheckerObserver::EStoreAvailable )
+        {
+        IssueNextAction( EExecutePoc );
+        }
+    else
+        {
+        IssueNextAction( EShowUnavailableNote );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::DoCancel()
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::RunL
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::RunL()
+    {
+    switch ( iState )
+        {
+        case ERetrieveContact:
+            {
+            RetrieveContactL();
+            break;
+            }
+        case EExecutePoc:
+            {
+            MVPbkStoreContact* storeContact = const_cast<MVPbkStoreContact*>(
+                iControl->FocusedStoreContact() );
+            if ( !storeContact )
+                {
+                storeContact = iStoreContact;
+                }
+            ExecuteCommandL( *storeContact );
+            break;
+            }
+        case EShowUnavailableNote:
+            {
+            if ( iStoreStateChecker )
+                {
+                iStoreStateChecker->ShowUnavailableNoteL();
+                }
+            break;
+            }
+        default:
+            {
+            __ASSERT_DEBUG(iControl, Panic( EPanicLogic_UnknownState ) );
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::ExecuteCommandL
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::ExecuteCommandL
+        ( MVPbkStoreContact& aStoreContact )
+    {
+    __ASSERT_DEBUG(iControl, Panic( EPanicPreCond_ExecuteCommandL ) );
+
+    // Execute the command
+    MPbk2Command* cmd = CreatePocCmdObjectL
+        ( iMenuCommandId, *iControl, aStoreContact );
+    cmd->ExecuteLD();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::RetrieveContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::RetrieveContactL()
+    {
+    delete iContactLink;
+    iContactLink = NULL;
+    iContactLink = iControl->FocusedContactL()->CreateLinkLC();
+    CleanupStack::Pop(); // iContactLink
+
+    delete iRetriever;
+    iRetriever = NULL;
+    iRetriever = Phonebook2::Pbk2AppUi()->ApplicationServices().
+        ContactManager().RetrieveContactL( *iContactLink, *this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::IssueRetrieveRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::IssueNextAction( TNextAction aState )
+    {
+    if ( !IsActive() )
+        {
+        iState = aState;
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete( status, KErrNone );
+        SetActive();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::DoInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2AiwInterestItemPoc::DoInitMenuPaneL
+        ( const TInt aResourceId, CEikMenuPane& aMenuPane,
+          const MPbk2ContactUiControl& aControl,
+          TUint aPreferredMenu /*= 0*/ ) const
+    {
+    CAiwGenericParamList& params = iServiceHandler.InParamListL();
+    TAiwPocParameterData pocParameter;
+    pocParameter.iConsumerAppUid = TUid::Uid( KPbk2UID3 );
+    pocParameter.iConsumerWindowGroup =
+        CCoeEnv::Static()->RootWin().Identifier();
+    pocParameter.iCommandId = 0; // not used in menu construct
+
+    if ( aPreferredMenu != 0 )
+        {
+        // Select POC call type
+        pocParameter.iPreferredMenu = EAiwPoCCmdTalkGroup;
+        }
+    else
+        {
+        pocParameter.iPreferredMenu =
+            iSelector->SelectPocCallType( aControl );
+        }
+
+    // PoC parameter data always included
+    TAiwGenericParam param = TAiwGenericParam( EGenericParamPoCData,
+        TAiwVariant( TAiwPocParameterDataPckg( pocParameter ) ) );
+    params.AppendL( param );
+
+    // Let provider add its menu items to the menu
+    iServiceHandler.InitializeMenuPaneL( aMenuPane, aResourceId,
+        KAiwCmdPoC, params);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AiwInterestItemPoc::CreatePocCmdObjectL
+// --------------------------------------------------------------------------
+//
+MPbk2Command* CPbk2AiwInterestItemPoc::CreatePocCmdObjectL( 
+        const TInt aMenuCommandId, 
+        MPbk2ContactUiControl& aControl,
+        MVPbkStoreContact& aStoreContact )
+    {
+    MPbk2Command* cmd = NULL;
+
+    cmd = CPbk2PocCmd::NewL( aMenuCommandId, iServiceHandler,
+        *iSelector, aControl, aStoreContact, NULL );
+
+    return cmd;
+    }
+
+// End of File