--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/activeidlesrc/iractiveidle.cpp Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,873 @@
+/*
+* Copyright (c) 2006-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: ?Description
+*
+*/
+
+
+#include <aicontentobserver.h>
+#include <aiutility.h>
+#include <aknutils.h>
+#include <apgcli.h>
+#include <bautils.h>
+#include <data_caging_path_literals.hrh>
+#include <e32property.h>
+#include <stringloader.h>
+#include <iractiveidle.rsg>
+#include <features.hrh>
+#include <eikenv.h>
+#include <apgtask.h>
+#include "irmetadata.h"
+#include "irpubsubkeys.h"
+#include "ir.hrh"
+#include "iractiveidle.h"
+#include "iractiveidleeng.h"
+#include "iractiveidlestatedetector.h"
+#include "irdebug.h"
+#include "irplugincontentmodel.h"
+
+
+
+#include <eikenv.h>
+
+const TInt KIRMinVolumeLevel = 0;
+const TInt KIRMaxVolumeLevel = 10;
+const TInt KIRPublishIndex = 1; // Always 1 in this plugin
+const TInt KIRActiveIdleGranularity = 3;
+
+_LIT( KIRActiveIdleResourceFileName, "iractiveidle.rsc" ); /** Filename of the Internet Radio Active Idle resource file. */
+_LIT( KIRPluginName, "iRAPP Plugin");
+_LIT(KSeparatorDot,". ");
+//_LIT(KSeparatorHyphen," - ")
+//_LIT(KSeparatorColon," : ")
+_LIT8( KIRSpace, " " );
+_LIT8( KIRCommandLineActiveIdle, "-a" );
+_LIT8( KIRCommandLineActiveIdleCommandStartNowPlayingView, "startnowplaying" );
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::CIRActiveIdle()
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CIRActiveIdle::CIRActiveIdle()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::ConstructL()
+// Second-phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::ConstructL()
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::ConstructL" );
+ InitializeResourceLoadingL();
+ iInfo.iUid = KUidIRPlugin;
+ iInfo.iName.Copy( KIRPluginName );
+ iContent = AiUtility::CreateContentItemArrayIteratorL( KAiIRContent );
+ iResources = AiUtility::CreateContentItemArrayIteratorL( KAiIRResources );
+ iEvents = AiUtility::CreateContentItemArrayIteratorL( KAiIREvents );
+ iMetaData = CIRMetaData::NewL();
+ iRunningState = EIRPSApplicationUninitialized;
+ IRLOG_DEBUG( "CIRActiveIdle::ConstructL - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::NewL()
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CIRActiveIdle* CIRActiveIdle::NewL()
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::NewL" );
+ CIRActiveIdle* self = new( ELeave ) CIRActiveIdle;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ IRLOG_DEBUG( "CIRActiveIdle::NewL - Exiting." );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::~CIRActiveIdle()
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CIRActiveIdle::~CIRActiveIdle()
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::~CIRActiveIdle" );
+ if ( iActiveIdleResourceOffset > 0 )
+ {
+ CCoeEnv::Static()->DeleteResourceFile( iActiveIdleResourceOffset );
+ }
+ iObservers.Close();
+ Release( iContent );
+ Release( iResources );
+ Release( iEvents );
+
+ delete iMetaData;
+ delete iIRTerminationDetector;
+ delete iEngine;
+ IRLOG_DEBUG( "CIRActiveIdle::~CIRActiveIdle - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::InitializeResourceLoadingL()
+// Initialize resource file for loading resources.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::InitializeResourceLoadingL()
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::InitializeResourceLoadingL" );
+
+ CCoeEnv* coeEnv = CCoeEnv::Static();
+ RFs fs( coeEnv->FsSession() );
+ TFileName fileName;
+ TFileName baseResource;
+ TFindFile finder( fs );
+ TLanguage language( ELangNone );
+
+ TParsePtrC parse( KIRActiveIdleResourceFileName );
+ _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( KIRActiveIdleResourceFileName );
+ BaflUtils::NearestLanguageFile( fs, fileName, language );
+ if ( language != ELangNone && BaflUtils::FileExists( fs, fileName ) )
+ {
+ found = ETrue;
+ iActiveIdleResourceOffset = 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 ) )
+ {
+ iActiveIdleResourceOffset = coeEnv->AddResourceFileL( baseResource );
+ }
+ }
+
+
+
+ IRLOG_DEBUG( "CIRActiveIdle::InitializeResourceLoadingL - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::LoadResourcesL()
+// Loads the required resources
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::LoadResourcesL()
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::LoadResourcesL" );
+
+ if ( !iIRTerminationDetector )
+ {
+ iIRTerminationDetector = new (ELeave) CIRActiveIdleStateDetector( *this );
+ }
+
+ if ( !iEngine )
+ {
+ iEngine = CIRActiveIdleEng::NewL( *this );
+ iEngine->SecondConstructL();
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::LoadResourcesL - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::Resume()
+// Now it is allowed to actively publish data to observers.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::Resume( TAiTransitionReason /*aReason*/ )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::Resume" );
+ TRAP_IGNORE( LoadResourcesL() )
+ IRLOG_DEBUG( "CIRActiveIdle::Resume - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::Suspend()
+// Not allowed to consume CPU resources, e.g MUST stop each timer,
+// cancel outstanding asynchronous operations, etc.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::Suspend( TAiTransitionReason /*aReason*/ )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::Suspend" );
+
+ if ( iIRTerminationDetector )
+ {
+ iIRTerminationDetector->Cancel();
+ }
+
+ delete iEngine;
+ iEngine = NULL;
+ IRLOG_DEBUG( "CIRActiveIdle::Suspend - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::Stop
+// Must free all memory and CPU resources and close all open files.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::Stop( TAiTransitionReason /*aReason*/ )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::Stop" );
+ delete iIRTerminationDetector;
+ iIRTerminationDetector = NULL;
+ delete iEngine;
+ iEngine = NULL;
+ IRLOG_DEBUG( "CIRActiveIdle::Stop - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::SubscribeL
+// Adds the content observer / subscriber to plug-in.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::SubscribeL( MAiContentObserver& aObserver )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::SubscribeL" );
+ iObservers.AppendL( &aObserver );
+ IRLOG_DEBUG( "CIRActiveIdle::SubscribeL - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::ConfigureL
+// Configures the plug-in.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::ConfigureL( RAiSettingsItemArray& /*aSettings*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::Extension
+// Returns interface extension. In S60 3.2 only event & property extensions
+// are supported.
+// ---------------------------------------------------------------------------
+//
+TAny* CIRActiveIdle::Extension( TUid aUid )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::Extension" );
+ TAny* ret = NULL;
+ if ( aUid == KExtensionUidProperty )
+ {
+ ret = static_cast<MAiPropertyExtension*>( this );
+ }
+ else if ( aUid == KExtensionUidEventHandler )
+ {
+ ret = static_cast<MAiEventHandlerExtension*>( this );
+ }
+ else
+ {
+ ret = NULL;
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::Extension - Exiting." );
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CIRActiveIdle::GetPropertyL
+// Reads a plugin property.
+// ----------------------------------------------------------------------------
+//
+TAny* CIRActiveIdle::GetPropertyL( TInt aProperty )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::GetPropertyL" );
+ switch ( aProperty )
+ {
+ case EAiPublisherInfo:
+ return &iInfo;
+
+ case EAiPublisherContent:
+ return static_cast<MAiContentItemIterator*>( iContent );
+
+ case EAiPublisherResources:
+ return static_cast<MAiContentItemIterator*>( iResources );
+
+ case EAiPublisherEvents:
+ return static_cast<MAiContentItemIterator*>( iEvents );
+
+ default:
+ break;
+ }
+ User::Leave( KErrNotSupported );
+ IRLOG_DEBUG( "CIRActiveIdle::GetPropertyL - Exiting." );
+ return NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CIRActiveIdle::SetPropertyL
+// Sets a plugin property
+// ----------------------------------------------------------------------------
+//
+void CIRActiveIdle::SetPropertyL( TInt aProperty, TAny* aValue )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::SetPropertyL" );
+ if ( aValue )
+ {
+ switch ( aProperty )
+ {
+ case EAiPublisherInfo:
+ {
+ const TAiPublisherInfo* info =
+ static_cast<const TAiPublisherInfo*>( aValue );
+ iInfo.iUid.iUid = info->iUid.iUid;
+ iInfo.iName.Copy( info->iName );
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ else
+ {
+ User::Leave(KErrGeneral);
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::SetPropertyL - Exiting." );
+ }
+
+// ----------------------------------------------------------------------------
+// CIRActiveIdle::HandleEvent
+// Invoked by the framework when plug-in must handle an event
+// ----------------------------------------------------------------------------
+//
+void CIRActiveIdle::HandleEvent( TInt aEvent, const TDesC& /*aParam*/ )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::HandleEvent" );
+ switch ( aEvent )
+ {
+ case EAiIREventVolInc:
+ break;
+ case EAiIREventVolDec:
+ break;
+ case EAiIREventLaunchRadio:
+ {
+ TRAP_IGNORE( StartApplicationL( KUidActiveInternetRadioApp,
+ KNullDesC8 ) )
+ break;
+ }
+ default:
+ break;
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::HandleEvent - Exiting." );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::Clean
+// Cleans all data fields from the plugin
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::Clean()
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::Clean" );
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MAiContentObserver* observer = iObservers[i];
+ observer->StartTransaction( reinterpret_cast<TInt32>( this ) );
+ observer->Clean( *this, EAiIRContentVolume, KIRPublishIndex );
+ observer->Clean( *this, EAiIRContentOneLineInfoCaption, KIRPublishIndex );
+ observer->Clean( *this, EAiIRContentAppIcon, KIRPublishIndex );
+ observer->Clean( *this, EAiIRContentPresetCaption, KIRPublishIndex );
+ observer->Clean( *this, EAiIRContentArtistCaption, KIRPublishIndex );
+ observer->Clean( *this, EAiIRContentTrackCaption, KIRPublishIndex );
+ observer->Commit( reinterpret_cast<TInt32>( this ) );
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::Clean - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::StartApplicationL
+// Launches an application.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::StartApplicationL( const TUid& aUid, const TDesC8& aCommandLine )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::StartApplicationL" );
+
+ TApaTaskList taskList( CCoeEnv::Static()->WsSession() );
+ TApaTask task = taskList.FindApp( KUidActiveInternetRadioApp );
+
+// _LIT8(KNull,"")
+ if ( task.Exists() )
+ {
+
+ TPtrC8 activeIdleCmdId( KIRCommandLineActiveIdle );
+ TPtrC8 spacePtr( KIRSpace );
+
+ TPtrC8 startNowPlayingCmdvalue(
+ KIRCommandLineActiveIdleCommandStartNowPlayingView );
+
+ HBufC8* buf = HBufC8::NewLC(activeIdleCmdId.Length()
+ + spacePtr.Length() + startNowPlayingCmdvalue.Length());
+ TPtr8 tail( buf->Des() );
+
+
+ tail.Append( activeIdleCmdId );
+ tail.Append( spacePtr );
+ tail.Append( startNowPlayingCmdvalue );
+ task.SendMessage(KUidActiveInternetRadioApp,tail);
+ task.BringToForeground();
+
+ CleanupStack::PopAndDestroy( buf );
+
+ }
+ else
+ {
+ RApaLsSession apaSession;
+ CleanupClosePushL( apaSession );
+
+ User::LeaveIfError( apaSession.Connect() );
+ User::LeaveIfError( apaSession.GetAllApps() );
+
+ TApaAppInfo appInfo;
+ User::LeaveIfError( apaSession.GetAppInfo( appInfo, aUid ) );
+
+ CApaCommandLine* startParams = CApaCommandLine::NewLC();
+ startParams->SetExecutableNameL( appInfo.iFullName );
+ startParams->SetCommandL( EApaCommandRun );
+ startParams->SetTailEndL( aCommandLine );
+ User::LeaveIfError( apaSession.StartApp( *startParams ) );
+ CleanupStack::PopAndDestroy( 2, &apaSession );
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::StartApplicationL - Exiting." );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::HandleChannelChangeL
+// Handles channel change
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::HandleChannelChangeL()
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::HandleChannelChangeL" );
+ RProperty::Get ( KUidActiveInternetRadioApp, KIRPSDataChannel,
+ iChannelName );
+ RProperty::Get ( KUidActiveInternetRadioApp, KIRPSPresetIndex,
+ iPresetIndex);
+
+ IRLOG_DEBUG3( "CIRActiveIdle::HandleChannelChangeL - iChannelName=%S, iPresetIndex=%d", &iChannelName, iPresetIndex );
+
+ HBufC* stringholder = NULL;
+
+
+ CDesCArray* array = new (ELeave) CDesCArrayFlat(KIRActiveIdleGranularity);
+ CleanupStack::PushL( array );
+
+ MDesCArray* list = STATIC_CAST(MDesCArray*,array);
+
+ CArrayFix<TInt>* presetCounts = new (ELeave) CArrayFixFlat<TInt>( 2 );
+ CleanupStack::PushL( presetCounts );
+ CEikonEnv* env = CEikonEnv::Static();
+ if(iPresetIndex != 0)
+ {
+ if(iMetaData->Artist() == KNullDesC && iMetaData->Song() == KNullDesC)
+ {
+ array->AppendL( iChannelName );
+ presetCounts->AppendL( iPresetIndex );
+ stringholder = StringLoader::LoadLC( R_IRAPP_ACTIVEIDLE_NOSTATIONDATA,*list,
+ *presetCounts ,env );
+ }
+ else
+ {
+ array->AppendL( iMetaData->Artist() ); //First string
+ array->AppendL( iMetaData->Song() );
+ array->AppendL( iChannelName );
+ presetCounts->AppendL( iPresetIndex );
+ stringholder = StringLoader::LoadLC( R_IRAPP_ACTIVEIDLE_STATIONDATA,*list,
+ *presetCounts ,env );
+ }
+
+ }
+ else
+ {
+ array->AppendL( iMetaData->Artist() ); //First string
+ array->AppendL( iMetaData->Song() );
+ array->AppendL( iChannelName );
+ stringholder = StringLoader::LoadLC( R_IRAPP_AI_NOINDEX_STATIONDATA,*list);
+ }
+
+
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MAiContentObserver* observer = iObservers[i];
+
+ observer->StartTransaction( reinterpret_cast<TInt32>( this ) );
+
+ observer->Publish( *this, EAiIRContentOneLineInfoCaption, *stringholder,
+ KIRPublishIndex );
+ observer->Commit( reinterpret_cast<TInt32>( this ) );
+ }
+
+ CleanupStack::PopAndDestroy(stringholder);
+ CleanupStack::PopAndDestroy( presetCounts );
+
+ // Pop and delete strings array
+ CleanupStack::PopAndDestroy();
+ IRLOG_DEBUG( "CIRActiveIdle::HandleChannelChangeL - Exiting." ); IRLOG_DEBUG( "CIRActiveIdle::HandleChannelChangeL - Exiting." );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::HandleMetaDataReceivedL
+// Handles meta data changes
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::HandleMetaDataReceivedL( const CIRMetaData& aMetaData )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::HandleMetaDataReceivedL" );
+ iMetaData->SetL( aMetaData );
+ RProperty::Get ( KUidActiveInternetRadioApp, KIRPSDataChannel,
+ iChannelName );
+ RProperty::Get ( KUidActiveInternetRadioApp, KIRPSPresetIndex,
+ iPresetIndex);
+
+ IRLOG_DEBUG3( "CIRActiveIdle::HandleChannelChangeL - iChannelName=%S, iPresetIndex=%d", &iChannelName, iPresetIndex );
+
+ HBufC* stringholder = NULL;
+
+ CDesCArray* array = new (ELeave) CDesCArrayFlat(KIRActiveIdleGranularity);
+ CleanupStack::PushL( array );
+
+ MDesCArray* list = STATIC_CAST(MDesCArray*,array);
+
+ CArrayFix<TInt>* presetCounts = new (ELeave) CArrayFixFlat<TInt>( 2 );
+ CleanupStack::PushL( presetCounts );
+ CEikonEnv* env = CEikonEnv::Static();
+ if(iPresetIndex != 0)
+ {
+ if(iMetaData->Artist() == KNullDesC && iMetaData->Song() == KNullDesC)
+ {
+ array->AppendL( iChannelName );
+ presetCounts->AppendL( iPresetIndex );
+ stringholder = StringLoader::LoadLC( R_IRAPP_ACTIVEIDLE_NOSTATIONDATA,*list,
+ *presetCounts ,env );
+ }
+ else
+ {
+ array->AppendL( iMetaData->Artist() ); //First string
+ array->AppendL( iMetaData->Song() );
+ array->AppendL( iChannelName );
+ presetCounts->AppendL( iPresetIndex );
+ stringholder = StringLoader::LoadLC( R_IRAPP_ACTIVEIDLE_STATIONDATA,*list,
+ *presetCounts ,env );
+ }
+
+ }
+ else
+ {
+ array->AppendL( iMetaData->Artist() ); //First string
+ array->AppendL( iMetaData->Song() );
+ array->AppendL( iChannelName );
+ stringholder = StringLoader::LoadLC( R_IRAPP_AI_NOINDEX_STATIONDATA,*list);
+ }
+
+
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MAiContentObserver* observer = iObservers[i];
+
+ observer->StartTransaction( reinterpret_cast<TInt32>( this ) );
+
+ observer->Publish( *this, EAiIRContentOneLineInfoCaption, *stringholder,
+ KIRPublishIndex );
+
+ observer->Commit( reinterpret_cast<TInt32>( this ) );
+ }
+
+ CleanupStack::PopAndDestroy(stringholder);
+ CleanupStack::PopAndDestroy( presetCounts );
+
+ // Pop and delete strings array
+ CleanupStack::PopAndDestroy();
+
+ IRLOG_DEBUG( "CIRActiveIdle::HandleMetaDataReceivedL - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::HandlePlayStopL
+// Handles data change in Stop State
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::HandlePlayStopL( TIRStopPlayState aState )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::HandlePlayStopL" );
+ RProperty::Get( KUidActiveInternetRadioApp, KIRPSDataChannel, iChannelName );
+ RProperty::Get(KUidActiveInternetRadioApp, KIRPSPresetIndex, iPresetIndex);
+ HBufC* oneLineInfoCaption = NULL;
+ HBufC* presetCaption = NULL;
+
+ // Checks if the channel is in favourites and if it is displays
+ // the channel name with the preset index.
+ if ( iPresetIndex == 0 )
+ {
+ oneLineInfoCaption = iChannelName.AllocLC();
+ presetCaption = iChannelName.AllocLC();
+ }
+ else
+ {
+ TBuf<KMAXLENGTH> oneLineInfoBuffer;
+ oneLineInfoBuffer.AppendNum(iPresetIndex);
+ oneLineInfoBuffer.Append(KSeparatorDot);
+ oneLineInfoBuffer.Append(iChannelName);
+ oneLineInfoBuffer.Trim();
+ oneLineInfoCaption = oneLineInfoBuffer.AllocLC();
+ TBuf<KMAXLENGTH> presetBuffer;
+ presetBuffer.AppendNum(iPresetIndex);
+ presetBuffer.Append(KSeparatorDot);
+ presetBuffer.Append(iChannelName);
+ presetBuffer.Trim();
+ presetCaption = presetBuffer.AllocLC();
+ }
+
+
+
+ if ( aState != EIRStateUninitialized )
+ {
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MAiContentObserver* observer = iObservers[i];
+
+ observer->StartTransaction( reinterpret_cast<TInt32>( this ) );
+
+ observer->Publish( *this, EAiIRContentPresetCaption, *presetCaption,
+ KIRPublishIndex );
+
+ if ( aState == EIRStatePlay )
+ {
+ observer->Publish( *this, EAiIRContentAppIcon, EAiIRResourceIRPlayingIcon,
+ KIRPublishIndex );
+ }
+ else
+ {
+ observer->Publish( *this, EAiIRContentAppIcon, EAiIRResourceIRStoppedIcon,
+ KIRPublishIndex );
+ observer->Publish( *this, EAiIRContentOneLineInfoCaption, *oneLineInfoCaption,
+ KIRPublishIndex );
+ }
+
+ observer->Commit( reinterpret_cast<TInt32>( this ) );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( presetCaption );
+ CleanupStack::PopAndDestroy( oneLineInfoCaption );
+ IRLOG_DEBUG( "CIRActiveIdle::HandlePlayStopL - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::HandleVolumeChangeL
+// Handles volume change
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::HandleVolumeChangeL( const TInt aVolume )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::HandleVolumeChangeL" );
+ if ( aVolume >= KIRMinVolumeLevel && aVolume <= KIRMaxVolumeLevel )
+ {
+ TInt resourceId( EAiIRResourceVol1 );
+ switch ( aVolume )
+ {
+ case EVolumeLevel0:
+ {
+ resourceId = EAiIRResourceVol0;
+ break;
+ }
+ case EVolumeLevel1:
+ {
+ resourceId = EAiIRResourceVol1;
+ break;
+ }
+ case EVolumeLevel2:
+ {
+ resourceId = EAiIRResourceVol2;
+ break;
+ }
+ case EVolumeLevel3:
+ {
+ resourceId = EAiIRResourceVol3;
+ break;
+ }
+ case EVolumeLevel4:
+ {
+ resourceId = EAiIRResourceVol4;
+ break;
+ }
+ case EVolumeLevel5:
+ {
+ resourceId = EAiIRResourceVol5;
+ break;
+ }
+ case EVolumeLevel6:
+ {
+ resourceId = EAiIRResourceVol6;
+ break;
+ }
+ case EVolumeLevel7:
+ {
+ resourceId = EAiIRResourceVol7;
+ break;
+ }
+ case EVolumeLevel8:
+ {
+ resourceId = EAiIRResourceVol8;
+ break;
+ }
+ case EVolumeLevel9:
+ {
+ resourceId = EAiIRResourceVol9;
+ break;
+ }
+ case EVolumeLevel10:
+ {
+ resourceId = EAiIRResourceVol10;
+ break;
+ }
+ default:
+ break;
+ }
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MAiContentObserver* observer = iObservers[i];
+ //Initiates content publishing transaction.
+ observer->StartTransaction( reinterpret_cast<TInt32>( this ) );
+ //Informs that content identified by reference resourceId must be
+ //published to UI control identified by selector
+ //EAiIRContentVolume
+ observer->Publish( *this, EAiIRContentVolume, resourceId, KIRPublishIndex );
+ //Requests framework that content publishing transaction must be
+ //finalized and content should be rendered to the screen.
+ //Displays the volume level onto the Active Idle content area.
+ observer->Commit( reinterpret_cast<TInt32>( this ) );
+ }
+ }
+ else
+ {
+ User::Leave(KErrGeneral);
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::HandleVolumeChangeL - Exiting." );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::HandleApplicationRunningStateChangeL
+// Handles changes in Internet Radio application running state.
+// ---------------------------------------------------------------------------
+//
+void CIRActiveIdle::HandleApplicationRunningStateChangeL(
+ const TIRPSApplicationRunningState aRunningState )
+ {
+ IRLOG_DEBUG( "CIRActiveIdle::HandleApplicationRunningStateChangeL" );
+ if ( iRunningState != aRunningState )
+ {
+ switch ( aRunningState )
+ {
+ case EIRPSApplicationUninitialized:
+ {
+ break;
+ }
+ //called when application starts
+ case EIRPSApplicationRunning:
+ {
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MAiContentObserver* observer = iObservers[i];
+ //Initiates content publishing transaction.
+ observer->StartTransaction(reinterpret_cast<TInt32>(
+ this ) );
+ //Invoked by the plug-in to inform that content identified
+ //by reference EAiIRResourceIRStoppedIcon must be published
+ //to UI crtl identified by selector EAiIRContentAppIcon.
+ // Full Page Idle: shows IR icon.
+ // Navigation Bar Idle: updates title text and switches correct layout.
+ // App has just started, publish initially to stopped state.
+ observer->Publish( *this, EAiIRContentAppIcon, EAiIRResourceIRStoppedIcon,
+ KIRPublishIndex );
+ observer->Publish( *this, EAiIRContentOneLineInfoCaption,KNullDesC,
+ KIRPublishIndex );
+
+ observer->Commit( reinterpret_cast<TInt32>( this ) );
+ }
+
+ if ( iIRTerminationDetector )
+ {
+ iIRTerminationDetector->StartListeningL();
+ }
+ break;
+ }
+ // called when the application exits
+ case EIRPSApplicationClosing:
+ {
+ Clean();
+ break;
+ }
+ default:
+ break;
+ }
+ iRunningState = aRunningState;
+ }
+ IRLOG_DEBUG( "CIRActiveIdle::HandleApplicationRunningStateChangeL - Exiting." );
+ }
+
+// ---------------------------------------------------------------------------
+// CIRActiveIdle::HandleBufferingStateL
+// Handles changes in Internet Radio buffering state
+// ---------------------------------------------------------------------------
+//
+
+void CIRActiveIdle::HandleBufferingStateL(TIRBufferingState aState )
+ {
+ if (EIRStateBufferingStart == aState)
+ {
+ // do nothing, just remove build warning
+ }
+ }