basiclocationinfodisplay/blid/engine/src/CBlidRouter.cpp
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
--- /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 <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
+
+