upnpavcontrolpoint/avcontrolframework/src/upnpstateupdatehandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/** @file
* Copyright (c) 2005-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:  CUpnpStateUpdateHandler
*
*/


// INCLUDE FILES
#include "upnpstateupdatehandler.h"
#include "upnpavcpstring.h"

// CONSTANTS
using namespace UpnpAVCPStrings;
// ================= MEMBER FUNCTIONS =======================

// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::CUpnpStateUpdateHandler
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CUpnpStateUpdateHandler::CUpnpStateUpdateHandler( 
                                         MUpnpAVControlPointObserver& aAVCPObserver,
                                         CUpnpAVControlPoint& aAVCP )
    :iAVControlPointObserver( aAVCPObserver ), iAVCP( aAVCP )
    {
	}

// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CUpnpStateUpdateHandler::ConstructL() 
	{
	}

// -----------------------------------------------------------------------------
// CSuperDir::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CUpnpStateUpdateHandler* CUpnpStateUpdateHandler::NewL(
            MUpnpAVControlPointObserver& aAVCPObserver,
            CUpnpAVControlPoint& aAVCP )
    {
	CUpnpStateUpdateHandler* self = new (ELeave) CUpnpStateUpdateHandler( 
        aAVCPObserver, aAVCP );
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop( self );
	return self;
	}

// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::~CUpnpStateUpdateHandler
// Destructor
// -----------------------------------------------------------------------------
//
CUpnpStateUpdateHandler::~CUpnpStateUpdateHandler()	
	{
	}

// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::ContentDirectoryStateUpdated
// In this function are update events from content directory handled.
// (other items were commented in a header)
// -----------------------------------------------------------------------------
//
TInt CUpnpStateUpdateHandler::ContentDirectoryStateUpdated( CUpnpDevice& aDevice, 
                                                   CUpnpService*& aService)
    {
    CUpnpStateVariable* systemUpdateId = 
        aService->StateVariable( KSystemUpdateID );
    CUpnpStateVariable* containerUpdateIds = 
        aService->StateVariable( KContainerUpdateIDs );
    CUpnpStateVariable* transferIds = 
        aService->StateVariable( KTransferIds );       

    if( !(systemUpdateId || containerUpdateIds || transferIds) )
        {
        return KErrArgument;
        }
        
    //
    if( systemUpdateId )
        {
        TLex8 updateidLex( systemUpdateId->Value() );
        TInt systemUpdate;
        updateidLex.Val( systemUpdate );
        iAVControlPointObserver.CdsUpdateEvent(
            aDevice.Uuid(),
            systemUpdate
            );
        }
    if( containerUpdateIds )
        {
        iAVControlPointObserver.CdsContainerEvent( 
            aDevice.Uuid(),
            containerUpdateIds->Value() 
            );
        }
    if( transferIds )
        {
        iAVControlPointObserver.CdsTransferEvent( 
            aDevice.Uuid(),
            transferIds->Value() 
            );
        }
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::StateUpdatedL
// This is the place to start handling state updates
// (other items were commented in a header)
// -----------------------------------------------------------------------------
//
TInt CUpnpStateUpdateHandler::StateUpdated(CUpnpService*& aService)
	{
    TInt err( KErrNone );
	CUpnpDevice& device = aService->Device();
    if (aService->ServiceType().Match( KRenderingControl ) != KErrNotFound )
        {
        err =  RenderingControlStateUpdated( device, aService );
        }
    else if (aService->ServiceType().Match( KConnectionManager ) != KErrNotFound )
        {
        err = ConnectionManagerStateUpdated( device, aService );
        }
    else if (aService->ServiceType().Match( KAVTransport ) != KErrNotFound )
        {
        err = AVTransportStateUpdated( device, aService );        
        }
    else if (aService->ServiceType().Match( KContentDirectory ) != KErrNotFound )
        {
        err = ContentDirectoryStateUpdated( device, aService );        
        }
    else
        {
        err = KErrGeneral;
        }
    return err;

    }
// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::RenderingControlStateUpdated
// In this function are rendering control events are handled.
// (other items were commented in a header)
// -----------------------------------------------------------------------------
//
TInt CUpnpStateUpdateHandler::RenderingControlStateUpdated( CUpnpDevice& aDevice,
                                                        CUpnpService*& aService )
    {
    CUpnpStateVariable* lastChange = aService->StateVariable( KLastChange );
    if( !lastChange )
        {
        return KErrArgument;
        }
    else
        {
        iAVControlPointObserver.RcLastChangeEvent(
            aDevice.Uuid(),
            lastChange->Value() 
            );
        return KErrNone;
        }
    }
// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::KAVTransportStateUpdatedL
// In this function are updates for mediarenderer handled.
// (other items were commented in a header)
// -----------------------------------------------------------------------------
//
TInt CUpnpStateUpdateHandler::AVTransportStateUpdated( CUpnpDevice& aDevice,
                                                   CUpnpService*& aService )
    {
    CUpnpStateVariable* lastChange = aService->StateVariable( KLastChange );
    if( !lastChange )
        {
        return KErrArgument;
        }
    else
        {
        iAVControlPointObserver.AvtLastChangeEvent(
            aDevice.Uuid(),
            lastChange->Value() 
            );
        return KErrNone;
        }
    }
// -----------------------------------------------------------------------------
// CUpnpStateUpdateHandler::ConnectionManagerStateUpdated
// In this function are update events from rendering control handled.
// (other items were commented in a header)
// -----------------------------------------------------------------------------
//
TInt CUpnpStateUpdateHandler::ConnectionManagerStateUpdated(CUpnpDevice& aDevice, 
                                                        CUpnpService*& aService)
    {
    CUpnpStateVariable* source = 
        aService->StateVariable( KSourceProtocolInfo );
    CUpnpStateVariable* sink = 
        aService->StateVariable( KSinkProtocolInfo );
    CUpnpStateVariable* connections = 
        aService->StateVariable( KCurrentConnectionIds );       
    
    if( !(source || sink || connections) )
        {
        return KErrArgument;
        }
        
    if( source )
        {
        iAVControlPointObserver.CmSourceEvent(
            aDevice.Uuid(),
            source->Value()
            );
        }
    if( sink )
        {
        iAVControlPointObserver.CmSinkEvent( 
            aDevice.Uuid(),
            sink->Value() 
            );
        }
    if( connections )
        {
        iAVControlPointObserver.CmConnectionsEvent( 
            aDevice.Uuid(),
            connections->Value() 
            );
        }

    return KErrNone;
    }