networkprotocolmodules/networkprotocolmodule/LbsNetSim/src/lbsnetsimassistancedataprovider.cpp
changeset 0 9cfd9a3ee49c
child 57 3267d9ea3e98
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/networkprotocolmodule/LbsNetSim/src/lbsnetsimassistancedataprovider.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,308 @@
+// Copyright (c) 2005-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:
+// lbsnetsimassitancedataprovider.cpp
+// 
+//
+
+#include "lbsnetsimassistancedataprovider.h"
+#include <lbs/lbsassistancedatabuilderset.h>
+#include <lbspositioninfo.h>
+#include <lbs/lbslocdatasourcegpsbase.h>
+#include "lbsdevloggermacros.h"
+
+/** 
+	Standard Symbain OS constructor
+*/
+
+CLbsNetSimAssistanceDataProvider* CLbsNetSimAssistanceDataProvider::NewL()
+	{
+		CLbsNetSimAssistanceDataProvider* self = new(ELeave) CLbsNetSimAssistanceDataProvider();
+		CleanupStack::PushL(self);
+		self->ConstructL();
+		CleanupStack::Pop();
+		
+		return self;
+	}
+	
+/**
+	Standard C++ constructor
+*/
+CLbsNetSimAssistanceDataProvider::CLbsNetSimAssistanceDataProvider() :
+	iObserver(NULL), iAssistanceDataUid(TUid::Uid(0)), iAssistanceModule(NULL), iAssistanceSource(NULL)
+	{
+	// Set default Quality(64s fix time, 100m accuracy)
+	iQuality.SetMaxFixTime(64*1000000);
+	iQuality.SetMinHorizontalAccuracy(100);
+	iQuality.SetMinVerticalAccuracy(100);
+	iReferenceLocation.SetCoordinate(0, 0);
+	}
+
+/**
+	Standard C++ destructor
+*/
+CLbsNetSimAssistanceDataProvider::~CLbsNetSimAssistanceDataProvider()
+	{
+	iAssistanceData.Close();
+	delete iAssistanceSource;
+	delete iAssistanceModule;
+	}
+
+	
+/** 
+	Standard Symbian OS second phase constructor
+*/
+void CLbsNetSimAssistanceDataProvider::ConstructL()
+	{
+	// Open the assistance data structure
+	iAssistanceData.OpenL();
+	
+	// Load the default assistance data module to start with
+	iAssistanceModule = CAssistanceDataSourceModuleBase::NewL(*this);
+	/* Note: The assistance data source is not initialised here, due to issues with LbsRoot starting NetSim Up.
+		The initialisation of the Assistance Data Source takes place in SetAssistanceDataProvider() , which
+		should always be called before using NetSim.*/
+	//iAssistanceSource = iAssistanceModule->NewDataSourceL();
+	}
+
+/** 
+	Sets the observer to use for callbacks
+	
+	@param aObserver 	the observer too use
+*/
+void CLbsNetSimAssistanceDataProvider::SetObserver(MLbsNetSimAssistanceDataProviderObserver* aObserver)
+	{
+	iObserver = aObserver;
+	}
+	
+/**
+	Sets the reference location
+	
+	@param aReferenceLocation	the reference location
+	@leave
+*/
+void CLbsNetSimAssistanceDataProvider::SetReferenceLocationL(TDesC8& /*aReferenceLocation*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+	Sets the reference location
+	
+	@param aReferenceLocation	the reference location
+*/
+void CLbsNetSimAssistanceDataProvider::SetReferenceLocation(TPosition& aReferenceLocation)
+	{
+	iReferenceLocation = aReferenceLocation;
+	}
+	
+
+/**
+*/
+void CLbsNetSimAssistanceDataProvider::SetQuality(TLbsNetPosRequestQuality& aQuality)
+	{
+	iQuality = aQuality;
+	}
+	
+/**
+*/
+TBool CLbsNetSimAssistanceDataProvider::SetAssistanceDataProvider(TUid aUid)
+	{
+	// Always reload the current plugin to make sure it's properly initialised
+	// Delete the old plugins if there's any
+	if (iAssistanceDataUid != aUid)
+		{
+ 		if (iAssistanceModule != NULL)		
+ 			{
+			delete iAssistanceSource;
+			iAssistanceSource = NULL;
+			delete iAssistanceModule;
+			iAssistanceModule = NULL;
+			REComSession::FinalClose();
+ 			}
+		
+		// Set the new plugin Uid
+		iAssistanceDataUid = aUid;
+
+		// Load the new assistance module plugin		
+		if (iAssistanceModule == NULL)
+			{
+			if (iAssistanceDataUid.iUid == 0)
+				{
+				iAssistanceModule = CAssistanceDataSourceModuleBase::NewL(*this); // Loads default
+				}
+			else
+				{
+				iAssistanceModule = CAssistanceDataSourceModuleBase::NewL(iAssistanceDataUid, *this); // Loads specified
+				}
+
+			// Load the new assistance data source
+			iAssistanceSource = iAssistanceModule->NewDataSourceL();
+			}
+		}
+		
+	return ETrue;
+	}
+	
+/**
+	Clears the currently set reference locations
+	
+	@param aReferenceLocation	the reference location
+*/
+void CLbsNetSimAssistanceDataProvider::ClearReferenceLocations()
+	{
+	}
+	
+/**
+	Request the assitance data from the assitance data provider
+	
+	This method will fill in the supplied RLbsAssitanceDataBuilderSet and calls back MLbsNetSimAssitanceDataProviderObserver::ProcessAssitanceData
+	
+	@param aGroup			the assitance data mask
+	@param aAssitanceData	the assitance data structure to fill in
+	@return 				ETrue if an observer is set, otherwise EFalse
+*/
+TBool CLbsNetSimAssistanceDataProvider::RequestAssistanceDataL(TLbsAssistanceDataGroup& aGroup)
+	{
+	LBSLOG(ELogP1, "CLbsNetSimAssistanceDataProvider::RequestAssistanceDataL()");
+
+	ASSERT(iObserver != NULL);
+	
+	TBool bSuccess = EFalse;
+	
+	// Check we have an observer
+	if (iObserver != NULL)
+		{
+		LBSLOG2(ELogP2, "Requesting assistance data from provider, mask = 0x%x", aGroup);
+		iRequestedAssistanceDataGroup = aGroup;
+		iAssistanceSource->GetAssistanceData(iAssistanceData, 
+											 iRequestedAssistanceDataGroup, 
+											 iReferenceLocation);
+		}
+
+	return bSuccess;
+	}
+
+
+void CLbsNetSimAssistanceDataProvider::DataSourceNotification(const TInt& aError)
+	{
+	LBSLOG(ELogP1, "CLbsNetSimAssistanceDataProvider::DataSourceNotification()");
+	
+	TPositionInfo positionInfo;
+	positionInfo.SetPosition(iReferenceLocation);
+	
+	TInt error = aError;
+	
+	// Check exactly what assistance data we got, if we didn't
+	// get any of the requested items then return an error.
+	TLbsAsistanceDataGroup mask;
+	CalculateValidAssistanceDataMask(iAssistanceData, mask);
+	if ((mask & iRequestedAssistanceDataGroup) == 0
+		&& error == KErrNone)
+		{
+		error = KErrAccessDenied;
+		}
+	
+#ifdef ENABLE_LBS_DEV_LOGGER
+	TRAPD(err, iObserver->ProcessAssistanceDataL(error, iAssistanceData, positionInfo, iQuality));
+	if (err != KErrNone)
+		{
+		LBSLOG2(ELogP3, "LEAVE from iObserver->ProcessAssistanceDataL: %d", err);
+		}
+#else
+	TRAP_IGNORE(iObserver->ProcessAssistanceDataL(error, iAssistanceData, positionInfo, iQuality));
+#endif
+	}
+
+/** Generate a bitmask of the valid assistance data items for an assistance data builder set.
+*/
+void CLbsNetSimAssistanceDataProvider::CalculateValidAssistanceDataMask(
+		RLbsAssistanceDataBuilderSet& aAssistanceData,
+		TLbsAsistanceDataGroup& aGroup)
+	{
+	RUEPositioningGpsAlmanacBuilder* almanacPtr;
+	RUEPositioningGpsIonosphericModelBuilder* ionosphericPtr;
+	RUEPositioningGpsNavigationModelBuilder* navigationPtr;
+	RUEPositioningGpsReferenceTimeBuilder* referenceTimePtr;
+	RUEPositioningGpsUtcModelBuilder*  utcPtr;
+	RUEPositioningGpsAcquisitionAssistanceBuilder* acquisitionPtr;
+	RBadSatListBuilder* badSatPtr;
+	RReferenceLocationBuilder* referenceLocationPtr;
+	
+	aGroup = EAssistanceDataNone;
+
+	if (KErrNone == aAssistanceData.GetDataBuilder(almanacPtr))
+		{
+		if (almanacPtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataAlmanac;
+			}
+		}
+	
+	if (KErrNone == aAssistanceData.GetDataBuilder(acquisitionPtr))
+		{
+		if (acquisitionPtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataAquisitionAssistance;
+			}
+		}
+		
+	if (KErrNone == aAssistanceData.GetDataBuilder(badSatPtr))
+		{
+		if (badSatPtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataBadSatList;
+			}
+		}
+		
+	if (KErrNone == aAssistanceData.GetDataBuilder(navigationPtr))
+		{
+		if (navigationPtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataNavigationModel;
+			}
+		}
+
+	if (KErrNone == aAssistanceData.GetDataBuilder(referenceTimePtr))
+		{
+		if (referenceTimePtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataReferenceTime;
+			}
+		}
+
+	if (KErrNone == aAssistanceData.GetDataBuilder(ionosphericPtr))
+		{
+		if (ionosphericPtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataIonosphericModel;
+			}
+		}
+
+	if (KErrNone == aAssistanceData.GetDataBuilder(referenceLocationPtr))
+		{
+		if (referenceLocationPtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataReferenceLocation;
+			}
+		}
+
+	if (KErrNone == aAssistanceData.GetDataBuilder(utcPtr))
+		{
+		if (utcPtr->IsDataAvailable())
+			{
+			aGroup |= EAssistanceDataPositioningGpsUtcModel;
+			}
+		}
+	}
+