diff -r 2d2c7d1515f7 -r 33a5d2bbf6fc mmsharing/mmshmanagercli/src/musmanagerclientsession.cpp --- a/mmsharing/mmshmanagercli/src/musmanagerclientsession.cpp Thu Jul 15 18:35:08 2010 +0300 +++ b/mmsharing/mmshmanagercli/src/musmanagerclientsession.cpp Thu Aug 19 09:51:39 2010 +0300 @@ -31,8 +31,10 @@ */ #define ASYNCHRONOUS_MESSAGE_SLOTS 255 +const TInt KMusServerSessionCreationWaitTimeoutInMicrosecs = 10000000; // 10 secs + // ======== LOCAL FUNCTIONS ======== - + // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- @@ -40,21 +42,49 @@ RMusManagerClientSession::RMusManagerClientSession() : RSessionBase () { - } + // --------------------------------------------------------------------------- -// +// Use timeout mechanism for session creation as otherwise it can block +// so long that WServ terminates the process. There's no way to cancel +// session creation other than destuction of client session. Therefore, in case +// of timeout, leave and let creation finish silently or get canceled when +// user of client session object deletes us. // --------------------------------------------------------------------------- // void RMusManagerClientSession::ConnectL() { - MUS_LOG( "mus: [MUSCLI] -> RMusManagerClientSession::ConnectL()" ); - TRequestStatus s; + MUS_LOG( "mus: [MUSCLI] -> RMusManagerClientSession::ConnectL(), with timeout" ); + + if ( iSessionCreationStatus.Int() == KRequestPending ) + { + // Previous creation still pending + User::Leave( KErrNotReady ); + } + + RTimer timer; + CleanupClosePushL( timer ); + User::LeaveIfError( timer.CreateLocal() ); + User::LeaveIfError( CreateSession( KMusManagerServerName(), Version(), - ASYNCHRONOUS_MESSAGE_SLOTS, &s ) ); - - User::WaitForRequest( s ); + ASYNCHRONOUS_MESSAGE_SLOTS, &iSessionCreationStatus) ); + TRequestStatus timeoutStatus; + timer.After( timeoutStatus, KMusServerSessionCreationWaitTimeoutInMicrosecs ); + User::WaitForRequest( iSessionCreationStatus, timeoutStatus ); + if ( timeoutStatus.Int() != KRequestPending ) + { + MUS_LOG( "mus: [MUSCLI] RMusManagerClientSession::ConnectL, timeout" ); + User::Leave( KErrTimedOut ); + } + else + { + MUS_LOG( "mus: [MUSCLI] RMusManagerClientSession::ConnectL, no timeout" ); + timer.Cancel(); + User::WaitForRequest( timeoutStatus ); + } + CleanupStack::PopAndDestroy( &timer ); + MUS_LOG( "mus: [MUSCLI] <- RMusManagerClientSession::ConnectL()" ); }