--- /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