fmradio/activeidleengine/src/fmradioactiveidleengine.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) 2009 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: FMRadio active idle engine
*
*/


#include <e32std.h>

#include "fmradioactiveidleengine.h"
#include "fmradioactiveidleenginenotifyhandler.h"


/**
* Listing of the subscribed P&S values.
* Changing the order of this enumeration requires changes to CFMRadioActiveIdleEngine::ConstructL as well.
*/

enum TFMRadioActiveIdleStatusObserverArray
    {
    //EFMRadioActiveIdleRadioVolumeObserver,       /**< Index of the radio volume observer. */
    EFMRadioActiveIdleTuningStateObserver,       /**< Index of the tuning state observer. */
    EFMRadioActiveIdleFrequencyObserver,         /**< Index of the current frequency observer. */
    EFMRadioActiveIdleChannelChangeObserver,     /**< Index of the current channel observer. */
    EFMRadioActiveIdleChannelModifyObserver,     /**< Index of the channel modified observer. */
    EFMRadioActiveIdleMuteStateObserver,         /**< Index of the muting state observer. */
    EFMRadioActiveIdleApplicationObserver,       /**< Index of the FM Radio application observer used to observer whether the application is running or not. */
    EFMRadioActiveIdleHeadsetStatusObserver,     /**< Index of the antenna status observer. */
    EFMRadioActiveIdleDecimalCountObserver,      /**< Index of the frequency decimal count observer. */
    EFMRadioActiveIdlePowerStateObserver,        /**< Index of the power state observer. */
    EFMRadioActiveIdleRDSProgramServiceObserver,  /**< Index of the RDS Program Service observer. */
    EFMRadioPSDataRDSRadioText,
    EFMRadioPSDataChannelName,
    EFMRadioActiveIdlePresetListCountObserver,   /**< Index of the active preset list count observer */
    EFMRadioActiveIdlePresetListFocusObserver   /**< Index of the active preset list focus observer */
    };

// ==================== LOCAL FUNCTIONS ====================

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

// ---------------------------------------------------------------------------
// Constructor.
// ---------------------------------------------------------------------------
//
CFMRadioActiveIdleEngine::CFMRadioActiveIdleEngine( MFMRadioActiveIdleEngineNotifyHandler& aObserver )
    : iObserver( aObserver )
    {
    }

// ---------------------------------------------------------------------------
// Second-phase constructor.
// ---------------------------------------------------------------------------
//
void CFMRadioActiveIdleEngine::ConstructL()
    {
    //User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioEnginePSUid, KFMRadioPSDataVolume, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataTuningState, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataFrequency, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataChannel, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataChannelDataChanged, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataRadioMuteState, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataApplicationRunning, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataHeadsetStatus, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataFrequencyDecimalCount, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataRadioPowerState, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataRDSProgramService, CFMRadioPropertyObserver::EFMRadioPropertyText ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataRDSRadioText, CFMRadioPropertyObserver::EFMRadioPropertyText ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioPSDataChannelName, CFMRadioPropertyObserver::EFMRadioPropertyText ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioActiveIdlePresetListCount, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    User::LeaveIfError( iPropertyObserverArray.Append( CFMRadioPropertyObserver::NewL( *this, KFMRadioPSUid, KFMRadioActiveIdlePresetListFocus, CFMRadioPropertyObserver::EFMRadioPropertyInt ) ) );
    }

// ---------------------------------------------------------------------------
// Makes all pubsub objects to subscribe.
// ---------------------------------------------------------------------------
//
EXPORT_C void CFMRadioActiveIdleEngine::ActivateL()
	{
	for ( TInt i = 0; i < iPropertyObserverArray.Count(); i++ )
		{
		iPropertyObserverArray[i]->ActivateL();
		}
	}

// ---------------------------------------------------------------------------
// Cancels all pubsub objects.
// ---------------------------------------------------------------------------
//
EXPORT_C void CFMRadioActiveIdleEngine::Cancel()
	{
	for ( TInt i = 0; i < iPropertyObserverArray.Count(); i++ )
		{
		iPropertyObserverArray[i]->Cancel();	
		}
	}

// ---------------------------------------------------------------------------
// Static constructor.
// ---------------------------------------------------------------------------
//
EXPORT_C CFMRadioActiveIdleEngine* CFMRadioActiveIdleEngine::NewL( MFMRadioActiveIdleEngineNotifyHandler& aObserver )
    {
    CFMRadioActiveIdleEngine* self = new ( ELeave ) CFMRadioActiveIdleEngine( aObserver );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// Destructor.
// ---------------------------------------------------------------------------
//
EXPORT_C CFMRadioActiveIdleEngine::~CFMRadioActiveIdleEngine()
    {
    iPropertyObserverArray.ResetAndDestroy();
    iPropertyObserverArray.Close();
	/*
    if ( iServ )
        {
        iServ->Close();
        }
    delete iServ;
    */
    }

// ---------------------------------------------------------------------------
// Invoked when a listened integer P&S key is changed.
// ---------------------------------------------------------------------------
//
void CFMRadioActiveIdleEngine::HandlePropertyChangeL( const TUid& aCategory, TUint aKey, TInt aValue )
    {
    if ( aCategory == KFMRadioPSUid )
        {
        switch ( aKey )
            {/*
            case KFMRadioPSDataVolume:
                iObserver.HandleRadioVolumeChangeL( aValue );
            break;*/
                    
            case KFMRadioPSDataTuningState:
                iObserver.HandleTuningStateChangeL( static_cast<TFMRadioPSTuningState>( aValue ) );
            break;

            case KFMRadioPSDataFrequency:
                iObserver.HandleFrequencyChangeL( aValue );
            break;
            
            case KFMRadioPSDataChannel:
                // Sync the cache values for channel name and index
                iPropertyObserverArray[EFMRadioPSDataChannelName]->ValueDes( ETrue );
                iObserver.HandleChannelChangeL( aValue );
            break;

            case KFMRadioPSDataChannelDataChanged:
                iPropertyObserverArray[EFMRadioPSDataChannelName]->ValueDes( ETrue );
                iObserver.HandleChannelModifyL( aValue );
            break;

            case KFMRadioPSDataRadioMuteState:
                iObserver.HandleMuteStateChangeL( static_cast<TFMRadioPSRadioMuteState>( aValue ) );
            break;

            case KFMRadioPSDataApplicationRunning:
                iObserver.HandleApplicationRunningStateChangeL( static_cast<TFMRadioPSApplicationRunningState>( aValue ) );
            break;
            
            case KFMRadioPSDataHeadsetStatus:
                iObserver.HandleAntennaStatusChangeL( static_cast<TFMRadioPSHeadsetStatus>( aValue ) );
            break;
        
            case KFMRadioPSDataFrequencyDecimalCount:
                iObserver.HandleFrequencyDecimalCountChangeL( static_cast<TFMRadioPSFrequencyDecimalCount>( aValue ) );
            break;

            case KFMRadioPSDataRadioPowerState:
                iObserver.HandlePowerStateChangeL( static_cast<TFMRadioPSRadioPowerState>( aValue ) );
            break;
            
            case KFMRadioActiveIdlePresetListCount:
               iObserver.HandlePresetListCountChangeL( aValue );
            break;
            
            case KFMRadioActiveIdlePresetListFocus:
               //iObserver.HandlePresetListFocusChangeL( aValue );
            break;
            
            default:
            break;
            }
        }
    }

// ---------------------------------------------------------------------------
// Invoked when a listened byte array P&S key is changed.
// ---------------------------------------------------------------------------
//
//void CFMRadioActiveIdleEngine::HandlePropertyChangeL( const TUid& /*aCategory*/, TUint /*aKey*/, const TDesC8& /*aValue*/ )
//    {
//    }
    
// ---------------------------------------------------------------------------
// Invoked when a listened text P&S key is changed.
// ---------------------------------------------------------------------------
//

void CFMRadioActiveIdleEngine::HandlePropertyChangeL( const TUid& aCategory, TUint aKey, const TDesC& aValue )
    {
	if ( aCategory == KFMRadioPSUid )
    	{
    	switch ( aKey )
    	    {
            case KFMRadioPSDataRDSProgramService:
    	        iObserver.HandleRDSProgramServiceChangeL( aValue );
    	    break;
            case KFMRadioPSDataRDSRadioText:
                iObserver.HandleRDSRadioTextChangeL( aValue );
                break;
            case KFMRadioPSDataChannelName:
                // Sync the cache valuse for channel name and index
                iPropertyObserverArray[EFMRadioActiveIdleChannelChangeObserver]->ValueInt( ETrue );
                iObserver.HandleChannelNameChangeL( aValue );
                break;
            default:
            break;
    	    }
    	}

    }
// ---------------------------------------------------------------------------
// Invoked when a listened text P&S key is changed.
// ---------------------------------------------------------------------------
//
void CFMRadioActiveIdleEngine::HandlePropertyChangeL( const TUid&, TUint, const TDesC8&)
    {
    }
    
// ---------------------------------------------------------------------------
// Invoked when an error has occured while fetching the new value of any listened P&S key.
// ---------------------------------------------------------------------------
//
void CFMRadioActiveIdleEngine::HandlePropertyChangeErrorL( const TUid& /*aCategory*/, TUint /*aKey*/, TInt aError )
    {
    if (aError < 0)
    	{
    	// If any error should pass to this method, handle it like 'application shutdown'.
    	// This situation will realize whenever the application is killed, by accident/by system/by an app crash
    	// or due to change to offline mode.
		HandlePropertyChangeL(KFMRadioPSUid, KFMRadioPSDataApplicationRunning, EFMRadioPSApplicationClosing);
    	}
    }

// ---------------------------------------------------------------------------
// Returns the current radio volume.
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CFMRadioActiveIdleEngine::RadioVolume() const
    {
    //return iPropertyObserverArray[EFMRadioActiveIdleRadioVolumeObserver]->ValueInt();
    return 0;
    }

// ---------------------------------------------------------------------------
// Sets the radio volume.
// ---------------------------------------------------------------------------
//
EXPORT_C void CFMRadioActiveIdleEngine::AdjustRadioVolume( TFMRadioPSAdjustVolume aVolume ) const
    {
    RProperty::Set( KFMRadioPSUid, KFMRadioPSControlAdjustVolume, aVolume );
    }


// ---------------------------------------------------------------------------
// Returns the current tuning state.
// ---------------------------------------------------------------------------
//
EXPORT_C TFMRadioPSTuningState CFMRadioActiveIdleEngine::TuningState() const
    {
    return static_cast<TFMRadioPSTuningState>( iPropertyObserverArray[EFMRadioActiveIdleTuningStateObserver]->ValueInt() );
    }

// ---------------------------------------------------------------------------
// Returns the current frequency.
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CFMRadioActiveIdleEngine::Frequency() const
    {
    return iPropertyObserverArray[EFMRadioActiveIdleFrequencyObserver]->ValueInt();
    }

// ---------------------------------------------------------------------------
// Returns the currently active channel ID.
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CFMRadioActiveIdleEngine::Channel() const
    {
    return iPropertyObserverArray[EFMRadioActiveIdleChannelChangeObserver]->ValueInt();
    }

// ---------------------------------------------------------------------------
// Returns the currently active channel name.
// ---------------------------------------------------------------------------
//
EXPORT_C const TDesC& CFMRadioActiveIdleEngine::ChannelName() const
    {
    return iPropertyObserverArray[EFMRadioPSDataChannelName]->ValueDes();
    }

// ---------------------------------------------------------------------------
// Returns the current mute state.
// ---------------------------------------------------------------------------
//
EXPORT_C TFMRadioPSRadioMuteState CFMRadioActiveIdleEngine::MuteState() const
    {
    return static_cast<TFMRadioPSRadioMuteState>( iPropertyObserverArray[EFMRadioActiveIdleMuteStateObserver]->ValueInt() );
    }

// ---------------------------------------------------------------------------
// Sets the mute state.
// ---------------------------------------------------------------------------
//
EXPORT_C void CFMRadioActiveIdleEngine::SetMuteState( TFMRadioPSRadioMuteState aMuteState ) const
    {
    RProperty::Set( KFMRadioPSUid, KFMRadioPSControlSetRadioMuteState, aMuteState );
    }

// ---------------------------------------------------------------------------
// Returns the current antenna connectivity status.
// ---------------------------------------------------------------------------
//
EXPORT_C TFMRadioPSHeadsetStatus CFMRadioActiveIdleEngine::AntennaStatus() const
    {
    return static_cast<TFMRadioPSHeadsetStatus>( iPropertyObserverArray[EFMRadioActiveIdleHeadsetStatusObserver]->ValueInt() );
    }

// ---------------------------------------------------------------------------
// Returns the current frequency decimal count.
// ---------------------------------------------------------------------------
//
EXPORT_C TFMRadioPSFrequencyDecimalCount CFMRadioActiveIdleEngine::FrequencyDecimalCount() const
    {
    return static_cast<TFMRadioPSFrequencyDecimalCount>( iPropertyObserverArray[EFMRadioActiveIdleDecimalCountObserver]->ValueInt() );
    }

// ---------------------------------------------------------------------------
// Returns FM Radio application's running state.
// ---------------------------------------------------------------------------
//
EXPORT_C TFMRadioPSApplicationRunningState CFMRadioActiveIdleEngine::ApplicationRunningState() const
    {
    return static_cast<TFMRadioPSApplicationRunningState>( iPropertyObserverArray[EFMRadioActiveIdleApplicationObserver]->ValueInt() );
    }

// ---------------------------------------------------------------------------
// Returns the radio's power state.
// ---------------------------------------------------------------------------
//
EXPORT_C TFMRadioPSRadioPowerState CFMRadioActiveIdleEngine::PowerState() const
    {
    return static_cast<TFMRadioPSRadioPowerState>( iPropertyObserverArray[EFMRadioActiveIdlePowerStateObserver]->ValueInt() );
    }

// ---------------------------------------------------------------------------
// Returns RDS Program Service information.
// ---------------------------------------------------------------------------
//

EXPORT_C const TDesC& CFMRadioActiveIdleEngine::RDSProgramService() const
    {
    return iPropertyObserverArray[EFMRadioActiveIdleRDSProgramServiceObserver]->ValueDes();
    }

// ================= OTHER EXPORTED FUNCTIONS ==============