diff -r 000000000000 -r 09774dfdd46b internetradio2.0/mcppluginsrc/irmcpplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/internetradio2.0/mcppluginsrc/irmcpplugin.cpp Mon Apr 19 14:01:53 2010 +0300 @@ -0,0 +1,584 @@ +/* +* Copyright (c) 2008-2008 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 +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "iractionhandler.hrh" +#include "iractionhandlerdefs.h" +#include "iractiveidleeng.h" +#include "iractiveidleengnotifyhandler.h" +#include "irdebug.h" +#include "irmcpplugin.h" +#include "irmcpplugin.hrh" + + + +#include "irmetadata.h" + +const TInt KIRMinVolumeLevel = 0; +const TInt KIRMaxVolumeLevel = 10; + +_LIT( KIRMCPPluginResourceFileName, "irmcpplugin.rsc" ); + +//Temp images from Music widget, svg via handle to rgba bitmap will be supported soon. +_LIT( KIMGPlay, "z:\\Resource\\apps\\qgn_prop_image_tb_play2_dimmed2.png" ); +_LIT( KIMGStop, "z:\\Resource\\apps\\qgn_prop_image_tb_pause_dimmed2.png" ); + +_LIT8( KIRPluginUid, "plugin_id" ); +_LIT8( KIRData, "data" ); +_LIT( KEmpty, "" ); +// --------------------------------------------------------- +// CIRMCPPlugin::NewL +// --------------------------------------------------------- +// +CIRMCPPlugin* CIRMCPPlugin::NewL( MMCPPluginObserver* aObserver ) + { + CIRMCPPlugin* self = new ( ELeave ) CIRMCPPlugin( aObserver ); + CleanupStack::PushL( self ); + + self->ConstructL(); + + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CIRMCPPlugin::~CIRMCPPlugin +// --------------------------------------------------------- +// +CIRMCPPlugin::~CIRMCPPlugin() + { + if ( iResourceOffset > 0 ) + { + CCoeEnv::Static()->DeleteResourceFile( iResourceOffset ); + } + + delete iMetaData; + + delete iEngine; + delete iLastPlayedText; + } + +// --------------------------------------------------------- +// CIRMCPPlugin::CIRMCPPlugin +// --------------------------------------------------------- +// +CIRMCPPlugin::CIRMCPPlugin( MMCPPluginObserver* aObserver ) + : iObserver( aObserver ) + { + } + +// --------------------------------------------------------- +// CIRMCPPlugin::ConstructL +// --------------------------------------------------------- +// +void CIRMCPPlugin::ConstructL() + { + InitializeResourceLoadingL(); + + iRunningState = EIRPSApplicationUninitialized; + + iLastPlayedText = StringLoader::LoadL( R_IR_MCP_LASTPLAYED); + iBufferingText = StringLoader::LoadL( R_IR_MCP_BUFFERING); + + iEngine = CIRActiveIdleEng::NewL( *this ); + iEngine->SecondConstructL(); + + iMetaData = CIRMetaData::NewL(); + HandleApplicationRunningStateChangeL(iRunningState); + + } + + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::InitializeResourceLoadingL +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::InitializeResourceLoadingL() + { + CCoeEnv* coeEnv = CCoeEnv::Static(); + RFs fs( coeEnv->FsSession() ); + TFileName fileName; + TFileName baseResource; + TFindFile finder( fs ); + TLanguage language( ELangNone ); + + TParsePtrC parse( KIRMCPPluginResourceFileName ); + _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( KIRMCPPluginResourceFileName ); + 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 ); + } + } + } + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::Deactivate +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::Deactivate() + { + IRRDEBUG2("InternetRadio -- CIRMCPPlugin::Deactivate Entering", KNullDesC); + + iActive = EFalse; + } + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::ActivateL +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::ActivateL() + { + IRRDEBUG2("CIRMCPPlugin::ActivateL Entering", KNullDesC); + + iActive = ETrue; + iObserver->BecameActiveL(this); + + HandleChannelChangeL(); + + HandleMetaDataReceivedL(*iMetaData); + + RProperty::Get( KUidActiveInternetRadioApp,KIRPSPlayStop, + iPlayingState ); + + HandlePlayStopL(static_cast(iPlayingState)); + +/* IRRDEBUG2("ActivateL iRunningState = %d",iRunningState); + InstallIRCommandActionL( KIRCommandValueStartNowPlaying(), EMusicWidgetTrigger1 ); + iObserver->PublishImageL( this, EMusicWidgetImage1, KIMGPlay ); */ + + InstallIRCommandActionL( KIRCommandValueStartNowPlaying(), EMusicWidgetTrigger2 ); + + } + + + + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::PublishLastPlayedWidgetItemsL +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::PublishLastPlayedWidgetItemsL() + { + if ( iActive ) + { + IRRDEBUG2("CIRMCPPlugin::PublishLastPlayedWidgetItemsL Entering", KNullDesC); + + InstallIRCommandActionL( KIRCommandValueStartNowPlaying(), EMusicWidgetTrigger1 ); + iObserver->PublishImageL( this, EMusicWidgetImage1, KIMGPlay ); + } + + HandleChannelChangeL(); + IRRDEBUG2("CIRMCPPlugin::PublishLastPlayedWidgetItemsL Exitings", KNullDesC); + + } + + + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::HandleChannelChangeL +// Handles channel change +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::HandleChannelChangeL() + { + + IRRDEBUG2("CIRMCPPlugin::HandleChannelChangeL Entering", KNullDesC); + + RProperty::Get ( KUidActiveInternetRadioApp, KIRPSDataChannel, + iChannelName ); + + IRRDEBUG2("HandleChannelChange iRunningState = %d",iRunningState); + + if ( iActive ) + { + switch(iRunningState) + { + case EIRPSApplicationRunning: + { + iObserver->PublishTextL( this, EMusicWidgetText1, iChannelName); + IRRDEBUG2("CIRMCPPlugin::HandleChannelChangeL iChannelName published", KNullDesC); + + break; + } + + case EIRPSApplicationUninitialized: + case EIRPSApplicationClosing: + { + IRRDEBUG2("CIRMCPPlugin::HandleChannelChangeL EIRPSApplicationUninitialized", KNullDesC); + iObserver->PublishTextL( this, EMusicWidgetText1, *iLastPlayedText ); + iObserver->PublishTextL( this, EMusicWidgetText2, iChannelName ); + + break; + } + + default: + break; + } + } + + IRRDEBUG2("CIRMCPPlugin::HandleChannelChangeL Exiting", KNullDesC); + + } + + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::HandleMetaDataReceivedL +// Handles meta data changes +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::HandleMetaDataReceivedL( const CIRMetaData& aMetaData ) + { + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL Entering", KNullDesC); + + iMetaData->SetL( aMetaData ); + + if ( iActive ) + { + switch(iRunningState) + { + + case EIRPSApplicationRunning: + { + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL EIRPSApplicationRunning", KNullDesC); + if(iMetaData->Song().Length()) + { + iObserver->PublishTextL( this, EMusicWidgetText2, iMetaData->Song()); + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL Song published", KNullDesC); + } + /* else + { + iObserver->PublishTextL( this, EMusicWidgetText2, KEmpty) + }*/ + + if(iMetaData->Artist().Length()) + { + iObserver->PublishTextL( this, EMusicWidgetText3, iMetaData->Artist()); + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL Artist published", KNullDesC); + } + /* else + { + iObserver->PublishTextL( this, EMusicWidgetText3, KEmpty) + }*/ + + break; + } + + case EIRPSApplicationUninitialized: + case EIRPSApplicationClosing: + { + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL EIRPSApplicationUninitialized/Closing", KNullDesC); + if(iMetaData->Song().Length()) + { + iObserver->PublishTextL( this, EMusicWidgetText3, iMetaData->Song()); + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL LastSong published", KNullDesC); + } + else + { + iObserver->PublishTextL( this, EMusicWidgetText3, KEmpty); + } + + break; + } + + default: + break; + } + } + + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL exiting", KNullDesC); + + } + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::HandlePlayStopL +// Handles data change in Stop State +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::HandlePlayStopL( TIRStopPlayState aState ) + { + + IRRDEBUG2("CIRMCPPlugin::HandlePlayStopL Entering", KNullDesC); + + if ( aState == EIRStatePlay ) + { + IRRDEBUG2("CIRMCPPlugin::HandlePlayStopL unmute/play", KNullDesC); + + InstallIRCommandActionL( KIRCommandValueStop(), EMusicWidgetTrigger1 ); + + iObserver->PublishImageL( this, EMusicWidgetImage1, KIMGStop ); + } + else //if (aState == EIRStateStop) + { + + IRRDEBUG2("CIRMCPPlugin::HandlePlayStopL mute/stop", KNullDesC); + + InstallIRCommandActionL( KIRCommandValuePlay(), EMusicWidgetTrigger1 ); + + iObserver->PublishImageL( this, EMusicWidgetImage1, KIMGPlay ); + } + + + + IRRDEBUG2("InternetRadio -- CIRMCPPlugin::HandlePlayStopL Exiting", KNullDesC); + + } + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::HandleVolumeChangeL +// Handles volume change +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::HandleVolumeChangeL( const TInt aVolume ) + { + if ( aVolume >= KIRMinVolumeLevel && aVolume <= KIRMaxVolumeLevel ) + { + + } + else + { + User::Leave(KErrGeneral); + } + } + + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::HandleApplicationRunningStateChangeL +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::HandleApplicationRunningStateChangeL( TIRPSApplicationRunningState + aRunningState ) + { + IRRDEBUG2("CIRMCPPlugin::HandleApplicationRunningStateChangeL Entering aRunningState= %d", aRunningState); + + if ( iRunningState != aRunningState ) + { + iRunningState = aRunningState; + + switch ( iRunningState ) + { + case EIRPSApplicationUninitialized: + case EIRPSApplicationRunning: + ActivateL(); + break; + case EIRPSApplicationClosing: + if ( iActive ) + { + IRRDEBUG2("HandleApplicationRunningStateChangeL EIRPSApplicationClosing iActive", KNullDesC); + + InstallIRCommandActionL( KIRCommandValueStartNowPlaying(), EMusicWidgetTrigger1 ); + IRRDEBUG2("HandleApplicationRunningStateChangeL StartNowPlaying", KNullDesC); + + iObserver->PublishImageL( this, EMusicWidgetImage1, KIMGPlay ); + IRRDEBUG2("HandleApplicationRunningStateChangeL PublishImageL", KNullDesC); + + iObserver->PublishTextL( this, EMusicWidgetText1, *iLastPlayedText ); + iObserver->PublishTextL( this, EMusicWidgetText2, iChannelName ); + + + if(iMetaData->Song().Length()) + { + iObserver->PublishTextL( this, EMusicWidgetText3, iMetaData->Song()); + IRRDEBUG2("CIRMCPPlugin::HandleMetaDataReceivedL Song published", KNullDesC); + } + else + { + iObserver->PublishTextL( this, EMusicWidgetText3, KEmpty); + } + + } + iActive = EFalse; + break; + default: + break; + + } + + } + IRRDEBUG2("CIRMCPPlugin::HandleApplicationRunningStateChangeL Exiting", KNullDesC); + + } + + +// --------------------------------------------------------------------------- +// CIRMCPPlugin::InstallIRCommandActionL +// --------------------------------------------------------------------------- +// +void CIRMCPPlugin::InstallIRCommandActionL( const TDesC& aCommand, + TMCPTriggerDestination aDestination ) + { + IRRDEBUG2("CIRMCPPlugin::InstallIRCommandActionL Entering", KNullDesC); + + CLiwDefaultMap* mapTrigger = CLiwDefaultMap::NewLC(); + CLiwDefaultMap* mapData = CLiwDefaultMap::NewLC(); + + mapTrigger->InsertL( KIRPluginUid, TLiwVariant( + TUid::Uid( KIRActionHandlerImplementationUid ) ) ); + + mapData->InsertL( KIRCommand, TLiwVariant( aCommand ) ); + + mapTrigger->InsertL( KIRData, TLiwVariant( mapData ) ); + + if ( iActive ) + { + IRRDEBUG2("InstallIRCommandActionL iActive", KNullDesC); + + iObserver->PublishActionL( this, aDestination, mapTrigger ); + IRRDEBUG2("InstallIRCommandActionL PublishActionL", KNullDesC); + + } + + CleanupStack::PopAndDestroy( mapData ); + CleanupStack::PopAndDestroy( mapTrigger ); + + IRRDEBUG2("CIRMCPPlugin::InstallIRCommandActionL Exiting", KNullDesC); + + } + + + +// --------------------------------------------------------------------------- +// CIRActiveIdle::HandleBufferingStateL +// Handles changes in Internet Radio buffering state +// --------------------------------------------------------------------------- +// + +void CIRMCPPlugin::HandleBufferingStateL(TIRBufferingState aState ) + { + IRRDEBUG2("CIRMCPPlugin::HandleBufferingStateL Entering", KNullDesC); + + if(iActive) + { + switch (aState) + { + case EIRStateBufferingStop: + { + IRRDEBUG2("CIRMCPPlugin::HandleBufferingStateL 0", KNullDesC); + + HandleChannelChangeL(); + + HandleMetaDataReceivedL(*iMetaData); + + RProperty::Get( KUidActiveInternetRadioApp,KIRPSPlayStop, + iPlayingState ); + + HandlePlayStopL(static_cast(iPlayingState)); + + + } + break; + case EIRStateBufferingStart: + { + + IRRDEBUG2("CIRMCPPlugin::HandleBufferingStateL 1", KNullDesC); + + iObserver->PublishTextL( this, EMusicWidgetText1, KEmpty); + iObserver->PublishTextL( this, EMusicWidgetText2,KEmpty); + iObserver->PublishTextL( this, EMusicWidgetText3,*iBufferingText); + + } + break; + + case EIRStateBufferingError: + { + iObserver->PublishTextL( this, EMusicWidgetText1, KEmpty); + iObserver->PublishTextL( this, EMusicWidgetText2,KEmpty); + iObserver->PublishTextL( this, EMusicWidgetText3,KEmpty); + + } + break; + } + } + + IRRDEBUG2("CIRMCPPlugin::HandleBufferingStateL Exiting", KNullDesC); + + } + + +/** Provides a key-value pair table, that is used to identify the correct construction function for the requested interface. */ +const TImplementationProxy KIRMCPPluginImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KIRMCPPluginImplementationUid, CIRMCPPlugin::NewL ) + }; + +const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ); + +// --------------------------------------------------------------------------- +// Returns the implementations provided by this ECOM plugin DLL. +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + IRRDEBUG2("CIRMCPPlugin::ImplementationGroupProxy", KNullDesC); + + aTableCount = sizeof( KIRMCPPluginImplementationTable ) / sizeof( TImplementationProxy ); + return KIRMCPPluginImplementationTable; + } +