phonebookui/Phonebook2/ccapplication/ccapp/ccapputil/src/ccacmscontactfetcherwrapper.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ccapplication/ccapp/ccapputil/src/ccacmscontactfetcherwrapper.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,719 @@
+/*
+* Copyright (c) 2007-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:  Wrapper for CMS contact fetching
+*
+*/
+
+
+#include "ccapputilheaders.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::CCCAppCmsContactFetcherWrapper
+// --------------------------------------------------------------------------
+//
+CCCAppCmsContactFetcherWrapper::CCCAppCmsContactFetcherWrapper( 
+    CCCAParameter* aParameter, TWrapperParam aWrapperParam ):
+    CActive( EPriorityStandard ),
+    iParameter( aParameter ),
+    iHandlerState( EInitial ),
+    iErrorsOccured( KErrNone ),
+    iRefCount( 1 ),
+    iWrapperParam( aWrapperParam )
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("CCCAppCmsContactFetcherWrapper()"));
+    CActiveScheduler::Add( this );
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::~CCCAppCmsContactFetcherWrapper
+// --------------------------------------------------------------------------
+//
+CCCAppCmsContactFetcherWrapper::~CCCAppCmsContactFetcherWrapper()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("~CCCAppCmsContactFetcherWrapper()"));
+    Cancel();
+    iCmsContactDataFetcher.Close();
+    iCmsSession.Close();
+    iContactFieldsArray.ResetAndDestroy();
+    iContactFieldsArray.Close();
+    iObservers.Close();
+    delete iContactInfo;
+    //iParameter, iObservers taken care elsewhere
+    }
+    
+ // ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::Release()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCCAppCmsContactFetcherWrapper::Release()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::Release"));
+    
+    TAny* tlsPtr = Dll::Tls();
+ 
+    CCCAppCmsContactFetcherWrapper* self = static_cast<CCCAppCmsContactFetcherWrapper*>( tlsPtr );
+    if ( 0 == --self->iRefCount )
+        {
+        CCA_DP(KCCAppUtilLogFile, CCA_L("::Release - last instance, will be deleted"));
+        Dll::FreeTls();
+        delete self;
+        }
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::Release"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::CreateInstanceL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CCCAppCmsContactFetcherWrapper* CCCAppCmsContactFetcherWrapper::CreateInstanceL(
+    CCCAParameter* aParameter, TWrapperParam aWrapperParam )
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::CreateInstanceL"));
+
+    CCCAppCmsContactFetcherWrapper* self = NULL;
+    TAny* tlsPtr = Dll::Tls();
+    if ( NULL == tlsPtr )
+        {
+        CCA_DP(KCCAppUtilLogFile, CCA_L("::CreateInstanceL - not found, create new"));
+        self = new( ELeave ) CCCAppCmsContactFetcherWrapper( aParameter, aWrapperParam );
+        CleanupStack::PushL( self );
+        self->ConstructL( );
+        User::LeaveIfError( Dll::SetTls( self ) );
+        CleanupStack::Pop( self );
+        }
+    else
+        {
+        CCA_DP(KCCAppUtilLogFile, CCA_L("::CreateInstanceL - already existing"));
+        User::Leave( KErrAlreadyExists );
+        }
+
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::CreateInstanceL"));
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::ConstructL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::ConstructL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::ConstructL()"));
+
+    // The setting of default number is disabled when opening CCA for better performance 
+    TRAPD( err, StartFetcherL( EFalse ));
+    // problem can either be with connecting to CMS or with opening the contact
+    iErrorsOccured = err;
+
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::ConstructL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::InstanceL
+// --------------------------------------------------------------------------
+//  
+EXPORT_C CCCAppCmsContactFetcherWrapper* CCCAppCmsContactFetcherWrapper::InstanceL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::InstanceL()"));
+
+    CCCAppCmsContactFetcherWrapper* self = NULL;
+    TAny* tlsPtr = Dll::Tls();
+    if ( NULL == tlsPtr )
+        {
+        CCA_DP(KCCAppUtilLogFile, CCA_L("::HandleL() - singleton not created yet!"));
+        User::Leave( KErrNotFound );
+        }
+    else
+        {
+        self = static_cast<CCCAppCmsContactFetcherWrapper*>( tlsPtr );
+        ++self->iRefCount;
+        }
+
+    CCA_DP(KCCAppUtilLogFile, CCA_L("::InstanceL - iRefCount: %d"), self->iRefCount );
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::InstanceL()"));
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::StartFetcherL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::StartFetcherL( TBool aSetDefault )
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::StartFetcherL()"));
+    User::LeaveIfError( iCmsSession.Connect() );
+    
+    OpenContactL();
+    
+    if ( aSetDefault )
+    	{
+    	SetDefaultForVoiceCallL();
+    	}
+    else
+    	{
+    	StartAsyncFetchingL();
+    	}
+    
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::StartFetcherL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::StartAsyncFetchingL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::StartAsyncFetchingL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::StartAsyncFetchingL()"));
+
+    if ( iWrapperParam & EFindContactFromOtherStores )
+        FindFromOtherStoresL();
+    else
+        FetchContactInfoL();
+
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::StartAsyncFetchingL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::AddObserverL
+// --------------------------------------------------------------------------
+//  
+EXPORT_C void CCCAppCmsContactFetcherWrapper::AddObserverL( 
+    MCCAppContactFieldDataObserver& aObserver )
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::AddObserverL()"));
+    const TInt index = iObservers.Find( &aObserver );
+    if ( KErrNotFound == index )
+        {
+        iObservers.AppendL( &aObserver );
+        }
+
+    if ( iErrorsOccured )
+        {// errors happened already
+        aObserver.ContactFieldDataObserverHandleErrorL( 
+            iHandlerState, iErrorsOccured );
+        }
+        
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::AddObserverL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::RemoveObserver
+// --------------------------------------------------------------------------
+//  
+EXPORT_C void CCCAppCmsContactFetcherWrapper::RemoveObserver(
+    MCCAppContactFieldDataObserver& aObserver )
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::RemoveObserverL()"));
+    CCA_DP(KCCAppUtilLogFile, CCA_L("::RemoveObserverL - amount of observers: %d"), iObservers.Count() );
+    const TInt index = iObservers.Find( &aObserver );
+    if ( KErrNotFound != index )
+        {
+        iObservers.Remove( index );
+        CCA_DP( KCCAppUtilLogFile, CCA_L("::RemoveObserverL - observer found & removed: %d"), index );
+        }
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::RemoveObserverL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::IsServiceAvailable
+// --------------------------------------------------------------------------
+// 
+EXPORT_C TInt CCCAppCmsContactFetcherWrapper::IsServiceAvailable(
+    VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aContactAction )
+    {
+    return iCmsContactDataFetcher.IsServiceAvailable( aContactAction );
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::ContactStore
+// --------------------------------------------------------------------------
+// 
+EXPORT_C TCmsContactStore CCCAppCmsContactFetcherWrapper::ContactStore() const
+    {
+    return iCmsContactDataFetcher.ContactStore();
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::GetContactActionFieldCount
+// --------------------------------------------------------------------------
+// 
+EXPORT_C TInt CCCAppCmsContactFetcherWrapper::GetContactActionFieldCount(
+        VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aContactAction)
+    {
+    return iCmsContactDataFetcher.GetContactActionFieldCount(aContactAction);
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::OpenContactL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::OpenContactL()
+    {                    
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::OpenContactL()"));
+    iHandlerState = EOpeningContact;
+    switch( iParameter->ContactDataFlag())
+        {
+        case MCCAParameter::EContactId:
+            {
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::OpenContactL() EContactId"));
+            User::LeaveIfError( iCmsContactDataFetcher.Open(
+                iCmsSession, iParameter->ContactIdL()));
+            }
+            break;
+        case MCCAParameter::EContactLink:
+            {
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::OpenContactL() EContactLink"));
+            HBufC8* contactlink = iParameter->ContactLinkL();
+            CleanupStack::PushL( contactlink );
+            User::LeaveIfError( iCmsContactDataFetcher.Open( 
+                iCmsSession, *contactlink));
+            CleanupStack::PopAndDestroy( contactlink );            
+            }
+            break;
+        case MCCAParameter::EContactMSISDN:
+            {
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::OpenContactL() EContactMSISDN"));
+            User::LeaveIfError( iCmsContactDataFetcher.Open( 
+                iCmsSession, iParameter->ContactDataL()));                                    
+            }
+            break;
+        //case MCCAParameter::EContactEmail:// fallthrough
+        default:
+            {
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::OpenContactL() unknown type, will leave.."));
+            User::Leave( KErrNotSupported );
+            }
+            break;
+        }
+    iCmsContactDataFetcher.OrderNotificationsL(this, CCmsContactFieldItem::ECmsPhonebookNotification);
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::OpenContactL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::RunL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::RunL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::RunL()"));
+    CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL: iStatus: %d"), iStatus.Int() );
+           
+    switch( iHandlerState )
+        {
+        case ESettingVoiceCallDefault:
+        	{
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() iHandlerState == ESettingVoiceCallDefault"));
+            StartAsyncFetchingL();
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() ESettingVoiceCallDefault completed"));
+        	}
+        	break;
+        case EFindingFromOtherStores:
+            {
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() iHandlerState == EFindingFromOtherStores"));
+            FetchContactInfoL();
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() EFindingFromOtherStores completed"));
+            }
+            break;        
+        case ELoadingEnabledFields:
+            {
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() iHandlerState == ELoadingEnabledFields"));
+            HandleContactInfoUpdateL();
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() ELoadingEnabledFields completed"));
+            }
+            break;
+        case ELoadingFields:
+            {
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() iHandlerState == ELoadingField"));
+            HandleContactDataFieldUpdateL();
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() ELoadingField completed"));
+            }
+            break;
+        default:
+            {
+            // error situation - should not come here
+            CCA_DP(KCCAppUtilLogFile, CCA_L("::RunL() iHandlerState not found, will leave.."));
+            // error notification done in RunError
+            User::Leave( KErrGeneral );
+            }
+            break;
+        }
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::RunL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::RunError
+// --------------------------------------------------------------------------
+//
+TInt CCCAppCmsContactFetcherWrapper::RunError( TInt aError )
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("CCCAppCmsContactFetcherWrapper::RunError: aError: %d"), aError );
+    iErrorsOccured = aError;
+    TRAP_IGNORE( NotifyErrorL() );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::NotifyErrorL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::NotifyErrorL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::NotifyErrorL()"));
+    const TInt count = iObservers.Count();
+    CCA_DP( KCCAppUtilLogFile, CCA_L("::NotifyErrorL - amount of observers: %d"), count );
+    for ( TInt i = 0; i < count; i++ )
+        {
+        TRAP_IGNORE( iObservers[ i ]->ContactFieldDataObserverHandleErrorL( 
+            iHandlerState, iErrorsOccured ));
+        } 
+
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::NotifyErrorL()"));
+    }
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::SetDefaultForVoiceCallL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::SetDefaultForVoiceCallL()
+	{
+	CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::SetDefaultForVoiceCallL()"));
+	
+	iHandlerState = ESettingVoiceCallDefault;	
+    iStatus = KRequestPending;
+  
+    iCmsContactDataFetcher.SetVoiceCallDefault( iStatus );
+    SetActive();
+    
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::SetDefaultForVoiceCallL()"));
+	}
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::DoCancel
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::DoCancel()
+    {
+    if( IsActive() )
+        {// CMS Client doesn't know the operation to be cancelled
+        if ( EFindingFromOtherStores == iHandlerState )
+            {
+            iCmsContactDataFetcher.CancelExternalContactFind();
+            }        
+        else if ( ELoadingEnabledFields == iHandlerState && iContactInfo )
+            {
+            iCmsContactDataFetcher.Cancel( *iContactInfo );
+            delete iContactInfo;
+            iContactInfo = NULL;
+            }
+        else if ( ELoadingFields == iHandlerState && iContactField )
+            {
+            iCmsContactDataFetcher.Cancel( *iContactField );
+            delete iContactField;
+            iContactField = NULL;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::FindFromOtherStoresL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::FindFromOtherStoresL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::FindFromOtherStoresL()"));
+
+    iHandlerState = EFindingFromOtherStores;
+    iStatus = KRequestPending;
+    
+    iCmsContactDataFetcher.FindExternalContact( iStatus );
+    SetActive();
+    
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::FindFromOtherStoresL()"));
+    };
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::FetchContactInfoL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::FetchContactInfoL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::FetchEnabledFieldsL()"));
+
+    iHandlerState = ELoadingEnabledFields;
+    iStatus = KRequestPending;
+    
+    iContactInfo = iCmsContactDataFetcher.EnabledFieldsL( iStatus );
+    SetActive();
+    
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::FetchEnabledFieldsL()"));
+    };
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::HandleContactInfoUpdateL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::HandleContactInfoUpdateL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::HandleContactInfoUpdateL()"));
+
+    //error check
+    const TInt err = iStatus.Int();
+    if ( KErrNone != err )
+        {
+        // cleanup
+        delete iContactInfo;
+        iContactInfo = NULL;
+        User::Leave( err );    
+        }
+
+    const TInt count = iObservers.Count();
+    CCA_DP( KCCAppUtilLogFile, CCA_L("::HandleContactInfoUpdateL - amount of observers: %d"), count );
+    MCCAppContactFieldDataObserver::TParameter param = MCCAppContactFieldDataObserver::TParameter();
+    param.iType = MCCAppContactFieldDataObserver::TParameter::EContactInfoAvailable;
+    param.iContactInfo = iContactInfo;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        TRAP_IGNORE( iObservers[ i ]->ContactFieldDataObserverNotifyL( param ));
+        }    
+    
+    iHandlerState = ELoadingFields;
+    iContactDataFetchingIndex = 0;
+    StartContactDataFieldFetchingL();
+
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::HandleContactInfoUpdateL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::StartContactDataFieldFetchingL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::StartContactDataFieldFetchingL()
+    {                    
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::StartContactDataFieldFetchingL()"));
+    TInt dataFieldCount = iContactInfo->Fields().Count();
+    CCA_DP(KCCAppUtilLogFile, CCA_L("::StartContactDataFieldFetchingL amount of fields to be fetched = %d"), dataFieldCount );
+
+    if ( dataFieldCount )
+        {// start fetching
+        FetchContactDataFieldL();
+        }
+    else
+        {// nothing to fetch
+        iHandlerState = EOperationsCompleted;
+        //todo; do we need a error-callback to notify the error cases?
+        }    
+
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::StartContactDataFieldFetchingL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::FetchContactDataFieldL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::FetchContactDataFieldL()
+    {                    
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::FetchContactDataFieldL()"));
+    iStatus = KRequestPending;
+
+    const RArray<CCmsContactFieldItem::TCmsContactField>& enabledFields =
+         iContactInfo->Fields();//not owned
+
+    iContactField = NULL;
+    iContactField = iCmsContactDataFetcher.FieldDataL( 
+        iStatus, enabledFields[ iContactDataFetchingIndex ]);
+  
+    SetActive();
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::FetchContactDataFieldL()"));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::HandleContactDataFieldUpdateL
+// --------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::HandleContactDataFieldUpdateL()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("->CCCAppCmsContactFetcherWrapper::HandleContactDataFieldUpdateL()"));
+    CCA_DP(KCCAppUtilLogFile, CCA_L("::HandleContactDataFieldUpdateL fetched field type: %d"), (TInt)iContactField->Type() );
+    
+    TBool moreToFetch = iContactDataFetchingIndex < iContactInfo->Fields().Count() - 1;
+    
+    // error check
+    if ( KErrNone == iStatus.Int() )
+        {// update observers only if fetch was succesful
+        iContactFieldsArray.AppendL( iContactField );
+        const TInt count = iObservers.Count();
+        CCA_DP( KCCAppUtilLogFile, CCA_L("::HandleContactDataFieldUpdateL - amount of observers: %d"), count );
+
+        MCCAppContactFieldDataObserver::TParameter param = MCCAppContactFieldDataObserver::TParameter();
+        param.iType = MCCAppContactFieldDataObserver::TParameter::EContactDataFieldAvailable;
+        param.iContactField = iContactField;
+        param.iStatusFlag = ( moreToFetch ? 0 : CCCAppCmsContactFetcherWrapper::EOperationsCompleted );
+
+        for ( TInt i = 0; i < count; i++ )
+            {
+            TRAP_IGNORE( iObservers[ i ]->ContactFieldDataObserverNotifyL( param ));
+            }
+        }
+    else
+        {// ..otherwise cleanup
+        delete iContactField;
+        iContactField = NULL;
+        // Notify error, but do not leave
+        // since there might be other fetchable
+        // fields..
+        TRAP_IGNORE( NotifyErrorL() );
+        }
+
+    // more fields to fetch or all already fetched?
+    if ( moreToFetch )
+        {
+        CCA_DP(KCCAppUtilLogFile, CCA_L("::HandleContactDataFieldUpdateL() continue, fetch next field"));
+        iContactDataFetchingIndex++;
+        FetchContactDataFieldL();
+        }
+    else
+        {
+        CCA_DP(KCCAppUtilLogFile, CCA_L("::HandleContactDataFieldUpdateL() complete, all fields fetched"));
+        iContactDataFetchingIndex = KErrNotFound;
+        iHandlerState = EOperationsCompleted;
+        iCmsContactDataFetcher.OrderNotificationsL(this, CCmsContactFieldItem::ECmsPresenceAllNotification);
+        }        
+    CCA_DP(KCCAppUtilLogFile, CCA_L("<-CCCAppCmsContactFetcherWrapper::HandleContactDataFieldUpdateL()"));
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::ContactFieldDataArray
+// ---------------------------------------------------------------------------
+//
+EXPORT_C RPointerArray<CCmsContactField>& CCCAppCmsContactFetcherWrapper::ContactFieldDataArray()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("CCCAppCmsContactFetcherWrapper::ContactFieldDataArray()"));    
+    return iContactFieldsArray;
+    }
+    
+// ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::ContactInfo
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const CCmsContactFieldInfo* CCCAppCmsContactFetcherWrapper::ContactInfo()
+    {
+    CCA_DP(KCCAppUtilLogFile, CCA_L("CCCAppCmsContactFetcherWrapper::ContactInfo()"));    
+    
+    if ( ELoadingEnabledFields == iHandlerState || EInitial  == iHandlerState ) 
+        return NULL;
+    else
+        return iContactInfo;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::ContactIdentifierLC
+// ---------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CCCAppCmsContactFetcherWrapper::ContactIdentifierLC()
+    {
+    HBufC8* buf8 = iCmsContactDataFetcher.GetContactIdentifierL();
+    CleanupStack::PushL( buf8 );
+    return buf8;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::HandlePresenceNotificationL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::HandlePresenceNotificationL( CCmsContactField* aField )
+    {
+    CleanupStack::PushL(aField);
+    MCCAppContactFieldDataObserver::TParameter param = MCCAppContactFieldDataObserver::TParameter();
+    param.iType = MCCAppContactFieldDataObserver::TParameter::EContactPresenceChanged;
+    param.iContactField = aField;
+    const TInt count = iObservers.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        TRAP_IGNORE( iObservers[ i ]->ContactFieldDataObserverNotifyL( param ));
+        }
+    if (iContactFieldsArray.Find(aField) == KErrNotFound)
+        {
+        iContactFieldsArray.Append(aField);
+        }
+    CleanupStack::Pop(aField);
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::HandlePhonebookNotificationL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCmsContactFetcherWrapper::HandlePhonebookNotificationL( TCmsPhonebookEvent aNotificationType )
+    {
+    if (aNotificationType == ECmsContactModified)
+        {
+        MCCAppContactFieldDataObserver::TParameter param = MCCAppContactFieldDataObserver::TParameter();
+        param.iType = MCCAppContactFieldDataObserver::TParameter::EContactsChanged;
+        const TInt count = iObservers.Count();
+        for ( TInt i = 0; i < count; i++ )
+            {
+            TRAP_IGNORE( iObservers[ i ]->ContactFieldDataObserverNotifyL( param ));
+            }
+        Cancel();
+        iCmsContactDataFetcher.CancelNotifications(CCmsContactFieldItem::ECmsPresenceAllNotification);
+        iContactFieldsArray.ResetAndDestroy();
+        delete iContactInfo;
+        iContactInfo = NULL;
+        StartAsyncFetchingL();
+        }
+    else if (aNotificationType == ECmsContactDeleted)
+        {
+        MCCAppContactFieldDataObserver::TParameter param = MCCAppContactFieldDataObserver::TParameter();
+        param.iType = MCCAppContactFieldDataObserver::TParameter::EContactDeleted;
+        const TInt count = iObservers.Count();
+        for ( TInt i = 0; i < count; i++ )
+            {
+            TRAP_IGNORE( iObservers[ i ]->ContactFieldDataObserverNotifyL( param ));
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::CmsNotificationTerminatedL
+// ---------------------------------------------------------------------------
+// 
+void CCCAppCmsContactFetcherWrapper::CmsNotificationTerminatedL( TInt /*aStatus*/, 
+    CCmsContactFieldItem::TCmsContactNotification /*aNotificationType*/ )
+    {
+    
+    }
+
+void CCCAppCmsContactFetcherWrapper::RefetchContactL()
+    {
+    Cancel();
+    iContactFieldsArray.ResetAndDestroy();
+    if (iContactInfo)
+        {
+        delete iContactInfo;
+        iContactInfo = NULL;
+        }
+    iCmsContactDataFetcher.Close();
+    iWrapperParam = EFindContactFromOtherStores;
+        
+    StartFetcherL();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCmsContactFetcherWrapper::IsTopContact
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CCCAppCmsContactFetcherWrapper::IsTopContact()
+    {
+    return iCmsContactDataFetcher.IsTopContact();        
+    }
+
+// End of file