--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/privacyprotocolmodule/PrivacyProtocolModule/src/privacysession.cpp Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,462 @@
+// 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:
+// privacyserver.cpp
+//
+//
+
+#include "lbsdevloggermacros.h"
+#include "privacysession.h"
+#include "privacyrequestinfo.h"
+#include "privacyprotocol.h"
+#include "EPos_PrivacyServerPanic.h"
+#include <lbs/lbsprivacyrequestcommon.h>
+
+
+/**
+Constructor.
+
+@param aProtocol Interface to send privacy requests to.
+*/
+CPrivacySession::CPrivacySession(MPrivacyProtocol& aProtocol,
+ TLbsProxyApiType aApiType) :
+ iProtocol(aProtocol),
+ iApiType(aApiType)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::CPrivacySession()\n");
+ }
+
+
+/**
+Destructor.
+*/
+CPrivacySession::~CPrivacySession()
+ {
+ LBSLOG(ELogP1, "CPrivacySession::~CPrivacySession()\n");
+ }
+
+
+/**
+Called when the session is created.
+*/
+void CPrivacySession::CreateL()
+ {
+ LBSLOG(ELogP1, "CPrivacySession::CreateL() Begin\n");
+ Server().IncSessionCount(iApiType);
+ LBSLOG(ELogP1, "CPrivacySession::CreateL() End\n");
+ }
+
+
+/**
+Called when a message is received for this session.
+
+@param aMessage The message from the client.
+*/
+void CPrivacySession::ServiceL(const RMessage2& aMessage)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::ServiceL() Begin\n");
+ switch (aMessage.Function())
+ {
+ case ELbsPrivacyServerNotifyLocation:
+ NotifyLocationRequest(aMessage);
+ break;
+
+ case ELbsPrivacyServerVerifyLocation:
+ VerifyLocationRequest(aMessage);
+ break;
+
+ case ELbsPrivacyServerNotifyVerificationTimeout:
+ NotifyVerificationTimeout(aMessage);
+ break;
+
+ case ELbsPrivacyServerCancelVerifyLocationRequest:
+ CancelVerifyLocationRequest(aMessage);
+ break;
+
+ case ELbsPrivacyServerNewPrivacyRequestLocal:
+ case ELbsPrivacyServerNewPrivacyRequestNetwork:
+ NewPrivacyRequest(aMessage);
+ break;
+
+ case ELbsPrivacyServerRepeatPrivacyRequestLocal:
+ case ELbsPrivacyServerRepeatPrivacyRequestNetwork:
+ RepeatPrivacyRequest(aMessage);
+ break;
+
+ case ELbsPrivacyServerCompleteRequest:
+ CompleteRequest(aMessage);
+ break;
+
+ default:
+ User::Leave(KErrNotSupported);
+ }
+ LBSLOG(ELogP1, "CPrivacySession::ServiceL() End\n");
+ }
+
+
+/**
+Called when the session disconnects.
+
+@param aMessage The message from the client.
+*/
+void CPrivacySession::Disconnect(const RMessage2& aMessage)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::Disconnect() Begin\n");
+ iProtocol.SessionDisconnected(this);
+ Server().DecSessionCount(iApiType);
+ CSession2::Disconnect(aMessage);
+ LBSLOG(ELogP1, "CPrivacySession::Disconnect() End\n");
+ }
+
+
+/**
+Get a reference to the server for this session.
+
+@return A reference to the CPrivacyServer.
+*/
+CPrivacyServer& CPrivacySession::Server()
+ {
+ return *static_cast<CPrivacyServer*>(const_cast<CServer2*>(CSession2::Server()));
+ }
+
+
+/**
+Cancel a verification request.
+
+@param aMessage The message from the client.
+*/
+void CPrivacySession::CancelVerifyLocationRequest(const RMessage2& aMessage)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::CancelVerifyLocationRequest() Begin\n");
+
+ CCancelPrivacyRequestInfo* cancelInfo = NULL;
+ TRAPD(err, cancelInfo = CCancelPrivacyRequestInfo::NewL());
+ if (err != KErrNone)
+ {
+ // Error creating request info object, complete with the error and return
+ aMessage.Complete(err);
+ return;
+ }
+
+ cancelInfo->SetRequestId(aMessage.Int0());
+ cancelInfo->SetCancelReason(aMessage.Int1());
+
+ if (!IsRequestInfoValid(*cancelInfo))
+ {
+ aMessage.Panic(KPosPrivacyPanicCategory,
+ EPosPrivSrvPanicRequestOverflow);
+ delete cancelInfo;
+ return;
+ }
+
+ aMessage.Complete(KErrNone);
+ iProtocol.CancelVerifyLocationRequest(cancelInfo);
+
+ LBSLOG(ELogP1, "CPrivacySession::CancelVerifyLocationRequest() End\n");
+ }
+
+
+/**
+Submit a notification request.
+
+@param aMessage The message from the client.
+*/
+void CPrivacySession::NotifyLocationRequest(const RMessage2& aMessage)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::NotifyLocationRequest() Begin\n");
+
+ TLbsNetSessionId sessionId;
+ iProtocol.GetNextSessionId(sessionId);
+
+ TPckg<TInt> pkgReqId(sessionId.SessionNum());
+ TInt error = aMessage.Write(1,pkgReqId);
+ if(error != KErrNone)
+ {
+ aMessage.Complete(error);
+ return;
+ }
+
+ // NOTE: requestInfo does not complete the message in this case
+ CPrivacyRequestInfo* requestInfo = NULL;
+ TRAPD(err, requestInfo = CPrivacyRequestInfo::NewL(aMessage));
+ if (err != KErrNone)
+ {
+ // Error creating request info object, complete with the error and return
+ aMessage.Complete(err);
+ return;
+ }
+
+ TLbsExternalRequestInfo2 extRequestInfo;
+ TPckg<TLbsExternalRequestInfo2> extRequestInfoPkg(extRequestInfo);
+ aMessage.Read(0,extRequestInfoPkg);
+ requestInfo->SetRequestInfo(extRequestInfo);
+
+ requestInfo->SetRequestId(sessionId.SessionNum());
+
+ TLbsNetPosRequestPrivacy netPosRequestPrivacy;
+ TPckg<TLbsNetPosRequestPrivacy> netPosRequestPrivacyPkg(netPosRequestPrivacy);
+ aMessage.Read(2,netPosRequestPrivacyPkg);
+ requestInfo->SetRequestPrivacy(netPosRequestPrivacy);
+
+ requestInfo->SetIsResponseRequired(EFalse);
+
+ if (!IsRequestInfoValid(*requestInfo))
+ {
+ aMessage.Panic(KPosPrivacyPanicCategory,
+ EPosPrivSrvPanicInvalidArguments);
+ delete requestInfo;
+ return;
+ }
+
+ iProtocol.NotifyLocationRequest(requestInfo);
+ aMessage.Complete(KErrNone);
+
+ LBSLOG(ELogP1, "CPrivacySession::NotifyLocationRequest() End\n");
+ }
+
+
+/**
+Submit a notification timeout request.
+
+@param aMessage The message from the client.
+*/
+void CPrivacySession::NotifyVerificationTimeout(const RMessage2& aMessage)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::NotifyVerificationTimeout() Begin\n");
+
+ // NOTE: requestInfo does not complete the message in this case
+ CPrivacyRequestInfo* requestInfo = NULL;
+ TRAPD(err, requestInfo = CPrivacyRequestInfo::NewL(aMessage));
+ if (err != KErrNone)
+ {
+ // Error creating request info object, complete with the error and return
+ aMessage.Complete(err);
+ return;
+ }
+
+ TLbsExternalRequestInfo2 extRequestInfo;
+ TPckg<TLbsExternalRequestInfo2> extRequestInfoPkg(extRequestInfo);
+ aMessage.Read(0,extRequestInfoPkg);
+ requestInfo->SetRequestInfo(extRequestInfo);
+
+ requestInfo->SetRequestId(aMessage.Int1());
+
+ TLbsNetPosRequestPrivacy netPosRequestPrivacy;
+ TPckg<TLbsNetPosRequestPrivacy> netPosRequestPrivacyPkg(netPosRequestPrivacy);
+ aMessage.Read(2,netPosRequestPrivacyPkg);
+ requestInfo->SetRequestPrivacy(netPosRequestPrivacy);
+
+ requestInfo->SetIsResponseRequired(EFalse);
+
+ if (!IsRequestInfoValid(*requestInfo))
+ {
+ aMessage.Panic(KPosPrivacyPanicCategory,
+ EPosPrivSrvPanicInvalidArguments);
+ delete requestInfo;
+ return;
+ }
+
+ iProtocol.NotifyVerificationTimeout(requestInfo);
+ aMessage.Complete(KErrNone);
+
+ LBSLOG(ELogP1, "CPrivacySession::NotifyVerificationTimeout() End\n");
+ }
+
+
+/**
+Submit a verify location request.
+
+@param aMessage The message from the client.
+*/
+void CPrivacySession::VerifyLocationRequest(const RMessage2& aMessage)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::VerifyLocationRequest() Begin\n");
+
+ TLbsNetSessionId sessionId;
+ iProtocol.GetNextSessionId(sessionId);
+
+ TPckg<TInt> pkgReqId(sessionId.SessionNum());
+ TInt error = aMessage.Write(0,pkgReqId);
+ if(error != KErrNone)
+ {
+ aMessage.Complete(error);
+ return;
+ }
+
+ RSemaphore semaphore;
+ error = semaphore.Open(aMessage, 3, EOwnerThread);
+ if(error != KErrNone)
+ {
+ aMessage.Complete(error);
+ return;
+ }
+ semaphore.Signal();
+ semaphore.Close();
+
+ CPrivacyRequestInfo* requestInfo = NULL;
+ TRAPD(err, requestInfo = CPrivacyRequestInfo::NewL(aMessage));
+ if (err != KErrNone)
+ {
+ // Error creating request info object, complete with the error and return
+ aMessage.Complete(err);
+ return;
+ }
+
+ requestInfo->SetRequestId(sessionId.SessionNum());
+
+ TLbsExternalRequestInfo2 extRequestInfo;
+ TPckg<TLbsExternalRequestInfo2> extRequestInfoPkg(extRequestInfo);
+ aMessage.Read(1,extRequestInfoPkg);
+ requestInfo->SetRequestInfo(extRequestInfo);
+
+ TLbsNetPosRequestPrivacy netPosRequestPrivacy;
+ TPckg<TLbsNetPosRequestPrivacy> netPosRequestPrivacyPkg(netPosRequestPrivacy);
+ aMessage.Read(2,netPosRequestPrivacyPkg);
+ requestInfo->SetRequestPrivacy(netPosRequestPrivacy);
+
+ requestInfo->SetIsResponseRequired(ETrue);
+
+ if (!IsRequestInfoValid(*requestInfo))
+ {
+ aMessage.Panic(KPosPrivacyPanicCategory,
+ EPosPrivSrvPanicInvalidArguments);
+ delete requestInfo;
+ return;
+ }
+
+ iProtocol.VerifyLocationRequest(requestInfo);
+ // The message should be completed later in this case
+
+ LBSLOG(ELogP1, "CPrivacySession::VerifyLocationRequest() End\n");
+ }
+
+void CPrivacySession::NewPrivacyRequest(const RMessage2& aMessage)
+ {
+ TLbsNetSessionId sessionId;
+ iProtocol.GetNextSessionId(sessionId);
+
+ TPckg<TUint32> pkgReqId(sessionId.SessionNum());
+ TInt error = aMessage.Write(0,pkgReqId);
+ if(error != KErrNone)
+ {
+ aMessage.Complete(error);
+ return;
+ }
+
+ RSemaphore semaphore;
+ error = semaphore.Open(aMessage, 3, EOwnerThread);
+ if(error != KErrNone)
+ {
+ aMessage.Complete(error);
+ return;
+ }
+ semaphore.Signal();
+ semaphore.Close();
+
+ PrivacyRequest(aMessage, sessionId.SessionNum());
+ }
+
+void CPrivacySession::RepeatPrivacyRequest(const RMessage2& aMessage)
+ {
+ PrivacyRequest(aMessage, aMessage.Int0());
+ }
+
+void CPrivacySession::PrivacyRequest(const RMessage2& aMessage, TInt aRequestId)
+ {
+ CPrivacyRequestInfo* requestInfo = NULL;
+ TRAPD(err, requestInfo = CPrivacyRequestInfo::NewL(aMessage));
+ if (err != KErrNone)
+ {
+ // Error creating request info object, complete with the error and return
+ aMessage.Complete(err);
+ return;
+ }
+
+ requestInfo->SetRequestId(aRequestId);
+
+ TLbsExternalRequestInfo2 extRequestInfo;
+ TPckg<TLbsExternalRequestInfo2> extRequestInfoPkg(extRequestInfo);
+ aMessage.Read(1,extRequestInfoPkg);
+ requestInfo->SetRequestInfo(extRequestInfo);
+
+ TLbsNetPosRequestPrivacy netPosRequestPrivacy;
+ TPckg<TLbsNetPosRequestPrivacy> netPosRequestPrivacyPkg(netPosRequestPrivacy);
+ aMessage.Read(2,netPosRequestPrivacyPkg);
+
+ requestInfo->SetRequestPrivacy(netPosRequestPrivacy);
+
+ requestInfo->SetIsResponseRequired(ETrue);
+ requestInfo->SetIsSessionCompleteAutomatic(EFalse);
+ requestInfo->SetConvertResponseCode(EFalse);
+
+ if (!IsRequestInfoValid(*requestInfo))
+ {
+ aMessage.Complete(netPosRequestPrivacy.RequestAction());
+ delete requestInfo;
+ return;
+ }
+
+ iProtocol.PrivacyLocationRequest(requestInfo);
+ // The message should be completed later in this case
+
+ }
+
+void CPrivacySession::CompleteRequest(const RMessage2& aMessage)
+ {
+
+ TUint32 requestId(aMessage.Int0());
+ TInt reason(aMessage.Int1());
+
+ iProtocol.CompletePrivacyRequest(requestId, reason);
+
+ aMessage.Complete(KErrNone);
+ }
+
+/**
+Validates the data values for a privacy request.
+
+@param aRequestInfo The request data to validate
+*/
+TBool CPrivacySession::IsRequestInfoValid(const CRequestInfoBase& aRequestInfo)
+ {
+ LBSLOG(ELogP1, "CPrivacySession::IsRequestInfoValid() Begin\n");
+
+ TBool valid = (aRequestInfo.GetRequestId() >= 1);
+
+ switch (aRequestInfo.Type())
+ {
+ case CRequestInfoBase::EPrivacyRequestTypeRequest:
+ {
+ break;
+ }
+ case CRequestInfoBase::EPrivacyRequestTypeCancel:
+ {
+ const CCancelPrivacyRequestInfo& cancelInfo =
+ static_cast<const CCancelPrivacyRequestInfo&>(aRequestInfo);
+
+ valid &= (cancelInfo.CancelReason() == KErrCancel
+ || cancelInfo.CancelReason() == KErrTimedOut);
+ break;
+ }
+ default:
+ {
+ valid = EFalse;
+ break;
+ }
+ }
+
+ return valid;
+
+ LBSLOG(ELogP1, "CPrivacySession::IsRequestInfoValid() End\n");
+ }
+