vmbx/vmbxengine/src/vmbxpbkstore.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:45:17 +0300
branchRCL_3
changeset 19 7d48bed6ce0c
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2009-2010 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 the CVmbxPbkStore class
*
*/


// INCLUDE FILES
#include <commonphoneparser.h>
#include <mpbutil.h>
#include <cvoicemailboxentry.h>

#include "vmbxutilities.h"
#include "vmbxetelconnection.h"
#include "vmbxlogger.h"
#include "vmbxpbkstore.h"

#include <e32property.h>
#include <simutils.h>
#include <startupdomainpskeys.h>
//CONSTANTS
// Amount of retries to be performed.
const TInt KVmbxPhonebookBufferSize( 150 );

// ============================ MEMBER FUNCTIONS =============================

// ---------------------------------------------------------------------------
// CVmbxPbkStore::CVmbxPbkStore
// C++ default constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------------------------
//
CVmbxPbkStore::CVmbxPbkStore(): CActive(EPriorityStandard ),
                                iAsynType( EVmbxSimDefault )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::CVmbxPbkStore =>" );
    CActiveScheduler::Add( this );
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::CVmbxPbkStore <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::~CVmbxPbkStore
// destructor
// ---------------------------------------------------------------------------
//
CVmbxPbkStore:: ~CVmbxPbkStore()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::~CVmbxPbkStore =>" );
    Cancel();
    iPhoneBook.Close();
    delete iWait;
    delete iETelConnection;
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::~CVmbxPbkStore <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::NewL
// two phase constructor
// ---------------------------------------------------------------------------
//
CVmbxPbkStore* CVmbxPbkStore::NewL()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::NewL =>" );
    CVmbxPbkStore* self = new( ELeave ) CVmbxPbkStore();
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::NewL <=" );
    return self;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::ConstructL
// two phase constructor
// ---------------------------------------------------------------------------
//
void CVmbxPbkStore::ConstructL()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ConstructL =>" );
    TInt value( 0 );
    TInt res = RProperty::Get( KPSUidStartup, KPSSimStatus, value );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::ConstructL res = %d", res );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::ConstructL value = %d", value );
    if ( (ESimUsable != value && ESimReadable != value ) || KErrNone != res )
        {
        // Sim card not ready to use
        User::Leave( KErrNotReady );
        }
    // Open tel server and phone
    iETelConnection = CVmbxETelConnection::NewL();

    iWait = new( ELeave ) CActiveSchedulerWait; 
    TVmbxAlsLineType alsLine = VmbxUtilities::AlsLine();

    // Supported ALS line,ALS line on
    if ( EVmbxAlsLineDefault != alsLine )
        {
        // open 6f17 file ,if not found the file, leave
        User::LeaveIfError( OpenVmbxPhonebook() );
        }
    // Not supported ALS line,ALS line off
    else
        {
        // Open 6fc7 file, if not found, open 6f17 file
        TInt result = OpenMbdnPhonebook();
        if ( KErrPathNotFound == result )
            {
            //close 6fc7 and open 6f17 file
            iPhoneBook.Close();
            // open 6f17 file ,if not found the file, leave
            User::LeaveIfError( OpenVmbxPhonebook() );
            }
        else
            {
            User::LeaveIfError( result );
            }
        }
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ConstructL <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::GetVmbxInfo
// Activates phonebook info query
// ---------------------------------------------------------------------------
TInt CVmbxPbkStore::GetVmbxInfo( 
        RMobilePhoneBookStore::TMobilePhoneBookInfoV1& aInfo )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::GetVmbxInfo =>" );
    TInt result( KErrInUse );
    RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg
                                            InfoPckg( aInfo );
    // get Info from phonebook
    if( !IsActive() && !iWait->IsStarted() )
        {
        iPhoneBook.GetInfo( iStatus, InfoPckg );
        iAsynType = EVmbxSimGetInfo;
        SetActive();
        iWait->Start();

        result = iStatus.Int();
        VMBLOGSTRING2( "VMBX: CVmbxPbkStore::PhonebookInfo: \
                SIM Phonebook info read, status: %I", result );
        }
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::GetVmbxInfo <=" );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::IsWritable
// Sim write support
// ---------------------------------------------------------------------------
//
TBool CVmbxPbkStore::IsWritable()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::IsWritable =>" );
    TBool result( EFalse );
    if ( IsWriteAccess() )
        {
        // Get current sim entry, then write the same entry 
        // to sim if read successufully
        CVoiceMailboxEntry* simEntry(NULL);
        TRAPD( newErr, simEntry = CVoiceMailboxEntry::NewL() );
        VMBLOGSTRING2( "VMBX: CVmbxPbkStore::IsWritable newErr = %d ",
            newErr );
        if ( KErrNone == newErr )
            {
            // get als line info
            TVmbxAlsLineType alsLine = VmbxUtilities::AlsLine();
            simEntry->SetVmbxAlsLineType( alsLine );
            // ALS line off
            if ( IsSimFileExisting(EMBDNPhoneBook) && (EVmbxAlsLineDefault == alsLine) )
                {
                // ALS line on and 6f17 exist 
                // just check 6f17 file write access
                iPhoneBookType = EMBDNPhoneBook;
                }
            else
                {
                // ALS line on, only should write to 6fc7; ALS off, 6f17 file inexist
                //  check 6fc7 file write access
                iPhoneBookType = EVMBXPhoneBook;
                }
            simEntry->SetVoiceMailboxType( EVmbxVoice );
            simEntry->SetServiceId( KVmbxServiceVoice );
            TRAPD( err, SimReadL( *simEntry ) );
            VMBLOGSTRING2( "VMBX: CVmbxPbkStore:: IsWritable read %I <=", err );
            if ( KErrNotFound == err )
                {
                simEntry->SetVmbxNumber( KNullDesC );
                }
            if ( KErrNone == err || KErrNotFound == err )
                {
                err = Write( *simEntry );
                VMBLOGSTRING2( "VMBX: CVmbxPbkStore:: IsWritable write %I <=",
                    err );
                // If write successfully, means writable
                if ( KErrNone == err )
                    {
                    result = ETrue;
                    }
                }
            }
        delete simEntry;
        simEntry = NULL;
        }
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore:: IsWritable result %I <=", result );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::PhoneBookType
// PhoneBookType
// ---------------------------------------------------------------------------
//
TVmbxSimPhonebookType CVmbxPbkStore::PhoneBookType()
    {
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::PhoneBookType type %I", 
                         iPhoneBookType );
    return iPhoneBookType;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::Write
// Write to SIM
// ---------------------------------------------------------------------------
//
TInt CVmbxPbkStore::Write( const CVoiceMailboxEntry& aEntry )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::Write =>" );
    TInt result( KErrInUse );
    TBuf8<KVmbxPhonebookBufferSize> pbData;

    CPhoneBookBuffer* pbkBuffer = new CPhoneBookBuffer();
    
    if ( !pbkBuffer )
        {
        VMBLOGSTRING( "VMBX: CVmbxPbkStore::Write: \
        Phonebook creation error" );
        result = KErrNoMemory;
        }
    else
        {
        pbkBuffer->Set( &pbData );
        TInt activeAlsLine = aEntry.VmbxAlsLineType();
        // Add index, const value for vmbx write.
        int entryIndex = 1;
        // New entry
        result = pbkBuffer->AddNewEntryTag();
        if ( KErrNone == result )
            {
            // Type of index is TUint16 in Multimode ETel and TInt in old ETel.
            result = pbkBuffer->PutTagAndValue( 
            RMobilePhoneBookStore::ETagPBAdnIndex, (TUint16)entryIndex );
            VMBLOGSTRING2( "VMBX: CVmbxPbkStore::Write: ETagPBAdnIndex \
                    result=%I",  result );
            // Add name, Type of ETagPBText is TDes16
            TPtrC vmbxName( KNullDesC );
            aEntry.GetVmbxName( vmbxName );
            result = pbkBuffer->PutTagAndValue( 
            RMobilePhoneBookStore::ETagPBText, vmbxName );
            VMBLOGSTRING2( "VMBX: CVmbxPbkStore::Write: ETagPBText\
                    result=%I",  result );
            // Add number, Type of ETagPBNumber is TDes16
            TPtrC vmbxNumber( KNullDesC );
            aEntry.GetVmbxNumber( vmbxNumber );
            result = pbkBuffer->PutTagAndValue( 
            RMobilePhoneBookStore::ETagPBNumber, vmbxNumber );
            VMBLOGSTRING2( "VMBX: CVmbxPbkStore::Write: ETagPBNumber\
                    result=%I",  result );
            }

        if ( KErrNone == result )
            {
            if ( iPhoneBookType == EMBDNPhoneBook )
                {
                RMobilePhone::TMobilePhoneVoicemailIdsV3 mbdnInfo;
                result = GetMbdnInfo( mbdnInfo );

                if ( KErrNone == result )
                    {
                    TInt index = mbdnInfo.iVoice;
                    if( !IsActive() && !iWait->IsStarted() )
                        {
                        // write vmbx number to 6fc7 file
                        iPhoneBook.Write( iStatus, pbData, index );
                        // Wait for asynchronous call to finish
                        iAsynType = EVmbxSimEntryWrite;
                        SetActive();
                        iWait->Start();
                        result = iStatus.Int();
                        }
                    }
                VMBLOGSTRING( "Mbdn writing" );
                }
            else
                {
                if( !IsActive() && !iWait->IsStarted() )
                    {
                    // write vmbx number to 6f17 file
                    iPhoneBook.Write( iStatus, pbData, entryIndex );
                    iAsynType = EVmbxSimEntryWrite;
                    // Wait for asynchronous call to finish
                    SetActive();
                    iWait->Start();
                    result = iStatus.Int();
                    }
                VMBLOGSTRING( "CVmbxPbkStore::Write 6f17 writing" );
                }
            }
        }
    delete pbkBuffer;
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::Write: result=%I<=",  result );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::PhonebookStore
// Return RMobilePhoneBookStore
// ---------------------------------------------------------------------------
RMobilePhoneBookStore& CVmbxPbkStore::PhonebookStore()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::PhonebookStore <=>" );
    return iPhoneBook;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::GetMbdnInfo
// ---------------------------------------------------------------------------
//
TInt CVmbxPbkStore::GetMbdnInfo( RMobilePhone::TMobilePhoneVoicemailIdsV3& aInfo )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::GetMbdnInfo =>" );
    TInt result( KErrInUse );
    // Get identifiers
    if ( !IsActive() && !iWait->IsStarted() )
        {
        VMBLOGSTRING( "VMBX: CVmbxPbkStore::GetMbdnInfo: GetMailboxNumbers" );
        VMBLOGSTRING2( "VMBX: CVmbxPbkStore::GetMbdnInfo: iStatus %I",
                                                             iStatus.Int() );
        RMobilePhone::TMobilePhoneVoicemailIdsV3Pckg infoPckg( aInfo );
        iETelConnection->Phone().GetMailboxNumbers( iStatus, infoPckg );
        VMBLOGSTRING2( "VMBX: CVmbxPbkStore::GetMbdnInfo :iStatus %I",
                                                             iStatus.Int() );
        iAsynType = EVmbxSimMbdnInfo;
        // Wait for asynchronous call to finish
        SetActive();
        iWait->Start();

        VMBLOGSTRING2( "VMBX: CVmbxPbkStore::GetMbdnInfo: iVoice original value %I",
                                                             aInfo.iVoice );
        if ( iStatus.Int() == KErrNotFound )
            {
            result = KErrNone;
            VMBLOGSTRING( "VMBX: CVmbxPbkStore::GetMbdnInfo: KErrNotFound,\
             but igorned and change to KErrNone" );
            }
        else
            {
            result = iStatus.Int();
            }
        TVmbxAlsLineType alsLine = VmbxUtilities::AlsLine();
        if ( EVmbxAlsLineDefault == alsLine )
            {
            aInfo.iVoice =  EVmbxAlsLine1;
            }
        VMBLOGSTRING2( "VMBX: CVmbxPbkStore::GetMbdnInfo: iVoice last value %I",
            aInfo.iVoice );
        }
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::GetMbdnInfo: result %I<=",
         result );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::OpenMbdnPhonebook
// opening mbdn-type phonebook
// ---------------------------------------------------------------------------
//   
TInt CVmbxPbkStore::OpenMbdnPhonebook()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::OpenMbdnPhonebook =>" );
    //Open mbdn-type phonebook , Currently the file not exist, thr return
    // value also KErrNone
    TInt result = iPhoneBook.Open( iETelConnection->Phone(),
                                         KETelIccMbdnPhoneBook );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::OpenMbdnPhonebook :\
        MBDN opening result = %d", result );

    TBool res = IsSimFileExisting( EMBDNPhoneBook );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::OpenMbdnPhonebook :\
        MBDN reading res = %d", res );
    if ( !res )
        {
        result = KErrPathNotFound;
        }
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::OpenMbdnPhonebook res = %d<=", result );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::OpenVmbxPhonebook
// opening vmbx-type phonebook
// ---------------------------------------------------------------------------
//
TInt CVmbxPbkStore::OpenVmbxPhonebook()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::OpenVmbxPhonebook =>" );
    //Open vmbx-type phonebook , Currently the file not exist, thr return
    // value also KErrNone
    TInt result = iPhoneBook.Open( iETelConnection->Phone(),
                                                 KETelIccVoiceMailBox );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::OpenVmbxPhonebook :\
        Vmbx opening result = %d", result );
    TBool res = IsSimFileExisting( EVMBXPhoneBook );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::OpenVmbxPhonebook :\
        Vmbx reading res = %d", res );
    if ( !res )
        {
        result = KErrPathNotFound;
        }
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::OpenVmbxPhonebook result=%d <=", result );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::GetL
// Fetches mailbox number from Sim
// ---------------------------------------------------------------------------
//
void CVmbxPbkStore::GetL( CVoiceMailboxEntry& aEntry )
    {
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::GetL: iPhoneBookType %d=>",
                         iPhoneBookType );

    if ( EMBDNPhoneBook == iPhoneBookType )
        {
        TRAPD( err, SimReadL( aEntry ) );

        TPtrC vmbxNumber( KNullDesC );
        if ( KErrNone == err )
            {
            err = aEntry.GetVmbxNumber( vmbxNumber );
            }

        // 6fc7 file empty
        if ( ( KErrNone != err ) || ( !vmbxNumber.Length() ) )
            {
            VMBLOGSTRING2( "VMBX: CVmbxPbkStore::GetL: \
            no vmbx number in 6fc7 file then read from 6f17 file err%I", err );
            // close 6fc7 and open 6f17 file
            iPhoneBook.Close();
            User::LeaveIfError( OpenVmbxPhonebook() );
            // read vmbx number from 6f17 file
            SimReadL( aEntry );
            }
        }
    else
        {
        SimReadL( aEntry );
        }

    VMBLOGSTRING( "VMBX: CVmbxPbkStore::GetL <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::SimReadL
// read vmbx number from sim
// ---------------------------------------------------------------------------
//
void CVmbxPbkStore::SimReadL( CVoiceMailboxEntry& aEntry )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::SimReadL =>" );

    TInt numEntries( 1 );
    TBuf8<KVmbxPhonebookBufferSize> pbData;

    TInt result( KErrInUse );
    if ( iPhoneBookType == EMBDNPhoneBook )
        {
        RMobilePhone::TMobilePhoneVoicemailIdsV3 mbdnInfo;
        result = GetMbdnInfo( mbdnInfo );
        if ( KErrNone == result )
            {
            VMBLOGSTRING( "start MBDN PhoneBook read" );
            if( !IsActive() && !iWait->IsStarted() )
                {
                // read vmbx number from 6fc7 file
                iPhoneBook.Read( 
                iStatus, mbdnInfo.iVoice, numEntries, pbData );
                iAsynType = EVmbxSimEntryRead;
                // Wait for asynchronous call to finish
                SetActive();
                iWait->Start();
                }
            }
        }
    else
        {
        // Record#1 in sim is for line1 number and Record#2 in sim is for
        // line2 number so line is used to fetch
        VMBLOGSTRING( "start VMBX PhoneBook read" );
        TInt activeAlsLine = aEntry.VmbxAlsLineType();
        if ( EVmbxAlsLineDefault == activeAlsLine )
            {
            activeAlsLine = EVmbxAlsLine1;
            }
        if( !IsActive() && !iWait->IsStarted() )
            {
            result = KErrNone;
            // read vmbx number from 6f17 file
            VMBLOGSTRING2( "VMBX: CVmbxPbkStore::SimReadLactiveAlsLine = %I",
                 activeAlsLine );
            iPhoneBook.Read( iStatus, activeAlsLine, numEntries, pbData );
            iAsynType = EVmbxSimEntryRead;
            // Wait for asynchronous call to finish
            SetActive();
            iWait->Start();
            }
        }

    User::LeaveIfError( result );
    // asynchronous call finished
    VMBLOGSTRING2( "PhoneBook read iStatus = %I", iStatus.Int() );

    if( iStatus.Int() == KErrNone )
        {
        ParseDataL( aEntry, pbData );
        }
    else
        {
        User::Leave( iStatus.Int() );
        }

    VMBLOGSTRING( "VMBX: CVmbxPbkStore::SimReadL <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::ParseDataL
// 
// ---------------------------------------------------------------------------
//
void CVmbxPbkStore::ParseDataL( CVoiceMailboxEntry& aEntry, TDes8& aPbData )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ParseDataL =>" );
    TInt result( KErrNotFound );

    VMBLOGSTRING2( "CVmbxPbkStore::ParseDataL Lengh = %d", aPbData.Length() );

    if ( aPbData.Length() )
        {
        // -> Search Tags "ETagPBNumber" and "ETagPBText"
        // and read (decode) them
        // create buffer
        CPhoneBookBuffer* pbkBuffer = new( ELeave ) CPhoneBookBuffer();
        CleanupStack::PushL( pbkBuffer );

        // start read
        pbkBuffer->Set( &aPbData );
        pbkBuffer->StartRead();

        result = ReadNewEntryTag( pbkBuffer );
        // Read first "new-entry-tag"
        if ( KErrNone == result )
            {
            ReadPbkDataL( pbkBuffer, aEntry );
            }
        CleanupStack::PopAndDestroy( pbkBuffer );
        }
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::ParseDataL: result %I", result );
    User::LeaveIfError( result );
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ParseDataL <=" );
    }


// ---------------------------------------------------------------------------
// CVmbxPbkStore::ReadNewEntryTag
// Reads "new-entry-tag" from phonebook data from Sim
// ---------------------------------------------------------------------------
//
TInt CVmbxPbkStore::ReadNewEntryTag( CPhoneBookBuffer* aPbkBuffer )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ReadNewEntryTag =>" );
    TInt result( KErrNone );
    TUint8 tagValue( 0 );
    CPhoneBookBuffer::TPhBkTagType dataType(
                               CPhoneBookBuffer::EPhBkTypeNoData );

    result = aPbkBuffer->GetTagAndType( tagValue, dataType );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::ReadNewEntryTag result = %d",
     result );

    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::ReadNewEntryTag tagValue = %X",
     tagValue );
    if ( tagValue != RMobilePhoneBookStore::ETagPBNewEntry )
        {
        VMBLOGSTRING( "VMBX: CVmbxPbkStore::ParseDataL: Unknown result" );
        result = KErrArgument;  // Something wrong in TLV
        }
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ReadNewEntryTag <=" );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::ReadPbkData
// Reads tags from buffer retrieved from sim
// ---------------------------------------------------------------------------
//
void CVmbxPbkStore::ReadPbkDataL( CPhoneBookBuffer* aPbkBuffer,
                                         CVoiceMailboxEntry& aEntry )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ReadPbkDataL =>" );

    TInt result( KErrNone );
    TInt next( KErrNone );
    TBool found( EFalse );
    TUint8 tagValue( 0 );
    CPhoneBookBuffer::TPhBkTagType dataType(
                                          CPhoneBookBuffer::EPhBkTypeNoData );

    result = aPbkBuffer->GetTagAndType( tagValue, dataType );

    // loop through data to find a number and an possible alpha string
    while ( next == KErrNone && result == KErrNone )
        {
        VMBLOGSTRING2("VMBX: CVmbxPbkStore::ReadPbkDataL: tagValue: %d",
         tagValue );
        VMBLOGSTRING2("VMBX: CVmbxPbkStore::ReadPbkDataL: dataType: %d",
         dataType );

        // Check for text field
        if ( tagValue == RMobilePhoneBookStore::ETagPBText )
            {
            VMBLOGSTRING("VMBX: CVmbxPbkStore::ReadPbkDataL: \
                          ETagPBText found Alpha ID" );
            found = ETrue;
            // Alpha string field found from TLV entry,
            // assuming 16bit data
            TPtrC16 alphaPtrC;
            result = aPbkBuffer->GetValue( alphaPtrC );
            
            if ( KErrNone == result )
                {
                // set name to vmbx entry
                result = aEntry.SetVmbxName( alphaPtrC );
                }
            }

        // Check for number field
        else if ( tagValue == RMobilePhoneBookStore::ETagPBNumber )
            {
            VMBLOGSTRING("VMBX: CVmbxPbkStore::ReadPbkDataL: \
                          ETagPBNumber found Number" );
            found = ETrue;
            // Number field found from TLV entry, assuming 16bit data
            TPtrC16 numberPtrC;
            result = aPbkBuffer->GetValue( numberPtrC );

            if ( KErrNone == result )
                {
                // set number to vmbx entry
                result = aEntry.SetVmbxNumber( numberPtrC );
                }
            }
        else
            {
            // skip field
            aPbkBuffer->SkipValue( dataType );
            VMBLOGSTRING( "VMBX: CVmbxPbkStore::ReadPbkDataL: SkipValue" );
            }
        // read next if no errors
        if ( KErrNone == result )
            {
            // Read next field type
            next = aPbkBuffer->GetTagAndType( tagValue, dataType );
            VMBLOGSTRING2( "VMBX: CVmbxPbkStore::ReadPbkDataL: \
                                    next GetTagAndType = %I", result );
            }
        }

    // Neither alpha string Nor number is found
    if( KErrNone == result && !found )
        {
        result = KErrNotFound;
        }
    
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::ReadPbkDataL result=%I", result );
    User::LeaveIfError( result );
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::ReadPbkDataL <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::RunL
// 
// ---------------------------------------------------------------------------
//
void CVmbxPbkStore::RunL()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::RunL =>" );
    if ( iWait->IsStarted() )
        {
        // stop blocking
        iWait->AsyncStop();
        VMBLOGSTRING( "VMBX: CVmbxSimHandler::RunL: AsyncStop" );
        }
    iAsynType = EVmbxSimDefault;
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::RunL <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::DoCancel
// 
// ---------------------------------------------------------------------------
//
void CVmbxPbkStore::DoCancel()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::DoCancel =>" );
    if ( iWait->IsStarted() )
        {
        // stop blocking
        iWait->AsyncStop();
        VMBLOGSTRING( "VMBX: CVmbxPbkStore::DoCancel: AsyncStop" );
        }
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::DoCancel: iAsynType %I",iAsynType );
    switch ( iAsynType )    
        {
        // only for USIM
        case EVmbxSimMbdnInfo:
            {
            VMBLOGSTRING( "VMBX: CVmbxPbkStore::DoCancel : \
                                        EVmbxSimMbdnInfo" );
            iETelConnection->Phone().CancelAsyncRequest( 
                                              EMobilePhoneGetMailboxNumbers );
            break;
            }
        case EVmbxSimGetInfo:
            {
            VMBLOGSTRING( "VMBX: CVmbxPbkStore::DoCancel : \
                                              EVmbxSimGetInfo" );
            iETelConnection->Phone().CancelAsyncRequest( 
                                               EMobilePhoneStoreGetInfo );
            break;
            }            
        case EVmbxSimEntryRead:
            {
            VMBLOGSTRING( "VMBX: CVmbxPbkStore::DoCancel : EVmbxSimEntryRead" );
            iETelConnection->Phone().CancelAsyncRequest( 
                                               EMobilePhoneStoreRead );
            break;
            }
        case EVmbxSimEntryWrite:
            {
            VMBLOGSTRING( "VMBX: CVmbxPbkStore::DoCancel : EVmbxSimEntryWrite" );
            iETelConnection->Phone().CancelAsyncRequest( 
                                               EMobilePhoneStoreWrite );
            break;
            }
        default:
            break;
        }
    
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::DoCancel <=" );
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::RunError
// 
// ---------------------------------------------------------------------------
//
TInt CVmbxPbkStore::RunError(TInt aError)
    {
    // Avoid warning
    aError = aError;
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::RunError: %I", aError );
    return KErrNone;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::IsSimFileExisting
// check sim file existing or not
// ---------------------------------------------------------------------------
//
TBool CVmbxPbkStore::IsSimFileExisting( const TVmbxSimPhonebookType aType )
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::IsSimFileExisting =>" );
    iPhoneBookType = aType;
    TBool result( ETrue );
    CVoiceMailboxEntry* entry(NULL);
    TRAPD( err, entry = CVoiceMailboxEntry::NewL() );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::IsSimFileExisting err = %d ",
     err );
    if ( KErrNone != err )
        {
        result = EFalse;
        }
    else
        {
        entry->SetVoiceMailboxType( EVmbxVoice );
        TRAPD( err, SimReadL( *entry ) );
        // KErrPathNotFound means when current file path not found.
        if ( KErrPathNotFound == err )
            {
            result = EFalse;
            }
        }
    delete entry;
    entry = NULL;
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore::IsSimFileExisting result = %d <= ",
         result );
    return result;
    }

// ---------------------------------------------------------------------------
// CVmbxPbkStore::IsWriteAccess
// Sim write access support
// ---------------------------------------------------------------------------
//
TBool CVmbxPbkStore::IsWriteAccess()
    {
    VMBLOGSTRING( "VMBX: CVmbxPbkStore::IsWriteAccess =>" );
    TBool result( EFalse );
    RMobilePhoneBookStore::TMobilePhoneBookInfoV1 info;
    TInt temp = GetVmbxInfo( info );
    if( KErrNone == temp )
        {
        result = ( info.iCaps &
                RMobilePhoneBookStore::KCapsWriteAccess ? ETrue : EFalse );
        
        }
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore:: IsWriteAccess: info.iCaps %X",
                     info.iCaps );
    VMBLOGSTRING2( "VMBX: CVmbxPbkStore:: IsWriteAccess result %I <=", result );
    return result;
    }

//End of file