--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/networkprotocolmodule/LbsNetSim/src/lbsnetsimgatewayhandler.cpp Fri Jun 04 10:34:15 2010 +0100
@@ -0,0 +1,978 @@
+// 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:
+//
+
+#include "lbsdevloggermacros.h"
+#include "lbsnetsimgatewayhandler.h"
+#include "lbsnetsimtesthandler.h"
+#include "lbsnetsimassistancedataprovider.h"
+#include <lbspositioninfo.h>
+#include <lbs/lbslocdatasourcegpsbase.h>
+#include <lbs/test/lbsnetsimstatus.h>
+#include <lbs/test/lbsnetsimtest.h>
+#include <e32property.h>
+
+#include <s32mem.h>
+
+TLbsAssistanceDataGroup CLbsNetSimGatewayHandler::iDefaultAssistanceDataMask = EAssistanceDataReferenceTime | EAssistanceDataReferenceLocation | EAssistanceDataNavigationModel;
+
+/**
+*/
+CLbsNetSimGatewayHandler* CLbsNetSimGatewayHandler::NewL(CLbsNetSimAssistanceDataProvider& aAssistanceDataProvider)
+ {
+ CLbsNetSimGatewayHandler* self = new(ELeave) CLbsNetSimGatewayHandler(aAssistanceDataProvider);
+
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+
+
+ return self;
+ }
+
+/**
+*/
+CLbsNetSimGatewayHandler::~CLbsNetSimGatewayHandler()
+ {
+ iMessages.Reset();
+ iMeasurementControlLocationAssistanceData.Close();
+ }
+
+/**
+*/
+void CLbsNetSimGatewayHandler::SetTestHandler(CLbsNetSimTestHandler* aTestHandler)
+ {
+ iTestHandler = aTestHandler;
+ }
+
+/**
+*/
+void CLbsNetSimGatewayHandler::ServiceL(const RMessage2& aMessage)
+ {
+ TInt function = aMessage.Function();
+
+ if ((iError == KErrNone) ||
+ (function == EGWNotificationMeasurementControlLocation) ||
+ (function == EGWNotificationMeasurementControlLocationCancel) ||
+ (function == EGWNotificationRegisterLcsLocation) ||
+ (function == EGWNotificationRegisterLcsLocationCancel) ||
+ (function == EGWNotificationCancelPrivacy) ||
+ (function == EGWNotificationCancelPrivacyCancel) ||
+ (function == EGWNotificationNetworkGone) ||
+ (function == EGWNotificationNetworkGoneCancel) ||
+ (function == EGWNotificationResetAssistanceData) ||
+ (function == EGWNotificationResetAssistanceDataCancel))
+ {
+ switch (aMessage.Function())
+ {
+ case EGWRegisterLcsMoLr:
+ {
+ HandleRegisterLcsMoLrL(aMessage);
+ break;
+ }
+ case EGWMeasurementReportLocation:
+ {
+ HandleMeasurementReportLocationL(aMessage);
+ break;
+ }
+ case EGWMeasurementReportLocationCancel:
+ {
+ if (!iMessageMeasurementReportLocation.IsNull())
+ {
+ iMessageMeasurementReportLocation.Complete(KErrCancel);
+ }
+
+ aMessage.Complete(KErrNone);
+ break;
+ }
+ case EGWReleaseLcsMoLr:
+ {
+ HandleReleaseLcsMoLrL(aMessage);
+ break;
+ }
+ case EGWMeasurementControlFailure:
+ {
+ HandleMeasurementControlFailureL(aMessage);
+ break;
+ }
+ case EGWRequestMoreAssistanceData:
+ {
+ HandleRequestMoreAssistanceDataL(aMessage);
+ break;
+ }
+ case EGWNotificationMeasurementControlLocation:
+ {
+ iNotificationMeasurementControlLocation = aMessage;
+ break;
+ }
+ case EGWNotificationMeasurementControlLocationCancel:
+ {
+ if (!iNotificationMeasurementControlLocation.IsNull())
+ {
+ iNotificationMeasurementControlLocation.Complete(KErrCancel);
+ }
+ break;
+ }
+ case EGWNotificationRegisterLcsLocation:
+ {
+ iNotificationRegisterLcsLocation = aMessage;
+ break;
+ }
+ case EGWNotificationRegisterLcsLocationCancel:
+ {
+ if (!iNotificationRegisterLcsLocation.IsNull())
+ {
+ iNotificationRegisterLcsLocation.Complete(KErrCancel);
+ }
+ break;
+ }
+ case EGWReleaseLcsLocationNotification:
+ {
+ HandleReleaseLcsLocationNotifcationL(aMessage);
+ break;
+ }
+ case EGWNotificationCancelPrivacy:
+ {
+ iNotificationCancelPrivacyRequest = aMessage;
+ break;
+ }
+ case EGWNotificationCancelPrivacyCancel:
+ {
+ if (!iNotificationCancelPrivacyRequest.IsNull())
+ {
+ iNotificationCancelPrivacyRequest.Complete(KErrCancel);
+ }
+ break;
+ }
+ case EGWNotificationNetworkGone:
+ {
+ iNotificationNetworkGone = aMessage;
+ break;
+ }
+ case EGWNotificationNetworkGoneCancel:
+ {
+ if (!iNotificationNetworkGone.IsNull())
+ {
+ iNotificationNetworkGone.Complete(KErrCancel);
+ }
+ break;
+ }
+ case EGWNotificationResetAssistanceData:
+ {
+ iNotificationResetAssistanceData = aMessage;
+ break;
+ }
+ case EGWNotificationResetAssistanceDataCancel:
+ {
+ if (!iNotificationResetAssistanceData.IsNull())
+ {
+ iNotificationResetAssistanceData.Complete(KErrCancel);
+ }
+ break;
+ }
+ default:
+ {
+ ASSERT(EFalse);
+ User::Leave(KErrNotSupported);
+ }
+ } // switch
+ } // if
+ else
+ {
+ if (!iNotificationMeasurementControlLocation.IsNull() &&
+ ((function == EGWRegisterLcsMoLr) ||
+ (function == EGWRequestMoreAssistanceData)))
+ {
+ iNotificationMeasurementControlLocation.Complete(iError);
+ FinishL();
+ }
+ else
+ {
+ aMessage.Complete(iError);
+ FinishL();
+ }
+
+ if (!iErrorSticky)
+ {
+ iError = KErrNone;
+ } // if
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::Connected()
+ {
+ LBSLOG(ELogP1, "CLbsNetSimGatewayHandler::Connected()");
+ iTestHandler->GatewayConnected();
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::Disconnected()
+ {
+ LBSLOG(ELogP1, "CLbsNetSimGatewayHandler::Disconnected()");
+
+ // As the server and handlers could possibly be used for a
+ // second session reset some internals here
+ ResetInternals();
+
+ // Empty Messages
+ CTimer::Cancel();
+ while (iMessages.Count() > 0)
+ {
+ TRAP_IGNORE(RunL());
+ }
+
+ iTestHandler->GatewayDisconnected();
+
+ // Complete any outstanding messages
+ if (!iAssistanceDataToFill.IsNull())
+ {
+ iAssistanceDataToFill.Complete(KErrDisconnected);
+ }
+
+ if (!iMessageReleaseLcsMoLr.IsNull())
+ {
+ iMessageReleaseLcsMoLr.Complete(KErrDisconnected);
+ }
+
+ if (!iMessageMeasurementReportLocation.IsNull())
+ {
+ iMessageMeasurementReportLocation.Complete(KErrDisconnected);
+ }
+
+ if (!iMessageMeasurementControlFailure.IsNull())
+ {
+ iMessageMeasurementControlFailure.Complete(KErrDisconnected);
+ }
+
+ if (!iNotificationMeasurementControlLocation.IsNull())
+ {
+ iNotificationMeasurementControlLocation.Complete(KErrDisconnected);
+ }
+
+ if (!iNotificationRegisterLcsLocation.IsNull())
+ {
+ iNotificationRegisterLcsLocation.Complete(KErrDisconnected);
+ }
+
+ if (!iNotificationCancelPrivacyRequest.IsNull())
+ {
+ iNotificationCancelPrivacyRequest.Complete(KErrDisconnected);
+ }
+
+ if (!iNotificationNetworkGone.IsNull())
+ {
+ iNotificationNetworkGone.Complete(KErrDisconnected);
+ }
+
+ if (!iNotificationResetAssistanceData.IsNull())
+ {
+ iNotificationResetAssistanceData.Complete(KErrDisconnected);
+ }
+ }
+
+/**
+*/
+void CLbsNetSimGatewayHandler::ProcessAssistanceDataL(TInt aError,
+ RLbsAssistanceDataBuilderSet& aAssistanceData,
+ TPositionInfo& aPosition,
+ TLbsNetPosRequestQuality& aQuality)
+ {
+ LBSLOG(ELogP1, "CLbsNetSimGatewayHandler::ProcessAssistanceDataL()");
+ LBSLOG2(ELogP2, "AssistanceDataError = %d", aError);
+
+ iAssistanceDataError = aError;
+
+ // Write position to message
+ TPckg<TPositionInfo> positionPkg(aPosition);
+ iNotificationMeasurementControlLocation.WriteL(0, positionPkg, 0);
+
+ // Write quality to message
+ TPckg<TLbsNetPosRequestQuality> qualityPkg(aQuality);
+ iNotificationMeasurementControlLocation.WriteL(1, qualityPkg, 0);
+
+ // Write assistance data to the message
+ HBufC8* buffer = HBufC8::NewLC(RLbsAssistanceDataBuilderSet::MaxExternalizedBufferSize());
+ TPtr8 des(buffer->Des());
+ RDesWriteStream stream(des);
+ CleanupClosePushL(stream);
+ aAssistanceData.ExternalizeL(stream);
+ stream.CommitL();
+ iNotificationMeasurementControlLocation.WriteL(2, des, 0);
+ CleanupStack::PopAndDestroy(2, buffer);
+
+ // Fire test notification
+ iMeasurementControlLocationAssistanceData.MergeL(aAssistanceData);
+ iMeasurementControlLocationPosition = aPosition;
+ iMeasurementControlLocationQuality = aQuality;
+
+ // Complete the message
+ iGotAssistanceData = ETrue;
+ if (!IsActive() &&
+ (iMessages.Count() > 0) &&
+ ((iMessages.At(0) == EContinueRegisterLcsMoLr2) ||
+ (iMessages.At(0) == EContinueRequestMoreAssistanceData) ||
+ (iMessages.At(0) == EContinueMtLr)))
+ {
+ After(0);
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::SetAssistanceDataMask(TLbsAssistanceDataGroup& aMask)
+ {
+ iAssistanceDataMask = aMask;
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::SetMoreAssistanceDataMask(TLbsAssistanceDataGroup& aMask)
+ {
+ iMoreAssistanceDataMask = aMask;
+ }
+
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::ClearAssistanceDataMasks()
+ {
+ iAssistanceDataMask = iDefaultAssistanceDataMask;
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::StartNetworkPrivacyRequestL(TLbsNetPosRequestPrivacy& aType, TLbsExternalRequestInfo& aRequestInfo)
+ {
+ // Get emergency state
+ TBool emergency = EFalse;
+ RProperty::Get(TUid::Uid(KLbsNetSimStatus), KLbsEmergencyStatus, emergency);
+
+ if (iState == ENothing)
+ {
+ // Write args
+ TPckg<TLbsExternalRequestInfo> requestInfoPkg(aRequestInfo);
+ iNotificationRegisterLcsLocation.WriteL(0, requestInfoPkg);
+ TPckg<TLbsNetPosRequestPrivacy> requestPrivacyPkg(aType);
+ iNotificationRegisterLcsLocation.WriteL(1, requestPrivacyPkg);
+
+ iNotificationRegisterLcsLocation.Complete(KErrNone);
+
+ iState = (emergency) ? EPrivacy_E : EPrivacy;
+ }
+ else
+ {
+ if ((iMtLrOverrides) ||
+ (emergency && ((iState != EPrivacy_E) && (iState != EMtLr_E))))
+ {
+ // Cancel what we are doing and start the MtLr
+ iPrivacyType = aType;
+ iPrivacyRequest = aRequestInfo;
+ Cancel((emergency) ? EPrivacy_E : EPrivacy);
+ }
+ else
+ {
+ User::Leave(KErrInUse);
+ }
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::CancelNetworkPrivacyRequestL()
+ {
+ if (iState != ENothing)
+ {
+ if (!iNotificationRegisterLcsLocation.IsNull())
+ {
+ iNotificationRegisterLcsLocation.Complete(KErrCancel);
+ }
+
+ FinishL();
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::StartNetworkLocationRequestL()
+ {
+ // Get emergency state
+ TBool emergency = EFalse;
+ RProperty::Get(TUid::Uid(KLbsNetSimStatus), KLbsEmergencyStatus, emergency);
+
+ if (iState == ENothing)
+ {
+ iGotAssistanceData = EFalse;
+ iAssistanceDataProvider.RequestAssistanceDataL(iDefaultAssistanceDataMask);
+ AddMessageL(EContinueMtLr);
+
+ iState = (emergency) ? EMtLr_E : EMtLr;
+ }
+ else
+ {
+ if ((iMtLrOverrides) ||
+ (emergency && ((iState != EPrivacy_E) && (iState != EMtLr_E))))
+ {
+ // Cancel what we are doing and start the MtLr
+ Cancel((emergency) ? EMtLr_E : EMtLr);
+ }
+ else
+ {
+ User::Leave(KErrInUse);
+ }
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::CancelNetworkLocationRequestL()
+ {
+ if (iState != ENothing)
+ {
+ if (!iNotificationMeasurementControlLocation.IsNull())
+ {
+ iNotificationMeasurementControlLocation.Complete(KErrCancel);
+ }
+
+ FinishL();
+ }
+ }
+
+void CLbsNetSimGatewayHandler::SendResetAssistanceData(TLbsAssistanceDataGroup aMask)
+ {
+ TPckg<TLbsAssistanceDataGroup> maskPkg(aMask);
+ TInt err = iNotificationResetAssistanceData.Write(0, maskPkg);
+ iNotificationResetAssistanceData.Complete(err);
+ }
+
+/**
+*/
+void CLbsNetSimGatewayHandler::RunL()
+ {
+ if (!iWaitTimeSticky)
+ {
+ iWaitTime = 0;
+ }
+
+ switch (iMessages.At(0))
+ {
+ case EContinueRegisterLcsMoLr1:
+ {
+ // Check to see we have a valid destination
+ if (CheckDestinationValidity(iRegisterLcsMoLrData->Des()))
+ {
+ // Notify test handler
+ TInt err = iTestHandler->GatewayRegisterLcsMoLr(iRegisterLcsMoLrData->Des());
+ if (err == KErrNone)
+ {
+ // So MoLr or X3P
+ if (iRegisterLcsMoLrData->Length() == 0)
+ {
+ iState = EMoLr;
+ }
+ else
+ {
+ iState = EX3P;
+ }
+ iSubState = EPreMrl;
+ iRequestCancelled = EFalse;
+
+ // Regardless of type we do same thing here => kick of request for assitance data
+ iGotAssistanceData = EFalse;
+ iAssistanceDataProvider.RequestAssistanceDataL(iAssistanceDataMask);
+ AddMessageL(EContinueRegisterLcsMoLr2);
+ }
+ else
+ {
+ iNotificationMeasurementControlLocation.Complete(err);
+ FinishL();
+ }
+ }
+ else
+ {
+ iNotificationMeasurementControlLocation.Complete(KErrArgument);
+ FinishL();
+ }
+
+ delete iRegisterLcsMoLrData;
+ iRegisterLcsMoLrData = NULL;
+
+ iMessages.Delete(0);
+ break;
+ }
+ case EContinueRegisterLcsMoLr2:
+ case EContinueRequestMoreAssistanceData:
+ case EContinueMtLr:
+ {
+ // Has the assitance data arrived?
+ if (iGotAssistanceData)
+ {
+ if (!iNotificationMeasurementControlLocation.IsNull() && !iRequestCancelled && (iState != ENothing)) // Could have been cancelled in the delay
+ {
+ TInt err = iTestHandler->GatewayProcessAssistanceDataL(iMeasurementControlLocationAssistanceData,
+ iMeasurementControlLocationPosition,
+ iMeasurementControlLocationQuality);
+ if (err == KErrNone)
+ {
+ iNotificationMeasurementControlLocation.Complete(iAssistanceDataError);
+ }
+ else
+ {
+ iNotificationMeasurementControlLocation.Complete(err);
+ FinishL();
+ }
+ }
+
+ iRequestCancelled = EFalse;
+
+ iMessages.Delete(0);
+ }
+ break;
+ }
+ case EContinueMeasurementReportLocation:
+ {
+ // Complete the message
+ if (!iMessageMeasurementReportLocation.IsNull())
+ {
+ TInt err = KErrNone;
+ if ((iState == EMoLr) || (iState == EX3P))// Only inform observers if MoLr or X3P
+ {
+ err = iTestHandler->GatewayFacilityLcsMoLrResultL(iMeasurementReportLocationStatus, iMeasurementReportLocationPosition);
+ }
+ iMessageMeasurementReportLocation.Complete(err); // We will complete but fireNotification should be false
+ }
+
+ // Reset state?
+ if ((iState == EMtLr) || (iState == EMtLr_E))
+ {
+ FinishL();
+ // Dont delete top message FinishL clears up for us.
+ }
+ else
+ {
+ iMessages.Delete(0);
+ }
+
+ iRequestCancelled = EFalse;
+ break;
+ }
+ case EContinueReleaseLcsMoLr:
+ {
+ iTestHandler->GatewayReleaseLcsMoLrL(iReleaseLcsMoLrReason);
+ FinishL();
+
+ // Do not delete the top messages as FinishL will have cleared up the messages.
+ break;
+ }
+ case EContinueMeasurementControlFailure:
+ {
+ iTestHandler->GatewayMeasurementControlFailureL(iMeasurementControlFailureReason);
+
+ if ((iState == EMtLr) ||
+ (iState == EMtLr_E))
+ {
+ FinishL();
+ }
+ else
+ {
+ iMessages.Delete(0);
+ }
+ break;
+ }
+ default:
+ {
+ ASSERT(EFalse);
+ _LIT(KInternalError, "Internal Error");
+ User::Panic(KInternalError, KErrAbort);
+ }
+ }
+
+ if (iMessages.Count() > 0)
+ {
+ if (!IsActive())
+ {
+ if ((iMessages[0] == EContinueRegisterLcsMoLr2) ||
+ (iMessages[0] == EContinueRequestMoreAssistanceData) ||
+ (iMessages[0] == EContinueMtLr))
+ {
+ if (iGotAssistanceData)
+ {
+ After(0);
+ }
+ }
+ else
+ {
+ After(iWaitTime);
+ }
+ }
+ }
+ }
+
+
+
+
+//
+// Private
+
+
+/**
+*/
+CLbsNetSimGatewayHandler::CLbsNetSimGatewayHandler(CLbsNetSimAssistanceDataProvider& aAssistanceDataProvider) :
+ CTimer(EPriorityMuchLess), iMessages(2), iState(ENothing), iAssistanceDataProvider(aAssistanceDataProvider),
+ iWaitTime(0), iWaitTimeSticky(EFalse), iError(KErrNone), iErrorSticky(EFalse),
+ iMtLrOverrides(EFalse), iRequestCancelled(EFalse), iStartOnComplete(ENothing)
+ {
+ CActiveScheduler::Add(this);
+
+ iAssistanceDataMask = iDefaultAssistanceDataMask;
+ iAssistanceDataProvider.SetObserver(this);
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::ConstructL()
+ {
+ CTimer::ConstructL();
+ iMeasurementControlLocationAssistanceData.OpenL();
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::HandleRegisterLcsMoLrL(const RMessage2& aMessage)
+ {
+ ASSERT(iRegisterLcsMoLrData == NULL);
+
+ // Read args
+ TInt size = aMessage.GetDesLengthL(0);
+ iRegisterLcsMoLrData = HBufC::NewL(size);
+ TPtr ptr(iRegisterLcsMoLrData->Des());
+ aMessage.ReadL(0, ptr, 0);
+
+ AddMessageL(EContinueRegisterLcsMoLr1);
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::HandleMeasurementReportLocationL(const RMessage2& aMessage)
+ {
+ if (iState != ENothing)
+ {
+ TInt status = KErrNone;
+ iMessageMeasurementReportLocation = aMessage;
+
+ // Read args
+ TPositionInfo position;
+ TPckg<TPositionInfo> positionPkg(position);
+ aMessage.ReadL(1, positionPkg, 0);
+
+ // Notifications
+ TInt err = iTestHandler->GatewayMeasurementReportLocationL(position);
+ if (err == KErrNone)
+ {
+ TBool fireNotification = EFalse;
+ // Write args
+ if ((iState == EMoLr)||(iState == EX3P))
+ {
+ fireNotification = ETrue;
+ }
+
+ TPckg<TInt> statusPkg(status);
+ TPckg<TBool> fireNotificationPkg(fireNotification);
+ aMessage.WriteL(0, statusPkg, 0);
+ aMessage.WriteL(2, fireNotificationPkg, 0);
+
+ // Fire the notification
+ iMeasurementReportLocationStatus = status;
+ iMeasurementReportLocationPosition = position;
+ //iTestHandler->GatewayFacilityLcsMoLrResultL(status, position);
+
+ iSubState = EPostMrl;
+ AddMessageL(EContinueMeasurementReportLocation);
+ }
+ else
+ {
+ iMessageMeasurementReportLocation.Complete(err);
+ FinishL();
+ }
+ }
+ else
+ {
+ aMessage.Complete(KErrNotReady);
+ FinishL();
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::HandleReleaseLcsMoLrL(const RMessage2& aMessage)
+ {
+ // A release may come in even though we have not managed to transit into a
+ // state. So dont check state here.
+ iMessageReleaseLcsMoLr = aMessage;
+
+ // Read args
+ TPckg<TInt> reasonPkg(iReleaseLcsMoLrReason);
+ aMessage.ReadL(0, reasonPkg, 0);
+
+ iRequestCancelled = ETrue;
+ AddMessageL(EContinueReleaseLcsMoLr);
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::HandleMeasurementControlFailureL(const RMessage2& aMessage)
+ {
+ if (iState != ENothing)
+ {
+ iMeasurementControlFailureReason = aMessage.Int0();
+ AddMessageL(EContinueMeasurementControlFailure);
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::HandleRequestMoreAssistanceDataL(const RMessage2& aMessage)
+ {
+ LBSLOG(ELogP1, "CLbsNetSimGatewayHandler::HandleRequestMoreAssistanceDataL()");
+
+ if (iState != ENothing)
+ {
+ // Read filter
+ TLbsAssistanceDataGroup filter;
+ TPckg<TLbsAssistanceDataGroup> filterPkg(filter);
+ aMessage.ReadL(0, filterPkg, 0);
+
+ // Fire notification
+ TInt err = iTestHandler->GatewayRequestMoreAssistanceDataL(filter);
+ if (err == KErrNone)
+ {
+ // Request assistance data
+ iGotAssistanceData = EFalse;
+ iAssistanceDataProvider.RequestAssistanceDataL(filter);
+ AddMessageL(EContinueRequestMoreAssistanceData);
+ }
+ else
+ {
+ iNotificationMeasurementControlLocation.Complete(err);
+ FinishL();
+ }
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::HandleReleaseLcsLocationNotifcationL(const RMessage2& aMessage)
+ {
+ // Read the response
+ CLbsNetworkProtocolBase::TLbsPrivacyResponse response;
+ TPckg<CLbsNetworkProtocolBase::TLbsPrivacyResponse> responsePkg(response);
+ aMessage.ReadL(0, responsePkg, 0);
+
+ iTestHandler->GatewayReleaseLcsLocationNotificationL(response);
+
+ FinishL();
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::SetResponseTime(TInt32 aTime, TBool aSticky)
+ {
+ iWaitTime = aTime * 1000; // We need millisecond
+ iWaitTimeSticky = aSticky;
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::SetResponseError(TInt32 aError, TBool aSticky)
+ {
+ iError = aError;
+ iErrorSticky = aSticky;
+
+ LBSLOG3(ELogP2, "SetResponseError %d (sticky = %d)", aError, aSticky);
+
+ if (iError == RLbsNetSimTest::KNetSimNetworkNotAvailable)
+ {
+ if (!iNotificationNetworkGone.IsNull())
+ {
+ iNotificationNetworkGone.Complete(iError);
+ if (iState != ENothing)
+ {
+ FinishL();
+ }
+ }
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::AddMessageL(NextMessage aMessage)
+ {
+ LBSLOG2(ELogP2, "Appending message to NetSim queue: %d", aMessage);
+ iMessages.AppendL(aMessage);
+
+ // Is the timer already running?
+ if (!IsActive())
+ {
+ if ((iMessages[0] == EContinueRegisterLcsMoLr2) ||
+ (iMessages[0] == EContinueRequestMoreAssistanceData) ||
+ (iMessages[0] == EContinueMtLr))
+ {
+ if (iGotAssistanceData)
+ {
+ After(0);
+ }
+ }
+ else
+ {
+ After(iWaitTime);
+ }
+ }
+ }
+
+
+/**
+*/
+void CLbsNetSimGatewayHandler::Cancel(MessageState aToStart)
+ {
+ // Store what we need to start
+ iStartOnComplete = aToStart;
+
+ // Cancel what we are doing
+ switch (iState)
+ {
+ case EMoLr:
+ case EX3P:
+ {
+ if (iSubState == EPreMrl)
+ {
+ iNotificationMeasurementControlLocation.Complete(KErrCancel);
+ iRequestCancelled = ETrue;
+ }
+ else
+ {
+ if (iState == EMoLr) // Cant cancel an X3P here
+ {
+ iMessageMeasurementReportLocation.Complete(KErrCancel);
+ iRequestCancelled = ETrue;
+ }
+ }
+ break;
+ }
+ case EPrivacy:
+ {
+ TPckg<TInt> reasonPkg(KErrCancel);
+ iNotificationCancelPrivacyRequest.Write(0, reasonPkg, 0);
+ iNotificationCancelPrivacyRequest.Complete(KErrNone);
+ break;
+ }
+ case EMtLr:
+ {
+ iNotificationMeasurementControlLocation.Complete(KErrCancel);
+ break;
+ }
+ default:
+ {
+ ASSERT(EFalse);
+ }
+ }
+ }
+
+void CLbsNetSimGatewayHandler::FinishL()
+ {
+ iState = ENothing;
+
+ switch (iStartOnComplete)
+ {
+ case ENothing:
+ {
+ break;
+ }
+ case EPrivacy:
+ case EPrivacy_E:
+ {
+ StartNetworkPrivacyRequestL(iPrivacyType, iPrivacyRequest);
+ break;
+ }
+ case EMtLr:
+ case EMtLr_E:
+ {
+ StartNetworkLocationRequestL();
+ break;
+ }
+ default:
+ {
+ ASSERT(EFalse);
+ }
+ }
+
+ iStartOnComplete = ENothing;
+ ResetInternals();
+ }
+
+TBool CLbsNetSimGatewayHandler::CheckDestinationValidity(TPtrC aDestination)
+ {
+ TInt size = aDestination.Length();
+ TBool valid = ETrue;
+ for (TInt x = 0; valid && (x < size); x++)
+ {
+ TChar chr(aDestination[x]);
+ valid = chr.IsDigit();
+ }
+
+ return valid;
+ }
+
+void CLbsNetSimGatewayHandler::ResetInternals()
+ {
+ iWaitTime = 0;
+ iWaitTimeSticky = EFalse;
+ iError = KErrNone;
+ iErrorSticky = EFalse;
+ iRequestCancelled = EFalse;
+ // Cancel the timer
+ CTimer::Cancel();
+ // Reset the messages. Only delete messages up to a LBSRegisterLcsMoLr.
+ while (iMessages.Count() > 0)
+ {
+ if (iMessages[0] != EContinueRegisterLcsMoLr1)
+ {
+ iMessages.Delete(0);
+ }
+ else
+ {
+ break;
+ }
+ }
+ }