radioengine/settings/src/cradioenginesettings.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:15:02 +0300
branchRCL_3
changeset 19 cce62ebc198e
permissions -rw-r--r--
Revision: 201031 Kit: 201035

/*
* 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:
*
*/

// System includes
#include <barsread.h>
#include <coemain.h>
#include <bautils.h>
#include <data_caging_path_literals.hrh>
#include <fmradioenginesettings.rsg>
#include <centralrepository.h>

// User includes
#include "radiointernalcrkeys.h"
#include "radioenginedef.h"
#include "cradioenginesettings.h"
#include "cradiosettingsimp.h"
#include "mradiosettingsobserver.h"
#include "cradioenginelogger.h"

// This has to be the last include.
#ifdef STUB_CONSTELLATION
#   include <RadioStubManager.h>
#endif //STUB_CONSTELLATION


 /**
  * On/Off type flags used by TBitFlags.
  */
 enum TFlagValues
     {
      EHeadsetVolMuted      = 1 << 0
     ,ESpeakerVolMuted      = 1 << 1
     ,EPowerOn              = 1 << 2
     ,EStereoOutput         = 1 << 3
     ,EHeadsetAudioRoute    = 1 << 4
     };

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

 // ---------------------------------------------------------------------------
 // Normalize return value from TBitFlags to 1 or 0 just in case
 // Two negations: 16 => 0 => 1
 // ---------------------------------------------------------------------------
 //
static TBool NormalizeBool( TBool aBool )
    {
    // Normalize return value from TBitFlags to 1 or 0 just in case
    // Two negations: 16 => 0 => 1
    return !( !aBool );
    }


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

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
CRadioEngineSettings* CRadioEngineSettings::NewL( CRadioSettingsImp& aRadioSettingsImp )
    {
    LEVEL3( LOG_METHOD_AUTO );
    CRadioEngineSettings* self = new ( ELeave ) CRadioEngineSettings( aRadioSettingsImp );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CRadioEngineSettings::ConstructL()
    {
    LEVEL3( LOG_METHOD_AUTO );
    iRepository = CRepository::NewL( KRadioCRUid );

    InitializeRegionsL();

    InitializeDataHolders();
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
CRadioEngineSettings::CRadioEngineSettings( CRadioSettingsImp& aRadioSettingsImp )
    : iRadioSettingsImp( aRadioSettingsImp )
    {
    LEVEL3( LOG_METHOD_AUTO );
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
CRadioEngineSettings::~CRadioEngineSettings()
    {
    LEVEL3( LOG_METHOD_AUTO );
    iRegions.ResetAndDestroy();
    iRegions.Close();
    iResFile.Close();
    delete iRepository;
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
// ---------------------------------------------------------------------------
//
void CRadioEngineSettings::SetObserver( MRadioSettingsObserver* aObserver )
    {
    LEVEL3( LOG_METHOD_AUTO );
    iObserver = aObserver;
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetHeadsetVolume( TInt aVolume )
    {
    LEVEL3( LOG_METHOD_AUTO );
    TInt err = iRepository->Set( KRadioCRHeadsetVolume, aVolume );
    if ( !err )
        {
        iHeadsetVolume = aVolume;
        }
    return err;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::HeadsetVolume() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iHeadsetVolume;
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetSpeakerVolume( TInt aVolume )
    {
    LEVEL3( LOG_METHOD_AUTO );
    TInt err = iRepository->Set( KRadioCRSpeakerVolume, aVolume );
    if ( !err )
        {
        iSpeakerVolume = aVolume;
        }
    return err;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SpeakerVolume() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iSpeakerVolume;
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetVolume( TInt aVolume )
    {
    LEVEL3( LOG_METHOD_AUTO );
    if ( AudioRoute() == RadioEngine::ERadioHeadset )
        {
        return SetHeadsetVolume( aVolume );
        }
    else
        {
        return SetSpeakerVolume( aVolume );
        }
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::Volume() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    if ( AudioRoute() == RadioEngine::ERadioHeadset )
        {
        return HeadsetVolume();
        }
    else
        {
        return SpeakerVolume();
        }
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetOutputMode( TInt aOutputMode )
    {
    LEVEL3( LOG_METHOD_AUTO );
    TInt err = iRepository->Set( KRadioCROutputMode, aOutputMode );
    if ( !err )
        {
        iFlags.Assign( EStereoOutput, aOutputMode == RadioEngine::ERadioStereo );
        }
    return err;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::OutputMode() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iFlags.IsSet( EStereoOutput ) ? RadioEngine::ERadioStereo : RadioEngine::ERadioMono;
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
// Stores the radio audio route ( headset/ihf ) to use.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetAudioRoute( TInt aAudioRoute )
    {
    LEVEL3( LOG_METHOD_AUTO );
    TInt err = iRepository->Set( KRadioCRAudioRoute, aAudioRoute );
    if ( !err )
        {
        iFlags.Assign( EHeadsetAudioRoute, aAudioRoute == RadioEngine::ERadioHeadset );
        }
    return err;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
// Retrieves the radio audio route in use.
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::AudioRoute() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iFlags.IsSet( EHeadsetAudioRoute ) ? RadioEngine::ERadioHeadset : RadioEngine::ERadioSpeaker;
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetHeadsetVolMuted( TBool aMuted )
    {
    LEVEL3( LOG_METHOD_AUTO );
    return SetFlagValue( KRadioCRHeadsetMuteState, EHeadsetVolMuted, aMuted );
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TBool CRadioEngineSettings::IsHeadsetVolMuted() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return NormalizeBool( iFlags.IsSet( EHeadsetVolMuted ) );
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetSpeakerVolMuted( TBool aMuted )
    {
    LEVEL3( LOG_METHOD_AUTO );
    return SetFlagValue( KRadioCRSpeakerMuteState, ESpeakerVolMuted, aMuted );
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TBool CRadioEngineSettings::IsSpeakerVolMuted() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return NormalizeBool( iFlags.IsSet( ESpeakerVolMuted ) );
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetVolMuted( TBool aMuted )
    {
    LEVEL3( LOG_METHOD_AUTO );
    if ( AudioRoute() == RadioEngine::ERadioHeadset )
        {
        return SetHeadsetVolMuted( aMuted );
        }
    else
        {
        return SetSpeakerVolMuted( aMuted );
        }
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TBool CRadioEngineSettings::IsVolMuted() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    if ( AudioRoute() == RadioEngine::ERadioHeadset )
        {
        return IsHeadsetVolMuted();
        }
    else
        {
        return IsSpeakerVolMuted();
        }
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetPowerOn( TBool aPowerState )
    {
    LEVEL3( LOG_METHOD_AUTO );
    return SetFlagValue( KRadioCRRadioPowerState, EPowerOn, aPowerState );
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TBool CRadioEngineSettings::IsPowerOn() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return NormalizeBool( iFlags.IsSet( EPowerOn ) );
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetTunedFrequency( TUint32 aFrequency )
    {
    LEVEL3( LOG_METHOD_AUTO );
    TInt err = iRepository->Set( KRadioCRTunedFrequency, static_cast<TInt>( aFrequency ) );
    if ( !err )
        {
        iFrequency = aFrequency;
        }
    return err;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TUint32 CRadioEngineSettings::TunedFrequency() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iFrequency;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::DefaultMinVolumeLevel() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iDefaultMinVolume;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::CountRegions() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iRegions.Count();
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
CRadioRegion& CRadioEngineSettings::Region( TInt aIndex ) const
    {
    LEVEL3( LOG_METHOD_AUTO );
    if ( aIndex == KErrNotFound )
        {
        aIndex = RegionIndexForId( DefaultRegion() );
        }

    return *iRegions[aIndex];
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TRadioRegion CRadioEngineSettings::RegionId() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iRegionId;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TRadioRegion CRadioEngineSettings::DefaultRegion() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return iDefaultRegion;
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TPtrC CRadioEngineSettings::NetworkId() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return TPtrC( iNetworkId );
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TPtrC CRadioEngineSettings::CountryCode() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return TPtrC( iCountryCode );
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetRegionId( TInt aRegion )
    {
    LEVEL3( LOG_METHOD_AUTO );
    __ASSERT_ALWAYS( RegionIndexForId( aRegion ) != KErrNotFound,
                     User::Panic( _L( "CRadioEngineSettings" ), KErrArgument ) );

    TInt err = iRepository->Set( KRadioCRCurrentRegion, aRegion );
    if ( !err )
        {
        iRegionId = static_cast<TRadioRegion>( aRegion );
        UpdateCurrentRegionIdx( aRegion );
        err = SetTunedFrequency( Region( iCurrentRegionIdx ).MinFrequency() );
        }
    return err;
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetNetworkId( const TDesC& aNetworkId )
    {
    LEVEL3( LOG_METHOD_AUTO );
    iNetworkId.Copy( aNetworkId.Left( iNetworkId.MaxLength() ) );
    return iRepository->Set( KRadioCRNetworkId, iNetworkId );
    }

// ---------------------------------------------------------------------------
// From class MRadioSettingsSetter.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetCountryCode( const TDesC& aCountryCode )
    {
    LEVEL3( LOG_METHOD_AUTO );
    iCountryCode.Copy( aCountryCode.Left( iCountryCode.MaxLength() ) );
    return iRepository->Set( KRadioCRCountryCode, iCountryCode );
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TUint32 CRadioEngineSettings::FrequencyStepSize() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return Region( iCurrentRegionIdx ).StepSize();
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TUint32 CRadioEngineSettings::MaxFrequency() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return Region( iCurrentRegionIdx ).MaxFrequency();
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TUint32 CRadioEngineSettings::MinFrequency() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return Region( iCurrentRegionIdx ).MinFrequency();
    }

// ---------------------------------------------------------------------------
// From class MRadioEngineSettings.
//
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::DecimalCount() const
    {
    LEVEL3( LOG_METHOD_AUTO );
    return Region( iCurrentRegionIdx ).DecimalCount();
    }

// ---------------------------------------------------------------------------
// Initializes the data holders
// ---------------------------------------------------------------------------
//
void CRadioEngineSettings::InitializeDataHolders()
    {
    TInt temp = 0;
    GetRepositoryValue( KRadioCRHeadsetMuteState, temp, EFalse );
    iFlags.Assign( EHeadsetVolMuted, temp );

    temp = RadioEngine::ERadioHeadsetDefaultVolume;
    GetRepositoryValue( KRadioCRHeadsetVolume, temp, temp );
    iHeadsetVolume = temp;

    temp = 0;
    GetRepositoryValue( KRadioCRSpeakerMuteState, temp, EFalse );
    iFlags.Assign( ESpeakerVolMuted, temp );

    temp = RadioEngine::ERadioSpeakerDefaultVolume;
    GetRepositoryValue( KRadioCRSpeakerVolume, temp, temp );
    iSpeakerVolume = temp;

    temp = 0;
    GetRepositoryValue( KRadioCRRadioPowerState, temp, EFalse );
    iFlags.Assign( EPowerOn, temp );

    temp = RadioEngine::ERadioStereo;
    if ( GetRepositoryValue( KRadioCROutputMode, temp, temp ) )
        {
        iFlags.Assign( EStereoOutput, temp == RadioEngine::ERadioStereo );
        }

    temp = RadioEngine::ERadioHeadset;
    if ( GetRepositoryValue( KRadioCRAudioRoute, temp, temp ) )
        {
        iFlags.Assign( EHeadsetAudioRoute, temp == RadioEngine::ERadioHeadset );
        }

    temp = RadioEngine::ERadioDefaultMinVolume;
    GetRepositoryValue( KRadioCRDefaultMinVolumeLevel, temp, temp );
    iDefaultMinVolume = temp;

    temp = ERadioRegionDefault;
    GetRepositoryValue( KRadioCRDefaultRegion, temp, temp );
    iDefaultRegion = static_cast<TRadioRegion>( temp );

    temp = iDefaultRegion;
    GetRepositoryValue( KRadioCRCurrentRegion, temp, temp );
    iRegionId = static_cast<TRadioRegion>( temp );
    UpdateCurrentRegionIdx( iRegionId );

    temp = MinFrequency();
    GetRepositoryValue( KRadioCRTunedFrequency, temp, temp );
    iFrequency = static_cast<TUint32>( temp );
    }

// ---------------------------------------------------------------------------
// Gets a repository value and sets the default value if the key is not found
// ---------------------------------------------------------------------------
//
TBool CRadioEngineSettings::GetRepositoryValue( int aKey, TInt& aValue, TInt aDefault )
    {
    TInt temp = 0;
    TInt err = iRepository->Get( aKey, temp );
    if ( !err )
        {
        aValue = temp;
        return ETrue;
        }
    else if ( err == KErrNotFound )
        {
        if ( iRepository->Set( aKey, aDefault ) == KErrNone )
            {
            aValue = aDefault;
            return ETrue;
            }
        }
    return EFalse;
    }

// ---------------------------------------------------------------------------
// Sets a boolean value to cenrep and data holder
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::SetFlagValue( int aKey, int aFlagId, TInt aValue )
    {
    TInt err = iRepository->Set( aKey, aValue );
    if ( !err )
        {
        iFlags.Assign( aFlagId, aValue );
        }
    return err;
    }

// ---------------------------------------------------------------------------
// Initializes the regions based on resources.
// ---------------------------------------------------------------------------
//
void CRadioEngineSettings::InitializeRegionsL()
    {
    LEVEL3( LOG_METHOD_AUTO );
    iRegions.ResetAndDestroy();

    TResourceReader reader;

    TFileName resourceFileName;
    resourceFileName.Append( KRadioSettingsResourceFile );

    //User::LeaveIfError( iRadioSettingsImp.FsSession().Connect() );

    //TODO: Remove the ResolveDriveL
    iRadioSettingsImp.ResolveDriveL( resourceFileName, KDC_RESOURCE_FILES_DIR );
    BaflUtils::NearestLanguageFile( iRadioSettingsImp.FsSession(), resourceFileName);

    iResFile.OpenL( iRadioSettingsImp.FsSession(), resourceFileName);

    iResFile.ConfirmSignatureL();
    HBufC8* readBuffer = iResFile.AllocReadLC(R_QRAD_REGIONS);
    reader.SetBuffer(readBuffer);
    TInt regionCount = reader.ReadInt16();

    for ( TInt i = 0; i < regionCount; ++i )
        {
        TInt resId = reader.ReadInt32(); // The next resource ID to read.
        HBufC8* regionBuffer = iResFile.AllocReadLC(resId);
        TResourceReader regionReader;
        regionReader.SetBuffer(regionBuffer);

        CRadioRegion* region = CRadioRegion::NewL( regionReader );
        CleanupStack::PushL( region );

        if ( IsRegionAllowed( region->Id() ))
            {
            User::LeaveIfError( iRegions.Append( region ) );
            CleanupStack::Pop( region );
            }
        else{
            CleanupStack::PopAndDestroy( region );
            }
        CleanupStack::PopAndDestroy(regionBuffer);
        }

    if ( CountRegions() <= 0 || !IsRegionAllowed( DefaultRegion() ) )
        {
        User::Leave( KErrCorrupt );
        }

    UpdateCurrentRegionIdx( RegionId() );
    CleanupStack::PopAndDestroy(readBuffer);
    }

// ---------------------------------------------------------------------------
// Converts Region ID to index
// ---------------------------------------------------------------------------
//
TInt CRadioEngineSettings::RegionIndexForId( TInt aRegionId ) const
    {
    LEVEL3( LOG_METHOD_AUTO );
    TInt idx = KErrNotFound;
    for ( TInt i = 0 ; i < CountRegions(); ++i )
        {
        if ( Region( i ).Id() == static_cast<TRadioRegion>( aRegionId ) )
            {
            idx = i;
            break;
            }
        }
    return idx;
    }

// ---------------------------------------------------------------------------
// Updates the current region
// ---------------------------------------------------------------------------
//
void CRadioEngineSettings::UpdateCurrentRegionIdx( TInt aRegionId )
    {
    LEVEL3( LOG_METHOD_AUTO );
    iCurrentRegionIdx = RegionIndexForId( aRegionId );
    }

// ---------------------------------------------------------------------------
// Determines if region is allowed .
// ---------------------------------------------------------------------------
//
TBool CRadioEngineSettings::IsRegionAllowed( TRadioRegion aRegionId ) const
    {
    LEVEL3( LOG_METHOD_AUTO );

    TInt regionAllowed( ETrue );
    if ( ERadioRegionJapan == aRegionId )
        {
        TInt err = iRepository->Get( KRadioCRRegionAllowedJapan, regionAllowed );
        if ( err != KErrNone )
            {
            // In case the key is not found or otherwise unsuccessfully read,
            // Japan region is allowed by default.
            regionAllowed = ETrue;
            }
        }

    return TBool( regionAllowed );
    }