networkprotocolmodules/privacyprotocolmodule/ClientAPI/Common/src/lbsprivacyclient.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/privacyprotocolmodule/ClientAPI/Common/src/lbsprivacyclient.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,307 @@
+// 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:
+// Class implementation of RPrivacyServer
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+// INCLUDE FILES
+#include <e32std.h>
+#include "lbsprivacyclient.h"
+#include "lbsprivacyservermsgenums.h"   
+#include "lbssystemcontroller.h"
+#include "lbsdevloggermacros.h"
+
+const TInt KPosNumberOfTrials = 16;
+
+// The name of the server
+_LIT(KPrivacyServerName,"LBSPrivacyServer");
+
+/*
+ * C++ default constructor 
+*/
+RPrivacyServer::RPrivacyServer()
+    : RSessionBase(),iRequestInfoPkg(iRequestInfo),
+      iNetPosRequestPrivacyPkg(iNetPosRequestPrivacy),
+	  iRequestIdPkg(iRequestId), 
+	  iRequestIdUint32Pkg(iRequestIdUint32)
+    {
+    }
+
+
+/*
+ * Destructor 
+*/
+RPrivacyServer::~RPrivacyServer()
+    {
+    }
+
+/** 
+ * Opens a connection with the server. This method must be called
+ * before any other operation.
+ * @return KErrNone if the operation was successful, otherwise
+ * one of the system-wide error codes.
+ */
+
+TInt RPrivacyServer::Connect(TLbsProxyApiType aApiType)
+    {
+    TInt err = KErrNone;
+        
+    // Attempt to start the server and create a session
+	for (TInt retry = 0; retry < KPosNumberOfTrials; retry++)
+		{
+		TVersion version;
+		if (aApiType == ELbsProxyApiTypeLocal)
+			{
+			version = TVersion(KLbsLocalPrivacyAPIVersionMajor,
+								KLbsLocalPrivacyAPIVersionMinor,
+								KLbsLocalPrivacyAPIVersionBuild);
+			}
+		else 
+			{
+			version = TVersion(KLbsNetworkPrivacyAPIVersionMajor,
+						   		KLbsNetworkPrivacyAPIVersionMinor,
+						   		KLbsNetworkPrivacyAPIVersionBuild);
+			}
+		
+		err = CreateSession(KPrivacyServerName, version);
+		if (err == KErrNone)
+			{
+			break; // We have a session
+			}
+		// Server already started
+		if (err == KErrAlreadyExists)
+			{
+			err = KErrNone; //Server already started 
+			break;
+			}	
+				 
+		// Can't create a session
+		if ((err == KErrNotFound) || (err == KErrServerTerminated))
+			{
+			// Start Lbs 
+			// We're not interested in the error code returned as we must retry KPosNumberOfTrials times anyway
+		    StartLbsSystem();
+			}	
+		}// for
+	return err;
+	}
+
+/**
+* Verifies that a requesting remote party is allowed to do a
+* request.
+* @param aRequestId An id for the request.
+* @param aRequestInfo the requestInfo that should be used for
+*  verification.
+* @param aRequestAction The timeout decision in case a network timeout
+* occurs.
+* @param aStatus is set to KErrNone if the request is allowed and
+* KErrAccessDenied if it is not.
+*/
+void RPrivacyServer::VerifyLocationRequest(TInt& aRequestId,TLbsExternalRequestInfo2& aRequestInfo,
+		                                            TLbsNetPosRequestPrivacy& aNetPosRequestPrivacy,
+		                                            TRequestStatus& aStatus)
+	{
+	iRequestInfo = aRequestInfo;
+	
+	iNetPosRequestPrivacy = aNetPosRequestPrivacy;
+    	
+	RSemaphore semaphore;
+
+	TInt err = semaphore.CreateGlobal(KNullDesC, 0, EOwnerThread);
+	if(err != KErrNone)
+		{
+		aStatus = KRequestPending;
+		TRequestStatus* status = &aStatus;
+		User::RequestComplete(status, err);
+		}
+ 
+	TIpcArgs args(&iRequestIdPkg,&iRequestInfoPkg,&iNetPosRequestPrivacyPkg, semaphore);
+
+	SendReceive(ELbsPrivacyServerVerifyLocation,args,aStatus);
+
+	semaphore.Wait();
+	semaphore.Close();
+	aRequestId = iRequestId;
+	}
+
+/**
+ * Cancels an outstanding verification request.
+ * @param aRequestId An Id for the request. 
+ * @param aCancelReason A cancel reason.
+ * @return KErrNone, if the send operation is successful; KErrServerTerminated, 
+ * if the server no longer present; KErrServerBusy, if there are no message slots available; 
+ * KErrNoMemory, if there is insufficient memory available.
+ */
+TInt RPrivacyServer::CancelVerifyLocationRequest(TInt aRequestId , TInt aCancelReason)
+	{
+	TIpcArgs args(aRequestId, aCancelReason);
+	return (SendReceive(ELbsPrivacyServerCancelVerifyLocationRequest, args));
+    }
+/**
+ * Notifies the user that a service or user has made a location request.
+ * This notification is used for requests that don't have been verified
+ * by the privacy server.
+ * @param aRequestInfo the requestInfo that should be used for notification.
+ * @param aRequestId An id for the request.
+ * @return KErrNone, if the send operation is successful; KErrServerTerminated, 
+ * if the server no longer present; KErrServerBusy, if there are no message slots available; 
+ * KErrNoMemory, if there is insufficient memory available.
+ */
+ 
+TInt RPrivacyServer::NotifyLocationRequest(TLbsExternalRequestInfo2& aRequestInfo, TInt& aRequestId,
+                                                    TLbsNetPosRequestPrivacy& aNetPosRequestPrivacy)
+    {
+ 	
+	TPckg<TLbsExternalRequestInfo2> requestInfoPkg(aRequestInfo);
+    TPckg<TLbsNetPosRequestPrivacy> netPosRequestPrivacyPkg(aNetPosRequestPrivacy);
+	TPckg<TInt> pkgReqId(aRequestId);
+
+	TIpcArgs args(&requestInfoPkg,&pkgReqId,&netPosRequestPrivacyPkg);
+	return(SendReceive(ELbsPrivacyServerNotifyLocation, args));
+    }
+/**
+ * Called to report that a verification timed out.
+ * @param aRequestInfo the requestInfo that should be used for verification.
+ * @param aRequestId The request id.
+ * @param aRequestAction The reason for a notification.
+ * @return KErrNone, if the send operation is successful; KErrServerTerminated, 
+ * if the server no longer present; KErrServerBusy, if there are no message slots available; 
+ * KErrNoMemory, if there is insufficient memory available.
+ */
+ 
+TInt RPrivacyServer::NotifyVerificationTimeout(TLbsExternalRequestInfo2& aRequestInfo,TInt aRequestId,
+                                                        TLbsNetPosRequestPrivacy& aNetPosRequestPrivacy)
+    {
+    TPckg<TLbsExternalRequestInfo2> requestInfoPkg(aRequestInfo);
+    TPckg<TLbsNetPosRequestPrivacy> netPosRequestPrivacyPkg(aNetPosRequestPrivacy);
+    TIpcArgs args(&requestInfoPkg,aRequestId,&netPosRequestPrivacyPkg);
+    return (SendReceive(ELbsPrivacyServerNotifyVerificationTimeout, args));
+    }
+
+/**
+ * Sends an asynchronous privacy request to the Privacy Protocol Module. The method waits
+ * for the server to write the request ID parameter and then returns.
+ * 
+ * @param aRequestID The request id
+ * @param aRequestInfo The details of the request
+ * @param aPrivacyRequest The actual request, the type and preferred action
+ * @param aStatus The TRequestStatus that should be completed
+ */
+void RPrivacyServer::NewPrivacyRequest(TUint32& aRequestId, const TLbsExternalRequestInfo& aRequestInfo, 
+		const TLbsNetPosRequestPrivacy& aPrivacyRequest, TRequestStatus& aStatus)
+	{
+	Mem::Copy(&iRequestInfo, &aRequestInfo, aRequestInfo.ClassSize());
+	
+	iNetPosRequestPrivacy = aPrivacyRequest;
+	
+	RSemaphore semaphore;
+
+	TInt err = semaphore.CreateGlobal(KNullDesC, 0, EOwnerThread);
+	if(err != KErrNone)
+		{
+		aStatus = KRequestPending;
+		TRequestStatus* status = &aStatus;
+		User::RequestComplete(status, err);
+		}
+ 
+	TIpcArgs args(&iRequestIdUint32Pkg,&iRequestInfoPkg,&iNetPosRequestPrivacyPkg, semaphore);
+
+	// The IPC Message is sent with a different ordinal for local and network requests
+	// so that different capability checking can be done depending on the source of the request
+	if(aRequestInfo.RequestSource() == TLbsExternalRequestInfo::ERequestSourceLocal)
+		{
+		SendReceive(ELbsPrivacyServerNewPrivacyRequestLocal,args,aStatus);
+		}
+	else
+		{
+		SendReceive(ELbsPrivacyServerNewPrivacyRequestNetwork,args,aStatus);
+		}
+
+	semaphore.Wait();
+	semaphore.Close();
+	aRequestId = iRequestIdUint32;
+	}
+
+/**
+ * Sends an asynchronous privacy request to the Privacy Protocol Module.
+ * 
+ * @param aRequestID The request id
+ * @param aRequestInfo The details of the request
+ * @param aPrivacyRequest The actual request, the type and preferred action
+ * @param aStatus The TRequestStatus that should be completed
+ */
+void RPrivacyServer::RepeatPrivacyRequest(TUint32 aRequestId, const TLbsExternalRequestInfo& aRequestInfo, 
+		const TLbsNetPosRequestPrivacy& aPrivacyRequest, TRequestStatus& aStatus)
+	{
+	Mem::Copy(&iRequestInfo, &aRequestInfo, aRequestInfo.ClassSize());
+	
+	iNetPosRequestPrivacy = aPrivacyRequest;
+ 
+	TIpcArgs args(aRequestId,&iRequestInfoPkg,&iNetPosRequestPrivacyPkg);
+	// The IPC Message is sent with a different ordinal for local and network requests
+	// so that different capability checking can be done depending on the source of the request
+	if(aRequestInfo.RequestSource() == TLbsExternalRequestInfo::ERequestSourceLocal)
+		{
+		SendReceive(ELbsPrivacyServerRepeatPrivacyRequestLocal,args,aStatus);
+		}
+	else
+		{
+		SendReceive(ELbsPrivacyServerRepeatPrivacyRequestNetwork,args,aStatus);
+		}
+	}
+
+/**
+ * Tells the Privacy Protocol Module the request session is finished.
+ * 
+ * @param aRequestId The ID of the request session to complete
+ * @param aReason The reason for which the session is ended
+ */
+TInt RPrivacyServer::CompleteRequest(TUint32 aRequestId, TInt aReason)
+	{
+	TIpcArgs args(aRequestId, aReason);
+	return (SendReceive(ELbsPrivacyServerCompleteRequest, args));
+	}
+
+/**
+*Close the connection to the server
+*/
+void RPrivacyServer::Close()
+    {
+    RSessionBase::Close();
+    }
+
+/* Start the LBS system
+ ** open the system controller and issue the Lbsroot startup request
+*/
+TInt RPrivacyServer::StartLbsSystem()
+	{
+	RLbsSystemController systemController;
+	
+	TRAPD(startErr, systemController.OpenL(KLbsNetworkPrivacyApiUid));
+	
+	if(startErr == KErrNone)
+	    {
+        startErr = systemController.RequestSystemStartup();
+        systemController.Close();
+	    }
+	
+    return (startErr);
+	}
+