datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/RequestHandler/BTGPSRequestHandler.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/RequestHandler/BTGPSRequestHandler.cpp Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,397 @@
+// Copyright (c) 2005-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 FILES
+#include <bt_sock.h>
+#include <lbserrors.h>
+
+#include "BTGPSPanic.h"
+#include "BTGPSRequestHandler.h"
+#include "BTGPSConstantsManager.h"
+#include "BTGPSSettingManager.h"
+#include "BTGPSDeviceManager.h"
+#include "BTGPSConnectManager.h"
+#include "BTGPSMessageSender.h"
+#include "BTGPSInitManager.h"
+#include "BTGPSRequestManager.h"
+#include "BTGPSPsyConnectionManager.h"
+#include "BTGPSNokDeviceHandler.h"
+#include "BTGPSEnvChangeHandler.h"
+#include "BTGPSModuleStatusHandler.h"
+#include "BTGPSPowerManager.h"
+#include "BTGPSPositionerExt.h"
+#include "BTGPSLogging.h"
+#include "btgpsdevicelistmanager.h"
+
+// CONSTANTS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CBTGPSRequestHandler* CBTGPSRequestHandler::NewL()
+ {
+ CBTGPSRequestHandler* self = new( ELeave ) CBTGPSRequestHandler;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::CBTGPSRequestHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CBTGPSRequestHandler::CBTGPSRequestHandler()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CBTGPSRequestHandler::ConstructL()
+ {
+ TRACESTRING("CBTGPSRequestHandler::ConstructL start...")
+ //Construct Constants Mangaer
+ iConstantsManager = CBTGPSConstantsManager::NewL();
+
+ //Construct the Device List Manager
+ iDeviceListManager = CBTGPSDeviceListManager::NewL();
+
+ //Construct Setting Manager
+ iSettingManager = CBTGPSSettingManager::NewL();
+
+ //Construct BT Device Manager
+ iDeviceManager = CBTGPSDeviceManager::NewL();
+ iDeviceManager->AddListenerL(*this);
+
+ //Construct connection manager
+ iConnectManager = CBTGPSConnectManager::NewL(
+ *iSettingManager,
+ *iDeviceManager,
+ *iConstantsManager,
+ *iDeviceListManager);
+
+ //Construct init manager
+ iInitManager = CBTGPSInitManager::NewL(
+ *iConnectManager,
+ *iDeviceManager,
+ *iSettingManager);
+
+ //Construct request manager
+ iRequestManager = CBTGPSRequestManager::NewL(
+ *iConnectManager,
+ *iConstantsManager);
+ iRequestManager->AddListenerL(*this);
+
+ //Construct PSY connection manager
+ iPsyConnectionManager = CBTGPSPsyConnectionManager::NewL();
+
+ //Construct Nok device handler
+ iNokDeviceHandler = CBTGPSNokDeviceHandler::NewL(
+ *iConnectManager,
+ *iSettingManager,
+ *iConstantsManager,
+ *iDeviceManager,
+ *iDeviceListManager);
+
+ //Module status handler
+ iModuleStatusHandler = CBTGPSModuleStatusHandler::NewL(
+ *iPsyConnectionManager,
+ *iDeviceManager,
+ *iRequestManager);
+
+ //Power manager
+ iPowerManager = CBTGPSPowerManager::NewL(
+ *iConnectManager,
+ *iPsyConnectionManager,
+ *iDeviceManager,
+ *iConstantsManager);
+
+ //Construct Environment change handler
+ iEnvChangeHandler = CBTGPSEnvChangeHandler::NewL(*iRequestManager);
+ TRACESTRING("CBTGPSRequestHandler::ConstructL end")
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::~CBTGPSRequestHandler
+// Destructor.
+// -----------------------------------------------------------------------------
+CBTGPSRequestHandler::~CBTGPSRequestHandler()
+ {
+ if(iDeviceManager != NULL)
+ {
+ iDeviceManager->RemoveListener(*this);
+ }
+
+ if(iRequestManager!=NULL)
+ {
+ iRequestManager->RemoveListener(*this);
+ }
+
+ delete iDeviceListManager;
+ delete iEnvChangeHandler;
+ delete iPowerManager;
+ delete iModuleStatusHandler;
+ delete iNokDeviceHandler;
+ delete iPsyConnectionManager;
+ delete iRequestManager;
+ delete iInitManager;
+ delete iConnectManager;
+ delete iDeviceManager;
+ delete iSettingManager;
+ delete iConstantsManager;
+ Dll::SetTls(NULL);
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::GetInstanceL
+// -----------------------------------------------------------------------------
+//
+CBTGPSRequestHandler * CBTGPSRequestHandler::GetInstanceL()
+ {
+ //Have we loaded the request handler already
+ if ( !Dll::Tls() )
+ {
+ CBTGPSRequestHandler * theHandler = CBTGPSRequestHandler::NewL();
+ Dll::SetTls(theHandler);
+ }
+
+ return reinterpret_cast<CBTGPSRequestHandler*>(Dll::Tls());
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::Instance
+// -----------------------------------------------------------------------------
+CBTGPSRequestHandler& CBTGPSRequestHandler::Instance()
+ {
+ if(!Dll::Tls())
+ {
+ Panic(EPanicSingletonNotConstructed);
+ }
+ return *(reinterpret_cast<CBTGPSRequestHandler*>(Dll::Tls()));
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::ConstantsManager
+// -----------------------------------------------------------------------------
+CBTGPSConstantsManager& CBTGPSRequestHandler::ConstantsManager()
+ {
+ return *(Instance().iConstantsManager);
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::AcquireLocation
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::AcquireLocation(MBTGPSPositionerExt* aPSY)
+ {
+ TRACESTRING("CBTGPSRequestHandler::AcquireLocation start...")
+ //tries to acquire locaiton
+ TRAPD(err, AcquireLocationL(aPSY));
+ if(err!=KErrNone)
+ {
+ //Convert error code
+ if(err == KErrCouldNotConnect)
+ {
+ err = KPositionQualityLoss;
+ }
+
+ //if function leaves, then complete request with error code
+ CompleteRequest(*aPSY, err);
+ }
+ TRACESTRING("CBTGPSRequestHandler::AcquireLocation end")
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::AcquireLocation
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::AcquireLocationL(MBTGPSPositionerExt* aPSY)
+ {
+ //Make location request to connection manager
+ iPsyConnectionManager->AcquireLocation(aPSY);
+
+ //Connect to GPS
+ User::LeaveIfError(iConnectManager->Connecting());
+
+ //Retrieve Fix
+ iRequestManager->RetrieveFixL();
+
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::CancelAcquireLocation
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::CancelAcquireLocation(
+ MBTGPSPositionerExt* aPSY)
+{
+ TRACESTRING("CBTGPSRequestHandler::CancelAcquireLocation start...")
+ //Cancel location request from connection manager
+ iPsyConnectionManager->CancelAcquireLocation(aPSY);
+
+ if(iPsyConnectionManager->LocationRequestCount() == 0)
+ {
+ //When no location request, stop retrieving fix
+ iRequestManager->StopRetrievingFix();
+ }
+ TRACESTRING("CBTGPSRequestHandler::CancelAcquireLocation end")
+}
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::RegisterPSYL
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::RegisterPSYL(MBTGPSPositionerExt* aPSY)
+ {
+ TRACESTRING("CBTGPSRequestHandler::RegisterPSYL start...")
+ //Register the psy
+ iPsyConnectionManager->RegisterPSYL(aPSY);
+
+ //Reconnecting to GPS and try to recover from error states
+ iConnectManager->Reconnecting();
+
+ //Set NMEA index
+ aPSY->SetInitialNmeaBufferBottom(
+ iRequestManager->GetPreviousNmeaBufferBottom());
+
+ TRACESTRING2("Initial NMEA Buffer Bottom: %d",
+ iRequestManager->GetPreviousNmeaBufferBottom());
+ TRACESTRING("CBTGPSRequestHandler::RegisterPSYL end")
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::UnregisterPSY
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::UnregisterPSY(MBTGPSPositionerExt* aPSY)
+ {
+ TRACESTRING("CBTGPSRequestHandler::UnregisterPSY start...")
+ //Unregister PSY
+ iPsyConnectionManager->UnregisterPSY(aPSY);
+
+ //If no PSY is connected, then delete this instance
+ if ( iPsyConnectionManager->Count() == 0 )
+ {
+ //Report device status before destruction
+ TPositionModuleStatus moduleStatus;
+ moduleStatus.SetDataQualityStatus(TPositionModuleStatus::EDataQualityUnknown);
+ moduleStatus.SetDeviceStatus(TPositionModuleStatus::EDeviceInactive);
+ aPSY->ReportStatus(moduleStatus);
+
+ delete this;
+ }
+ TRACESTRING("CBTGPSRequestHandler::UnregisterPSY end")
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::TrackingSessionStart
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::TrackingSessionStartL(
+ MBTGPSPositionerExt* aPSY,
+ const TTimeIntervalMicroSeconds& aInterval)
+ {
+ TRACESTRING("CBTGPSRequestHandler::TrackingSessionStartL start...")
+ iPsyConnectionManager->TrackingSessionStartL(aPSY, aInterval);
+ TRACESTRING("CBTGPSRequestHandler::TrackingSessionStartL end")
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::TrackingSessionStop
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::TrackingSessionStop(
+ MBTGPSPositionerExt* aPSY)
+ {
+ TRACESTRING("CBTGPSRequestHandler::TrackingSessionStop start...")
+ iPsyConnectionManager->TrackingSessionStop(aPSY);
+ TRACESTRING("CBTGPSRequestHandler::TrackingSessionStop end")
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::LastLocation
+// -----------------------------------------------------------------------------
+TInt CBTGPSRequestHandler::LastLocation(
+ const CBTGPSFix*& aFix,
+ const TTime& aMaxAge,
+ const TBool aAcceptPartial)
+ {
+ return iRequestManager->LastLocation(aFix, aMaxAge, aAcceptPartial);
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::CompleteRequest
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::CompleteRequest(
+ MBTGPSPositionerExt& aPSY,
+ TInt aErr)
+ {
+ iPsyConnectionManager->CompleteRequest(aPSY, aErr);
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::CompleteAllRequests
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::CompleteAllRequests(TInt aErr)
+ {
+ iPsyConnectionManager->CompleteAllRequests(aErr);
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::HandleLocationFixAvailable
+// -----------------------------------------------------------------------------
+//
+void CBTGPSRequestHandler::HandleLocationFixUpdate(const CBTGPSFix& aFix)
+ {
+ iPsyConnectionManager->LocationFixUpdate(aFix);
+
+ if(iPsyConnectionManager->LocationRequestCount() == 0)
+ {
+ //If no location request, then stop retrieving fix
+ iRequestManager->StopRetrievingFix();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CBTGPSRequestHandler::BTDeviceStatusChanged
+// -----------------------------------------------------------------------------
+void CBTGPSRequestHandler::BTDeviceStatusChanged(
+ TInt aConnectStatus,
+ TInt /*aDeviceType*/,
+ TInt aErr)
+ {
+ if(aConnectStatus==EBTDeviceConnectError ||
+ aConnectStatus == EBTDeviceDisconnected )
+ {
+ //When connect error or disconnected, then we complete all
+ //request with error KErrQualityLoss
+ if(aErr!=KErrNoMemory)
+ {
+ aErr = KPositionQualityLoss;
+ }
+ CompleteAllRequests(aErr);
+ }
+ }
+
+
+// End of File
+