networkprotocolmodules/privacyprotocolmodule/PrivacyProtocolModule/src/privacymodule.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/privacyprotocolmodule/PrivacyProtocolModule/src/privacymodule.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,564 @@
+// Copyright (c) 2007-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:
+// privacymodule.h
+// This file provides the class implementation of the ECOM plug-in 
+// interface for the LBS Privacy Protocol Module.
+// 
+//
+
+#include <ecom/implementationproxy.h>
+#include "lbsdevloggermacros.h"
+#include <lbs/lbsadmin.h>
+#include "privacymodule.h"
+#include "lbsprivacyserverreturncodes.h"
+
+
+/** The unique ID of this plug-in implementation.
+This corresponds to the implementation UID specified in the .rss file
+for this protocol module.
+*/
+const TInt KPluginUidValue = 0x1028373C;
+
+
+/** 
+Static public constructor.
+
+@param aObserver Plug-in parameters, which includes a reference to this protocol module's observer.
+@return A new instance of the CPrivacyProtocol class.
+*/  
+CPrivacyProtocol* CPrivacyProtocol::NewL(TAny* aParam)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::NewL() Begin\n");
+	LBSLOG(ELogP2, "CPrivacyProtocol::NewL");
+
+	TLbsNetProtocolModuleParams* param = reinterpret_cast<TLbsNetProtocolModuleParams*>(aParam);
+	CPrivacyProtocol* self = new (ELeave) CPrivacyProtocol(param->Observer());
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	LBSLOG(ELogP1, "CPrivacyProtocol::NewL() End\n");
+	return self;
+	}
+
+
+/** 
+Standard destructor.
+*/  
+CPrivacyProtocol::~CPrivacyProtocol()
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::~CPrivacyProtocol() Begin\n");
+	LBSLOG(ELogP2, "CPrivacyProtocol::~CPrivacyProtocol");
+	delete iRequestBuffer;
+	delete iServer;	
+	LBSLOG(ELogP1, "CPrivacyProtocol::~CPrivacyProtocol() End\n");
+	}
+
+
+/** 
+Request to cancel a previous privacy verification request.
+
+@param aCancelInfo The information required to cancel the request.
+*/	
+void CPrivacyProtocol::CancelVerifyLocationRequest(CCancelPrivacyRequestInfo* aCancelInfo)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::CancelVerifyLocationRequest() Begin\n");
+	TInt requestId = aCancelInfo->GetRequestId();
+	TInt cancelReason = aCancelInfo->CancelReason();
+
+	// Complete the session
+	CPrivacyRequestInfo* request = iRequestBuffer->FindRequest(requestId);
+	if (request)
+		{
+		TLbsNetSessionId sessionId(TUid::Uid(KPluginUidValue),requestId);
+		iObserver.ProcessSessionComplete(sessionId,cancelReason);
+		request->SetIsSessionCompleteAutomatic(EFalse);
+		}
+	
+	// Cancel any waiting requests with this ID in the buffer
+	iRequestBuffer->CancelAnyOutstandingRequestById(requestId, cancelReason);
+
+	// We're done with this now, so delete
+	delete aCancelInfo;
+	
+	LBSLOG(ELogP1, "CPrivacyProtocol::CancelVerifyLocationRequest() End\n");
+	}
+
+
+/** 
+Request to get the next session ID to use for a new privacy request.
+
+@param aSessionId Reference to a TLbsNetSessionId to populate with the new session ID.
+*/	
+void CPrivacyProtocol::GetNextSessionId(TLbsNetSessionId& aSessionId)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::GetNextSessionId() Begin\n");
+	aSessionId = iNextSessionId;
+	if (iNextSessionId.SessionNum() == KMaxTInt)
+		{
+		iNextSessionId.SetSessionNum(0);
+		}
+	iNextSessionId.IncrSession();
+	LBSLOG(ELogP1, "CPrivacyProtocol::GetNextSessionId() End\n");
+	}
+
+
+/** 
+Send a privacy notification request to the LBS sub-system.
+
+@param aRequestInfo The information about this request.
+*/	
+void CPrivacyProtocol::NotifyLocationRequest(CPrivacyRequestInfo* aRequestInfo)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::NotifyLocationRequest() Begin\n");
+	ProcessRequest(aRequestInfo);
+	LBSLOG(ELogP1, "CPrivacyProtocol::NotifyLocationRequest() End\n");
+	}
+
+
+/** 
+Notifies the LBS sub-system that a previous privacy verification request timed out in the network.
+
+@param aRequestInfo The information about this request.
+*/	
+void CPrivacyProtocol::NotifyVerificationTimeout(CPrivacyRequestInfo* aRequestInfo)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::NotifyVerificationTimeout() Begin\n");
+	ProcessRequest(aRequestInfo);
+	LBSLOG(ELogP1, "CPrivacyProtocol::NotifyVerificationTimeout() End\n");
+	}
+
+
+/** 
+Sends a privacy verification request to the LBS sub-system.
+
+@param aRequestInfo The information about this request.
+*/	
+void CPrivacyProtocol::VerifyLocationRequest(CPrivacyRequestInfo* aRequestInfo)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::VerifyLocationRequest() Begin\n");
+	ProcessRequest(aRequestInfo);
+	LBSLOG(ELogP1, "CPrivacyProtocol::VerifyLocationRequest() End\n");
+	}
+
+/** 
+Sends a privacy request to the LBS sub-system.
+
+@param aRequestInfo The information about this request.
+*/	
+void CPrivacyProtocol::PrivacyLocationRequest(CPrivacyRequestInfo* aRequestInfo)
+	{
+    LBSLOG(ELogP7, "<-S CPrivacyProtocol::PrivacyLocationRequest(aRequestInfo)\n");
+	ProcessRequest(aRequestInfo);
+	}
+
+/**
+Completes the privacy request session. This is part of the call made from the client side, so 
+The client gets notified of this.
+
+@param aRequestId The session of the privacy request to be completed
+@param aReason The reason for which is completed
+*/
+void CPrivacyProtocol::CompletePrivacyRequest(TUint32 aRequestId, TInt aReason)
+	{
+    LBSLOG(ELogP7, "<-S CPrivacyProtocol::CompletePrivacyRequest(aRequestId, aReason)\n");
+    LBSLOG2(ELogP7, "\t > TLbsPrivacyRequestId aRequestId = %d\n", aRequestId);
+    LBSLOG2(ELogP7, "\t > TLbsPrivacyRequestId aReason = %d\n", aReason);
+	
+	CPrivacyRequestInfo* request = iRequestBuffer->FindRequest(aRequestId);
+	if (request)
+		{
+		// Need to complete the message for LBS
+		TLbsNetSessionId sessionId(TUid::Uid(KPluginUidValue),aRequestId);
+		iObserver.ProcessSessionComplete(sessionId,aReason);
+		request->SetIsSessionCompleteAutomatic(EFalse);
+
+		// Complete the request if it is awaiting a response.
+		if (request->IsResponseRequired())
+			{
+		    LBSLOG(ELogP7, "->A Client::RunL(aResponse)\n");
+		    LBSLOG2(ELogP7, "\t < TInt aResponse = %d\n", KRequestCancelledByClient);
+			request->CompleteRequest(KRequestCancelledByClient);
+			}
+		
+		// Remove the request and delete
+		iRequestBuffer->RemoveRequest(request);
+		delete request;
+		}
+
+	LBSLOG(ELogP1, "CPrivacyProtocol::CompletePrivacyRequest() End\n");
+	}
+
+/**
+Signals that a client has disconnected from the server.
+
+Normally the disconnect will be because the client has closed
+the session, but it may also be because the client panicked. 
+
+We must clean up any outstanding requests the client had here.
+
+@param aSession Session object for the client that disconnected.
+*/
+void CPrivacyProtocol::SessionDisconnected(const CSession2* aSession)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::SessionDisconnected() Begin\n");
+
+	// Complete the session
+	CPrivacyRequestInfo* request = iRequestBuffer->FindRequest(aSession);
+	if (request)
+		{
+		TLbsNetSessionId sessionId(TUid::Uid(KPluginUidValue),request->GetRequestId());
+		iObserver.ProcessSessionComplete(sessionId,KErrCancel);
+		request->SetIsSessionCompleteAutomatic(EFalse);
+		
+		// Remove the request and delete
+		iRequestBuffer->RemoveRequest(request);
+		delete request;
+		}
+	
+	// Check if any buffered requests need to cancelled
+	iRequestBuffer->CancelAnyOutstandingRequestBySession(aSession);
+
+	LBSLOG(ELogP1, "CPrivacyProtocol::SessionDisconnected() End\n");	
+	}
+
+
+/** 
+Called by the Network Gateway in response to our privacy requests.
+
+@param aSessionId The ID of the session.
+@param aResponse Response information for this privacy session.
+*/	
+void CPrivacyProtocol::RespondPrivacyRequest(const TLbsNetSessionId& aSessionId, const TLbsPrivacyResponse& aResponse)
+	{
+	// Locate the request in the buffer
+	CPrivacyRequestInfo* request = iRequestBuffer->FindRequest(aSessionId.SessionNum());
+	if (request)
+		{
+		// Complete the active request if it is awaiting a response
+		if (request->IsResponseRequired())
+			{
+			if(request->ConvertResponseCode())
+				{
+				request->CompleteRequest((aResponse == EPrivacyResponseAccepted) ? KErrNone : KErrAccessDenied);
+				}
+			else
+				{
+				request->CompleteRequest(aResponse);
+				}
+			// Only need to respond once, so clear the flag.
+			request->SetIsResponseRequired(EFalse);
+			}
+		
+		if(request->IsSessionCompleteAutomatic())
+			{
+			// Notify network gateway that this session is complete
+			iObserver.ProcessSessionComplete(aSessionId,KErrNone);
+			request->SetIsSessionCompleteAutomatic(EFalse);
+
+			// Remove the request and delete
+			iRequestBuffer->RemoveRequest(request);
+			delete request;
+			}
+		}
+	else
+		{
+		LBSLOG(ELogP2, "CPrivacyProtocol::RespondPrivacyRequest() Unexpected response\n");
+		}
+	}
+
+
+//---------------------------------------------------------------------------
+// The following Network Protocol Module SPI methods are are not supported, 
+// as this module is only concerned with privacy requests:
+//---------------------------------------------------------------------------
+
+
+/**
+Send a response to a location request to the network.
+@see CLbsNetworkProtocolBase::RespondLocationRequest()
+*/
+void CPrivacyProtocol::RespondLocationRequest(const TLbsNetSessionId& /*aSessionId*/, TInt /*aReason*/, 
+												const TPositionInfoBase& /*aPosInfo*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/**
+Send a request for GPS assistance data to the network.
+@see CLbsNetworkProtocolBase::RequestAssistanceData()
+*/
+void CPrivacyProtocol::RequestAssistanceData(TLbsAsistanceDataGroup /*aDataRequestMask*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/**
+Send a request for an approximate location based on the current network cell to the network.
+@see CLbsNetworkProtocolBase::RequestNetworkLocation()
+*/
+void CPrivacyProtocol::RequestNetworkLocation(const TLbsNetSessionId& /*aSessionId*/,
+							const TLbsNetPosRequestOptionsBase& /*aOptions*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/**
+Tell the protocol module to finish the current network based location request.
+@see CLbsNetworkProtocolBase::CancelNetworkLocation()
+*/
+void CPrivacyProtocol::CancelNetworkLocation(const TLbsNetSessionId& /*aSessionId*/,
+							TInt /*aReason*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/** 
+Request self locate.
+@see CLbsNetworkProtocolBase::RequestSelfLocation()
+*/
+void CPrivacyProtocol::RequestSelfLocation(const TLbsNetSessionId& /*aSessionId*/,
+							const TLbsNetPosRequestOptionsBase& /*aOptions*/)	
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/**
+Cancel request for self locate.
+@see CLbsNetworkProtocolBase::CancelSelfLocation()
+*/
+void CPrivacyProtocol::CancelSelfLocation(const TLbsNetSessionId& /*aSessionId*/,
+							TInt /*aReason*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/**
+Lbs System Status information.
+@see CLbsNetworkProtocolBase::AdviceSystemStatus()
+*/
+void CPrivacyProtocol::AdviceSystemStatus(TLbsSystemStatus /*aStatus*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/**
+Send a request to send the handsets location to a third party to the network.
+@see CLbsNetworkProtocolBase::RequestTransmitLocation()
+*/
+void CPrivacyProtocol::RequestTransmitLocation(const TLbsNetSessionId& /*aSessionId*/,
+								const TDesC& /*aDestination*/, TInt /*aPriority*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/**
+Tell the protocol module to end the current send location to third party request.
+@see CLbsNetworkProtocolBase::CancelTransmitLocation()
+*/
+void CPrivacyProtocol::CancelTransmitLocation(const TLbsNetSessionId& /*aSessionId*/, TInt /*aReason*/)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::RespondPrivacyRequest()\n");
+	}
+
+
+/** 
+Default constructor.
+
+@param aObserver Reference to this protocol module's observer.
+*/
+CPrivacyProtocol::CPrivacyProtocol(MLbsNetworkProtocolObserver& aObserver) : 
+	iObserver(aObserver)
+	{
+	LBSLOG(ELogP2, "CPrivacyProtocol::CPrivacyProtocol Begin");
+	
+	// Seed the intial requestId from the current time.
+	TTime now;
+    now.UniversalTime();
+    const TInt KPosRequestIdShift = 14;
+    TInt64 requestId64 = now.Int64() >> KPosRequestIdShift;
+    TUint low = I64LOW(requestId64);
+    TInt requestId = ~(~low | 0x80000000);
+    iNextSessionId = TLbsNetSessionId(TUid::Uid(KPluginUidValue),
+    								  requestId);
+    
+    LBSLOG(ELogP2, "CPrivacyProtocol::CPrivacyProtocol End");
+	}
+
+
+/** 
+Second stage private constructor.
+*/  
+void CPrivacyProtocol::ConstructL()
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::ConstructL() Begin\n");
+	iRequestBuffer = CPrivacyRequestBuffer::NewL();
+
+	iServer = CPrivacyServer::NewL(*this);
+	
+	CLbsAdmin* admin = CLbsAdmin::NewL();
+	CleanupStack::PushL(admin);
+	
+	
+	// Read admin setting for maximum number of external locate requests
+	TUint maxExternalLocateRequests = KLbsDefaultMaximumExternalLocateRequests;
+	TInt err = admin->Get(KLbsSettingMaximumExternalLocateRequests, maxExternalLocateRequests);
+	if (err != KErrNone)
+		{
+		LBSLOG_ERR2(ELogP4, "Failed to get KLbsSettingMaximumExternalLocateRequests (err %d)", err);
+		}
+	iMaxSimultaneousActiveRequests = maxExternalLocateRequests;	
+	LBSLOG2(ELogP1, "Using KLbsSettingMaximumExternalLocateRequests = %d", iMaxSimultaneousActiveRequests);
+
+	
+	// Read admin setting for shutdown delay
+	TUint shutdownDelay = KLbsDefaultPrivacyShutdownDelay;
+	err = admin->Get(KLbsSettingPrivacyShutdownDelay, shutdownDelay);
+	if (err != KErrNone)
+		{
+		LBSLOG_ERR2(ELogP4, "Failed to get KLbsSettingPrivacyShutdownDelay (err %d)", err);
+		}
+	LBSLOG2(ELogP1, "Using KLbsSettingPrivacyShutdownDelay = %d", shutdownDelay);
+	iServer->SetShutdownDelay(shutdownDelay);
+	
+	
+	// Read admin setting for maximum number of network sessions
+	TUint maxNetworkSessions = KLbsDefaultPrivacyMaxNetworkSessions;
+	err = admin->Get(KLbsSettingPrivacyMaxNetworkSessions, maxNetworkSessions);
+	if (err != KErrNone)
+		{
+		LBSLOG_ERR2(ELogP4, "Failed to get KLbsSettingPrivacyMaxNetworkSessions (err %d)", err);
+		}
+	LBSLOG2(ELogP1, "Using KLbsSettingPrivacyMaxNetworkSessions = %d", maxNetworkSessions);
+	iServer->SetMaxNetworkSessions(maxNetworkSessions);
+	
+	
+	CleanupStack::PopAndDestroy(admin);
+	LBSLOG(ELogP1, "CPrivacyProtocol::ConstructL() End\n");
+	}
+
+
+/** 
+Submit a privacy request for processing.
+
+Adds the request to the buffer, and starts processing it if possible.
+
+Note: There may be a limit on the number of requests allowed to be active simultaneously, if this
+limit is reached then the request will be buffered for processing later.
+
+@param aRequest The request info to process.
+*/	
+void CPrivacyProtocol::ProcessRequest(CPrivacyRequestInfo* aRequest)
+	{
+	LBSLOG(ELogP1, "CPrivacyProtocol::ProcessRequest() Begin\n");
+
+	if (iRequestBuffer->NumRequests() >= iMaxSimultaneousActiveRequests)
+		{
+		// Maximum number of requests has been reached
+		LBSLOG_WARN(ELogP1, "CPrivacyProtocol::ProcessRequest() Request limit reached\n");
+		if (aRequest->IsResponseRequired())
+			{
+			aRequest->CompleteRequest(KErrServerBusy);
+			}
+		delete aRequest;
+		return;
+		}
+
+	// Add the request to the buffer
+	TRAPD(err, iRequestBuffer->AddRequestL(aRequest));
+	if (err != KErrNone)
+		{
+		// A problem occured and the request could not be added to the buffer
+		LBSLOG_WARN2(ELogP1, "CPrivacyProtocol::ProcessRequest() Error buffering request (%d)\n", err);
+		if (aRequest->IsResponseRequired())
+			{
+			aRequest->CompleteRequest(err);
+			}
+		delete aRequest;
+		return;
+		}
+
+	// Send the request to the network gateway
+	LBSLOG(ELogP1, "CPrivacyProtocol::ProcessRequest() Sending request\n");
+
+	TLbsNetSessionId sessionId(TUid::Uid(KPluginUidValue),aRequest->GetRequestId());
+	
+	TLbsNetPosRequestPrivacy requestPrivacy;
+	aRequest->GetRequestPrivacy(requestPrivacy);
+			
+	TLbsExternalRequestInfo2 requestInfo;
+	aRequest->GetRequestInfo(requestInfo);
+	
+#ifdef ENABLE_LBS_DEV_LOGGER
+    LBSLOG(ELogP7, "->A MLbsNetworkProtocolObserver::ProcessPrivacyRequest(sessionId, EFalse, requestPrivacy, requestInfo) LbsPrivacyProtocolModule\n");
+    LBSLOG2(ELogP7, "\t < TLbsPrivacyRequestId sessionId = %d\n", aRequest->GetRequestId());
+    LBSLOG(ELogP7, "\t < TLbsNetPosRequestPrivacy requestPrivacy = \n");
+    LBSLOG2(ELogP7, "\t\t < TLbsRequestAdvice iAdvice = %d\n", requestPrivacy.RequestAdvice());
+    LBSLOG2(ELogP7, "\t\t < TLbsRequestAction iAction = %d\n", requestPrivacy.RequestAction());
+    LBSLOG(ELogP7, "\t < TLbsExternalRequestInfo2 requestInfo = \n");
+
+    TBuf16<KLbsMaxRequesterIdSize2 - KLbsMaxRequesterIdSize/2> requesterId; // Same length as TLbsExternalRequestInfo2::iRequesterIdExt
+    requestInfo.GetRequesterId(requesterId);
+    LBSLOG2(ELogP7, "\t\t < TLbsRequesterId iRequesterId = %S\n", &requesterId);
+       
+    TBuf16<KLbsMaxClientNameSize2 - KLbsMaxClientNameSize/2> clientName; // / Same length as TLbsExternalRequestInfo2::iClientNameExt
+    requestInfo.GetClientName(clientName);
+    LBSLOG2(ELogP7, "\t\t < TLbsClientName iClientName = %S\n", &clientName);
+
+    TBuf8<KLbsMaxClientExternalIdSize> clientExternalId;
+    requestInfo.GetClientExternalId(clientExternalId);
+    LBSLOG2(ELogP7, "\t\t < TLbsClientExternalId iClientExternalId = %S\n", &clientExternalId);
+    
+    LBSLOG2(ELogP7, "\t\t < TRequestType iRequestType = %d\n", requestInfo.RequestType());
+    LBSLOG2(ELogP7, "\t\t < TRequestSource iRequestSource = %d\n", requestInfo.RequestSource());
+    LBSLOG2(ELogP7, "\t\t < TNetworkType iNetworkType = %d\n", requestInfo.NetworkType());
+    LBSLOG2(ELogP7, "\t\t < TFormatIndicator iRequesterFormat = %d\n", requestInfo.RequesterIdFormat());
+    LBSLOG2(ELogP7, "\t\t < TFormatIndicator iClientFormat = %d\n", requestInfo.ClientNameFormat());
+//  LBSLOG2(ELogP7, "\t\t < TCodingScheme iRequesterCoding = %d\n", requestInfo.RequesterIdCodingScheme());
+//  LBSLOG2(ELogP7, "\t\t < TCodingScheme iClientCoding = %d\n", requestInfo.ClientNameCodingScheme());
+#endif
+
+    iObserver.ProcessPrivacyRequest(sessionId, EFalse, requestPrivacy, requestInfo);
+    
+    LBSLOG(ELogP1, "CPrivacyProtocol::ProcessRequest() End\n");
+	}
+
+/** 
+Defines the plug-in interface implementation UIDs, required by ECOM.
+*/
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY(KPluginUidValue, CPrivacyProtocol::NewL)
+    };
+
+
+/** 
+Exported function for ECOM to retrieve implementations table.
+*/
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+
+    return ImplementationTable;
+    }
+
+
+