mmlibs/mmfw/src/ControllerFramework/mmfvideosubtitlecustomcommands.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/src/ControllerFramework/mmfvideosubtitlecustomcommands.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,454 @@
+// Copyright (c) 2008-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:
+//
+
+#include "mmfvideosubtitlecustomcommands.h"
+
+/**
+@internalComponent
+*/
+enum TMMFSubtitleSupportMessages
+	{
+	EMMFSubtitleSupportAvailable,
+	EMMFSubtitleSupportEnable,
+	EMMFSubtitleSupportDisable,
+	EMMFSubtitleSupportGetLanguageSupportCount,
+	EMMFSubtitleSupportGetLanguageSupportData,
+	EMMFSubtitleSupportSetLanguage,
+	EMMFSubtitleSupportGetLanguage,
+	EMMFSubtitleSupportUpdateSubtitleConfig,
+	EMMFSubtitleSupportAddSubtitleConfig,
+	EMMFSubtitleSupportRemoveSubtitleConfig,
+	EMMFSubtitleSupportGetCrpParameter
+	};
+
+/**
+@internalComponent
+*/
+class TCrpParameters
+	{
+public:
+	TCrpParameters() : iId(TWsGraphicId::EUninitialized) {}
+	
+	TWsGraphicId iId;
+	TRect iCrpRect;
+	};
+
+/**
+ * Constructor.
+ * 
+ * @param aController The client side controller object to be used by this custom 
+ * command interface.
+ */
+EXPORT_C RMMFVideoPlaySubtitleSupportCustomCommands::RMMFVideoPlaySubtitleSupportCustomCommands(RMMFController& aController)
+	: RMMFCustomCommandsBase(aController, KUidInterfaceMMFVideoPlaySubtitleSupport)
+	{
+	}
+
+/**
+ * Adds subtitle configuration data for a window.
+ * 
+ * @param aConfig Subtitle configuration data for a window.
+ * @return KErrNone if completed succesfully, otherwise one of the system wide error codes.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::AddSubtitleConfig(const TMMFSubtitleWindowConfig& aConfig)
+	{
+	TPckgBuf<TMMFSubtitleWindowConfig> configPckg(aConfig);
+	
+	return iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportAddSubtitleConfig, 
+			configPckg,
+			KNullDesC8);
+	}
+
+/**
+ * Removes the subtitle configuration data associated with the given window.
+ * 
+ * @param aWindowId Unique identifier of the window associated with the 
+ * configuration data being removed.
+ * @return KErrNone if completed succesfully, otherwise one of the system wide error codes.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::RemoveSubtitleConfig(TInt aWindowId)
+	{
+	TPckgBuf<TInt> windowPckg(aWindowId);
+	
+	return iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportRemoveSubtitleConfig,
+			windowPckg,
+			KNullDesC8);
+	}
+
+/** 
+ * Reconfigures subtitle configuration.
+ * 
+ * @param aConfig Subtitle configuration data for a window.
+ * @return KErrNone if completed succesfully, otherwise one of the system wide error codes.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::UpdateSubtitleConfig(const TMMFSubtitleWindowConfig& aConfig)
+	{
+	TPckgBuf<TMMFSubtitleWindowConfig> configPckg(aConfig);
+	
+	return iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportUpdateSubtitleConfig, 
+			configPckg,
+			KNullDesC8);
+	}
+
+/** 
+ * Checks if subtitles are available in the current video stream.  
+ * 
+ * @param aAvailable When this function returns, this is set to ETrue if the 
+ * controller supports subtitle extensions and subtitles are available in the 
+ * current video stream.
+ * @return KErrNone if subtitles are supported by the controller; KErrNotSupported 
+ * if the controller does not support subtitles; otherwise other system error code.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::GetSubtitlesAvailable(TBool& aAvailable)
+	{
+	TPckgBuf<TBool> avail;
+	
+	TInt err = iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportAvailable,
+			KNullDesC8,
+			KNullDesC8,
+			avail);
+	
+	aAvailable = (KErrNone == err) && avail();
+	return err;
+	}
+
+/**
+ * Disables subtitles during video playback.
+ * 
+ * @return KErrNone if completed succesfully, otherwise one of the system wide error codes.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::DisableSubtitles()
+	{
+	return iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportDisable,
+			KNullDesC8,
+			KNullDesC8);
+	}
+
+/**
+ * Enables subtitles during video playback.
+ * 
+ * @return KErrNone if subtitles are supported; KErrNotSupported if 
+ * controller does not support subtitles; KErrNotFound if subtitle data 
+ * not found; otherwise other system error code.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::EnableSubtitles()
+	{	
+	return iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportEnable,
+			KNullDesC8,
+			KNullDesC8);
+	}
+
+/**
+ * Gets the CRP parameters associated with a display
+ * 
+ * @param aWindowId The window id used in the query.
+ * @param aId Return the CRP id associated with the given display id
+ * @param aCrpRect Return the subtitle region for drawing the CRP
+ * 
+ * @return KErrNone on success; system wide error code otherwise.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::GetCrpParameters(TInt aWindowId, TWsGraphicId& aId, TRect& aCrpRect)
+	{
+	TPckgBuf<TInt> windowIdPckg(aWindowId);
+	TPckgBuf<TCrpParameters> parameterPckg;
+	
+	TInt err = iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportGetCrpParameter,
+			windowIdPckg,
+			KNullDesC8,
+			parameterPckg);
+	
+	if (KErrNone == err)
+		{
+		aId = parameterPckg().iId;
+		aCrpRect = parameterPckg().iCrpRect;
+		}
+	
+	return err;
+	}
+
+/**
+ * Gets the current subtitle language
+ * 
+ * @param aLanguage On return, set the the current language.
+ * @return KErrNone on success. KErrNotSupported when the enabled subtitle does not 
+ * contain language information.  Otherwise system wide error code.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::GetSubtitleLanguage(TLanguage& aLanguage)
+	{
+	TPckgBuf<TLanguage> languagePckg;
+	TInt err = iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportGetLanguage,
+			KNullDesC8,
+			KNullDesC8,
+			languagePckg);
+	
+	if (KErrNone == err)
+		{
+		aLanguage = languagePckg();
+		}
+	
+	return err;
+	}
+
+/**
+ * Gets a list of all available languages.
+ * 
+ * @param aAvailable Array of available languages
+ * @leave KErrNotSupported If the current controller does not support subtitles.
+ * @leave KErrNotFound If the controller cannot find subtitle data.
+ * @leave Otherwise leaves with any of the system wide error codes.
+ */
+EXPORT_C void RMMFVideoPlaySubtitleSupportCustomCommands::GetSupportedSubtitleLanguagesL(RArray<TLanguage>& aSubtitleLanguages)
+	{
+	aSubtitleLanguages.Reset();
+	
+	TPckgBuf<TInt> countPckg;
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportGetLanguageSupportCount,
+			KNullDesC8,
+			KNullDesC8,
+			countPckg));
+	
+	TInt count = countPckg();
+	
+	if (count > 0)
+		{	
+		HBufC8* buf = HBufC8::NewLC(count * sizeof(TLanguage));	
+		TPtr8 ptr = buf->Des();
+	
+		User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+				EMMFSubtitleSupportGetLanguageSupportData, 
+				KNullDesC8,
+				KNullDesC8,
+				ptr));
+		
+		TPckgBuf<TLanguage> langPckg;
+		RDesReadStream stream(ptr);
+		CleanupClosePushL(stream);
+	
+		for (TInt i = 0; i < count; i++)
+			{
+			stream.ReadL(langPckg);
+			aSubtitleLanguages.AppendL(langPckg());
+			}
+	
+		CleanupStack::PopAndDestroy(2, buf); //stream, buf
+		}
+	}
+
+/**
+ * Sets the current subtitle language
+ * 
+ * @param aSubtitleLanguage Language to be used for subtitle stream.
+ * @return KErrNone on success.  KErrNotSupported when the enabled subtitle 
+ * does not contain language information.  Otherwise system wide error code.
+ */
+EXPORT_C TInt RMMFVideoPlaySubtitleSupportCustomCommands::SetSubtitleLanguage(TLanguage aSubtitleLanguage)
+	{
+	TPckgBuf<TLanguage> languagePckg(aSubtitleLanguage);
+	
+	return iController.CustomCommandSync(iDestinationPckg,
+			EMMFSubtitleSupportSetLanguage,
+			languagePckg,
+			KNullDesC8);
+	}
+
+/**
+ * Creates a new custom command parser capable of handling subtitle support commands.
+ * 
+ * @param aImplementor A reference to the controller plugin that owns this new 
+ * object.
+ * 
+ * @return A pointer to the object created.
+ */
+EXPORT_C CMMFVideoPlaySubtitleSupportCustomCommandParser* CMMFVideoPlaySubtitleSupportCustomCommandParser::NewL(
+		MMMFVideoPlaySubtitleSupportCustomCommandImplementor& aImplementor)
+	{
+	return new(ELeave) CMMFVideoPlaySubtitleSupportCustomCommandParser(aImplementor);
+	}
+
+CMMFVideoPlaySubtitleSupportCustomCommandParser::CMMFVideoPlaySubtitleSupportCustomCommandParser(MMMFVideoPlaySubtitleSupportCustomCommandImplementor& aImplementor) :
+	CMMFCustomCommandParserBase(KUidInterfaceMMFVideoPlaySubtitleSupport),
+	iImplementor(aImplementor)
+	{
+	}
+
+/**
+ * Destructor.
+ */
+EXPORT_C CMMFVideoPlaySubtitleSupportCustomCommandParser::~CMMFVideoPlaySubtitleSupportCustomCommandParser()
+	{
+	iAvailableLanguages.Close();
+	}
+
+/**
+ * Handles a request from the client. Called by the controller framework.
+ * 
+ * @param aMessage The message to be handled.
+ */
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::HandleRequest(TMMFMessage& aMessage)
+	{
+	if (aMessage.Destination().InterfaceId() == KUidInterfaceMMFVideoPlaySubtitleSupport)
+		{
+		TRAPD(error, DoHandleRequestL(aMessage));
+		aMessage.Complete(error);
+		}
+	else
+		{
+		aMessage.Complete(KErrNotSupported);
+		}
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoHandleRequestL(TMMFMessage& aMessage)
+	{
+	switch (aMessage.Function())
+		{
+	case EMMFSubtitleSupportAvailable:
+		DoGetSubtitlesAvailableL(aMessage);
+		break;
+	case EMMFSubtitleSupportEnable:
+		DoEnableSubtitlesL(aMessage);
+		break;
+	case EMMFSubtitleSupportDisable:
+		DoDisableSubtitlesL(aMessage);
+		break;
+	case EMMFSubtitleSupportGetLanguageSupportCount:
+		DoGetSupportedLanguagesCountL(aMessage);
+		break;
+	case EMMFSubtitleSupportGetLanguageSupportData:
+		DoGetSupportedLanguagesDataL(aMessage);
+		break;
+	case EMMFSubtitleSupportGetLanguage:
+		DoGetSubtitleLanguageL(aMessage);
+		break;
+	case EMMFSubtitleSupportSetLanguage:
+		DoSetSubtitleLanguageL(aMessage);
+		break;
+	case EMMFSubtitleSupportUpdateSubtitleConfig:
+		DoUpdateSubtitleConfigL(aMessage);
+		break;
+	case EMMFSubtitleSupportAddSubtitleConfig:
+		DoAddSubtitleConfigL(aMessage);
+		break;
+	case EMMFSubtitleSupportRemoveSubtitleConfig:
+		DoRemoveSubtitleConfigL(aMessage);
+		break;
+	case EMMFSubtitleSupportGetCrpParameter:
+		DoGetCrpParametersL(aMessage);
+		break;
+	default:
+		User::Leave(KErrNotSupported);
+		break;
+		}
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoGetSubtitlesAvailableL(TMMFMessage& aMessage)
+	{
+	TBool avail;
+	iImplementor.MvpsusGetSubtitlesAvailableL(avail);
+	TPckgBuf<TBool> availPckg(avail);
+	aMessage.WriteDataToClientL(availPckg);
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoUpdateSubtitleConfigL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFSubtitleWindowConfig> configPckg;
+	aMessage.ReadData1FromClientL(configPckg);
+	iImplementor.MvpsusUpdateSubtitleConfigL(configPckg());
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoAddSubtitleConfigL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFSubtitleWindowConfig> configPckg;
+	aMessage.ReadData1FromClientL(configPckg);
+	iImplementor.MvpsusAddSubtitleConfigL(configPckg());
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoRemoveSubtitleConfigL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TInt> windowPckg;
+	aMessage.ReadData1FromClientL(windowPckg);
+	iImplementor.MvpsusRemoveSubtitleConfigL(windowPckg());
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoDisableSubtitlesL(TMMFMessage& /*aMessage*/)
+	{
+	iImplementor.MvpsusDisableSubtitlesL();
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoEnableSubtitlesL(TMMFMessage& /*aMessage*/)
+	{
+	iImplementor.MvpsusEnableSubtitlesL();
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoGetSupportedLanguagesDataL(TMMFMessage& aMessage)
+	{
+	HBufC8* buf = HBufC8::NewLC(iAvailableLanguages.Count() * sizeof(TLanguage));
+	TPtr8 ptr = buf->Des();
+	RDesWriteStream stream(ptr);
+	CleanupClosePushL(stream);
+	
+	for (TInt i = 0; i < iAvailableLanguages.Count(); i++)
+		{
+		TPckgBuf<TLanguage> langPckg(iAvailableLanguages[i]);
+		stream.WriteL(langPckg);
+		}
+	
+	stream.CommitL();
+	aMessage.WriteDataToClientL(ptr);
+	CleanupStack::PopAndDestroy(2, buf); // stream, buf
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoGetSupportedLanguagesCountL(TMMFMessage& aMessage)
+	{
+	iAvailableLanguages.Reset();
+	iImplementor.MvpsusGetSupportedSubtitleLanguagesL(iAvailableLanguages);
+	
+	TPckgBuf<TInt> countPckg(iAvailableLanguages.Count());
+	aMessage.WriteDataToClientL(countPckg);
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoGetSubtitleLanguageL(TMMFMessage& aMessage)
+	{
+	TLanguage lang;
+	iImplementor.MvpsusGetSubtitleLanguageL(lang);
+	TPckgBuf<TLanguage> langPckg(lang);
+	aMessage.WriteDataToClientL(langPckg);
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoSetSubtitleLanguageL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TLanguage> langPckg;
+	aMessage.ReadData1FromClientL(langPckg);
+	iImplementor.MvpsusSetSubtitleLanguageL(langPckg());
+	}
+
+void CMMFVideoPlaySubtitleSupportCustomCommandParser::DoGetCrpParametersL(TMMFMessage& aMessage)
+	{
+	TCrpParameters crpParams;
+	TPckgBuf<TInt> displayPckg;
+	aMessage.ReadData1FromClientL(displayPckg);
+	iImplementor.MvpsusGetCrpParametersL(displayPckg(), crpParams.iId, crpParams.iCrpRect);
+	
+	TPckgBuf<TCrpParameters> paramPckg(crpParams);
+	aMessage.WriteDataToClientL(paramPckg);
+	}