diff -r 000000000000 -r f0cf47e981f9 mmsharing/mmshmanagersrv/src/musavailabilitypluginmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshmanagersrv/src/musavailabilitypluginmanager.cpp Thu Dec 17 08:44:37 2009 +0200 @@ -0,0 +1,765 @@ +/* +* Copyright (c) 2006-2007 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: ?Description +* +*/ + + +#include "musavailabilitypluginmanager.h" +#include "musavasettings.h" +#include "musunittesting.h" +#include "musavainterface.h" +#include "muslogger.h" +#include "musavailabilitypluginmanagerobserver.h" +#include "musmanagerservercommon.h" +#include "musindicatorapi.h" +#include "musapplicationmanager.h" + +#include +#include +#include + + +// CONSTANTS + +using namespace MultimediaSharing; + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvailabilityPluginManager* CMusAvailabilityPluginManager::NewL( + MMusAvailabilityPluginManagerObserver& aObserver, + CMusApplicationManager& aApplicationManager ) + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::NewL()" ) + + CMusAvailabilityPluginManager* self = + CMusAvailabilityPluginManager::NewLC( aObserver, + aApplicationManager ); + + CleanupStack::Pop( self ); + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::NewL()" ) + return self; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvailabilityPluginManager* CMusAvailabilityPluginManager::NewLC( + MMusAvailabilityPluginManagerObserver& aObserver, + CMusApplicationManager& aApplicationManager ) + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::NewLC()" ) + + CMusAvailabilityPluginManager* self = + new( ELeave ) CMusAvailabilityPluginManager( aObserver, + aApplicationManager ); + + CleanupStack::PushL( self ); + self->ConstructL(); + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::NewLC()" ) + return self; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvailabilityPluginManager::~CMusAvailabilityPluginManager() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + ~CMusAvailabilityPluginManager()" ) + delete iPlugin; + delete iSessionParameters; + delete iIndicator; + iIndicator = NULL; + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + ~CMusAvailabilityPluginManager()" ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::ConstructL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::ConstructL()" ) + iSessionParameters = new( ELeave ) CDesCArrayFlat( KParameterCount ); + iPlugin = CMusAvaInterface::NewL(); + iPlugin->SetObserver( *this ); + iPlugin->SetSettingsObserver( *this ); + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::ConstructL()" ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvailabilityPluginManager::CMusAvailabilityPluginManager( + MMusAvailabilityPluginManagerObserver& aObserver, + CMusApplicationManager& aApplicationManager ) + : iObserver( aObserver ), + iApplicationManager( aApplicationManager ) + { + iPluginStarted = EFalse; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMusAvailabilityPluginManager::ApplicationAllowed() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + ApplicationAllowed()" ) + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + ApplicationAllowed()" ) + return ( iPlugin->MandatoryAvailability() + || iPlugin->AvailabilityState( EMusAvaNameRegistration ) == + EMusAvaStatusInProgress + || iPlugin->AvailabilityState( EMusAvaNameRegistration ) == + EMusAvaStatusAvailable ); + } +// ----------------------------------------------------------------------------- +// If minumum availability is available returning mandaroty level status +// and if mandatory level status is available returning extension level status +// ----------------------------------------------------------------------------- +// +TMusAvailabilityStatus CMusAvailabilityPluginManager::Availability() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + Availability()" ) + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + Availability()" ) + return MapAvailabilities( iPlugin->AvailabilityStatus() ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::InvestigateAvailabilityL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + InvestigateAvailabilityL()" ) + if( !iPluginStarted ) + { + iPlugin->StartL(); + iPluginStarted = ETrue; + } + + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + InvestigateAvailabilityL()" ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::InvitationReceivedL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + InvitationReceivedL()" ) + + if( !iPluginStarted ) + { + iPlugin->StartL(); + iPluginStarted = ETrue; + } + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + InvitationReceivedL()" ) + } + +// ----------------------------------------------------------------------------- +// CMusAvailabilityPluginManager::OptionsReceived +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::OptionsReceivedL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + OptionsReceivedL()" ) + + if( !iPluginStarted ) + { + iPlugin->StartL(); + iPluginStarted = ETrue; + } + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + OptionsReceivedL()" ) + } + +// ----------------------------------------------------------------------------- +// CMusAvailabilityPluginManager::LoadPluginL +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::LoadPluginL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + LoadPluginL()" ) + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + LoadPluginL()" ) + } + +// ----------------------------------------------------------------------------- +// CMusAvailabilityPluginManager::UnloadPluginL +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::StopPluginL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + StopPluginL()" ) + if( iPluginStarted ) + { + iPlugin->Stop(); + iPluginStarted = EFalse; + } + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + StopPluginL()" ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +MDesCArray& CMusAvailabilityPluginManager::SessionParametersL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + SessionParametersL()" ) + // update the values + UpdateSessionParametersL(); + + // then pass them + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + SessionParametersL()" ) + return *iSessionParameters; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::ManualQueryL() + { + + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + ManualQueryL()" ) + MMusAvaSettings& settings = iPlugin->Settings(); + + MUS_LOG( "mus: [MUSSRV] Status available" ) + + settings.SetManualActivation( MMusAvaSettings::EActivationAllowed ); + iPlugin->StartL(); + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + ManualQueryL()" ) + } + +TBool CMusAvailabilityPluginManager::PossibleToLaunch() + { + return iPlugin->ExtensionAvailability() && + iPlugin->AvailabilityStatus() == + MMusAvaObserver::EMusAvaStatusAvailable; + } +void CMusAvailabilityPluginManager::AvailabilityChanged( + TAvailabilityName /*aName*/, + TAvailabilityStatus aStatus ) + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + AvailabilityChanged()" ) + TRAPD( err , iObserver.AvailabilityChangedL( MapAvailabilities( aStatus ) ) ); + if ( err ) + { + // Not sure about what to do. Very rare situation. + MUS_LOG1( "mus: [MUSSRV] AvailabilityChangedL() leave code: %d",err ) + } + // Do some indicator things... + TRAP( err, IndicateAvailabilityL() ); + if ( err ) + { + // Not sure about what to do. Very rare situation. + MUS_LOG1( "mus: [MUSSRV] IndicateAvailabilityL() leave code: %d",err ) + } + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + AvailabilityChanged()" ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::AvailabilityError( + TAvailabilityName /*aName*/, + TAvailabilityStatus aStatus ) + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + AvailabilityError()" ) + TRAPD( err , iObserver.AvailabilityChangedL( MapAvailabilities( aStatus ) ) ); + if ( err ) + { + // Not sure about what to do. Very rare situation. + MUS_LOG1( "mus: [MUSSRV] AvailabilityChangedL() leave code: %d",err ) + } + + // Do some indicator things... + TRAP( err, IndicateAvailabilityL() ); + if ( err ) + { + MUS_LOG1( "mus: [MUSSRV] IndicateAvailabilityL() leave code: %d",err ) + } + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + AvailabilityError()" ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +MMusAvaSettingsObserver::TApplicationState CMusAvailabilityPluginManager:: + ApplicationState() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + ApplicationState()" ) + MMusAvaSettingsObserver::TApplicationState ret = EApplicationStateNotDefined; + if ( iApplicationManager.ApplicationRunning() ) + { + ret = EApplicationIsRunning; + } + else + { + ret = EApplicationNotRunning; + } + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + ApplicationState()" ) + return ret; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMusAvailabilityPluginManager::OptionAllowed() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + OptionAllowed()" ) + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + OptionAllowed()" ) + // TBD: Check it out + return iPlugin->AvailabilityState( MMusAvaObserver::EMusAvaOptionHandler ) + >= EMusAvaStatusNotExecuted; + } + +// ----------------------------------------------------------------------------- +// From MMusIndicatorObserver. +// Starts live video sharing. +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::StartLiveSharingL() + { + iObserver.StartLiveSharingL(); + } + +// ----------------------------------------------------------------------------- +// This functions cross-links TAvailabilityStatus and +// MultimediaSharing::TMusAvailabilityStatus +// ----------------------------------------------------------------------------- +// +MultimediaSharing::TMusAvailabilityStatus + CMusAvailabilityPluginManager::MapAvailabilities( + TAvailabilityStatus aStatus ) + { + MultimediaSharing::TMusAvailabilityStatus status; + switch( aStatus ) + { + case EMusAvaStatusNotExecuted: + { + MUS_LOG( "mus: [MUSSRV] that is \ + EMultimediaSharingNotAvailable" ) + status = EMultimediaSharingNotAvailable; + break; + } + case EMusAvaFailureCode: + { + MUS_LOG( "mus: [MUSSRV] that is \ + EMusAvaFailureCode" ) + status = EMultimediaFailureCode; + break; + } + case EMusAvaStatusInProgress: // EMusAvaStatusRegistering: + { + MUS_LOG( "mus: [MUSSRV] that is ESipRegistrationPending" ) + if ( iPlugin->CurrentAvailability() > EMusAvaNameRegistration ) + { + // SIP registration already performed, we're available + MUS_LOG( "mus: [MUSSRV] that is \ + EMultimediaSharingAvailable - a" ) + status = EMultimediaSharingAvailable; + } + else if ( + iPlugin->CurrentAvailability() == EMusAvaNameRegistration ) + { + // SIP register pending + MUS_LOG( "mus: [MUSSRV] that is \ + ESipRegistrationPending - a" ) + status = ESipRegistrationPending; + } + else + { + MUS_LOG( "mus: [MUSSRV] that is \ + EMultimediaSharingNotAvailable - a" ) + status = EMultimediaSharingNotAvailable; + } + break; + } + case EMusAvaStatusAvailable: + { + MUS_LOG( "mus: [MUSSRV] that is EMultimediaSharingAvailable" ) + status = EMultimediaSharingAvailable; + break; + } + case EMusAvaStatusNoSipProfile: + { + MUS_LOG( "mus: [MUSSRV] that is EErrNoSipProfile" ) + status = EErrNoSipProfile; + break; + } + case EMusAvaStatusNotRegistered: + { + MUS_LOG( "mus: [MUSSRV] that is EErrSipRegistration" ) + status = EErrSipRegistration; + break; + } + case EMusAvaStatusNoCall: + { + MUS_LOG( "mus: [MUSSRV] that is EErrNoActiveCall" ) + status = EErrNoActiveCall; + break; + } + case EMusAvaStatusCallOnHold: + { + MUS_LOG( "mus: [MUSSRV] that is EErrCallOnHold" ) + status = EErrCallOnHold; + break; + } + case EMusAvaOptionNotAvailable: + { + MUS_LOG( "mus: [MUSSRV] that is EErrOptionAvailable" ) + status = ESipOptionsNotCapable; + break; + } + case EMusAvaStatusConferenceCall: + { + MUS_LOG( "mus: [MUSSRV] that is EErrConferenceCall" ) + status = EErrConferenceCall; + break; + } + case EMusAvaStatusOptionsSent: + { + MUS_LOG( "mus: [MUSSRV] that is ESipOptionsCapable" ) + status = ESipOptionsSent; + break; + } + case EMusAvaStatusOptionsNotSent: + { + MUS_LOG( "mus: [MUSSRV] that is ESipOptionsNotSent" ) + status = ESipOptionsNotSent; + break; + } + case EMusAvaNetworkType: + { + MUS_LOG( "mus: [MUSSRV] that is EErrNetwork" ) + status = EErrNetwork; + break; + } + case EMusAvaRoamingError: + { + MUS_LOG( "mus: [MUSSRV] that is EErrRoaming" ) + status = EErrRoaming; + break; + } + case EMusAvaConnectionErr: + { + MUS_LOG( "mus: [MUSSRV] that is EErrConnection" ) + status = EErrConnection; + break; + } + case EMusActivationError: + { + MUS_LOG( "mus: [MUSSRV] that is EErrActivation" ) + status = EErrActivation; + break; + } + + case EMusAvaManualActivation: + { + MUS_LOG( "mus: [MUSSRV] that is Manual Activation" ) + status = EManualActivation; + break; + } + + case EMusAvaEdgeDtmStatusUnknown: + { + MUS_LOG( "mus: [MUSSRV] Edge/DTM support" ) + status = EErrNetwork; + break; + } + default: + MUS_LOG( "mus: [MUSSRV] that is unknown; returning \ + KErrUnknown" ) + status = ( TMusAvailabilityStatus ) KErrUnknown; + } + return status; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::UpdateSessionParametersL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + UpdateSessionParametersL()" ) + // clear the table + iSessionParameters->Delete( 0, iSessionParameters->Count() ); + + HBufC* telNumber = TelNumberLC(); + iSessionParameters->AppendL( *telNumber ); + CleanupStack::PopAndDestroy( telNumber ); + + HBufC* sipAddresses = SipAddressesLC(); + iSessionParameters->AppendL( *sipAddresses ); + CleanupStack::PopAndDestroy( sipAddresses ); + + MMusAvaSettings& settings = iPlugin->Settings(); + + // append sip address proposal + iSessionParameters->AppendL( settings.SipAddressProposal() ); + + // Unsafe Magic number 16 is used but unsigned 32 bit integer (TInt32) + // can't go beyond 16 digits . + TBuf<16> contactIdBuf; + contactIdBuf.Num( settings.ContactId() ); + + // append contact id + iSessionParameters->AppendL( contactIdBuf ); + + // append video codec + HBufC* videoCodecs = VideoCodecsLC(); + iSessionParameters->AppendL( *videoCodecs ); + CleanupStack::PopAndDestroy( videoCodecs ); + + // Unsafe Magic number 16 is used but unsigned 32 bit integer (TInt32) + // can't go beyond 16 digits . + TBuf<16> sipProfileIdBuf; + sipProfileIdBuf.Num( settings.SipProfileId() ); + + MUS_LOG1("iSessionParameters -> SIP Profile ID = %d ", + settings.SipProfileId() ) + + // append sip profile id + iSessionParameters->AppendL( sipProfileIdBuf ); + + HBufC* contactName = ContactNameLC(); + iSessionParameters->AppendL( *contactName ); + CleanupStack::PopAndDestroy( contactName ); + + // append call privacy indication + MUS_LOG1("iSessionParameters -> Call Privacy = %d ", + settings.CallPrivacy() ) + TBuf<16> callPrivacy; + callPrivacy.Num( settings.CallPrivacy() ); + iSessionParameters->AppendL( callPrivacy ); + + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + UpdateSessionParametersL()" ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +HBufC* CMusAvailabilityPluginManager::SipAddressesLC() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + SipAddressesLC()" ) + HBufC* sipAddresses = NULL; + + // We have to keep up with KMaxPropertySize since it is advertised through + // RProperty to UI process. + TBuf tbuf; + _LIT( KComma, "," ); + + MMusAvaSettings& settings = iPlugin->Settings(); + const MDesCArray& addresses = settings.SipAddresses(); + MUS_LOG1( "mus: [MUSSRV] addresses.MdcaCount() %d", + addresses.MdcaCount() ) + + for( TInt i=0;i + addresses.MdcaPoint(i).Size()+KComma().Size()) + { + if( i > 0) tbuf.Append( KComma() ); + tbuf.Append( addresses.MdcaPoint( i ) ); + } + else + { + // if no space just break and do not continue further. + break; + } + } + sipAddresses = tbuf.AllocLC(); + + MUS_LOG_TDESC( "mus: [MUSSRV] SIP Address: ", (*sipAddresses) ); + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + SipAddressesLC()" ) + + return sipAddresses; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +HBufC* CMusAvailabilityPluginManager::VideoCodecsLC() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + VideoCodecsLC()" ) + HBufC* videoCodecs = NULL; + + // We have to keep up with KMaxPropertySize since it is advertised through + // RProperty to UI process. + TBuf tbuf; + _LIT( KComma, "," ); + + MMusAvaSettings& settings = iPlugin->Settings(); + const MDesCArray& codecs = settings.VideoCodecs(); + MUS_LOG1( "mus: [MUSSRV] addresses.MdcaCount() %d", + codecs.MdcaCount() ) + + for( TInt i=0;i + codecs.MdcaPoint(i).Size()+KComma().Size()) + { + if( i > 0) tbuf.Append( KComma() ); + tbuf.Append( codecs.MdcaPoint( i ) ); + } + else + { + // if no space just break and do not continue further. + break; + } + } + videoCodecs = tbuf.AllocLC(); + + MUS_LOG_TDESC( "mus: [MUSSRV] Video codecs: ", (*videoCodecs) ); + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + VideoCodecsLC()" ) + + return videoCodecs; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +HBufC* CMusAvailabilityPluginManager::TelNumberLC() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + TelNumberLC()" ) + + MMusAvaSettings& settings = iPlugin->Settings(); + + HBufC* telNumber = settings.TelNumber().AllocLC(); + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + TelNumberLC()" ) + + return telNumber; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +HBufC* CMusAvailabilityPluginManager::ContactNameLC() + { + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + ContactNameLC()" ) + + MMusAvaSettings& settings = iPlugin->Settings(); + + HBufC* contactName = settings.ContactName().AllocLC(); + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + ContactNameLC()" ) + + return contactName; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvailabilityPluginManager::IndicateAvailabilityL() + { + + MUS_LOG( "mus: [MUSSRV] -> CMusAvailabilityPluginManager::\ + IndicateAvailabilityL()" ) + + if( PossibleToLaunch() ) + { + MUS_LOG( "mus: [MUSSRV] Status available" ) + if( !iIndicator ) + { + MUS_LOG( "mus: [MUSSRV] Create indicator" ) + iIndicator = CMusIndicatorApi::NewL( *this ); + iIndicator->IndicateAvailabilityL(); + } + iApplicationManager.SetIndicatorStatusL( ETrue ); + } + else + { + MUS_LOG( "mus: [MUSSRV] Not available" ) + iApplicationManager.SetIndicatorStatusL( EFalse ); + delete iIndicator; + iIndicator = NULL; + } + + MUS_LOG( "mus: [MUSSRV] <- CMusAvailabilityPluginManager::\ + IndicateAvailabilityL()" ) + } +