usbengines/usbwatcher/src/cusbwatcher.cpp
branchRCL_3
changeset 92 dde4619868dc
parent 86 703a2b94c06c
--- a/usbengines/usbwatcher/src/cusbwatcher.cpp	Wed Sep 15 13:20:24 2010 +0300
+++ b/usbengines/usbwatcher/src/cusbwatcher.cpp	Wed Oct 13 15:41:46 2010 +0300
@@ -254,6 +254,15 @@
                 }
             LOG1( "Starting USB personality in device state: %d", aStateNew );
             iPersonalityHandler->StateChangeNotify( aStateOld, aStateNew );
+            // Check AskOnConnection setting every time
+            if( ( iSupportedPersonalities.Count() > 1 ) &&
+                    !IsAskOnConnectionSuppression() )
+                {
+                // read setting if there is more than one personality
+                iPersonalityRepository->Get(
+                        KUsbWatcherChangeOnConnectionSetting,
+                        iAskOnConnectionSetting );
+                }
 
             if( ( iState == EUsbIdle ) && !iPersonalityChangeOngoing )
                 {
@@ -265,6 +274,10 @@
                 Start();
                 }
 
+            // Let's turn ask on connection off after start cause we will
+            // issue it only when cable is connected
+            iAskOnConnectionSetting = KUsbWatcherChangeOnConnectionOff;
+
             //start usbdevcon only in normal global state
             TInt globalState =
                     CUsbGlobalSystemStateObserver::GlobalSystemState();
@@ -517,7 +530,17 @@
     if( EUsbDeviceStateAttached == state || EUsbDeviceStatePowered == state)
         {
         LOG( "Starting USB personality" );
-        Start();
+        TInt err = iPersonalityRepository->Get(
+           KUsbWatcherChangeOnConnectionSetting, iAskOnConnectionSetting );
+        if( KErrNone == err )
+            {
+            Start();
+            iAskOnConnectionSetting = KUsbWatcherChangeOnConnectionOff;
+            }
+        else
+            {
+            LOG1( "Error: CRepository::Get = %d", err );
+            }
         }
     }
 
@@ -747,7 +770,8 @@
                 iStarted = ETrue;
                 // Restore personality to normal in charging mode
                 iSetPreviousPersonalityOnDisconnect = ETrue;
-                iPersonalityHandler->StartPersonality( iPersonalityId, iStatus );
+                iPersonalityHandler->StartPersonality( iPersonalityId,
+                    KUsbWatcherChangeOnConnectionOff, iStatus );
                 }
             else
                 {
@@ -766,7 +790,8 @@
                 RProperty::Set( KPSUidUsbWatcher,
                             KUsbWatcherSelectedPersonality, iPersonalityId );
                 iStarted = ETrue;
-                iPersonalityHandler->StartPersonality( iPersonalityId, iStatus );
+                iPersonalityHandler->StartPersonality( iPersonalityId,
+                        iAskOnConnectionSetting, iStatus );
                 }
             else
                 {
@@ -788,10 +813,8 @@
         }
     else
         {
-        //Start may have been called because device lock was unlocking. The
-        //personality may be already starting, so nothing needs to be done.
-        LOG1( "Trying to call CUsbWatcher::Start in non-idle state %d",
-            iState );        
+        LOG( "Tryign to call CUsbWatcher::Start in non-idle state " );
+        PANIC( KErrGeneral );
         }
     }
 
@@ -1011,6 +1034,27 @@
     }
 
 // ----------------------------------------------------------------------------
+// Check if there is an observer with ask on connection suppression
+// ----------------------------------------------------------------------------
+//
+TBool CUsbWatcher::IsAskOnConnectionSuppression()
+    {
+    LOG_FUNC
+    
+    TBool ret( EFalse );
+    for( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        if( iObservers[i]->IsAskOnConnectionSuppressed() )
+            {
+            ret = ETrue;
+            break;
+            }
+        }
+    LOG1( "Return = %d", ret );
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
 // Check current A or B device state
 // ----------------------------------------------------------------------------
 //