diff -r 7858bc6ead78 -r 9d8b04ca6939 usbengines/usbotgwatcher/src/cusbstatehosthandledropping.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usbengines/usbotgwatcher/src/cusbstatehosthandledropping.cpp Fri Jun 04 10:27:39 2010 +0100 @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2008 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 "cusbotgwatcher.h" +#include "cusbstatehosthandledropping.h" + +#ifndef STIF +#include "cusbnotifmanager.h" +#else +#include "mockcusbnotifmanager.h" +#endif + +#include "errors.h" +#include "debug.h" +#include "panic.h" + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CUsbStateHostHandleDropping::CUsbStateHostHandleDropping( + CUsbOtgWatcher& aWatcher) : + CUsbStateHostHandle(aWatcher) + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CUsbStateHostHandleDropping* CUsbStateHostHandleDropping::NewL( + CUsbOtgWatcher& aWatcher) + { + LOG_FUNC + + CUsbStateHostHandleDropping* self = + new (ELeave) CUsbStateHostHandleDropping(aWatcher); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::ConstructL() + { + LOG_FUNC + CUsbStateHostHandle::ConstructL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CUsbStateHostHandleDropping::~CUsbStateHostHandleDropping() + { + LOG_FUNC + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TUsbStateIds CUsbStateHostHandleDropping::Id() + { + return EUsbStateHostHandleDropping; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::JustBeforeLeavingThisStateL() + { + LOG_FUNC + + iWatcher.NotifManager()->CloseAllNotifiers(); + + // do general things + CUsbStateHostHandle::JustBeforeLeavingThisStateL(); + } + +// this means only one wait notifier at a time can be shown by this state +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::WaitNotifierCompletedL(TInt /*aFeedback*/) + { + LOG_FUNC + + switch (iWhat) + { + case EUsbWatcherHubsNotSupported: + { + LOG( "EUsbWatcherHubsNotSupported" ); + ChangeHostStateL( EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrDeviceRequiresTooMuchPower: + { + LOG( "EUsbWatcherErrDeviceRequiresTooMuchPower" ); + ChangeHostStateL( EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrUnsupportedDevice: + { + LOG("EUsbWatcherErrUnsupportedDevice" ); + ChangeHostStateL( EUsbStateHostAInitiate); + break; + } + case EUsbWatcherConnectedToOTG: + { + LOG("EUsbWatcherConnectedToOTG" ); + ChangeHostStateL( EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrDandlingCable: + { + LOG("EUsbWatcherErrDandlingCable" ); + ChangeHostStateL( EUsbStateHostAInitiate); + break; + } + case EUsbWatcherNoActivity: + { + LOG("EUsbWatcherNoActivity" ); + ChangeHostStateL( EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrorInConnection: + { + LOG( "EUsbWatcherErrorInConnection" ); + ChangeHostStateL( EUsbStateHostAInitiate); + break; + } + + // fatal errors + case EUsbWatcherCanNotStartUsbServices: + { + LOG( "EUsbWatcherCanNotStartUsbServices" ); + + // no break here + } + + // no break statement for following cases + case EUsbWatcherNoMemory: + case EUsbWatcherIdPinError: + case EUsbWatcherVBusObserverError: + case EUsbWatcherHostEventNotificationError: + case EUsbWatcherOtgStateError: + case EUsbWatcherMessageNotificationError: + case EUsbWatcherCanNotStartSession: + case EUsbWatcherCanNotEnableDriverLoading: + case EUsbWatcherCanNotClearBusError: + case EUsbWatcherCanNotRaiseVBus: + { + LOG("Fatal error" ); + ChangeHostStateL( EUsbStateHostUndefined); + break; + } + default: + { + LOG1("Unexpected situation to be handled iWhat = %d" , iWhat ); + PANIC( EUnexpectedSituationToHandle); + break; + } + + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::DoHandleL() + { + LOG_FUNC + + LOG1( "iWhat = %d" , iWhat); + + // Drop VBus first + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher.Usb().BusDrop(); + + switch (iWhat) + { + + case EUsbWatcherHubsNotSupported: + { + LOG("EUsbWatcherHubsNotSupported" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgHubUnsupported, this); + break; + } + case EUsbWatcherErrDeviceRequiresTooMuchPower: + { + LOG("EUsbWatcherErrDeviceRequiresTooMuchPower" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgTooMuchPower, this); + break; + } + case EUsbWatcherErrUnsupportedDevice: + { + LOG("EUsbWatcherErrUnsupportedDevice" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgUnsupportedDevice, this); + break; + } + case EUsbWatcherConnectedToOTG: + { + LOG("EUsbWatcherConnectedToOTG" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgUnsupportedDevice, this); + + break; + } + case EUsbWatcherErrDandlingCable: + { + LOG( "EUsbWatcherErrDandlingCable" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorAttachTimedOut, this); + break; + } + case EUsbWatcherNoActivity: + { + LOG( "EUsbWatcherNoActivity" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgUnsupportedDevice, this); + + break; + } + case EUsbWatcherErrorInConnection: + { + LOG("EUsbWatcherErrorInConnection" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorInConnection, this); + break; + } + case EUsbWatcherNoMemory: + { + LOG("EUsbWatcherNoMemory" ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorNoMemory, this); + break; + } + case EUsbWatcherCanNotStartUsbServices: + { + LOG("EUsbWatcherCanNotStartUsbServices" ); + // no break here + } + // no break in following cases + case EUsbWatcherIdPinError: + case EUsbWatcherVBusObserverError: + case EUsbWatcherHostEventNotificationError: + case EUsbWatcherOtgStateError: + case EUsbWatcherMessageNotificationError: + case EUsbWatcherCanNotStartSession: + case EUsbWatcherCanNotEnableDriverLoading: + case EUsbWatcherCanNotClearBusError: + case EUsbWatcherCanNotRaiseVBus: + { + LOG1( "Fatal error iWhat = %d", iWhat ); + iWatcher.NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorInConnection, this); + break; + } + default: + { + LOG1("Unexpected situation to be handled iWhat = %d", iWhat ); + PANIC( EUnexpectedSituationToHandle); + break; + } + } + } + +///////////////////////////////////////////////////////////////////////////////////// +// From VBus observer +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::VBusUpL() + { + LOG_FUNC + ChangeHostStateL( EUsbStateHostAInitiate); + } + +// --------------------------------------------------------------------------- +// this is expected in the state, for example after calling BusDrop +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::VBusDownL() + { + LOG_FUNC + } + +// From Host Event notification observer +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::AVBusErrorL() + { + LOG_FUNC + iWatcher.Usb().BusClearError(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::DeviceAttachedL( + TDeviceEventInformation aDevEventInfo) + { + LOG_FUNC + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::DeviceDetachedL(TDeviceEventInformation) + { + LOG_FUNC + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::DriverLoadSuccessL(TDeviceEventInformation) + { + LOG_FUNC + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::DriverLoadPartialSuccessL( + TDeviceEventInformation) + { + LOG_FUNC + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::DriverLoadFailureL(TDeviceEventInformation) + { + LOG_FUNC + } + +// From message notification observer +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::MessageNotificationReceivedL(TInt aMessage) + { + LOG_FUNC + + LOG1( "aMessage = %d", aMessage ) + + switch (aMessage) + { + // USBDI + case KEventUsbBadDeviceDetached: + { + LOG("BadDeviceDetached" ); + ChangeHostStateL( EUsbStateHostUndefined); + break; + } + default: + { + LOG1( "Unhandled message aMessage = %d" , aMessage); + break; + } + + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandleDropping::VBusErrorL() + { + LOG_FUNC + iWatcher.Usb().BusClearError(); + }