networkprotocolmodules/privacyprotocolmodule/PrivacyProtocolModule/src/privacyrequestinfo.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/privacyprotocolmodule/PrivacyProtocolModule/src/privacyrequestinfo.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,585 @@
+// 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:
+//
+
+#include "lbsdevloggermacros.h"
+#include "privacyrequestinfo.h"
+
+
+//---------------------------------------------------------------------------
+// CRequestInfoBase:
+//---------------------------------------------------------------------------
+
+
+/** 
+Get the request ID.
+
+@return The request ID associated with this request.
+*/  
+TInt CRequestInfoBase::GetRequestId() const
+	{
+	LBSLOG(ELogP1, "CRequestInfoBase::GetRequestId()\n");
+	return iRequestId;
+	}
+
+
+/** 
+Set the request ID.
+
+@param aRequestId The request ID to be associated with this request.
+*/  
+void CRequestInfoBase::SetRequestId(TInt aRequestId)
+	{
+	LBSLOG(ELogP1, "CRequestInfoBase::SetRequestId()\n");
+	iRequestId = aRequestId;
+	}
+
+
+/** 
+Get the request type.
+
+@return The type of request.
+*/  
+CRequestInfoBase::TPrivacyRequestType CRequestInfoBase::Type() const
+	{
+	LBSLOG(ELogP1, "CRequestInfoBase::Type()\n");
+	return iRequestType;
+	}
+
+
+/** 
+Constructor.
+
+@param aRequestType The type of request.
+*/  
+CRequestInfoBase::CRequestInfoBase(CRequestInfoBase::TPrivacyRequestType aRequestType) :
+	iRequestType(aRequestType)
+	{
+	LBSLOG(ELogP1, "CRequestInfoBase::CRequestInfoBase()\n");
+	}
+
+
+//---------------------------------------------------------------------------
+// CPrivacyRequestInfo:
+//---------------------------------------------------------------------------
+
+
+/** 
+Static public constructor.
+
+@return A new instance of this class.
+*/  
+CPrivacyRequestInfo* CPrivacyRequestInfo::NewL(const RMessage2& aMessage)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::NewL() Begin\n");
+	CPrivacyRequestInfo* self = new (ELeave) CPrivacyRequestInfo(aMessage);
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::NewL() End\n");
+	return self;
+	}
+
+
+/** 
+Destructor.
+*/  
+CPrivacyRequestInfo::~CPrivacyRequestInfo()
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::~CPrivacyRequestInfo()\n");
+	}
+		
+
+/** 
+Complete this request.
+
+@param aStatus Status to complete with.
+*/  
+void CPrivacyRequestInfo::CompleteRequest(TInt aStatus)
+	{
+    LBSLOG(ELogP7, "->A CPrivacyRequestInfo::CompleteRequest(aStatus)\n");
+    LBSLOG2(ELogP7, "\t > TInt aStatus = %d\n", aStatus);
+	iResponseMessage.Complete(aStatus);
+	}
+		
+
+/** 
+Get the TLbsExternalRequestInfo2 associated with this request.
+
+@param aRequestInfo Reference to the TLbsExternalRequestInfo2 to populate.
+*/  
+void CPrivacyRequestInfo::GetRequestInfo(TLbsExternalRequestInfo2& aRequestInfo) const
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::GetRequestInfo() Begin\n");
+	aRequestInfo = iRequestInfo;
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::GetRequestInfo() End\n");
+	}
+
+
+/** 
+Set the TLbsExternalRequestInfo2 associated with this request.
+
+@param aRequestInfo Reference to the TLbsExternalRequestInfo2 to set.
+*/  
+void CPrivacyRequestInfo::SetRequestInfo(const TLbsExternalRequestInfo2& aRequestInfo)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::SetRequestInfo() Begin\n");
+	iRequestInfo = aRequestInfo;
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::SetRequestInfo() End\n");
+	}
+
+
+/** 
+Set the TLbsNetPosRequestPrivacy associated with this request.
+
+@param aRequestPrivacy Reference to the TLbsNetPosRequestPrivacy to populate.
+*/  
+void CPrivacyRequestInfo::GetRequestPrivacy(TLbsNetPosRequestPrivacy& aRequestPrivacy) const
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::GetRequestPrivacy() Begin\n");
+	aRequestPrivacy = iRequestPrivacy;
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::GetRequestPrivacy() End\n");
+	}
+
+
+/** 
+Set the TLbsNetPosRequestPrivacy associated with this request.
+
+@param aRequestPrivacy Reference to the TLbsNetPosRequestPrivacy to set.
+*/  
+void CPrivacyRequestInfo::SetRequestPrivacy(const TLbsNetPosRequestPrivacy& aRequestPrivacy)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::SetRequestPrivacy() Begin\n");
+	iRequestPrivacy = aRequestPrivacy;
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::SetRequestPrivacy() End\n");
+	}
+
+
+/** 
+Determine if this request requires a response.
+
+@return ETrue if a response if required, EFalse otherwise.
+*/  
+TBool CPrivacyRequestInfo::IsResponseRequired() const
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::IsResponseRequired()\n");
+	return iResponseRequired;
+	}
+
+
+/** 
+Set if this request requires a response.
+
+@param aResponseRequired ETrue if a response is required, EFalse otherwise.
+*/  
+void CPrivacyRequestInfo::SetIsResponseRequired(TBool aResponseRequired)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::SetIsResponseRequired()\n");
+	iResponseRequired = aResponseRequired;
+	}
+
+/** 
+Determine if the session should be completed by the Privacy Protocol Module, or by the client
+
+@return ETrue If the Privacy Protocol Module should complete the session, EFalse otherwise
+*/
+TBool CPrivacyRequestInfo::IsSessionCompleteAutomatic() const
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::IsSessionCompleteAutomatic()\n");
+	return iSessionCompleteAutomatic;	
+	}
+
+/** 
+Set if the session should be completed by the Privacy Protocol Module, or by the client
+
+@param aAutomatic If it's set to ETrue then the  Privacy Protocol Module should complete 
+					the session, otherwise the client will
+*/
+void CPrivacyRequestInfo::SetIsSessionCompleteAutomatic(TBool aAutomatic)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::SetIsSessionCompleteAutomatic()\n");
+	iSessionCompleteAutomatic = aAutomatic;	
+	}
+
+/** 
+Determine if the response from LBS should be converted to an error code 
+before sending to client or not.
+
+@return ETrue If the Privacy Protocol Module should convert the response, EFalse otherwise
+*/
+TBool CPrivacyRequestInfo::ConvertResponseCode() const
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::ConvertResponseCode()\n");
+	return iConvertResponseCode;	
+	}
+
+/** 
+Set if the response from LBS should be converted to an error code by the 
+Privacy Protocol Module, or not.
+
+@param aConvert If it's set to ETrue then the Privacy Protocol Module will convert 
+					the return code, otherwise it won't
+*/
+void CPrivacyRequestInfo::SetConvertResponseCode(TBool aConvert)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::SetConvertResponseCode()\n");
+	iConvertResponseCode = aConvert;	
+	}
+
+/**
+Get the session associated with this request.
+
+@return A pointer to the session.
+*/
+const CSession2* CPrivacyRequestInfo::Session() const
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::Session()\n");
+	if (iResponseMessage.IsNull())
+		{
+		return NULL;
+		}
+	else
+		{
+		return iResponseMessage.Session();
+		}
+	}
+
+/** 
+Constructor
+
+@param aMessage The message associated with this response. This may be completed later if a response is required.
+*/  
+CPrivacyRequestInfo::CPrivacyRequestInfo(const RMessage2& aMessage) :
+	CRequestInfoBase(CRequestInfoBase::EPrivacyRequestTypeRequest),
+	iResponseMessage(aMessage), iSessionCompleteAutomatic(ETrue), 
+	iConvertResponseCode(ETrue)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestInfo::CPrivacyRequestInfo()\n");
+	}
+
+
+//---------------------------------------------------------------------------
+// CCancelPrivacyRequestInfo:
+//---------------------------------------------------------------------------
+
+
+/** 
+Static public constructor.
+
+@return A new instance of this class.
+*/  
+CCancelPrivacyRequestInfo* CCancelPrivacyRequestInfo::NewL()
+	{
+	LBSLOG(ELogP1, "CCancelPrivacyRequestInfo::NewL() Begin\n");
+	CCancelPrivacyRequestInfo* self = new (ELeave) CCancelPrivacyRequestInfo();
+	LBSLOG(ELogP1, "CCancelPrivacyRequestInfo::NewL() End\n");
+	return self;
+	}
+
+
+/** 
+Destructor.
+*/  
+CCancelPrivacyRequestInfo::~CCancelPrivacyRequestInfo()
+	{
+	LBSLOG(ELogP1, "CCancelPrivacyRequestInfo::~CCancelPrivacyRequestInfo()\n");
+	}
+
+
+/** 
+Get the reason why the request was cancelled.
+
+@return A TInt indicating why the request was cancelled.
+*/  
+TInt CCancelPrivacyRequestInfo::CancelReason() const
+	{
+	LBSLOG(ELogP1, "CCancelPrivacyRequestInfo::CancelReason()\n");
+	return iCancelReason;
+	}
+
+
+/** 
+Sets the reason why the request was cancelled.
+
+@param aCancelReason A TInt indicating why the request was cancelled.
+*/  
+void CCancelPrivacyRequestInfo::SetCancelReason(TInt aCancelReason)
+	{
+	LBSLOG(ELogP1, "CCancelPrivacyRequestInfo::SetCancelReason()\n");
+	iCancelReason = aCancelReason;
+	}
+
+
+/** 
+Constructor.
+*/  
+CCancelPrivacyRequestInfo::CCancelPrivacyRequestInfo() :
+	CRequestInfoBase(CRequestInfoBase::EPrivacyRequestTypeCancel)
+	{
+	LBSLOG(ELogP1, "CCancelPrivacyRequestInfo::CCancelPrivacyRequestInfo()\n");
+	}
+
+
+//---------------------------------------------------------------------------
+// CPrivacyRequestBuffer:
+//---------------------------------------------------------------------------
+
+
+/** 
+Static public constructor.
+*/  
+CPrivacyRequestBuffer* CPrivacyRequestBuffer::NewL()
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::NewL() Begin\n");
+	CPrivacyRequestBuffer* self = new (ELeave) CPrivacyRequestBuffer();
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::NewL() End\n");
+	return self;
+	}
+
+
+/** 
+Destructor.
+*/  
+
+CPrivacyRequestBuffer::~CPrivacyRequestBuffer()
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::~CPrivacyRequestBuffer() Begin\n");
+	iBuffer.ResetAndDestroy();
+	iBuffer.Close();
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::~CPrivacyRequestBuffer() End\n");
+	}
+
+
+/** 
+Adds a request to the buffer.
+
+This class takes ownership of the request, and adds it to the end of its queue.
+
+@param aRequestInfo The request to be added.
+*/  
+void CPrivacyRequestBuffer::AddRequestL(CPrivacyRequestInfo* aRequestInfo)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::AddRequestL() Begin\n");
+	iBuffer.AppendL(aRequestInfo);
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::AddRequestL() End\n");
+	}
+
+/** 
+Callback function for use with RPointerArray<CPrivacyRequestInfo> to find a request by ID.
+
+@param aRequestId Pointer to the request ID to find.
+@param requestInfo Reference to a CPrivacyRequestInfo to check against.
+
+@return ETrue if requestInfo has the required ID specified by aRequestId.
+*/  
+TBool FindRequestById(const TInt* aRequestId, const CPrivacyRequestInfo& requestInfo)
+	{
+	return (requestInfo.GetRequestId() == *aRequestId);
+	}
+
+/** 
+Find a request matching the specified ID in the buffer.
+
+@return The found request, or NULL if no suitable request can be found.
+*/  
+CPrivacyRequestInfo* CPrivacyRequestBuffer::FindRequest(TInt aRequestId)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::FindRequest() Begin\n");
+	TInt pos = iBuffer.Find(aRequestId,FindRequestById);
+	
+	if (pos >= 0)
+		{
+		CPrivacyRequestInfo* requestInfo = iBuffer[pos];
+		LBSLOG(ELogP1, "CPrivacyRequestBuffer::FindRequest() End (FOUND REQUEST)\n");
+		return requestInfo;
+		}
+	
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::FindRequest() End (NOT FOUND)\n");
+	return NULL;
+	}
+
+/** 
+Callback function for use with RPointerArray<CPrivacyRequestInfo> to find a request by Session.
+
+@param aSession Pointer to the session to find.
+@param requestInfo Reference to a CPrivacyRequestInfo to check against.
+
+@return ETrue if requestInfo has the required session specified by aSession.
+*/  
+TBool FindRequestBySession(const CSession2* aSession, const CPrivacyRequestInfo& requestInfo)
+	{
+	return (requestInfo.Session() == aSession);
+	}
+
+/** 
+Find a request matching the specified ID in the buffer.
+
+@return The found request, or NULL if no suitable request can be found.
+*/  
+CPrivacyRequestInfo* CPrivacyRequestBuffer::FindRequest(const CSession2* aSession)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::FindRequest() Begin\n");
+	TInt pos = iBuffer.Find(*aSession,FindRequestBySession);
+	
+	if (pos >= 0)
+		{
+		CPrivacyRequestInfo* requestInfo = iBuffer[pos];
+		LBSLOG(ELogP1, "CPrivacyRequestBuffer::FindRequest() End (FOUND REQUEST)\n");
+		return requestInfo;
+		}
+	
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::FindRequest() End (NOT FOUND)\n");
+	return NULL;
+	}
+
+/** 
+Remove a request from the buffer.
+
+This class relinquishes ownership of the request.
+
+@param aRequestInfo Pointer to the request to remove.
+
+@return The request from the buffer, if found, otherwise NULL.
+*/  
+CPrivacyRequestInfo* CPrivacyRequestBuffer::RemoveRequest(CPrivacyRequestInfo* aRequestInfo)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::RemoveRequest() Begin\n");
+	
+	TInt pos = iBuffer.Find(aRequestInfo);
+	if (pos >= 0)
+		{
+		CPrivacyRequestInfo* requestInfo = iBuffer[pos];
+		iBuffer.Remove(pos);
+		LBSLOG(ELogP1, "CPrivacyRequestBuffer::RemoveRequest() End (RETURNING REQUEST)\n");
+		return requestInfo;
+		}
+	
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::RemoveRequest() End (NOT FOUND)\n");
+	return NULL;
+	}
+
+/** 
+Gets the number of requests present in the buffer.
+
+@return The number of requests.
+*/  
+TInt CPrivacyRequestBuffer::NumRequests() const
+	{
+	return iBuffer.Count();
+	}
+
+/**
+Search through the buffer for requests with a matching Id and cancel them.
+
+The cancel action depends on what type of request it is:
+Verify: Convert it into a notify request but leave it in the buffer. Complete
+        the client request with the given cancel reason.
+Notify: Remove it from the buffer.
+
+The cancel request should not be added to the buffer.
+
+@param aRequestId ID of the cancel request to match.
+@param aReason Reason code for the cancel.
+*/
+void CPrivacyRequestBuffer::CancelAnyOutstandingRequestById(TInt aRequestId, TInt aReason)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::CancelAnyOutstandingRequestById() Begin\n");
+
+	for (TInt pos = 0; pos < iBuffer.Count(); pos++)
+		{
+		CPrivacyRequestInfo* requestInfo = iBuffer[pos]; 
+		if (requestInfo->GetRequestId() == aRequestId)
+			{
+			TLbsNetPosRequestPrivacy privacy;
+			requestInfo->GetRequestPrivacy(privacy);
+			
+			switch (privacy.RequestAdvice())
+				{
+				case TLbsNetPosRequestPrivacy::ERequestAdviceVerify:
+					{
+					// Change the privacy advice to 'Notify'
+					privacy.SetRequestAdvice(TLbsNetPosRequestPrivacy::ERequestAdviceNotify);
+					privacy.SetRequestAction(TLbsNetPosRequestPrivacy::ERequestActionAllow); 
+					requestInfo->SetRequestPrivacy(privacy);
+				                         
+					// Complete the outstanding client request
+					__ASSERT_DEBUG(requestInfo->IsResponseRequired(), User::Invariant());
+					requestInfo->CompleteRequest(aReason);
+					requestInfo->SetIsResponseRequired(EFalse);
+					break;
+					}
+				case TLbsNetPosRequestPrivacy::ERequestAdviceNotify:
+					{
+					// Remove this request from the buffer
+					iBuffer.Remove(pos);
+					delete requestInfo;
+					
+					// Need to decrement pos because we've just removed an entry from the buffer
+					pos--;
+					break;
+					}
+				default:
+					{
+					break;
+					}
+				}
+			}
+		}
+	
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::CancelAnyOutstandingRequestById() End\n");
+	}
+
+/**
+Cancels any outstanding asynchronous requests from a client session.
+
+This function should only be used when a client session has disconnected,
+in order to clean up any outstanding asynchronous requests.
+
+@param aSession Session to clean up requests for.
+*/
+void CPrivacyRequestBuffer::CancelAnyOutstandingRequestBySession(const CSession2* aSession)
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::CancelAnyOutstandingRequestBySession() Begin\n");
+
+	for (TInt pos = 0; pos < iBuffer.Count(); pos++)
+		{
+		CPrivacyRequestInfo* requestInfo = iBuffer[pos];
+		if (requestInfo->IsResponseRequired()
+			&& requestInfo->Session() == aSession)
+			{
+			// Outstanding asynchronous request for this client.
+			// It should always be a privacy verify request.
+			
+			// Change the verify into a notify.
+			TLbsNetPosRequestPrivacy privacy;
+			requestInfo->GetRequestPrivacy(privacy);
+			privacy.SetRequestAdvice(TLbsNetPosRequestPrivacy::ERequestAdviceNotify);
+			privacy.SetRequestAction(TLbsNetPosRequestPrivacy::ERequestActionAllow); 
+			requestInfo->SetRequestPrivacy(privacy);
+			
+			// Clean up the outstanding client request
+			requestInfo->CompleteRequest(KErrCancel);
+			requestInfo->SetIsResponseRequired(EFalse);
+			}
+		}
+	
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::CancelAnyOutstandingRequestBySession() End\n");
+	}
+
+/** 
+Constructor.
+*/  
+CPrivacyRequestBuffer::CPrivacyRequestBuffer()
+	{
+	LBSLOG(ELogP1, "CPrivacyRequestBuffer::CPrivacyRequestBuffer()\n");
+	}
+
+