--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/clientlib/src/EPos_CPosLandmark.cpp Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,807 @@
+/*
+* Copyright (c) 2005-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 container class for a landmark.
+*
+*
+*/
+
+
+// INCLUDE FILES
+#include "EPos_CPosLandmark.h"
+#include "EPos_LandmarksErrors.h"
+#include <e32math.h>
+#include <lbsposition.h>
+
+// CONSTANTS
+const TInt KPosFieldsGranularity = 8;
+
+// Constants used for setting the timestamp
+_LIT( KYearFormat, "%04d" );
+_LIT( KFormatMicroSeconds, "%06d" );
+_LIT( KFormat, "%02d" );
+_LIT( KTimeMicroSecondSeparator, "." );
+_LIT( KDateTimeSeparator, ":" );
+// constants used for the place id & timestamp fields which internally use the
+// TPositionFieldId for storing the values.
+const TPositionFieldId KPlaceIdPositionField = EPositionFieldProprietaryFieldsBegin;
+const TPositionFieldId KTimeStampPositionField = EPositionFieldProprietaryFieldsBegin+1;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CPosLandmark::CPosLandmark()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPosLandmark::CPosLandmark()
+: iId(KPosLmNullItemId),
+ iIsPartial(EFalse),
+ iLandmarkName(NULL),
+ iPosition(NULL),
+ iCategoryArray(),
+ iPositionFieldIds(KPosFieldsGranularity),
+ iPositionFieldStrings(NULL),
+ iIconFileName(NULL),
+ iIconIndex(KErrNotFound),
+ iIconMaskIndex(KPosLmIconMaskNotUsed),
+ iLandmarkDescription(NULL)
+ {
+ TRealX nan;
+ nan.SetNaN();
+
+ iCoverageRadius = nan;
+ }
+
+// -----------------------------------------------------------------------------
+// CPosLandmark::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPosLandmark::ConstructL()
+ {
+ iPositionFieldStrings = new (ELeave) CDesCArrayFlat(KPosFieldsGranularity);
+ }
+
+// -----------------------------------------------------------------------------
+// CPosLandmark::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPosLandmark::ConstructL(const CPosLandmark& aLandmark)
+ {
+ iId = aLandmark.iId;
+ iIsPartial = aLandmark.iIsPartial;
+ iCoverageRadius = aLandmark.iCoverageRadius;
+ iIconIndex = aLandmark.iIconIndex;
+ iIconMaskIndex = aLandmark.iIconMaskIndex;
+
+ if (aLandmark.iLandmarkName)
+ {
+ iLandmarkName = aLandmark.iLandmarkName->AllocL();
+ }
+
+ if (aLandmark.iPosition)
+ {
+ iPosition = new (ELeave) TLocality(*aLandmark.iPosition);
+ }
+
+ TInt i;
+ for (i = 0; i < aLandmark.iCategoryArray.Count(); i++)
+ {
+ User::LeaveIfError(iCategoryArray.Append(aLandmark.iCategoryArray[i]));
+ }
+
+ for (i = 0; i < aLandmark.iPositionFieldIds.Count(); i++)
+ {
+ User::LeaveIfError(
+ iPositionFieldIds.Append(aLandmark.iPositionFieldIds[i]));
+ }
+
+ iPositionFieldStrings = new (ELeave) CDesCArrayFlat(KPosFieldsGranularity);
+ for (i = 0; i < aLandmark.iPositionFieldStrings->MdcaCount(); i++)
+ {
+ iPositionFieldStrings->AppendL(
+ aLandmark.iPositionFieldStrings->MdcaPoint(i));
+ }
+
+ if (aLandmark.iIconFileName)
+ {
+ iIconFileName = aLandmark.iIconFileName->AllocL();
+ }
+
+ if (aLandmark.iLandmarkDescription)
+ {
+ iLandmarkDescription = aLandmark.iLandmarkDescription->AllocL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPosLandmark::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPosLandmark* CPosLandmark::NewLC()
+ {
+ CPosLandmark* self = new (ELeave) CPosLandmark;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CPosLandmark::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPosLandmark* CPosLandmark::NewL()
+ {
+ CPosLandmark* self = CPosLandmark::NewLC();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CPosLandmark::NewLC
+// Two-phased copy constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPosLandmark* CPosLandmark::NewLC(
+ const CPosLandmark& aLandmark)
+ {
+ CPosLandmark* self = new (ELeave) CPosLandmark;
+ CleanupStack::PushL(self);
+ self->ConstructL(aLandmark);
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CPosLandmark::NewL
+// Two-phased copy constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPosLandmark* CPosLandmark::NewL(
+ const CPosLandmark& aLandmark)
+ {
+ CPosLandmark* self = CPosLandmark::NewLC(aLandmark);
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// Destructor
+CPosLandmark::~CPosLandmark()
+ {
+ delete iLandmarkName;
+ delete iPosition;
+ iCategoryArray.Close();
+ iPositionFieldIds.Close();
+ delete iPositionFieldStrings;
+ delete iIconFileName;
+ delete iLandmarkDescription;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::LandmarkId
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TPosLmItemId CPosLandmark::LandmarkId() const
+ {
+ return iId;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::IsPartial
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TBool CPosLandmark::IsPartial() const
+ {
+ return iIsPartial;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetLandmarkName
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetLandmarkName(
+ TPtrC& aLandmarkName) const
+ {
+ if (!iLandmarkName)
+ {
+ return KErrNotFound;
+ }
+
+ aLandmarkName.Set(*iLandmarkName);
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetLandmarkNameL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetLandmarkNameL(
+ const TDesC& aLandmarkName)
+ {
+ if (aLandmarkName.Length() > KPosLmMaxTextFieldLength)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ HBufC* previousName = iLandmarkName;
+ iLandmarkName = aLandmarkName.AllocL();
+ delete previousName;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetPosition
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetPosition(
+ TLocality& aPosition) const
+ {
+ if (!iPosition)
+ {
+ return KErrNotFound;
+ }
+
+ aPosition = *iPosition;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetPositionL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetPositionL(
+ const TLocality& aPosition)
+ {
+ if (Math::IsNaN(aPosition.Latitude()) ||
+ Math::IsNaN(aPosition.Longitude()) ||
+ aPosition.Datum() != KPositionDatumWgs84)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ TLocality* previousPosition = iPosition;
+ iPosition = new (ELeave) TLocality(aPosition);
+ delete previousPosition;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetCoverageRadius
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetCoverageRadius(
+ TReal32& aCoverageRadius) const
+ {
+ if (Math::IsNaN(TReal(iCoverageRadius)))
+ {
+ return KErrNotFound;
+ }
+
+ aCoverageRadius = iCoverageRadius;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetCoverageRadius
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetCoverageRadius(
+ TReal32 aCoverageRadius)
+ {
+ if (!Math::IsNaN(TReal(aCoverageRadius)) &&
+ aCoverageRadius < 0)
+ {
+ Panic(KPosLandmarksClientPanic, EPosNegativeValue);
+ }
+
+ iCoverageRadius = aCoverageRadius;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::AddCategoryL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::AddCategoryL(
+ TPosLmItemId aCategoryId)
+ {
+ if (aCategoryId == KPosLmNullItemId)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ TInt index = iCategoryArray.Find(aCategoryId);
+ if (index == KErrNotFound)
+ {
+ User::LeaveIfError(iCategoryArray.Append(aCategoryId));
+ }
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::RemoveCategory
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::RemoveCategory(
+ TPosLmItemId aCategoryId)
+ {
+ TInt index = iCategoryArray.Find(aCategoryId);
+ if (index != KErrNotFound)
+ {
+ iCategoryArray.Remove(index);
+ }
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetCategoriesL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::GetCategoriesL(
+ RArray<TPosLmItemId>& aCategoryIdArray) const
+ {
+ aCategoryIdArray.Reset();
+ for (TInt i = 0; i < iCategoryArray.Count(); i++)
+ {
+ User::LeaveIfError(aCategoryIdArray.Append(iCategoryArray[i]));
+ }
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::IsPositionFieldAvailable
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TBool CPosLandmark::IsPositionFieldAvailable(
+ TPositionFieldId aFieldId) const
+ {
+ TInt index = iPositionFieldIds.Find(aFieldId);
+ if (index == KErrNotFound)
+ {
+ return EFalse;
+ }
+ else
+ {
+ return ETrue;
+ }
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::NumOfAvailablePositionFields
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TUint CPosLandmark::NumOfAvailablePositionFields() const
+ {
+ return iPositionFieldIds.Count();
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::FirstPositionFieldId
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TPositionFieldId CPosLandmark::FirstPositionFieldId() const
+ {
+ if (iPositionFieldIds.Count() == 0)
+ {
+ return EPositionFieldNone;
+ }
+
+ return static_cast<TPositionFieldId>(iPositionFieldIds[0]);
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::NextPositionFieldId
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TPositionFieldId CPosLandmark::NextPositionFieldId(
+ TPositionFieldId aFieldId) const
+ {
+ TInt index = iPositionFieldIds.Find(aFieldId);
+ if (index == KErrNotFound)
+ {
+ Panic(KPosLandmarksClientPanic, EPosInvalidPositionFieldId);
+ }
+
+ if (++index == iPositionFieldIds.Count())
+ {
+ return EPositionFieldNone;
+ }
+
+ return static_cast<TPositionFieldId>(iPositionFieldIds[index]);
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetPositionField
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetPositionField(
+ TPositionFieldId aFieldId,
+ TPtrC& aFieldValue) const
+ {
+ TInt index = iPositionFieldIds.Find(aFieldId);
+ if (index == KErrNotFound)
+ {
+ return KErrNotFound;
+ }
+
+ aFieldValue.Set(iPositionFieldStrings->MdcaPoint(index));
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetPositionFieldL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetPositionFieldL(
+ TPositionFieldId aFieldId,
+ const TDesC& aFieldValue)
+ {
+ if (aFieldValue.Length() > KPosLmMaxTextFieldLength)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ if (aFieldId == EPositionFieldNone)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ // Does the field already exist?
+ TInt index = iPositionFieldIds.Find(aFieldId);
+ if (index == KErrNotFound)
+ {
+ // Create the field
+ iPositionFieldStrings->AppendL(aFieldValue);
+ TInt appendResult = iPositionFieldIds.Append(aFieldId);
+
+ if (appendResult != KErrNone)
+ {
+ // iPositionFieldStrings and iPositionFieldIds must contain
+ // matching string/id pairs, thus remove the last string in
+ // iPositionFieldStrings.
+ iPositionFieldStrings->Delete(iPositionFieldStrings->Count() - 1);
+ User::Leave(appendResult);
+ }
+ }
+ else
+ {
+ // Update the field by inserting a new field and removing the old one.
+ iPositionFieldStrings->InsertL(index, aFieldValue);
+ iPositionFieldStrings->Delete(index + 1);
+ }
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::RemovePositionField
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::RemovePositionField(
+ TPositionFieldId aFieldId)
+ {
+ TInt index = iPositionFieldIds.Find(aFieldId);
+ if (index != KErrNotFound)
+ {
+ iPositionFieldIds.Remove(index);
+ iPositionFieldStrings->Delete(index);
+ }
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetIconL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetIconL(
+ const TDesC& aIconFileName,
+ TInt aIconIndex,
+ TInt aIconMaskIndex)
+ {
+ if (aIconFileName.Length() > KMaxFileName)
+ {
+ User::Leave(KErrArgument);
+ }
+ if (aIconIndex < 0 || aIconMaskIndex < KPosLmIconMaskNotUsed)
+ {
+ Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument);
+ }
+
+ HBufC* previousFileName = iIconFileName;
+ iIconFileName = aIconFileName.AllocL();
+ delete previousFileName;
+
+ iIconIndex = aIconIndex;
+ iIconMaskIndex = aIconMaskIndex;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetIcon
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetIcon(
+ TPtrC& aIconFileName,
+ TInt& aIconIndex,
+ TInt& aIconMaskIndex) const
+ {
+ if (!iIconFileName)
+ {
+ return KErrNotFound;
+ }
+
+ aIconIndex = iIconIndex;
+ aIconMaskIndex = iIconMaskIndex;
+ aIconFileName.Set(*iIconFileName);
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetLandmarkDescription
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetLandmarkDescription(
+ TPtrC& aLandmarkDescription) const
+ {
+ if (!iLandmarkDescription)
+ {
+ return KErrNotFound;
+ }
+
+ aLandmarkDescription.Set(*iLandmarkDescription);
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetLandmarkDescriptionL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetLandmarkDescriptionL(
+ const TDesC& aLandmarkDescription)
+ {
+ if (aLandmarkDescription.Length() > KPosLmMaxDescriptionLength)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ HBufC* previousDescription = iLandmarkDescription;
+ iLandmarkDescription = aLandmarkDescription.AllocL();
+ delete previousDescription;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::RemoveLandmarkAttributes
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::RemoveLandmarkAttributes(
+ TAttributes aAttributes)
+ {
+ if (aAttributes & ELandmarkName)
+ {
+ delete iLandmarkName;
+ iLandmarkName = NULL;
+ }
+
+ if (aAttributes & EPosition)
+ {
+ delete iPosition;
+ iPosition = NULL;
+ }
+
+ if (aAttributes & ECoverageRadius)
+ {
+ TRealX nan;
+ nan.SetNaN();
+
+ iCoverageRadius = nan;
+ }
+
+ if (aAttributes & ECategoryInfo)
+ {
+ iCategoryArray.Reset();
+ }
+
+ if (aAttributes & EIcon)
+ {
+ delete iIconFileName;
+ iIconFileName = NULL;
+ }
+
+ if (aAttributes & EDescription)
+ {
+ delete iLandmarkDescription;
+ iLandmarkDescription = NULL;
+ }
+
+ if ( aAttributes & EPlaceId )
+ {
+ RemovePositionField( KPlaceIdPositionField );
+ }
+
+ if ( aAttributes & ETimeStamp )
+ {
+ RemovePositionField( KTimeStampPositionField );
+ }
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetPartialL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosLandmark::SetPartialL(
+ TBool aPartial)
+ {
+ iIsPartial = aPartial;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetLandmarkIdL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosLandmark::SetLandmarkIdL(
+ TPosLmItemId aId)
+ {
+ iId = aId;
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetPlaceIdL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetPlaceIdL( const TDesC& aPId )
+ {
+ // using the TPositionFieldId::EPositionFieldProprietaryFieldsBegin
+ // for storing the placeid value
+ SetPositionFieldL( KPlaceIdPositionField, aPId );
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetPlaceIdL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetPlaceId( TPtrC& aPId ) const
+ {
+ // Get the value from the TPositionFieldId::EPositionFieldProprietaryFieldsBegin
+ return GetPositionField( KPlaceIdPositionField, aPId );
+
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::SetTimeStampL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPosLandmark::SetTimeStampL( const TTime aTimeStamp )
+ {
+ // Convert TTime to descriptor to store it as position field
+ TBuf<KPosLmMaxTextFieldLength> timeField;
+ // Get the date time info from TTime
+ TDateTime dateTime = aTimeStamp.DateTime();
+
+ // check that the year & day do not have zero values,if yes then
+ // leave with KErrArgument as the date is mandatory
+ if( !dateTime.Year() || !dateTime.Day() )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ // Format the year field according to the number of digits
+ timeField.AppendFormat( KYearFormat, dateTime.Year() );
+
+ // Format month field according to number of digits
+ timeField.AppendFormat( KFormat, dateTime.Month() );
+
+
+ // Format month field according to number of digits
+ timeField.AppendFormat( KFormat, dateTime.Day() );
+
+ // Append the date time separator
+ timeField.Append( KDateTimeSeparator );
+
+ // Format month field according to number of digits
+ timeField.AppendFormat( KFormat, dateTime.Hour() );
+
+
+ // Format month field according to number of digits
+ timeField.AppendFormat( KFormat, dateTime.Minute() );
+
+ // Format month field according to number of digits
+ timeField.AppendFormat( KFormat, dateTime.Second() );
+
+ // Append the time microseconds separator
+ timeField.Append( KTimeMicroSecondSeparator );
+
+ // Format the microseconds field according to number of digits
+ timeField.AppendFormat( KFormatMicroSeconds, dateTime.MicroSecond() );
+
+
+ // using the TPositionFieldId::EPositionFieldProprietaryFieldsBegin+1
+ // for storing the timestamp value
+ SetPositionFieldL( KTimeStampPositionField, timeField );
+
+ }
+
+// ---------------------------------------------------------
+// CPosLandmark::GetTimeStamp
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPosLandmark::GetTimeStamp( TTime& aTimeStamp )const
+ {
+ TPtrC timeField;
+ // Get the value from the TPositionFieldId::EPositionFieldProprietaryFieldsBegin+1
+ TInt error = GetPositionField( KTimeStampPositionField, timeField );
+
+ if ( !error )
+ {
+ // if this field id is specified then convert it to TTime and set aTimeStamp
+ TTime time( timeField );
+ aTimeStamp = time;
+ }
+ return error;
+ }
+// End of File