diff -r d0791faffa3f -r f8e15b44d440 mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp --- a/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp Tue Feb 02 01:11:40 2010 +0200 +++ b/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp Fri Feb 19 23:40:44 2010 +0200 @@ -78,7 +78,7 @@ CMTPUsbConnection::~CMTPUsbConnection() { __FLOG(_L8("~CMTPUsbConnection - Entry")); - + // Terminate all endpoint data transfer activity. StopConnection(); @@ -91,11 +91,13 @@ StopUsb(); iNullBuffer.Close(); - if (iProtocolLayer) - { - iProtocolLayer->Unbind(*this); - } + if (iProtocolLayer != NULL) + { + BoundProtocolLayer().Unbind(*this); + } + iProtocolLayer = NULL; + __FLOG(_L8("~CMTPUsbConnection - Exit")); __FLOG_CLOSE; } @@ -331,21 +333,27 @@ __FLOG(_L8("TransactionCompleteL - Entry")); __FLOG_VA((_L8("DeviceState: 0x%x TransactionState: 0x%x"), iDeviceStatusCode, iBulkTransactionState)); - - if (iBulkTransactionState != ERequestPhase) - { - // Update the transaction state. - SetBulkTransactionState(EIdlePhase); - - // Update the device status - SetDeviceStatus(EMTPUsbDeviceStatusOK); - - // Clear the cancel flag. - iIsCancelReceived = EFalse; - - // Initiate the next request phase bulk data receive sequence. - InitiateBulkRequestSequenceL(); - } + + if (iBulkTransactionState != ERequestPhase) + { + // Update the transaction state. + SetBulkTransactionState(EIdlePhase); + // Update the device status + SetDeviceStatus(EMTPUsbDeviceStatusOK); + // Clear the cancel flag. + iIsCancelReceived = EFalse; + + if (ConnectionOpen()) + { + // Initiate the next request phase bulk data receive sequence. + InitiateBulkRequestSequenceL(); + } + else if (iIsResetRequestSignaled) + { + iIsResetRequestSignaled = EFalse; + StartConnectionL(); + } + } __FLOG(_L8("TransactionCompleteL - Exit")); } @@ -587,8 +595,7 @@ { TUint16 containerType(iUsbBulkContainer->Uint16L(CMTPUsbContainer::EContainerType)); -#ifdef _DEBUG - +#ifdef _DEBUG TUint16 transactionID(iUsbBulkContainer->Uint32L(CMTPUsbContainer::ETransactionID)); RDebug::Print(_L("Time Stamp is :%d"), User::TickCount()); RDebug::Print(_L("the container Type is 0x%x, the transaction ID is 0x%x\n"), containerType,transactionID); @@ -906,6 +913,8 @@ CMTPUsbConnection::CMTPUsbConnection(MMTPConnectionMgr& aConnectionMgr) : CActive(EPriorityStandard), iEndpointInfo(KEndpointMetaData, EMTPUsbEpNumEndpoints), + iIsCancelReceived(EFalse), + iIsResetRequestSignaled(EFalse), iConnectionMgr(&aConnectionMgr) { CActiveScheduler::Add(this); @@ -1233,7 +1242,7 @@ void CMTPUsbConnection::ProcessControlRequestDeviceResetL(const TMTPUsbControlRequestSetup& /*aRequest*/) { __FLOG(_L8("ProcessControlRequestDeviceResetL - Entry")); - + // Clear stalled endpoints and re-open connection BulkEndpointsStallClearL(); StartConnectionL(); @@ -1243,9 +1252,18 @@ sequence and initiate the next control request sequence. */ static_cast(iEndpoints[EMTPUsbEpControl])->SendControlRequestStatus(); - StopConnection(); + TBool connIsStopped = StopConnection(); InitiateControlRequestSequenceL(); - StartConnectionL(); + + if (connIsStopped) + { + StartConnectionL(); + } + else + { + iIsResetRequestSignaled = ETrue; + } + __FLOG(_L8("ProcessControlRequestDeviceResetL - Exit")); } @@ -1261,8 +1279,7 @@ TUint offset = 0; for(TUint i(EMTPUsbEpControl); iConnectionOpenedL(*this); + iConnectionMgr->ConnectionOpenedL(*this); SetConnectionState(EOpen); + SetDeviceStatus(EMTPUsbDeviceStatusOK); InitiateBulkRequestSequenceL(); } __FLOG(_L8("StartConnectionL - Exit")); @@ -1661,10 +1664,11 @@ /** Halts USB MTP device class processing. */ -void CMTPUsbConnection::StopConnection() +TBool CMTPUsbConnection::StopConnection() { __FLOG(_L8("StopConnection - Entry")); + TBool ret = ETrue; // Stop all data transfer activity. DataEndpointsStop(); @@ -1672,13 +1676,16 @@ if (ConnectionOpen()) { __FLOG(_L8("Notifying protocol layer connection closed")); - iConnectionMgr->ConnectionClosed(*this); + ret = iConnectionMgr->ConnectionClosed(*this); SetBulkTransactionState(EUndefined); SetConnectionState(EIdle); SetSuspendState(ENotSuspended); + SetDeviceStatus(EMTPUsbDeviceStatusBusy); } __FLOG(_L8("StopConnection - Exit")); + + return ret; } /** @@ -1706,7 +1713,7 @@ */ void CMTPUsbConnection::StartUsbL() { - __FLOG(_L8("StartUsbL - Exit")); + __FLOG(_L8("StartUsbL - Entry")); // Open the USB device interface. User::LeaveIfError(iLdd.Open(KDefaultUsbClientController));