meetingrequest/mrguicommon/src/cesmrcontactmenuhandler.cpp
branchRCL_3
changeset 16 4ce476e64c59
child 24 b5fbb9b25d57
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrguicommon/src/cesmrcontactmenuhandler.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -0,0 +1,759 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Implementation of class CESMRContactMenuHandler.
+*
+*/
+
+
+#include "emailtrace.h"
+#include "cesmrcontactmenuhandler.h"
+#include "cesmrcontactmenuurlhandler.h"
+#include "mmrcontactmenuobserver.h"
+
+#include <cvpbkcontactmanager.h>
+#include <cvpbkcontactlinkarray.h>
+#include <mvpbkcontactstorelist.h>
+#include <mvpbkcontactstore.h>
+#include <mvpbkcontactstoreproperties.h>
+#include <mvpbkstorecontact.h>
+#include <mvpbkfieldtype.h>
+#include <mvpbkcontactoperationbase.h>
+#include <mvpbkcontactfieldtextdata.h>
+#include <tvpbkfieldversitproperty.h>
+#include <cvpbkfieldtyperefslist.h>
+
+//<cmail>
+#include "cfsccontactactionservice.h"
+#include "cfsccontactactionmenu.h"
+#include "tfsccontactactionqueryresult.h"
+#include "tfsccontactactionvisibility.h"
+#include "mfsccontactaction.h"
+#include "mfsccontactactionmenumodel.h"
+
+#include <cvpbkfieldtypeiterator.h>
+#include <cvpbkfieldtypeselector.h>
+#include <vpbkeng.rsg>
+
+#include <esmrgui.rsg>
+#include "esmrcommands.h"
+//</cmail>
+#include <eikenv.h>
+#include <eikmenup.h>
+#include <commonphoneparser.h>
+// <cmail> Removed profiling. </cmail>
+
+/// Unnamed namespace for local definitions
+namespace{ // codescanner::namespace
+
+const TInt KGranularity( 8 );
+
+}//namespace
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::CESMRContactMenuHandler( )
+// ---------------------------------------------------------------------------
+//
+CESMRContactMenuHandler::CESMRContactMenuHandler( 
+		CESMRContactManagerHandler& aContactManagerHandler ):
+    iContactManagerHandler( aContactManagerHandler ), 
+    iContactActionList( KGranularity )
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::NewL( )
+// ---------------------------------------------------------------------------
+//
+CESMRContactMenuHandler* CESMRContactMenuHandler::NewL( 
+		CESMRContactManagerHandler& aContactManagerHandler )
+    {
+    FUNC_LOG;
+    CESMRContactMenuHandler* self = new (ELeave) CESMRContactMenuHandler( 
+													aContactManagerHandler );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::ConstructL( )
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::ConstructL( )
+    {
+    FUNC_LOG;
+    
+    CVPbkContactManager& contactManager =
+            iContactManagerHandler.GetContactManager();
+    
+    iContactActionService = CFscContactActionService::NewL( contactManager );
+    iContactActionMenu = CFscContactActionMenu::NewL( *iContactActionService );
+
+    iContactMenuUrlHandler
+            = CESMRContactMenuUrlHandler::NewL( *iContactActionMenu );
+
+    if ( iContactManagerHandler.IsReady() )
+        {
+        iContactManagerReady = ETrue;
+        }
+    else
+        {
+        iContactManagerHandler.AddObserverL ( this );
+        }
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::~CESMRContactMenuHandler( )
+// ---------------------------------------------------------------------------
+//
+CESMRContactMenuHandler::~CESMRContactMenuHandler( )
+    {
+    FUNC_LOG;
+    iStoreContactList.ResetAndDestroy();
+    delete iFindResultsArray;
+    delete iContactMenuUrlHandler;    
+
+    delete iContactOperationBase;
+    delete iContactActionMenu;
+    delete iContactActionService;
+    delete iValue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::OptionsMenuAvailable( )
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRContactMenuHandler::OptionsMenuAvailable( )
+    {
+    FUNC_LOG;
+    return iOptionsMenuReady || iContactMenuUrlHandler->OptionsMenuAvailable( );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::InitOptionsMenuL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRContactMenuHandler::InitOptionsMenuL(
+		CEikMenuPane* aActionMenuPane )
+    {
+    FUNC_LOG;
+    switch ( iValueType )
+        {
+        case EValueTypeEmail: // Fall through
+        case EValueTypePhoneNumber:
+            {
+            // Add actions to options / actions submenu
+            const TInt count(iContactActionList.Count());
+            for ( TInt i = 0; i < count; ++i )
+                {
+                CEikMenuPaneItem::SData data;
+                data.iFlags = 0;
+                data.iCascadeId = 0;
+                data.iCommandId = EESMRCmdActionMenuFirst + i;
+                data.iText = iContactActionList[i].iAction->ActionMenuText();
+                aActionMenuPane->AddMenuItemL( data );
+
+                aActionMenuPane->SetItemDimmed( 
+                		data.iCommandId,
+                        iContactActionList[i].iOptionsMenuVisibility.iVisibility
+                        == TFscContactActionVisibility::EFscActionDimmed );
+                }
+            break;
+            }
+        case EValueTypeURL:
+            {
+            iContactMenuUrlHandler->InitOptionsMenuL( aActionMenuPane );
+            break;
+            }  
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::ExecuteOptionsMenuL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRContactMenuHandler::ExecuteOptionsMenuL( TInt aCommand )
+    {
+    FUNC_LOG;
+    switch ( iValueType )
+        {
+        case EValueTypeEmail: // Fall through
+        case EValueTypePhoneNumber:
+            {
+            TInt index = aCommand - EESMRCmdActionMenuFirst;
+            if ( index >= 0 && index < iContactActionList.Count() )
+                {
+                TUid uid = iContactActionList[index].iAction->Uid();
+                iContactActionService->ExecuteL( uid, this );
+                }
+            break;
+            }
+        case EValueTypeURL:
+            {
+            iContactMenuUrlHandler->ExecuteOptionsMenuL( aCommand );
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::Reset( )
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRContactMenuHandler::Reset( )
+    {
+    FUNC_LOG;
+    delete iContactOperationBase;
+    iContactOperationBase = NULL;
+
+    delete iFindResultsArray;
+    iFindResultsArray = NULL;
+
+    iContactMenuUrlHandler->Reset();
+    
+    iContactActionMenu->Model().RemoveAll();
+    
+    delete iValue;
+    iValue = NULL;
+    iValueType = EValueTypeNone;
+    
+    iContactActionList.Reset();
+    iStoreContactList.ResetAndDestroy();
+    iActionMenuReady = EFalse;
+    iOptionsMenuReady = EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::SetValueL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRContactMenuHandler::SetValueL(
+        const TDesC& aValue, TValueType aValueType )
+    {
+    FUNC_LOG;
+    Reset();
+
+    if ( aValueType == EValueTypeURL )
+        {
+        iContactMenuUrlHandler->SetUrlL( aValue );
+        iValueType = aValueType;
+        }
+    else if ( aValueType != EValueTypeNone )
+        {
+        iValue = aValue.AllocL();
+        iValueType = aValueType;
+        if ( iContactManagerReady )
+            {
+            SearchContactL();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::SetContactMenuObserver()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRContactMenuHandler::SetContactMenuObserver(
+        MMRContactMenuObserver* aObserver )
+    {
+    iContactMenuObserver = aObserver;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::SetCommandObserver()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRContactMenuHandler::SetCommandObserver(
+            MEikCommandObserver* aCommandObserver )
+    {
+    FUNC_LOG;
+    iCommandObserver = aCommandObserver;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::ShowActionMenuL( )
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRContactMenuHandler::ShowActionMenuL( )
+    {
+    FUNC_LOG;
+    if ( iValueType == EValueTypeURL )
+        {
+        iContactMenuUrlHandler->ShowActionMenuL();
+        }  
+    else if ( iActionMenuReady )
+        {
+        iContactActionMenu->ExecuteL( );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::VerifyContactDetailsL
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::VerifyContactDetailsL()
+    {
+    FUNC_LOG;
+    if ( iFindResultsArrayIndex < iFindResultsArray->Count() )
+        {
+        CVPbkContactManager& contactManager =
+                iContactManagerHandler.GetContactManager();
+
+        iContactOperationBase =
+            contactManager.RetrieveContactL( 
+            		iFindResultsArray->At( iFindResultsArrayIndex ), 
+            		*this );
+        }
+    else
+        {
+        delete iFindResultsArray;
+        iFindResultsArray = NULL;
+
+        if ( iStoreContactList.Count() > 0 )
+            {
+            iContactActionService->SetContactSetL( iStoreContactList );
+            iContactActionService->QueryActionsL( this );
+            }
+        else
+            {
+            CreateContactL ( );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::ContactManagerReady( )
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::ContactManagerReady( )
+    {
+    FUNC_LOG;
+    iContactManagerReady = ETrue;
+    iContactManagerHandler.RemoveObserver( this );
+    if ( iValue )
+        {
+        TRAP_IGNORE( SearchContactL() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::VPbkSingleContactOperationComplete
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::VPbkSingleContactOperationComplete(
+        MVPbkContactOperationBase& /*aOperation*/,
+        MVPbkStoreContact* aContact )
+    {
+    FUNC_LOG;
+    delete iContactOperationBase;
+    iContactOperationBase = NULL;
+
+    MVPbkStoreContactFieldCollection& fieldCollection =
+        aContact->Fields();
+
+    TBool valueMatchFound = EFalse;
+    const TInt count(fieldCollection.FieldCount());
+    for ( TInt i = 0; valueMatchFound == EFalse && i < count; ++i )
+        {
+        MVPbkStoreContactField& contactField = fieldCollection.FieldAt( i );
+        MVPbkContactFieldData& fieldData = contactField.FieldData();
+        if ( fieldData.DataType() == EVPbkFieldStorageTypeText )
+            {
+            MVPbkContactFieldTextData& fieldTextData =
+                MVPbkContactFieldTextData::Cast( fieldData );
+
+            if ( fieldTextData.Text().CompareF( *iValue ) == 0 )
+                {
+                valueMatchFound = ETrue;
+                }
+            }
+        }
+
+    if ( valueMatchFound )
+        {
+        TRAP_IGNORE( iStoreContactList.AppendL( aContact ) );
+        }
+    else
+        {
+        delete aContact;
+        }
+
+    ++iFindResultsArrayIndex;
+    TRAPD( err, VerifyContactDetailsL() );
+    if ( err != KErrNone )
+        {
+        Reset();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::VPbkSingleContactOperationFailed
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::VPbkSingleContactOperationFailed(
+        MVPbkContactOperationBase& /*aOperation*/,
+        TInt /*aError*/ )
+    {
+    FUNC_LOG;
+    delete iContactOperationBase;
+    iContactOperationBase = NULL;
+
+    ++iFindResultsArrayIndex;
+    TRAPD( err, VerifyContactDetailsL() );
+    if ( err != KErrNone )
+        {
+        Reset();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::FindCompleteL
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::FindCompleteL( MVPbkContactLinkArray* aResults )
+    {
+    FUNC_LOG;
+    delete iContactOperationBase;
+    iContactOperationBase = NULL;
+
+    iStoreContactList.ResetAndDestroy();
+    iFindResultsArray = aResults;
+    iFindResultsArrayIndex = 0;
+
+    VerifyContactDetailsL();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::FindFailed
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::FindFailed( TInt /*aError*/)
+    {
+    FUNC_LOG;
+    delete iContactOperationBase;
+    iContactOperationBase = NULL;
+
+    Reset ( );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::QueryActionsComplete( )
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::QueryActionsComplete( )
+    {
+    FUNC_LOG;
+    const CFscContactActionList& actionList =
+            iContactActionService->QueryResults();
+
+    // Add visible actions to local contact action list for
+    // options menu / actions.
+    const TInt count(actionList.Count());
+    for ( TInt i = 0; i < count; ++i )
+        {
+        TFscContactActionVisibility::TVisibility visibility =
+                actionList[i].iOptionsMenuVisibility.iVisibility;
+        if ( visibility == TFscContactActionVisibility::EFscActionVisible ||
+             visibility == TFscContactActionVisibility::EFscActionDimmed )
+            {
+            TRAP_IGNORE( iContactActionList.AppendL( actionList.At(i) ) );
+            }
+        }
+
+    const TInt count2(iContactActionList.Count());
+    for ( TInt i = 0; i < count2; ++i )
+        {
+        iContactActionList[i].iPriority = -iContactActionList[i].iPriority;
+        }
+
+    // Sort local list of actions by priority.
+    TKeyArrayFix sortKey( _FOFF( TFscContactActionQueryResult, // codescanner::foff
+                                 iPriority ),
+                          ECmpTInt);
+    iContactActionList.Sort( sortKey );
+
+    // Enable options menu / actions if there are actions available.
+    iOptionsMenuReady = iContactActionList.Count() > 0;
+
+    // Initialize contact action menu and enable it.
+    TRAPD( error, iContactActionMenu->Model().AddPreQueriedCasItemsL ( ) );
+    if ( error != KErrNone )
+        {
+        iActionMenuReady = EFalse;
+        }
+    else
+        {
+        iActionMenuReady = ETrue;
+        }
+    
+    if ( iContactMenuObserver )
+        {
+        iContactMenuObserver->ContactActionQueryComplete();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::QueryActionsFailed
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::QueryActionsFailed( TInt /*aError*/)
+    {
+    FUNC_LOG;
+    Reset();
+
+    if ( iContactMenuObserver )
+        {
+        iContactMenuObserver->ContactActionQueryComplete();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::ExecuteComplete( )
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::ExecuteComplete( )
+    {
+    FUNC_LOG;
+    // Do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::ExecuteFailed
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::ExecuteFailed( TInt /*aError*/)
+    {
+    FUNC_LOG;
+    // Do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::SearchContactL( )
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::SearchContactL( )
+    {
+    FUNC_LOG;
+    // Cancel ongoing search if one exists.
+    if ( iContactOperationBase )
+        {
+        delete iContactOperationBase;
+        iContactOperationBase = NULL;
+        }
+
+    CVPbkContactManager& contactManager =
+            iContactManagerHandler.GetContactManager();
+
+    switch ( iValueType )
+        {
+        case EValueTypeEmail:
+            {
+            const MVPbkFieldTypeList& fieldTypeList = 
+							contactManager.FieldTypes();
+
+            CVPbkFieldTypeRefsList* fieldTypeRefsList =
+                    CVPbkFieldTypeRefsList::NewL();
+            CleanupStack::PushL( fieldTypeRefsList );
+
+            // Search for all email fields.
+            const TInt count(fieldTypeList.FieldTypeCount());
+            for ( TInt i = 0; i < count; ++i )
+                {
+                const MVPbkFieldType& fieldType = 
+					fieldTypeList.FieldTypeAt( i );
+                TArray<TVPbkFieldVersitProperty> versitProperties =
+                        fieldType.VersitProperties();
+
+                const TInt count2(versitProperties.Count());
+                for ( TInt ii=0; ii < count2; ++ii )
+                    {
+                    if ( versitProperties[ii].Name() == EVPbkVersitNameEMAIL )
+                        {
+                        fieldTypeRefsList->AppendL( fieldType );
+                        break;
+                        }
+                    }
+                }
+
+            // Initiate find operation, returns to FindCompleteL.
+            iContactOperationBase = contactManager.FindL( *iValue,
+                    *fieldTypeRefsList, *this );
+
+            CleanupStack::PopAndDestroy ( fieldTypeRefsList );
+            break;
+            }
+        case EValueTypePhoneNumber:
+            {
+            if ( CommonPhoneParser::IsValidPhoneNumber( *iValue,
+                    CommonPhoneParser::EPlainPhoneNumber ) )
+                {
+                // Initiate find operation, returns to FindCompleteL.
+                const MVPbkFieldTypeList& fieldTypeList = 
+											contactManager.FieldTypes();
+
+                CVPbkFieldTypeRefsList* fieldTypeRefsList =
+                        CVPbkFieldTypeRefsList::NewL();
+                CleanupStack::PushL( fieldTypeRefsList );
+
+                // Search for all email fields.
+                const TInt count(fieldTypeList.FieldTypeCount());
+                for ( TInt i = 0; i < count; ++i )
+                    {
+                    const MVPbkFieldType& fieldType = 
+											fieldTypeList.FieldTypeAt( i );
+                    TArray<TVPbkFieldVersitProperty> versitProperties =
+                            fieldType.VersitProperties();
+
+                    const TInt count2(versitProperties.Count());
+                    for ( TInt ii=0; ii < count2; ++ii )
+                        {
+                        if ( versitProperties[ii].Name() == EVPbkVersitNameTEL )
+                            {
+                            fieldTypeRefsList->AppendL( fieldType );
+                            break;
+                            }
+                        }
+                    }
+                // Initiate find operation, returns to FindCompleteL.
+                iContactOperationBase = contactManager.FindL( *iValue,
+                        *fieldTypeRefsList, *this );
+
+                CleanupStack::PopAndDestroy ( fieldTypeRefsList );
+                }
+            else
+                {
+                CreateContactL();
+                }
+            break;
+            }
+        default:
+            {
+            // Disable contact action handler.
+            Reset();
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::CreateContactL( )
+// ---------------------------------------------------------------------------
+//
+void CESMRContactMenuHandler::CreateContactL( )
+    {
+    FUNC_LOG;
+    CVPbkContactManager& contactManager =
+            iContactManagerHandler.GetContactManager();
+
+    const MVPbkFieldTypeList& fieldTypeList = contactManager.FieldTypes();
+    const MVPbkFieldType* fieldType= NULL;
+
+    // Try to find appropriate field type.
+    switch ( iValueType )
+        {
+        case EValueTypeEmail:
+            {
+            fieldType = fieldTypeList.Find ( R_VPBK_FIELD_TYPE_EMAILGEN );
+            break;
+            }
+        case EValueTypePhoneNumber:
+            {
+            fieldType = fieldTypeList.Find ( R_VPBK_FIELD_TYPE_MOBILEPHONEGEN );
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    // If field type was found.
+    if ( fieldType )
+        {
+        // Create temporary store contact.
+        MVPbkContactStore& store = LocalContactStoreL();
+        MVPbkStoreContact* storeContact = store.CreateNewContactLC();
+        iStoreContactList.AppendL( storeContact );
+        CleanupStack::Pop(); // codescanner::cleanup
+
+        // Add link value to field.
+        MVPbkStoreContactField* field =
+                storeContact->CreateFieldLC ( *fieldType );
+        MVPbkContactFieldTextData::Cast(field->FieldData()).SetTextL(*iValue);
+        storeContact->AddFieldL( field );
+        CleanupStack::Pop( field );
+
+        // Add link value to first name too.
+        // Otherwise t.ex send multimedia shows contact as 'unnamed'.
+        fieldType = fieldTypeList.Find( R_VPBK_FIELD_TYPE_FIRSTNAME );
+        if ( fieldType )
+            {
+            field = storeContact->CreateFieldLC( *fieldType );
+            MVPbkContactFieldTextData::Cast( 
+            		field->FieldData() ).SetTextL( *iValue );
+            storeContact->AddFieldL( field );
+            CleanupStack::Pop( field );
+            }
+
+        // Set contact set for contact action service.
+        iContactActionService->SetContactSetL( iStoreContactList );
+        // Initiate query actions, returns to QueryActionsComplete.
+        iContactActionService->QueryActionsL( this );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRContactMenuHandler::LocalContactStoreL( )
+// ---------------------------------------------------------------------------
+//
+MVPbkContactStore& CESMRContactMenuHandler::LocalContactStoreL( )
+    {
+    FUNC_LOG;
+    CVPbkContactManager& contactManager =
+            iContactManagerHandler.GetContactManager();
+
+    // Search for local contact store.
+    MVPbkContactStoreList& storeList = contactManager.ContactStoresL();
+    const TInt count(storeList.Count());
+    for ( TInt i = 0; i< count; ++i )
+        {
+        MVPbkContactStore& store = storeList.At( i );
+        if ( store.StoreProperties().Local() )
+            {
+            return store;
+            }
+        }
+    // Leave if not found.
+    User::Leave ( KErrNotFound );
+    // Disables warning.
+    MVPbkContactStore* null = NULL;
+    return *null;
+    }
+
+// EOF
+