--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/USIMExtension/src/CPsu2FixedDialingCall.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,341 @@
+/*
+* 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 USIM UI Extension FDN call implementation.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPsu2FixedDialingCall.h"
+
+// Phonebook 2
+#include "CPsu2NumberQueryDlg.h"
+#include <CPbk2FieldPropertyArray.h>
+#include <MPbk2FieldProperty.h>
+#include <Pbk2UIControls.rsg>
+#include <MPbk2CommandHandler.h>
+#include <CPbk2AppViewBase.h>
+#include <CPbk2ContactUiControlSubstitute.h>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactFieldData.h>
+#include <MVPbkContactFieldTextData.h>
+#include <CVPbkFieldTypeSelector.h>
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactStoreProperties.h>
+
+// System includes
+#include <StringLoader.h>
+#include <eikmenup.h>
+#include <barsread.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+const TInt KMaxNumberLength = 52;
+
+/**
+ * Checks is the given field type included in
+ * the given selection.
+ *
+ * @param aResourceId Selector's resource id.
+ * @param aFieldType The field type to check.
+ * @param aManager Virtual Phonebook contact manager.
+ * @return ETrue if field type is included.
+ */
+TBool IsFieldTypeIncludedL(
+ const MVPbkFieldType& aFieldType,
+ const CVPbkContactManager& aManager,
+ const TInt aResourceId )
+ {
+ // Get the field type
+ TResourceReader resReader;
+ CCoeEnv::Static()->CreateResourceReaderLC
+ (resReader, aResourceId);
+
+ CVPbkFieldTypeSelector* selector =
+ CVPbkFieldTypeSelector::NewL(resReader, aManager.FieldTypes());
+ CleanupStack::PopAndDestroy(); // resReader
+
+ TBool ret = selector->IsFieldTypeIncluded(aFieldType);
+ delete selector;
+ return ret;
+ }
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::CPsu2FixedDialingCall
+// --------------------------------------------------------------------------
+//
+CPsu2FixedDialingCall::CPsu2FixedDialingCall
+ ( CVPbkContactManager& aContactManager,
+ MPbk2CommandHandler& aCommandHandler,
+ CPbk2AppViewBase& aAppViewBase ) :
+ CActive(EPriorityStandard),
+ iContactManager( aContactManager ),
+ iCommandHandler( aCommandHandler ),
+ iAppViewBase( aAppViewBase )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::~CPsu2FixedDialingCall
+// --------------------------------------------------------------------------
+//
+CPsu2FixedDialingCall::~CPsu2FixedDialingCall()
+ {
+ Cancel();
+ delete iUiControlSubstitute;
+ delete iRetrieveOperation;
+ delete iTempContact;
+ delete iStoreContact;
+ delete iContactLink;
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::NewL
+// --------------------------------------------------------------------------
+//
+CPsu2FixedDialingCall* CPsu2FixedDialingCall::NewL(
+ CVPbkContactManager& aContactManager,
+ MPbk2CommandHandler& aCommandHandler,
+ CPbk2AppViewBase& aAppViewBase )
+ {
+ CPsu2FixedDialingCall* self = new ( ELeave ) CPsu2FixedDialingCall
+ ( aContactManager, aCommandHandler, aAppViewBase );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::ConstructL()
+ {
+ CActiveScheduler::Add(this);
+
+ iUiControlSubstitute = CPbk2ContactUiControlSubstitute::NewL();
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::CreateCallL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::CreateCallL
+ ( MVPbkContactLink* aContactLink, TInt aCommand )
+ {
+ iCommand = aCommand;
+ iContactLink = aContactLink;
+
+ // Load contact
+ delete iRetrieveOperation;
+ iRetrieveOperation = NULL;
+ iRetrieveOperation = iContactManager.RetrieveContactL
+ ( *iContactLink, *this );
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::RunL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::RunL()
+ {
+ NumberQueryL();
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::DoCancel()
+ {
+ // Nothing to do here
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::RunError
+// --------------------------------------------------------------------------
+//
+TInt CPsu2FixedDialingCall::RunError(TInt aError)
+ {
+ CCoeEnv::Static()->HandleError(aError);
+ return KErrNone;
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::VPbkSingleContactOperationComplete
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::VPbkSingleContactOperationComplete(
+ MVPbkContactOperationBase& /*aOperation*/,
+ MVPbkStoreContact* aContact)
+ {
+ delete iRetrieveOperation;
+ iRetrieveOperation = NULL;
+
+ delete iStoreContact;
+ iStoreContact = aContact;
+
+ IssueRequest();
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::VPbkSingleContactOperationFailed
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::VPbkSingleContactOperationFailed
+ ( MVPbkContactOperationBase& /*aOperation*/, TInt /*aError*/ )
+ {
+ delete iRetrieveOperation;
+ iRetrieveOperation = NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::ContactTextDataL
+// --------------------------------------------------------------------------
+//
+const TPtrC CPsu2FixedDialingCall::ContactTextDataL
+ ( MVPbkStoreContact& aContact, TInt aSelectorResourceId )
+ {
+ MVPbkStoreContactFieldCollection& fields = aContact.Fields();
+ TInt count( fields.FieldCount() );
+ for (TInt index(0); index < count; ++index )
+ {
+ MVPbkStoreContactField& field = fields.FieldAt( index );
+ if ( IsFieldTypeIncludedL( *field.BestMatchingFieldType(),
+ iContactManager, aSelectorResourceId ) )
+ {
+ return MVPbkContactFieldTextData::Cast
+ ( field.FieldData() ).Text();
+ }
+ }
+ return KNullDesC();
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::ContactDataTypeL
+// --------------------------------------------------------------------------
+//
+const MVPbkFieldType* CPsu2FixedDialingCall::ContactDataTypeL
+ ( const MVPbkFieldTypeList& aFieldTypeList, TInt aSelectorResourceId )
+ {
+ TInt count( aFieldTypeList.FieldTypeCount() );
+ for (TInt index(0); index < count; ++index )
+ {
+ const MVPbkFieldType& fieldType =
+ aFieldTypeList.FieldTypeAt( index );
+ if ( IsFieldTypeIncludedL
+ ( fieldType, iContactManager, aSelectorResourceId ) )
+ {
+ return &fieldType;
+ }
+ }
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::IssueRequest
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::IssueRequest()
+ {
+ if ( !IsActive() )
+ {
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNone );
+ SetActive();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingCall::NumberQueryL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingCall::NumberQueryL()
+ {
+ HBufC* buf = HBufC::NewLC( KMaxNumberLength );
+ TPtr numberPtr( buf->Des() );
+ CPsu2NumberQueryDlg* dlg = CPsu2NumberQueryDlg::NewL(
+ ContactTextDataL( *iStoreContact,
+ R_PHONEBOOK2_PHONENUMBER_SELECTOR ),
+ numberPtr );
+
+ if ( dlg->ExecuteLD() )
+ {
+ // Create temporary contact for phone call
+ MVPbkContactStore& store = iStoreContact->ParentStore();
+ delete iTempContact;
+ iTempContact = NULL;
+ iTempContact = store.CreateNewContactLC();
+ CleanupStack::Pop(); // iTempContact
+
+ const MVPbkFieldTypeList& fieldTypeList =
+ store.StoreProperties().SupportedFields();
+
+ // Copy contact name
+ const MVPbkFieldType* fieldType = ContactDataTypeL( fieldTypeList,
+ R_PHONEBOOK2_LAST_NAME_SELECTOR );
+ if ( fieldType )
+ {
+ MVPbkStoreContactField* tempNameField = iTempContact->CreateFieldLC(
+ *fieldType );
+ TPtrC namePtr( ContactTextDataL
+ ( *iStoreContact, R_PHONEBOOK2_LAST_NAME_SELECTOR ) );
+ MVPbkContactFieldTextData::Cast
+ ( tempNameField->FieldData() ).SetTextL(namePtr );
+ iTempContact->AddFieldL( tempNameField ); // takes ownership
+ CleanupStack::Pop(); // tempNameField
+ }
+
+ // Copy phone number
+ fieldType = NULL;
+ fieldType = ContactDataTypeL
+ ( fieldTypeList, R_PHONEBOOK2_PHONENUMBER_SELECTOR );
+ MVPbkStoreContactField* tempNumberField = NULL;
+ TInt tempNumberFieldIndex = KErrNotFound;
+ if ( fieldType )
+ {
+ tempNumberField =
+ iTempContact->CreateFieldLC( *fieldType );
+ MVPbkContactFieldTextData::Cast
+ ( tempNumberField->FieldData() ).SetTextL( numberPtr );
+ tempNumberFieldIndex =
+ iTempContact->AddFieldL(tempNumberField); // takes ownership
+ CleanupStack::Pop(); // tempNumberField
+ tempNumberField = NULL;
+ tempNumberField = &iTempContact->Fields().FieldAt
+ ( tempNumberFieldIndex );
+ }
+
+ iUiControlSubstitute->SetFocusedStoreContact( *iTempContact );
+ iUiControlSubstitute->SetFocusedField( *tempNumberField );
+ iUiControlSubstitute->SetFocusedFieldIndex( tempNumberFieldIndex );
+
+ iCommandHandler.HandleCommandL
+ ( iCommand, *iUiControlSubstitute, &iAppViewBase );
+ }
+
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+// End of File