--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btsap/src/BTSapSniffHandler.cpp Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,210 @@
+/*
+* Copyright (c) 2004 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:
+* This class implements a handler, which sets the physical link to
+* sniff-mode when the SAP link is inactive for some time
+*
+*/
+
+
+// INCLUDE FILES
+#include "BTSapSniffHandler.h"
+#include "debug.h"
+
+// Sniff timer interval in microseconds
+const TInt KSniffInterval = 3000000; // 3 seconds
+
+CBTSapSniffHandler::CBTSapSniffHandler(RSocket& aSocket, RSocketServ& aSocketServer)
+ : CTimer(EPriorityStandard),
+ iSocket(aSocket),
+ iSocketServer(aSocketServer),
+ iIsLinkAdapterOpen(EFalse)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler")));
+
+ CActiveScheduler::Add(this);
+ }
+
+CBTSapSniffHandler::~CBTSapSniffHandler()
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] ~CBTSapSniffHandler")));
+
+ if(iIsLinkAdapterOpen)
+ {
+ // Now we can allow sniff-mode again
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] ~CBTSapSniffHandler Allowing LowPowerModes")));
+ TInt err = iBTLinkAdapter.AllowLowPowerModes(ESniffMode);
+ if(err != KErrNone)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] ~CBTSapSniffHandler: Couldn't allow sniff-mode %d"), err));
+ }
+ iBTLinkAdapter.Close();
+ }
+
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] ~CBTSapSniffHandler Stopping the sniff-timer")));
+ Cancel();
+ }
+
+
+// ---------------------------------------------------------
+// NewL()
+// ---------------------------------------------------------
+//
+CBTSapSniffHandler* CBTSapSniffHandler::NewL(RSocket& aSocket, RSocketServ& aSocketServer)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::NewL")));
+
+ CBTSapSniffHandler* self = new (ELeave) CBTSapSniffHandler(aSocket, aSocketServer);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ---------------------------------------------------------
+// Enable
+// ---------------------------------------------------------
+//
+void CBTSapSniffHandler::Enable()
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable")));
+ TInt err;
+
+ if(!iIsLinkAdapterOpen)
+ {
+ err = iBTLinkAdapter.Open(iSocketServer, iSocket);
+ if(err != KErrNone)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Couldn't open iBTLinkAdapter %d")));
+ }
+ else
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: iBTLinkAdapter opened")));
+ iIsLinkAdapterOpen = ETrue;
+ }
+ }
+
+ if(iIsLinkAdapterOpen)
+ {
+ // Start the sniffer timer
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Starting the sniff timer %d µsec"), KSniffInterval));
+ Cancel();
+ After(KSniffInterval);
+
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Cancelling LowPowerModeRequester")));
+ err = iBTLinkAdapter.CancelLowPowerModeRequester();
+ if(err == KErrNone)
+ {
+ // We don't want to go to sniff-mode while our timer is running, so we prevent low-power modes here
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Preventing LowPowerModes")));
+ err = iBTLinkAdapter.PreventLowPowerModes(EAnyLowPowerMode);
+ if(err != KErrNone)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Couldn't prevent low-power modes %d"), err));
+ }
+ }
+ else
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Couldn't cancel sniff requester %d"), err));
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Disable
+// ---------------------------------------------------------
+//
+void CBTSapSniffHandler::Disable()
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Disable")));
+
+ // Stop the timer
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Disable: Stopping the sniff-timer")));
+ Cancel();
+
+ // If the adapter is not open, we don't need to do anything
+ if(iIsLinkAdapterOpen)
+ {
+ // When the sniffer is disabled, we should allow sniff-mode again
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Disable: Allowing LowPowerModes")));
+ TInt err = iBTLinkAdapter.AllowLowPowerModes(ESniffMode);
+ if(err != KErrNone)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Disable: Couldn't allow sniff-mode %d"), err));
+ }
+ // And then close the physical link adapter
+ iBTLinkAdapter.Close();
+ iIsLinkAdapterOpen = EFalse;
+ }
+ }
+
+// ---------------------------------------------------------
+// Pause
+// ---------------------------------------------------------
+//
+void CBTSapSniffHandler::Pause()
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Pause")));
+ TInt err;
+
+ // Stop the timer
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Pause: Stopping the sniff-timer")));
+ Cancel();
+
+ if(iIsLinkAdapterOpen)
+ {
+ // When the sniffer is paused, we are probably handling some requests, so we prevent sniff-mode
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Pause: Preventing LowPowerModes")));
+ err = iBTLinkAdapter.PreventLowPowerModes(EAnyLowPowerMode);
+ if(err != KErrNone)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Pause: Couldn't prevent low-power modes %d"), err));
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// RunL
+// ---------------------------------------------------------
+//
+void CBTSapSniffHandler::RunL()
+ {
+ TInt status = iStatus.Int();
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler: RunL: %d"), status));
+
+ TInt err;
+
+ if(iIsLinkAdapterOpen)
+ {
+ // Now we can allow sniff-mode again
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::RunL: Allowing LowPowerModes")));
+ err = iBTLinkAdapter.AllowLowPowerModes(ESniffMode);
+ if(err == KErrNone)
+ {
+ // Start the sniff-mode requester
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::RunL: Activating SniffRequester")));
+ err = iBTLinkAdapter.ActivateSniffRequester();
+ if(err != KErrNone)
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::RunL: Couldn't activate the sniff requester %d"), err));
+ }
+ }
+ else
+ {
+ BTSAP_TRACE_OPT(KBTSAP_TRACE_ERROR, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::RunL: Couldn't allow sniff-mode %d"), err));
+ }
+ }
+ }
+
+// End of File