internetradio2.0/mcppluginsrc/irmcpplugin.cpp
changeset 0 09774dfdd46b
--- /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 <bautils.h>
+#include <coemain.h>
+#include <data_caging_path_literals.hrh>
+#include <e32cmn.h>
+#include <implementationproxy.h>
+#include <liwvariant.h>
+#include <stringloader.h>
+#include <irmcpplugin.rsg>
+
+#include <e32property.h>
+
+#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<TIRStopPlayState>(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<TIRStopPlayState>(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;
+    }
+