diff -r 000000000000 -r 9cfd9a3ee49c networkprotocolmodules/privacyprotocolmodule/ClientAPI/Common/src/lbsprivacyclient.cpp --- /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 +#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 requestInfoPkg(aRequestInfo); + TPckg netPosRequestPrivacyPkg(aNetPosRequestPrivacy); + TPckg 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 requestInfoPkg(aRequestInfo); + TPckg 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); + } +