locationtriggering/ltstrategyengine/src/lbtlocationrequestor.cpp
changeset 0 667063e416a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationtriggering/ltstrategyengine/src/lbtlocationrequestor.cpp	Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,291 @@
+/*
+* 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:  Implementation of Location Requestor
+*
+*/
+
+
+
+#include "lbtlogger.h"
+#include "lbtlocationrequestor.h"
+#include "lbtpsychangelistner.h"
+
+_LIT( KServer, "LocationTriggering" );
+
+// CONSTANTS
+const TInt64 KMaxUpdateAgeForNpp( 7200000000 ); // 120 minutes or 2 hours
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::NewL
+// CLbtLocationRequestor instantiation method.
+// -----------------------------------------------------------------------------
+//
+CLbtLocationRequestor* CLbtLocationRequestor::NewL( )
+    {
+    CLbtLocationRequestor* self = new ( ELeave ) CLbtLocationRequestor;
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop();
+    return self;
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::~CLbtLocationRequestor
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CLbtLocationRequestor::~CLbtLocationRequestor()
+    {
+    if( iValidNppHandle )
+    	{
+    	iNppPositioner.Close();
+    	}    
+    delete iNbpChangeListener;
+    iPositioner.Close();
+    iPosServer.Close();    
+    }
+	
+	
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::CurrentLocation
+// Method used by CLbtStrategyEngine to obtain position information
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::CurrentLocation( TPositionInfo& aPosInfo, 
+											  TRequestStatus& aStatus, 
+											  TPositionModuleId aPosID,
+											  TTimeIntervalMicroSeconds aTimeOut )
+    {
+    FUNC_ENTER("CLbtLocationRequestor::CurrentLocation");
+    if( aPosID != iPosID )
+        {
+        iPositioner.Close();
+        TRAPD( err, OpenConnectionL( aPosID ) );
+        if( KErrNone != err )
+            {
+            TRequestStatus* lStatus = &aStatus;
+            User::RequestComplete( lStatus, err );
+            return;
+            }
+        }
+    
+    // Setting update options
+    TPositionUpdateOptions updateOptions;
+    updateOptions.SetUpdateTimeOut( aTimeOut );
+    iPositioner.SetUpdateOptions( updateOptions );
+    
+    iPositioner.NotifyPositionUpdate( aPosInfo, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::CurrentLocationFromNpp
+// Method used by CLbtStrategyEngine to obtain position information
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::CurrentLocationFromNpp( TPositionInfo& aPosInfo, 
+                                                    TRequestStatus& aStatus,
+                                                    TTimeIntervalMicroSeconds /*aTimeOut*/ )
+    {
+    FUNC_ENTER("CLbtLocationRequestor::CurrentLocationFromNpp");
+    LOG("CLbtLocationRequestor::CurrentLocationFromNpp");
+    if( !iValidNppHandle )
+        {
+        TRequestStatus* statusPtr = &aStatus;
+        User::RequestComplete( statusPtr,KErrNotFound );
+        return;
+        }
+    
+    // Setting update options
+    TPositionUpdateOptions updateOptions;
+    updateOptions.SetMaxUpdateAge( TTimeIntervalMicroSeconds(KMaxUpdateAgeForNpp) );
+    updateOptions.SetUpdateTimeOut( 30000000 );
+    iNppPositioner.SetUpdateOptions( updateOptions );
+    
+    iNppPositioner.NotifyPositionUpdate( aPosInfo, aStatus );
+    }
+	
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::GetModuleInfo
+// Retrieves information about the positioning technology being used
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::GetModuleInfo( TPositionModuleId aPosID )
+    {
+    TPositionModuleInfo moduleInfo;
+    iPosServer.GetModuleInfoById( aPosID, moduleInfo );
+    TPositionModuleInfo::ECapabilitySatellite & moduleInfo.Capabilities()?
+        iGPSUsed = ETrue : iGPSUsed = EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::GPSUsed
+// Determines if GPS method is used to retrieve location information
+// -----------------------------------------------------------------------------
+//
+TBool CLbtLocationRequestor::GPSUsed() const
+    {
+    return iGPSUsed;
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::Cancel
+// Cancels all outstanding requests to the location server. This method 
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::Cancel()
+    {
+    iPositioner.CancelRequest( EPositionerNotifyPositionUpdate );
+    }
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::CancelFixFromNpp
+// Cancels all outstanding requests to the location server. This method 
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::CancelFixFromNpp()
+    {
+    if( iValidNppHandle )
+    	{
+    	iNppPositioner.CancelRequest( EPositionerNotifyPositionUpdate );
+    	}    
+    }
+	
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::CLbtLocationRequestor
+// Default constructor.
+// -----------------------------------------------------------------------------
+//
+CLbtLocationRequestor::CLbtLocationRequestor()
+    {
+    }
+	
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::ConstructL
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::ConstructL()
+    {
+    User::LeaveIfError( iPosServer.Connect() );
+    
+    iPosID = KPositionNullModuleId;
+    
+    // TODO: Read this from CenRep
+    TPositionModuleId nppPsyID = { 0x10206915 };
+    TInt error = iNppPositioner.Open( iPosServer,nppPsyID ) ;
+    
+    if( error == KErrNone )
+        {
+        LOG("NBP Session Opened");
+        iNbpChangeListener = NULL;
+        User::LeaveIfError( iNppPositioner.SetRequestor( 
+                                            CRequestor::ERequestorService,
+                                            CRequestor::EFormatApplication,
+                                            KServer ) );
+        iValidNppHandle = ETrue;
+        }
+    else
+        {
+        iValidNppHandle = EFalse;
+        iNbpChangeListener = CLbtPsyChangeListner::NewL(*this);
+        iNbpChangeListener->StartToListen( nppPsyID );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::OpenConnectionL
+// Resets the position method used for acquiring location information. This is 
+// done only when the module ID specified differs from the the existing ID. 
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::OpenConnectionL( TPositionModuleId aPosID )
+    {
+    FUNC_ENTER("CLbtLocationRequestor::OpenConnectionL");  	
+    
+    if( aPosID != iPosID )
+        {
+        iPosID = aPosID;
+        TUid defaultID = { 0XFFFFFFFF };
+        if( iPosID == defaultID )
+            {
+            User::LeaveIfError( iPositioner.Open( iPosServer) );
+            }
+        else
+            {
+            User::LeaveIfError( iPositioner.Open( iPosServer, aPosID ) );
+            }        
+
+        User::LeaveIfError( iPositioner.SetRequestor( 
+                                    CRequestor::ERequestorService,
+                                    CRequestor::EFormatApplication,
+                                    KServer ) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::HandlePsyChangeEvent
+// -----------------------------------------------------------------------------
+//
+void CLbtLocationRequestor::HandlePsyChangeEvent( TPositionModuleId aModuleId )
+	{
+	FUNC_ENTER("CLbtLocationRequestor::HandlePsyChangeEvent");
+	// TODO: Read this from CenRep
+	TPositionModuleId nppPsyID = { 0x10206915 };
+	
+	if( aModuleId == nppPsyID )
+		{
+		TInt error = iNppPositioner.Open( iPosServer,nppPsyID ) ;
+    
+	    if( error == KErrNone )
+	        {
+	        LOG("PSY Change Listener: NBP Session Opened");
+	        delete iNbpChangeListener;
+	        iNbpChangeListener = NULL;
+	        TInt error = iNppPositioner.SetRequestor( 
+	                                            CRequestor::ERequestorService,
+	                                            CRequestor::EFormatApplication,
+	                                            KServer );
+	        if( error == KErrNone )
+	            {
+	            iValidNppHandle = ETrue;
+	            }
+	        else
+	            {
+	            iValidNppHandle = EFalse;
+	            }
+	        }	    
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CLbtLocationRequestor::GetPositionModuleId
+// 
+// -----------------------------------------------------------------------------
+//
+TPositionModuleId CLbtLocationRequestor::GetPositionModuleId()
+    {
+    return iPosID;
+    }
+
+// end of file