mmlibs/mmfw/src/ControllerFramework/RecMmfUtilBody.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/src/ControllerFramework/RecMmfUtilBody.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,240 @@
+// Copyright (c) 2003-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:
+// This is the body of the MMF recognizer utility class
+// 
+//
+
+#include <badesca.h>
+
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+#include "RecMmfUtilBody.h"
+#include <mmf/server/mmfdatasourcesink.hrh>
+
+
+// MMF Recognizer Utility class body constructor
+CMmfRecognizerUtil::CBody::CBody():
+	CActive(CActive::EPriorityStandard)
+	{
+	}
+
+CMmfRecognizerUtil::CBody::~CBody()
+	{
+	Cancel();
+	iEcomSession.Close();
+	iControllers.ResetAndDestroy();
+	}
+
+// Request ECom to be notified when interface implementation registration 
+// data changes so that we can refresh the list of interface implementations.
+void CMmfRecognizerUtil::CBody::StartNotification()
+	{
+	iEcomSession.NotifyOnChange(iStatus);
+	SetActive();
+	}
+
+// build a list of interface implementation objects
+void CMmfRecognizerUtil::CBody::BuildControllerListL()
+	{
+	iControllers.ResetAndDestroy();
+	CMMFControllerPluginSelectionParameters* cSelect = 
+		CMMFControllerPluginSelectionParameters::NewLC();
+	
+	CMMFFormatSelectionParameters* fSelect = 
+		CMMFFormatSelectionParameters::NewLC();
+
+	cSelect->SetRequiredPlayFormatSupportL(*fSelect);
+
+	// Set the media ids
+	RArray<TUid> mediaIds;
+	CleanupClosePushL(mediaIds);
+
+	User::LeaveIfError(mediaIds.Append(KUidMediaTypeAudio));
+	User::LeaveIfError(mediaIds.Append(KUidMediaTypeVideo));
+	cSelect->SetMediaIdsL(mediaIds, CMMFPluginSelectionParameters::EAllowOtherMediaIds);
+																	
+	cSelect->ListImplementationsL(iControllers);
+
+	// Clean up
+	CleanupStack::PopAndDestroy(3, cSelect);// mediaIds, fSelect, cSelect
+	}
+
+void CMmfRecognizerUtil::CBody::ConstructL()
+	{
+	BuildControllerListL();
+
+	CActiveScheduler::Add(this);
+
+	iEcomSession = REComSession::OpenL();
+
+	// request notification from ECOM of any file system changes
+	StartNotification();
+	}
+
+void CMmfRecognizerUtil::CBody::RunL()
+	{
+	BuildControllerListL();
+	StartNotification();
+	}
+
+void CMmfRecognizerUtil::CBody::DoCancel()
+	{
+	if (iStatus == KRequestPending)
+		iEcomSession.CancelNotifyOnChange(iStatus);
+	}
+
+/* 	Determine whether the supplied data header on its own is recognized,
+	or the data header plus the file suffix together are recognized,
+	and if so return the associated MIME type.
+	
+	@param	aFileName
+			The name of the file
+	@param	aImageData
+			A descriptor containing the header
+	@param	aMimeType
+			A user-supplied descriptor in which the MIME type is returned
+	@leave	KErrUnderflow 
+			Not enough data in descriptor to identify whether it is supported
+			by any plugin.
+	@leave	This method may also leave with one of the system-wide error codes.
+	@return	EMatchNone if a match was not found.
+			EMatchData if a data match was found.
+			EMatchName if a data and file suffix match was found.
+	@post	If recognized, the caller's descriptor is filled with the MIME types
+*/
+CMmfRecognizerUtil::TMatchLevel CMmfRecognizerUtil::CBody::GetMimeTypeL(const TDesC& aFileName, const TDesC8& aImageData, TDes8& aMimeType)
+	{
+	CMmfRecognizerUtil::TMatchLevel matchLevel = EMatchNone;
+
+	//Get the suffix
+	TParse fileName;
+	
+	// aFileName's length could be greater than KMaxFileName
+	// so don't use TFileName here
+	TPtrC fName(aFileName);
+	if (aFileName.Match(_L("::*")) == 0)
+ 		{
+		fName.Set(aFileName.Mid(2));
+ 		}
+	User::LeaveIfError(fileName.Set(fName, NULL, NULL));
+
+	HBufC8* fileSuffix = NULL;
+	if(fileName.ExtPresent())
+		{
+		TPtrC suffixPtr(fileName.Ext());
+		fileSuffix = HBufC8::NewLC(suffixPtr.Length());
+		fileSuffix->Des().Copy(suffixPtr);
+		}
+
+	// loop through every supported Format of every controller 
+	// until we find one that matches the data header on its own,
+	// or the data header plus the file suffix together
+	for (TInt nController = 0, countControllers = iControllers.Count(); nController < countControllers; nController++)
+		{
+		CMMFControllerImplementationInformation* controllerImpInfo = iControllers[nController];
+
+		for (TInt nPlayFormat = 0, countFormats = controllerImpInfo->PlayFormats().Count(); nPlayFormat < countFormats; nPlayFormat++)
+			{
+			const CMMFFormatImplementationInformation* formatImpInfo = 
+				controllerImpInfo->PlayFormats()[nPlayFormat];
+			if (formatImpInfo->SupportsHeaderDataL(aImageData))
+				{
+				const CDesC8Array& supportedMimeTypes = formatImpInfo->SupportedMimeTypes();
+				if (supportedMimeTypes.Count() > 0)
+					{
+					CMmfRecognizerUtil::TMatchLevel previousMatchLevel = matchLevel;
+					if(fileSuffix && formatImpInfo->SupportsFileExtension(*fileSuffix))
+						matchLevel = EMatchName;
+					else
+						matchLevel = EMatchData;
+					// Use first data match but update if suffix match is found
+					if(matchLevel!=previousMatchLevel)
+						aMimeType = supportedMimeTypes[0]; // just return the first mime type in the array
+					}
+				}
+			if(matchLevel==EMatchName || (!fileSuffix && matchLevel==EMatchData))
+				break;
+			}
+		if(matchLevel==EMatchName || (!fileSuffix && matchLevel==EMatchData))
+			break;
+		}
+
+	if(fileSuffix)
+		CleanupStack::PopAndDestroy(fileSuffix);
+
+	return matchLevel;
+	}
+
+// Static factory constructor. Uses two phase
+// construction and leaves nothing on the cleanup stack
+// @leave KErrNoMemory
+// @return A pointer to the newly created CMmfRecognizerUtilBody object
+CMmfRecognizerUtil::CBody* CMmfRecognizerUtil::CBody::NewL()
+	{
+	CBody* self=new (ELeave) CBody();   
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// Get all the mime types supported by MMF
+// @param	aMimeTypes
+//          A caller-supplied array of descriptors.
+// @leave	This method may leave with one of the system-wide error codes.
+// @post    The caller's array is filled with the supported MIME types
+void CMmfRecognizerUtil::CBody::GetMimeTypesL(CDesC8Array* aMimeTypes)
+	{
+
+	CMMFControllerPluginSelectionParameters* cSelect = 
+												CMMFControllerPluginSelectionParameters::NewLC();
+	CMMFFormatSelectionParameters* fSelect = CMMFFormatSelectionParameters::NewLC();
+
+	// Set the play format selection parameters to be blank  
+	//  - format support Is only retrieved if requested.
+	cSelect->SetRequiredPlayFormatSupportL(*fSelect);
+
+	// Set the media ids
+	RArray<TUid> mediaIds;
+	CleanupClosePushL(mediaIds);	
+	User::LeaveIfError(mediaIds.Append(KUidMediaTypeVideo));
+	User::LeaveIfError(mediaIds.Append(KUidMediaTypeAudio));
+	cSelect->SetMediaIdsL(mediaIds, CMMFPluginSelectionParameters::EAllowOtherMediaIds);
+																		   
+	// Array to hold all the controller plugins
+	RMMFControllerImplInfoArray controllers; 
+
+	CleanupResetAndDestroyPushL(controllers);
+	cSelect->ListImplementationsL(controllers);
+
+	for (TInt nController = 0, controllerCount = controllers.Count(); nController < controllerCount; nController++)
+		{
+		for (TInt nPlayFormat = 0, formatCount = controllers[nController]->PlayFormats().Count(); nPlayFormat < formatCount; nPlayFormat++)
+			{
+			const CMMFFormatImplementationInformation* formatImpInfo = controllers[nController]->PlayFormats()[nPlayFormat];
+			const CDesC8Array& supportedMimeTypes = formatImpInfo->SupportedMimeTypes();
+			for (TInt nMimeType = 0, mimeTypeCount = supportedMimeTypes.Count(); nMimeType < mimeTypeCount; nMimeType++)
+				{
+				aMimeTypes->AppendL(supportedMimeTypes[nMimeType]);
+				}
+			}
+		}
+					
+	// Clean up
+	CleanupStack::PopAndDestroy(4, cSelect);//controllers, mediaIds, fSelect, cSelect
+	}
+
+
+
+
+