bluetoothengine/btsap/src/BTSapSniffHandler.cpp
changeset 0 f63038272f30
child 36 f83263de1cc7
child 47 9e2a905b887f
--- /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