diff -r 000000000000 -r 9cfd9a3ee49c networkprotocolmodules/networkprotocolmodule/LbsNetSim/src/lbsnetsimassistancedataprovider.cpp --- /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 +#include +#include +#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; + } + } + } +