fmradio/fmradioengine/src/fmradiopropertyobserver.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 00:17:10 +0200
changeset 0 f3d95d9c00ab
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2004-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: Observer for FMRadio property values  
*
*/


#include "fmradiopropertyobserver.h"

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CFMRadioPropertyObserver::CFMRadioPropertyObserver(MFMRadioPropertyChangeObserver& aObserver, const TUid& aCategory, const TUint aKey, const TFMRadioPropertyType aPropertyType)
    : CActive( CActive::EPriorityStandard ),
    iObserver( aObserver ),
    iCategory( aCategory ),
    iKey( aKey ),
    iPropertyType( aPropertyType )
	{
	}

// -----------------------------------------------------------------------------
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CFMRadioPropertyObserver::ConstructL()
	{
    switch (iPropertyType)
        {
        case EFMRadioPropertyInt:
	        {
	        break;
	        }
	    case EFMRadioPropertyByteArray:
	        {
	        iValueByteArray = HBufC8::NewL( RProperty::KMaxPropertySize );
	        break;
	        }
	    case EFMRadioPropertyText:
	        {
	        // Max size in bytes, length is size / 2
	        iValueText = HBufC::NewL( RProperty::KMaxPropertySize / 2 );
	        break;
	        }
	    default:
	        {
	        break;
	        }
        }

    User::LeaveIfError( iProperty.Attach( iCategory, iKey ) );
    CActiveScheduler::Add( this );
	}

// -----------------------------------------------------------------------------
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CFMRadioPropertyObserver* CFMRadioPropertyObserver::NewL( MFMRadioPropertyChangeObserver& aObserver,
                                                          const TUid& aCategory,
                                                          const TUint aKey,
                                                          const TFMRadioPropertyType aPropertyType )
    {
    CFMRadioPropertyObserver* self = NewLC( aObserver,
                                            aCategory,
                                            aKey,
                                            aPropertyType );
    CleanupStack::Pop( self );
    return self;
    }

// -----------------------------------------------------------------------------
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CFMRadioPropertyObserver* CFMRadioPropertyObserver::NewLC( MFMRadioPropertyChangeObserver& aObserver,
														  const TUid& aCategory,
														  const TUint aKey,
														  const TFMRadioPropertyType aPropertyType )
	{
    CFMRadioPropertyObserver* self = new( ELeave )CFMRadioPropertyObserver( aObserver,
    																   		aCategory,
    																   		aKey,
    																   		aPropertyType );
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
	}

// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
//
CFMRadioPropertyObserver::~CFMRadioPropertyObserver()
	{
	Cancel();
    iProperty.Close();
    delete iValueByteArray;
    delete iValueText;
	}

// ---------------------------------------------------------------------------
// Subscribes to a property and reads the value, if not already active.
// ---------------------------------------------------------------------------
//
void CFMRadioPropertyObserver::ActivateL()
	{
    if ( !IsActive() )
        {
        RunL();
        }
	}

// -----------------------------------------------------------------------------
// CFMRadioPropertyObserver::RunL
// -----------------------------------------------------------------------------
//
void CFMRadioPropertyObserver::RunL()
	{	
    iProperty.Subscribe( iStatus );
    SetActive();
    
    TInt err(KErrNone);
    
    switch (iPropertyType)
        {
        case EFMRadioPropertyInt:
	        {
	        err = iProperty.Get( iValueInt );
	        if (!err)
            	{
                iObserver.HandlePropertyChangeL( iCategory, iKey, iValueInt );
             	}
	        break;
	        }
		case EFMRadioPropertyByteArray:
	        {
	        TPtr8 ptr8( iValueByteArray->Des() );
	        err = iProperty.Get( ptr8 );
	        if (!err)
            	{
                iObserver.HandlePropertyChangeL( iCategory, iKey, *iValueByteArray );
             	}
	        break;		        
	        }
		case EFMRadioPropertyText:
	        {
	        TPtr ptr( iValueText->Des() );
	        err = iProperty.Get( ptr );
	        if (!err)
            	{
                iObserver.HandlePropertyChangeL( iCategory, iKey, *iValueText );
             	}
	        break;			        
	        }
	        
	    default:
	        {
	        break;
	        }
        }
    
    if (err)
    	{
        iObserver.HandlePropertyChangeErrorL(iCategory, iKey, err);
     	}
	}

// -----------------------------------------------------------------------------
// Cancels an outstanding active request
// -----------------------------------------------------------------------------
//
void CFMRadioPropertyObserver::DoCancel()
	{
    iProperty.Cancel();
	}

// -----------------------------------------------------------------------------
// Getter for integer value
// -----------------------------------------------------------------------------
//	
TInt CFMRadioPropertyObserver::ValueInt( TBool aUpdate )
	{
	if( aUpdate )
	    {
	    iProperty.Get( iValueInt );
	    }
	return iValueInt;
	}
	
// -----------------------------------------------------------------------------
// Getter for byte array value
// -----------------------------------------------------------------------------
//	
const TDesC8& CFMRadioPropertyObserver::ValueDes8( TBool aUpdate )
	{
   if( aUpdate )
        {
    	TPtr8 ptr8( iValueByteArray->Des() );
    	iProperty.Get( ptr8 );
        }
	return *iValueByteArray;
	}
	
// -----------------------------------------------------------------------------
// Getter for text value
// -----------------------------------------------------------------------------
//	
const TDesC& CFMRadioPropertyObserver::ValueDes( TBool aUpdate )
	{
   if( aUpdate )
        {
    	TPtr ptr( iValueText->Des() );
    	iProperty.Get( ptr );
        }
	return *iValueText;
	}