locationdataharvester/mylocationsdatabasemanager/src/mylocationsdatabasemanager.cpp
branchRCL_3
changeset 18 870918037e16
parent 17 1fc85118c3ae
--- a/locationdataharvester/mylocationsdatabasemanager/src/mylocationsdatabasemanager.cpp	Tue Aug 31 15:09:25 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1152 +0,0 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: Database manager implementation 
-*
-*/
-
-#include <EPos_CPosLandmarkCategory.h>
-#include <EPos_CPosLmTextCriteria.h>
-#include <EPos_CPosLandmarkSearch.h>
-#include <EPos_CPosLmDatabaseManager.h>
-#include <EPos_CPosLmNearestCriteria.h>
-#include <EPos_CPosLandmarkDatabase.h>
-#include <EPos_CPosLmCategoryManager.h>
-
-#include <lbsposition.h>
-#include <barsread.h>
-#include <barsc.h>
-#include <locationservicedefines.h>
-#include "mylocationsdatabasemanager.h"
-#include "mylocationlogger.h"
-#include "mylocationsdefines.h"
-
-#include <locationdatalookupdb.h>
-#include <QString>
-// separator
-_LIT( KSeparator, ",");
-// space
-_LIT( KSpace, " ");
-
-// QString separator
-const QString KQStringSeparator = ",";
-// QString space
-const QString KQStringSpace = " ";
-
-// Used to set nearest landmarks search distance criteria
-const TUint32 KSearchCriteriaDistance = 100; 
-
-// Maximum string length of landmark address.
-const TUint32 KMaxAddressLength = 255; 
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::ConstructL()
-// 2nd phase constructor.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMyLocationsDatabaseManager::ConstructL()
-{
-    __TRACE_CALLSTACK;//Open and intialize Landmark DB
-    iLandmarkDb = CPosLandmarkDatabase::OpenL();
-    ExecuteAndDeleteLD(iLandmarkDb->InitializeL());
- 
-    iLocationAppLookupDb = new LocationDataLookupDb();
-    if( !iLocationAppLookupDb->open() )
-    {
-        User::Leave( KErrUnknown );
-    }
-    
-    // Create category manager for landmarks
-    iLandmarksCatManager = CPosLmCategoryManager::NewL(*iLandmarkDb);
-
-    // open file session
-    User::LeaveIfError(iFsSession.Connect());
-
-    // Add contacts and calendar  categories
-    iLmContactsCatId = AddMylocationsCategoryL(KContactsCategory);
-    iLmCalendarCatId = AddMylocationsCategoryL( KCalendarCategory );
-
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::CMyLocationsDatabaseManager()
-// Default constructor.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C  CMyLocationsDatabaseManager::CMyLocationsDatabaseManager() : iLandmarkDb( NULL ),
-                iLmContactsCatId( 0 ), //iLandmarksLookupDb( NULL ), 
-                iLocationAppLookupDb( NULL ),
-                iLandmarksCatManager( NULL )
-{
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::_CMyLocationsDatabaseManager()
-// Destructor.
-// -----------------------------------------------------------------------------
-//
-CMyLocationsDatabaseManager::~CMyLocationsDatabaseManager()
-{
-    __TRACE_CALLSTACK;// delete member variables.
-
-    if (iLocationAppLookupDb)
-    {
-        iLocationAppLookupDb->close();
-        delete iLocationAppLookupDb;
-    }
-
-    delete iLandmarksCatManager;
-
-    delete iLandmarkDb;
-
-    // close the file session
-    iFsSession.Close();
-
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::AddMylocationsCategoryL()
-// Adds the category to the mylocations and landmarks database..
-// -----------------------------------------------------------------------------
-//
-TUint32 CMyLocationsDatabaseManager::AddMylocationsCategoryL( const TDesC&  aCategoryName )
-{
-    __TRACE_CALLSTACK;//Open the resource file
-    
-    TPosLmItemId catId = 0;
-    
-    //create category
-    CPosLandmarkCategory *category = CPosLandmarkCategory::NewL();
-    CleanupStack::PushL(category);
-    category->SetCategoryNameL( aCategoryName );
-    
-    // Add category to landmarks database
-    TRAPD ( error, ( catId = iLandmarksCatManager->AddCategoryL( *category ) ) );
-    if (error == KErrNone || error == KErrAlreadyExists)
-    {
-        catId = iLandmarksCatManager->GetCategoryL( aCategoryName );
-    }
-
-    CleanupStack::PopAndDestroy(category);
-
-    return catId;
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::UpdateDatabaseL()
-// Updates the location into the landmark database and lookup table. Based on 
-// the entry source type and the entry change type the updation can be 
-// addition/modification/deletion.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMyLocationsDatabaseManager::UpdateDatabaseL(CPosLandmark* aLandmark,
-        const TUint32 aUid, const TUint32 aSourceType, const TUint32 aChangeType)
-{
-    __TRACE_CALLSTACK;//open the lookup database
-    switch (aChangeType)
-    {
-    // if the entry is added
-    case EEntryAdded:
-    {
-        // Handle this entry in the lookup table and update landmarks db.
-        HandleEntryAdditionL(aLandmark, aUid, aSourceType);
-        break;
-    }
-        // if the entry is modified
-    case EEntryModified:
-    {
-        // Handle this entry in the lookup table and update landmarks db.
-        HandleEntryModificationL(aLandmark, aUid, aSourceType);
-        break;
-    }
-        // if the entry is deleted
-    case EEntryDeleted:
-    {
-        // Handle this entry in the lookup table and update landmarks db.
-        HandleEntryDeletionL(aUid, aSourceType);
-        break;
-    }
-    }
-
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::CheckIfDuplicateExistsL()
-// Checks if this landmark is already present in database. If present returns the landmark id, else 0
-// -----------------------------------------------------------------------------
-//
-TPosLmItemId CMyLocationsDatabaseManager::CheckIfDuplicateExistsL(
-                                    const CPosLandmark* aLandmark)
-{
-    __TRACE_CALLSTACK;// Stores the found duplicate landmark's id. 
-    TPosLmItemId retId = 0;
-
-    // Initially filter only the landmarks which are nearer to the current landmark.
-    // Then we can make a duplicate check on each of the found landmarks.
-
-    // create a search object.
-    CPosLandmarkSearch* search = CPosLandmarkSearch::NewL(
-            *iLandmarkDb);
-    CleanupStack::PushL(search);
-
-    TBuf<KMaxAddressLength> lmAddress1;
-    GetLandmarkFullAddress( lmAddress1, aLandmark );
-    QString str1 = QString( (QChar*)lmAddress1.Ptr(), lmAddress1.Length());
-
-    // create nearest search criteria object
-    TLocality position( TCoordinate( 0, 0), 0 );
-    aLandmark->GetPosition( position );
-    CPosLmNearestCriteria* nearestCriteria = 
-                CPosLmNearestCriteria::NewLC( 
-                        TCoordinate( position.Latitude(), position.Longitude() ) );
-    nearestCriteria->SetMaxDistance( KSearchCriteriaDistance );
-    
-    // Start the search and execute it at once.
-    ExecuteAndDeleteLD( search->StartLandmarkSearchL( *nearestCriteria ) );
-    CleanupStack::PopAndDestroy( nearestCriteria );
-
-    // Retrieve an iterator to access the matching landmarks.
-    CPosLmItemIterator* iter = search->MatchIteratorL();
-    CleanupStack::PushL(iter);
-
-    // Iterate the search matches.
-    TPosLmItemId lmId;
-
-    while( ( lmId = iter->NextL() ) != KPosLmNullItemId )
-    {
-        CPosLandmark* lm = iLandmarkDb->ReadLandmarkLC( lmId );
-        TBuf<KMaxAddressLength> lmAddress2;
-        GetLandmarkFullAddress( lmAddress2, lm );
-        QString str2 = QString( (QChar*)lmAddress2.Ptr(), lmAddress2.Length());
-        CleanupStack::PopAndDestroy( lm );
-        
-        if( str1 == str2 )
-        {
-            retId = lmId;
-            break;
-        }
-    }
-
-    CleanupStack::PopAndDestroy(iter);
-    CleanupStack::PopAndDestroy(search);
-
-    return retId;
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::CompareLandmarks()
-// Compares two landmarks. Only the text fields, landmark name, street, city, state country and 
-// postal code are compared.
-// -----------------------------------------------------------------------------
-//
-TBool CMyLocationsDatabaseManager::CompareLandmarks(
-        const CPosLandmark* aLandmark1, const CPosLandmark* aLandmark2 )
-{
-    __TRACE_CALLSTACK;
-
-    TBuf<KMaxAddressLength> lmAddress1;
-    GetLandmarkFullAddress( lmAddress1, aLandmark1 );
-    QString str1 = QString( (QChar*)lmAddress1.Ptr(), lmAddress1.Length());
-
-    TBuf<KMaxAddressLength> lmAddress2;
-    GetLandmarkFullAddress( lmAddress2, aLandmark2 );
-    QString str2 = QString( (QChar*)lmAddress2.Ptr(), lmAddress2.Length());
-
-    if( str1 == str2 )
-        return ETrue;
-    else
-        return EFalse;
-    
-    
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::HandleEntryAdditionL()
-// Handles the entry addition in lookup table and landmarks db
-// -----------------------------------------------------------------------------
-//
-void CMyLocationsDatabaseManager::HandleEntryAdditionL(CPosLandmark* aLandmark,
-        const TUint32 aUid, const TUint32 aSourceType)
-{
-    __TRACE_CALLSTACK;
-    // Create a lookup item
-    QLookupItem lookupItem;
-    lookupItem.mSourceUid = aUid;
-    lookupItem.mSourceType = aSourceType;
-    lookupItem.mDestId = 0;
-    lookupItem.mIconType = QLookupItem::EIconTypeDefault;
-    lookupItem.mIsDuplicate = 0;
-    lookupItem.mIconPath = "";
-    lookupItem.mMapTilePath = "";
-    lookupItem.mSingleLineAddress="";
-    TPtrC16 dataPtr;
-    aLandmark->GetPositionField(EPositionFieldComment ,dataPtr);
-    lookupItem.mSingleLineAddress=QString::fromUtf16(dataPtr.Ptr(),
-            dataPtr.Length());
-    //fill address into lookup item.
-    FillLookupItemAddressDetails( aLandmark, lookupItem );
-
-    if ( aSourceType == ESourceLandmarks )
-    {
-        // Logic: check if the entry is already present in lookupdb. 
-        // If present, it means the landmark corresponds to a contact/calendar. So ignore it.
-        // If not present, it means the landmark is created directly into the landmarks db. So add
-        // it in lookupdb as well.
-        
-        // check if the entry is already present in lookup db.
-        QList<QLookupItem> itemArray;
-        iLocationAppLookupDb->findEntriesByLandmarkId( aUid, itemArray );
-        if( itemArray.count() )
-        {
-            return;
-        }
-        else
-        {
-            lookupItem.mDestId = aUid;
-            iLocationAppLookupDb->createEntry( lookupItem );
-            return;
-        }
-    }
-
-    TPosLmItemId catId;
-    if( aSourceType == ESourceCalendar )
-    {
-        // category id to calendar
-        catId = iLmCalendarCatId;
-    }
-    else 
-    {
-        // remove landmark name, which is basically contact's name.
-        aLandmark->SetLandmarkNameL( KNullDesC );
-        // category id to contacts
-        catId = iLmContactsCatId;
-    }
-    // check if this landmark is already present in database
-    TPosLmItemId dupLmId = CheckIfDuplicateExistsL( aLandmark );
-    if ( dupLmId )
-    {
-        // landmark already present in db. get the details
-        CPosLandmark* dupLandmark = iLandmarkDb->ReadLandmarkLC(dupLmId);
-        if( dupLandmark )
-        {
-            // add category.
-            dupLandmark->AddCategoryL( catId );
-            // update the landmark object in the db
-            iLandmarkDb->UpdateLandmarkL( *dupLandmark );
-            CleanupStack::PopAndDestroy( dupLandmark );
-        }
-
-        // point the lookup item's landmark uid to the existing landmark.
-        lookupItem.mDestId = dupLmId;
-        if( aSourceType == ESourceCalendar )
-        {
-            // set duplicate flag to true. only if it is calendar entry.
-            // for contacts duplicate doesnot hold good as the location name is the contact name.
-        
-            // set duplicate only if there are calendar entries already pointing to this landmark. 
-            if( IsDuplicateEntry( dupLmId ) )
-            {
-                lookupItem.mIsDuplicate = 1;
-            }
-        }
-    }
-    else // it is a new entry, so add into the database
-    {
-        // add category.
-        aLandmark->AddCategoryL( catId );
-        // add the landmark into the db. 
-        // point the lookup item's landmark uid to the newly created landmark in the db.
-        lookupItem.mDestId = iLandmarkDb->AddLandmarkL( *aLandmark );
-    }
-
-    // create the entry in the lookup table.
-    iLocationAppLookupDb->createEntry( lookupItem );
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::HandleEntryModificationL()
-// Handles the entry modification in the lookup table and landmarks db.
-// -----------------------------------------------------------------------------
-//
-void CMyLocationsDatabaseManager::HandleEntryModificationL(
-        CPosLandmark* aLandmark, const TUint32 aUid, const TUint32 aSourceType )
-{
-    __TRACE_CALLSTACK;
-    if ( aSourceType == ESourceLandmarks )
-    {
-        HandleLandmarkModificationL( aLandmark, aUid );
-        return;
-    }
-
-    QLookupItem lookupItem;
-    lookupItem.mSourceUid = aUid;
-    lookupItem.mSourceType = aSourceType;
-    lookupItem.mIconType = QLookupItem::EIconTypeDefault;
-    TPtrC16 dataPtr;
-    aLandmark->GetPositionField(EPositionFieldComment ,dataPtr);
-    lookupItem.mSingleLineAddress=QString::fromUtf16(dataPtr.Ptr(),
-            dataPtr.Length());
-
-    // Behavior: If an entry is modified, 
-    // If this entry is not present in lookup table. add the entry and update the landmarks db.
-    // If this entry is already present in lookup table, check if the location info is modified or not.
-    // If the location info is modified, delete the landmark from db and add the new landmark
-    // into the db. 
-    // Before deletion make sure that the landmark is not being refered by other lookup entries.
-
-    // find the entry in the lookup table.
-    if ( iLocationAppLookupDb->findEntryBySourceIdAndType( lookupItem ) )
-    {
-        //fill address into lookup item.
-        FillLookupItemAddressDetails( aLandmark, lookupItem );
-        
-        QString locationName = lookupItem.mName;
-    
-        TPosLmItemId catId;
-        
-        if( aSourceType == ESourceCalendar )
-        {
-            catId = iLmCalendarCatId;
-        }
-        else
-        {
-            // remove landmark name, which is basically contact's name.
-            aLandmark->SetLandmarkNameL( KNullDesC );
-            
-            // category id to contacts
-            catId = iLmContactsCatId;
-        }
-
-        
-        // check if the location info is modified by comparing the new landmark with the existing landmark
-        CPosLandmark* existingLandmark = NULL;
-        TRAPD( error, ( existingLandmark = 
-               CheckAndReadLandmarkL( iLandmarkDb, lookupItem.mDestId ) ) );
-        CleanupStack::PushL( existingLandmark );
-        if ( error == KErrNotFound )
-        {
-            // Landmarks item deleted. So delete corresponding lookup entries.
-            QList<QLookupItem> itemArray;
-            iLocationAppLookupDb->findEntriesByLandmarkId( lookupItem.mDestId, itemArray );
-            for ( int i = 0; i < itemArray.count(); i++)
-            {
-                iLocationAppLookupDb->deleteEntryBySourceIdAndType( itemArray[i] );
-            }
-
-            // Add the entry into the lookup table and update landmarks db.
-            HandleEntryAdditionL( aLandmark, aUid, aSourceType );
-            
-            CleanupStack::PopAndDestroy( existingLandmark );
-            return;
-        }
-
-        if ( !CompareLandmarks( existingLandmark, aLandmark ) )
-        {
-            // landmarks are not same, means location information is modified.
-
-            // Check if the new landmark is already in db.
-            TPosLmItemId dupLmId = CheckIfDuplicateExistsL( aLandmark );
-            if ( dupLmId )
-            {
-                // landmark already present in db. get the details
-                CPosLandmark* dupLandmark = iLandmarkDb->ReadLandmarkLC( dupLmId );
-                if ( dupLandmark )
-                {
-                    // add category.
-                    dupLandmark->AddCategoryL( catId );
-
-                    // update the landmark object in the db
-                    iLandmarkDb->UpdateLandmarkL( *dupLandmark );
-                }
-                CleanupStack::PopAndDestroy( dupLandmark );
-
-                // update the lookup item to refer to the newly created landmark.
-                lookupItem.mDestId = dupLmId;
-                if( aSourceType == ESourceCalendar )
-                {
-                    // for contacts duplicate doesnot hold good as the location name is the contact name.
-                    if( !lookupItem.mIsDuplicate )
-                    {
-                        // if current lookup item duplicate property is 0, then remove next corresponding
-                        // calendar lookup entry duplicate property.
-                        // this is required because the current entry will be pointing to a new landmark.
-                        UnsetDuplicateNextCalEntry( aUid, existingLandmark->LandmarkId() );
-                    } 
-
-                    // set duplicate only if there are calendar entries already pointing to this landmark. 
-                    if( IsDuplicateEntry( dupLmId ) )
-                    {
-                        lookupItem.mIsDuplicate = 1;
-                    }
-
-                }
-                
-                iLocationAppLookupDb->updateEntryBySourceIdAndType( lookupItem );
-            }
-            else
-            {
-                // landmark not already present in db.
-                // Create a new entry in the db
-                aLandmark->AddCategoryL( catId );
-                lookupItem.mDestId = iLandmarkDb->AddLandmarkL( *aLandmark );
-                if( aSourceType == ESourceCalendar )
-                {
-                    // for contacts duplicate doesnot hold good as the location name is the contact name.
-                    if( !lookupItem.mIsDuplicate )
-                    {
-                        // if current lookup item duplicate property is 0, then remove next corresponding
-                        // calendar lookup entry duplicate property.
-                        // this is required because the current entry will be pointing to a new landmark.
-                        UnsetDuplicateNextCalEntry( aUid, existingLandmark->LandmarkId() );
-                    } 
-                }
-                
-                lookupItem.mIsDuplicate = 0;
-                // update the lookup table
-                iLocationAppLookupDb->updateEntryBySourceIdAndType( lookupItem );
-            }
-        }
-        else
-        {
-            // landmarks are same, means location not modified. So return.
-            if( aSourceType == ESourceContactsPref
-                                    || aSourceType == ESourceContactsWork
-                                    || aSourceType == ESourceContactsHome
-                                    )
-            {
-                // in case of contacts, there is a chance that contact name is modified. 
-                // so update the lookup database entry with that name.
-                lookupItem.mName = locationName;
-                iLocationAppLookupDb->updateEntryBySourceIdAndType( lookupItem );
-            }
-
-            CleanupStack::PopAndDestroy( existingLandmark );
-            return;
-        }
-
-        // delete the existing landmark only if it not being refered by other lookup entries.
-
-        // Check if any other entries are refering this landmark.
-        QList<QLookupItem> itemArray;
-        iLocationAppLookupDb->findEntriesByLandmarkId(
-                existingLandmark->LandmarkId(), itemArray );
-
-        if ( itemArray.count() )
-        {
-            // There are other lookup entries refering this landmark. So do not delete the landmark
-
-            // If none of these lookup item's source type is current source type, disassociate 'catId' category
-            // from this landmark.
-            TInt i = 0;
-            while ( i < itemArray.count() )
-            {
-                if( aSourceType == ESourceCalendar )
-                {
-                    if ( itemArray[i].mSourceType == aSourceType )
-                    {
-                        // a lookup item exists which is from calendar, so 'catId' is still valid.
-                        break;
-                    }
-                 }
-                else 
-                {
-                    // a lookup item exists which is from contacts, so 'catId' is still valid.
-                    break;
-                }
-                i++;
-            }
-            if ( i == itemArray.count() )
-            {
-                // no lookup items from current source type exists refering this landmark.
-                // so disassociate 'catId' from this landmark
-
-                existingLandmark->RemoveCategory( catId );
-                iLandmarkDb->UpdateLandmarkL( *existingLandmark );
-            }
-        }
-        else
-        {
-            // no other lookup entry is refering this landmark. 
-            // delete the landmark.
-            iLandmarkDb->RemoveLandmarkL( existingLandmark->LandmarkId() );
-        }
-        CleanupStack::PopAndDestroy( existingLandmark );
-
-    }
-    else // entry not present in lookup table
-    {
-        // Add the entry into the lookup table and update landmarks db.
-        HandleEntryAdditionL( aLandmark, aUid, aSourceType );
-    }
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::HandleEntryDeletionL()
-// Handles the entry deletion in lookup table and landmarks db.
-// -----------------------------------------------------------------------------
-//
-void CMyLocationsDatabaseManager::HandleEntryDeletionL(const TUint32 aUid,
-                                                const TUint32 aSourceType)
-{
-    __TRACE_CALLSTACK;
-    QLookupItem lookupItem;
-    lookupItem.mSourceUid = aUid;
-    lookupItem.mSourceType = aSourceType;
-
-    // Behavior: if an entry is deleted, delete the corresponding entries from 
-    // both lookup table and iLandmarkDb.  
-    // Before deleting the entry from iLandmarkDb, make sure that this entry is not being refered by
-    // other entries of the lookup table. If it is being refered by other entries in lookup table, then
-    // do not delete the landmark.
- 
-    if ( !iLocationAppLookupDb->findEntryBySourceIdAndType( lookupItem ) )
-    {
-        if( aSourceType == ESourceLandmarks )
-        {
-            lookupItem.mDestId = aUid;
-        }
-        else
-        {
-            return;
-        }
-    }
-    
-    // Find the corresponding landmark uid
-    
-
-    // delete the lookup entry.
-    iLocationAppLookupDb->deleteEntryBySourceIdAndType( lookupItem );
-
-    // Check if any other entries are refering this landmark.
-    QList<QLookupItem> itemArray;
-    iLocationAppLookupDb->findEntriesByLandmarkId( lookupItem.mDestId, itemArray );
-
-    if ( itemArray.count() )
-    {
-    
-        if( aSourceType == ESourceLandmarks )
-        {
-            CPosLandmark* lm = NULL;
-        
-            for( int i = 0; i < itemArray.count(); i++ )
-            {
-                if( itemArray[i].mSourceType == ESourceCalendar )
-                {
-                    // add landmark entry since a calendar item is present with this location.
-                   if( !lm )
-                   {
-                       lm = CreateLandmarkItemLC( itemArray[i] );
-                   }
-                   lm->AddCategoryL( iLmCalendarCatId );
-                }
-                else
-                {
-                   // add landmark entry since a contact item is present with this location.
-                   if( !lm )
-                   {
-                       QString tempStr = itemArray[i].mName;
-                       itemArray[i].mName = "";
-                       lm = CreateLandmarkItemLC( itemArray[i] );
-                       itemArray[i].mName = tempStr;
-                   }
-                   lm->AddCategoryL( iLmCalendarCatId );
-                }    
-            }
-
-            lookupItem.mDestId = iLandmarkDb->AddLandmarkL( *lm );
-            CleanupStack::PopAndDestroy( lm );
-
-            bool dupUnset = false;
-            for( int i=0; i<itemArray.count(); i++ )
-            {
-                itemArray[i].mDestId = lookupItem.mDestId;
-                if( itemArray[i].mSourceType == ESourceCalendar && dupUnset == false )
-                {
-                    dupUnset = true;
-                    itemArray[i].mIsDuplicate = 0;
-                }
-                iLocationAppLookupDb->updateEntryById( itemArray[i] );
-            }   
-            
-            return;
-        }
-
-        // There are other lookup entries refering this landmark. So do not delete the landmark
-
-        // If none of these lookup item's source type is current source type, disassociate current source category
-        // from this landmark.
-        TInt i = 0;
-        while ( i < itemArray.count() )
-        {
-            if( aSourceType == ESourceCalendar )
-            {
-                if( itemArray[i].mSourceType == aSourceType )
-                {
-                    if( lookupItem.mIsDuplicate == 0 )
-                    {
-                        itemArray[i].mIsDuplicate = 0;
-                        iLocationAppLookupDb->updateEntryById( itemArray[i] );
-                    }
-                    // a lookup item exists which is from calendar, so 'iLmCalendarCatId' is still valid.
-                    break;
-                }
-        
-            }
-            else if ( itemArray[i].mSourceType == ESourceContactsPref
-                    || itemArray[i].mSourceType == ESourceContactsWork
-                    || itemArray[i].mSourceType == ESourceContactsHome)
-            {
-                // a lookup item exists which is from contacts, so 'iLmContactsCatId' is still valid.
-                break;
-            }
-            i++;
-        }
-        if ( i == itemArray.count() )
-        {
-            // no lookup items from current source type exists refering this landmark.
-            // so disassociate current source category from this landmark
-
-            CPosLandmark* landmark = iLandmarkDb->ReadLandmarkLC( lookupItem.mDestId );
-            if( aSourceType == ESourceCalendar )
-            {
-                landmark->RemoveCategory( iLmCalendarCatId );
-            }
-            else
-            {
-                landmark->RemoveCategory( iLmContactsCatId );
-            }
-            
-            iLandmarkDb->UpdateLandmarkL( *landmark );
-            CleanupStack::PopAndDestroy( landmark );
-        }
-    }
-    else
-    {
-        // no other lookup entry is refering this landmark. 
-        // delete the landmark.
-        if ( aSourceType != ESourceLandmarks )
-        {
-            iLandmarkDb->RemoveLandmarkL( lookupItem.mDestId );
-        }
-    }
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::HandleLandmarkModificationL()
-// -----------------------------------------------------------------------------
-//
-void CMyLocationsDatabaseManager::HandleLandmarkModificationL(
-        CPosLandmark* aLandmark, const TUint32 aUid )
-{
-    __TRACE_CALLSTACK;
-    // logic: if a landmark is modified, 
-    // first update the corresponding landmark lookup entry if present, else create a new entry.
-    // Check for any contact/calendar entries refering this landmark entry,
-    // if exists, create a new landmark entry with that location details and update all those 
-    // lookup entry's destid with the newly created landmark id.
-    
-    QLookupItem lookupItem;
-    lookupItem.mSourceUid = aUid;
-    lookupItem.mSourceType = ESourceLandmarks;
-    lookupItem.mIconType = QLookupItem::EIconTypeDefault;
-
-    bool found = iLocationAppLookupDb->findEntryBySourceIdAndType( lookupItem );
-    //fill address into lookup item.
-    FillLookupItemAddressDetails( aLandmark, lookupItem );
-    lookupItem.mDestId = aUid;
-    lookupItem.mIsDuplicate = 0;
-    lookupItem.mIconType = QLookupItem::EIconTypeDefault;
-    lookupItem.mIconPath = "";
-    lookupItem.mMapTilePath = "";
-
-    // update entry in lookup table.
-    if ( found )
-    {
-        iLocationAppLookupDb->updateEntryById( lookupItem );
-    }
-    else
-    {
-        iLocationAppLookupDb->createEntry( lookupItem );
-    }
-    
-    QList<QLookupItem> itemArray;
-    iLocationAppLookupDb->findEntriesByLandmarkId( lookupItem.mDestId, itemArray );
-    
-    if( itemArray.count() == 1 )
-    {
-        //only one entry ie the entry corresponding to landmark db is present.
-        return;
-    }
-    
-    CPosLandmark* lm = NULL;
-    
-    for( int i = 0; i < itemArray.count(); i++ )
-    {
-        if( itemArray[i].mSourceType != ESourceLandmarks )
-        {
-            if( itemArray[i].mSourceType == ESourceCalendar )
-            {
-                // add landmark entry since a calendar item is present with this location.
-               if( !lm )
-               {
-                   lm = CreateLandmarkItemLC( itemArray[i] );
-               }
-               lm->AddCategoryL( iLmCalendarCatId );
-            }
-            else
-            {
-               // add landmark entry since a calendar item is present with this location.
-               if( !lm )
-               {
-                   QString tempStr = itemArray[i].mName;
-                   itemArray[i].mName = "";
-                   lm = CreateLandmarkItemLC( itemArray[i] );
-                   itemArray[i].mName = tempStr;
-               }
-               lm->AddCategoryL( iLmCalendarCatId );
-            }    
-        }
-    }
-    
-    // add the entry to landmarks db
-    quint32 newDestId = iLandmarkDb->AddLandmarkL( *lm );
-    CleanupStack::PopAndDestroy( lm );
-
-    bool calDuplicateUnset = false;
-    // update all the lookup entries with new landmark id
-    for( int i = 0; i < itemArray.count(); i++ )
-    {
-        if( itemArray[i].mSourceType != ESourceLandmarks )
-        {
-            itemArray[i].mDestId = newDestId;
-            
-            if( itemArray[i].mSourceType == ESourceCalendar )
-            {
-                if( !calDuplicateUnset )
-                {
-                    itemArray[i].mIsDuplicate = 0;
-                    calDuplicateUnset = true;
-                }
-                else
-                {
-                    itemArray[i].mIsDuplicate = 1;
-                }
-            }
-            iLocationAppLookupDb->updateEntryById( itemArray[i] );
-        }
-    }
-}
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::GetLandmarkFullAddress()
-// Gets the comma separated full address of the given landmark.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMyLocationsDatabaseManager::GetLandmarkFullAddress(
-        TBuf<KMaxAddressLength>& aLandmarkAddress,
-        const CPosLandmark* aLandmark)
-{
-    __TRACE_CALLSTACK;
-    TPtrC tempStr;
-    TInt retStatus;
-    TBool addressEmtpy = ETrue;
-    aLandmarkAddress.Copy( KNullDesC );
-    retStatus = aLandmark->GetPositionField(EPositionFieldStreet, tempStr);
-    if (retStatus == KErrNone && tempStr.Length())
-    {
-        {
-            aLandmarkAddress.Copy(tempStr);
-            addressEmtpy = EFalse;
-        }
-    }
-
-    retStatus = aLandmark->GetPositionField(EPositionFieldCity, tempStr);
-    if (retStatus == KErrNone && tempStr.Length())
-    {
-        if (!addressEmtpy)
-        {
-            aLandmarkAddress.Append(KSeparator);
-            aLandmarkAddress.Append(KSpace);
-            aLandmarkAddress.Append(tempStr);
-        }
-        else
-        {
-            aLandmarkAddress.Copy(tempStr);
-            addressEmtpy = EFalse;
-        }
-    }
-
-    retStatus = aLandmark->GetPositionField(EPositionFieldState, tempStr);
-    if (retStatus == KErrNone && tempStr.Length())
-    {
-        if (!addressEmtpy)
-        {
-            aLandmarkAddress.Append(KSeparator);
-            aLandmarkAddress.Append(KSpace);
-            aLandmarkAddress.Append(tempStr);
-        }
-        else
-        {
-            aLandmarkAddress.Copy(tempStr);
-            addressEmtpy = EFalse;
-        }
-    }
-
-    retStatus = aLandmark->GetPositionField(EPositionFieldCountry, tempStr);
-    if (retStatus == KErrNone && tempStr.Length())
-    {
-        if (!addressEmtpy)
-        {
-            aLandmarkAddress.Append(KSeparator);
-            aLandmarkAddress.Append(KSpace);
-            aLandmarkAddress.Append(tempStr);
-        }
-        else
-        {
-            aLandmarkAddress.Copy(tempStr);
-            addressEmtpy = EFalse;
-        }
-    }
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::CheckAndReadLandmarkL()
-// Checks if given landmark id is found in the database and returns the read landmark.
-// -----------------------------------------------------------------------------
-//
-CPosLandmark* CMyLocationsDatabaseManager::CheckAndReadLandmarkL(
-        CPosLandmarkDatabase* aDb, const TUint32 aLmId)
-{
-    __TRACE_CALLSTACK;
-    CPosLandmark* lm = aDb->ReadLandmarkLC(aLmId);
-    CleanupStack::Pop(lm);    
-    return lm;
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::FillLookupItemAddressDetails()
-// Creates a new category in Mylocations Db and adds a corresponding entry in 
-// mylocations lookup table.
-// -----------------------------------------------------------------------------
-//
-void CMyLocationsDatabaseManager::FillLookupItemAddressDetails( CPosLandmark* aLandmark, QLookupItem& aLookupItem )
-{
-    __TRACE_CALLSTACK;// Read the category.
-
-    // fill geo-coordinates
-    TLocality position;
-    aLandmark->GetPosition( position );
-    aLookupItem.mLatitude = position.Latitude();
-    aLookupItem.mLongitude = position.Longitude();
-
-    TPtrC tempStr;
-    TInt retStatus;
-
-    // Copy landmark name in address 1
-    retStatus = aLandmark->GetLandmarkName( tempStr );
-    aLookupItem.mName = "";
-    if( retStatus == KErrNone && tempStr.Length() > 0 )
-    {
-        aLookupItem.mName = QString( (QChar*)tempStr.Ptr(), tempStr.Length() );
-    }
-
-    // get street
-    aLookupItem.mStreet = "";
-    retStatus = aLandmark->GetPositionField( EPositionFieldStreet, tempStr );
-    if( retStatus == KErrNone && tempStr.Length() )
-    {
-        aLookupItem.mStreet = QString( (QChar*)tempStr.Ptr(), tempStr.Length());
-    }
-
-    // get postal code
-    aLookupItem.mPostalCode = "";
-    retStatus = aLandmark->GetPositionField( EPositionFieldPostalCode, tempStr );
-    if( retStatus == KErrNone && tempStr.Length() )
-    {
-        aLookupItem.mPostalCode = QString( (QChar*)tempStr.Ptr(), tempStr.Length());
-    }
-
-    // get city
-    aLookupItem.mCity = "";
-    retStatus = aLandmark->GetPositionField( EPositionFieldCity, tempStr );
-    if( retStatus == KErrNone && tempStr.Length() )
-    {
-        aLookupItem.mCity = QString( (QChar*)tempStr.Ptr(), tempStr.Length());
-    }
-
-    // get State
-    aLookupItem.mState = "";
-    retStatus = aLandmark->GetPositionField( EPositionFieldState, tempStr );
-    if( retStatus == KErrNone && tempStr.Length() )
-    {
-        aLookupItem.mState = QString( (QChar*)tempStr.Ptr(), tempStr.Length());
-    }
-
-    // get country
-    aLookupItem.mCountry = "";
-    retStatus = aLandmark->GetPositionField( EPositionFieldCountry, tempStr );
-    if( retStatus == KErrNone && tempStr.Length() )
-    {
-        aLookupItem.mCountry = QString( (QChar*)tempStr.Ptr(), tempStr.Length());
-    }
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::UnsetDuplicateNextCalEntry()
-// -----------------------------------------------------------------------------
-//
-void CMyLocationsDatabaseManager::UnsetDuplicateNextCalEntry( quint32 aUid, quint32 aLandmarkId )
-{
-    __TRACE_CALLSTACK;
-    // get next duplicate item
-    QList<QLookupItem> itemArray;
-    iLocationAppLookupDb->findEntriesByLandmarkId( aLandmarkId, itemArray );
-    for ( int i = 0; i < itemArray.count(); i++)
-    {
-        if( itemArray[i].mSourceType == ESourceCalendar && itemArray[i].mSourceUid != aUid )
-        {
-            itemArray[i].mIsDuplicate = 0;
-            iLocationAppLookupDb->updateEntryById( itemArray[i] );
-            break;
-        }
-    }
-
-}
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::IsDuplicateEntry()
-// -----------------------------------------------------------------------------
-//
-bool CMyLocationsDatabaseManager::IsDuplicateEntry( quint32 aLandmarkId )
-{
-    __TRACE_CALLSTACK;
-    // get next duplicate item
-    QList<QLookupItem> itemArray;
-    iLocationAppLookupDb->findEntriesByLandmarkId( aLandmarkId, itemArray );
-    for ( int i = 0; i < itemArray.count(); i++)
-    {
-        if( itemArray[i].mSourceType == ESourceCalendar ||
-            itemArray[i].mSourceType == ESourceLandmarks )
-        {
-            return true;
-        }
-    }
-    
-    return false;
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::CreateLandmarkItemLC()
-// -----------------------------------------------------------------------------
-//
-CPosLandmark* CMyLocationsDatabaseManager::CreateLandmarkItemLC( const QLookupItem &aLookupItem )
-{
-    __TRACE_CALLSTACK;//return value
-    CPosLandmark *landmark = NULL;
-    TLocality loc( TCoordinate( aLookupItem.mLatitude, aLookupItem.mLongitude ), 0 );
-
-    landmark = CPosLandmark::NewL();
-    CleanupStack::PushL( landmark );
-
-    // Fill the location details into the landmark object
-    landmark->SetPositionL( loc );
-
-    // Set the landmark name as contact name
-    TBuf<KBufSize> text( aLookupItem.mName.utf16() );
-    TRAP_IGNORE( landmark->SetLandmarkNameL( text ) );
-
-    text.Copy( aLookupItem.mStreet.utf16() );
-    landmark->SetPositionFieldL( EPositionFieldStreet, text );
-    
-    // Set the City
-    text.Copy( aLookupItem.mCity.utf16() );
-    landmark->SetPositionFieldL( EPositionFieldCity, text );
-
-    // Set the state/region
-    text.Copy( aLookupItem.mState.utf16() );
-    landmark->SetPositionFieldL( EPositionFieldState, text );
-
-    // Set the Postal code
-    text.Copy( aLookupItem.mPostalCode.utf16() );
-    landmark->SetPositionFieldL( EPositionFieldPostalCode, text );
-
-    // Set the country
-    text.Copy( aLookupItem.mCountry.utf16() );
-    landmark->SetPositionFieldL( EPositionFieldCountry, text );
-
-    return landmark;
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::UpdateMapTilePath()
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMyLocationsDatabaseManager::UpdateMapTilePath( TUint32 aSourceId, TUint32 aSourceType, 
-                                            TFileName& aFilePath )
-{
-    __TRACE_CALLSTACK;
-    QString filePath = QString( (QChar*)aFilePath.Ptr(), aFilePath.Length() );
-    iLocationAppLookupDb->updateMaptileBySourceIdAndType( aSourceId, aSourceType, filePath );
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::UpdateEntryName()
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMyLocationsDatabaseManager::UpdateEntryName( TUint32 aSourceId, TUidSourceType aSourceType, 
-                                            const TDesC& aName )
-{
-    __TRACE_CALLSTACK;
-    QString name = QString( (QChar*)aName.Ptr(), aName.Length() );
-    iLocationAppLookupDb->updateEntryNameByIdAndType( aSourceId, aSourceType, name );
-	
-}
-
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::CheckIfAddressChanged()
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TBool CMyLocationsDatabaseManager::CheckIfAddressChanged(const CPosLandmark& aLandmarks,
-        const TUint32 aId, const TUidSourceType aAddressType)
-{
-    __TRACE_CALLSTACK;
-    QString target = iLocationAppLookupDb->getAddressDetails(aId, aAddressType);
-    TBuf<KMaxAddressLength> lmAddress;
-    GetLandmarkFullAddress(lmAddress, &aLandmarks);
-    QString source = QString((QChar*) lmAddress.Ptr(), lmAddress.Length());
-    if (source == target)
-    {
-        return EFalse;
-    }
-    return ETrue;
-
-}
-
-// -----------------------------------------------------------------------------
-// CMyLocationsDatabaseManager::CheckIfAddressChanged()
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TBool CMyLocationsDatabaseManager::CheckIfAddressChanged(const TDesC& aAddress,
-        const TUint32 aId, const TUidSourceType aAddressType)
-{   
-    __TRACE_CALLSTACK;
-    TBool compareStatus = ETrue;
-    QString target=iLocationAppLookupDb->getAddressDetails( aId , aAddressType );
-    QString source = QString( (QChar*)aAddress.Ptr(), aAddress.Length());
-    if( source == target )
-    {
-        compareStatus= EFalse;
-    }
-    return compareStatus;
-}
-
-// End of file