--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/basiclocationinfodisplay/blid/engine/src/CBlidRouter.cpp Tue Feb 02 00:16:03 2010 +0200
@@ -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 <f32file.h> // RFs
+#include <e32math.h>
+#include <sysutil.h>
+#include <driveinfo.h>
+
+#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<TNamedCoordinate> 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<KBlidWaypointNameMaxLen> 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<TNamedCoordinate> 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
+
+