diff -r 000000000000 -r 1e05558e2206 usbclasses/usbobexclasscontroller/src/CUsbObexClassController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usbclasses/usbobexclasscontroller/src/CUsbObexClassController.cpp Thu Dec 17 09:14:30 2009 +0200 @@ -0,0 +1,262 @@ +/* +* Copyright (c) 2002 - 2006 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: Implements OBEX class controller +* +*/ + + +#include "CUsbObexClassController.h" +#include +#include +#include +#include //for CleanupResetAndDestroyPushL +// Panic category only used in debug builds +#ifdef _DEBUG +_LIT( KObexCcPanicCategory, "OBEXCC" ); +#endif + +#ifdef __FLOG_ACTIVE +_LIT8(KLogComponent, "UsbObexCc"); +#endif + +/** + * Panic codes for the USB OBEX Class Controller. + */ +enum TObexCCPanic + { + /** Illigal calling of asynchronous function */ + EBadAsynchronousCall = 0, + /** Start() called while in an illegal state */ + EBadApiCallStart = 1, + /** Stop() called while in an illegal state */ + EBadApiCallStop = 2, + }; + +// --------------------------------------------------------------------------- +// Constructs a CUsbObexClassController object. +// --------------------------------------------------------------------------- +// +CUsbObexClassController* CUsbObexClassController::NewL( + MUsbClassControllerNotify& aOwner) + { + LOG_STATIC_FUNC_ENTRY + + CUsbObexClassController* self = new (ELeave) CUsbObexClassController(aOwner); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CUsbObexClassController::CUsbObexClassController( + MUsbClassControllerNotify& aOwner) + : CUsbClassControllerPlugIn(aOwner, KObexClassPriority) + { + LOG_FUNC + iState = EUsbServiceIdle; + } + +// --------------------------------------------------------------------------- +// Method to perform second phase construction. +// --------------------------------------------------------------------------- +// +void CUsbObexClassController::ConstructL() + { + LOG_FUNC + iObexSM = CObexUSB::NewL(); + } + +// --------------------------------------------------------------------------- +// From class CUsbClassControllerPlugIn. +// Destructor +// --------------------------------------------------------------------------- +// +CUsbObexClassController::~CUsbObexClassController() + { + LOG_FUNC + Cancel(); + delete iObexSM; + } + +// --------------------------------------------------------------------------- +// From class CUsbClassControllerPlugIn. +// Called by UsbMan to start this class. +// --------------------------------------------------------------------------- +// +void CUsbObexClassController::Start(TRequestStatus& aStatus) + { + + LOG_FUNC + //Start() should never be called if started, starting or stopping (or in state EUsbServiceFatalError) + __ASSERT_DEBUG(iState == EUsbServiceIdle, _USB_PANIC(KObexCcPanicCategory, EBadApiCallStart)); + + // Start OBEX SM + iRequestStatus = &aStatus; + iState = EUsbServiceStarting; + aStatus = KRequestPending; + LOGTEXT(_L8("CUsbObexClassController::Start() calling ManageUSBService(ETrue)")); + iObexSM->ManageUSBServices(ETrue, iStatus); + SetActive(); + } + +// --------------------------------------------------------------------------- +// From class CUsbClassControllerPlugIn. +// Called by UsbMan to stop this class. +// --------------------------------------------------------------------------- +// +void CUsbObexClassController::Stop(TRequestStatus& aStatus) + { + + LOG_FUNC + LOGTEXT2(_L8("CUsbObexClassController::Stop iState = %d"), iState); + + //Stop() should never be called if stopping or starting (or in state EUsbServiceFatalError) + __ASSERT_DEBUG(iState == EUsbServiceStarted || iState == EUsbServiceIdle, _USB_PANIC(KObexCcPanicCategory, EBadApiCallStop)); + + //state may be idle after Cancel + if ( iState == EUsbServiceIdle ) + { + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + else + { + // Stop OBEX SM + iRequestStatus = &aStatus; + iState = EUsbServiceStopping; + aStatus = KRequestPending; + LOGTEXT(_L8("CUsbObexClassController::Stop() calling ManageUSBService(EFalse)")); + iObexSM->ManageUSBServices(EFalse, iStatus); + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// From class CActive. +// --------------------------------------------------------------------------- +// +void CUsbObexClassController::RunL() + { + + LOG_FUNC + if (iStatus != KErrNone) + { + LOGTEXT2(_L8("CUsbObexClassController::RunL() Error = %d"), iStatus.Int()); + User::RequestComplete(iRequestStatus, iStatus.Int()); + return; + } + LOGTEXT2(_L8("CUsbObexClassController::RunL() State is %d"), iState); + + switch (iState) + { + case EUsbServiceStarting: + iState = EUsbServiceStarted; + User::RequestComplete(iRequestStatus, KErrNone); + break; + + case EUsbServiceStopping: + iState = EUsbServiceIdle; + User::RequestComplete(iRequestStatus, KErrNone); + break; + + case EUsbServiceStarted: + case EUsbServiceIdle: + + default: + LOGTEXT(_L8("CUsbObexClassController::RunL() Error or Unknown State")); + break; + } + } + +// --------------------------------------------------------------------------- +// From class CUsbClassControllerPlugIn. +// Returns information about the interfaces supported by this class. +// --------------------------------------------------------------------------- +// +void CUsbObexClassController::GetDescriptorInfo(TUsbDescriptor& aDescriptorInfo) const + { + LOG_FUNC + TRAPD(ret, DoGetDescriptorInfoL(aDescriptorInfo)); + if(ret!=KErrNone) + { + LOGTEXT2(_L8("CUsbObexClassController::GetDescriptorInfo leave with code: %d"), ret); + } + } + +// --------------------------------------------------------------------------- +// Leave version of GetDescriptor info function for fit in Class Controller framework. +// Returns information about the interfaces supported by this class. +// --------------------------------------------------------------------------- +// +void CUsbObexClassController::DoGetDescriptorInfoL(TUsbDescriptor& aDescriptorInfo) const + { + LOG_FUNC + RImplInfoPtrArray implInfoArray; + CleanupResetAndDestroyPushL(implInfoArray); + TEComResolverParams resolverParams; + resolverParams.SetDataType(KSrcsTransportUSB); + resolverParams.SetWildcardMatch(EFalse); + REComSession::ListImplementationsL(KCSrcsInterfaceUid, resolverParams, implInfoArray); + + LOGTEXT2(_L8("CUsbObexClassController::DoGetDescriptorInfoL Number of Interfaces is %d"), + implInfoArray.Count()); + aDescriptorInfo.iNumInterfaces = (implInfoArray.Count())*KObexNumInterfaces; + aDescriptorInfo.iLength = 0; + + CleanupStack::PopAndDestroy(&implInfoArray); + } + +// --------------------------------------------------------------------------- +// From class CActive. +// Will only be called when an asynchronous request is currently active. +// --------------------------------------------------------------------------- +// +void CUsbObexClassController::DoCancel() + { + LOG_FUNC + + switch (iState) + { + case EUsbServiceStarting: + case EUsbServiceStopping: + iObexSM->CancelManageUSBServices(); + break; + + default: + __ASSERT_DEBUG( EFalse, _USB_PANIC(KObexCcPanicCategory, EBadAsynchronousCall) ); + break; + } + + iState = EUsbServiceIdle; + User::RequestComplete(iRequestStatus, KErrCancel); + } + +// --------------------------------------------------------------------------- +// From class CActive. +// Should return KErrNone to avoid an active scheduler panic. This function +// should never be called as there is another mechanism for catching errors. +// --------------------------------------------------------------------------- +// +TInt CUsbObexClassController::RunError(TInt aError) + { + LOG_FUNC + LOGTEXT2(_L8("CUsbObexClassController::RunError aError=%d"), aError); + return KErrNone; + } + +// End of File