--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/locationrequestmgmt/networkrequesthandler/LbsX3P/LbsX3PApi/src/LbsX3PImpl.cpp Fri Jun 04 10:34:15 2010 +0100
@@ -0,0 +1,293 @@
+// Copyright (c) 2006-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:
+// Client side implementation for the LbsX3P Api.
+//
+//
+
+#include <e32base.h>
+#include <e32debug.h>
+#include <lbspositioninfo.h>
+#include "lbsnrhserverdata.h"
+#include "LbsX3PImpl.h"
+#include "lbsprocessuiddefs.h"
+#include "messageutils.h"
+#include "lbsx3pdata.h"
+#include "lbsnrhmessageenums.h"
+#include "lbssystemcontroller.h"
+
+
+//
+// RNrhServer
+//
+
+/* The X3P Implementation hides the details of the
+ * Privacy Controller from the class CLbsPrivacyController, which uses only the
+ * published API.
+ *
+ * The privacy comntroller is implemented here as a client of the Network
+ * Request Handler, which includes a server to handle requests from this
+ * component.
+ *
+ * Generic operation on thet client side is implemented by the
+ * code in lbsloccommon\serverframework.
+ */
+RNrhServer::RNrhServer()
+ {
+ // nothing to do
+ }
+
+RNrhServer::~RNrhServer()
+ {
+ // nothing to do
+ }
+
+TVersion RNrhServer::Version()
+ {
+ return TVersion(KNrhServerMajorVersionNumber,
+ KNrhServerMinorVersionNumber,
+ KNrhServerBuildVersionNumber);
+ }
+
+TInt RNrhServer::StartServer(TServerStartParams& /*aParams*/)
+ {
+ // Start LBS from LbsRoot
+ TRAPD(err, StartLbsL());
+ return (err);
+ }
+
+void RNrhServer::StartLbsL()
+ {
+ RLbsSystemController systemController;
+ RProcess process;
+ CleanupClosePushL(process);
+ systemController.OpenL(process.SecureId());
+ CleanupClosePushL(systemController);
+
+ TInt startErr = systemController.RequestSystemStartup();
+ if (startErr != ELbsStartupSuccess)
+ {
+ User::Leave(KErrCouldNotConnect);
+ }
+
+ CleanupStack::PopAndDestroy(2, &process);
+ }
+
+//
+// RNrhSession
+//
+
+RNrhSession::RNrhSession() :
+ iTransmittedPosInfoPtr(NULL, 0),
+ iTransmitPositionParamsPtr(NULL, 0),
+ iReferencePosInfoPtr(NULL, 0),
+ iReferencePositionParamsPtr(NULL, 0)
+ {
+ // nothing to do
+ }
+
+RNrhSession::~RNrhSession()
+ {
+ // nothing to do
+ }
+
+void RNrhSession::TransmitPosition(const TDesC& aDestinationId,
+ TUint aTransmitPriority,
+ TRequestStatus& aStatus,
+ TPositionInfo& aTransmittedPosInfo)
+ {
+ // iDestinationId is too big to fit in the buffer;
+ // complete the request early with an error code
+ if (aDestinationId.Length() > iTransmitPositionParams.iDestinationId.MaxLength())
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrTooBig);
+ }
+
+ iTransmitPositionParams.iDestinationId = aDestinationId;
+ iTransmitPositionParams.iPriority = aTransmitPriority;
+ iTransmitPositionParams.iPositionInfoClassType = aTransmittedPosInfo.PositionClassType();
+ iTransmitPositionParams.iPositionInfoClassSize = aTransmittedPosInfo.PositionClassSize();
+
+ iTransmitPositionParamsPtr.Set(reinterpret_cast<TUint8*>(&iTransmitPositionParams),
+ sizeof(iTransmitPositionParams),
+ sizeof(iTransmitPositionParams));
+ iTransmittedPosInfoPtr.Set(reinterpret_cast<TUint8*>(&aTransmittedPosInfo),
+ aTransmittedPosInfo.PositionClassSize(),
+ aTransmittedPosInfo.PositionClassSize());
+ TIpcArgs args(&iTransmitPositionParamsPtr, &iTransmittedPosInfoPtr);
+ SendReceive(EX3pTransmitPosition, args, aStatus);
+ }
+
+void RNrhSession::TransmitPosition(const TDesC& aDestinationId,TUint aTransmitPriority,
+ TRequestStatus& aRefPosStatus, TPositionInfo& aRefPosInfo,
+ TRequestStatus& aTransmittedPosStatus, TPositionInfo& aTransmittedPosInfo)
+ {
+ // iDestinationId is too big to fit in the buffer;
+ // complete the request early with an error code
+ if (aDestinationId.Length() > iTransmitPositionParams.iDestinationId.MaxLength())
+ {
+ TRequestStatus* refStatus = &aRefPosStatus;
+ TRequestStatus* transmittedStatus = &aTransmittedPosStatus;
+ User::RequestComplete(refStatus, KErrTooBig);
+ User::RequestComplete(transmittedStatus, KErrTooBig);
+ }
+
+ ReportReferenceLocation(aRefPosStatus, aRefPosInfo);
+ TransmitPosition(aDestinationId, aTransmitPriority,
+ aTransmittedPosStatus, aTransmittedPosInfo);
+ }
+
+void RNrhSession::ReportReferenceLocation(TRequestStatus& aRefPosStatus, TPositionInfo& aReferencePosInfo)
+ {
+
+ iReferencePositionParams.iPositionInfoClassType = aReferencePosInfo.PositionClassType();
+ iReferencePositionParams.iPositionInfoClassSize = aReferencePosInfo.PositionClassSize();
+
+ iReferencePositionParamsPtr.Set(reinterpret_cast<TUint8*>(&iReferencePositionParams),
+ sizeof(iReferencePositionParams),
+ sizeof(iReferencePositionParams));
+
+ iReferencePosInfoPtr.Set(reinterpret_cast<TUint8*>(&aReferencePosInfo),
+ aReferencePosInfo.PositionClassSize(),
+ aReferencePosInfo.PositionClassSize());
+ TIpcArgs args(&iReferencePositionParamsPtr, &iReferencePosInfoPtr);
+ SendReceive(EX3pReportReferenceLocation , args, aRefPosStatus);
+ }
+
+void RNrhSession::CancelTransmitPosition()
+ {
+ TIpcArgs args;
+ SendReceive(EX3pCancelTransmitPosition, args);
+ }
+
+TInt RNrhSession::SetTransmitOptions(const TLbsTransmitPositionOptions& aTransmitOptions)
+ {
+ TPckgC<TLbsTransmitPositionOptions> optionsPckg(aTransmitOptions);
+ TIpcArgs args(&optionsPckg);
+ return (SendReceive(EX3pSetTransmitOptions, args));
+ }
+
+TInt RNrhSession::GetTransmitOptions(TLbsTransmitPositionOptions& aTransmitOptions) const
+ {
+ TPckg<TLbsTransmitPositionOptions> optionsPckg(aTransmitOptions);
+ TIpcArgs args(&optionsPckg);
+ return (SendReceive(EX3pGetTransmitOptions, args));
+ }
+
+//
+// CLbsTransmitPositionServerImpl
+//
+
+CLbsTransmitPositionServerImpl::CLbsTransmitPositionServerImpl()
+ {
+ }
+
+CLbsTransmitPositionServerImpl::~CLbsTransmitPositionServerImpl()
+ {
+ iServer.Close();
+ }
+
+CLbsTransmitPositionServerImpl* CLbsTransmitPositionServerImpl::NewL()
+ {
+ CLbsTransmitPositionServerImpl* self = new (ELeave) CLbsTransmitPositionServerImpl;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CLbsTransmitPositionServerImpl::ConstructL()
+ {
+ /**
+ * See the ServerFramework code for the meaning of this code
+ */
+ iParams.SetServerFileName(KNrhServerFileName);
+ iParams.SetServerName(KNrhServerName);
+ iParams.SetNumberOfServerSlots(-1); // Use messages from the global pool
+ iParams.SetServerUids(KNullUid, KNullUid, KLbsNetRequestHandlerUid);
+
+ User::LeaveIfError(iServer.Connect(iParams));
+ }
+
+RNrhServer& CLbsTransmitPositionServerImpl::Server()
+ {
+ return iServer;
+ }
+
+//
+// CLbsTransmitPositionImpl
+//
+
+CLbsTransmitPositionImpl::CLbsTransmitPositionImpl()
+ {
+
+ }
+
+CLbsTransmitPositionImpl::~CLbsTransmitPositionImpl()
+ {
+ iSession.Close();
+ }
+
+CLbsTransmitPositionImpl* CLbsTransmitPositionImpl::NewL(RLbsTransmitPositionServer& aServer)
+ {
+ CLbsTransmitPositionImpl* self = new (ELeave) CLbsTransmitPositionImpl;
+ CleanupStack::PushL(self);
+ self->ConstructL(aServer);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CLbsTransmitPositionImpl::ConstructL(RLbsTransmitPositionServer& aServer)
+ {
+ TNrhX3PData data;
+ TNrhSubSessionType type(ENrhSubSessionX3P);
+ User::LeaveIfError(iSession.Open<TNrhSubSessionType, TNrhX3PData>(
+ aServer.Impl().Server(),
+ type,
+ data));
+ }
+
+void CLbsTransmitPositionImpl::TransmitPosition(const TDesC& aDestinationID,
+ TUint aTransmitPriority,
+ TRequestStatus& aTransmittedPosStatus,
+ TPositionInfo& aTransmittedPosInfo)
+ {
+ iSession.TransmitPosition(aDestinationID, aTransmitPriority,
+ aTransmittedPosStatus, aTransmittedPosInfo);
+ }
+
+void CLbsTransmitPositionImpl::TransmitPosition(const TDesC& aDestinationID,TUint aTransmitPriority,
+ TRequestStatus& aRefPosStatus, TPositionInfo& aRefPosInfo,
+ TRequestStatus& aTransmittedPosStatus, TPositionInfo& aTransmittedPosInfo)
+ {
+ iSession.TransmitPosition(aDestinationID, aTransmitPriority, aRefPosStatus,aRefPosInfo,
+ aTransmittedPosStatus, aTransmittedPosInfo);
+ }
+
+void CLbsTransmitPositionImpl::CancelTransmitPosition()
+ {
+ iSession.CancelTransmitPosition();
+ }
+
+TInt CLbsTransmitPositionImpl::SetTransmitOptions(const TLbsTransmitPositionOptions& aTransmitOptions)
+ {
+ return (iSession.SetTransmitOptions(aTransmitOptions));
+ }
+
+TInt CLbsTransmitPositionImpl::GetTransmitOptions(TLbsTransmitPositionOptions& aTransmitOptions) const
+ {
+ return (iSession.GetTransmitOptions(aTransmitOptions));
+ }
+
+