srsf/nssvasapi/nssvascore/src/vascvpbkhandler.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:17 +0100
branchRCL_3
changeset 19 e36f3802f733
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004-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:  
*
*/


// INCLUDE FILES
#include <coemain.h> 
#include <centralrepository.h>
#include <featmgr.h>

#include <PbkFields.hrh>

#include <VPbkEng.rsg>

#include <CVPbkContactManager.h> 
#include <CVPbkContactStoreUriArray.h> 
#include <VPbkContactStoreUris.h>
#include <TVPbkContactStoreUriPtr.h> 
#include <MVPbkContactStoreList.h> 
#include <CVPbkContactIdConverter.h> 
#include <MVPbkContactOperationBase.h>
#include <MVPbkStoreContact.h>
#include <MVPbkFieldType.h>
#include <CVPbkDefaultAttribute.h>
#include <MVPbkContactAttributeManager.h>
#include <MVPbkContactFieldTextData.h> 
#include <MVPbkContactFieldUriData.h>
#include <MVPbkContactViewBase.h> 
#include <CVPbkContactViewDefinition.h>

#include <nssvasmtag.h>
#include <nssvascoreconstant.h>

#include "vascvpbkhandler.h"
#include "vasmcontactobserver.h"

#include "srsfprivatecrkeys.h"

#include "rubydebug.h"

// CONSTANTS

// Priority list of virtual phonebook fields
const TInt KFieldPriority[] = 
    { 
    R_VPBK_FIELD_TYPE_LANDPHONEGEN, 
    R_VPBK_FIELD_TYPE_LANDPHONEHOME,
    R_VPBK_FIELD_TYPE_LANDPHONEWORK, 
    R_VPBK_FIELD_TYPE_MOBILEPHONEGEN,
    R_VPBK_FIELD_TYPE_MOBILEPHONEHOME, 
    R_VPBK_FIELD_TYPE_MOBILEPHONEWORK,
    R_VPBK_FIELD_TYPE_VIDEONUMBERGEN,
    R_VPBK_FIELD_TYPE_VIDEONUMBERHOME, 
    R_VPBK_FIELD_TYPE_VIDEONUMBERWORK,
    R_VPBK_FIELD_TYPE_FAXNUMBERGEN,
    R_VPBK_FIELD_TYPE_FAXNUMBERHOME, 
    R_VPBK_FIELD_TYPE_FAXNUMBERWORK,
    R_VPBK_FIELD_TYPE_VOIPGEN,
    R_VPBK_FIELD_TYPE_VOIPHOME, 
    R_VPBK_FIELD_TYPE_VOIPWORK,
    R_VPBK_FIELD_TYPE_IMPP,
    R_VPBK_FIELD_TYPE_EMAILGEN,
    R_VPBK_FIELD_TYPE_EMAILHOME, 
    R_VPBK_FIELD_TYPE_EMAILWORK,
    R_VPBK_FIELD_TYPE_FIRSTNAMEREADING,
    R_VPBK_FIELD_TYPE_FIRSTNAME,
    R_VPBK_FIELD_TYPE_LASTNAMEREADING,
    R_VPBK_FIELD_TYPE_LASTNAME,
    R_VPBK_FIELD_TYPE_COMPANYNAME,
    R_VPBK_FIELD_TYPE_SECONDNAME
    };
const TInt KFieldPriorityCount = sizeof( KFieldPriority ) / sizeof ( TInt );

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

// ---------------------------------------------------------
// CVasVPbkHandler* CVasVPbkHandler::NewL
// Two-phased constructor.
// ---------------------------------------------------------
//
EXPORT_C CVasVPbkHandler* CVasVPbkHandler::NewL()
    {
    CVasVPbkHandler* self = new (ELeave) CVasVPbkHandler;    
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }
    
// Destructor
EXPORT_C CVasVPbkHandler::~CVasVPbkHandler()
    {
    RUBY_DEBUG0( "CVasVPbkHandler::~CVasVPbkHandler START" );
    
    iObserver = NULL;
    
    delete iField;
    
    delete iContact;
    
    delete iOperation;
    
    delete iConverter;
    
    if ( iContactManager )
        {
        TRAP_IGNORE( iContactManager->ContactStoresL().CloseAll( *this ) );
        }
    delete iContactManager;
    
    RUBY_DEBUG0( "CVasVPbkHandler::~CVasVPbkHandler EXIT" );
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::InitializeL
// Initializes phonebook handles
// -----------------------------------------------------------------------------
//
EXPORT_C void CVasVPbkHandler::InitializeL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::InitializeL" );
    
    __ASSERT_ALWAYS( !iContactManager, User::Leave( KErrAlreadyExists ) );
    __ASSERT_ALWAYS( !iConverter, User::Leave( KErrAlreadyExists ) );
    
    FeatureManager::InitializeLibL();

    iMMSSupported = FeatureManager::FeatureSupported( KFeatureIdMMS );

    FeatureManager::UnInitializeLib();

    CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC();
    uriArray->AppendL( TVPbkContactStoreUriPtr( VPbkContactStoreUris::DefaultCntDbUri() ) );
    
    iContactManager = CVPbkContactManager::NewL( *uriArray, NULL );
    CleanupStack::PopAndDestroy( uriArray );

    MVPbkContactStoreList& storeList = iContactManager->ContactStoresL();
    storeList.OpenAllL( *this );
    
    // Synchronize the OpenAllL call
    iWait.Start();
    
    User::LeaveIfError( iError );
    
    iConverter = CVPbkContactIdConverter::NewL( iContactManager->ContactStoresL().At( 0 ) );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::CreateContactObserverL
// Creates the contact change notifier and sets observer as a listener
// -----------------------------------------------------------------------------
//
EXPORT_C void CVasVPbkHandler::CreateContactObserverL( MVasContactObserver* aObserver )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::CreateContactObserverL" );
    iObserver = aObserver;
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::CompressL
// Compresses database
// -----------------------------------------------------------------------------
//
EXPORT_C void CVasVPbkHandler::CompressL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::CompressL" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    iOperation = iContactManager->CompressStoresL( *this );
    
    iWait.Start();
    
    User::LeaveIfError( iError );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::CompressL
// Returns all contact ids from database
// -----------------------------------------------------------------------------
//
EXPORT_C CContactIdArray* CVasVPbkHandler::ContactIdArrayLC()
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactIdArrayLC START" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    CContactIdArray* array = CContactIdArray::NewLC();
    
    CVPbkContactViewDefinition* definition = CVPbkContactViewDefinition::NewL();
    CleanupStack::PushL( definition );
    
    definition->SetType( EVPbkContactsView );
    definition->SetUriL( VPbkContactStoreUris::DefaultCntDbUri() );
    
    MVPbkContactViewBase* view =
        iContactManager->CreateContactViewLC( *this, *definition, iContactManager->FieldTypes() );

    iWait.Start();
    
    User::LeaveIfError( iError );

    for( int i = 0; i < view->ContactCountL(); ++i )
        {
        MVPbkContactLink* link = view->CreateLinkLC( i );        
        
        if ( link )
            {
            array->AddL( iConverter->LinkToIdentifier( *link ) );
        
            CleanupStack::PopAndDestroy(); // Destroy link
            }
        }
        
    CleanupStack::PopAndDestroy(); // Destroy view
    CleanupStack::PopAndDestroy( definition );
        
    RUBY_DEBUG0( "CVasVPbkHandler::ContactIdArrayLC EXIT" );
    
    return array;
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::FindContactL
// Finds a contact from the phonebook that matches given tag
// -----------------------------------------------------------------------------
//    
EXPORT_C void CVasVPbkHandler::FindContactL( MNssTag* aTag )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FindContactL" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    delete iField;
    iField = NULL;
    
    delete iContact;
    iContact = NULL;
        
    MVPbkContactLink* link =
        iConverter->IdentifierToLinkLC( aTag->RRD()->IntArray()->At( KVasContactIdRrdLocation ) );
       
    iOperation = iContactManager->RetrieveContactL( *link, *this );
    
    iWait.Start();
    
    // If contact was not found, then request for immediate contact db resync
    if ( iError == KErrNotFound )
        {
        CRepository* repository = CRepository::NewLC( KCRUidSRSFSettings );
        
        repository->Set( KSRSFFullResyncNeeded, KImmediateResync );
        
        CleanupStack::PopAndDestroy( repository );
        }
    
    User::LeaveIfError( iError );
    
    CleanupStack::PopAndDestroy();  // Destroys the link
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FindContactL
// Finds a contact from the phonebook that matches given contact id
// -----------------------------------------------------------------------------
//    
EXPORT_C void CVasVPbkHandler::FindContactL( TInt32 aContactId, TBool aReadOnly )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FindContactL" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    delete iField;
    iField = NULL;
    
    delete iContact;
    iContact = NULL;
        
    MVPbkContactLink* link = iConverter->IdentifierToLinkLC( aContactId );
       
    iOperation = iContactManager->RetrieveContactL( *link, *this );
    
    iWait.Start();
    
    User::LeaveIfError( iError );
    
    if ( !aReadOnly )
        {
        iContact->LockL( *this );
        
        iWait.Start();
        
        User::LeaveIfError( iError );
        }
    
    CleanupStack::PopAndDestroy();  // Destroys the link
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::CloseContactL
// Closes contact with or without saving changes
// -----------------------------------------------------------------------------
//  
EXPORT_C void CVasVPbkHandler::CloseContactL( TBool aSaveChanges )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::CloseContactL" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( iContact, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    if ( aSaveChanges )
        {
        iContact->CommitL( *this );
        
        iWait.Start();
    
        User::LeaveIfError( iError );
        }
    
    delete iContact;
    iContact = NULL;
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FindFieldL
// Finds a contact field that matches given tag
// -----------------------------------------------------------------------------
//    
EXPORT_C void CVasVPbkHandler::FindFieldL( MNssTag* aTag )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FindFieldL" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( iContact, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    delete iField;
    iField = NULL;
    
    TRAPD( error,
        FindDefaultContactFieldL( aTag->RRD()->IntArray()->At( KVasExtensionCommandRrdLocation ) ) );
    if ( error == KErrNotFound )
        {
        FindFieldL( aTag->RRD()->IntArray()->At( KVasFieldIdRrdLocation ) );
        }
        
    if ( !iField )
        {
        User::Leave( KErrNotFound );
        }

    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FindFieldL
// Finds a contact field that matches given field id
// -----------------------------------------------------------------------------
//    
EXPORT_C void CVasVPbkHandler::FindFieldL( TInt aFieldId )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FindFieldL" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( iContact, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    delete iField;
    iField = NULL;
    
    MVPbkStoreContactFieldCollection& fields = iContact->Fields();

    TInt priority = KFieldPriorityCount;
    for ( TInt index = 0; index < fields.FieldCount(); ++index )
        {
        if ( ConvertFieldId( fields.FieldAt( index ) ) == aFieldId &&
             FieldPriority( fields.FieldAt( index ) ) < priority )
            {
            priority = FieldPriority( fields.FieldAt( index ) );
            
            delete iField;
            iField = NULL;
                            
            iField = fields.FieldAtLC( index );
            CleanupStack::Pop(); // Pops iField
            }
        }
        
    if ( !iField )
        {
        User::Leave( KErrNotFound );
        }
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FindContactFieldL
// Finds a contact and a field that mathes given tag
// -----------------------------------------------------------------------------
//    
EXPORT_C void CVasVPbkHandler::FindContactFieldL( MNssTag* aTag )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FindContactFieldL" );
    
    FindContactL( aTag );
    FindFieldL( aTag );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FindDefaultContactFieldL
// Tries to find a default field of given type from found contact
// -----------------------------------------------------------------------------
//
EXPORT_C void CVasVPbkHandler::FindDefaultContactFieldL( TInt aCommandType )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FindDefaultContactFieldL" );
    
    __ASSERT_ALWAYS( iContactManager, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( iContact, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    TInt found = KErrNotFound;
    
    TVPbkDefaultType type = SelectDefaultType( aCommandType );
    
    if ( type != EVPbkDefaultTypeUndefined )
        {
        MVPbkContactAttributeManager& attributeManager = iContactManager->ContactAttributeManagerL();
    
        CVPbkDefaultAttribute* attribute = CVPbkDefaultAttribute::NewL( type );
        CleanupStack::PushL( attribute );
        
        MVPbkStoreContactField* field =
            attributeManager.FindFieldWithAttributeL( *attribute, *iContact );

        if ( field && AcceptDefaultField( *field, aCommandType ) )
            {
            iField = field->CloneLC();
            CleanupStack::Pop(); // Pops iField
            found = KErrNone;
            }
        
        CleanupStack::PopAndDestroy( attribute );
        }
    
    User::LeaveIfError( found );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ChangeVoiceTagFieldL
// Changes current field's voice tag field status
// -----------------------------------------------------------------------------
//
EXPORT_C void CVasVPbkHandler::ChangeVoiceTagFieldL( TBool /*aSet*/ )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::ChangeVoiceTagFieldL" );
    
    User::Leave( KErrNotSupported );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::LabelL
// Returns the field label
// -----------------------------------------------------------------------------
//    
EXPORT_C TPtrC CVasVPbkHandler::LabelL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::LabelL" );
    
    __ASSERT_ALWAYS( iField, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    if ( iField->BestMatchingFieldType()->FieldTypeResId() == R_VPBK_FIELD_TYPE_IMPP && 
         iField->FieldData().DataType() == EVPbkFieldStorageTypeUri )
        {
        return MVPbkContactFieldUriData::Cast( iField->FieldData()).Scheme();
        }

    return iField->FieldLabel();
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::TextL
// Returns the field text
// -----------------------------------------------------------------------------
//    
EXPORT_C TPtrC CVasVPbkHandler::TextL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::TextL" );
    
    __ASSERT_ALWAYS( iField, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    if ( iField->FieldData().DataType() == EVPbkFieldStorageTypeText )
        {
        return MVPbkContactFieldTextData::Cast( iField->FieldData() ).Text();
        }
    else if ( iField->FieldData().DataType() == EVPbkFieldStorageTypeUri )
        {
        return MVPbkContactFieldUriData::Cast( iField->FieldData() ).Text();
        }
    else
        {
        return KNullDesC();
        }
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FieldTypeL
// Returns field type as an UID
// -----------------------------------------------------------------------------
//    
EXPORT_C TFieldType CVasVPbkHandler::FieldTypeL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FieldTypeL" );
    
    __ASSERT_ALWAYS( iField, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    TFieldType uid = KNullUid;
    
    switch( iField->BestMatchingFieldType()->FieldTypeResId() )
        {
        case R_VPBK_FIELD_TYPE_LANDPHONEHOME:
        case R_VPBK_FIELD_TYPE_LANDPHONEWORK:
        case R_VPBK_FIELD_TYPE_LANDPHONEGEN:
            {
            uid = KUidContactFieldVCardMapVOICE;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_MOBILEPHONEHOME:
        case R_VPBK_FIELD_TYPE_MOBILEPHONEWORK:
        case R_VPBK_FIELD_TYPE_MOBILEPHONEGEN:
            {
            uid = KUidContactFieldVCardMapCELL;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_VIDEONUMBERHOME:
        case R_VPBK_FIELD_TYPE_VIDEONUMBERWORK:
        case R_VPBK_FIELD_TYPE_VIDEONUMBERGEN:
            {
            uid = KUidContactFieldVCardMapVIDEO;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_FAXNUMBERHOME:
        case R_VPBK_FIELD_TYPE_FAXNUMBERWORK:
        case R_VPBK_FIELD_TYPE_FAXNUMBERGEN:
            {
            uid = KUidContactFieldVCardMapFAX;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_VOIPHOME:
        case R_VPBK_FIELD_TYPE_VOIPWORK:
        case R_VPBK_FIELD_TYPE_VOIPGEN:
        case R_VPBK_FIELD_TYPE_IMPP:
            {
            uid = KUidContactFieldVCardMapVOIP;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_EMAILHOME:
        case R_VPBK_FIELD_TYPE_EMAILWORK:
        case R_VPBK_FIELD_TYPE_EMAILGEN:
            {
            uid = KUidContactFieldVCardMapEMAILINTERNET;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_FIRSTNAME:
            {
            uid = KUidContactFieldGivenName;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_FIRSTNAMEREADING:
            {
            uid = KUidContactFieldGivenNamePronunciation;
            break;
            } 
            
        case R_VPBK_FIELD_TYPE_LASTNAME:
            {
            uid = KUidContactFieldFamilyName;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_LASTNAMEREADING:
            {
            uid = KUidContactFieldFamilyNamePronunciation;
            break;
            }
            
        case R_VPBK_FIELD_TYPE_COMPANYNAME:
            {
            uid = KUidContactFieldCompanyName;
            break;
            }            
            
        case R_VPBK_FIELD_TYPE_SECONDNAME:
            {
            uid = KUidContactFieldSecondName;
            break;
            }
        }
    
    return uid;
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FieldIdL
// Returns field id as a phonebook id
// -----------------------------------------------------------------------------
//    
EXPORT_C TInt CVasVPbkHandler::FieldIdL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::FieldIdL" );
    
    __ASSERT_ALWAYS( iField, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    return ConvertFieldId( *iField );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::IsFieldEmptyL
// Returns information if current field is empty
// -----------------------------------------------------------------------------
//    
EXPORT_C TBool CVasVPbkHandler::IsFieldEmptyL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::IsFieldEmptyL" );
    
    __ASSERT_ALWAYS( iField, User::Leave( KErrArgument ) );
    __ASSERT_ALWAYS( !iOperation, User::Leave( KErrArgument ) );
    
    return iField->FieldData().IsEmpty();
    }    
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::StoreReady
// -----------------------------------------------------------------------------
//
void CVasVPbkHandler::StoreReady( MVPbkContactStore& /*aContactStore*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::StoreReady START" );

    iError = KErrNone;
    
    RUBY_DEBUG0( "CVasVPbkHandler::StoreReady EXIT" );
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::StoreUnavailable
// -----------------------------------------------------------------------------
//
void CVasVPbkHandler::StoreUnavailable( MVPbkContactStore& /*aContactStore*/, TInt aReason )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::StoreUnavailable START" );

    iError = aReason;
    
    RUBY_DEBUG0( "CVasVPbkHandler::StoreUnavailable EXIT" );
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::HandleStoreEventL
// -----------------------------------------------------------------------------
//
void CVasVPbkHandler::HandleStoreEventL( MVPbkContactStore& /*aContactStore*/,
                                         TVPbkContactStoreEvent aStoreEvent )
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::HandleStoreEventL" );
    
    if ( iObserver )
        {
        TPhonebookEvent event;
        event.iType = ConvertEvent( aStoreEvent );
        
        if ( aStoreEvent.iContactLink )
            {
            event.iContactId = iConverter->LinkToIdentifier( *aStoreEvent.iContactLink );
            }
        
        iObserver->HandleEventL( event );
        }
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::OpenComplete
// -----------------------------------------------------------------------------
//
void CVasVPbkHandler::OpenComplete()
    {
    RUBY_DEBUG0( "CVasVPbkHandler::OpenComplete START" );

    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::OpenComplete EXIT" );
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::VPbkSingleContactOperationComplete
// -----------------------------------------------------------------------------
//
void CVasVPbkHandler::VPbkSingleContactOperationComplete( MVPbkContactOperationBase& /*aOperation*/,
                                                          MVPbkStoreContact* aContact )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::VPbkSingleContactOperationComplete START" );

    iError = KErrNone;
    
    delete iOperation;
    iOperation = NULL;
    
    iContact = aContact;

    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::VPbkSingleContactOperationComplete EXIT" );
    }
                                                 
// -----------------------------------------------------------------------------
// CVasVPbkHandler::VPbkSingleContactOperationFailed
// -----------------------------------------------------------------------------
//                                       
 void CVasVPbkHandler::VPbkSingleContactOperationFailed( MVPbkContactOperationBase& /*aOperation*/,
                                                         TInt aError )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::VPbkSingleContactOperationFailed START" );

    iError = aError;
    
    delete iOperation;
    iOperation = NULL;
    
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::VPbkSingleContactOperationFailed EXIT" );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ContactOperationCompleted
// -----------------------------------------------------------------------------
//                                         
void CVasVPbkHandler::ContactOperationCompleted( TContactOpResult /*aResult*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactOperationCompleted START" );

    iError = KErrNone;
    
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::ContactOperationCompleted EXIT" );
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::ContactOperationFailed
// -----------------------------------------------------------------------------
//   
void CVasVPbkHandler::ContactOperationFailed( TContactOp /*aOpCode*/, TInt aErrorCode,
                                              TBool /*aErrorNotified*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactOperationFailed START" );

    iError = aErrorCode;
        
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::ContactOperationFailed EXIT" );
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::AttributeOperationComplete
// -----------------------------------------------------------------------------
//                                        
void CVasVPbkHandler::AttributeOperationComplete( MVPbkContactOperationBase& /*aOperation*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::AttributeOperationComplete START" );

    iError = KErrNone;
    
    delete iOperation;
    iOperation = NULL;

    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::AttributeOperationComplete EXIT" );
    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::AttributeOperationFailed
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::AttributeOperationFailed( MVPbkContactOperationBase& /*aOperation*/,
                                                TInt aError )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::AttributeOperationFailed START" );

    iError = aError;
    
    delete iOperation;
    iOperation = NULL;
    
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::AttributeOperationFailed EXIT" );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::StepComplete
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::StepComplete( MVPbkContactOperationBase& /*aOperation*/, TInt /*aStepSize*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::StepComplete START" );

    // Do nothing
    
    RUBY_DEBUG0( "CVasVPbkHandler::StepComplete EXIT" );
    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::StepFailed
// -----------------------------------------------------------------------------
//  
TBool CVasVPbkHandler::StepFailed( MVPbkContactOperationBase& /*aOperation*/, TInt /*aStepSize*/,
                                   TInt /*aError*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::StepFailed START" );   
    RUBY_DEBUG0( "CVasVPbkHandler::StepFailed EXIT" );
    
    return EFalse;
    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::OperationComplete
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::OperationComplete( MVPbkContactOperationBase& /*aOperation*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::OperationComplete START" );
    
    iError = KErrNone;
    
    delete iOperation;
    iOperation = NULL;
    
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::OperationComplete EXIT" );
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ContactViewReady
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::ContactViewReady( MVPbkContactViewBase& /*aView*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactViewReady START" );
    
    iError = KErrNone;
    
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::ContactViewReady EXIT" );
    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ContactViewUnavailable
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::ContactViewUnavailable( MVPbkContactViewBase& /*aView*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactViewUnavailable" );
    // Do nothing
    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ContactAddedToView
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::ContactAddedToView( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/,
                                          const MVPbkContactLink& /*aContactLink*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactViewUnavailable" );
    // Do nothing
    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ContactRemovedFromView
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::ContactRemovedFromView( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/,
                                              const MVPbkContactLink& /*aContactLink*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactViewUnavailable" );
    // Do nothing
    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ContactViewError
// -----------------------------------------------------------------------------
//  
void CVasVPbkHandler::ContactViewError( MVPbkContactViewBase& /*aView*/, TInt aError,
                                        TBool /*aErrorNotified*/ )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ContactViewReady START" );
    
    iError = aError;
    
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    
    RUBY_DEBUG0( "CVasVPbkHandler::ContactViewReady EXIT" );
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::CVasVPbkHandler
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CVasVPbkHandler::CVasVPbkHandler()
 : iError( KErrNone )
    {
    }

// -----------------------------------------------------------------------------
// CVasVPbkHandler::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CVasVPbkHandler::ConstructL()
    {
    RUBY_DEBUG_BLOCK( "CVasVPbkHandler::ConstructL" );

    }
        
// -----------------------------------------------------------------------------
// CVasVPbkHandler::SelectDefaultType
// Returns default field type for given tag
// -----------------------------------------------------------------------------
//
TVPbkDefaultType CVasVPbkHandler::SelectDefaultType( TInt aCommandType )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::SelectDefaultType START" );
    
    TVPbkDefaultType type = EVPbkDefaultTypeUndefined;
    
    switch( aCommandType )
        {
        case EDefaultCommand:
        case EMobileCommand:
        case EGeneralCommand:
        case EWorkCommand:
        case EHomeCommand:       
            {
            type = EVPbkDefaultTypePhoneNumber;
            break;
            }
    
        case EEmailCommand:
            {
            type = EVPbkDefaultTypeEmail;
            break;
            }
            
        case EVideoCommand:
            {
            type = EVPbkDefaultTypeVideoNumber;
            break;
            }
            
        case EVoipCommand:
            {
            type = EVPbkDefaultTypeVoIP;
            break;
            }
            
        case EMessageCommand:
            {
            if ( iMMSSupported )
                {
                type = EVPbkDefaultTypeMms;
                }
            else
                {
                type = EVPbkDefaultTypeSms;
                }
            break;
            }
            
        }
        
    RUBY_DEBUG0( "CVasVPbkHandler::SelectDefaultType EXIT" );
        
    return type;
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::AcceptDefaultField
// Accepts or rejects given field based on the given tag
// -----------------------------------------------------------------------------
//
TBool CVasVPbkHandler::AcceptDefaultField( MVPbkStoreContactField& aField, TInt aCommandType )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::AcceptDefaultField START" );
    
    TBool accept = ETrue;
    
    if ( aCommandType == EMobileCommand &&
         aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_MOBILEPHONEHOME &&
         aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_MOBILEPHONEWORK &&
         aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_MOBILEPHONEGEN )
        {
        accept = EFalse;
        }
    else if ( aCommandType == EGeneralCommand &&
              aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_LANDPHONEHOME &&
              aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_LANDPHONEWORK &&
              aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_LANDPHONEGEN )
        {
        accept = EFalse;
        }
    else if ( aCommandType == EWorkCommand &&
              aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_LANDPHONEWORK )
        {
        accept = EFalse;
        }
    else if ( aCommandType == EHomeCommand &&
              aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_LANDPHONEHOME )
        {
        accept = EFalse;
        }
    else if ( aCommandType == EVoipCommand &&
              aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_MOBILEPHONEGEN &&
              aField.BestMatchingFieldType()->FieldTypeResId() != R_VPBK_FIELD_TYPE_LANDPHONEGEN )
        {
        accept = EFalse;
        }
        
    RUBY_DEBUG0( "CVasVPbkHandler::AcceptDefaultField EXIT" );
        
    return accept;
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ConvertFieldId
// Converts field id to old phonebook id
// -----------------------------------------------------------------------------
//
TInt CVasVPbkHandler::ConvertFieldId( MVPbkStoreContactField& aField )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ConvertFieldId START" );
    
    TInt id = KErrNone;
    
    if ( aField.BestMatchingFieldType() )
        {
        switch( aField.BestMatchingFieldType()->FieldTypeResId() )
            {
            case R_VPBK_FIELD_TYPE_LANDPHONEGEN:
                {
                id = EPbkFieldIdPhoneNumberGeneral;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_LANDPHONEHOME:
                {
                id = EPbkFieldIdPhoneNumberHome;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_LANDPHONEWORK:
                {
                id = EPbkFieldIdPhoneNumberWork;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_MOBILEPHONEHOME:
            case R_VPBK_FIELD_TYPE_MOBILEPHONEWORK:
            case R_VPBK_FIELD_TYPE_MOBILEPHONEGEN:
                {
                id = EPbkFieldIdPhoneNumberMobile;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_VIDEONUMBERHOME:
            case R_VPBK_FIELD_TYPE_VIDEONUMBERWORK:
            case R_VPBK_FIELD_TYPE_VIDEONUMBERGEN:
                {
                id = EPbkFieldIdPhoneNumberVideo;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_FAXNUMBERHOME:
            case R_VPBK_FIELD_TYPE_FAXNUMBERWORK:
            case R_VPBK_FIELD_TYPE_FAXNUMBERGEN:
                {
                id = EPbkFieldIdFaxNumber;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_VOIPHOME:
            case R_VPBK_FIELD_TYPE_VOIPWORK:
            case R_VPBK_FIELD_TYPE_VOIPGEN:
                {
                id = EPbkFieldIdVOIP;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_IMPP:
                {
                id = EPbkFieldIdXsp;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_EMAILHOME:
            case R_VPBK_FIELD_TYPE_EMAILWORK:
            case R_VPBK_FIELD_TYPE_EMAILGEN:
                {
                id = EPbkFieldIdEmailAddress;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_FIRSTNAMEREADING:
                {
                id = EPbkFieldIdFirstNameReading;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_FIRSTNAME:
                {
                id = EPbkFieldIdFirstName;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_LASTNAMEREADING:
                {
                id = EPbkFieldIdLastNameReading;
                break;
                }
                            
            case R_VPBK_FIELD_TYPE_LASTNAME:
                {
                id = EPbkFieldIdLastName;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_COMPANYNAME:
                {
                id = EPbkFieldIdCompanyName;
                break;
                }
                
            case R_VPBK_FIELD_TYPE_SECONDNAME:
                {
                id = EPbkFieldIdSecondName;
                break;
                }
            }
        }
    else
        {
        RUBY_DEBUG0( "aField.BestMatchingFieldType() returned NULL" );
        }
        
    RUBY_DEBUG0( "CVasVPbkHandler::ConvertFieldId EXIT" );
        
    return id;
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::ConvertEvent
// Converts contact event type
// -----------------------------------------------------------------------------
//
TVasContactEvent CVasVPbkHandler::ConvertEvent( const TVPbkContactStoreEvent& aEvent )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::ConvertEvent START" );
   
    TVasContactEvent event;
    
    switch( aEvent.iEventType )
        {
        case ENullEvent:       
            {
            event = ENullEvent;
            break;
            }
    
        case EContactChanged:
            {
            event = EContactChanged;
            break;
            }
            
        case EContactDeleted:
            {
            event = EContactDeleted;
            break;
            }
            
        case EContactAdded:
            {
            event = EContactAdded;
            break;
            }
            
        case EUnknownChanges:
            {
            event = EUnknownChanges;
            break;
            }
            
        case EGroupAdded:       
            {
            event = EGroupAdded;
            break;
            }
    
        case EGroupChanged:
            {
            event = EGroupChanged;
            break;
            }
            
        case EGroupDeleted:
            {
            event = EGroupDeleted;
            break;
            }
            
        case EStoreBackupBeginning:
            {
            event = EStoreBackupBeginning;
            break;
            }
            
        case EStoreRestoreBeginning:
            {
            event = EStoreRestoreBeginning;
            break;
            }
            
        case EStoreBackupRestoreCompleted:
            {
            event = EStoreBackupRestoreCompleted;
            break;
            }
        
        default:
            {
            event = ENotSupported;
            break;
            }
        }
    RUBY_DEBUG0( "CVasVPbkHandler::ConvertEvent EXIT" );
        
    return event;
    }
    
// -----------------------------------------------------------------------------
// CVasVPbkHandler::FieldPriority
// Gets the priority of the given field
// -----------------------------------------------------------------------------
//
TInt CVasVPbkHandler::FieldPriority( MVPbkStoreContactField& aField )
    {
    RUBY_DEBUG0( "CVasVPbkHandler::FieldPriority START" );
    
    TInt priority = KFieldPriorityCount;
    
    for ( int i = 0; i < KFieldPriorityCount; ++i )
        {
        if ( aField.BestMatchingFieldType()->FieldTypeResId() == KFieldPriority[ i ] )
            {
            priority = i;
            break;
            }
        }
    RUBY_DEBUG0( "CVasVPbkHandler::FieldPriority EXIT" );
    
    return priority;
    }

//  End of File