diff -r ccd8e69b5392 -r 496ad160a278 mmsharing/mmshmanagersrv/src/musapplicationmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshmanagersrv/src/musapplicationmanager.cpp Fri Jun 11 13:36:18 2010 +0300 @@ -0,0 +1,488 @@ +/* +* Copyright (c) 2006 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 "musunittesting.h" +#include "muslogger.h" +#include "musapplicationmanager.h" +#include "musmanagercommon.h" +#include "musmanagerservercommon.h" +#include "mussessionproperties.h" +#include "musuid.hrh" +#include "mussettings.h" +/* PS keys related to NMusSessionInformationApi defined here */ +#include "mussesseioninformationapi.h" +#include "muscleanupresetanddestroy.h" +#include "lcengine.h" + +#include +#include +#include +#include +#include +#include + + +// CONSTANTS +_LIT8( KDefaultEngineName, "MultimediaSharing" ); +_LIT( KMusUiProcessName, "musui.exe" ); + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::NewL +// ----------------------------------------------------------------------------- +// +CMusApplicationManager* CMusApplicationManager::NewL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager* \ + CMusApplicationManager::NewL()" ); + + CMusApplicationManager* self = CMusApplicationManager::NewLC(); + CleanupStack::Pop( self ); + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager* \ + CMusApplicationManager::NewL()" ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::NewLC +// ----------------------------------------------------------------------------- +// +CMusApplicationManager* CMusApplicationManager::NewLC() + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager* \ + CMusApplicationManager::NewLC()" ); + + CMusApplicationManager* self = new( ELeave ) CMusApplicationManager(); + CleanupStack::PushL( self ); + self->ConstructL(); + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager* \ + CMusApplicationManager::NewLC()" ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::~CMusApplicationManager +// ----------------------------------------------------------------------------- +// +CMusApplicationManager::~CMusApplicationManager() + { + MUS_LOG( "mus: [MUSSRV] -> \ + CMusApplicationManager::~CMusApplicationManager()" ); + + MUS_LOG( "mus: [MUSSRV] <- \ + CMusApplicationManager::~CMusApplicationManager()" ); + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::ConstructL +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::ConstructL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager::ConstructL()" ); + + SetPropertyL( NMusSessionApi::KFastMode, MusSettingsKeys::EFastModeOff ); + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::ConstructL()" ); + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::CMusApplicationManager +// ----------------------------------------------------------------------------- +// +CMusApplicationManager::CMusApplicationManager() + { + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::ApplicationRunning +// ----------------------------------------------------------------------------- +// +TBool CMusApplicationManager::ApplicationRunning() + { + MUS_LOG( "mus: [MUSSRV] <> CMusApplicationManager::ApplicationRunning()" ); + + TFindProcess findProcess( KMusUiProcessName ); + TFullName name; + return ( findProcess.Next( name ) == KErrNone ); + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::ApplicationRunning +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::StartApplicationL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager::StartApplicationL()" ); + + if( ApplicationRunning() ) + { + ShowApplicationL(); + } + else + { + MUS_LOG( "mus: [MUSSRV] Starting app" ); + + RProcess process; + CleanupClosePushL( process ); + HBufC* args = CreateCommandLineArgsLC(); + User::LeaveIfError( process.Create( KMusUiProcessName, *args ) ); + process.Resume(); + CleanupStack::PopAndDestroy( args ); + CleanupStack::PopAndDestroy( &process ); + } + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::StartApplicationL()" ); + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::ApplicationRunning +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::StopApplicationL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager::StopApplicationL()" ); + + if( ApplicationRunning() ) + { + SetPropertyL( NMusSessionApi::KStatus, + MultimediaSharing::EMultimediaSharingNotAvailable ); + } + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::StopApplicationL()" ); + } + + +// ----------------------------------------------------------------------------- +// CMusApplicationManager::ShowApplication +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::ShowApplicationL() + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager::ShowApplicationL()" ); + + // TODO: How to bring a QT application to foreground? + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::ShowApplicationL()" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::WriteSessionPropertiesL( + MultimediaSharing::TMusUseCase aUseCase, + MultimediaSharing::TMusAvailabilityStatus aStatus, + MDesCArray& aSessionParameters ) + { + MUS_LOG2( "mus: [MUSSRV] -> \ + CMusApplicationManager::WriteSessionPropertiesL( %d, %d )", + ( TInt ) aUseCase, ( TInt ) aStatus ); + TRAPD( error, + if ( aUseCase == MultimediaSharing::EMusLiveVideo && + MultimediaSharingSettings::VideoDirectionL() == + MusSettingsKeys::ETwoWayVideo ) + { + MUS_LOG( "mus: [MUSSRV] UseCase MultimediaSharing::EMusTwoWayVideo" ); + aUseCase = MultimediaSharing::EMusTwoWayVideo; + } + ) + if ( error == KErrNoMemory ) + { + User::Leave( error ); + } + // set use case property + SetPropertyL( NMusSessionApi::KUseCase, ( TInt ) aUseCase ); + + WriteSessionPropertiesL( aStatus, aSessionParameters ); + + + MUS_LOG( "mus: [MUSSRV] <- \ + CMusApplicationManager::WriteSessionPropertiesL()" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::WriteSessionPropertiesL( + MultimediaSharing::TMusAvailabilityStatus aStatus, + MDesCArray& aSessionParameters ) + { + MUS_LOG1( "mus: [MUSSRV] -> \ + CMusApplicationManager::WriteSessionPropertiesL( %d )", + ( TInt ) aStatus ); + + // set tel number property + SetPropertyL( NMusSessionApi::KTelNumber, + aSessionParameters.MdcaPoint( KTelNumber ) ); + + // set sip address property + SetPropertyL( NMusSessionApi::KRemoteSipAddress, + aSessionParameters.MdcaPoint( KSipAddress ) ); + + // set sip address proposal property + SetPropertyL( NMusSessionApi::KRemoteSipAddressProposal, + aSessionParameters.MdcaPoint( KSipAddressProposal ) ); + + // set video codec property + SetPropertyL( NMusSessionApi::KVideoCodecs, + aSessionParameters.MdcaPoint( KVideoCodec ) ); + + // set contact id property + TLex lex( aSessionParameters.MdcaPoint( KContactId ) ); + TInt val; + lex.Val( val ); + + SetPropertyL( NMusSessionApi::KContactId, val ); + + // set contact id property + lex.Assign( aSessionParameters.MdcaPoint( KSipProfileId ) ); + lex.Val( val ); + + SetPropertyL( NMusSessionApi::KSipProfileId, val ); + + // contact name + SetPropertyL( NMusSessionApi::KContactName, + aSessionParameters.MdcaPoint( KContactName ) ); + + // fast mode + TInt fastMode; + User::LeaveIfError( RProperty::Get( NMusSessionApi::KCategoryUid, + NMusSessionApi::KFastMode, + fastMode ) ); + if ( fastMode != MusSettingsKeys::EFastModeDisabled ) + { + lex.Assign( aSessionParameters.MdcaPoint( KFastMode ) ); + lex.Val( val ); + SetPropertyL( NMusSessionApi::KFastMode, val ); + } + else + { + MUS_LOG( "mus: [MUSSRV] fast mode disabled, do not update it" ); + } + + // set status property + SetStatusL( aStatus ); + + MUS_LOG( "mus: [MUSSRV] <- \ + CMusApplicationManager::WriteSessionPropertiesL()" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::SetStatusL( + MultimediaSharing::TMusAvailabilityStatus aStatus ) + { + MUS_LOG1( "mus: [MUSSRV] -> CMusApplicationManager::SetStatusL( %d )", + ( TInt ) aStatus ); + SetPropertyL( NMusSessionApi::KStatus, ( TInt ) aStatus ); + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::SetStatusL()" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::SetIndicatorStatusL( TBool aLaunch ) + { + TInt launch = aLaunch; + MUS_LOG1( "mus: [MUSSRV] -> CMusApplicationManager::SetStatusL( %d )", + launch ); + + TInt indicatorStatus; + TInt ret = RProperty::Get( NMusSessionApi::KCategoryUid, + NMusSessionApi::KMusIndicatorStatus, + indicatorStatus ); + + if ( ret != KErrNone && ret != KErrNotFound ) + { + User::Leave( ret ); + } + + // set property only if not defined yet or if value changed + if ( ret == KErrNotFound || indicatorStatus != launch ) + { + SetPropertyL( NMusSessionApi::KMusIndicatorStatus, launch ); + } + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::SetStatusL()" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::SetPropertyL( TUint aProperty, + const TDesC& aValue ) + { + MUS_LOG1( "mus: [MUSSRV] -> CMusApplicationManager::SetPropertyL( %d )", + aProperty ); + MUS_LOG_TDESC( "mus: [MUSSRV] New property value: ", aValue ); + + // set tel number property + TInt retval = RProperty::Define( NMusSessionApi::KCategoryUid, + aProperty, + RProperty::EText ); + + if( retval != KErrAlreadyExists && retval != KErrNone ) + { + User::Leave( retval ); + } + User::LeaveIfError( RProperty::Set( NMusSessionApi::KCategoryUid, + aProperty, + aValue ) ); + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::SetPropertyL()" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::SetPropertyL( TUint aProperty, TInt aValue ) + { + MUS_LOG2( "mus: [MUSSRV] -> CMusApplicationManager::SetPropertyL( %d, %d )", + ( TInt ) aProperty, aValue ); + + // set tel number property + TInt retval = RProperty::Define( NMusSessionApi::KCategoryUid, + aProperty, + RProperty::EInt ); + + if( retval != KErrAlreadyExists && retval != KErrNone ) + { + User::Leave( retval ); + } + User::LeaveIfError( RProperty::Set( NMusSessionApi::KCategoryUid, + aProperty, + aValue ) ); + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::SetPropertyL()" ); + } + +// ----------------------------------------------------------------------------- +// Reads the callprovider description from the PS key +// return aProvider will have the proper callprovider name. +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::CallProviderL(TDes8& aProvider) + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager::CallProviderL"); + const TInt KMusMgrMaxPluginNameLen = 256; + TBuf pluginName; + + User::LeaveIfError(RProperty::Get( + NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMUSCallProvider, + pluginName )); + User::LeaveIfError( + CnvUtfConverter::ConvertFromUnicodeToUtf8( aProvider, pluginName )); + + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::CallProviderL"); + } + +// ----------------------------------------------------------------------------- +// Resolves name of the ecom plugin which implements the livecomms engine api +// by using the callprovider +// ----------------------------------------------------------------------------- +// +void CMusApplicationManager::ResolvePluginNameL(TDes8& aPluginName) + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager::ResolvePluginNameL"); + + TBuf8 providerName ; + + // Read the call provider name + CallProviderL( providerName ); + + RImplInfoPtrArray pluginArray; + MusCleanupResetAndDestroy::PushL( pluginArray ); + + TEComResolverParams resolverParams; + + resolverParams.SetDataType ( providerName ); + resolverParams.SetWildcardMatch (ETrue); + + // Use default plugin even if listing fails + TRAPD( err, + REComSession::ListImplementationsL(KLcEngineInterfaceUid, resolverParams, pluginArray) ); + MUS_LOG1( "mus: [MUSSRV] List implementations compl:%d", err ); + if ( err == KErrNoMemory ) + { + User::Leave( err ); + } + + if( pluginArray.Count() > 0 ) + { + CImplementationInformation* info = pluginArray[ 0 ]; + __ASSERT_ALWAYS( aPluginName.MaxLength() >= info->DataType().Length(), + User::Leave( KErrArgument ) ); + aPluginName.Copy( info->DataType() ); + } + else + { + __ASSERT_ALWAYS( aPluginName.MaxLength() >= KDefaultEngineName().Length(), + User::Leave( KErrArgument ) ); + aPluginName.Copy( KDefaultEngineName() ); + } + CleanupStack::PopAndDestroy();//pluginArray + MUS_LOG( "mus: [MUSSRV] <- CMusApplicationManager::ResolvePluginNameL"); + } + +// ----------------------------------------------------------------------------- +// Creates command line used when starting application. +// ----------------------------------------------------------------------------- +// +HBufC* CMusApplicationManager::CreateCommandLineArgsLC() + { + MUS_LOG( "mus: [MUSSRV] -> CMusApplicationManager::CreateCommandLineLC"); + + TBuf8 pluginNameUtf8; + ResolvePluginNameL( pluginNameUtf8 ); + + MUS_LOG_TDESC8( "mus: [MUSSRV] Plugin name:", pluginNameUtf8 ); + + HBufC* commandLineArgs = HBufC::NewLC( KMusMgrMaxPluginNameLen ); + TPtr commandLineArgsPtr( commandLineArgs->Des() ); + User::LeaveIfError( + CnvUtfConverter::ConvertToUnicodeFromUtf8( + commandLineArgsPtr, pluginNameUtf8 ) ); + + MUS_LOG_TDESC( "mus: [MUSSRV] <- command line args:", commandLineArgsPtr ); + + return commandLineArgs; + } + +// End of File