networkprotocolmodules/networkprotocolmodule/LbsNetSim/src/lbsnetsimassistancedataprovider.cpp
changeset 36 b47902b73a93
parent 0 9cfd9a3ee49c
child 57 3267d9ea3e98
equal deleted inserted replaced
35:a2efdd544abf 36:b47902b73a93
       
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // lbsnetsimassitancedataprovider.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #include "lbsnetsimassistancedataprovider.h"
       
    19 #include <lbs/lbsassistancedatabuilderset.h>
       
    20 #include <lbspositioninfo.h>
       
    21 #include <lbs/lbslocdatasourcegpsbase.h>
       
    22 #include "lbsdevloggermacros.h"
       
    23 
       
    24 /** 
       
    25 	Standard Symbain OS constructor
       
    26 */
       
    27 
       
    28 CLbsNetSimAssistanceDataProvider* CLbsNetSimAssistanceDataProvider::NewL()
       
    29 	{
       
    30 		CLbsNetSimAssistanceDataProvider* self = new(ELeave) CLbsNetSimAssistanceDataProvider();
       
    31 		CleanupStack::PushL(self);
       
    32 		self->ConstructL();
       
    33 		CleanupStack::Pop();
       
    34 		
       
    35 		return self;
       
    36 	}
       
    37 	
       
    38 /**
       
    39 	Standard C++ constructor
       
    40 */
       
    41 CLbsNetSimAssistanceDataProvider::CLbsNetSimAssistanceDataProvider() :
       
    42 	iObserver(NULL), iAssistanceDataUid(TUid::Uid(0)), iAssistanceModule(NULL), iAssistanceSource(NULL)
       
    43 	{
       
    44 	// Set default Quality(64s fix time, 100m accuracy)
       
    45 	iQuality.SetMaxFixTime(64*1000000);
       
    46 	iQuality.SetMinHorizontalAccuracy(100);
       
    47 	iQuality.SetMinVerticalAccuracy(100);
       
    48 	iReferenceLocation.SetCoordinate(0, 0);
       
    49 	}
       
    50 
       
    51 /**
       
    52 	Standard C++ destructor
       
    53 */
       
    54 CLbsNetSimAssistanceDataProvider::~CLbsNetSimAssistanceDataProvider()
       
    55 	{
       
    56 	iAssistanceData.Close();
       
    57 	delete iAssistanceSource;
       
    58 	delete iAssistanceModule;
       
    59 	}
       
    60 
       
    61 	
       
    62 /** 
       
    63 	Standard Symbian OS second phase constructor
       
    64 */
       
    65 void CLbsNetSimAssistanceDataProvider::ConstructL()
       
    66 	{
       
    67 	// Open the assistance data structure
       
    68 	iAssistanceData.OpenL();
       
    69 	
       
    70 	// Load the default assistance data module to start with
       
    71 	iAssistanceModule = CAssistanceDataSourceModuleBase::NewL(*this);
       
    72 	/* Note: The assistance data source is not initialised here, due to issues with LbsRoot starting NetSim Up.
       
    73 		The initialisation of the Assistance Data Source takes place in SetAssistanceDataProvider() , which
       
    74 		should always be called before using NetSim.*/
       
    75 	//iAssistanceSource = iAssistanceModule->NewDataSourceL();
       
    76 	}
       
    77 
       
    78 /** 
       
    79 	Sets the observer to use for callbacks
       
    80 	
       
    81 	@param aObserver 	the observer too use
       
    82 */
       
    83 void CLbsNetSimAssistanceDataProvider::SetObserver(MLbsNetSimAssistanceDataProviderObserver* aObserver)
       
    84 	{
       
    85 	iObserver = aObserver;
       
    86 	}
       
    87 	
       
    88 /**
       
    89 	Sets the reference location
       
    90 	
       
    91 	@param aReferenceLocation	the reference location
       
    92 	@leave
       
    93 */
       
    94 void CLbsNetSimAssistanceDataProvider::SetReferenceLocationL(TDesC8& /*aReferenceLocation*/)
       
    95 	{
       
    96 	User::Leave(KErrNotSupported);
       
    97 	}
       
    98 
       
    99 /**
       
   100 	Sets the reference location
       
   101 	
       
   102 	@param aReferenceLocation	the reference location
       
   103 */
       
   104 void CLbsNetSimAssistanceDataProvider::SetReferenceLocation(TPosition& aReferenceLocation)
       
   105 	{
       
   106 	iReferenceLocation = aReferenceLocation;
       
   107 	}
       
   108 	
       
   109 
       
   110 /**
       
   111 */
       
   112 void CLbsNetSimAssistanceDataProvider::SetQuality(TLbsNetPosRequestQuality& aQuality)
       
   113 	{
       
   114 	iQuality = aQuality;
       
   115 	}
       
   116 	
       
   117 /**
       
   118 */
       
   119 TBool CLbsNetSimAssistanceDataProvider::SetAssistanceDataProvider(TUid aUid)
       
   120 	{
       
   121 	// Always reload the current plugin to make sure it's properly initialised
       
   122 	// Delete the old plugins if there's any
       
   123 	if (iAssistanceDataUid != aUid)
       
   124 		{
       
   125  		if (iAssistanceModule != NULL)		
       
   126  			{
       
   127 			delete iAssistanceSource;
       
   128 			iAssistanceSource = NULL;
       
   129 			delete iAssistanceModule;
       
   130 			iAssistanceModule = NULL;
       
   131 			REComSession::FinalClose();
       
   132  			}
       
   133 		
       
   134 		// Set the new plugin Uid
       
   135 		iAssistanceDataUid = aUid;
       
   136 
       
   137 		// Load the new assistance module plugin		
       
   138 		if (iAssistanceModule == NULL)
       
   139 			{
       
   140 			if (iAssistanceDataUid.iUid == 0)
       
   141 				{
       
   142 				iAssistanceModule = CAssistanceDataSourceModuleBase::NewL(*this); // Loads default
       
   143 				}
       
   144 			else
       
   145 				{
       
   146 				iAssistanceModule = CAssistanceDataSourceModuleBase::NewL(iAssistanceDataUid, *this); // Loads specified
       
   147 				}
       
   148 
       
   149 			// Load the new assistance data source
       
   150 			iAssistanceSource = iAssistanceModule->NewDataSourceL();
       
   151 			}
       
   152 		}
       
   153 		
       
   154 	return ETrue;
       
   155 	}
       
   156 	
       
   157 /**
       
   158 	Clears the currently set reference locations
       
   159 	
       
   160 	@param aReferenceLocation	the reference location
       
   161 */
       
   162 void CLbsNetSimAssistanceDataProvider::ClearReferenceLocations()
       
   163 	{
       
   164 	}
       
   165 	
       
   166 /**
       
   167 	Request the assitance data from the assitance data provider
       
   168 	
       
   169 	This method will fill in the supplied RLbsAssitanceDataBuilderSet and calls back MLbsNetSimAssitanceDataProviderObserver::ProcessAssitanceData
       
   170 	
       
   171 	@param aGroup			the assitance data mask
       
   172 	@param aAssitanceData	the assitance data structure to fill in
       
   173 	@return 				ETrue if an observer is set, otherwise EFalse
       
   174 */
       
   175 TBool CLbsNetSimAssistanceDataProvider::RequestAssistanceDataL(TLbsAssistanceDataGroup& aGroup)
       
   176 	{
       
   177 	LBSLOG(ELogP1, "CLbsNetSimAssistanceDataProvider::RequestAssistanceDataL()");
       
   178 
       
   179 	ASSERT(iObserver != NULL);
       
   180 	
       
   181 	TBool bSuccess = EFalse;
       
   182 	
       
   183 	// Check we have an observer
       
   184 	if (iObserver != NULL)
       
   185 		{
       
   186 		LBSLOG2(ELogP2, "Requesting assistance data from provider, mask = 0x%x", aGroup);
       
   187 		iRequestedAssistanceDataGroup = aGroup;
       
   188 		iAssistanceSource->GetAssistanceData(iAssistanceData, 
       
   189 											 iRequestedAssistanceDataGroup, 
       
   190 											 iReferenceLocation);
       
   191 		}
       
   192 
       
   193 	return bSuccess;
       
   194 	}
       
   195 
       
   196 
       
   197 void CLbsNetSimAssistanceDataProvider::DataSourceNotification(const TInt& aError)
       
   198 	{
       
   199 	LBSLOG(ELogP1, "CLbsNetSimAssistanceDataProvider::DataSourceNotification()");
       
   200 	
       
   201 	TPositionInfo positionInfo;
       
   202 	positionInfo.SetPosition(iReferenceLocation);
       
   203 	
       
   204 	TInt error = aError;
       
   205 	
       
   206 	// Check exactly what assistance data we got, if we didn't
       
   207 	// get any of the requested items then return an error.
       
   208 	TLbsAsistanceDataGroup mask;
       
   209 	CalculateValidAssistanceDataMask(iAssistanceData, mask);
       
   210 	if ((mask & iRequestedAssistanceDataGroup) == 0
       
   211 		&& error == KErrNone)
       
   212 		{
       
   213 		error = KErrAccessDenied;
       
   214 		}
       
   215 	
       
   216 #ifdef ENABLE_LBS_DEV_LOGGER
       
   217 	TRAPD(err, iObserver->ProcessAssistanceDataL(error, iAssistanceData, positionInfo, iQuality));
       
   218 	if (err != KErrNone)
       
   219 		{
       
   220 		LBSLOG2(ELogP3, "LEAVE from iObserver->ProcessAssistanceDataL: %d", err);
       
   221 		}
       
   222 #else
       
   223 	TRAP_IGNORE(iObserver->ProcessAssistanceDataL(error, iAssistanceData, positionInfo, iQuality));
       
   224 #endif
       
   225 	}
       
   226 
       
   227 /** Generate a bitmask of the valid assistance data items for an assistance data builder set.
       
   228 */
       
   229 void CLbsNetSimAssistanceDataProvider::CalculateValidAssistanceDataMask(
       
   230 		RLbsAssistanceDataBuilderSet& aAssistanceData,
       
   231 		TLbsAsistanceDataGroup& aGroup)
       
   232 	{
       
   233 	RUEPositioningGpsAlmanacBuilder* almanacPtr;
       
   234 	RUEPositioningGpsIonosphericModelBuilder* ionosphericPtr;
       
   235 	RUEPositioningGpsNavigationModelBuilder* navigationPtr;
       
   236 	RUEPositioningGpsReferenceTimeBuilder* referenceTimePtr;
       
   237 	RUEPositioningGpsUtcModelBuilder*  utcPtr;
       
   238 	RUEPositioningGpsAcquisitionAssistanceBuilder* acquisitionPtr;
       
   239 	RBadSatListBuilder* badSatPtr;
       
   240 	RReferenceLocationBuilder* referenceLocationPtr;
       
   241 	
       
   242 	aGroup = EAssistanceDataNone;
       
   243 
       
   244 	if (KErrNone == aAssistanceData.GetDataBuilder(almanacPtr))
       
   245 		{
       
   246 		if (almanacPtr->IsDataAvailable())
       
   247 			{
       
   248 			aGroup |= EAssistanceDataAlmanac;
       
   249 			}
       
   250 		}
       
   251 	
       
   252 	if (KErrNone == aAssistanceData.GetDataBuilder(acquisitionPtr))
       
   253 		{
       
   254 		if (acquisitionPtr->IsDataAvailable())
       
   255 			{
       
   256 			aGroup |= EAssistanceDataAquisitionAssistance;
       
   257 			}
       
   258 		}
       
   259 		
       
   260 	if (KErrNone == aAssistanceData.GetDataBuilder(badSatPtr))
       
   261 		{
       
   262 		if (badSatPtr->IsDataAvailable())
       
   263 			{
       
   264 			aGroup |= EAssistanceDataBadSatList;
       
   265 			}
       
   266 		}
       
   267 		
       
   268 	if (KErrNone == aAssistanceData.GetDataBuilder(navigationPtr))
       
   269 		{
       
   270 		if (navigationPtr->IsDataAvailable())
       
   271 			{
       
   272 			aGroup |= EAssistanceDataNavigationModel;
       
   273 			}
       
   274 		}
       
   275 
       
   276 	if (KErrNone == aAssistanceData.GetDataBuilder(referenceTimePtr))
       
   277 		{
       
   278 		if (referenceTimePtr->IsDataAvailable())
       
   279 			{
       
   280 			aGroup |= EAssistanceDataReferenceTime;
       
   281 			}
       
   282 		}
       
   283 
       
   284 	if (KErrNone == aAssistanceData.GetDataBuilder(ionosphericPtr))
       
   285 		{
       
   286 		if (ionosphericPtr->IsDataAvailable())
       
   287 			{
       
   288 			aGroup |= EAssistanceDataIonosphericModel;
       
   289 			}
       
   290 		}
       
   291 
       
   292 	if (KErrNone == aAssistanceData.GetDataBuilder(referenceLocationPtr))
       
   293 		{
       
   294 		if (referenceLocationPtr->IsDataAvailable())
       
   295 			{
       
   296 			aGroup |= EAssistanceDataReferenceLocation;
       
   297 			}
       
   298 		}
       
   299 
       
   300 	if (KErrNone == aAssistanceData.GetDataBuilder(utcPtr))
       
   301 		{
       
   302 		if (utcPtr->IsDataAvailable())
       
   303 			{
       
   304 			aGroup |= EAssistanceDataPositioningGpsUtcModel;
       
   305 			}
       
   306 		}
       
   307 	}
       
   308