usbengines/usbwatcher/src/cusbindicatorhandler.cpp
branchRCL_3
changeset 79 25fce757be94
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbengines/usbwatcher/src/cusbindicatorhandler.cpp	Tue Aug 31 16:13:57 2010 +0300
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2009-2010 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 implements TUsbIndicatorHandler class.
+*
+*/
+
+#include <e32std.h>
+#include <hbindicatorsymbian.h>
+#include <hbsymbianvariant.h>
+#include <usbman.h>
+#include "debug.h"
+#include "cusbindicatorhandler.h"
+
+
+// ---------------------------------------------------------------------------
+// C++ Constructor 
+// ---------------------------------------------------------------------------
+//
+
+CUsbIndicatorHandler::CUsbIndicatorHandler()
+    {
+    // No implementation required
+    }
+
+CUsbIndicatorHandler::~CUsbIndicatorHandler()
+    {
+    delete iSymbianIndicator;  
+
+    }
+
+CUsbIndicatorHandler* CUsbIndicatorHandler::NewLC()
+    {
+    CUsbIndicatorHandler* self = new (ELeave) CUsbIndicatorHandler();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+CUsbIndicatorHandler* CUsbIndicatorHandler::NewL()
+    {
+    CUsbIndicatorHandler* self = CUsbIndicatorHandler::NewLC();
+    CleanupStack::Pop(); // self;
+    return self;
+    }
+
+void CUsbIndicatorHandler::ConstructL()
+    {
+     LOG_FUNC    
+        
+    iDevStateB4Suspend = EUsbDeviceStateUndefined;
+    iSymbianIndicator = CHbIndicatorSymbian::NewL();
+    }
+
+// ---------------------------------------------------------------------------
+// Change USB Indicator 
+// ---------------------------------------------------------------------------
+//
+void CUsbIndicatorHandler::HandleDeviceStateChangeL( TUsbDeviceState aStateOld, 
+            TUsbDeviceState aStateNew, TInt aPersonality )
+    {
+    LOG_FUNC
+
+    LOG2( "USB device state changed: %d ==> %d", aStateOld, aStateNew );
+    
+    if ( EUsbDeviceStateAddress == aStateNew ) // Entering addressed state
+        {
+       // going down configured -> addressed     
+       if( ( EUsbDeviceStateConfigured == aStateOld ) ||
+            ( ( EUsbDeviceStateSuspended == aStateOld ) &&
+              ( EUsbDeviceStateConfigured == iDevStateB4Suspend ) ) ) 
+            {
+            ShowUsbConnectedIndicatorL( EFalse, aPersonality );
+            }
+        
+        // connecting indicator will be shown when addressed state is entered going up or down
+        // note that when disconnecting the cable (no need to show connecting indicator)
+        // the state change is CONFIGURED => SUSPENDED => POWERED => UNDEFINED    
+        // filter out case of addressed -> suspended -> addressed
+        if ( ( EUsbDeviceStateSuspended != aStateOld ) || 
+             ( EUsbDeviceStateAddress != iDevStateB4Suspend) )
+            {
+            ShowUsbAddressedIndicator( ETrue );
+            }
+        }
+    
+    else if ( EUsbDeviceStateConfigured == aStateNew ) // Entering configured state 
+        {
+        // filter out case of configed -> suspended -> configed
+        if ( ( EUsbDeviceStateSuspended != aStateOld ) || 
+             ( EUsbDeviceStateConfigured != iDevStateB4Suspend) )
+            {
+            ShowUsbAddressedIndicator( EFalse );    
+            ShowUsbConnectedIndicatorL( ETrue, aPersonality );
+            }
+        }
+     
+    else if ( EUsbDeviceStateUndefined == aStateNew ) // Entering undefined
+        {
+        ShowUsbAddressedIndicator( EFalse );
+        ShowUsbConnectedIndicatorL( EFalse, aPersonality );
+        }   
+        
+        
+    else if ( EUsbDeviceStateSuspended == aStateNew )
+    // If current state is suspend, we do not change the indicator, but save
+    // the previous state
+        {
+        iDevStateB4Suspend = aStateOld;
+        }
+    else // New device state is not configured, nor suspended, nor addressed
+        {
+        ShowUsbConnectedIndicatorL( EFalse, aPersonality );       
+        } 
+  
+    }
+    
+// ---------------------------------------------------------------------------
+// Show USB Indicator
+// ---------------------------------------------------------------------------
+//
+void CUsbIndicatorHandler::ShowUsbConnectedIndicatorL( TBool aActivate, TInt aPersonality )
+    {
+     LOG_FUNC    
+     TBool success = EFalse;
+     _LIT(KUsbIndicator, "com.nokia.hb.indicator.usb.device.connected/1.0");  
+     
+     if (aActivate)
+        {
+        RUsb usbman;
+        User::LeaveIfError(usbman.Connect());
+        CleanupClosePushL(usbman);
+        HBufC* description = NULL;
+        User::LeaveIfError(usbman.GetDescription(aPersonality,
+             description));
+        CleanupStack::PopAndDestroy(&usbman);
+        CleanupStack::PushL(description);
+        CHbSymbianVariant* parameters = CHbSymbianVariant::NewL(description, CHbSymbianVariant::EDes);
+        CleanupStack::PopAndDestroy(description);       
+        success = iSymbianIndicator->Activate(KUsbIndicator, parameters);   
+        LOG1( "calling CHbIndicatorSymbian::Activate(), returned %d", success);
+        if (!success)
+            {
+            TInt indicatorerror = iSymbianIndicator->Error();
+            LOG1( "activating the indicator failed with %d", indicatorerror);
+            }
+        else
+            {
+            iConnectedIndicatorActive = ETrue;    
+            }    
+        delete parameters;  
+        }    
+     else if (iConnectedIndicatorActive)
+        {
+        success = iSymbianIndicator->Deactivate(KUsbIndicator); 
+        LOG1( "calling CHbIndicatorSymbian::Deactivate(), returned %d", success);
+        if (success)
+            {
+            iConnectedIndicatorActive = EFalse;    
+            }        
+        LOG( "calling CHbIndicatorSymbian::Deactivate()");
+        }
+   
+   }
+
+void CUsbIndicatorHandler::ShowUsbAddressedIndicator( TBool aActivate  )
+    {
+     LOG_FUNC    
+     TBool success = EFalse;
+     _LIT(KUsbIndicator, "com.nokia.hb.indicator.usb.device.inprogress/1.0");  
+     if (aActivate)
+        {
+        success = iSymbianIndicator->Activate(KUsbIndicator);   
+        LOG1( "calling CHbIndicatorSymbian::Activate(), returned %d", success);
+        if (!success)
+            {
+            TInt indicatorerror = iSymbianIndicator->Error();
+            LOG1( "activating the indicator failed with %d", indicatorerror);
+            }
+        else
+            {
+            iAddressedIndicatorActive = ETrue;    
+            }
+        }    
+     else if (iAddressedIndicatorActive)
+        {
+        success = iSymbianIndicator->Deactivate(KUsbIndicator); 
+        LOG1( "calling CHbIndicatorSymbian::Deactivate(), returned %d", success);
+        if (success)
+            {
+            iAddressedIndicatorActive = EFalse;    
+            }
+        LOG( "calling CHbIndicatorSymbian::Deactivate()");
+        }
+   }
+   
+
+
+// End of file