diff -r 1fc85118c3ae -r 870918037e16 mapnavproviderrefapp/src/mnrpnavimodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapnavproviderrefapp/src/mnrpnavimodel.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,241 @@ +/* +* Copyright (c) 2006-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: CMnrpNaviModel class implementation +* +*/ + + +#include +#include +#include + +#include +#include +#include + +#include + +#include "mnrputils.h" +#include "mnrpengine.h" +#include "mnrpnavimodel.h" + +const TInt KUpdateInterval = 1 * 1000 * 1000; // 1 sec +const TInt KUpdateTimeout = 10 * 1000 * 1000; // 10 sec + +_LIT( KNotDefined, "" ); +_LIT( KDestination, "destination" ); +_LIT( KPosition, "position" ); +_LIT( KDistance, "distance" ); +_LIT( KBearing, "bearing" ); +_LIT( KDestinationLat, "dest.lat." ); +_LIT( KDestinationLon, "dest.lon." ); +_LIT( KPositionLat, "pos.lat." ); +_LIT( KPositionLon, "pos.lon." ); +_LIT( KSpeed, "speed" ); +_LIT( KHeading, "heading" ); +_LIT( KMagHeading, "m.heading" ); +_LIT( KCourse, "course" ); +_LIT( KMagCourse, "m.course" ); + +// ========================== MEMBER CLASS' FUNCTIONS ========================== + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CMnrpNaviModel::CListItem* CMnrpNaviModel::CListItem::NewL( + const TDesC& aItemHeader, + const TDesC& aItemValue ) + { + CListItem* self = new (ELeave) CListItem; + CleanupStack::PushL( self ); + self->iHeader = aItemHeader.AllocL(); + self->iValue = aItemValue.AllocL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CMnrpNaviModel::CListItem::~CListItem() + { + delete iHeader; + delete iValue; + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CMnrpNaviModel::CMnrpNaviModel( MNaviModelObserver& aObserver, CMnrpEngine& aEngine ) + : iEngine( aEngine ), iObserver( aObserver ) + { + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CMnrpNaviModel::~CMnrpNaviModel() + { + delete iPositionRequest; + delete iDestination; + iListItems.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CMnrpNaviModel* CMnrpNaviModel::NewL( MNaviModelObserver& aObserver, CMnrpEngine& aEngine ) + { + CMnrpNaviModel* self = new (ELeave) CMnrpNaviModel( aObserver, aEngine ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CMnrpNaviModel::ConstructL() + { + _LIT( KRequestorName, "MnRefProvider" ); + iPositionRequest = CMnrpPositionRequest::NewL( KRequestorName, *this ); + + TPositionUpdateOptions options; + options.SetUpdateInterval( TTimeIntervalMicroSeconds( KUpdateInterval ) ); + options.SetUpdateTimeOut( TTimeIntervalMicroSeconds( KUpdateTimeout ) ); + iPositionRequest->SetOptionsL( options ); + + iPositionRequest->FetchNewPosition(); + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CMnrpNaviModel::SetDestinationL( const CPosLandmark& aNewDestination ) + { + delete iDestination; + iDestination = NULL; + iDestination = CPosLandmark::NewL( aNewDestination ); + + iObserver.HandleModelUpdateL(); + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TArray CMnrpNaviModel::ListItemsL() + { + iListItems.ResetAndDestroy(); + + TBuf<64> buf; + TPosition position; + TLocality destination; + + iPosInfo.GetPosition( position ); + + if ( !iDestination || iDestination->GetPosition( destination ) ) + { + iListItems.AppendL( CListItem::NewL( KDestination, KNotDefined ) ); + } + else + { + TPtrC name; + iDestination->GetLandmarkName( name ); + HBufC* printableName = MnrpUtils::PrintableStringLC( name ); + iListItems.AppendL( CListItem::NewL( KDestination, *printableName ) ); + CleanupStack::PopAndDestroy( printableName ); + + TBool validPosition = ( !Math::IsNaN( position.Latitude() ) && + !Math::IsNaN( position.Longitude() ) ); + + if ( validPosition ) + { + TReal32 distance, bearing; + if ( position.Distance( destination, distance ) == KErrNone ) + { + MnrpUtils::DistanceToString( distance, buf ); + iListItems.AppendL( CListItem::NewL( KDistance, buf ) ); + } + else + { + iListItems.AppendL( CListItem::NewL( KDistance, KNotDefined ) ); + } + + if ( position.BearingTo( destination, bearing ) == KErrNone ) + { + MnrpUtils::AngleToString( bearing, buf ); + iListItems.AppendL( CListItem::NewL( KBearing, buf ) ); + } + else + { + iListItems.AppendL( CListItem::NewL( KBearing, KNotDefined ) ); + } + + MnrpUtils::SpeedToString( iPositionRequest->Speed(), buf ); + iListItems.AppendL( CListItem::NewL( KSpeed, buf ) ); + + MnrpUtils::AngleToString( iPositionRequest->Course(), buf ); + iListItems.AppendL( CListItem::NewL( KCourse, buf ) ); + + MnrpUtils::AngleToString( iPositionRequest->Heading(), buf ); + iListItems.AppendL( CListItem::NewL( KHeading, buf ) ); + + MnrpUtils::CoordinateToString( position.Latitude(), buf, ETrue, ETrue ); + iListItems.AppendL( CListItem::NewL( KPositionLat, buf ) ); + + MnrpUtils::CoordinateToString( position.Longitude(), buf, ETrue, ETrue ); + iListItems.AppendL( CListItem::NewL( KPositionLon, buf ) ); + } + else + { + iListItems.AppendL( CListItem::NewL( KPosition, KNotDefined ) ); + } + + MnrpUtils::CoordinateToString( destination.Latitude(), buf, ETrue, ETrue ); + iListItems.AppendL( CListItem::NewL( KDestinationLat, buf ) ); + + MnrpUtils::CoordinateToString( destination.Longitude(), buf, ETrue, ETrue ); + iListItems.AppendL( CListItem::NewL( KDestinationLon, buf ) ); + + if ( validPosition ) + { + MnrpUtils::AngleToString( iPositionRequest->MagneticCourse(), buf ); + iListItems.AppendL( CListItem::NewL( KMagCourse, buf ) ); + + MnrpUtils::AngleToString( iPositionRequest->MagneticHeading(), buf ); + iListItems.AppendL( CListItem::NewL( KMagHeading, buf ) ); + } + } + + return iListItems.Array(); + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CMnrpNaviModel::HandlePositionRequestCompletedL( TInt aError ) + { + if ( !aError ) + { + iPositionRequest->GetPosition( iPosInfo ); + TPosition position; + iPosInfo.GetPosition( position ); + + iObserver.HandleModelUpdateL(); + } + iPositionRequest->FetchNewPosition(); + }