phonebookui/Phonebook2/CommandsExtension/src/CPbk2CreateNewContactCmd.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2CreateNewContactCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,740 @@
+/*
+* 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 create new contact command object.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2CreateNewContactCmd.h"
+
+// Phonebook 2
+#include <TPbk2ContactEditorParams.h>
+#include <CPbk2ContactEditorDlg.h>
+#include <MPbk2CommandObserver.h>
+#include <CPbk2StoreConfiguration.h>
+#include <CPbk2FieldPropertyArray.h>
+#include <MPbk2FieldProperty.h>
+#include <Pbk2UIControls.rsg>
+#include <Pbk2CommonUi.rsg>
+#include <Pbk2CmdExtRes.rsg>
+#include <MPbk2ContactUiControl.h>
+#include <CPbk2StoreProperty.h>
+#include <CPbk2StorePropertyArray.h>
+#include <CPbk2DriveSpaceCheck.h>
+#include <CPbk2AppUiBase.h>
+#include <MPbk2StoreValidityInformer.h>
+#include <CPbk2ApplicationServices.h>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkStoreContact.h>
+#include <CVPbkFieldTypeSelector.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFieldData.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStoreInfo.h>
+#include <MVPbkContactStoreProperties.h>
+#include <VPbkUtils.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <VPbkContactStoreUris.h>
+
+// System includes
+#include <barsread.h>
+#include <coemain.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+
+enum TPanicCode
+    {
+    EExecuteLD_PreCond = 1,
+    EAddFindTextL_Logic,
+    EPanicPreCond_Null_Pointer,
+    EPanicIncorrectState,
+    EPanicPreCond_OpenContactStoreL,
+    EPanicPreCond_ValidateStoreL,
+    EPanicPreCond_CreateNewContactL
+    };
+
+void Panic(TInt aReason)
+    {
+    _LIT(KPanicText, "CPbk2CreateNewContactCmd");
+    User::Panic(KPanicText, aReason);
+    }
+#endif // _DEBUG
+
+/**
+ * Checks is the given field type included in
+ * the given selection.
+ *
+ * @param aFieldType    The field type to check.
+ * @param aManager      Virtual Phonebook contact manager.
+ * @param aResourceId   Selector's resource id.
+ * @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;
+    }
+
+/**
+ * Displays a note.
+ *
+ * @param aResourceId   Note resource id.
+ * @param aString       Note parameter.
+ */
+void ShowNoteL( TInt aResourceId, const TDesC& aString )
+    {
+    HBufC* prompt = NULL;
+
+    if( aString.Length() )
+        {
+        prompt = StringLoader::LoadLC( aResourceId, aString );
+        }
+    else
+        {
+        prompt = StringLoader::LoadLC( aResourceId );
+        }
+    CAknInformationNote* dlg = new(ELeave) CAknInformationNote(ETrue);
+    dlg->ExecuteLD(*prompt);
+    CleanupStack::PopAndDestroy(); // prompt
+    }
+
+/**
+ * Checks is the given contact store full.
+ *
+ * @param aTargetStore      Store to inspect.
+ * @return  ETrue if store is full.
+ */
+TBool StoreFullL( const MVPbkContactStore& aTargetStore )
+    {
+    TBool ret( EFalse );
+    const MVPbkContactStoreInfo& storeInfo = aTargetStore.StoreInfo();
+    if ( storeInfo.MaxNumberOfContactsL() != KVPbkStoreInfoUnlimitedNumber &&
+         storeInfo.MaxNumberOfContactsL() <= storeInfo.NumberOfContactsL() )
+        {
+        ret = ETrue;
+        }
+    return ret;
+    }
+
+/**
+ * Displays store not available note.
+ *
+ * @param aStoreProperties      Phonebook store properties.
+ */
+void ShowStoreNotAvailableNoteL( CPbk2StorePropertyArray& aStoreProperties )
+    {
+    CPbk2StoreConfiguration* storeConfig = CPbk2StoreConfiguration::NewL();
+    CleanupStack::PushL( storeConfig );
+    const TDesC& uri = storeConfig->DefaultSavingStoreL().UriDes();
+
+    // Get the property of the default saving store
+    const CPbk2StoreProperty* prop =
+        aStoreProperties.FindProperty( uri );
+    if ( prop && prop->StoreName().Length() > 0 )
+        {
+        HBufC* text = StringLoader::LoadLC( R_QTN_PHOB_STORE_NOT_AVAILABLE,
+            prop->StoreName() );
+        CAknInformationNote* note = new(ELeave) CAknInformationNote( ETrue );
+        // Show "not available" note
+        note->ExecuteLD( *text );
+        CleanupStack::PopAndDestroy( text );
+        }
+
+    CleanupStack::PopAndDestroy( storeConfig );
+    }
+
+/**
+ * Checks is the store valid.
+ *
+ * @param aInformer         Store validity informer.
+ * @param aStore            Store to inspect.
+ * @return  ETrue if store is valid.
+ */
+TBool IsValidStoreL
+        ( MPbk2StoreValidityInformer& aInformer, MVPbkContactStore* aStore )
+    {
+    TBool isValid ( EFalse );
+    if ( aStore )
+        {
+        CVPbkContactStoreUriArray* currentlyValidStores =
+            aInformer.CurrentlyValidStoresL();
+        TVPbkContactStoreUriPtr uri =
+            aStore->StoreProperties().Uri();
+        isValid = currentlyValidStores->IsIncluded( uri );
+        delete currentlyValidStores;
+        }
+
+    return isValid;
+    }
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::CPbk2CreateNewContactCmd
+// --------------------------------------------------------------------------
+//
+CPbk2CreateNewContactCmd::CPbk2CreateNewContactCmd(
+        MPbk2ContactUiControl& aUiControl ) : 
+    CActive( EPriorityIdle ),
+    iUiControl( &aUiControl )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::~CPbk2CreateNewContactCmd
+// --------------------------------------------------------------------------
+//
+CPbk2CreateNewContactCmd::~CPbk2CreateNewContactCmd()
+    {
+    Cancel();
+    if( iUiControl )
+        {
+        iUiControl->RegisterCommand( NULL );
+        }
+    if ( iTargetStore )
+        {
+        iTargetStore->Close( *this );
+        }
+    Release( iAppServices );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2CreateNewContactCmd* CPbk2CreateNewContactCmd::NewL
+        ( MPbk2ContactUiControl& aUiControl )
+    {
+    CPbk2CreateNewContactCmd* self =
+        new(ELeave) CPbk2CreateNewContactCmd(aUiControl);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2CreateNewContactCmd::ConstructL()
+    {
+    // check drive space
+    CPbk2DriveSpaceCheck* driveSpaceCheck = CPbk2DriveSpaceCheck::NewL
+        ( CCoeEnv::Static()->FsSession() );
+    CleanupStack::PushL( driveSpaceCheck );
+    // check FFS situation
+    driveSpaceCheck->DriveSpaceCheckL();
+    CleanupStack::PopAndDestroy( driveSpaceCheck );
+
+    iAppServices = CPbk2ApplicationServices::InstanceL();
+
+    CPbk2StoreConfiguration* storeConfig = CPbk2StoreConfiguration::NewL();
+    CleanupStack::PushL(storeConfig);
+    iTargetStore = iAppServices->ContactManager().ContactStoresL().Find
+        ( storeConfig->DefaultSavingStoreL() );
+    CleanupStack::PopAndDestroy(storeConfig);
+    if( iUiControl )
+        {
+        iUiControl->RegisterCommand( this );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::RunL
+// --------------------------------------------------------------------------
+//    
+void CPbk2CreateNewContactCmd::RunL()
+    {
+    switch( iState )
+        {        
+        case ELoadContactStore:
+            {
+            LoadContactStoreL();
+            break;
+            }
+        case EOpenContactStore:
+            {
+            OpenContactStoreL();
+            break;
+            }        
+        case EValidateStore:
+            {
+            ValidateStoreL();
+            break;
+            }                  
+        case ECreateNewContact:
+            {
+            CreateNewContactL();
+            break;
+            }
+        case EFinishCommand:
+            {
+            iCommandObserver->CommandFinished(*this);
+            break;
+            }
+        default:
+            {
+            __ASSERT_DEBUG( EFalse, Panic( EPanicIncorrectState ) );
+            }
+        };
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::DoCancel()
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::RunError
+// --------------------------------------------------------------------------
+//
+TInt CPbk2CreateNewContactCmd::RunError( TInt aError )
+    {	
+    HandleError( aError );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::HandleError
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::HandleError( TInt aError )
+    {	
+    CCoeEnv::Static()->HandleError( aError );
+    iState = EFinishCommand;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ExecuteLD
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::ExecuteLD()
+    {
+    __ASSERT_DEBUG( iCommandObserver, Panic( EExecuteLD_PreCond ) );
+
+    CleanupStack::PushL(this);
+
+    if ( !iTargetStore || !IsValidStoreL
+            ( iAppServices->StoreValidityInformer(), iTargetStore ) )
+        {
+        // if target store not available finish command
+        ShowStoreNotAvailableNoteL( iAppServices->StoreProperties() );
+        
+        iTargetStore = NULL;
+        if ( ShowCreateNewToPhoneQueryL() )
+            {
+            iTargetStore = iAppServices->ContactManager().ContactStoresL().
+                    Find( VPbkContactStoreUris::DefaultCntDbUri() );
+                    
+            if ( iTargetStore )
+                {
+                if ( !IsValidStoreL( 
+                     iAppServices->StoreValidityInformer(), iTargetStore ) )
+                    {
+                    // Store is loaded, but not opened                   
+                    iState = EOpenContactStore;
+                    }
+                else
+                    {
+                    // Store is loaded and opened                    
+                    iState = EValidateStore;
+                    }
+                }
+            else
+                {
+                // Store is neither loaded nor opened
+                iState = ELoadContactStore;
+                }                    
+            }
+        else
+            {
+            // Canceled
+            iState = EFinishCommand;
+            }
+        }
+    else
+        {
+        iState = EValidateStore;
+        }
+
+    IssueRequest();
+    CleanupStack::Pop(this);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::AddObserver
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::AddObserver( MPbk2CommandObserver& aObserver )
+    {
+    iCommandObserver = &aObserver;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ContactEditingComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::ResetUiControl(
+        MPbk2ContactUiControl& aUiControl)
+    {
+    if (iUiControl == &aUiControl)
+        {
+        iUiControl = NULL;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ContactEditingComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::ContactEditingComplete
+        ( MVPbkStoreContact* aEditedContact )
+    {
+    TRAPD( error, HandleContactEditingCompleteL( aEditedContact ) );
+    if ( error != KErrNone )
+        {
+        CCoeEnv::Static()->HandleError( error );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ContactEditingDeletedContact
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::ContactEditingDeletedContact
+        ( MVPbkStoreContact* aEditedContact )
+    {
+    delete aEditedContact; // not needed anymore
+    if (iUiControl)
+        {
+        // reset find if control exists
+        TRAP_IGNORE( iUiControl->ResetFindL() );
+        }
+    iState = EFinishCommand;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ContactEditingAborted
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::ContactEditingAborted()
+    {
+    if (iUiControl)
+        {
+        // reset find if control exists
+        TRAP_IGNORE( iUiControl->ResetFindL() );
+        }
+    iState = EFinishCommand;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::StoreReady
+// --------------------------------------------------------------------------
+//    
+void CPbk2CreateNewContactCmd::StoreReady( 
+        MVPbkContactStore& aContactStore )
+    {
+    iTargetStore = &aContactStore;
+    iState = EValidateStore;
+    IssueRequest();
+    }
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::StoreUnavailable
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::StoreUnavailable( 
+        MVPbkContactStore& /*aContactStore*/, 
+        TInt /*aReason*/ )
+    {
+    iState = EFinishCommand;
+    IssueRequest();
+    }
+        
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::HandleStoreEventL
+// --------------------------------------------------------------------------
+//        
+void CPbk2CreateNewContactCmd::HandleStoreEventL(
+        MVPbkContactStore& /*aContactStore*/, 
+        TVPbkContactStoreEvent /*aStoreEvent*/ )
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::AddFindTextL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2CreateNewContactCmd::AddFindTextL( MVPbkStoreContact& aContact )
+    {
+    TInt index = KErrNotFound;
+    if (iUiControl)
+        {
+        const TDesC& findText = iUiControl->FindTextL();
+        if (findText != KNullDesC)
+            {
+            CPbk2FieldPropertyArray& fieldProperties =
+                iAppServices->FieldProperties();
+
+            const TInt count( fieldProperties.Count() );
+            for (TInt i=0; i < count ; ++i)
+                {
+                const MPbk2FieldProperty& prop = fieldProperties.At(i);
+
+                if ( IsFieldTypeIncludedL( prop.FieldType(),
+                        iAppServices->ContactManager(),
+                                R_PHONEBOOK2_LAST_NAME_SELECTOR ) )
+                    {
+                    MVPbkStoreContactField* field = aContact.CreateFieldLC
+                        ( prop.FieldType() );
+
+                    __ASSERT_DEBUG(field->FieldData().DataType() ==
+                        EVPbkFieldStorageTypeText, Panic(EAddFindTextL_Logic));
+
+                    MVPbkContactFieldTextData* fieldData =
+                        &MVPbkContactFieldTextData::Cast(field->FieldData());
+                    fieldData->SetTextL(findText);
+
+                    index = aContact.AddFieldL(field);
+                    CleanupStack::Pop(); // field
+                    break;
+                    }
+                }
+            }
+        }
+    return index;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ShowStoreFullNoteL
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::ShowStoreFullNoteL(
+        const MVPbkContactStore& aTargetStore )
+    {
+    // Fetch store name
+    TVPbkContactStoreUriPtr uri =
+            aTargetStore.StoreProperties().Uri();
+    const CPbk2StoreProperty* storeProperty =
+            iAppServices->StoreProperties().FindProperty(uri);
+
+    const TDesC* storeName = NULL;
+    if (storeProperty)
+        {
+        storeName = &storeProperty->StoreName();
+        }
+    else
+        {
+        storeName = &uri.UriDes();
+        }
+    ShowNoteL( R_QTN_PHOB_NOTE_STORE_FULL, *storeName );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::HandleContactEditingCompleteL
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::HandleContactEditingCompleteL(
+        MVPbkStoreContact* aEditedContact )
+    {
+    __ASSERT_DEBUG( iCommandObserver, Panic(EPanicPreCond_Null_Pointer));
+    
+    CleanupDeletePushL( aEditedContact );
+
+    // Reset Find before setting the focus because if new contact is created
+    // through find box, ResetFindL corrupts the focus.
+    if ( iUiControl )
+        {
+        iUiControl->ResetFindL();
+        if ( aEditedContact )
+            {
+            // Focus the created contact if the contact is shown in the list
+            CVPbkContactStoreUriArray* shownStores =
+                iAppServices->
+                    StoreValidityInformer().CurrentlyValidShownStoresL();
+            TVPbkContactStoreUriPtr uri =
+                aEditedContact->ParentStore().StoreProperties().Uri();
+            TBool valid = shownStores->IsIncluded( uri );
+            delete shownStores;
+
+            if ( valid )
+                {
+                iUiControl->SetFocusedContactL( *aEditedContact );
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy(); // aEditedContact
+    iState = EFinishCommand;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ShowCreateNewToPhoneQueryL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2CreateNewContactCmd::ShowCreateNewToPhoneQueryL() const
+    {
+    TInt ret = 0;
+
+    // Do not ask the question if phone memory itself is unavailable
+    if ( iAppServices->
+            StoreConfiguration().DefaultSavingStoreL().Compare
+            ( VPbkContactStoreUris::DefaultCntDbUri(),
+                TVPbkContactStoreUriPtr::EContactStoreUriAllComponents ) != 0 )
+        {
+        HBufC* prompt = 
+            StringLoader::LoadLC( R_QTN_PHOB_QUERY_CREATE_NEW_TO_STORE );
+
+        CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+        ret = dlg->ExecuteLD( R_PBK2_GENERAL_CONFIRMATION_QUERY, *prompt );
+        CleanupStack::PopAndDestroy( prompt );
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::LoadContactStoreL
+// --------------------------------------------------------------------------
+//    
+void CPbk2CreateNewContactCmd::LoadContactStoreL()
+    {
+    CVPbkContactManager& manager = iAppServices->ContactManager();
+    
+    manager.LoadContactStoreL( VPbkContactStoreUris::DefaultCntDbUri() );            
+    iTargetStore = manager.ContactStoresL().
+                    Find( VPbkContactStoreUris::DefaultCntDbUri() );
+    
+    if ( iTargetStore )
+        {
+        if ( IsValidStoreL( 
+                iAppServices->StoreValidityInformer(), iTargetStore ) )
+            {
+            iState = EValidateStore;
+            }
+        else
+            {
+            iState = EOpenContactStore;
+            }        
+        }
+    else
+        {
+        iState = EFinishCommand;        
+        }
+    IssueRequest();        
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::OpenContactStoreL
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::OpenContactStoreL() 
+    {
+    __ASSERT_DEBUG( iTargetStore, 
+        Panic( EPanicPreCond_OpenContactStoreL ) );
+                                   
+    iTargetStore->OpenL( *this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::ValidateStoreL
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::ValidateStoreL()
+    {
+    __ASSERT_DEBUG( iTargetStore, 
+        Panic( EPanicPreCond_ValidateStoreL ) );
+    
+    if ( StoreFullL( *iTargetStore ) )
+        {
+        ShowStoreFullNoteL( *iTargetStore );
+        iState = EFinishCommand;
+        }
+    else
+        {
+        iState = ECreateNewContact; 
+        }
+        
+    IssueRequest();
+    }
+    
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::CreateNewContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::CreateNewContactL()
+    {
+    __ASSERT_DEBUG( iTargetStore, 
+        Panic( EPanicPreCond_CreateNewContactL ) );
+        
+    MVPbkStoreContact* contact = iTargetStore->CreateNewContactLC();
+
+    // verify syncronization field existance and content
+    VPbkUtils::VerifySyncronizationFieldL
+        ( CCoeEnv::Static()->FsSession(),
+          iTargetStore->StoreProperties().SupportedFields(), *contact );
+
+    TUint32 flags = TPbk2ContactEditorParams::ENewContact;
+    TPbk2ContactEditorParams params( flags );
+
+    CPbk2ContactEditorDlg* dlg =
+        CPbk2ContactEditorDlg::NewL(params, contact, *this);
+    CleanupStack::Pop(); // contact, whose ownership was taken away
+    dlg->ExecuteLD();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CreateNewContactCmd::IssueRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2CreateNewContactCmd::IssueRequest()
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();
+    }
+    
+// End of File