--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/internalservices/src/EPos_PosLmLandmarkHandler.cpp Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,1279 @@
+/*
+* Copyright (c) 2002-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: Handles landmark operations on a local landmark database.
+*
+*
+*/
+
+
+#include <e32math.h>
+#include <lbsposition.h>
+#include <EPos_LandmarksErrors.h>
+#include <EPos_PosLmImplExtension.h>
+#include "EPos_PosLmLandmarkHandler.h"
+#include "EPos_CPosLmLocalDbAccess.h"
+#include "EPos_PosLmLongTextColHandler.h"
+#include "EPos_PosLmIconHandler.h"
+#include "EPos_PosLmCategoryHandler.h"
+#include "EPos_PosLmTrealCompare.h"
+#include "EPos_LandmarkDatabaseStructure.h"
+#include "EPos_PosLmDatabaseUtility.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::ReadLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark)
+ {
+ RDbView view;
+ OpenLandmarkViewLC( aLandmark.LandmarkId(), view, aDbAccess );
+ view.GetL();
+ ReadLandmarkL( view, aDbAccess, aLandmark );
+ CleanupStack::PopAndDestroy( &view );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::ReadLandmarkL(
+ RDbRowSet& aView,
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark)
+ {
+ RArray<TUint> dummy; // Not used here. All fields should be read.
+ ReadLandmarkL(
+ aView, aDbAccess, aLandmark, CPosLandmark::EAllAttributes, EFalse, dummy);
+ dummy.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::AddLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark)
+ {
+ AddBasicLandmarkInfoL(aDbAccess, aLandmark);
+ AddFieldsL(aDbAccess, aLandmark);
+ AddCategoriesL(aDbAccess, aLandmark);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::UpdateLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const CPosLandmark& aLandmark)
+ {
+ CPosLandmark* oldLandmark = CPosLandmark::NewLC();
+ PosLmImplExtension::SetLandmarkIdL(*oldLandmark, aLandmark.LandmarkId());
+ ReadLandmarkL(aDbAccess, *oldLandmark);
+
+ UpdateCategoriesL(aDbAccess, aLandmark, *oldLandmark);
+ UpdateFieldsL(aDbAccess, aLandmark, *oldLandmark);
+ UpdateIconAndBasicLandmarkInfoL(aDbAccess, aLandmark, *oldLandmark);
+
+ CleanupStack::PopAndDestroy(oldLandmark);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::RemoveLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TPosLmItemId aLandmarkId)
+ {
+ RemoveAllCategoriesFromLandmarkL(aDbAccess, aLandmarkId);
+ RemoveAllFieldsFromLandmarkL(aDbAccess, aLandmarkId);
+
+ TUint32 iconPathId;
+
+ if (RemoveBasicLandmarkInfoL(aDbAccess, aLandmarkId, iconPathId))
+ {
+ PosLmIconHandler::RemoveIconIfNotUsedL(aDbAccess, iconPathId);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::ReadPartialLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark,
+ CPosLmPartialReadParameters& aPartialSettings )
+ {
+ RDbView view;
+ OpenLandmarkViewLC( aLandmark.LandmarkId(), view, aDbAccess );
+
+ view.GetL();
+ ReadPartialLandmarkL( view, aDbAccess, aLandmark, aPartialSettings );
+
+ CleanupStack::PopAndDestroy( &view );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::ReadPartialLandmarkL(
+ RDbRowSet& aLandmarkView,
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark,
+ CPosLmPartialReadParameters& aPartialSettings )
+ {
+ PosLmImplExtension::SetPartialL( aLandmark, ETrue );
+
+ RArray<TUint> requestedFields;
+ CleanupClosePushL( requestedFields );
+
+ User::LeaveIfError(
+ aPartialSettings.GetRequestedPositionFields( requestedFields ) );
+
+ ReadLandmarkL(
+ aLandmarkView, aDbAccess, aLandmark,
+ aPartialSettings.RequestedAttributes(), ETrue, requestedFields );
+
+ CleanupStack::PopAndDestroy( &requestedFields );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::AddCategoriesToLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const RArray<TPosLmItemId>& aCategories,
+ const TPosLmItemId& aLandmarkId)
+ {
+ if (aCategories.Count() > 0)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlSelect, &KPosLmSqlAll,
+ &KPosLmLandmarkCategoryTable);
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EAddPreparation, view,
+ *sql);
+
+ for (TInt i = 0; i < aCategories.Count(); i++)
+ {
+ view.InsertL();
+ view.SetColL(EPosLmLccLandmarkIdCol, aLandmarkId);
+ view.SetColL(EPosLmLccCategoryIdCol, aCategories[i]);
+ view.PutL();
+ }
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::GetAllLandmarkIdsL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TBool aUseSort,
+ TBool aSortDescending,
+ RArray<TPosLmItemId>& aLandmarkIds)
+ {
+ aLandmarkIds.Reset();
+
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+
+ if (aUseSort)
+ {
+ sql->Des().Format(KPosLmSqlSelectOrderByString, &KPosLmLandmarkIdCol,
+ &KPosLmLandmarkTable, &KPosLmNameCol);
+
+ if (aSortDescending)
+ {
+ sql->Des().Append(KPosLmSqlDescOrder);
+ }
+ }
+ else
+ {
+ sql->Des().Format(KPosLmSqlSelect, &KPosLmLandmarkIdCol,
+ &KPosLmLandmarkTable);
+ }
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation, view,
+ *sql, EDbCompareCollated);
+
+ aLandmarkIds.ReserveL( view.CountL() );
+ while ( view.NextL() )
+ {
+ view.GetL();
+ aLandmarkIds.Append( view.ColUint32(1) );
+ }
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool PosLmLandmarkHandler::LandmarkExistsL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TPosLmItemId aLandmarkId)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlFindUint, &KPosLmLandmarkIdCol,
+ &KPosLmLandmarkTable, &KPosLmLandmarkIdCol, aLandmarkId);
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation, view,
+ *sql);
+
+ TBool exists = !view.IsEmptyL();
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+
+ return exists;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmLandmarkHandler::RemoveCategoryFromLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TPosLmItemId aCategoryId,
+ TPosLmItemId aLandmarkId)
+ {
+ // Remove category from all landmark.
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlDeleteBy2Uint, &KPosLmLandmarkCategoryTable,
+ &KPosLmCategoryIdCol, aCategoryId, &KPosLmLandmarkIdCol, aLandmarkId);
+
+ aDbAccess.ExecuteL(*sql);
+
+ CleanupStack::PopAndDestroy(sql);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool PosLmLandmarkHandler::HasLandmarkSpecifiedCategoryL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TPosLmItemId aCategoryId,
+ TPosLmItemId aLandmarkId)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(
+ KPosLmSqlFind2Uint, &KPosLmSqlAll, &KPosLmLandmarkCategoryTable,
+ &KPosLmLandmarkIdCol, aLandmarkId, &KPosLmCategoryIdCol, aCategoryId);
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation, view,
+ *sql);
+
+ TBool hasCategory = !view.IsEmptyL();
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+
+ return hasCategory;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark,
+ CPosLandmark::TAttributes aAttributes,
+ TBool aHasRequestedFields,
+ const RArray<TUint>& aRequestedFields )
+ {
+ RDbView view;
+ OpenLandmarkViewLC( aLandmark.LandmarkId(), view, aDbAccess );
+
+ view.GetL();
+ ReadLandmarkL(
+ view, aDbAccess, aLandmark, aAttributes, aHasRequestedFields, aRequestedFields );
+
+ CleanupStack::PopAndDestroy( &view );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadLandmarkL(
+ RDbRowSet& aView,
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark,
+ CPosLandmark::TAttributes aAttributes,
+ TBool aHasRequestedFields,
+ const RArray<TUint>& aRequestedFields )
+ {
+ if ( aAttributes & CPosLandmark::ELandmarkName )
+ {
+ ReadNameL( aView, aLandmark );
+ }
+
+ if ( aAttributes & CPosLandmark::EPosition )
+ {
+ ReadPositionL( aView, aLandmark );
+ }
+
+ if ( aAttributes & CPosLandmark::ECoverageRadius )
+ {
+ ReadCoverageRadiusL( aView, aLandmark );
+ }
+
+ if ( aAttributes & CPosLandmark::EDescription )
+ {
+ ReadDescriptionL( aView, aLandmark );
+ }
+
+ if ( aAttributes & CPosLandmark::EIcon )
+ {
+ ReadIconL( aDbAccess, aView, aLandmark );
+ }
+
+ if ( aAttributes & CPosLandmark::ECategoryInfo )
+ {
+ ReadCategoriesL( aDbAccess, aLandmark );
+ }
+
+ ReadFieldsL( aDbAccess, aLandmark, aHasRequestedFields, aRequestedFields );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadPositionL(
+ RDbRowSet& aView,
+ CPosLandmark& aLandmark)
+ {
+ if (!aView.IsColNull(EPosLmLcLatitudeCol) &&
+ !aView.IsColNull(EPosLmLcLongitudeCol))
+ {
+ TLocality position;
+
+ if (!aView.IsColNull(EPosLmLcAltitudeCol))
+ {
+ position.SetCoordinate(aView.ColReal64(EPosLmLcLatitudeCol),
+ aView.ColReal64(EPosLmLcLongitudeCol),
+ aView.ColReal32(EPosLmLcAltitudeCol));
+ }
+ else
+ {
+ position.SetCoordinate(aView.ColReal64(EPosLmLcLatitudeCol),
+ aView.ColReal64(EPosLmLcLongitudeCol));
+ }
+
+ if (!aView.IsColNull(EPosLmLcHorizAccCol))
+ {
+ position.SetHorizontalAccuracy(
+ aView.ColReal32(EPosLmLcHorizAccCol));
+ }
+
+ if (!aView.IsColNull(EPosLmLcVertAccCol))
+ {
+ position.SetVerticalAccuracy(aView.ColReal32(EPosLmLcVertAccCol));
+ }
+
+ aLandmark.SetPositionL(position);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadCoverageRadiusL(
+ RDbRowSet& aView,
+ CPosLandmark& aLandmark)
+ {
+ if (!aView.IsColNull(EPosLmLcCoverageRadiusCol))
+ {
+ aLandmark.SetCoverageRadius(aView.ColReal32(EPosLmLcCoverageRadiusCol));
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadNameL(
+ RDbRowSet& aView,
+ CPosLandmark& aLandmark)
+ {
+ if (!aView.IsColNull(EPosLmLcNameCol))
+ {
+ HBufC* nameBuffer = HBufC::NewLC(KPosLmMaxTextFieldLength);
+ TPtr buffer = nameBuffer->Des();
+ PosLmLongTextColHandler::ReadFromLongTextColumnL(buffer, aView,
+ EPosLmLcNameCol);
+
+ aLandmark.SetLandmarkNameL(*nameBuffer);
+
+ CleanupStack::PopAndDestroy(nameBuffer);
+ }
+ else
+ {
+ aLandmark.SetLandmarkNameL(KNullDesC);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadDescriptionL(
+ RDbRowSet& aView,
+ CPosLandmark& aLandmark)
+ {
+ if (!aView.IsColNull(EPosLmLcDescriptionCol))
+ {
+ HBufC* description = HBufC::NewLC(KPosLmMaxDescriptionLength);
+ TPtr descriptionBuffer = description->Des();
+ PosLmLongTextColHandler::ReadFromLongTextColumnL(descriptionBuffer,
+ aView, EPosLmLcDescriptionCol);
+
+ aLandmark.SetLandmarkDescriptionL(*description);
+
+ CleanupStack::PopAndDestroy(description);
+ }
+ else
+ {
+ aLandmark.SetLandmarkDescriptionL(KNullDesC);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadIconL(
+ CPosLmLocalDbAccess& aDbAccess,
+ RDbRowSet& aView,
+ CPosLandmark& aLandmark)
+ {
+ if (!aView.IsColNull(EPosLmLcIconIdCol) &&
+ !aView.IsColNull(EPosLmLcIconPicNrCol) &&
+ !aView.IsColNull(EPosLmLcMaskPicNrCol))
+ {
+ // Get icon path
+ HBufC* iconPath = HBufC::NewLC(KMaxFileName);
+ TPtr path = iconPath->Des();
+
+ if (PosLmIconHandler::GetIconPathL(aDbAccess,
+ aView.ColUint32(EPosLmLcIconIdCol), path) == KErrNone)
+ {
+ aLandmark.SetIconL(*iconPath,
+ aView.ColInt32(EPosLmLcIconPicNrCol),
+ aView.ColInt32(EPosLmLcMaskPicNrCol));
+ }
+
+ CleanupStack::PopAndDestroy(iconPath);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadFieldsL(
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark,
+ TBool aHasRequestedFields,
+ const RArray<TUint>& aRequestedFields)
+ {
+ if (!aHasRequestedFields || aRequestedFields.Count() > 0)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlFindUint, &KPosLmSqlAll,
+ &KPosLmLandmarkFieldTable, &KPosLmLandmarkIdCol,
+ aLandmark.LandmarkId());
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation,
+ view, *sql);
+
+ HBufC* textFieldBuffer = HBufC::NewLC(KPosLmMaxTextFieldLength);
+
+ while (view.NextL())
+ {
+ view.GetL();
+
+ TUint16 fieldType = view.ColUint16(EPosLmLfcFieldTypeCol);
+
+ if (!aHasRequestedFields ||
+ aRequestedFields.Find(fieldType) != KErrNotFound)
+ {
+ TPtr buffer = textFieldBuffer->Des();
+ PosLmLongTextColHandler::ReadFromLongTextColumnL(
+ buffer, view, EPosLmLfcFieldStringCol);
+
+ aLandmark.SetPositionFieldL(fieldType, *textFieldBuffer);
+ }
+ }
+
+ CleanupStack::PopAndDestroy(3, sql); //&view, textFieldBuffer
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::ReadCategoriesL(
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlFindUint, &KPosLmSqlAll,
+ &KPosLmLandmarkCategoryTable, &KPosLmLandmarkIdCol,
+ aLandmark.LandmarkId());
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation, view,
+ *sql);
+
+ while (view.NextL())
+ {
+ view.GetL();
+ aLandmark.AddCategoryL(view.ColUint32(EPosLmLccCategoryIdCol));
+ }
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::AddBasicLandmarkInfoL(
+ CPosLmLocalDbAccess& aDbAccess,
+ CPosLandmark& aLandmark)
+ {
+ TPtrC iconPath;
+ TInt iconIndex;
+ TInt maskIndex;
+ TUint32 iconPathId = 0;
+
+ // Fetch icon path id if the landmark has an icon.
+ if (aLandmark.GetIcon(iconPath, iconIndex, maskIndex) == KErrNone)
+ {
+ PosLmIconHandler::GetIconPathIdL(aDbAccess, iconPath, iconPathId);
+ }
+
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlSelect, &KPosLmSqlAll, &KPosLmLandmarkTable);
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EAddPreparation, view, *sql);
+
+ view.InsertL();
+
+ SetPositionL(view, aLandmark);
+ SetCoverageRadiusL(view, aLandmark);
+ SetIconL(view, aLandmark, iconPathId);
+ SetLandmarkNameL(view, aLandmark);
+ SetLandmarkDescriptionL(view, aLandmark);
+
+ view.PutL();
+
+ // Fetch and set the landmark id
+ PosLmImplExtension::SetLandmarkIdL(aLandmark,
+ view.ColUint32(EPosLmLcLandmarkIdCol));
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::AddFieldsL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const CPosLandmark& aLandmark)
+ {
+ TPositionFieldId fieldId = aLandmark.FirstPositionFieldId();
+
+ RArray<TUint> fieldIds;
+ CleanupClosePushL(fieldIds);
+
+ while (fieldId != EPositionFieldNone)
+ {
+ User::LeaveIfError(fieldIds.Append(fieldId));
+ fieldId = aLandmark.NextPositionFieldId(fieldId);
+ }
+
+ AddFieldsToLandmarkL(aDbAccess, fieldIds, aLandmark);
+
+ CleanupStack::PopAndDestroy(&fieldIds);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::AddCategoriesL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const CPosLandmark& aLandmark)
+ {
+ RArray<TPosLmItemId> categoryIdArray;
+ CleanupClosePushL(categoryIdArray);
+
+ aLandmark.GetCategoriesL(categoryIdArray);
+
+ RemoveNonExistingCategoriesL(aDbAccess, categoryIdArray);
+ AddCategoriesToLandmarkL(aDbAccess, categoryIdArray,
+ aLandmark.LandmarkId());
+
+ CleanupStack::PopAndDestroy(&categoryIdArray);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::UpdateCategoriesL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const CPosLandmark& aLandmark,
+ const CPosLandmark& aOldLandmark)
+ {
+ RArray<TPosLmItemId> categoryArray;
+ CleanupClosePushL(categoryArray);
+ aLandmark.GetCategoriesL(categoryArray);
+
+ RArray<TPosLmItemId> oldCategoryArray;
+ CleanupClosePushL(oldCategoryArray);
+ aOldLandmark.GetCategoriesL(oldCategoryArray);
+
+ RemoveNonExistingCategoriesL(aDbAccess, categoryArray);
+
+ RArray<TPosLmItemId> toBeAdded;
+ CleanupClosePushL(toBeAdded);
+
+ TInt i;
+ for (i = 0; i < categoryArray.Count(); i++)
+ {
+ if (oldCategoryArray.Find(categoryArray[i]) == KErrNotFound)
+ {
+ User::LeaveIfError(toBeAdded.Append(categoryArray[i]));
+ }
+ }
+
+ AddCategoriesToLandmarkL(aDbAccess, toBeAdded, aLandmark.LandmarkId());
+ CleanupStack::PopAndDestroy(&toBeAdded);
+
+ RArray<TPosLmItemId> toBeRemoved;
+ CleanupClosePushL(toBeRemoved);
+
+ for (i = 0; i < oldCategoryArray.Count(); i++)
+ {
+ if (categoryArray.Find(oldCategoryArray[i]) == KErrNotFound)
+ {
+ User::LeaveIfError(toBeRemoved.Append(oldCategoryArray[i]));
+ }
+ }
+
+ RemoveCategoriesFromLandmarkL(aDbAccess, toBeRemoved,
+ aLandmark.LandmarkId());
+
+ CleanupStack::PopAndDestroy(3, &categoryArray); //&oldCategoryArray
+ // &toBeRemoved
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::UpdateFieldsL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const CPosLandmark& aLandmark,
+ const CPosLandmark& aOldLandmark)
+ {
+ RArray<TUint> toBeChanged;
+ CleanupClosePushL(toBeChanged);
+
+ RArray<TUint> toBeAdded;
+ CleanupClosePushL(toBeAdded);
+
+ TPositionFieldId positionFieldId = aLandmark.FirstPositionFieldId();
+
+ while (positionFieldId != EPositionFieldNone)
+ {
+ if (aOldLandmark.IsPositionFieldAvailable(positionFieldId))
+ {
+ TPtrC fieldValue;
+ TPtrC oldFieldValue;
+
+ User::LeaveIfError(aLandmark.GetPositionField(positionFieldId,
+ fieldValue));
+ User::LeaveIfError(aOldLandmark.GetPositionField(positionFieldId,
+ oldFieldValue));
+
+ if (fieldValue.Compare(oldFieldValue) != 0)
+ {
+ User::LeaveIfError(toBeChanged.Append(positionFieldId));
+ }
+ }
+ else
+ {
+ User::LeaveIfError(toBeAdded.Append(positionFieldId));
+ }
+
+ positionFieldId = aLandmark.NextPositionFieldId(positionFieldId);
+ }
+
+ AddFieldsToLandmarkL(aDbAccess, toBeAdded, aLandmark);
+ CleanupStack::PopAndDestroy(&toBeAdded);
+
+ UpdateFieldsForLandmarkL(aDbAccess, toBeChanged, aLandmark);
+ CleanupStack::PopAndDestroy(&toBeChanged);
+
+ RArray<TUint> toBeRemoved;
+ CleanupClosePushL(toBeRemoved);
+
+ positionFieldId = aOldLandmark.FirstPositionFieldId();
+
+ while (positionFieldId != EPositionFieldNone)
+ {
+ if (!aLandmark.IsPositionFieldAvailable(positionFieldId))
+ {
+ User::LeaveIfError(toBeRemoved.Append(positionFieldId));
+ }
+
+ positionFieldId = aOldLandmark.NextPositionFieldId(positionFieldId);
+ }
+
+ RemoveFieldsFromLandmarkL(aDbAccess, toBeRemoved, aLandmark);
+ CleanupStack::PopAndDestroy(&toBeRemoved);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::UpdateIconAndBasicLandmarkInfoL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const CPosLandmark& aLandmark,
+ const CPosLandmark& aOldLandmark)
+ {
+ if (!CheckIfIconAndBasicInfoAreEqualL(aLandmark, aOldLandmark))
+ {
+ TUint32 oldIconId;
+ TBool oldIconExists = ReadIconPathIdL(aDbAccess, aLandmark.LandmarkId(),
+ oldIconId);
+
+ TPtrC path;
+ TInt iconIndex;
+ TInt maskIndex;
+ TUint32 iconId = 0;
+
+ if (aLandmark.GetIcon(path, iconIndex, maskIndex) == KErrNone)
+ {
+ PosLmIconHandler::GetIconPathIdL(aDbAccess, path, iconId);
+ }
+
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlFindUint, &KPosLmSqlAll,
+ &KPosLmLandmarkTable, &KPosLmLandmarkIdCol, aLandmark.LandmarkId());
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation,
+ view, *sql);
+
+ if (view.NextL())
+ {
+ view.UpdateL();
+
+ SetIconL(view, aLandmark, iconId);
+ SetPositionL(view, aLandmark);
+ SetCoverageRadiusL(view, aLandmark);
+ SetLandmarkNameL(view, aLandmark);
+ SetLandmarkDescriptionL(view, aLandmark);
+
+ view.PutL();
+ }
+ else
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+
+ if (oldIconExists)
+ {
+ PosLmIconHandler::RemoveIconIfNotUsedL(aDbAccess, oldIconId);
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool PosLmLandmarkHandler::CheckIfIconAndBasicInfoAreEqualL(
+ const CPosLandmark& aLandmark,
+ const CPosLandmark& aLandmarkInDb)
+ {
+ TBool equal = ETrue;
+
+ TPtrC str1;
+ TPtrC str2;
+ TInt icon1;
+ TInt icon2;
+ TInt mask1;
+ TInt mask2;
+ TLocality pos1;
+ TLocality pos2;
+ TReal32 cov1;
+ TReal32 cov2;
+
+ if (aLandmark.GetIcon(str1, icon1, mask1) !=
+ aLandmarkInDb.GetIcon(str2, icon2, mask2) ||
+ (aLandmark.GetIcon(str1, icon1, mask1) == KErrNone &&
+ (icon1 != icon2 || mask1 != mask2 || str1.Compare(str2) != 0)))
+ { // Check icon
+ equal = EFalse;
+ }
+ else if (aLandmark.GetPosition(pos1) != aLandmarkInDb.GetPosition(pos2) ||
+ (aLandmark.GetPosition(pos1) == KErrNone && (
+ !PosLmTrealCompare::IsEqual(pos1.Latitude(), pos2.Latitude()) ||
+ !PosLmTrealCompare::IsEqual(pos1.Longitude(), pos2.Longitude()) ||
+ !PosLmTrealCompare::IsEqual(pos1.Altitude(), pos2.Altitude()) ||
+ !PosLmTrealCompare::IsEqual(pos1.HorizontalAccuracy(),
+ pos2.HorizontalAccuracy()) ||
+ !PosLmTrealCompare::IsEqual(pos1.VerticalAccuracy(),
+ pos2.VerticalAccuracy())
+ )))
+ { // Check position
+ equal = EFalse;
+ }
+ else if (aLandmark.GetCoverageRadius(cov1) !=
+ aLandmarkInDb.GetCoverageRadius(cov2) ||
+ (aLandmark.GetCoverageRadius(cov1) == KErrNone &&
+ !PosLmTrealCompare::IsEqual(cov1, cov2)))
+ { // Check coverage radius
+ equal = EFalse;
+ }
+ else if (aLandmarkInDb.GetLandmarkName(str2) != KErrNone ||
+ (aLandmark.GetLandmarkName(str1) != KErrNone &&
+ str2.Compare(KNullDesC) != 0) ||
+ (aLandmark.GetLandmarkName(str1) == KErrNone &&
+ str2.Compare(str1) != 0))
+ { // Check name
+ equal = EFalse;
+ }
+ else if (aLandmarkInDb.GetLandmarkDescription(str2) != KErrNone ||
+ (aLandmark.GetLandmarkDescription(str1) != KErrNone &&
+ str2.Compare(KNullDesC) != 0) ||
+ (aLandmark.GetLandmarkDescription(str1) == KErrNone &&
+ str2.Compare(str1) != 0))
+ { // Check description
+ equal = EFalse;
+ }
+
+ return equal;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::RemoveNonExistingCategoriesL(
+ CPosLmLocalDbAccess& aDbAccess,
+ RArray<TPosLmItemId>& aCategoryIdArray)
+ {
+ RArray<TPosLmItemId> categoriesInDatabase;
+ CleanupClosePushL(categoriesInDatabase);
+
+ PosLmCategoryHandler::GetAllCategoryIdsL(aDbAccess,
+ CPosLmCategoryManager::ECategorySortOrderNone, categoriesInDatabase);
+
+ if (categoriesInDatabase.Count() == 0)
+ {
+ aCategoryIdArray.Reset();
+ }
+
+ for (TInt i = 0; i < aCategoryIdArray.Count();)
+ {
+ if (categoriesInDatabase.Find(aCategoryIdArray[i]) == KErrNotFound)
+ {
+ aCategoryIdArray.Remove(i);
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(&categoriesInDatabase);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::RemoveCategoriesFromLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const RArray<TPosLmItemId>& aCategories,
+ const TPosLmItemId& aLandmarkId)
+ {
+ for (TInt i = 0; i < aCategories.Count(); i++)
+ {
+ RemoveCategoryFromLandmarkL(aDbAccess, aCategories[i], aLandmarkId);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::AddFieldsToLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const RArray<TUint>& aFieldIds,
+ const CPosLandmark& aLandmark)
+ {
+ if (aFieldIds.Count() > 0)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlSelect, &KPosLmSqlAll,
+ &KPosLmLandmarkFieldTable);
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EAddPreparation, view,
+ *sql);
+
+ for (TInt i = 0; i < aFieldIds.Count(); i++)
+ {
+ InsertFieldL(view, (TPositionFieldId)aFieldIds[i], aLandmark);
+ }
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::UpdateFieldsForLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const RArray<TUint>& aFieldIds,
+ const CPosLandmark& aLandmark)
+ {
+ for (TInt i = 0; i < aFieldIds.Count(); i++)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlFind2Uint, &KPosLmSqlAll,
+ &KPosLmLandmarkFieldTable, &KPosLmLandmarkIdCol,
+ aLandmark.LandmarkId(), &KPosLmFieldTypeCol, aFieldIds[i]);
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation,
+ view, *sql);
+
+ TPtrC fieldValue;
+ User::LeaveIfError(aLandmark.GetPositionField(
+ (TPositionFieldId)aFieldIds[i], fieldValue));
+
+ if (view.NextL())
+ {
+ view.UpdateL();
+ PosLmLongTextColHandler::WriteToLongTextColumnL(fieldValue, view,
+ EPosLmLfcFieldStringCol);
+ view.PutL();
+ }
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::RemoveFieldsFromLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const RArray<TUint>& aFieldIds,
+ const CPosLandmark& aLandmark)
+ {
+ for (TInt i = 0; i < aFieldIds.Count(); i++)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlDeleteBy2Uint, &KPosLmLandmarkFieldTable,
+ &KPosLmLandmarkIdCol, aLandmark.LandmarkId(), &KPosLmFieldTypeCol,
+ aFieldIds[i]);
+
+ aDbAccess.ExecuteL(*sql);
+ CleanupStack::PopAndDestroy(sql);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::InsertFieldL(
+ RDbView& view,
+ const TPositionFieldId& aFieldId,
+ const CPosLandmark& aLandmark)
+ {
+ TPtrC fieldValue;
+
+ User::LeaveIfError(aLandmark.GetPositionField(aFieldId, fieldValue));
+
+ view.InsertL();
+ view.SetColL(EPosLmLfcLandmarkIdCol, aLandmark.LandmarkId());
+ view.SetColL(EPosLmLfcFieldTypeCol, (TUint)aFieldId);
+ PosLmLongTextColHandler::WriteToLongTextColumnL(fieldValue, view,
+ EPosLmLfcFieldStringCol);
+ view.PutL();
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::SetPositionL(
+ RDbView& aView,
+ const CPosLandmark& aLandmark)
+ {
+ TLocality position;
+
+ if (aLandmark.GetPosition(position) == KErrNone)
+ {
+ aView.SetColL(EPosLmLcLatitudeCol, position.Latitude());
+ aView.SetColL(EPosLmLcLongitudeCol, position.Longitude());
+
+ if (!Math::IsNaN(position.Altitude()))
+ {
+ aView.SetColL(EPosLmLcAltitudeCol, position.Altitude());
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcAltitudeCol);
+ }
+
+ if (!Math::IsNaN(position.HorizontalAccuracy()))
+ {
+ aView.SetColL(EPosLmLcHorizAccCol, position.HorizontalAccuracy());
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcHorizAccCol);
+ }
+
+ if (!Math::IsNaN(position.VerticalAccuracy()))
+ {
+ aView.SetColL(EPosLmLcVertAccCol, position.VerticalAccuracy());
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcVertAccCol);
+ }
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcLatitudeCol);
+ aView.SetColNullL(EPosLmLcLongitudeCol);
+ aView.SetColNullL(EPosLmLcAltitudeCol);
+ aView.SetColNullL(EPosLmLcHorizAccCol);
+ aView.SetColNullL(EPosLmLcVertAccCol);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::SetCoverageRadiusL(
+ RDbView& aView,
+ const CPosLandmark& aLandmark)
+ {
+ TReal32 covRadius;
+
+ if (aLandmark.GetCoverageRadius(covRadius) == KErrNone)
+ {
+ aView.SetColL(EPosLmLcCoverageRadiusCol, covRadius);
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcCoverageRadiusCol);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::SetLandmarkNameL(
+ RDbView& aView,
+ const CPosLandmark& aLandmark)
+ {
+ TPtrC name;
+
+ if (aLandmark.GetLandmarkName(name) == KErrNone)
+ {
+ PosLmLongTextColHandler::WriteToLongTextColumnL(name, aView,
+ EPosLmLcNameCol);
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcNameCol);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::SetLandmarkDescriptionL(
+ RDbView& aView,
+ const CPosLandmark& aLandmark)
+ {
+ TPtrC description;
+
+ if (aLandmark.GetLandmarkDescription(description) == KErrNone)
+ {
+ PosLmLongTextColHandler::WriteToLongTextColumnL(description, aView,
+ EPosLmLcDescriptionCol);
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcDescriptionCol);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::SetIconL(
+ RDbView& aView,
+ const CPosLandmark& aLandmark,
+ const TUint32 aIconPathId)
+ {
+ TPtrC path;
+ TInt iconIndex;
+ TInt maskIndex;
+
+ if (aLandmark.GetIcon(path, iconIndex, maskIndex) == KErrNone)
+ {
+ aView.SetColL(EPosLmLcIconIdCol, aIconPathId);
+ aView.SetColL(EPosLmLcIconPicNrCol, iconIndex);
+ aView.SetColL(EPosLmLcMaskPicNrCol, maskIndex);
+ }
+ else
+ {
+ aView.SetColNullL(EPosLmLcIconIdCol);
+ aView.SetColNullL(EPosLmLcIconPicNrCol);
+ aView.SetColNullL(EPosLmLcMaskPicNrCol);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool PosLmLandmarkHandler::ReadIconPathIdL(
+ CPosLmLocalDbAccess& aDbAccess,
+ const TPosLmItemId& aLandmarkId,
+ TUint32& aIconPathId)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlFindUint, &KPosLmIconIdCol,
+ &KPosLmLandmarkTable, &KPosLmLandmarkIdCol, aLandmarkId);
+
+ RDbView view;
+ aDbAccess.PrepareViewLC(CPosLmLocalDbAccess::EUpdatablePreparation, view,
+ *sql);
+
+ TBool iconIsSet = EFalse;
+
+ if (view.NextL())
+ {
+ view.GetL();
+
+ if (!view.IsColNull(1))
+ {
+ aIconPathId = view.ColUint32(1);
+ iconIsSet = ETrue;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(2, sql); //&view
+
+ return iconIsSet;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::RemoveAllCategoriesFromLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TPosLmItemId aLandmarkId)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlDeleteUint, &KPosLmLandmarkCategoryTable,
+ &KPosLmLandmarkIdCol, aLandmarkId);
+
+ aDbAccess.ExecuteL(*sql);
+
+ CleanupStack::PopAndDestroy(sql);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::RemoveAllFieldsFromLandmarkL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TPosLmItemId aLandmarkId)
+ {
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlDeleteUint, &KPosLmLandmarkFieldTable,
+ &KPosLmLandmarkIdCol, aLandmarkId);
+
+ aDbAccess.ExecuteL(*sql);
+
+ CleanupStack::PopAndDestroy(sql);
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool PosLmLandmarkHandler::RemoveBasicLandmarkInfoL(
+ CPosLmLocalDbAccess& aDbAccess,
+ TPosLmItemId aLandmarkId,
+ TUint32& aIconPathId)
+ {
+ // Get icon if it exists.
+ TBool hasIcon = ReadIconPathIdL(aDbAccess, aLandmarkId, aIconPathId);
+
+ // Remove landmark
+ HBufC* sql = HBufC::NewLC(KPosLmSqlStatementMaxLen);
+ sql->Des().Format(KPosLmSqlDeleteUint, &KPosLmLandmarkTable,
+ &KPosLmLandmarkIdCol, aLandmarkId);
+
+ aDbAccess.ExecuteL(*sql);
+
+ CleanupStack::PopAndDestroy(sql);
+
+ return hasIcon;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint PosLmLandmarkHandler::TotalLandmarkCountL( CPosLmLocalDbAccess& aDbAccess )
+ {
+ return PosLmDatabaseUtility::GetTableRowCountL( aDbAccess, KPosLmLandmarkTable );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmLandmarkHandler::OpenLandmarkViewLC(
+ TPosLmItemId aLandmarkId,
+ RDbView& aView,
+ CPosLmLocalDbAccess& aDbAccess )
+ {
+ HBufC* sql = HBufC::NewLC( KPosLmSqlStatementMaxLen );
+ sql->Des().Format( KPosLmSqlFindUint, &KPosLmSqlAll, &KPosLmLandmarkTable,
+ &KPosLmLandmarkIdCol, aLandmarkId );
+
+ aDbAccess.PrepareViewLC(
+ CPosLmLocalDbAccess::EUpdatablePreparation, aView, *sql );
+
+ if ( !aView.NextL() )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ CleanupStack::Pop( &aView );
+ CleanupStack::PopAndDestroy( sql );
+ CleanupClosePushL( aView );
+ }