--- /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");
+ }
+
+