diff -r d0791faffa3f -r aabe5387f5ce mtpfws/mtpfw/src/cmtpconnectionmgr.cpp --- a/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp Tue Feb 02 01:11:40 2010 +0200 +++ b/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp Fri Mar 19 09:40:39 2010 +0200 @@ -13,6 +13,8 @@ // Description: // +#include +#include #include "cmtpconnectionmgr.h" #include "cmtpconnection.h" @@ -93,9 +95,59 @@ return iTransportUid; } +void CMTPConnectionMgr::ConnectionCloseComplete(const TUint& /*aConnUid*/) + { + __FLOG(_L8("ConnectionCloseComplete - Entry")); + ResumeSuspendedTransport(); + __FLOG(_L8("ConnectionCloseComplete - exit")); + } + EXPORT_C void CMTPConnectionMgr::StartTransportL(TUid aTransport) { - StartTransportL( aTransport, NULL ); + + TInt32 bluetoothUid = 0x10286FCB; + + RUsb usb; + User::LeaveIfError(usb.Connect()); + TInt usbMode; + TUsbServiceState usbStat; + TInt err = usb.GetCurrentPersonalityId(usbMode); + __FLOG_1(_L8("The return value of GetCurrentPersonalityId is %d"), err); + + err = usb.GetServiceState(usbStat); + __FLOG_1(_L8("The return value of GetServiceState is %d"), err); + + usb.Close(); + + __FLOG_1(_L8("The current usb mode is %d"), usbMode); + __FLOG_1(_L8("The current usb service state is %d"), usbStat); + + TInt massStorageMode = 0x02; + + if(usbMode == massStorageMode && usbStat != EUsbServiceIdle) + { + __FLOG(_L8("StartTransportL without parameter!")); + StartTransportL( aTransport, NULL ); + return; + } + + + + //When USB plug out, BT will start Master mode to reconnect remote device. Else BT will start slave mode to listen connection. + if(aTransport.iUid == bluetoothUid && iRemoteDevice.iDeviceAddr != 0 && aTransport != iTransportUid) + { + __FLOG(_L8("StartTransportL with parameter!")); + TMTPBTRemoteDeviceBuf tmpdata(iRemoteDevice); + StartTransportL( aTransport, &tmpdata ); + iRemoteDevice.iDeviceAddr = 0; + iRemoteDevice.iDeviceServicePort = 0; + } + else + { + __FLOG(_L8("StartTransportL without parameter!")); + StartTransportL( aTransport, NULL ); + } + } /** @@ -110,33 +162,70 @@ */ EXPORT_C void CMTPConnectionMgr::StartTransportL(TUid aTransport, const TAny* aParameter) { - __FLOG(_L8("StartTransportL - Entry")); - + __FLOG(_L8("StartTransportL - Entry")); + + TInt32 bluetoothUid = 0x10286FCB; + if (iTransport) { + __FLOG(_L8("The transport is not none.")); if (aTransport != iTransportUid) { // Multiple transports not currently supported. + __FLOG(_L8("Multiple transports are not supported now!")); User::Leave(KErrNotSupported); } + else + { + __FLOG_1(_L8("Relaunch the transport 0x%X"), iTransportUid.iUid); + if(aTransport.iUid == bluetoothUid) + { + iTransport->Stop(*this); + delete iTransport; + + iTransport = CMTPTransportPlugin::NewL(aTransport, aParameter); + + TRAPD(err, iTransport->StartL(*this)); + if (err != KErrNone) + { + __FLOG_VA( ( _L8("StartTransportL error, error code = %d"), err) ); + delete iTransport; + iTransport = NULL; + User::Leave(err); + } + iTransportUid = aTransport; + + iTransportCount++; + } + + } } else { - + __FLOG(_L8("begin start transport.")); iTransport = CMTPTransportPlugin::NewL(aTransport, aParameter); TRAPD(err, iTransport->StartL(*this)); - if (err != KErrNone) - { - __FLOG_VA( ( _L8("StartTransportL error, error code = %d"), err) ); - delete iTransport; - iTransport = NULL; - User::Leave(err); - } + if (err != KErrNone) + { + __FLOG_VA( ( _L8("StartTransportL error, error code = %d"), err) ); + delete iTransport; + iTransport = NULL; + User::Leave(err); + } iTransportUid = aTransport; - + iTransportCount++; - UnsuspendTransport( iTransportUid ); + + if(iTransportUid.iUid != bluetoothUid) + { + UnsuspendTransport( iTransportUid ); + } + else + { + //Suspend BT transport to handle switching with Mass Storage + SuspendTransportL( iTransportUid); + } } __FLOG(_L8("StartTransportL - Exit")); @@ -181,6 +270,15 @@ { __FLOG(_L8("StopTransport - Entry")); + + __FLOG_1(_L8("aTransport is 0x%X"), aTransport.iUid); + __FLOG_1(_L8("iTransportUid is 0x%X"), aTransport.iUid); + + if ( aByBearer ) + { + UnsuspendTransport( aTransport ); + } + if ( ( iTransport ) && ( aTransport == iTransportUid ) ) { if ( !aByBearer ) @@ -192,14 +290,8 @@ iTransport = NULL; iTransportUid = KNullUid; iTransportCount--; - - } - if ( aByBearer ) - { - UnsuspendTransport( aTransport ); - } - + __FLOG(_L8("StopTransport - Exit")); } @@ -224,10 +316,28 @@ */ EXPORT_C TInt CMTPConnectionMgr::TransportCount() const { - return iTransportCount; + return iTransportCount; } -void CMTPConnectionMgr::ConnectionClosed(MMTPTransportConnection& aTransportConnection) +/* +Record the remote device bluetooth address when connection setup. +*/ +EXPORT_C void CMTPConnectionMgr::SetBTResumeParameter(const TBTDevAddr& aBTAddr, const TUint16& aPSMPort) + { + TInt64 addr(0); + TUint8 i(0); + addr += aBTAddr[i++]; + for(; iConnectionSuspended(); - - ResumeSuspendedTransport(); __FLOG(_L8("ConnectionClosed - Exit")); + return connection->ConnectionSuspended(); } void CMTPConnectionMgr::ConnectionOpenedL(MMTPTransportConnection& aTransportConnection) @@ -267,26 +375,6 @@ __FLOG(_L8("ConnectionOpenedL - Exit")); } -TBool CMTPConnectionMgr::DeleteConnection(TUint aConnectionId) - { - __FLOG(_L8("DeleteConnection - Entry")); - - TBool ret = EFalse; - TInt idx = ConnectionFind(aConnectionId); - - if (idx != KErrNotFound) - { - CMTPConnection* connection(iConnections[idx]); - iConnections.Remove(idx); - delete connection; - ret = ETrue; - } - - __FLOG(_L8("DeleteConnection - Entry")); - - return ret; - } - EXPORT_C TUid CMTPConnectionMgr::ClientSId() { return iSecureId; @@ -299,7 +387,9 @@ iShutdownConnectionIdx(KErrNotFound), iTransportUid(KNullUid) { - __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG_OPEN(KMTPSubsystem, KComponent); + iRemoteDevice.iDeviceAddr = 0; + iRemoteDevice.iDeviceServicePort = 0; } /** @@ -378,9 +468,14 @@ { __FLOG( _L8("+ResumeSuspendedTransport") ); const TInt count = iSuspendedTransports.Count(); + __FLOG_1(_L8("The count number is %d"), count); + __FLOG_1(_L8("The transportport id is 0x%X"), iTransportUid.iUid); + + TInt32 bluetoothUid = 0x10286FCB; + if ( ( count > 0 ) // If the transport was just switched and suspended, it shouldn't be resumed. - && ( iTransportUid != iSuspendedTransports[count-1] ) ) + && (( iTransportUid != iSuspendedTransports[count-1] ) || iTransportUid.iUid == bluetoothUid)) { __FLOG( _L8("Found suspended transport(s).") ); if ( !iTransportTrigger )