omxil_generic/omxilloader/src/omxilsymbiancomponentloader.cpp
changeset 0 0e4a32b9112d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omxil_generic/omxilloader/src/omxilsymbiancomponentloader.cpp	Wed Aug 25 12:40:50 2010 +0300
@@ -0,0 +1,443 @@
+// 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 <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include "omxilsymbiancomponentloader.h"
+#include "omxiluids.hrh"
+#include <openmax/il/core/omxilloaderif.h>
+#include <openmax/il/khronos/v1_x/OMX_Core.h>
+#include <openmax/il/khronos/v1_x/OMX_Component.h>
+#include <string.h>
+#include <delimitedparser8.h>
+#include <openmax/il/core/omxilloaderif.hrh>
+#include <openmax/il/loader/omxilcomponentif.hrh>
+#include "log.h"
+
+OMX_ERRORTYPE OmxInitializeComponentLoader(OMX_LOADERTYPE *loader);
+OMX_ERRORTYPE OmxUnInitializeComponentLoader(OMX_LOADERTYPE *loader);
+OMX_ERRORTYPE OmxLoadComponent(	OMX_LOADERTYPE *loader,
+								OMX_OUT OMX_HANDLETYPE* pHandle,
+								OMX_IN  OMX_STRING cComponentName,
+								OMX_IN  OMX_PTR pAppData,
+								OMX_IN  OMX_CALLBACKTYPE* pCallBacks);
+OMX_ERRORTYPE OmxUnloadComponent( OMX_LOADERTYPE *loader, 
+								  OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE OmxComponentNameEnum(	OMX_LOADERTYPE *loader,
+							        OMX_OUT OMX_STRING cComponentName,
+							        OMX_IN OMX_U32 nNameLength,
+							        OMX_IN  OMX_U32 nIndex);
+OMX_ERRORTYPE OmxGetRolesOfComponent( OMX_LOADERTYPE *loader,
+							          OMX_IN OMX_STRING compName,
+							          OMX_INOUT OMX_U32 *pNumRoles,
+							          OMX_OUT OMX_U8 **roles);
+OMX_ERRORTYPE OmxGetComponentsOfRole( OMX_LOADERTYPE *loader,
+							          OMX_IN OMX_STRING role,
+							          OMX_INOUT OMX_U32 *pNumComps,
+							          OMX_INOUT OMX_U8  **compNames);
+
+
+
+OMX_ERRORTYPE OmxInitializeComponentLoader(OMX_LOADERTYPE *loader)
+	{
+	return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->InitializeComponentLoader();
+	}
+
+OMX_ERRORTYPE OmxUnInitializeComponentLoader(OMX_LOADERTYPE *loader)
+	{
+	return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->UnInitializeComponentLoader(loader);
+	}
+
+OMX_ERRORTYPE OmxLoadComponent(	OMX_LOADERTYPE *loader,
+								OMX_OUT OMX_HANDLETYPE* pHandle,
+								OMX_IN  OMX_STRING cComponentName,
+								OMX_IN  OMX_PTR pAppData,
+								OMX_IN  OMX_CALLBACKTYPE* pCallBacks)
+	{
+	return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->LoadComponent(pHandle,cComponentName,pAppData,pCallBacks);
+	}
+
+OMX_ERRORTYPE OmxUnloadComponent( OMX_LOADERTYPE *loader, 
+								  OMX_HANDLETYPE hComponent)
+	{
+	return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->UnloadComponent(hComponent);
+	}
+
+OMX_ERRORTYPE OmxComponentNameEnum(	OMX_LOADERTYPE *loader,
+							        OMX_OUT OMX_STRING cComponentName,
+							        OMX_IN OMX_U32 nNameLength,
+							        OMX_IN  OMX_U32 nIndex)
+	{
+	return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->ComponentNameEnum(cComponentName,nNameLength,nIndex);
+	}
+
+OMX_ERRORTYPE OmxGetRolesOfComponent( OMX_LOADERTYPE *loader,
+							          OMX_IN OMX_STRING compName,
+							          OMX_INOUT OMX_U32 *pNumRoles,
+							          OMX_OUT OMX_U8 **roles)
+	{
+	return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->GetRolesOfComponent(compName,pNumRoles,roles);
+	}
+
+OMX_ERRORTYPE OmxGetComponentsOfRole( OMX_LOADERTYPE *loader,
+							          OMX_IN OMX_STRING role,
+							          OMX_INOUT OMX_U32 *pNumComps,
+							          OMX_INOUT OMX_U8  **compNames)
+	{
+	return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->GetComponentsOfRole(role,pNumComps,compNames);
+	}
+
+OMX_ERRORTYPE CSymbianOmxComponentLoader::InitializeComponentLoader()
+	{
+	RImplInfoPtrArray ecomArray;
+	TRAPD(error,REComSession::ListImplementationsL(TUid::Uid(KUidOmxILSymbianComponentIf),ecomArray));
+	if( error != KErrNone )
+		{
+		ecomArray.ResetAndDestroy();
+		return OMX_ErrorInsufficientResources;
+		}
+	TInt index;
+	CImplementationInformation* info;
+
+	TOmxComponentInfo component;
+	
+	iComponentNameList.Reset();
+	
+	const TInt KEcomArrayCount = ecomArray.Count();
+	for( index=0; index<KEcomArrayCount && error == KErrNone; ++index )
+		{
+		info = ecomArray[index];
+		component.iUid = info->ImplementationUid();
+		if( info->DisplayName().Length() >= OMX_MAX_STRINGNAME_SIZE || 
+			info->DataType().Length() >= OMX_MAX_ROLESBUFFER_SIZE )
+			{
+			error = KErrBadName;
+			break;
+			}
+
+		component.iComponentName.Copy(info->DisplayName());
+		component.iRoles.Copy(info->DataType());
+
+		error = iComponentNameList.Append(component);
+		if(error)
+			{
+			break;
+			}
+		}
+	ecomArray.ResetAndDestroy();
+	if( error != KErrNone )
+		{
+		if( error == KErrNoMemory )
+			{
+			return OMX_ErrorInsufficientResources;
+			}
+
+		return OMX_ErrorUndefined;
+		}
+	return OMX_ErrorNone;
+	}
+
+OMX_ERRORTYPE CSymbianOmxComponentLoader::UnInitializeComponentLoader(OMX_LOADERTYPE * /*loader*/)
+	{
+	iComponentNameList.Reset();
+	iComponents.ResetAndDestroy();
+	return OMX_ErrorNone;
+	}
+
+OMX_ERRORTYPE CSymbianOmxComponentLoader::LoadComponent(	OMX_HANDLETYPE* pHandle,
+								OMX_STRING cComponentName,
+								OMX_PTR pAppData,
+								OMX_CALLBACKTYPE* pCallBacks)
+	{
+	TInt index;
+    TPtrC8 lComponentName(reinterpret_cast<TUint8 *>(cComponentName), strlen(cComponentName));
+    COmxILComponentIf* component = NULL;
+	OMX_ERRORTYPE error = OMX_ErrorComponentNotFound;
+
+    const TInt KComponentNameListCount = iComponentNameList.Count();
+    for( index = 0; index < KComponentNameListCount; ++index )
+		{
+		TOmxComponentInfo& comp = iComponentNameList[index];
+		DEBUG_PRINTF3(_L8("CSymbianOmxComponentLoader::LoadComponent : comp [%index] [%S]"), index, &comp.iComponentName);
+		if( comp.iComponentName.CompareF(lComponentName) == 0 )
+			{
+			TRAPD(err, component = COmxILComponentIf::CreateImplementationL(iComponentNameList[index].iUid));
+			if( err != KErrNone )
+				{
+				if ( err == KErrNoMemory )
+					{
+					return OMX_ErrorInsufficientResources;
+					}
+				else
+					{
+					return OMX_ErrorInvalidComponent;
+					}
+				}
+
+			*pHandle = component->Handle();
+			if( !*pHandle )
+				{
+				return OMX_ErrorInvalidComponent;
+				}
+
+			error = (static_cast<OMX_COMPONENTTYPE*>(*pHandle))->SetCallbacks(*pHandle, pCallBacks, pAppData);
+			
+			if(error != OMX_ErrorNone)
+				{
+				(static_cast<OMX_COMPONENTTYPE*>(*pHandle))->ComponentDeInit(*pHandle);
+				delete component;
+				return error;
+				}
+			if( iComponents.Append(component) != KErrNone )
+				{
+				(static_cast<OMX_COMPONENTTYPE*>(*pHandle))->ComponentDeInit(*pHandle);
+				delete component;
+				return OMX_ErrorInsufficientResources;
+				}
+			return error;
+			}
+		}
+    return error;
+	}
+
+OMX_ERRORTYPE CSymbianOmxComponentLoader::UnloadComponent( OMX_HANDLETYPE hComponent)
+	{
+	TInt index;
+	COmxILComponentIf* component;
+
+	const TInt KComponentsCount = iComponents.Count();
+	for( index = 0; index < KComponentsCount; ++index )
+		{
+		component = iComponents[index];
+		if( component->Handle() == hComponent )
+			{
+			(static_cast<OMX_COMPONENTTYPE*>(hComponent))->ComponentDeInit( hComponent );
+			delete component;
+			iComponents.Remove(index);
+			return OMX_ErrorNone;
+			}
+		}
+	return OMX_ErrorComponentNotFound;
+	}
+
+OMX_ERRORTYPE CSymbianOmxComponentLoader::ComponentNameEnum(	OMX_STRING aComponentName,
+							        OMX_U32 aNameLength,
+							        OMX_U32 aIndex)
+	{
+	ASSERT(aComponentName);
+
+	const TInt KIndexForPopulateList = 0;
+	if ( aIndex == KIndexForPopulateList )
+		{
+		RImplInfoPtrArray ecomArray;
+		TRAPD(error, REComSession::ListImplementationsL(TUid::Uid(KUidOmxILSymbianComponentIf), ecomArray));
+		if (error != KErrNone)
+			{
+			return OMX_ErrorUndefined;
+			}
+		TInt index;
+		iComponentNameList.Reset();
+
+		const TInt KEcomArrayCount = ecomArray.Count();
+		// Create Controller Implementation Information for each entry
+		for (index=0; index<KEcomArrayCount; ++index)
+			{
+			CImplementationInformation& info = *(ecomArray[index]);
+			TOmxComponentInfo component;
+			
+			component.iUid = info.ImplementationUid();
+			if( info.DisplayName().Length() >= OMX_MAX_STRINGNAME_SIZE || 
+				info.DataType().Length() >= OMX_MAX_ROLESBUFFER_SIZE )
+				{
+				error = KErrBadName;
+				break;
+				}
+			component.iComponentName.Copy(info.DisplayName());
+			component.iRoles.Copy(info.DataType());
+			error = iComponentNameList.Append(component);
+			if( error != KErrNone )
+				{
+				break;
+				}
+			}
+		ecomArray.ResetAndDestroy();
+		if( error != KErrNone )
+			{
+			return OMX_ErrorUndefined;
+			}
+		}
+	if (aIndex<iComponentNameList.Count())
+		{
+		TOmxComponentInfo& comp = iComponentNameList[aIndex];
+		TPtr8 ptr((TUint8*)aComponentName, 0, aNameLength);
+		ptr.Copy(comp.iComponentName);
+		ptr.PtrZ();
+		}
+	else
+		{
+		return OMX_ErrorNoMore;
+		}
+	return OMX_ErrorNone;
+	}
+
+OMX_ERRORTYPE CSymbianOmxComponentLoader::GetRolesOfComponent( OMX_STRING compName,
+							          OMX_U32 *pNumRoles,
+							          OMX_U8 **roles)
+	{
+	TInt index, roleindex;
+
+	ASSERT(pNumRoles);
+    if( !compName )
+    	{
+    	return OMX_ErrorBadParameter;
+    	}
+		
+    TPtrC8 tComponentName(reinterpret_cast<TUint8 *>(compName), strlen(compName));		
+
+    OMX_ERRORTYPE error = OMX_ErrorInvalidComponentName;
+    const TInt KComponentNameListCount = iComponentNameList.Count();
+    for( index = 0, roleindex = 0; index < KComponentNameListCount; ++index )
+		{
+		if( iComponentNameList[index].iComponentName.Compare(tComponentName) == 0 )
+			{
+			char parser[OMX_MAX_ROLESBUFFER_SIZE], *p;
+			size_t size;
+			TInt i, j;
+
+			size = iComponentNameList[index].iRoles.Length();
+
+			strncpy(parser, 
+					reinterpret_cast<char*>(const_cast<unsigned char*>(iComponentNameList[index].iRoles.Ptr())),
+					size);
+			parser[size]=0;
+
+			for( i=0, j=0, p=parser; i<size; ++i, ++j, ++p )
+				{
+				if( *p == ',' )
+					{
+					if( roles && (roleindex < *pNumRoles) )
+						{
+						roles[roleindex][j] = 0;
+						}
+					if( i < size )
+						{
+						++roleindex;
+						j=-1;
+						}
+					}
+				else
+					{
+					if( roles && (roleindex < *pNumRoles) )
+						{
+						roles[roleindex][j] = *p;
+						}
+					}
+				}
+			if( roles && (roleindex < *pNumRoles) )
+				{
+				roles[roleindex][j] = 0;
+				}
+			++roleindex;
+			error = OMX_ErrorNone;
+			break;
+			}
+		}
+    *pNumRoles = roleindex;
+    return error;
+	}
+
+OMX_ERRORTYPE CSymbianOmxComponentLoader::GetComponentsOfRole( OMX_STRING role,
+							          OMX_U32 *pNumComps,
+							          OMX_U8  **compNames)
+	{
+	TInt index, compindex;
+    TPtrC8 lRole(reinterpret_cast<TUint8 *>(role), strlen(role));
+
+	ASSERT(pNumComps);
+
+    TInt KComponentNameListCount = iComponentNameList.Count();
+    for( index = 0, compindex = 0; index < KComponentNameListCount; ++index )
+		{
+		if( iComponentNameList[index].iRoles.Find(lRole) != KErrNotFound )
+			{
+			if( compNames != NULL )
+				{
+				if( compNames[compindex]!= NULL )
+					{
+		            strncpy((char*)compNames[compindex],(char*)iComponentNameList[index].iComponentName.Ptr(),iComponentNameList[index].iComponentName.Length());
+		            compNames[compindex][iComponentNameList[index].iComponentName.Size()]=0;
+					}
+				else
+					{
+					return OMX_ErrorBadParameter;
+					}
+				}
+			++compindex;
+			}
+		}
+    *pNumComps = compindex;
+    return OMX_ErrorNone;
+	}
+
+OMX_HANDLETYPE CSymbianOmxComponentLoader::Handle()
+	{
+	return iHandle;
+	}
+
+CSymbianOmxComponentLoader::CSymbianOmxComponentLoader()
+	{
+	}
+
+CSymbianOmxComponentLoader::~CSymbianOmxComponentLoader()
+	{
+	delete iHandle;
+	}
+
+void CSymbianOmxComponentLoader::ConstructL()
+	{
+	iHandle = new(ELeave) OMX_LOADERTYPE;
+	
+	iHandle->InitializeComponentLoader = &::OmxInitializeComponentLoader;
+	iHandle->UnInitializeComponentLoader = &::OmxUnInitializeComponentLoader;
+	iHandle->LoadComponent = &::OmxLoadComponent;
+	iHandle->UnloadComponent = &::OmxUnloadComponent;
+	iHandle->ComponentNameEnum = &::OmxComponentNameEnum;
+	iHandle->GetRolesOfComponent = &::OmxGetRolesOfComponent;
+	iHandle->GetComponentsOfRole = &::OmxGetComponentsOfRole;
+	
+	iHandle->pLoaderPrivate = this;
+	}
+
+CSymbianOmxComponentLoader* CSymbianOmxComponentLoader::NewL()
+	{
+	CSymbianOmxComponentLoader* self = new(ELeave) CSymbianOmxComponentLoader;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	
+	return self;
+	}
+
+// ECOM
+const TImplementationProxy ImplementationTable[] = 
+	{
+	IMPLEMENTATION_PROXY_ENTRY(KUidOmxILSymbianComponentLoader, CSymbianOmxComponentLoader::NewL),
+	};
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+	return ImplementationTable;
+	}