diff -r 7e15987c4500 -r 8c311f9acc5e usbengines/usbotgwatcher/src/cusbotgwatcher.cpp --- a/usbengines/usbotgwatcher/src/cusbotgwatcher.cpp Tue Feb 02 00:52:37 2010 +0200 +++ b/usbengines/usbotgwatcher/src/cusbotgwatcher.cpp Fri Mar 19 09:48:52 2010 +0200 @@ -1,46 +1,42 @@ /* -* Copyright (c) 2008-2009 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: Implementation + * Copyright (c) 2008-2009 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: Implementation + * + */ #include #include #include - #include "cusbotgwatcher.h" #include "cusbstate.h" - #include "cusbstatehostainitiate.h" #include "cusbstatehostahost.h" #include "cusbstatehostaperipheral.h" -#include "cusbstatehostaidle.h" #include "cusbstatehosthandle.h" - +#include "cusbstatehostdelayhandle.h" +#include "cusbstatehostdelayattachedhandle.h" +#include "cusbstatehostdelaynotattachedhandle.h" +#include "cusbstatehosthandledropping.h" +#include "cusbstatehostundefined.h" #include "cusbwarningnotifier.h" - #ifndef STIF #include "cusbnotifmanager.h" #else #include "mockcusbnotifmanager.h" #endif - #include "errors.h" #include "debug.h" #include "panic.h" - _LIT_SECURITY_POLICY_PASS( KAlwaysPassPolicy ); _LIT_SECURITY_POLICY_C1( KLocalServicesPolicy, ECapabilityLocalServices ); @@ -49,9 +45,10 @@ // --------------------------------------------------------------------------- // CUsbOtgWatcher::CUsbOtgWatcher(RUsb& aUsbMan) : - iUsb(aUsbMan), iPersonalityId(KUsbPersonalityIdMTP) + iUsb(aUsbMan), iPersonalityId(KUsbPersonalityIdMTP), iUsbServiceRequest( + CUsbServiceControl::ERequestUndefined) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::CUsbOtgWatcher" ) ); + LOG_FUNC } // --------------------------------------------------------------------------- @@ -60,31 +57,35 @@ // void CUsbOtgWatcher::ConstructL() { - - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::ConstructL" ) ); + LOG_FUNC #ifdef _DEBUG SelfTestL(); #endif #ifndef STIF - User::LeaveIfError(RProperty::Define( KPSUidUsbWatcher, - KUsbWatcherIsPeripheralConnected, RProperty::EInt, KAlwaysPassPolicy, - KLocalServicesPolicy ) ); + User::LeaveIfError(RProperty::Define(KPSUidUsbWatcher, + KUsbWatcherIsPeripheralConnected, RProperty::EInt, + KAlwaysPassPolicy, KLocalServicesPolicy)); - User::LeaveIfError( RProperty::Set( KPSUidUsbWatcher, + User::LeaveIfError(RProperty::Set(KPSUidUsbWatcher, KUsbWatcherIsPeripheralConnected, - KUsbWatcherPeripheralIsNotConnected ) ); + KUsbWatcherPeripheralIsNotConnected)); #endif - - iUsbServiceControl = CUsbServiceControl::NewL(this, iUsb); + + iUsbServiceControl = CUsbServiceControl::NewL(*this, iUsb); - User::LeaveIfError(iStates.Append(CUsbState::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(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(CUsbStateHostDelayAttachedHandle::NewL( + *this))); + User::LeaveIfError(iStates.Append( + CUsbStateHostDelayNotAttachedHandle::NewL(*this))); + User::LeaveIfError(iStates.Append( + CUsbStateHostHandleDropping::NewL(*this))); iIdPinObserver = CUsbIdPinObserver::NewL(); iVBusObserver = CUsbVBusObserver::NewL(); @@ -94,14 +95,19 @@ &iUsb); 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); + 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()) { @@ -128,7 +134,7 @@ // EXPORT_C CUsbOtgWatcher* CUsbOtgWatcher::NewL(RUsb& aUsbMan) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::NewL" ) ); + LOG_FUNC CUsbOtgWatcher* self = new (ELeave) CUsbOtgWatcher(aUsbMan); CleanupStack::PushL(self); @@ -143,15 +149,41 @@ // CUsbOtgWatcher::~CUsbOtgWatcher() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::~CUsbOtgWatcher" ) ); - + LOG_FUNC + #ifndef STIF - RProperty::Delete( KPSUidUsbWatcher, KUsbWatcherIsPeripheralConnected ); + RProperty::Delete(KPSUidUsbWatcher, KUsbWatcherIsPeripheralConnected); #endif - + // 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; @@ -160,11 +192,11 @@ delete iMessageNotificationObserver; iOtgStateObservers.Close(); - + // Destroy states iStates.ResetAndDestroy(); iStates.Close(); - + delete iUsbServiceControl; iUsb.Close(); @@ -178,8 +210,9 @@ void CUsbOtgWatcher::SetPersonalityL(TRequestStatus& /*aStatus*/, TInt aPersonality) { + LOG_FUNC - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SetPersonalityL aPersonality = %d" ), aPersonality)); + LOG1( "aPersonality = %d" , aPersonality); // watcher keeps this value, no need to pass it to request object // state can read it from watcher when needed @@ -199,7 +232,7 @@ // void CUsbOtgWatcher::CancelSetPersonalityL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::CancelSetPersonalityL" ) ); + LOG_FUNC iState->CancelSetPersonalityL(); } @@ -210,7 +243,7 @@ // void CUsbOtgWatcher::SetPreviousPersonalityL(TRequestStatus& /*aStatus*/) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SetPreviousPersonalityL" ) ); + LOG_FUNC // maybe more complex processing needed here iState->SetPreviousPersonalityL(); @@ -222,7 +255,7 @@ // void CUsbOtgWatcher::SetPreviousPersonalityL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SetPreviousPersonalityL" ) ); + LOG_FUNC iState->SetPreviousPersonalityL(); } @@ -233,7 +266,7 @@ // void CUsbOtgWatcher::CancelSetPreviousPersonalityL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::CancelSetPreviousPersonalityL" ) ); + LOG_FUNC iState->CancelSetPreviousPersonalityL(); } @@ -244,7 +277,7 @@ // void CUsbOtgWatcher::SetPreviousPreviousPersonalityOnDisconnectL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SetPreviousPreviousPersonalityOnDisconnectL" ) ); + LOG_FUNC } @@ -255,19 +288,22 @@ // void CUsbOtgWatcher::StartSessionL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::StartSessionL" ) ); + LOG_FUNC if (!CanStartSessionL()) { - HandleHostProblemL(EUsbWatcherErrorInConnection); + HandleHostProblemL(EUsbWatcherCanNotStartSession, + EUsbStateHostHandleDropping); return; } + iUsbServiceRequest = CUsbServiceControl::EStartUsbService; TInt err = iUsbServiceControl->StartL(iPersonalityId); if (KErrNone != err) { - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::StartSessionL Can not start usb services. reason = %d" ), err)); - HandleHostProblemL(EUsbWatcherCanNotStartUsbServices); + LOG1( "Can not start usb services. err = %d" , err); + HandleHostProblemL(EUsbWatcherCanNotStartUsbServices, + EUsbStateHostHandleDropping); return; } @@ -280,11 +316,12 @@ // // --------------------------------------------------------------------------- // -void CUsbOtgWatcher::HandleHostProblemL(TInt aWhatKindOf) +void CUsbOtgWatcher::HandleHostProblemL(TInt aWhatKindOf, + TUsbStateIds aInState) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::HandleProblemL" ) ); - HostHandle()->SetWhat(aWhatKindOf); - ChangeHostStateL(EUsbStateHostHandle); + LOG_FUNC + HostHandle(aInState)->SetWhat(aWhatKindOf); + ChangeHostStateL(aInState); } // --------------------------------------------------------------------------- @@ -293,7 +330,7 @@ // void CUsbOtgWatcher::IdPinOnL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinOnL" ) ); + LOG_FUNC StartSessionL(); } @@ -303,37 +340,24 @@ // void CUsbOtgWatcher::IdPinOffL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinOffL" ) ); - - // for example, USB failed to start - if(NULL == iHostState) return; + LOG_FUNC - iVBusObserver->UnsubscribeL(this); - iOtgStateObserver->UnsubscribeL(this); - iBusActivityObserver->UnsubscribeL(this); - iHostEventNotificationObserver->UnsubscribeL(this); - iMessageNotificationObserver->UnsubscribeL(this); - - iHostState->JustBeforeLeavingThisStateL(); - - iHostState = NULL; + ChangeHostStateL(EUsbStateHostUndefined); iNotifManager->CloseAllNotifiers(); - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinOffL Before DisableFunctionDriverLoad " ) ); Usb().DisableFunctionDriverLoading(); - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinOffL Before TryStop" ) ); + iUsbServiceRequest = CUsbServiceControl::EStopUsbService; + TInt err = iUsbServiceControl->StopL(); - TInt err = iUsbServiceControl->StopL(); + LOG1( "iUsbServiceControl->Stop() err = %d", err ); if (KErrNone != err) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinOnL ErrorStoppingUsbServices" ) ); + LOG( "ErrorStoppingUsbServices" ); Panic(ECanNotStopUsbServices); } - - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinOffL iUsbServiceControl->Stop() OK" ) ); } // --------------------------------------------------------------------------- @@ -342,9 +366,8 @@ // void CUsbOtgWatcher::IdPinErrorL(TInt aError) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::IdPinErrorL" ) ); - __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); - HandleHostProblemL(EUsbWatcherIdPinError); + __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); + HandleHostProblemL(EUsbWatcherIdPinError, EUsbStateHostHandleDropping); } @@ -355,7 +378,6 @@ // void CUsbOtgWatcher::VBusDownL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::VBusDownL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->VBusDownL(); } @@ -366,7 +388,6 @@ // void CUsbOtgWatcher::VBusUpL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::VBusUpL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->VBusUpL(); } @@ -377,9 +398,9 @@ // void CUsbOtgWatcher::VBusObserverErrorL(TInt aError) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::VBusObserverErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); - HandleHostProblemL(EUsbWatcherVBusObserverError); + HandleHostProblemL(EUsbWatcherVBusObserverError, + EUsbStateHostHandleDropping); } // From OTG state observer @@ -389,7 +410,6 @@ // void CUsbOtgWatcher::AIdleL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::AIdleL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->AIdleL(); } @@ -400,7 +420,6 @@ // void CUsbOtgWatcher::AHostL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::AHostL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->AHostL(); } @@ -411,7 +430,6 @@ // void CUsbOtgWatcher::APeripheralL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::APeripheralL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->APeripheralL(); } @@ -422,7 +440,6 @@ // void CUsbOtgWatcher::AVBusErrorL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::AVBusErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->AVBusErrorL(); } @@ -433,7 +450,6 @@ // void CUsbOtgWatcher::BIdleL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::BIdleL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->BIdleL(); } @@ -444,7 +460,6 @@ // void CUsbOtgWatcher::BPeripheralL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::BPeripheralL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->BPeripheralL(); } @@ -455,7 +470,6 @@ // void CUsbOtgWatcher::BHostL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::BHostL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->BHostL(); } @@ -466,9 +480,8 @@ // void CUsbOtgWatcher::OtgStateErrorL(TInt aError) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::OtgStateErrorL" ) ); -__ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); -HandleHostProblemL(EUsbWatcherOtgStateError); + __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); + HandleHostProblemL(EUsbWatcherOtgStateError, EUsbStateHostHandleDropping); } // From bus activity observer @@ -478,7 +491,6 @@ // void CUsbOtgWatcher::BusIdleL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::BusIdleL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->BusIdleL(); } @@ -489,7 +501,6 @@ // void CUsbOtgWatcher::BusActiveL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::BusActiveL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->BusActiveL(); } @@ -500,7 +511,6 @@ // void CUsbOtgWatcher::BusActivityErrorL(TInt aError) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::BusActivityErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); // no action, continue } @@ -512,7 +522,6 @@ // void CUsbOtgWatcher::DeviceAttachedL(TDeviceEventInformation aTdi) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::DeviceAttachedL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->DeviceAttachedL(aTdi); } @@ -523,7 +532,6 @@ // void CUsbOtgWatcher::DeviceDetachedL(TDeviceEventInformation aTdi) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::DeviceDetachedL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->DeviceDetachedL(aTdi); } @@ -534,7 +542,6 @@ // void CUsbOtgWatcher::DriverLoadSuccessL(TDeviceEventInformation aTdi) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::DriverLoadSuccessL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->DriverLoadSuccessL(aTdi); } @@ -545,7 +552,6 @@ // void CUsbOtgWatcher::DriverLoadPartialSuccessL(TDeviceEventInformation aTdi) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::DriverLoadPartialSuccessL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->DriverLoadPartialSuccessL(aTdi); } @@ -556,7 +562,6 @@ // void CUsbOtgWatcher::DriverLoadFailureL(TDeviceEventInformation aTdi) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::DriverLoadFailureL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->DriverLoadFailureL(aTdi); } @@ -567,9 +572,9 @@ // void CUsbOtgWatcher::HostEventNotificationErrorL(TInt aError) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::HostEventNotificationErrorL" ) ); -__ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); -HandleHostProblemL(EUsbWatcherHostEventNotificationError); + __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); + HandleHostProblemL(EUsbWatcherHostEventNotificationError, + EUsbStateHostHandleDropping); } // From message notification observer @@ -579,7 +584,6 @@ // void CUsbOtgWatcher::MessageNotificationReceivedL(TInt aMessage) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::MessageNotificationReceivedL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->MessageNotificationReceivedL(aMessage); } @@ -590,7 +594,6 @@ // void CUsbOtgWatcher::BadHubPositionL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::BadHubPositionL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->BadHubPositionL(); } @@ -601,7 +604,6 @@ // void CUsbOtgWatcher::VBusErrorL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::VBusErrorL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->VBusErrorL(); } @@ -612,7 +614,6 @@ // void CUsbOtgWatcher::SrpReceivedL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SrpReceivedL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->SrpReceivedL(); } @@ -623,7 +624,6 @@ // void CUsbOtgWatcher::SessionRequestedL() { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SessionRequestedL" ) ); __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); iHostState->SessionRequestedL(); } @@ -634,9 +634,9 @@ // void CUsbOtgWatcher::MessageNotificationErrorL(TInt aError) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::MessageNotificationErrorL" ) ); - __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); - HandleHostProblemL(EUsbWatcherMessageNotificationError); + __ASSERT_DEBUG(iHostState != NULL, Panic(EBadHostState)); + HandleHostProblemL(EUsbWatcherMessageNotificationError, + EUsbStateHostHandleDropping); } // --------------------------------------------------------------------------- @@ -735,11 +735,11 @@ // // --------------------------------------------------------------------------- // -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]; } // --------------------------------------------------------------------------- @@ -748,20 +748,13 @@ // void CUsbOtgWatcher::ChangeStateL(TUsbStateIds aNewStateId) { + LOG_FUNC - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::ChangeStateL aNewState = %d" ), aNewStateId)); + LOG1( "aNewState = %d" , aNewStateId); if (NULL != iState) { - if (aNewStateId == iState->Id()) - { - return; // we already in the target state - } - else - { - - iState->JustBeforeLeavingThisStateL(); - } + iState->JustBeforeLeavingThisStateL(); } // sets new state @@ -785,20 +778,13 @@ // void CUsbOtgWatcher::ChangeHostStateL(TUsbStateIds aNewStateId) { + LOG_FUNC - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::ChangeHostStateL aNewState = %d" ), aNewStateId)); + LOG1( "aNewState = %d", aNewStateId); if (NULL != iHostState) { - if (aNewStateId == iHostState->Id()) - { - return; // we already in the target state - } - else - { - - iHostState->JustBeforeLeavingThisStateL(); - } + iHostState->JustBeforeLeavingThisStateL(); } // set new state @@ -813,7 +799,7 @@ __ASSERT_DEBUG(iHostState != NULL, Panic(EBadState)); iHostState->JustAdvancedToThisStateL(); // checks if there are conditions for advancing to another state(s) - + // notify state change to observers for (TInt i(0); i < iOtgStateObservers.Count(); ++i) { @@ -837,18 +823,19 @@ // void CUsbOtgWatcher::PrintStateToLog() { - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::PrintStateToLog IdPin = %d" ), iIdPinObserver->IdPin())); - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::PrintStateToLog VBus = %d" ), iVBusObserver->VBus())); - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::PrintStateToLog OtgState = %d" ), iOtgStateObserver->OtgState())); - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::PrintStateToLog BusActivity = %d" ), iBusActivityObserver->BusActivity())); - - TInt isPeripheralConnected(KUsbWatcherPeripheralIsNotConnected); - - RProperty::Get( KPSUidUsbWatcher, KUsbWatcherIsPeripheralConnected, - isPeripheralConnected ); - - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::PrintStateToLog IsPeripheralConnected = %d" ), isPeripheralConnected)); - + LOG1( "Current state id = %d" , iHostState->Id()); + LOG1( "IdPin = %d" , iIdPinObserver->IdPin()); + LOG1( "VBus = %d" , iVBusObserver->VBus()); + LOG1( "OtgState = %d" , iOtgStateObserver->OtgState()); + LOG1( "BusActivity = %d" , iBusActivityObserver->BusActivity()); + + TInt isPeripheralConnected(KUsbWatcherPeripheralIsNotConnected); + + RProperty::Get(KPSUidUsbWatcher, KUsbWatcherIsPeripheralConnected, + isPeripheralConnected); + + LOG1( "IsPeripheralConnected = %d" , isPeripheralConnected); + } // --------------------------------------------------------------------------- @@ -866,35 +853,46 @@ // void CUsbOtgWatcher::UsbServiceControlReqCompletedL(TInt aError) { - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompleted Error returned by UsbServiceControl = %d" ), aError)); - - switch(aError) - { - case KErrInUse: - // usb services already started (this might happen if more than one idpin on event come) + LOG_FUNC + + LOG1( "aError = %d" , aError); + + switch (aError) { - return; + case KErrInUse: + // usb services already started (this might happen if more than one idpin on event come) + { + return; + } + + case KErrNone: + { + break; // do normal routine + } + + default: // handle the issue + { + if (iUsbServiceRequest == CUsbServiceControl::EStartUsbService) // Handle only start issues + { + HandleHostProblemL(EUsbWatcherCanNotStartUsbServices, + EUsbStateHostHandleDropping); + } + + iUsbServiceRequest = CUsbServiceControl::ERequestUndefined; + return; + } } - - case KErrNone: - { - break; // do normal routine - } - - default: // handle the issue - { - HandleHostProblemL(EUsbWatcherCanNotStartUsbServices); - return; - } - } + + iUsbServiceRequest = CUsbServiceControl::ERequestUndefined; TUsbServiceState serviceState; TInt err = iUsb.GetServiceState(serviceState); if (KErrNone != err) { - FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompleted Error when requesting GetServiceState = %d" ), err)); - HandleHostProblemL(EUsbWatcherCanNotStartUsbServices); + LOG1( "Error when requesting GetServiceState = %d" , err); + HandleHostProblemL(EUsbWatcherCanNotStartUsbServices, + EUsbStateHostHandleDropping); return; } @@ -902,42 +900,36 @@ { case EUsbServiceIdle: // just stopped usb service { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompletedL UsbServiceState == EUsbServiceIdle" ) ); + LOG("UsbServiceState == EUsbServiceIdle" ); // do nothing break; } case EUsbServiceStarted: // just started usb service { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompletedL UsbServiceState == EUsbServiceStarted" ) ); - - iHostState = iStates[EUsbStateHostAInitiate]; - - iHostState->JustAdvancedToThisStateL(); // do any initial activity, once advanced to the state + LOG( "UsbServiceState == EUsbServiceStarted" ); - iVBusObserver->SubscribeL(this); - iOtgStateObserver->SubscribeL(this); - iBusActivityObserver->SubscribeL(this); - iHostEventNotificationObserver->SubscribeL(this); - iMessageNotificationObserver->SubscribeL(this); + ChangeHostStateL(EUsbStateHostAInitiate); break; } case EUsbServiceStarting: { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompletedL UsbServiceState == EUsbServiceStarting" ) ); + LOG("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" ) ); + LOG("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: { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UsbServiceControlReqCompletedL UsbServiceState == EUsbServiceFatalError" ) ); + LOG( "UsbServiceState == EUsbServiceFatalError" ); Panic(EUnexpectedUsbServiceState); break; } @@ -947,7 +939,6 @@ Panic(EUnknownUsbServiceState); } } - } // --------------------------------------------------------------------------- @@ -957,21 +948,19 @@ TInt CUsbOtgWatcher::SelfTestL() { #ifdef _DEBUG - - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Creating observers." ) ); + LOG_FUNC // create all the observers iIdPinObserver = CUsbIdPinObserver::NewL(); iVBusObserver = CUsbVBusObserver::NewL(); iOtgStateObserver = CUsbOtgStateObserver::NewL(); - iBusActivityObserver = - CUsbBusActivityObserver::NewL(); - iHostEventNotificationObserver = - CUsbHostEventNotificationObserver::NewL(&iUsb); - iMessageNotificationObserver = - CUsbMessageNotificationObserver::NewL(&iUsb); + iBusActivityObserver = CUsbBusActivityObserver::NewL(); + iHostEventNotificationObserver = CUsbHostEventNotificationObserver::NewL( + &iUsb); + iMessageNotificationObserver = CUsbMessageNotificationObserver::NewL( + &iUsb); - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Observers getters." ) ); + LOG( "Observers getters" ); if (iIdPinObserver != IdPinObserver()) { @@ -998,11 +987,11 @@ User::Leave(KErrGeneral); } - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Observers destructors." ) ); + LOG( "Observers destructors" ); // idpinobserver is deleted later // Vbus observer is deleted later - + delete iOtgStateObserver; iOtgStateObserver = 0; delete iBusActivityObserver; @@ -1012,68 +1001,72 @@ delete iMessageNotificationObserver; iMessageNotificationObserver = 0; - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Creating states." ) ); + LOG("Creating states"); - User::LeaveIfError(iStates.Append(CUsbState::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(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(CUsbStateHostDelayAttachedHandle::NewL( + *this))); + User::LeaveIfError(iStates.Append( + CUsbStateHostDelayNotAttachedHandle::NewL(*this))); + User::LeaveIfError(iStates.Append( + CUsbStateHostHandleDropping::NewL(*this))); - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Check State()" ) ); + LOG("Check State()" ); if (iStates[EUsbStateHostAInitiate] != State(EUsbStateHostAInitiate)) { User::Leave(KErrGeneral); } - - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Check CurrentHostState()" ) ); - + + LOG("Check CurrentHostState()" ); + iHostState = iStates[EUsbStateHostAInitiate]; - - if (iStates[EUsbStateHostAInitiate] != CurrentHostState()) + + if (iStates[EUsbStateHostAInitiate] != CurrentHostState()) { User::Leave(KErrGeneral); } - - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL NotifManager and WarningNotifier." ) ); - CUsbNotifManager* usbnotifmanager = CUsbNotifManager::NewL(this); + LOG("NotifManager and WarningNotifier." ); + + CUsbNotifManager* usbnotifmanager = CUsbNotifManager::NewL(*this); RNotifier rnotifier; User::LeaveIfError(rnotifier.Connect()); CUsbWarningNotifier* usbnotifier = CUsbWarningNotifier::NewL(rnotifier, - usbnotifmanager, EUsbOtgPartiallySupportedDevice); + *usbnotifmanager, EUsbOtgPartiallySupportedDevice); usbnotifier->IsFeedbackNeeded(); - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL NotifManager and WarningNotifier destruction." ) ); + LOG( "NotifManager and WarningNotifier destruction." ); delete usbnotifier; rnotifier.Close(); - delete usbnotifmanager; - + delete usbnotifmanager; + // VBus observer is deleted here, due to it is used by usbnotifmanager.usbindicatornotifier delete iVBusObserver; iVBusObserver = 0; - + // id pin observer is deleted here due to it is used by usbnotifmanager.usbindicatornotifier delete iIdPinObserver; iIdPinObserver = 0; - - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Destructing states." ) ); - + + LOG("Destructing states"); + iStates.ResetAndDestroy(); - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL Check UsbServiceControl" ) ); + LOG( "Check UsbServiceControl" ); - CUsbServiceControl* usbServiceControl = CUsbServiceControl::NewL(this, + CUsbServiceControl* usbServiceControl = CUsbServiceControl::NewL(*this, iUsb); usbServiceControl->RunError(KErrNone); delete usbServiceControl; - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SelfTestL All completed OK." ) ); + LOG("All completed OK" ); #endif - return KErrNone; + return KErrNone; } @@ -1081,11 +1074,18 @@ // // --------------------------------------------------------------------------- // -void CUsbOtgWatcher::SubscribeL(MUsbOtgWatcherStateObserver* aObserver) +void CUsbOtgWatcher::SubscribeL(MUsbOtgWatcherStateObserver& aObserver) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::SubscribeL" ) ); + LOG_FUNC - User::LeaveIfError(iOtgStateObservers.Append(aObserver)); + // check if the same observer already exist in a list + if (KErrNotFound != iOtgStateObservers.Find(&aObserver)) + { + LOG( "Observer already exists" ); + Panic(EObserverAlreadyExists); + return; + } + iOtgStateObservers.AppendL(&aObserver); } @@ -1093,26 +1093,17 @@ // // --------------------------------------------------------------------------- // -void CUsbOtgWatcher::UnsubscribeL(MUsbOtgWatcherStateObserver* aObserver) +void CUsbOtgWatcher::UnsubscribeL(MUsbOtgWatcherStateObserver& aObserver) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UnsubscribeL" ) ); - if (0 == iOtgStateObservers.Count()) // no items + LOG_FUNC + + TInt i(iOtgStateObservers.Find(&aObserver)); + if (KErrNotFound == i) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UnsubscribeL No observers" ) ); + LOG( "Observer not found" ); + Panic(ECanNotFindUsbOtgWatcherStateObserver); return; } - - TInt i(0); - while (i < iOtgStateObservers.Count() && aObserver != iOtgStateObservers[i]) - ++i; - if (aObserver == iOtgStateObservers[i]) // found - { - iOtgStateObservers.Remove(i); - } - else - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbOtgWatcher::UnsubscribeL CanNotGetUsbOtgStateWatcherObserver" ) ); - Panic(ECanNotFindUsbOtgWatcherStateObserver); - } + iOtgStateObservers.Remove(i); }