htiui/HtiServicePlugins/HtiPIMServicePlugin/src/HtiSimDirHandlerVPbk.cpp
branchRCL_3
changeset 11 454d022d514b
parent 9 404ad6c9bc20
child 12 aefcba28a3e0
child 13 822c625f7adc
--- a/htiui/HtiServicePlugins/HtiPIMServicePlugin/src/HtiSimDirHandlerVPbk.cpp	Tue Apr 27 16:38:40 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1002 +0,0 @@
-/*
-* Copyright (c) 2009 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:  Implementation of SIM card contacts handling using the new
-*                Virtual Phonebook API
-*
-*/
-
-
-// INCLUDE FILES
-#include "HtiSimDirHandlerVPbk.h"
-#include "HtiPIMServicePlugin.h"
-
-#include <CVPbkContactManager.h>
-#include <CVPbkContactLinkArray.h>
-#include <CVPbkContactStoreUriArray.h>
-#include <CVPbkContactViewDefinition.h>
-#include <CVPbkSortOrder.h>
-#include <MVPbkContactFieldTextData.h>
-#include <MVPbkContactLink.h>
-#include <MVPbkContactOperationBase.h>
-#include <MVPbkContactStore.h>
-#include <MVPbkContactStoreInfo.h>
-#include <MVPbkContactStoreList.h>
-#include <MVPbkContactStoreProperties.h>
-#include <MVPbkContactView.h>
-#include <MVPbkContactViewBase.h>
-#include <MVPbkFieldType.h>
-#include <MVPbkStoreContact.h>
-#include <MVPbkStoreContactField.h>
-#include <MVPbkContactStoreObserver.h>
-#include <TVPbkContactStoreUriPtr.h>
-#include <TVPbkFieldVersitProperty.h>
-#include <VPbkContactStoreUris.h>
-#include <VPbkContactView.hrh>
-#include <VPbkFieldType.hrh>
-#include <VPbkEng.rsg>
-
-#include <HtiDispatcherInterface.h>
-#include <HTILogging.h>
-
-// EXTERNAL DATA STRUCTURES
-
-// EXTERNAL FUNCTION PROTOTYPES
-
-// CONSTANTS
-const TInt KSimInfoResponseLength = 12;
-
-// MACROS
-
-// LOCAL CONSTANTS AND MACROS
-_LIT8( KErrorUnrecognizedCommand, "Unrecognized command" );
-_LIT8( KErrorInvalidParameters, "Invalid command parameters" );
-_LIT8( KErrorImportFailed, "Contact import failed" );
-_LIT8( KErrorDeleteFailed, "Failed to delete contact" );
-_LIT8( KErrorSimCardInfoFailed, "Failed to get SIM card info" );
-_LIT8( KErrorSimStoreOpenFailed, "Failed to open SIM contact store" );
-_LIT8( KErrorSimStoreUnavailable, "SIM contact store unavailable" );
-
-// MODULE DATA STRUCTURES
-
-// LOCAL FUNCTION PROTOTYPES
-
-// FORWARD DECLARATIONS
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-CHtiSimDirHandlerVPbk* CHtiSimDirHandlerVPbk::NewL()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::NewL" );
-    CHtiSimDirHandlerVPbk* self = new (ELeave) CHtiSimDirHandlerVPbk();
-    CleanupStack::PushL ( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::NewL" );
-    return self;
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::CHtiSimDirHandlerVPbk
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// ----------------------------------------------------------------------------
-CHtiSimDirHandlerVPbk::CHtiSimDirHandlerVPbk():iIsBusy( EFalse ),
-                                               iIsStoreOpen( EFalse )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::CHtiSimDirHandlerVPbk" );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::CHtiSimDirHandlerVPbk" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::~CHtiSimDirHandlerVPbk
-// Destructor.
-// -----------------------------------------------------------------------------
-CHtiSimDirHandlerVPbk::~CHtiSimDirHandlerVPbk()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::~CHtiSimDirHandlerVPbk" );
-
-    if ( iContactView )
-        {
-        HTI_LOG_TEXT( "Deleting iContactView" );
-        iContactView->RemoveObserver( *this );
-        delete iContactView;
-        }
-    if ( iSimStore )
-        {
-        HTI_LOG_TEXT( "Closing iSimStore" );
-        iSimStore->Close( *this );
-        }
-    if ( iContactManager )
-        {
-        HTI_LOG_TEXT( "Deleting iContactManager" );
-        delete iContactManager;
-        }
-    if ( iMessage )
-        {
-        HTI_LOG_TEXT( "Deleting iMessage" );
-        delete iMessage;
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::~CHtiSimDirHandlerVPbk" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ConstructL()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ConstructL" );
-
-    CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC();
-    uriArray->AppendL( TVPbkContactStoreUriPtr(
-        VPbkContactStoreUris::SimGlobalAdnUri() ) );
-
-    iContactManager = CVPbkContactManager::NewL( *uriArray );
-    CleanupStack::PopAndDestroy( uriArray );
-
-    MVPbkContactStoreList& storeList = iContactManager->ContactStoresL();
-    iSimStore = storeList.Find( TVPbkContactStoreUriPtr(
-        VPbkContactStoreUris::SimGlobalAdnUri() ) );
-
-    if ( !iSimStore )
-        {
-        HTI_LOG_TEXT( "SIM ADN store not found - leaving" );
-        User::Leave( KErrNotFound );
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ConstructL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::SetDispatcher
-// Sets the dispatcher pointer.
-// -----------------------------------------------------------------------------
-
-void CHtiSimDirHandlerVPbk::SetDispatcher( MHtiDispatcher* aDispatcher )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::SetDispatcher" );
-    iDispatcher = aDispatcher;
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::SetDispatcher" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ProcessMessageL
-// Parses the received message and calls handler functions.
-// -----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ProcessMessageL( const TDesC8& aMessage,
-    THtiMessagePriority /*aPriority*/ )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ProcessMessageL" );
-
-    if ( iIsBusy )
-        {
-        HTI_LOG_TEXT( "HtiSimDirHandlerVPbk is busy - leaving" );
-        User::Leave( KErrInUse );
-        }
-
-    // Will be set to EFalse in the SendOkMsgL or SendErrorMessageL methods.
-    iIsBusy = ETrue;
-
-    delete iMessage;
-    iMessage = NULL;
-
-    // Zero legth of aMessage tested already in CHtiPIMServicePlugin.
-    // Other sanity checks must be done here.
-
-    // Trap the AllocL to be able to set iIsBusy false before leaving.
-    TRAPD( err, iMessage = aMessage.Right( aMessage.Length() - 1 ).AllocL() );
-    if ( err != KErrNone )
-        {
-        iIsBusy = EFalse;
-        User::Leave( err );
-        }
-
-    iCommand = aMessage.Ptr()[0];
-
-    // Do basic validity checking for message
-    TBool isParamsOk = ETrue;
-    switch ( iCommand )
-        {
-        case CHtiPIMServicePlugin::ESimCardInfo:
-            {
-            if ( iMessage->Length() != 0 )
-                {
-                isParamsOk = EFalse;
-                }
-            break;
-            }
-        case CHtiPIMServicePlugin::EImportSimContact:
-            {
-            if ( !CheckImportMsg() )
-                {
-                isParamsOk = EFalse;
-                }
-            break;
-            }
-        case CHtiPIMServicePlugin::EDeleteSimContact:
-            {
-            if ( iMessage->Length() != 4 && iMessage->Length() != 0 )
-                {
-                isParamsOk = EFalse;
-                }
-            break;
-            }
-        default:
-            {
-            SendErrorMessageL( KErrArgument, KErrorUnrecognizedCommand );
-            return;
-            }
-        }
-
-    if ( !isParamsOk )
-        {
-        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
-        }
-
-    else
-        {
-        if ( iIsStoreOpen )
-            {
-            StoreReady( *iSimStore );
-            }
-        else
-            {
-            // Start async open operation.
-            // StoreReady callback will be called when opening is complete.
-            TRAPD( err, iSimStore->OpenL( *this ) );
-            if ( err != KErrNone )
-                {
-                HTI_LOG_FORMAT(
-                        "Leave from CHtiSimDirHandler::OpenL() %d", err );
-                SendErrorMessageL( err, KErrorSimStoreOpenFailed );
-                }
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ProcessMessageL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::IsBusy
-// -----------------------------------------------------------------------------
-//
-TBool CHtiSimDirHandlerVPbk::IsBusy()
-    {
-    return iIsBusy;
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::OpenComplete
-// Called when the opening process is complete.
-// From MVPbkContactStoreListObserver
-// ----------------------------------------------------------------------------
-/*
-void CHtiSimDirHandlerVPbk::OpenComplete()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::OpenComplete" );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::OpenComplete" );
-    }
-*/
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::StoreReady
-// Called when a contact store is ready to use.
-// From MVPbkContactStoreObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::StoreReady( MVPbkContactStore& aContactStore )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::StoreReady" );
-
-    if ( !iIsBusy || iSimStore != &aContactStore )
-        {
-        return;
-        }
-
-    iIsStoreOpen = ETrue;
-
-    if ( iCommand == CHtiPIMServicePlugin::ESimCardInfo )
-        {
-        TRAPD( err, HandleSimCardInfoL() );
-        if ( err != KErrNone )
-            {
-            TRAP_IGNORE( SendErrorMessageL( err, KErrorSimCardInfoFailed ) );
-            }
-        }
-
-    else if ( iCommand == CHtiPIMServicePlugin::EImportSimContact )
-        {
-        TRAPD( err, HandleSimContactImportL() );
-        if ( err != KErrNone )
-            {
-            TRAP_IGNORE( SendErrorMessageL( err, KErrorImportFailed ) );
-            }
-        }
-
-    else if ( iCommand == CHtiPIMServicePlugin::EDeleteSimContact )
-        {
-        TRAPD( err, HandleSimContactDeleteL() );
-        if ( err != KErrNone )
-            {
-            TRAP_IGNORE( SendErrorMessageL( err, KErrorDeleteFailed ) );
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::StoreReady" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::StoreUnavailable
-// Called when a contact store becomes unavailable.
-// From MVPbkContactStoreObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::StoreUnavailable( MVPbkContactStore& aContactStore,
-                                              TInt aReason )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::StoreUnavailable" );
-
-    if ( iIsBusy && iSimStore == &aContactStore )
-        {
-        TRAP_IGNORE( SendErrorMessageL( aReason, KErrorSimStoreUnavailable ) );
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::StoreUnavailable" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::HandleStoreEventL
-// Called when changes occur in the contact store.
-// From MVPbkContactStoreObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::HandleStoreEventL( MVPbkContactStore& aContactStore,
-                        TVPbkContactStoreEvent aStoreEvent )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::HandleStoreEventL" );
-
-    if ( iIsBusy && iSimStore == &aContactStore &&
-         aStoreEvent.iEventType == TVPbkContactStoreEvent::EContactAdded )
-        {
-        HTI_LOG_TEXT( "Contact added" );
-        TInt entryId = 0;
-        TBuf8<4> idBuf;
-        idBuf.Append( ( TUint8* ) &entryId, 4 );
-        TRAP_IGNORE( SendOkMsgL( idBuf ) );
-        }
-
-    else if ( iIsBusy && iSimStore == &aContactStore &&
-              aStoreEvent.iEventType == TVPbkContactStoreEvent::EContactDeleted )
-        {
-        HTI_LOG_TEXT( "Contact deleted" );
-        if ( iMessage->Length() > 0 )  // This is a single deletion
-            {
-            TRAP_IGNORE( SendOkMsgL( KNullDesC8 ) );
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::HandleStoreEventL" );
-    }
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ContactOperationCompleted
-// Called when a contact operation has succesfully completed.
-// From MVPbkContactObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ContactOperationCompleted( TContactOpResult /*aResult*/ )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ContactOperationCompleted" );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ContactOperationCompleted" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ContactOperationFailed
-// Called when a contact operation has failed.
-// From MVPbkContactObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ContactOperationFailed( TContactOp /*aOpCode*/,
-                                                    TInt /*aErrorCode*/,
-                                                    TBool /*aErrorNotified*/ )
-    {
-
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ContactOperationFailed" );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ContactOperationFailed" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ContactViewReady
-// Called when a view is ready for use.
-// From MVPbkContactViewObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ContactViewReady( MVPbkContactViewBase& aView )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ContactViewReady" );
-
-    if ( iContactView == &aView && iIsBusy &&
-            iCommand == CHtiPIMServicePlugin::EDeleteSimContact )
-        {
-        TRAPD( err, DeleteContactsInViewL() );
-        if ( err != KErrNone )
-            {
-            TRAP_IGNORE( SendErrorMessageL( err, KErrorDeleteFailed ) );
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ContactViewReady" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ContactViewUnavailable
-// Called when a view is unavailable for a while.
-// From MVPbkContactViewObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ContactViewUnavailable( MVPbkContactViewBase& /*aView*/ )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ContactViewUnavailable" );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ContactViewUnavailable" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ContactAddedToView
-// Called when a contact has been added to the view.
-// From MVPbkContactViewObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ContactAddedToView( MVPbkContactViewBase& /*aView*/,
-        TInt /*aIndex*/, const MVPbkContactLink& /*aContactLink*/ )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ContactAddedToView" );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ContactAddedToView" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ContactRemovedFromView
-// Called when a contact has been removed from a view.
-// From MVPbkContactViewObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ContactRemovedFromView( MVPbkContactViewBase& /*aView*/,
-        TInt /*aIndex*/, const MVPbkContactLink& /*aContactLink*/ )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ContactRemovedFromView" );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ContactRemovedFromView" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::ContactViewError
-// Called when an error occurs in the view.
-// From MVPbkContactViewObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::ContactViewError( MVPbkContactViewBase& aView,
-                                              TInt aError,
-                                              TBool aErrorNotified )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::ContactViewError" );
-    HTI_LOG_FORMAT( "CHtiSimDirHandlerVPbk::ContactViewError: %d", aError );
-    HTI_LOG_FORMAT( "ErrorNotified = %d", aErrorNotified );
-    if ( iContactView == &aView )
-        {
-        iContactView->RemoveObserver( *this );
-        if ( iIsBusy && iCommand == CHtiPIMServicePlugin::EDeleteSimContact )
-            {
-            SendErrorMessageL( aError, KErrorDeleteFailed );
-            }
-        }
-    aErrorNotified = aErrorNotified;  // avoid compiler warning
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::ContactViewError" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::StepComplete
-// Called when one step of the batch operation is complete.
-// From MVPbkBatchOperationObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::StepComplete( MVPbkContactOperationBase& /*aOperation*/,
-                           TInt aStepSize )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::StepComplete" );
-    HTI_LOG_FORMAT( "Step size = %d", aStepSize );
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::StepComplete" );
-    aStepSize = aStepSize; // avoid compiler warning
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::StepFailed
-// Called when one step of the batch operation fails.
-// From MVPbkBatchOperationObserver
-// ----------------------------------------------------------------------------
-TBool CHtiSimDirHandlerVPbk::StepFailed( MVPbkContactOperationBase& aOperation,
-                                         TInt aStepSize, TInt aError )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::StepFailed" );
-    HTI_LOG_FORMAT( "Error %d", aError );
-    if ( iCurrentOperation == &aOperation )
-        {
-        // We are returning EFalse (= do not continue) we can delete
-        // the operation. OperationComplete() won't be called.
-        delete iCurrentOperation;
-        iCurrentOperation = NULL;
-        TRAP_IGNORE( SendErrorMessageL( aError, KErrorDeleteFailed ) );
-        }
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::StepFailed" );
-    aStepSize = aStepSize; // avoid compiler warning
-    return EFalse; // do not continue
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::OperationComplete
-// Called when operation is completed.
-// From MVPbkBatchOperationObserver
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::OperationComplete(
-            MVPbkContactOperationBase& aOperation )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::OperationComplete" );
-    // Operation is complete -> delete it
-    if ( iCurrentOperation == &aOperation )
-        {
-        delete iCurrentOperation;
-        iCurrentOperation = NULL;
-        if ( iIsBusy && iCommand == CHtiPIMServicePlugin::EDeleteSimContact )
-            {
-            // Delete operation has completed
-            TRAP_IGNORE( SendOkMsgL( KNullDesC8 ) );
-            }
-        }
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::OperationComplete" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::HandleSimCardInfoL
-// Gets information about the SIM card.
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::HandleSimCardInfoL()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::HandleSimCardInfoL" );
-
-    // Get entry counts
-    const MVPbkContactStoreInfo& info = iSimStore->StoreInfo();
-    TInt maxEntries = info.MaxNumberOfContactsL();
-    TInt currentEntries = info.NumberOfContactsL();
-    HTI_LOG_FORMAT( "Current entries = %d", currentEntries );
-    HTI_LOG_FORMAT( "Max entries = %d", maxEntries );
-
-    // Create new entry object to get field informations
-    MVPbkStoreContact* entry = iSimStore->CreateNewContactLC();
-    TVPbkFieldVersitProperty prop;
-    TVPbkFieldTypeParameters param;
-
-    // Resolve field types
-    prop.SetName( EVPbkVersitNameN );
-    const MVPbkFieldType* nameFieldType =
-        iContactManager->FieldTypes().FindMatch( prop, 0 );
-
-    const MVPbkFieldType* secNameFieldType =
-        iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_SECONDNAME );
-
-    param.Reset();
-    param.Add( EVPbkVersitParamCELL );
-    prop.SetName( EVPbkVersitNameTEL );
-    prop.SetParameters( param );
-    const MVPbkFieldType* numberFieldType =
-        iContactManager->FieldTypes().FindMatch( prop, 0 );
-
-    param.Reset();
-    param.Add( EVPbkVersitParamINTERNET );
-    prop.SetName( EVPbkVersitNameEMAIL );
-    prop.SetParameters( param );
-    const MVPbkFieldType* mailFieldType =
-        iContactManager->FieldTypes().FindMatch( prop, 0 );
-
-    // Get max field counts
-    TInt maxNumbers = entry->MaxNumberOfFieldL( *numberFieldType );
-    TInt maxSecondNames = entry->MaxNumberOfFieldL( *secNameFieldType );
-    TInt maxEmails = entry->MaxNumberOfFieldL( *mailFieldType );
-
-    HTI_LOG_FORMAT( "Max numbers = %d", maxNumbers );
-    HTI_LOG_FORMAT( "Max second names = %d", maxSecondNames );
-    HTI_LOG_FORMAT( "Max emails = %d", maxEmails );
-
-    // Create field objects to get field data max lengths and verify that
-    // fields can be created. It is assumed that all SIM cards support name
-    // and number fields but e-mail and second name fields are TRAP:ed as
-    // creating them would cause a leave if not supported by the SIM card.
-    // It was noticed that with a SIM card not supporting the second name
-    // field the MaxNumberOfFieldL method for that field returns 1 but then
-    // the CreateFieldLC leaves with KErrNotSupported.
-    MVPbkStoreContactField* nameField = entry->CreateFieldLC( *nameFieldType );
-    MVPbkContactFieldTextData& nameFieldData =
-        MVPbkContactFieldTextData::Cast( nameField->FieldData() );
-    TInt maxNameLength = nameFieldData.MaxLength();
-    CleanupStack::PopAndDestroy(); // nameField
-
-    MVPbkStoreContactField* numberField = entry->CreateFieldLC( *numberFieldType );
-    MVPbkContactFieldTextData& numberFieldData =
-        MVPbkContactFieldTextData::Cast( numberField->FieldData() );
-    TInt maxNumberLength = numberFieldData.MaxLength();
-    CleanupStack::PopAndDestroy(); // numberField
-
-    MVPbkStoreContactField* mailField = NULL;
-    TInt maxMailLength = 0;
-    if ( maxEmails > 0 )
-        {
-        TRAPD( err, mailField = entry->CreateFieldLC( *mailFieldType );
-            CleanupStack::Pop(); ); // Popping inside the TRAP
-        if ( err != KErrNone )
-            {
-            maxEmails = 0;
-            }
-        else
-            {
-            MVPbkContactFieldTextData& mailFieldData =
-                MVPbkContactFieldTextData::Cast( mailField->FieldData() );
-            maxMailLength = mailFieldData.MaxLength();
-            delete mailField;
-            mailField = NULL;
-            }
-        }
-
-    MVPbkStoreContactField* secNameField = NULL;
-    TInt maxSecNameLength = 0;
-    if ( maxSecondNames > 0 )
-        {
-        TRAPD( err, secNameField = entry->CreateFieldLC( *secNameFieldType );
-            CleanupStack::Pop(); ); // Popping inside the TRAP
-        if ( err != KErrNone )
-            {
-            maxSecondNames = 0;
-            }
-        else
-            {
-            MVPbkContactFieldTextData& secNameFieldData =
-                MVPbkContactFieldTextData::Cast( secNameField->FieldData() );
-            maxSecNameLength = secNameFieldData.MaxLength();
-            delete secNameField;
-            secNameField = NULL;
-            }
-        }
-
-    HTI_LOG_FORMAT( "Max name length = %d", maxNameLength );
-    HTI_LOG_FORMAT( "Max 2nd name length = %d", maxSecNameLength );
-    HTI_LOG_FORMAT( "Max number length = %d", maxNumberLength );
-    HTI_LOG_FORMAT( "Max mail length = %d", maxMailLength );
-
-    CleanupStack::PopAndDestroy(); // entry
-
-    // Create and send response message
-    TBuf8<KSimInfoResponseLength> reply;
-    reply.Append( maxSecondNames );
-    reply.Append( maxNumbers - 1 ); // max num of additional numbers, so -1
-    reply.Append( maxEmails );
-    reply.Append( maxNameLength );
-    reply.Append( maxNumberLength );
-    reply.Append( maxSecNameLength );
-    reply.Append( maxNumberLength ); // additional number uses same field type
-    reply.Append( maxMailLength );
-    reply.Append( ( TUint8* ) ( &maxEntries ), 2 );
-    reply.Append( ( TUint8* ) ( &currentEntries ), 2 );
-
-    SendOkMsgL( reply );
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::HandleSimCardInfoL" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::HandleSimContactImportL
-// Imports the contact to SIM card.
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::HandleSimContactImportL()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::HandleSimContactImportL" );
-
-    MVPbkStoreContact* newEntry = iSimStore->CreateNewContactLC();
-
-    TInt offset = 0;
-    TInt fieldCount = iMessage->Des()[offset];
-    offset++;
-
-    for ( TInt i = 0; i < fieldCount; i++ )
-        {
-        HTI_LOG_FORMAT( "Processing field %d", i + 1 );
-
-        MVPbkStoreContactField* field = NULL;
-        TVPbkFieldVersitProperty prop;
-        TVPbkFieldTypeParameters param;
-        const MVPbkFieldType* fieldType = NULL;
-        TContactFieldType type = ( TContactFieldType ) iMessage->Des()[offset];
-        offset++;
-        switch ( type )
-            {
-            case ENameField:
-                prop.SetName( EVPbkVersitNameN );
-                fieldType = iContactManager->FieldTypes().FindMatch( prop, 0 );
-                break;
-            case ESecondNameField:
-                fieldType = iContactManager->FieldTypes().Find(
-                    R_VPBK_FIELD_TYPE_SECONDNAME );
-                break;
-            case EPhoneNumberField:
-                param.Add( EVPbkVersitParamCELL );
-                prop.SetName( EVPbkVersitNameTEL );
-                prop.SetParameters( param );
-                fieldType = iContactManager->FieldTypes().FindMatch( prop, 0 );
-                break;
-            case EEMailField:
-                param.Add( EVPbkVersitParamINTERNET );
-                prop.SetName( EVPbkVersitNameEMAIL );
-                prop.SetParameters( param );
-                fieldType = iContactManager->FieldTypes().FindMatch( prop, 0 );
-                break;
-            case EAdditNumberField:
-                param.Add( EVPbkVersitParamCELL );
-                prop.SetName( EVPbkVersitNameTEL );
-                prop.SetParameters( param );
-                fieldType = iContactManager->FieldTypes().FindMatch( prop, 0 );
-                break;
-            default:
-                HTI_LOG_FORMAT( "Unknown field type %d", type );
-                User::Leave( KErrArgument );
-                break;
-            }
-
-        if ( fieldType == NULL )
-            {
-            User::Leave( KErrArgument );
-            }
-
-        HTI_LOG_FORMAT( "Field type res id %d", fieldType->FieldTypeResId() );
-
-        field = newEntry->CreateFieldLC( *fieldType );
-
-        TInt fieldLength = iMessage->Des()[offset];
-        offset++;
-        HBufC* fieldData = HBufC::NewLC( fieldLength );
-        fieldData->Des().Copy( iMessage->Mid( offset, fieldLength ) );
-        HTI_LOG_FORMAT( "Field created - adding data: %S", fieldData );
-
-        MVPbkContactFieldTextData& targetData =
-            MVPbkContactFieldTextData::Cast( field->FieldData() );
-        targetData.SetTextL( *fieldData );
-
-        CleanupStack::PopAndDestroy(); // fieldData
-
-        HTI_LOG_TEXT( "Data set - Adding the field" );
-        newEntry->AddFieldL( field );
-        CleanupStack::Pop(); // field
-
-        offset += fieldLength;
-        }
-
-    HTI_LOG_TEXT( "Entry created - Commiting" );
-    // Starts the async commit operation. Takes ownership of newEntry.
-    newEntry->CommitL( *this );
-    CleanupStack::Pop(); // newEntry
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::HandleSimContactImportL" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::HandleSimContactDeleteL
-// Creates a contact view containing the contacts to be deleted.
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::HandleSimContactDeleteL()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::HandleSimContactDeleteL" );
-
-    if ( iContactView )
-        {
-        iContactView->RemoveObserver( *this );
-        delete iContactView;
-        iContactView = NULL;
-        }
-
-    // Delete one entry based on ID
-    if ( iMessage->Length() == 4 )
-        {
-        TPtr8 msgPtr = iMessage->Des();
-        TInt id = msgPtr[0] + ( msgPtr[1] << 8 )
-                            + ( msgPtr[2] << 16 )
-                            + ( msgPtr[3] << 24 );
-        HTI_LOG_FORMAT( "Delete with id %d", id );
-
-        User::Leave( KErrNotSupported );
-        }
-
-    // Delete all
-    else
-        {
-        CVPbkContactViewDefinition* viewDef = CVPbkContactViewDefinition::NewL();
-        CleanupStack::PushL( viewDef );
-        viewDef->SetType( EVPbkContactsView );
-        viewDef->SetSharing( EVPbkLocalView );
-        viewDef->SetSortPolicy( EVPbkUnsortedContactView ); // in SIM index order
-        CVPbkSortOrder* sortOrder = CVPbkSortOrder::NewL(
-                iSimStore->StoreProperties().SupportedFields() );
-        CleanupStack::PushL( sortOrder );
-        iContactView = iSimStore->CreateViewLC( *viewDef, *this, *sortOrder );
-        CleanupStack::Pop(); // view;
-        CleanupStack::PopAndDestroy( 2 ); // sortOrder, viewDef
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::HandleSimContactDeleteL" );
-    }
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::DeleteContactsInViewL
-// Deletes the contacts that are currently in iContactView.
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::DeleteContactsInViewL()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::DeleteContactsInViewL" );
-
-    TInt cntCount( iContactView->ContactCountL() );
-    HTI_LOG_FORMAT( "Contact count in view = %d", cntCount );
-    if ( cntCount > 0 )
-        {
-        CVPbkContactLinkArray* contactLinks = CVPbkContactLinkArray::NewLC();
-        for ( TInt i = 0; i < cntCount; ++i )
-            {
-            MVPbkContactLink* link =
-                iContactView->ContactAtL( i ).CreateLinkLC();
-            contactLinks->AppendL( link );
-            CleanupStack::Pop(); // link
-            }
-        // Following DeleteContactsL will result in calls to StepComplete
-        // and finally OperationComplete (StepFailed if error occurs)
-        iCurrentOperation = iContactManager->DeleteContactsL(
-                *contactLinks, *this );
-        CleanupStack::PopAndDestroy(); // contactLinks
-        }
-    else
-        {
-        // Nothing to delete
-        SendOkMsgL( KNullDesC8 );
-        }
-
-    // We don't need the view anymore
-    HTI_LOG_TEXT( "Deleting the contact view" );
-    iContactView->RemoveObserver( *this );
-    delete iContactView;
-    iContactView = NULL;
-
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::DeleteContactsInViewL" );
-    }
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::CheckImportMsg
-// Validates the syntax of import contact message.
-// ----------------------------------------------------------------------------
-TBool CHtiSimDirHandlerVPbk::CheckImportMsg()
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::CheckImportMsg" );
-    // Import command syntax:
-    //   amount of fields     (1 byte)   __
-    //   type of field        (1 byte)     |
-    //   length of data field (1 byte)     | repeated <amount of fields> times
-    //   field data           (variable) __|
-
-    TInt length = iMessage->Length();
-    if ( length < 4 ) // min length 4 bytes
-        {
-        HTI_LOG_FORMAT( "Message too short %d", length );
-        return EFalse;
-        }
-
-    TInt offset = 0;
-    TInt fieldCount = iMessage->Des()[offset];
-    HTI_LOG_FORMAT( "Fields %d", fieldCount );
-    if ( fieldCount < 1 ) // must be at least one field
-        {
-        return EFalse;
-        }
-
-    offset++;
-    TInt fieldsFound = 0;
-    while ( offset < length )
-        {
-        fieldsFound++;
-        TInt fieldType = iMessage->Des()[offset];
-        HTI_LOG_FORMAT( "Field type %d", fieldType );
-        if ( fieldType < ENameField || fieldType > EAdditNumberField )
-            {
-            return EFalse; // invalid field type
-            }
-        offset++; // the type of field byte
-        if ( offset >= length )
-            {
-            return EFalse;
-            }
-        TInt fieldLength = iMessage->Des()[offset];
-        HTI_LOG_FORMAT( "Field length %d", fieldLength );
-        if ( fieldLength < 1 )
-            {
-            return EFalse; // Field data can not be empty
-            }
-        offset++; // advance over the length of data byte
-        offset += fieldLength; // and the field data
-        }
-
-    if ( offset == length && fieldsFound == fieldCount )
-        {
-        HTI_LOG_TEXT( "Message OK" );
-        return ETrue;
-        }
-
-    return EFalse;
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::SendOkMsgL
-// Helper function for sending response messages.
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::SendOkMsgL( const TDesC8& aData )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::SendOkMsgL" );
-    iIsBusy = EFalse; // Done with the current request
-    User::LeaveIfNull( iDispatcher );
-    HBufC8* temp = HBufC8::NewL( aData.Length() + 1 );
-    TPtr8 response = temp->Des();
-    response.Append( ( TChar ) CHtiPIMServicePlugin::EResultOk );
-    response.Append( aData );
-    User::LeaveIfError( iDispatcher->DispatchOutgoingMessage(
-        temp, KPIMServiceUid ) );
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::SendOkMsgL" );
-    }
-
-
-// ----------------------------------------------------------------------------
-// CHtiSimDirHandlerVPbk::SendErrorMessageL
-// Helper function for sending error response messages.
-// ----------------------------------------------------------------------------
-void CHtiSimDirHandlerVPbk::SendErrorMessageL( TInt aError, const TDesC8& aDescription )
-    {
-    HTI_LOG_FUNC_IN( "CHtiSimDirHandlerVPbk::SendErrorMessageL" );
-    iIsBusy = EFalse; // Done with the current request
-    User::LeaveIfNull( iDispatcher );
-    User::LeaveIfError( iDispatcher->DispatchOutgoingErrorMessage(
-        aError, aDescription, KPIMServiceUid ) );
-    HTI_LOG_FUNC_OUT( "CHtiSimDirHandlerVPbk::SendErrorMessageL" );
-    }
-
-
-// End of file