locationmgmt/networkgateway/src/netrequestchannel.cpp
changeset 0 9cfd9a3ee49c
child 52 29dbbeac905d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationmgmt/networkgateway/src/netrequestchannel.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,193 @@
+// 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:
+// Definition of network request channel component.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#include <e32base.h>
+#include <e32debug.h>
+#include <lbs/lbslocerrors.h>
+#include "lbsdevloggermacros.h"
+#include "lbsprocessuiddefs.h"
+#include "netrequestchannel.h"
+#include "lbsnrhngmsgs.h"
+
+
+//
+// CNetworkRequestChannel
+//
+
+const TLbsNetSessionIdInt KInvalidSessionId(TUid::Uid(0xDC0DED), 999);
+const TLbsNetPosRequestQualityInt KInvalidQuality;
+const TLbsNetPosRequestMethodInt KInvalidMethod;
+const TLbsNetPosRequestPrivacyInt KInvalidRequestPrivacy;
+const TLbsExternalRequestInfo KInvalidExternalRequestInfo;
+const TInt KEmergencyBufMaxCount = 2;
+
+CNetworkRequestChannel::CNetworkRequestChannel(MNetworkRequestObserver& aObserver) : 
+	CActive(EPriorityStandard),
+	iObserver(aObserver),
+	iEmergencyLocationRequestMsg(KInvalidSessionId, EFalse, 
+									TLbsNetworkEnumInt::EServiceNone, 
+									KInvalidQuality, KInvalidMethod),
+	iEmergencyPrivacyRequestMsg(KInvalidSessionId, EFalse,
+								   KInvalidRequestPrivacy,
+								   KInvalidExternalRequestInfo)
+	{
+	}
+	
+CNetworkRequestChannel::~CNetworkRequestChannel()
+	{
+	Cancel();
+	iNetRequestChannel.Close();
+	iEmergencyBuffer.Reset();
+	delete iMsgBuffer;
+	}
+
+CNetworkRequestChannel* CNetworkRequestChannel::NewL(MNetworkRequestObserver& aObserver)
+	{
+	CNetworkRequestChannel* self = new (ELeave) CNetworkRequestChannel(aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+void CNetworkRequestChannel::ConstructL()
+	{
+	iMsgBuffer = CRequestMessageBuffer::NewL();
+	iEmergencyBuffer.ReserveL(KEmergencyBufMaxCount);
+	
+	iNetRequestChannel.OpenL(RLbsNetChannel::EChannelNG2NRH, *this);
+	CActiveScheduler::Add(this);
+	}
+	
+void CNetworkRequestChannel::RunL()
+	{
+	User::LeaveIfError(iStatus.Int());
+	
+	if (iEmergencyBuffer.Count() > 0) // If there is a pending emergency request send this first
+		{
+		SendMessageAndNotifyForResponse(*(iEmergencyBuffer[0]));
+		RemoveEmergencyMessage(iEmergencyBuffer[0]);
+		}
+	else
+		{
+		// If there is a pending message in the buffer, pass it on to the NRH
+		SendNextBufferedMessage();
+		}
+	}
+	
+void CNetworkRequestChannel::DoCancel()
+	{
+	iNetRequestChannel.CancelSendMessageNotification();
+	}
+	
+TInt CNetworkRequestChannel::RunError(TInt aError)
+	{
+	return aError;
+	}
+
+void CNetworkRequestChannel::SendNetRequestMessage(const TLbsNetInternalMsgBase& aMessage)
+	{
+	LBSLOG(ELogP1, "CNetworkRequestChannel::SendNetRequestMessage:");
+	TBool emergency = EFalse;
+
+	if (!IsActive())
+		{		
+		// Immediately send the new message.
+		SendMessageAndNotifyForResponse(aMessage);
+		}
+	else // First see if this is an emergency request
+		{
+		if(aMessage.Type() == TLbsNetInternalMsgBase::ELocationRequest)
+			{
+			if((static_cast<const TLbsNetLocationRequestMsg*>(&aMessage))->IsEmergency())
+				{
+				iEmergencyLocationRequestMsg = static_cast<const TLbsNetLocationRequestMsg&>(aMessage);
+				iEmergencyBuffer.Append(&iEmergencyLocationRequestMsg);
+				emergency = ETrue;
+				}
+			}
+		else if(aMessage.Type() == TLbsNetInternalMsgBase::EPrivacyRequest)
+			{
+			if( (static_cast<const TLbsNetMtLrRequestMsg*>(&aMessage))->IsEmergency() )
+				{
+				iEmergencyPrivacyRequestMsg = static_cast<const TLbsNetMtLrRequestMsg&>(aMessage);
+				iEmergencyBuffer.Append(&iEmergencyPrivacyRequestMsg);
+				emergency = ETrue;
+				}
+			}
+		
+		if(!emergency) // If it is an emergency then handle in RunL
+			{
+			// Still waiting for acknowledgement that a previous message
+			// was read, so buffer this new message.
+			TInt err = iMsgBuffer->BufferMessage(aMessage);
+			if (err != KErrNone)
+				{
+				LBSLOG(ELogP1, "BUFFERING MESSAGE FAILED!!");
+				}
+			}
+		}
+	}
+	
+void CNetworkRequestChannel::ProcessNetChannelMessage(RLbsNetChannel::TLbsNetChannelId aChannelId, const TLbsNetInternalMsgBase& aMessage)
+	{
+	LBSLOG(ELogP1, "CNetworkRequestChannel::ProcessNetChannelMessage");
+	__ASSERT_DEBUG(aChannelId == RLbsNetChannel::EChannelNG2NRH, User::Panic(KLbsNGFault, ENGUnexpectedNetChannelId));
+	(void) aChannelId;
+	iObserver.ProcessNetRequestMessage(aMessage);
+	}
+
+void CNetworkRequestChannel::SendMessageAndNotifyForResponse(const TLbsNetInternalMsgBase& aMessage)
+	{
+	LBSLOG(ELogP1, "CNetworkRequestChannel::SendMessage:");
+	LBSLOG2(ELogP2, "Sending message : Type %d", aMessage.Type());
+	
+	iNetRequestChannel.SendMessage(aMessage, iStatus);
+	SetActive();
+	}
+	
+void CNetworkRequestChannel::SendNextBufferedMessage()
+	{
+	LBSLOG(ELogP1, "CNetworkRequestChannel::SendNextBufferedMessage:");
+	
+	const TLbsNetInternalMsgBase* msg = iMsgBuffer->PeekNextMessage();
+	if (msg != NULL)
+		{
+		// Send the oldest buffered message. This will always
+		// be the one at position zero.
+		LBSLOG2(ELogP2, "Sending buffered message. Type: %d", msg->Type());
+		SendMessageAndNotifyForResponse(*msg);
+		iMsgBuffer->RemoveMessage(msg);
+		}
+	}
+
+void CNetworkRequestChannel::RemoveEmergencyMessage(
+		const TLbsNetInternalMsgBase* aMessage)
+	{
+	TInt index = iEmergencyBuffer.Find(aMessage, iMsgBuffer->IsMsgEqual);
+	if (index != KErrNotFound)
+		{
+		iEmergencyBuffer.Remove(index);
+		}
+	}
+