datasourcemodules/locationapesuplpsy/src/lbssuplpsyadaptation.cpp
changeset 36 b47902b73a93
child 40 18280709ae43
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/locationapesuplpsy/src/lbssuplpsyadaptation.cpp	Fri Jun 04 10:34:15 2010 +0100
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 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 <e32cmn.h>
+#include "suplpsygenericinfouser.h"
+#include "suplpsylogging.h"
+#include "suplpsypanic.h"
+#include "suplpsy.hrh"  
+#include "lbsnetinternalapi.h"
+#include "lbsnetinternalmsgtypes.h"
+#include "lbsnrhngmsgs.h"
+#include "LbsPsyNgMsgs.h"
+#include "lbscommoninternaldatatypes.h"
+
+#include <lbsSuplPsyAdaptation.h>
+
+const TUid KSuplPsyUid = {KSuplPsyImplUid}; //KSuplPsyImplUid defined in "suplpsy.hrh"
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::NewL
+// -----------------------------------------------------------------------------
+//
+CLbsSuplPsyAdaptation * CLbsSuplPsyAdaptation::NewL(MLbsSuplPsyAdaptationObserver& aObserver)
+    {
+	CLbsSuplPsyAdaptation* self = new( ELeave ) CLbsSuplPsyAdaptation(aObserver);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::~CLbsSuplPsyAdaptation
+// -----------------------------------------------------------------------------
+//
+CLbsSuplPsyAdaptation::~CLbsSuplPsyAdaptation()
+    {
+    Cancel();
+    iPsyChannel.Close();
+    delete iPositionInfo;
+    iPositionInfo = NULL;
+    delete iSentMsg;
+    iSentMsg = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::CLbsSuplPsyAdaptation 
+// -----------------------------------------------------------------------------
+//
+CLbsSuplPsyAdaptation::CLbsSuplPsyAdaptation (MLbsSuplPsyAdaptationObserver& aObserver):
+        CActive( EPriorityStandard ),
+        iObserver( aObserver ),
+        iLocRequest( EFalse)
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CLbsSuplPsyAdaptation::ConstructL()
+    {
+    iPsyChannel.OpenL(RLbsNetChannel::EChannelSUPLPSY2NG, *this);
+    }
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::RequestLocationUpdate
+// -----------------------------------------------------------------------------
+//
+void CLbsSuplPsyAdaptation::RequestLocationUpdate(TUint aRequestId, TBool aNewClient, TUid aProtocolModule)
+    {
+    TRACESTRING( "CLbsSuplPsyAdaptation::RequestLocation start" )
+    //Check if location request has been made already
+    if ( IsActive() )
+        {
+        return;
+        }
+        
+    iRequestid = aRequestId;
+
+    TRACESTRING( "Creating request message... " )
+                
+    delete iSentMsg;
+    iSentMsg = NULL;
+    TRAPD(err,iSentMsg = CreateTLbsCellLocationRequestMsgL(aRequestId, aNewClient, aProtocolModule); )
+    if(err != KErrNone)
+    	{
+    	iLocRequest = EFalse;
+    	iStatus = KRequestPending;
+      TRACESTRING( "CLbsSuplPsyAdaptation::RequestLocation CreateTLbsCellLocationRequestMsgL failed" )
+      SetActive();
+      TRequestStatus* status = &iStatus;
+      User::RequestComplete( status, err );
+      return;
+      }
+    iLocRequest = ETrue;
+    iPsyChannel.SendMessage(*iSentMsg, iStatus);
+    SetActive();
+    TRACESTRING( "CLbsSuplPsyAdaptation::RequestLocation end" )        
+    }
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::RunL
+// -----------------------------------------------------------------------------
+//
+void CLbsSuplPsyAdaptation::RunL()
+    {
+    TRACESTRING2( "CLbsSuplPsyAdaptation::RunL status=%d", iStatus.Int() )
+    //Call OnSessionComplete only if it not location request.
+    //Location request gets completed in ProcessNetChannelMessage() method            
+    if (!iLocRequest)
+        iObserver.OnSessionComplete(iRequestid, iStatus.Int());	
+    TRACESTRING( "CLbsSuplPsyAdaptation::RunL end" )
+}
+	
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::CancelLocationRequest
+// -----------------------------------------------------------------------------
+//
+void CLbsSuplPsyAdaptation::CancelLocationRequest(TUint aRequestId, TInt aReason)
+    {
+    if (iLocRequest)
+        {            
+        if ( IsActive() )
+            iPsyChannel.CancelSendMessageNotification();                
+        delete iSentMsg;
+        iSentMsg = NULL;
+        iSentMsg = new  TLbsCellLocationCancelMsg(TLbsNetSessionIdInt(KSuplPsyUid, aRequestId), aReason);
+        TRequestStatus status;
+        iPsyChannel.SendMessage(*iSentMsg, status);
+        iLocRequest = EFalse;
+        //SetActive();
+        User::WaitForRequest(status);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CLbsSuplPsyAdaptation::DoCancel()
+    {
+    iPsyChannel.CancelSendMessageNotification(); 
+    }
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CLbsSuplPsyAdaptation::RunError( TInt /* aError */ )
+    {
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::CreateTLbsCellLocationRequestMsgL
+// -----------------------------------------------------------------------------
+//
+TLbsNetInternalMsgBase* CLbsSuplPsyAdaptation::CreateTLbsCellLocationRequestMsgL(TUint aRequestId, TBool aNewClient, TUid aProtocolModule)
+    {
+	TLbsNetPosRequestOptionsInt options;
+	options.SetNewClientConnected(aNewClient);
+	
+	TLbsCellLocationRequestMsg* locReqMsg = new (ELeave) TLbsCellLocationRequestMsg(TLbsNetSessionIdInt(KSuplPsyUid, aRequestId), aProtocolModule, options);
+	return locReqMsg;
+    }        
+
+// -----------------------------------------------------------------------------
+// CLbsSuplPsyAdaptation::ProcessNetChannelMessage
+// -----------------------------------------------------------------------------
+//
+void CLbsSuplPsyAdaptation::ProcessNetChannelMessage(RLbsNetChannel::TLbsNetChannelId aChannelId, const TLbsNetInternalMsgBase& aMessage)
+    {
+    if (RLbsNetChannel::EChannelSUPLPSY2NG != aChannelId)
+        {            
+        iObserver.OnSessionComplete(iRequestid, KErrGeneral); 
+        }
+    else
+        {            
+    	switch (aMessage.Type())
+		    {
+            case TLbsNetInternalMsgBase::ECellLocationResponse:    
+                {                    
+                const TLbsCellLocationResponseMsg& msg = static_cast<const TLbsCellLocationResponseMsg&>(aMessage);
+                TInt reason = msg.Reason();
+                if (reason >= KErrNone)            
+                    {
+                    TRACESTRING( "Extracting position ... " )
+                    const TPositionInfo& posInfo = static_cast<const TPositionInfo&>(msg.PositionInfo());
+                    TRAPD(err,iPositionInfo = HPositionGenericInfo::NewL(posInfo.PositionClassSize()); )
+                    if(err != KErrNone)
+                    	{
+                    	iObserver.OnSessionComplete(iRequestid, err); 
+                    	return;
+                    	}
+                    TPosition pos;
+                    posInfo.GetPosition( pos );
+                    //Mem::Copy(&iPositionInfo, &posInfo, posInfo.PositionClassSize());
+					(static_cast<TPositionInfo*>(iPositionInfo))->SetPosition(pos);
+                    //iPositionInfo->SetPosition(pos);
+                    }            
+                iObserver.OnLocationUpdate(iRequestid,*iPositionInfo,reason);
+                break;
+                }
+            default: 
+                {
+                TRACESTRING( "Invalid message received " )
+                iObserver.OnSessionComplete(iRequestid, KErrGeneral); 
+                break;
+                }
+            }
+        }
+    }