locationmanager/client/src/rtracklog.cpp
changeset 0 c53acadfccc6
child 15 3cebc1a84278
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationmanager/client/src/rtracklog.cpp	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2006-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:  An interface to Track Log API
+*
+*/
+
+#include "rtracklog.h"
+#include "locationmanagerdebug.h"
+#include "CTrackLogObserverAO.h"
+#include "locationmanagerdefs.h"
+
+EXPORT_C RTrackLog::RTrackLog() : RLocationManager(),
+	iWrapQuality( TPckg<TPositionSatelliteInfo>( iFixQuality ) ),
+	iWrapRec( TPckg<TBool>( iRecording ) ),
+	iWrapEventType( TPckg<TEventTypes>( iEventType ) )
+{
+}
+
+// --------------------------------------------------------------------------
+// RTrackLog::StartLocationTrail
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt RTrackLog::StartTrackLog()
+    {
+    LOG( "RTrackLog::StartTrackLog()" );
+    TInt ret( KErrDisconnected );
+    if ( iHandle )
+        {
+        ret = SendReceive( ELocManStartTrackLog );
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::StopTrackLog
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RTrackLog::StopTrackLog()
+    {
+    LOG( "RTrackLog::StopTrackLog()" );
+    if ( iHandle )
+        {
+        SendReceive( ELocManStopTrackLog);
+        }   
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::GetStatus
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt RTrackLog::GetStatus( TBool& aRecording, TPositionSatelliteInfo& aFixQuality )
+    {
+    LOG( "RTrackLog::GetStatus()" );
+    TInt ret( KErrDisconnected );
+    TPckg<TBool> wrapRec( aRecording );
+    TPckg<TPositionSatelliteInfo> wrapQuality( aFixQuality );
+    
+    if ( iHandle )
+        {
+        ret = SendReceive( ELocManGetTrackLogStatus, TIpcArgs( &wrapRec, &wrapQuality ) );
+        }
+    
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::DeleteTrackLog
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt RTrackLog::DeleteTrackLog( TDesC& aUri )
+    {
+    LOG( "RTrackLog::DeleteTrackLog()" );
+    TInt ret( KErrDisconnected );
+    if ( iHandle )
+        {
+        ret = SendReceive( ELocManDeleteTrackLog, TIpcArgs( &aUri ) );
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::IsRecording
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool RTrackLog::IsRecording()
+    {
+    LOG( "RTrackLog::IsRecording()" );
+    TBool rec = EFalse;
+    TPckg<TBool> wrapRec( rec );
+
+    if ( iHandle )
+        {
+        SendReceive( ELocManIsTrackLogRecording, TIpcArgs( &wrapRec ) );
+        }
+    
+    return rec;
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::AddObserver
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt RTrackLog::AddObserver( MTrackLogObserver* aObserver )
+    {
+    LOG( "RTrackLog::AddObserver()" );
+    
+    TInt err( KErrNone );
+    
+    if ( iSubscribed )
+    	{
+    	return KErrAlreadyExists;
+    	}
+    
+    if ( !iHandle )
+    	{
+    	return KErrDisconnected;
+    	}
+    
+    // add message to observer pointer array    
+    err = iObservers.Append( aObserver );
+    
+    if ( err != KErrNone  )
+    	{
+    	return err;
+    	}
+    
+    if ( !iTrackLogObserverAO )
+    	{
+    	iTrackLogObserverAO = new CTrackLogObserverAO( this );
+    	}
+        
+	if ( iTrackLogObserverAO )
+		{
+		iSubscribed = ETrue;
+		iTrackLogObserverAO->StartObserving();
+		}
+	else 
+		{
+		// If creating observer AO failed, reset the observer list (don't destroy observers in it).
+		iObservers.Reset();
+		err = KErrNoMemory;
+		}
+   
+    return err;
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::RemoveObserver
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt RTrackLog::RemoveObserver( MTrackLogObserver* aObserver )
+    {
+    LOG( "RTrackLog::RemoveObserver()" );
+    TInt err( KErrNotFound  );
+    TInt index( 0 );
+    
+    // remove message from observer pointer array
+    TRAP(err, index = iObservers.FindL(aObserver));
+    if (err == KErrNone)
+    	{
+    	iObservers.Remove(index);
+    	}
+  
+    if ( iObservers.Count() == 0 )
+    	{
+    	if ( iHandle )
+        	{
+            SendReceive( ELocManCancelTrackLogNotify );
+        	}
+    	iSubscribed = EFalse;
+    	delete iTrackLogObserverAO;
+    	iTrackLogObserverAO = NULL;
+    	}
+    
+    return err;
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::TrackLogName
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt RTrackLog::TrackLogName(TDes& aTrackLogName)
+    {
+    LOG( "RTrackLog::TrackLogName()" );
+    TInt ret( KErrDisconnected );
+    
+    if ( iHandle )
+        {
+        ret = SendReceive( ELocManTrackLogName, TIpcArgs( &aTrackLogName ) );
+        }
+    
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::Close
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RTrackLog::Close()
+    {
+    LOG( "RTrackLog::Close()" );
+    
+    if ( iHandle )
+    	{
+        SendReceive( ELocManCancelTrackLogNotify );
+    	}
+    
+    iObservers.Reset();		// Just reset the array, don't destroy observers in it.
+    delete iTrackLogObserverAO;
+    iTrackLogObserverAO = NULL;
+    iSubscribed = EFalse;
+    RLocationManager::Close();
+    }
+
+// --------------------------------------------------------------------------
+// RTrackLog::SendNotifyRequest
+// --------------------------------------------------------------------------
+//
+void RTrackLog::SendNotifyRequest( TRequestStatus& aStatus )
+	{
+    SendReceive( ELocManRegObserver, TIpcArgs( &iWrapRec, &iWrapQuality, &iWrapEventType ), 
+    		aStatus );
+	}
+
+// --------------------------------------------------------------------------
+// RTrackLog::GpsQualityChange
+// --------------------------------------------------------------------------
+//
+void RTrackLog::TrackLogEvent( TInt aError )
+	{
+	TInt count = iObservers.Count();
+	for ( TInt index = 0; index < count; index++ )
+		{
+		switch( iEventType )
+			{
+			case EStarted:
+				{
+				iObservers[index]->TrackLogStarted( aError );
+				}
+				break;
+			case EStopped:
+				{
+				iObservers[index]->TrackLogStopped( aError );
+				}
+				break;
+			case ESignalChanged:
+				{
+				iObservers[index]->GPSFixQualityChanged( iFixQuality, iRecording );
+				}
+			}
+		}
+	}