diff -r 4712310216c0 -r 5323ec7dc425 usbengines/usbotgwatcher/src/cusbotgwatcher.cpp --- a/usbengines/usbotgwatcher/src/cusbotgwatcher.cpp Fri Apr 23 23:17:21 2010 +0300 +++ b/usbengines/usbotgwatcher/src/cusbotgwatcher.cpp Fri Apr 23 23:28:37 2010 +0300 @@ -28,6 +28,8 @@ #include "cusbstatehostaperipheral.h" #include "cusbstatehostaidle.h" #include "cusbstatehosthandle.h" +#include "cusbstatehostdelayhandle.h" +#include "cusbstatehostundefined.h" #include "cusbwarningnotifier.h" @@ -79,12 +81,13 @@ iUsbServiceControl = CUsbServiceControl::NewL(this, iUsb); - User::LeaveIfError(iStates.Append(CUsbState::NewL(this))); + User::LeaveIfError(iStates.Append(CUsbStateHostUndefined::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAInitiate::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAHost::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAPeripheral::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAIdle::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostHandle::NewL(this))); + User::LeaveIfError(iStates.Append(CUsbStateHostDelayHandle::NewL(this))); iIdPinObserver = CUsbIdPinObserver::NewL(); iVBusObserver = CUsbVBusObserver::NewL(); @@ -95,13 +98,18 @@ iMessageNotificationObserver = CUsbMessageNotificationObserver::NewL( &iUsb); - iHostState = iStates[EUsbStateUndefined]; + iHostState = iStates[EUsbStateHostUndefined]; // Notif manager must be created at least after VBus observer and iHostState initialization // to allow USb indicator subscribe to its notifications at construction and check their's current states iNotifManager = CUsbNotifManager::NewL(this); - iIdPinObserver->SubscribeL(this); + iVBusObserver->SubscribeL(*this); + iOtgStateObserver->SubscribeL(*this); + iBusActivityObserver->SubscribeL(*this); + iHostEventNotificationObserver->SubscribeL(*this); + iMessageNotificationObserver->SubscribeL(*this); + iIdPinObserver->SubscribeL(*this); if (CUsbIdPinObserver::EIdPinOn == iIdPinObserver->IdPin()) { @@ -152,6 +160,32 @@ // delete Notif manager before VBus observer, due to USB indicator observes VBus delete iNotifManager; + if(iIdPinObserver) + { + TRAP_IGNORE(iIdPinObserver->UnsubscribeL(*this)); + } + + if(iVBusObserver) + { + TRAP_IGNORE(iVBusObserver->UnsubscribeL(*this)); + } + if(iOtgStateObserver) + { + TRAP_IGNORE(iOtgStateObserver->UnsubscribeL(*this)); + } + if(iBusActivityObserver) + { + TRAP_IGNORE(iBusActivityObserver->UnsubscribeL(*this)); + } + if(iHostEventNotificationObserver) + { + TRAP_IGNORE(iHostEventNotificationObserver->UnsubscribeL(*this)); + } + if(iMessageNotificationObserver) + { + TRAP_IGNORE(iMessageNotificationObserver->UnsubscribeL(*this)); + } + delete iIdPinObserver; delete iVBusObserver; delete iOtgStateObserver; @@ -259,7 +293,7 @@ if (!CanStartSessionL()) { - HandleHostProblemL(EUsbWatcherErrorInConnection); + HandleHostProblemL(EUsbWatcherErrorInConnection, EUsbStateHostHandle); return; } @@ -267,7 +301,7 @@ if (KErrNone != err) { FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::StartSessionL Can not start usb services. reason = %d" ), err)); - HandleHostProblemL(EUsbWatcherCanNotStartUsbServices); + HandleHostProblemL(EUsbWatcherCanNotStartUsbServices, EUsbStateHostHandle); return; } @@ -280,11 +314,11 @@ // // --------------------------------------------------------------------------- // -void CUsbOtgWatcher::HandleHostProblemL(TInt aWhatKindOf) +void CUsbOtgWatcher::HandleHostProblemL(TInt aWhatKindOf, TUsbStateIds aInState ) { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::HandleProblemL" ) ); - HostHandle()->SetWhat(aWhatKindOf); - ChangeHostStateL(EUsbStateHostHandle); + HostHandle(aInState)->SetWhat(aWhatKindOf); + ChangeHostStateL(aInState); } // --------------------------------------------------------------------------- @@ -305,18 +339,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinOffL" ) ); - // for example, USB failed to start - if(NULL == iHostState) return; - - iVBusObserver->UnsubscribeL(this); - iOtgStateObserver->UnsubscribeL(this); - iBusActivityObserver->UnsubscribeL(this); - iHostEventNotificationObserver->UnsubscribeL(this); - iMessageNotificationObserver->UnsubscribeL(this); - - iHostState->JustBeforeLeavingThisStateL(); - - iHostState = NULL; + ChangeHostStateL(EUsbStateHostUndefined); iNotifManager->CloseAllNotifiers(); @@ -344,7 +367,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); - HandleHostProblemL(EUsbWatcherIdPinError); + HandleHostProblemL(EUsbWatcherIdPinError, EUsbStateHostHandle); } @@ -379,7 +402,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::VBusObserverErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); - HandleHostProblemL(EUsbWatcherVBusObserverError); + HandleHostProblemL(EUsbWatcherVBusObserverError, EUsbStateHostHandle); } // From OTG state observer @@ -468,7 +491,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::OtgStateErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); -HandleHostProblemL(EUsbWatcherOtgStateError); +HandleHostProblemL(EUsbWatcherOtgStateError, EUsbStateHostHandle); } // From bus activity observer @@ -569,7 +592,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::HostEventNotificationErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); -HandleHostProblemL(EUsbWatcherHostEventNotificationError); +HandleHostProblemL(EUsbWatcherHostEventNotificationError, EUsbStateHostHandle); } // From message notification observer @@ -636,7 +659,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::MessageNotificationErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); - HandleHostProblemL(EUsbWatcherMessageNotificationError); + HandleHostProblemL(EUsbWatcherMessageNotificationError, EUsbStateHostHandle); } // --------------------------------------------------------------------------- @@ -735,11 +758,12 @@ // // --------------------------------------------------------------------------- // -CUsbStateHostHandle* CUsbOtgWatcher::HostHandle() const +CUsbStateHostHandle* CUsbOtgWatcher::HostHandle(TUsbStateIds aInState) const { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::HostHandle" ) ); - __ASSERT_DEBUG(iStates[EUsbStateHostHandle] != NULL, Panic(EBadState)); - return (CUsbStateHostHandle*) iStates[EUsbStateHostHandle]; + __ASSERT_DEBUG(iStates[aInState] != NULL, Panic(EBadState)); + + return (CUsbStateHostHandle*) iStates[aInState]; } // --------------------------------------------------------------------------- @@ -883,7 +907,10 @@ default: // handle the issue { - HandleHostProblemL(EUsbWatcherCanNotStartUsbServices); + if(IsDeviceA()) // if there is no cable, give up + { + HandleHostProblemL(EUsbWatcherCanNotStartUsbServices, EUsbStateHostHandle); + } return; } } @@ -894,7 +921,7 @@ if (KErrNone != err) { FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompleted Error when requesting GetServiceState = %d" ), err)); - HandleHostProblemL(EUsbWatcherCanNotStartUsbServices); + HandleHostProblemL(EUsbWatcherCanNotStartUsbServices, EUsbStateHostHandle); return; } @@ -915,12 +942,6 @@ iHostState->JustAdvancedToThisStateL(); // do any initial activity, once advanced to the state - iVBusObserver->SubscribeL(this); - iOtgStateObserver->SubscribeL(this); - iBusActivityObserver->SubscribeL(this); - iHostEventNotificationObserver->SubscribeL(this); - iMessageNotificationObserver->SubscribeL(this); - break; } case EUsbServiceStarting: @@ -928,12 +949,14 @@ FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompletedL UsbServiceState == EUsbServiceStarting" ) ); // should not receive that, due to call back is called when service stopped or started // therefore scream + // no break statement here } case EUsbServiceStopping: { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompletedL UsbServiceState == EUsbServiceStopping" ) ); // should not receive that, due to call back is called when service stopped or started // therefore scream + // no break statement here } case EUsbServiceFatalError: { @@ -1014,12 +1037,13 @@ FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Creating states." ) ); - User::LeaveIfError(iStates.Append(CUsbState::NewL(this))); + User::LeaveIfError(iStates.Append(CUsbStateHostUndefined::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAInitiate::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAHost::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAPeripheral::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostAIdle::NewL(this))); User::LeaveIfError(iStates.Append(CUsbStateHostHandle::NewL(this))); + User::LeaveIfError(iStates.Append(CUsbStateHostDelayHandle::NewL(this))); FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Check State()" ) ); @@ -1081,11 +1105,18 @@ // // --------------------------------------------------------------------------- // -void CUsbOtgWatcher::SubscribeL(MUsbOtgWatcherStateObserver* aObserver) +void CUsbOtgWatcher::SubscribeL(MUsbOtgWatcherStateObserver& aObserver) { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SubscribeL" ) ); - User::LeaveIfError(iOtgStateObservers.Append(aObserver)); + // check if the same observer already exist in a list + if(KErrNotFound != iOtgStateObservers.Find(&aObserver)) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SubscribeL Observer already exists." ) ); + Panic(EObserverAlreadyExists); + return; + } + iOtgStateObservers.AppendL(&aObserver); } @@ -1093,26 +1124,16 @@ // // --------------------------------------------------------------------------- // -void CUsbOtgWatcher::UnsubscribeL(MUsbOtgWatcherStateObserver* aObserver) +void CUsbOtgWatcher::UnsubscribeL(MUsbOtgWatcherStateObserver& aObserver) { FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UnsubscribeL" ) ); - if (0 == iOtgStateObservers.Count()) // no items - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UnsubscribeL No observers" ) ); - return; - } - - TInt i(0); - while (i < iOtgStateObservers.Count() && aObserver != iOtgStateObservers[i]) - ++i; - - if (aObserver == iOtgStateObservers[i]) // found - { + TInt i(iOtgStateObservers.Find(&aObserver)); + if(KErrNotFound == i) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbIdPinObserver::UnsubscribeL Observer not found." ) ); + Panic(ECanNotFindUsbOtgWatcherStateObserver); + return; + } + iOtgStateObservers.Remove(i); - } - else - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UnsubscribeL CanNotGetUsbOtgStateWatcherObserver" ) ); - Panic(ECanNotFindUsbOtgWatcherStateObserver); - } }