diff -r 000000000000 -r 9cfd9a3ee49c networkprotocolmodules/privacyprotocolmodule/PrivacyProtocolModule/src/privacyrequestinfo.cpp --- /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 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 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"); + } + +