radioengine/utils/src/cradiopubsubimp.cpp
changeset 24 6df133bd92e1
parent 13 46974bebc798
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radioengine/utils/src/cradiopubsubimp.cpp	Fri Jun 04 10:21:36 2010 +0100
@@ -0,0 +1,562 @@
+/*
+* 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:
+*
+*/
+
+#include "radiouid.hrh"
+
+#include "cradioenginelogger.h"
+#include "radiointernalpskeys.h"
+
+#include "mradiocontroleventobserver.h"
+#include "cradiopubsub.h"
+#include "cradiopubsubimp.h"
+#include "radioengineutils.h"
+
+// This has to be the last include. 
+#ifdef STUB_CONSTELLATION
+#   include "RadioStubManager.h"
+#   define KRadioPSUid KStub_KRadioPSUid
+#endif //STUB_CONSTELLATION
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CRadioPubSubImp::CRadioPubSubImp()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CRadioPubSubImp::ConstructL()
+    {
+    RadioEngineUtils::InitializeL();
+    LOG_METHOD_AUTO;
+
+    // Define data properties.
+    DefinePropertyL( KRadioPSDataChannel,               RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataFrequency,             RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataRadioPowerState,       RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataVolume,                RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataChannelDataChanged,    RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataTuningState,           RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataRadioMuteState,        RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataApplicationRunning,    RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataHeadsetStatus,         RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataFrequencyDecimalCount, RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataLoudspeakerStatus,     RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataRdsProgramService,     RProperty::EText,   ETrue );
+    DefinePropertyL( KRadioPSDataRdsRadioText,          RProperty::EText,   ETrue );
+    DefinePropertyL( KRadioPSDataChannelName,           RProperty::EText,   ETrue );
+    DefinePropertyL( KRadioPSDataActivePresetListCount, RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataActivePresetListFocus, RProperty::EInt,    ETrue );
+    DefinePropertyL( KRadioPSDataRadioAntennaState,     RProperty::EInt,    ETrue );
+
+    // Define control properties.
+    DefinePropertyL( KRadioPSControlStepToChannel,      RProperty::EInt, EFalse );
+    DefinePropertyL( KRadioPSControlSetChannel,         RProperty::EInt, EFalse );
+    DefinePropertyL( KRadioPSControlSeek,               RProperty::EInt, EFalse );
+    DefinePropertyL( KRadioPSControlStepToFrequency,    RProperty::EInt, EFalse );
+    DefinePropertyL( KRadioPSControlSetFrequency,       RProperty::EInt, EFalse );
+    DefinePropertyL( KRadioPSControlAdjustVolume ,      RProperty::EInt, EFalse );
+    DefinePropertyL( KRadioPSControlSetRadioMuteState,  RProperty::EInt, EFalse );
+    DefinePropertyL( KRadioPSControlSetAudioOutput,     RProperty::EInt, EFalse );
+
+    // Observe control properties.
+    CreatePropertyObserverL( KRadioPSControlStepToChannel,      CRadioPropertyObserver::ERadioPropertyInt );
+    CreatePropertyObserverL( KRadioPSControlSetChannel,         CRadioPropertyObserver::ERadioPropertyInt );
+    CreatePropertyObserverL( KRadioPSControlSeek,               CRadioPropertyObserver::ERadioPropertyInt );
+    CreatePropertyObserverL( KRadioPSControlStepToFrequency,    CRadioPropertyObserver::ERadioPropertyInt );
+    CreatePropertyObserverL( KRadioPSControlSetFrequency,       CRadioPropertyObserver::ERadioPropertyInt );
+    CreatePropertyObserverL( KRadioPSControlAdjustVolume,       CRadioPropertyObserver::ERadioPropertyInt );
+    CreatePropertyObserverL( KRadioPSControlSetRadioMuteState,  CRadioPropertyObserver::ERadioPropertyInt );
+    CreatePropertyObserverL( KRadioPSControlSetAudioOutput,     CRadioPropertyObserver::ERadioPropertyInt );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CRadioPubSubImp* CRadioPubSubImp::NewL()
+    {
+    CRadioPubSubImp* self = new ( ELeave ) CRadioPubSubImp();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CRadioPubSubImp::~CRadioPubSubImp()
+    {
+    iPropertyArray.ResetAndDestroy();
+
+    DeleteProperty( KRadioPSDataChannel );
+    DeleteProperty( KRadioPSDataFrequency );
+    DeleteProperty( KRadioPSDataRadioPowerState );
+    DeleteProperty( KRadioPSDataVolume );
+    DeleteProperty( KRadioPSDataChannelDataChanged );
+    DeleteProperty( KRadioPSDataTuningState );
+    DeleteProperty( KRadioPSDataRadioMuteState );
+    DeleteProperty( KRadioPSDataApplicationRunning );
+    DeleteProperty( KRadioPSDataHeadsetStatus );
+    DeleteProperty( KRadioPSDataFrequencyDecimalCount );
+    DeleteProperty( KRadioPSDataLoudspeakerStatus );
+    DeleteProperty( KRadioPSDataRdsProgramService );
+    DeleteProperty( KRadioPSDataRdsRadioText );
+    DeleteProperty( KRadioPSDataChannelName );
+    DeleteProperty( KRadioPSDataActivePresetListCount );
+    DeleteProperty( KRadioPSDataActivePresetListFocus );
+    DeleteProperty( KRadioPSDataRadioAntennaState );
+
+    DeleteProperty( KRadioPSControlStepToChannel );
+    DeleteProperty( KRadioPSControlSetChannel );
+    DeleteProperty( KRadioPSControlSeek );
+    DeleteProperty( KRadioPSControlStepToFrequency );
+    DeleteProperty( KRadioPSControlSetFrequency );
+    DeleteProperty( KRadioPSControlAdjustVolume );
+    DeleteProperty( KRadioPSControlSetRadioMuteState );
+    DeleteProperty( KRadioPSControlSetAudioOutput );
+
+    RadioEngineUtils::Release();
+    }
+
+// ---------------------------------------------------------------------------
+// Defines a property.
+// ---------------------------------------------------------------------------
+//
+void CRadioPubSubImp::DefinePropertyL( TUint aKey, TInt aAttr, TBool aDataProperty ) const
+    {
+    _LIT_SECURITY_POLICY_PASS( KRadioExternalAccessPolicy );
+    _LIT_SECURITY_POLICY_S0( KRadioInternalAccessPolicy, KUidRadioApplication );
+
+    TInt err = KErrNone;
+    if ( aDataProperty )
+        {
+        // For data properties, grant read access for all, but write access only for radio application
+        err = RProperty::Define( KRadioPSUid, aKey, aAttr, KRadioExternalAccessPolicy, KRadioInternalAccessPolicy );
+        }
+    else
+        {
+        // For control properties, grant read access only for radio application, but write access for all
+        err = RProperty::Define( KRadioPSUid, aKey, aAttr, KRadioInternalAccessPolicy, KRadioExternalAccessPolicy );
+        }
+
+    if ( err && err != KErrAlreadyExists )
+        {
+        LOG_FORMAT( "CRadioPubSubImp::DefinePropertyL: Leaving with %d", err );
+        User::Leave( err );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Deletes a property
+// ---------------------------------------------------------------------------
+//
+void CRadioPubSubImp::DeleteProperty( TUint aKey ) const
+    {
+    RProperty::Delete( KRadioPSUid, aKey );
+    }
+
+// ---------------------------------------------------------------------------
+// Creates a property observer
+// ---------------------------------------------------------------------------
+//
+void CRadioPubSubImp::CreatePropertyObserverL( const TUint aKey,
+                                               const TInt aPropertyType )
+    {
+    CRadioPropertyObserver* observer = CRadioPropertyObserver::NewL( *this, KRadioPSUid,
+                    aKey, static_cast<CRadioPropertyObserver::TRadioPropertyType>( aPropertyType ) );
+
+    if ( iPropertyArray.Append( observer ) == KErrNone )
+        {
+        observer->ActivateL();
+        }
+    else
+        {
+        delete observer;
+        observer = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the integer value stored in a property.
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::Get( TUint aKey, TInt& aValue ) const
+    {
+    return RProperty::Get( KRadioPSUid, aKey, aValue ) == KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Sets a property's value.
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::Set( TUint aKey, TInt aValue ) const
+    {
+    return RProperty::Set( KRadioPSUid, aKey, aValue ) == KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Sets a text property value
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::Set( TUint aKey, const TDesC& aValue ) const
+    {
+    return RProperty::Set( KRadioPSUid, aKey, aValue ) == KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CRadioPubSubImp::HandlePropertyChangeL( const TUid& aCategory,
+                                             const TUint aKey,
+                                             const TInt aValue )
+    {
+    LOG_FORMAT( "CRadioPubSubImp::HandlePropertyChangeL: Category: %d, Key: %u. Value: %d",
+                                                aCategory.iUid, aKey, aValue );
+
+    if ( aCategory != KRadioPSUid )
+        {
+        LOG( "CRadioPubSubImp::HandlePropertyChangeL: Unknown category. Leaving" );
+        User::Leave( KErrArgument );
+        }
+
+    if ( !iObserver )
+        {
+        return;
+        }
+
+    if ( aKey == KRadioPSControlStepToChannel )
+        {
+        if ( aValue == ERadioPSStepToChannelUp )
+            {
+            iObserver->StepToChannelL( RadioEngine::ERadioUp );
+            }
+        else if ( aValue == ERadioPSStepToChannelDown )
+            {
+            iObserver->StepToChannelL( RadioEngine::ERadioDown );
+            }
+        }
+    else if ( aKey == KRadioPSControlSetChannel )
+        {
+        if ( aValue > 0 )
+            {
+            iObserver->SetChannelL( aValue );
+            }
+        }
+    else if ( aKey == KRadioPSControlSeek )
+        {
+        if ( aValue == ERadioPSSeekUp )
+            {
+            iObserver->SeekL( RadioEngine::ERadioUp );
+            }
+        else if ( aValue == ERadioPSSeekDown )
+            {
+            iObserver->SeekL( RadioEngine::ERadioDown );
+            }
+        }
+    else if ( aKey == KRadioPSControlStepToFrequency )
+        {
+        if ( aValue == ERadioPSStepToFrequencyUp )
+            {
+            iObserver->StepToFrequencyL( RadioEngine::ERadioUp );
+            }
+        else if ( aValue == ERadioPSStepToFrequencyDown )
+            {
+            iObserver->StepToFrequencyL( RadioEngine::ERadioDown );
+            }
+        }
+    else if ( aKey == KRadioPSControlSetFrequency )
+        {
+        if ( aValue > 0 )
+            {
+            iObserver->SetFrequencyL( aValue );
+            }
+        }
+    else if ( aKey == KRadioPSControlAdjustVolume )
+        {
+        if ( aValue == ERadioPSIncreaseVolume )
+            {
+            iObserver->AdjustVolumeL( RadioEngine::ERadioIncVolume );
+            }
+        else if ( aValue == ERadioPSDecreaseVolume )
+            {
+            iObserver->AdjustVolumeL( RadioEngine::ERadioDecVolume );
+            }
+        }
+    else if ( aKey == KRadioPSControlSetRadioMuteState )
+        {
+        if ( aValue == ERadioPSMuteStateOn )
+            {
+            iObserver->MuteL( ETrue );
+            }
+        else if ( aValue == ERadioPSMuteStateOff )
+            {
+            iObserver->MuteL( EFalse );
+            }
+        }
+    else if ( aKey == KRadioPSControlSetAudioOutput )
+        {
+        if ( aValue == ERadioPSAudioOutputHeadset )
+            {
+            iObserver->SetAudioRouteL( RadioEngine::ERadioHeadset );
+            }
+        else if ( aValue == ERadioPSAudioOutputSpeaker )
+            {
+            iObserver->SetAudioRouteL( RadioEngine::ERadioSpeaker );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishChannel( TInt aChannelId ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishChannel ( aChannelId = %d )", aChannelId );
+
+    TInt oldChannelId = 0;
+    if ( Get( KRadioPSDataChannel, oldChannelId ) && aChannelId != oldChannelId )
+        {
+        return Set( KRadioPSDataChannel, aChannelId );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishFrequency( TUint32 aFreq ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishFrequency ( aFreq = %u )", aFreq );
+
+    TInt oldFreq = 0;
+    if ( Get( KRadioPSDataFrequency, oldFreq ) && aFreq != oldFreq )
+        {
+        return Set( KRadioPSDataFrequency, aFreq );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishPowerState( TBool aPowerOn ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishStateL ( aPowerOn = %d )", aPowerOn );
+    // If VR process gets killed, power on state remains published.
+    // Must not compare state transition here, because then power on might not be published.
+    TRadioPSRadioPowerState newState = aPowerOn ? ERadioPSRadioPowerOn : ERadioPSRadioPowerOff;
+    return Set( KRadioPSDataRadioPowerState, newState );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishVolume( TInt aVol ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishVolume ( aVol = %d )", aVol );
+
+    TInt oldVol = 0;
+    if ( Get( KRadioPSDataVolume, oldVol ) && aVol != oldVol )
+        {
+        return Set( KRadioPSDataVolume, aVol );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishChannelDataChanged( TInt aChannelId ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishChannelDataChangedL ( aChannelId = %d )", aChannelId );
+
+    // Channel data changed notifications are allowed for the same channel multiple times, as the same channel's
+    // data can be changed many times in a row.
+
+    return Set( KRadioPSDataChannelDataChanged, aChannelId );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishTuningState( TRadioPSTuningState aTuningState ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishSeekingStateL ( aTuningState = %d )", aTuningState );
+
+    TInt oldState = 0;
+    if ( Get( KRadioPSDataTuningState, oldState ) && aTuningState != oldState )
+        {
+        return Set( KRadioPSDataTuningState, aTuningState );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishRadioMuteState( TBool aMuted ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishMuteStateL ( aMuted = %d )", aMuted );
+
+    TRadioPSRadioMuteState newState = aMuted ? ERadioPSMuteStateOn : ERadioPSMuteStateOff;
+
+    TInt oldState = 0;
+    if ( Get( KRadioPSDataRadioMuteState, oldState ) && oldState != newState )
+        {
+        return Set( KRadioPSDataRadioMuteState, newState );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishApplicationRunningState( TRadioPSApplicationRunningState aRunningState ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishApplicationRunningStateL ( aRunningState = %d )", aRunningState );
+    // If VR process gets killed, wrong running state remains published.
+    // Must not compare state transition here, because then application start might not be published.
+    return Set( KRadioPSDataApplicationRunning, aRunningState );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishHeadsetStatus( TRadioPSHeadsetStatus aHeadsetStatus ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishHeadsetStatusL ( aHeadsetStatus = %d )", aHeadsetStatus );
+
+    TInt oldStatus = 0;
+    if ( Get( KRadioPSDataHeadsetStatus, oldStatus ) && aHeadsetStatus != oldStatus )
+        {
+        return Set( KRadioPSDataHeadsetStatus, aHeadsetStatus );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishFrequencyDecimalCount( TRadioPSFrequencyDecimalCount aDecimalCount ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishFrequencyDecimalCountL ( aDecimalCount = %d )", aDecimalCount );
+
+    TInt oldCount = 0;
+    if ( Get( KRadioPSDataFrequencyDecimalCount, oldCount ) && aDecimalCount != oldCount )
+        {
+        return Set( KRadioPSDataFrequencyDecimalCount, aDecimalCount );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishLoudspeakerStatus( TRadioPSLoudspeakerStatus aLoudspeakerStatus ) const
+    {
+    LOG_FORMAT( "CRadioPubSubImp::PublishLoudspeakerStatusL ( aLoudspeakerStatus = %d )", aLoudspeakerStatus );
+    TInt oldStatus = 0;
+    if ( Get( KRadioPSDataLoudspeakerStatus, oldStatus ) && oldStatus != aLoudspeakerStatus )
+        {
+        return Set( KRadioPSDataLoudspeakerStatus, aLoudspeakerStatus );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishRdsProgramService( const TDesC& aProgramService ) const
+    {
+    return Set( KRadioPSDataRdsProgramService, aProgramService );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishRdsRadioText( const TDesC& aRadioText ) const
+    {
+    return Set( KRadioPSDataRdsRadioText, aRadioText );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishChannelName( const TDesC& aName ) const
+    {
+    return Set( KRadioPSDataChannelName, aName );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishActivePreseListCount( TInt aCount ) const
+    {
+    return Set( KRadioPSDataActivePresetListCount, aCount );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishActivePreseListFocus( TInt aIndex ) const
+    {
+    return Set( KRadioPSDataActivePresetListFocus, aIndex );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CRadioPubSubImp::PublishAntennaState( TRadioPSRadioAntennaState aState ) const
+    {
+    return Set( KRadioPSDataRadioAntennaState, aState );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CRadioPubSubImp::SetControlEventObserver( MRadioControlEventObserver* aControlEventObserver )
+    {
+    iObserver = aControlEventObserver;
+    }