diff -r cce62ebc198e -r 93c594350b9a fmradio/fmradiomcpplugin/src/fmradiomcpplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fmradio/fmradiomcpplugin/src/fmradiomcpplugin.cpp Wed Sep 01 12:30:32 2010 +0100 @@ -0,0 +1,767 @@ +/* +* 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: Implementation for the FM Radio Content Publisher Plugin. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fmradioactionhandler.h" +#include "fmradioactionhandler.hrh" +#include "fmradioactionhandlerdefs.h" +#include "fmradioactiveidleengine.h" +#include "fmradioactiveidleenginenotifyhandler.h" +#include "fmradiodefines.h" +#include "debug.h" +#include "fmradiomcpplugin.h" +#include "fmradiomcpplugin.hrh" + +_LIT( KFMRadioMifFileName, "fmradio.mif" ); +_LIT( KFMRadioMifDir, "\\resource\\apps\\" ); + +_LIT( KFMRadioMCPPluginResourceFileName, "fmradiomcpplugin.rsc" ); +_LIT8( KFMRadioPluginUid, "plugin_id" ); +_LIT8( KFMRadioData, "data" ); +_LIT8( KType, "type" ); + +const TUint KFMRadioPrevious = 0x001; //000000000001 +const TUint KFMRadioNext = 0x002; //000000000010 +const TUint KFMRadioMute = 0x004; //000000000100 +const TUint KFMRadioUnmute = 0x008; //000000001000 +const TUint KFMRadioPreviousDimmed = 0x010; //000000010000 +const TUint KFMRadioNextDimmed = 0x020; //000000100000 +const TUint KFMRadioMuteDimmed = 0x040; //000001000000 +const TUint KFMRadioUnmuteDimmed = 0x080; //000010000000 + +CFMRadioMCPPlugin* CFMRadioMCPPlugin::NewL( MMCPPluginObserver* aObserver ) + { + CFMRadioMCPPlugin* self = new ( ELeave ) CFMRadioMCPPlugin( aObserver ); + CleanupStack::PushL( self ); + + self->ConstructL(); + + CleanupStack::Pop( self ); + return self; + } + +CFMRadioMCPPlugin::~CFMRadioMCPPlugin() + { + if ( iResourceOffset > 0 ) + { + CCoeEnv::Static()->DeleteResourceFile( iResourceOffset ); + } + + delete iEngine; + iAntennaNotConnectedText.Close(); + iTuningText.Close(); + iSavedStationFormat.Close(); + iSavedStationFormatNoName.Close(); + iFrequencyFormat.Close(); + + iMifFileName.Close(); + } + +CFMRadioMCPPlugin::CFMRadioMCPPlugin( MMCPPluginObserver* aObserver ) + : iObserver( aObserver ) + { + } + +void CFMRadioMCPPlugin::ConstructL() + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::ConstructL" ))); + InitializeResourceLoadingL(); + + CCoeEnv* coeEnv = CCoeEnv::Static(); + + iAntennaNotConnectedText.Assign( StringLoader::LoadL( R_QTN_FMRADIO_WIDGET_CON_HEADSET, coeEnv ) ); + iTuningText.Assign( StringLoader::LoadL( R_QTN_FMRADIO_WIDGET_TUNING, coeEnv ) ); + iSavedStationFormat.Assign( StringLoader::LoadL( R_QTN_FMRADIO_WIDGET_STATION_SAVED, coeEnv ) ); + iSavedStationFormatNoName.Assign( StringLoader::LoadL( R_QTN_FMRADIO_WIDGET_STATION_SAVED_FREQ, coeEnv ) ); + iFrequencyFormat.Assign( StringLoader::LoadL( R_QTN_FMRADIO_WIDGET_NOTSAVED_FREQUENCY, coeEnv ) ); + + // Release the resource file, because we don't want to keep file handle open. + // That would prevent updating the binary with SIS. + if ( iResourceOffset > 0 ) + { + coeEnv->DeleteResourceFile( iResourceOffset ); + iResourceOffset = 0; + } + + TFindFile finder( coeEnv->FsSession() ); + TInt err = finder.FindByDir( KFMRadioMifFileName, KFMRadioMifDir ); + if ( err == KErrNone ) + { + iMifFileName.CreateL( finder.File() ); + } + + iEngine = CFMRadioActiveIdleEngine::NewL( *this ); + iEngine->ActivateL(); + + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::ConstructL - Exiting." ))); + } + +// --------------------------------------------------------------------------- +// Initialize resource file for loading resources. +// --------------------------------------------------------------------------- +// +void CFMRadioMCPPlugin::InitializeResourceLoadingL() + { + CCoeEnv* coeEnv = CCoeEnv::Static(); + RFs fs( coeEnv->FsSession() ); + TFileName fileName; + TFileName baseResource; + TFindFile finder( fs ); + TLanguage language( ELangNone ); + + TParsePtrC parse( KFMRadioMCPPluginResourceFileName ); + _LIT( resourceFileWildExt, ".r*" ); + + // Make sure to find all resource files, not only .rsc files as it may be so + // that there is only .r01, .r02, etc. files available + fileName.Copy( parse.Name() ); + fileName.Append( resourceFileWildExt ); + + // TFindFile applies search order that is from + // drive Y to A, then Z + CDir* entries = NULL; + TInt err = finder.FindWildByDir( fileName , KDC_RESOURCE_FILES_DIR, entries ); + delete entries; + entries = NULL; + TBool found = EFalse; + while ( !found && err == KErrNone ) + { + // Found file + fileName.Zero(); + TParsePtrC foundPath( finder.File() ); + fileName.Copy( foundPath.DriveAndPath() ); + fileName.Append( KFMRadioMCPPluginResourceFileName ); + BaflUtils::NearestLanguageFile( fs, fileName, language ); + if ( language != ELangNone && BaflUtils::FileExists( fs, fileName ) ) + { + found = ETrue; + iResourceOffset = coeEnv->AddResourceFileL( fileName ); + } + else + { + if ( language == ELangNone && + !baseResource.Compare( KNullDesC ) && + BaflUtils::FileExists( fs, fileName ) ) + { + baseResource.Copy( fileName ); + } + err = finder.FindWild( entries ); + delete entries; + entries = NULL; + } + } + + if ( !found && baseResource.Compare( KNullDesC ) ) + { + // If we found *.rsc then better to use that than nothing + if ( BaflUtils::FileExists( fs, baseResource ) ) + { + iResourceOffset = coeEnv->AddResourceFileL( baseResource ); + found = ETrue; + } + } + + if( !found ) + { + User::Leave( KErrNotFound ); + } + } + +void CFMRadioMCPPlugin::Deactivate() + { + iActive = EFalse; + } + +void CFMRadioMCPPlugin::ActivateL() + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::ActivateL()" ))); + iActive = ETrue; + iObserver->BecameActiveL( this ); + + iObserver->PublishTextL( this, EMusicWidgetDefaultText, KNullDesC ); + + iObserver->PublishImageL( this, EMusicWidgetImage1, + KAknsIIDQgnIndiRadioDefault, + iMifFileName, + EMbmFmradioQgn_indi_radio_default, + EMbmFmradioQgn_indi_radio_default_mask ); + + InstallFMRadioCommandActionL( KFMRadioCommandValueStartNowPlaying, EMusicWidgetTrigger1 ); + HandleChannelChangeL( iEngine->Channel() ); + } + +// --------------------------------------------------------------------------- +// CFMRadioMCPPlugin::UpdatePublishedToolBarL +// --------------------------------------------------------------------------- +// +void CFMRadioMCPPlugin::UpdatePublishedToolBarL( TUint aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - Entering." ))); + if ( iActive ) + { + TAknsItemID iconId; + if ( KFMRadioPrevious & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 1 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnPropImageTbPrev ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB1, + iconId, + iMifFileName, + EMbmFmradioQgn_prop_image_tb_prev, + EMbmFmradioQgn_prop_image_tb_prev_mask ); + InstallFMRadioCommandActionL( KFMRadioCommandValueStepPrevious, EMusicWidgetTB1Trigger ); + iTbPreviousState = KFMRadioPrevious; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 1 Exit" ))); + } + + if ( KFMRadioPreviousDimmed & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 2 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnPropImageTbPrevDimmed ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB1, + iconId, + iMifFileName, + EMbmFmradioQgn_prop_image_tb_prev_dimmed, + EMbmFmradioQgn_prop_image_tb_prev_dimmed_mask ); + InstallEmptyActionL( EMusicWidgetTB1Trigger ); + iTbPreviousState = KFMRadioPreviousDimmed; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 2 Exit" ))); + } + + if ( KFMRadioNext & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 3 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnPropImageTbNext ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB3, + iconId, + iMifFileName, + EMbmFmradioQgn_prop_image_tb_next, + EMbmFmradioQgn_prop_image_tb_next_mask ); + InstallFMRadioCommandActionL( KFMRadioCommandValueStepNext, EMusicWidgetTB3Trigger ); + iTbNextState = KFMRadioNext; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 3 Exit" ))); + } + + if ( KFMRadioNextDimmed & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 4 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnPropImageTbNextDimmed ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB3, + iconId, + iMifFileName, + EMbmFmradioQgn_prop_image_tb_next_dimmed, + EMbmFmradioQgn_prop_image_tb_next_dimmed_mask ); + InstallEmptyActionL( EMusicWidgetTB3Trigger ); + iTbNextState = KFMRadioNextDimmed; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 4 Exit" ))); + } + + if ( KFMRadioMute & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 5 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnIndiMusicWidgetTbRadioSound ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB2, + iconId, + iMifFileName, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound_mask ); + InstallFMRadioCommandActionL( KFMRadioCommandValueUnmute, EMusicWidgetTB2Trigger ); + iTbMuteUnmuteState = KFMRadioMute; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 5 Exit" ))); + } + + if ( KFMRadioUnmute & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 6 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnIndiMusicWidgetTbRadioSoundMuted ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB2, + iconId, + iMifFileName, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound_muted, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound_muted_mask ); + InstallFMRadioCommandActionL( KFMRadioCommandValueMute, EMusicWidgetTB2Trigger ); + iTbMuteUnmuteState = KFMRadioUnmute; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 6 Exit" ))); + } + + if ( KFMRadioMuteDimmed & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 7 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnIndiMusicWidgetTbRadioSoundDimmed ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB2, + iconId, + iMifFileName, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound_dimmed, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound_dimmed_mask ); + InstallEmptyActionL( EMusicWidgetTB2Trigger ); + iTbMuteUnmuteState = KFMRadioMuteDimmed; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 7 Exit" ))); + } + + if ( KFMRadioUnmuteDimmed & aToolBarState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 8 Enter" ))); + iconId.Set( EAknsMajorGeneric, EAknsMinorGenericQgnIndiMusicWidgetTbRadioSoundMutedDimmed ); + iObserver->PublishImageL( this, + EMusicWidgetToolbarB2, + iconId, + iMifFileName, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound_muted_dimmed, + EMbmFmradioQgn_indi_music_widget_tb_radio_sound_muted_dimmed_mask ); + InstallEmptyActionL( EMusicWidgetTB2Trigger ); + iTbMuteUnmuteState = KFMRadioUnmuteDimmed; + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdatePublishedToolBarL - 8 Exit" ))); + } + } + } + +// --------------------------------------------------------------------------- +// CFMRadioMCPPlugin::UpdateToolBarL +// --------------------------------------------------------------------------- +// +void CFMRadioMCPPlugin::UpdateToolBarL( TBool aForceApplicationClosing ) + { + if ( iActive ) + { + TUint muteDimmedState = iEngine->MuteState() == EFMRadioPSMuteStateOn ? + KFMRadioUnmuteDimmed : KFMRadioMuteDimmed; + // Update Next and Previous buttons. + if ( iEngine->AntennaStatus() == EFMRadioPSHeadsetDisconnected ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 1" ))); + UpdatePublishedToolBarL( KFMRadioPreviousDimmed | muteDimmedState | KFMRadioNextDimmed); + return; + } + else if ( iEngine->ApplicationRunningState() != EFMRadioPSApplicationRunning || aForceApplicationClosing ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 2" ))); + UpdatePublishedToolBarL( KFMRadioPreviousDimmed | muteDimmedState | KFMRadioNextDimmed); + return; + } + else if ( iEngine->PowerState() != EFMRadioPSRadioPowerOn ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 3" ))); + UpdatePublishedToolBarL( KFMRadioPreviousDimmed | muteDimmedState | KFMRadioNextDimmed); + return; + } + else if ( iEngine->TuningState() != EFMRadioPSTuningUninitialized ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 4" ))); + UpdatePublishedToolBarL( KFMRadioPreviousDimmed | KFMRadioNextDimmed ); + } + else if ( iPresetCount > 1 || ( iPresetCount == 1 && iEngine->Channel() == KErrNotFound ) ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 5" ))); + UpdatePublishedToolBarL( KFMRadioPrevious | KFMRadioNext ); + } + else + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 6" ))); + UpdatePublishedToolBarL( KFMRadioPreviousDimmed | KFMRadioNextDimmed ); + } + + // Update Mute/Unmute button + if ( iEngine->ApplicationRunningState() != EFMRadioPSApplicationRunning || aForceApplicationClosing ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 7" ))); + UpdatePublishedToolBarL( muteDimmedState ); + } + else if ( iEngine->TuningState() != EFMRadioPSTuningUninitialized ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 8" ))); + UpdatePublishedToolBarL( muteDimmedState ); + } + else + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateToolBarL - 9" ))); + HandleMuteStateChangeL( iEngine->MuteState() ); + } + } + } +// --------------------------------------------------------------------------- +// CFMRadioMCPPlugin::UpdateMusicWidgetTextL +// --------------------------------------------------------------------------- +// +void CFMRadioMCPPlugin::UpdateMusicWidgetTextL( TBool aForceApplicationClosing ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateMusicWidgetTextL" ))); + if ( iActive ) + { + TInt rightToLeftCharWidth = AknLayoutUtils::LayoutMirrored() ? sizeof(TText16) : 0; + + // Homescreen publishing + if ( iEngine->AntennaStatus() == EFMRadioPSHeadsetDisconnected && !aForceApplicationClosing ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateMusicWidgetTextL - Publishing HS antenna not connected: \"%S\""), &iAntennaNotConnectedText )); + iObserver->PublishTextL( this, EMusicWidgetText1, iAntennaNotConnectedText ); + } + else if ( iEngine->TuningState() != EFMRadioPSTuningUninitialized && !aForceApplicationClosing ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateMusicWidgetTextL - Publishing HS tuning: \"%S\""), &iTuningText )); + iObserver->PublishTextL( this, EMusicWidgetText1, iTuningText ); + } + else if ( iPresetCount && iEngine->Channel() != KErrNotFound ) + { + if( iEngine->ChannelName().Length() ) + { + // Station saved and name is available + RBuf name; + // For widget + // Preserve space for the channel name, format string and maximum index number + name.CreateL( iEngine->ChannelName().Length() + + iSavedStationFormat.Length() + + KDefaultRealWidth + + rightToLeftCharWidth ); + name.CleanupClosePushL(); + StringLoader::Format( name, iSavedStationFormat, KErrNotFound, iEngine->Channel() + 1 ); + + HBufC* tempName = name.AllocL(); + StringLoader::Format( name, *tempName, KErrNotFound, iEngine->ChannelName() ); + delete tempName; + tempName = NULL; + + if ( rightToLeftCharWidth ) + { + //E.g. 1. Name -> Name .1 + name.Insert( 0, KRightToLeftMark ); + } + + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateMusicWidgetTextL - Publishing Music Widget saved station: \"%S\""), &name )); + iObserver->PublishTextL( this, EMusicWidgetText1, name ); + CleanupStack::PopAndDestroy(); // name + } + else + { + // Station saved, but name for it is not available + HBufC* frequencyString = FrequencyStringLC( iEngine->Frequency() ); + RBuf formattedFrequency; + + // For widget + formattedFrequency.CreateL( iSavedStationFormatNoName.Length() + + frequencyString->Length() + + KDefaultRealWidth + + rightToLeftCharWidth ); + formattedFrequency.CleanupClosePushL(); + StringLoader::Format( formattedFrequency, iSavedStationFormatNoName, KErrNotFound, iEngine->Channel() + 1 ); + + HBufC* tempFrequency = formattedFrequency.AllocL(); + StringLoader::Format( formattedFrequency, *tempFrequency, KErrNotFound, *frequencyString ); + delete tempFrequency; + tempFrequency = NULL; + AknTextUtils::LanguageSpecificNumberConversion( formattedFrequency ); + + if ( rightToLeftCharWidth ) + { + //E.g. 1. Name -> Name .1 + formattedFrequency.Insert( 0, KRightToLeftMark ); + } + + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateMusicWidgetTextL - Publishing Music Widget saved station with frequency: \"%S\""), &formattedFrequency )); + iObserver->PublishTextL( this, EMusicWidgetText1, formattedFrequency ); + CleanupStack::PopAndDestroy( 2 ); // formattedFrequency, frequencyString + } + } + else if ( iEngine->RDSProgramService().Length() > 0 ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateMusicWidgetTextL - Publishing HS PS name: \"%S\""), &iEngine->RDSProgramService() )); + iObserver->PublishTextL( this, EMusicWidgetText1, iEngine->RDSProgramService() ); + } + else + { + TInt currentFrequency = iEngine->Frequency(); + // publish only valid frequency + if ( currentFrequency > 0 ) + { + HBufC* frequencyString = FrequencyStringLC( currentFrequency ); + + RBuf formattedFrequency; + // For widget + // Preserve space for the format string and maximum index number + formattedFrequency.CreateL( iFrequencyFormat.Length() + + frequencyString->Length() + + rightToLeftCharWidth ); + formattedFrequency.CleanupClosePushL(); + StringLoader::Format( formattedFrequency, iFrequencyFormat, KErrNotFound, *frequencyString ); + AknTextUtils::LanguageSpecificNumberConversion( formattedFrequency ); + + if ( rightToLeftCharWidth ) + { + //E.g. 1. Name -> Name .1 + formattedFrequency.Insert( 0, KRightToLeftMark ); + } + + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::UpdateMusicWidgetTextL - Publishing Music Widget frequency: \"%S\""), &formattedFrequency )); + iObserver->PublishTextL( this, EMusicWidgetText1, formattedFrequency ); + CleanupStack::PopAndDestroy( 2 ); // formattedFrequency,frequencyString + } + else + { + // Publish empty text instead of 0.00 MHz + iObserver->PublishTextL( this, EMusicWidgetText1, KNullDesC ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CFMRadioMCPPlugin::FrequencyStringLC +// --------------------------------------------------------------------------- +// +HBufC* CFMRadioMCPPlugin::FrequencyStringLC( TInt aFrequency ) + { + TReal frequency = static_cast( aFrequency / static_cast( KHzConversionFactor )); + TRealFormat format( KFrequencyMaxLength, iEngine->FrequencyDecimalCount() ); + TBuf frequencyString; + frequencyString.Num( frequency, format ); + + return frequencyString.AllocLC(); + } + +void CFMRadioMCPPlugin::HandleRadioVolumeChangeL( TInt /* aVolume */ ) + { + } + +void CFMRadioMCPPlugin::HandleTuningStateChangeL( TFMRadioPSTuningState FDEBUGVAR( aTuningState ) ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleTuningStateChangeL: aTuningState=[%d]"), aTuningState)); + + if ( iActive ) + { + UpdateMusicWidgetTextL(); + UpdateToolBarL(); + } + + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleTuningStateChangeL - Exiting." ))); + } + +void CFMRadioMCPPlugin::HandleFrequencyChangeL( TInt FDEBUGVAR( aFrequency ) ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleFrequencyChangeL: aFrequency=%d"), aFrequency)); + } + +void CFMRadioMCPPlugin::HandleChannelChangeL( TInt FDEBUGVAR( aId ) ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleChannelChangeL: aId=[%d]"), aId )); + if ( iActive ) + { + UpdateMusicWidgetTextL(); + UpdateToolBarL(); + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleChannelChangeL - Exiting." ))); + } + +void CFMRadioMCPPlugin::HandleChannelModifyL( TInt aId ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleChannelModifyL: aId=[%d]"), aId )); + if ( iActive && aId == iEngine->Channel() ) + { + UpdateMusicWidgetTextL(); + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleChannelModifyL - Exiting." ))); + } + +void CFMRadioMCPPlugin::HandleMuteStateChangeL( TFMRadioPSRadioMuteState aMuteState ) + { + if ( iActive ) + { + switch( aMuteState ) + { + case EFMRadioPSMuteStateOn: + if ( iEngine->ApplicationRunningState() != EFMRadioPSApplicationRunning || + iEngine->AntennaStatus() == EFMRadioPSHeadsetDisconnected ) + { + UpdatePublishedToolBarL( KFMRadioUnmuteDimmed ); + } + else + { + UpdatePublishedToolBarL( KFMRadioUnmute ); + } + break; + case EFMRadioPSMuteStateOff: + case EFMRadioPSMuteStateUninitialized: + if ( iEngine->ApplicationRunningState() != EFMRadioPSApplicationRunning || + iEngine->AntennaStatus() == EFMRadioPSHeadsetDisconnected ) + { + UpdatePublishedToolBarL( KFMRadioMuteDimmed ); + } + else + { + UpdatePublishedToolBarL( KFMRadioMute ); + } + break; + default:break; + } + } + } + +void CFMRadioMCPPlugin::HandleApplicationRunningStateChangeL( TFMRadioPSApplicationRunningState aRunningState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleApplicationRunningStateChangeL - aRunningState=%d"), aRunningState )); + + switch ( aRunningState ) + { + case EFMRadioPSApplicationRunning: + break; + case EFMRadioPSApplicationClosing: + UpdateMusicWidgetTextL( ETrue ); + UpdateToolBarL( ETrue ); + Deactivate(); + break; + default: + break; + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleApplicationRunningStateChangeL - Exiting." ))); + } + +void CFMRadioMCPPlugin::HandleFrequencyDecimalCountChangeL( TFMRadioPSFrequencyDecimalCount /* aDecimalCount */ ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleFrequencyDecimalCountChangeL." ))); + if ( iActive ) + { + UpdateMusicWidgetTextL(); + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleFrequencyDecimalCountChangeL - Exiting." ))); + } + +void CFMRadioMCPPlugin::HandleAntennaStatusChangeL( TFMRadioPSHeadsetStatus /*aAntennaStatus*/ ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleAntennaStatusChangeL - Enter"))); + if ( iActive ) + { + UpdateMusicWidgetTextL(); + UpdateToolBarL(); + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleAntennaStatusChangeL - Exiting."))); + } + +void CFMRadioMCPPlugin::HandlePresetListCountChangeL( TInt aPresetCount ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandlePresetListCountChangeL(%d) - Enter"), aPresetCount)); + iPresetCount = aPresetCount; + if ( iActive ) + { + if( !aPresetCount ) + { + UpdateMusicWidgetTextL(); + } + UpdateToolBarL(); + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandlePresetListCountChangeL - Exiting."))); + } + +void CFMRadioMCPPlugin::HandlePresetListFocusChangeL( TInt FDEBUGVAR( aPresetFocus ) ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandlePresetListFocusChangeL - %d"), aPresetFocus )); + } + +void CFMRadioMCPPlugin::HandleRDSProgramServiceChangeL( const TDesC& /*aProgramService*/ ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleRDSProgramServiceChangeL." ))); + if ( iActive ) + { + UpdateMusicWidgetTextL(); + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleRDSProgramServiceChangeL - Exiting." ))); + } + +void CFMRadioMCPPlugin::HandleRDSRadioTextChangeL( const TDesC& /*aRdsText*/ ) + { + } + +void CFMRadioMCPPlugin::HandleChannelNameChangeL( const TDesC& /*aName*/ ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandleChannelNameChangeL." ))); + } + +void CFMRadioMCPPlugin::HandlePowerStateChangeL( TFMRadioPSRadioPowerState aPowerState ) + { + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandlePowerStateChangeL(%d)."), aPowerState )); + if( aPowerState == EFMRadioPSRadioPowerOn ) + { + ActivateL(); + } + if ( iActive ) + { + UpdateMusicWidgetTextL(); + UpdateToolBarL(); + } + FTRACE(FPrint(_L(" *** S60 FMRadio -- CFMRadioMCPPlugin::HandlePowerStateChangeL - Exiting." ))); + } + +void CFMRadioMCPPlugin::InstallEmptyActionL( TMCPTriggerDestination aDestination ) + { + CLiwDefaultMap* mapTrigger = CLiwDefaultMap::NewLC(); + iObserver->PublishActionL( this, aDestination, mapTrigger ); + CleanupStack::PopAndDestroy( mapTrigger ); + } + +void CFMRadioMCPPlugin::InstallFMRadioCommandActionL( const TDesC& aCommand, TMCPTriggerDestination aDestination ) + { + CLiwDefaultMap* mapTrigger = CLiwDefaultMap::NewLC(); + CLiwDefaultMap* mapData = CLiwDefaultMap::NewLC(); + + mapTrigger->InsertL( KFMRadioPluginUid, TLiwVariant( TUid::Uid( KFMRadioActionHandlerImplementationUid ) ) ); + mapData->InsertL( KType, TLiwVariant( aCommand ) ); + mapData->InsertL( KFMRadioCommand , TLiwVariant( aCommand ) ); + mapTrigger->InsertL( KFMRadioData, TLiwVariant( mapData ) ); + + if ( iActive ) + { + iObserver->PublishActionL( this, aDestination, mapTrigger ); + } + + CleanupStack::PopAndDestroy( mapData ); + CleanupStack::PopAndDestroy( mapTrigger ); + } + +/** Provides a key-value pair table, that is used to identify the correct construction function for the requested interface. */ +const TImplementationProxy KFMRadioMCPPluginImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KFMRadioMCPPluginImplementationUid, CFMRadioMCPPlugin::NewL ) + }; + +const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ); + +// --------------------------------------------------------------------------- +// Returns the implementations provided by this ECOM plugin DLL. +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( KFMRadioMCPPluginImplementationTable ) / sizeof( TImplementationProxy ); + return KFMRadioMCPPluginImplementationTable; + }