diff -r 3673b591050c -r ef55b168cedb mtptransports/mtpcontroller/src/cmtpoperator.cpp --- a/mtptransports/mtpcontroller/src/cmtpoperator.cpp Wed Apr 14 16:49:36 2010 +0300 +++ b/mtptransports/mtpcontroller/src/cmtpoperator.cpp Tue Apr 27 17:30:23 2010 +0300 @@ -24,6 +24,7 @@ __FLOG_STMT( _LIT8( KComponent, "mtpoperator" ); ) + CMTPOperator* CMTPOperator::NewL( MMTPOperatorNotifier& aNotifier ) { CMTPOperator* self = new( ELeave ) CMTPOperator( aNotifier ); @@ -37,6 +38,8 @@ iPendingOperations.Reset(); iPendingOperations.Close(); iMTPClient.Close(); + iProperty.Close(); + delete iTimer; __FLOG( _L8("+/-Dtor") ); __FLOG_CLOSE; } @@ -44,6 +47,7 @@ void CMTPOperator::StartTransport( TUid aTransport ) { __FLOG_1( _L8("+/-StartTransport( 0x%08X )"), aTransport.iUid ); + TInt err = AppendOperation( EStartTransport, aTransport ); if ( KErrNone != err ) { @@ -61,23 +65,82 @@ } } +void CMTPOperator::StartTimer(TInt aSecond) + { + __FLOG(_L8("StartTimer in cmtpoperator!")); + iTimer->Start(aSecond); + } + void CMTPOperator::DoCancel() { __FLOG( _L8("+/-DoCancel") ); + iProperty.Cancel(); + iConSubscribed = EFalse; } void CMTPOperator::RunL() { __FLOG( _L8("+RunL") ); + iConSubscribed = EFalse; TInt count = iPendingOperations.Count(); + + TInt connState = KInitialValue; + if ( count > 0 ) { TOperation& operation = iPendingOperations[0]; TRAP_IGNORE( HandleOperationL( operation ) ); iPendingOperations.Remove( 0 ); } - + else + { + //this will go on to get the updated connection status. + SubscribeConnState(); + + + TInt error = iProperty.Get(KMTPPublishConnStateCat, EMTPConnStateKey, connState); + __FLOG_2(_L8("Before, the iConnState is %d and connState is %d"), iConnState, connState); + if ( KErrNotFound == error ) + { + iConnState = KInitialValue; + __FLOG( _L8("The key is deleted and mtp server shut down!") ); + } + else + { + if (iTimer->IsActive() && !iTimer->GetStopTransportStatus()) + { + __FLOG( _L8("Timer is cancelled!") ); + iTimer->Cancel(); + } + //if the disconnect is not set, set the disconnect + //else if the connState is disconnect, launch the timer to restart the server to unload dps. + if ( KInitialValue == iConnState ) + { + iConnState = connState; + __FLOG( _L8("the first time to launch mtp") ); + } + else + { + if (EDisconnectedFromHost == connState) + { + iConnState = connState; + if (!iTimer->IsActive()) + { + iTimer->Start(KStopMTPSeconds); + } + __FLOG( _L8("Timer is launched.") ); + } + else + { + + iConnState = connState; + } + } + } + __FLOG_2(_L8("After, the iConnState is %d and connState is %d"), iConnState, connState); + } + __FLOG( _L8("-RunL") ); } @@ -93,7 +156,21 @@ { __FLOG( _L8("+ConstructL") ); CActiveScheduler::Add( this ); + //if the server is running, the first disconnction shows the conection is down! + if(KErrNone == iMTPClient.IsProcessRunning()) + { + iConnState = EDisconnectedFromHost; + } + else + { + iConnState = KInitialValue; + } + __FLOG_1( _L8("The connstate is set to %d"), iConnState ); User::LeaveIfError( iMTPClient.Connect() ); + User::LeaveIfError(iProperty.Attach(KMTPPublishConnStateCat, EMTPConnStateKey)); + iTimer = CMTPControllerTimer::NewL(iMTPClient, *this); + + iConSubscribed = EFalse; __FLOG( _L8("-ConstructL") ); } @@ -101,17 +178,33 @@ { TOperation operation = { aType, aTransport }; TInt err = iPendingOperations.Append( operation ); + __FLOG_1( _L8("+AppendOperation returns %d"), err ); if ( ( KErrNone == err ) && !IsActive() ) { Schedule( KErrNone ); } - __FLOG_1( _L8("+/-AppendOperation returns %d"), err ); + else + { + if (iConSubscribed) + { + Cancel(); + if (KErrNone == err) + { + Schedule( KErrNone ); + } + } + } + __FLOG( _L8("-AppendOperation") ); return err; } void CMTPOperator::Schedule( TInt aError ) { __FLOG_1( _L8("+/-Schedule( %d )"), aError ); + if(iTimer->IsActive()) + { + iTimer->Cancel(); + } TRequestStatus* status = &iStatus; User::RequestComplete( status, aError ); SetActive(); @@ -126,13 +219,31 @@ case EStartTransport: err = iMTPClient.StartTransport( aOperation.iTransport ); iNotifier.HandleStartTrasnportCompleteL( err ); + SubscribeConnState(); break; default: __ASSERT_DEBUG( ( EStopTransport == aOperation.iType ), User::Invariant() ); - err = iMTPClient.StopTransport( aOperation.iTransport ); + if(!iTimer->GetStopTransportStatus()) + { + err = iMTPClient.StopTransport( aOperation.iTransport ); + } + iNotifier.HandleStopTrasnportCompleteL( err ); break; } __FLOG( _L8("-HandleOperationL") ); } +void CMTPOperator::SubscribeConnState() + { + if(!IsActive()) + { + __FLOG( _L8("Subscribe connection state changed)") ); + iProperty.Subscribe(iStatus); + iConSubscribed = ETrue; + SetActive(); + } + + } + +