mmsharing/mmshmanagersrv/src/musmanagerservercore.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:12:07 +0300
branchRCL_3
changeset 22 73a1feb507fb
parent 0 f0cf47e981f9
child 23 bc78a40cd63c
permissions -rw-r--r--
Revision: 201032 Kit: 201035

/*
* 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 "musmanagerservercore.h"
#include "musapplicationmanager.h"
#include "musavailabilitypluginmanager.h"
#include "musmonitoravailabilityobserver.h"
#include "muslogger.h"
#include "musmanagerservercoreobserver.h"
#include "musmanager.h"
#include "musmanagerservercommon.h"

using namespace MultimediaSharing;

// CONSTANTS
_LIT8( KMusEngineName, "MultimediaSharing" );


// -----------------------------------------------------------------------------
// CMusManagerServerCore::NewL
// -----------------------------------------------------------------------------
//
CMusManagerServerCore* CMusManagerServerCore::NewL(
    MMusManagerServerCoreObserver& aObserver )
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::NewL()" );

    CMusManagerServerCore* self = CMusManagerServerCore::NewLC( aObserver );
    CleanupStack::Pop( self );
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::NewL()" );
    return self;
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::NewLC
// -----------------------------------------------------------------------------
//
CMusManagerServerCore* CMusManagerServerCore::NewLC(
    MMusManagerServerCoreObserver& aObserver )
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::NewLC()" );

    CMusManagerServerCore* self
        = new( ELeave ) CMusManagerServerCore( aObserver );
    CleanupStack::PushL( self );
    self->ConstructL();
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::NewLC()" );
    return self;
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::CMusManagerServerCore
// -----------------------------------------------------------------------------
//
CMusManagerServerCore::CMusManagerServerCore( MMusManagerServerCoreObserver& aObserver )
    : iObserver( aObserver )
    {
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::ConstructL
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::ConstructL()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::ConstructL" );
    
    iApplicationManager = CMusApplicationManager::NewL();
    
    iApplicationManager->ResolvePluginNameL( iPluginName );
    
    iPluginManager = CMusAvailabilityPluginManager::NewL( *this, *iApplicationManager );

    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::ConstructL" );
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::~CMusManagerServerCore
// -----------------------------------------------------------------------------
//
CMusManagerServerCore::~CMusManagerServerCore()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::CMusManagerServerCore" );

     // inform ui via application manager (via session api)
    
    delete iPluginManager;

    delete iApplicationManager;
    
     // go through interested client sessions
    StopMonitoring();
    iAvailabilityMonitors.Close();
    
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::CMusManagerServerCore" );
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::~CMusManagerServerCore
// -----------------------------------------------------------------------------
//
MultimediaSharing::TMusAvailabilityStatus CMusManagerServerCore::AvailabilityQueryL()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::AvailabilityQueryL" );
    MultimediaSharing::TMusAvailabilityStatus status
            = Availability();
   
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::AvailabilityQueryL" );
    return status;
    }
 // -----------------------------------------------------------------------------
// CMusManagerServerCore::InvestigateAvailability
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::CommandL( MultimediaSharing::TCommandType aCommandType )
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::CommandL" );
     if ( aCommandType == MultimediaSharing::ECommandManualActivation &&
          IsMusEnginePlugin() )
		{
		MUS_LOG( "mus: [MUSSRV]    Manual Activation is started" )
		iPluginManager->ManualQueryL();
		}
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::CommandL" );
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::InvestigateAvailability
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::InvestigateAvailabilityL()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::InvestigateAvailabilityL" );
    if ( IsMusEnginePlugin() )
        {
        iPluginManager->InvestigateAvailabilityL();
        }
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::InvestigateAvailabilityL" );
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::InvitationReceived
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::InvitationReceivedL( TUid aChannelId )
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::InvitationReceivedL" );

    TInt uid = aChannelId.iUid;

    if( uid == CMusManager::ESipInviteDesired &&
        ApplicationAllowed() )
        {        
        PrepareForReceivedInviteL();
        
        // write session boundary values
        WriteSessionPropertiesL(
                MultimediaSharing::EMusReceive,
                Availability(),
                iPluginManager->SessionParametersL() );

        iApplicationManager->StartApplicationL();
        }
    else if( uid == CMusManager::ESipInviteDesired2WayVideo &&
            ApplicationAllowed() )
        {
        PrepareForReceivedInviteL();
        
        // write session boundary values
        WriteSessionPropertiesL(
                MultimediaSharing::EMusReceiveTwoWayVideo,
                Availability(),
                iPluginManager->SessionParametersL() );

        iApplicationManager->StartApplicationL();
        }
    else if ( IsMusEnginePlugin() )
        {
        if( uid == CMusManager::ESipInviteNotDesired )
            {
            iPluginManager->InvitationReceivedL();
            }
        else
            {
            User::Leave( KErrNotReady );
            }
        }

    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::InvitationReceivedL" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::OptionsReceivedL( TUid /*aChannelId*/ )
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::OptionsReceivedL" );
    if ( IsMusEnginePlugin() )
        {
        iPluginManager->OptionsReceivedL();    
        }    
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::OptionsReceivedL" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::StartMultimediaSharingL( MultimediaSharing::TMusUseCase aUseCase )
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::StartMultimediaSharingL" );
    if( !iApplicationManager->ApplicationRunning() &&
        ApplicationAllowed() )
        {
        // write session boundary values
        WriteSessionPropertiesL(
                aUseCase,
                Availability(),
                iPluginManager->SessionParametersL() );

        // start actual application
        iApplicationManager->StartApplicationL();
        }
    else
        {
        iApplicationManager->ShowApplicationL();
        }
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::StartMultimediaSharingL" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::StopMultimediaSharingL()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::StopMultimediaSharingL" );
    iApplicationManager->StopApplicationL();
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::StopMultimediaSharingL" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::EventNoSessions()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::EventNoSessions" );
    if ( IsMusEnginePlugin() ) 
        {
        TRAPD( error, iPluginManager->StopPluginL() );
        if( error )
            {
            // iObserver.StopServer();
            }        
        }
    iObserver.StopServer();
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::EventNoSessions" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::PluginStopped()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::PluginStopped" );
    if( iObserver.SessionCount() == 0 )
        {
        iObserver.StopServer();
        }
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::PluginStopped" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::AvailabilityChangedL(
    MultimediaSharing::TMusAvailabilityStatus aAvailability )
    {
    MUS_LOG1( "mus: [MUSSRV]  -> CMusManagerServerCore::AvailabilityChangedL( %d )",
              aAvailability );
    
    if ( !IsMusEnginePlugin() )
        {
        MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::AvailabilityChangedL - \
                non-MuS plugin");
        return;
        }
    // inform ui via application manager (via session api)

    WriteSessionPropertiesL(
            aAvailability,
            iPluginManager->SessionParametersL() );
    
    if( iAvailabilityMonitors.Count() )
    	{	
    	// go through interested client sessions
	    for( TInt i=0; i<iAvailabilityMonitors.Count(); i++ )
	        {
	        // and inform each about the new status
	       	iAvailabilityMonitors[i]->AvailabilityChangedL( 
	       		aAvailability );
	        }
    	}
    
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::AvailabilityChangedL" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::CancelMonitoring( MMusMonitorAvailabilityObserver* aObserver )
	{
	TInt index = iAvailabilityMonitors.Find( aObserver );
		
	if( index != KErrNotFound )
		{
		iAvailabilityMonitors[index]->RequestComplete();
		iAvailabilityMonitors.Remove( index );
		}	
	}


// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::RegisterObserverL( 
									MMusMonitorAvailabilityObserver* aObserver )
	{
    if( iAvailabilityMonitors.Find( aObserver ) == KErrNotFound )
		{
		iAvailabilityMonitors.AppendL( aObserver );
		}
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::RegisterObserver" );	
	}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//	
void CMusManagerServerCore::RemoveObserver( MMusMonitorAvailabilityObserver* aObserver )
	{
	MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::RemoveObserver" );
    TInt index = iAvailabilityMonitors.Find( aObserver );
		
	if( index != KErrNotFound )
		{
		iAvailabilityMonitors.Remove( index );
		}
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::RemoveObserver" );	
	}

// -----------------------------------------------------------------------------
// From MMusAvailabilityPluginManagerObserver.
// Starts live video sharing.
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::StartSharingWithUseCaseL( 
    MultimediaSharing::TMusUseCase aUseCase )
    {
    MUS_LOG1( "mus: [MUSSRV]  -> CMusManagerServerCore::StartSharingWithUseCaseL:%d", 
              aUseCase );
    
    StartMultimediaSharingL( aUseCase );
    
    MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::StartSharingWithUseCaseL" );
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::StopMonitoring()
	{
	// go through interested client sessions
    for( TInt i=0; i<iAvailabilityMonitors.Count(); i++ )
        {
        // and inform each about the new status
       	iAvailabilityMonitors[i]->RequestComplete();
       	iAvailabilityMonitors.Remove( i );
        }			
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::IsMusEnginePlugin
// -----------------------------------------------------------------------------
//
TBool CMusManagerServerCore::IsMusEnginePlugin()
    {
    TBool isMus( EFalse );    
    if ( !iPluginName.Compare( KMusEngineName ) )
        {
        isMus = ETrue;
        }
    return isMus;
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::Availability
// -----------------------------------------------------------------------------
//
MultimediaSharing::TMusAvailabilityStatus CMusManagerServerCore::Availability()
    {
    MUS_LOG( "mus: [MUSSRV]  -> CMusManagerServerCore::Availability" );
    if ( IsMusEnginePlugin() ) 
        {
        MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::Availability - MuS plugin" );
        return iPluginManager->Availability();
        }
    else
        {
        MUS_LOG( "mus: [MUSSRV]  <- CMusManagerServerCore::Availability - non-MuS plugin" );
        return EMultimediaSharingAvailable;
        }
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::ApplicationAllowed
// -----------------------------------------------------------------------------
//
TBool CMusManagerServerCore::ApplicationAllowed()
    {
    if ( IsMusEnginePlugin() )
        {
        return iPluginManager->ApplicationAllowed();
        }
    else
        {
        return ETrue;
        }
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::PrepareForReceivedInviteL
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::PrepareForReceivedInviteL()
    {
    if ( IsMusEnginePlugin() )
        {
        iPluginManager->PrepareForReceivedInviteL();
        }
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::WriteSessionPropertiesL
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::WriteSessionPropertiesL(
        MultimediaSharing::TMusUseCase aUseCase,
        MultimediaSharing::TMusAvailabilityStatus aStatus,
        MDesCArray& aSessionParameters )
    {
    if ( IsMusEnginePlugin() )
        {
        iApplicationManager->WriteSessionPropertiesL(
                                    aUseCase,
                                    aStatus,
                                    aSessionParameters );
        }
    }

// -----------------------------------------------------------------------------
// CMusManagerServerCore::WriteSessionPropertiesL
// -----------------------------------------------------------------------------
//
void CMusManagerServerCore::WriteSessionPropertiesL(
        MultimediaSharing::TMusAvailabilityStatus aStatus,
        MDesCArray& aSessionParameters )
    {
    if ( IsMusEnginePlugin() )
        {
        iApplicationManager->WriteSessionPropertiesL(
                                    aStatus,
                                    aSessionParameters );
        }
    }

//  End of File