diff -r 1fc85118c3ae -r 870918037e16 basiclocationinfodisplay/blid/engine/src/CBlidRouter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/basiclocationinfodisplay/blid/engine/src/CBlidRouter.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,418 @@ +/* +* Copyright (c) 2005 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 CBlidRouter class which provides access to blid router. Blid route can be modified and read using this class +* +*/ + + + +// INCLUDE FILES +#include // RFs +#include +#include +#include + +#include "CBlidRouter.h" +#include "TNamedCoordinate.h" +#include "blidengconsts.h" + +// CONSTANTS +const TInt KBlidInvalidWaypointIndex( -1 ); + +//Forward declaration. Function for sorted ordering of waypoints +TInt WaypointOrdering(const TNamedCoordinate& aCoordinate1, const TNamedCoordinate& aCoordinate2); + +_LIT(KPanicText, "CBlidRouter"); +enum TPanicCode + { + EBlidReadOutOfRange = 1 + }; + +// ============================ MEMBER FUNCTIONS ============================== +// ---------------------------------------------------------------------------- +// CBlidRouter::CBlidRouter +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CBlidRouter::CBlidRouter() + { + iWaypointIndex = -1; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CBlidRouter::ConstructL() + { + iLandmark = NULL; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::NewL +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CBlidRouter* CBlidRouter::NewL() + { + CBlidRouter* self = new( ELeave ) CBlidRouter; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::~CBlidRouter +// ---------------------------------------------------------------------------- +// +CBlidRouter::~CBlidRouter() + { + iRoute.ResetAndDestroy(); + iRoute.Close(); + if( iLandmark ) + { + delete iLandmark; + } + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::At +// ---------------------------------------------------------------------------- +// +TNamedCoordinate& CBlidRouter::At( TInt aIndex ) + { + __ASSERT_ALWAYS(aIndex >= 0 && aIndex < iRoute.Count(), + User::Panic(KPanicText,EBlidReadOutOfRange)); + return *iRoute[aIndex]; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::AppendL +// ---------------------------------------------------------------------------- +// +TInt CBlidRouter::AppendL( TNamedCoordinate* aCoordinate, TBool aCheckForMemory ) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL( fs ); + + if(aCheckForMemory) + { + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &fs, sizeof(aCoordinate), DriveInfo::EDefaultPhoneMemory ) ) + { + CleanupStack::PopAndDestroy(); // fs + return KErrDiskFull; + } + } + CleanupStack::PopAndDestroy(); // fs + TInt retVal; + TLinearOrder order(WaypointOrdering); + retVal = iRoute.InsertInOrder(aCoordinate, order); + return retVal; + } + + +// ---------------------------------------------------------------------------- +// CBlidRouter::RemoveL +// ---------------------------------------------------------------------------- +// +TInt CBlidRouter::RemoveL( TInt aIndex ) + { + __ASSERT_ALWAYS(aIndex >= 0 && aIndex < iRoute.Count(), + User::Panic(KPanicText,EBlidReadOutOfRange)); + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL( fs ); + + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &fs, 0, DriveInfo::EDefaultPhoneMemory ) ) + { + CleanupStack::PopAndDestroy(); // fs + return KErrDiskFull; + } + CleanupStack::PopAndDestroy(); // fs + TNamedCoordinate* plot = iRoute[aIndex]; + iRoute.Remove( aIndex ); + delete plot; + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::ResetAndDestroy +// ---------------------------------------------------------------------------- +// +void CBlidRouter::ResetAndDestroy() + { + iRoute.ResetAndDestroy(); + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::Count +// ---------------------------------------------------------------------------- +// +TInt CBlidRouter::Count() + { + return iRoute.Count(); + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::Waypoint() +// Waypoint getter +// ---------------------------------------------------------------------------- +// +TNamedCoordinate* CBlidRouter::Waypoint() + { + if(!iIsWaypoint || iWaypointIndex == KBlidInvalidWaypointIndex) + { + return NULL; + } + else if( iWaypointIndex == KManualWaypointIndex ) + { + return &iManualWaypoint; + } + else + { + return &iWaypoint; + } + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::IndexOfWaypoint +// ---------------------------------------------------------------------------- +// +TInt CBlidRouter::IndexOfWaypoint() const + { + return iWaypointIndex; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::SetWaypoint( const TInt aIndex ) +// Waypoint setter +// ---------------------------------------------------------------------------- +// +void CBlidRouter::SetWaypoint( const TInt aIndex ) + { + iWaypoint = At( aIndex ); + iWaypointIndex = aIndex; + iIsWaypoint = ETrue; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::RemoveWaypoint() +// ---------------------------------------------------------------------------- +// +void CBlidRouter::RemoveWaypoint() + { + iWaypointIndex = -1; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::ClearSetPoints() +// ---------------------------------------------------------------------------- +// +void CBlidRouter::ClearSetPoints() + { + RemoveWaypoint(); + if(iLandmark) + { + delete iLandmark; + iLandmark = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::ExternalizeL +// ---------------------------------------------------------------------------- +// +void CBlidRouter::ExternalizeL( RWriteStream& aStream ) + { + TDesC *name; + TInt count( Count() ); + aStream.WriteInt32L( count ); + for (TInt i = 0; i < count; i++ ) + { + name = At( i ).Name(); + if ( name ) + { + CleanupStack::PushL( name ); + aStream.WriteInt32L( name->Length() ); + aStream.WriteL( *name ); + CleanupStack::PopAndDestroy(); //name + name = NULL; + + if ( !Math::IsNaN(At( i ).Latitude()) ) + { + aStream.WriteReal64L( At( i ).Latitude() ); + } + else + { + aStream.WriteReal64L( 0 ); + } + + if ( !Math::IsNaN(At( i ).Longitude()) ) + { + aStream.WriteReal64L( At( i ).Longitude() ); + } + else + { + aStream.WriteReal64L( 0 ); + } + + if ( !Math::IsNaN(At( i ).Altitude()) ) + { + aStream.WriteReal32L( At( i ).Altitude() ); + } + else + { + aStream.WriteReal32L( 0 ); + } + if ( !Math::IsNaN(At( i ).Accuracy()) ) + { + aStream.WriteReal32L( At( i ).Accuracy() ); + } + else + { + aStream.WriteReal32L( 0 ); + } + } + } + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::InternalizeV1L +// ---------------------------------------------------------------------------- +// +void CBlidRouter::InternalizeV1L( RReadStream& aStream ) + { + TInt i; + TInt count( aStream.ReadInt32L() ); + TInt length(0); + TBuf name; + for ( i = 0; i < count; i++ ) + { + length = aStream.ReadInt32L(); + aStream.ReadL( name, length ); + TReal64 latitude = aStream.ReadReal64L(); + TReal64 longitude = aStream.ReadReal64L(); + TReal32 altitude = aStream.ReadReal32L(); + TReal32 accuracy = aStream.ReadReal32L(); + TNamedCoordinate* plot = new(ELeave)TNamedCoordinate( + latitude, + longitude, + altitude, + name,accuracy); + CleanupStack::PushL( plot ); + //iRouter takes ownership of plot + User::LeaveIfError( AppendL( plot, EFalse ) ); + CleanupStack::Pop(); //plot + name.Zero(); + } + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::Landmark +// ---------------------------------------------------------------------------- +// +CPosLandmark* CBlidRouter::Landmark() const + { + if( iLandmark && !iIsWaypoint ) + { + return iLandmark; + } + else + { + return NULL; + } + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::SetLandmark +// ---------------------------------------------------------------------------- +// +void CBlidRouter::SetLandmark(CPosLandmark* aLandmark) + { + if( iLandmark ) + { + delete iLandmark; + } + + iLandmark = aLandmark; + iIsWaypoint = EFalse; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::IsWaypointSet +// ---------------------------------------------------------------------------- +// +TBool CBlidRouter::IsWaypointSet() + { + return iIsWaypoint; + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::IsAnyPointSet +// ---------------------------------------------------------------------------- +// +TBool CBlidRouter::IsAnyPointSet() + { + if( iLandmark || (iWaypointIndex != -1) ) + { + return ETrue; + } + else + { + return EFalse; + } + } +// ---------------------------------------------------------------------------- +// CBlidRouter::SetManualWaypoint +// ---------------------------------------------------------------------------- +// +void CBlidRouter::SetManualWaypoint(TReal latitude, TReal longitude, TDesC& aName) + { + iWaypointIndex = KManualWaypointIndex; + iIsWaypoint = ETrue; + iManualWaypoint.SetCoordinate(latitude, longitude); + iManualWaypoint.SetName(aName); + } + +// ---------------------------------------------------------------------------- +// CBlidRouter::FindWaypointIndex +// ---------------------------------------------------------------------------- +// +TInt CBlidRouter::FindWaypointIndex( TNamedCoordinate* aCoordinate ) + { + TLinearOrder order(WaypointOrdering); + iRoute.Sort( order ); + TInt lReturn = iRoute.Find( aCoordinate ); + return lReturn; + } +// ---------------------------------------------------------------------------- +// WaypointOrdering() : Function used for ordering of waypoints +// ---------------------------------------------------------------------------- +// +TInt WaypointOrdering(const TNamedCoordinate& aCoordinate1, const TNamedCoordinate& aCoordinate2) + { + HBufC* name1 = aCoordinate1.Name(); + HBufC* name2 = aCoordinate2.Name(); + TInt retVal = name1->Compare(name2->Des()); + delete name1; + delete name2; + return retVal; + } +// End of File + +