diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/src/omxilsymbiancomponentloader.cpp --- /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 +#include +#include "omxilsymbiancomponentloader.h" +#include "omxiluids.hrh" +#include +#include +#include +#include +#include +#include +#include +#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; indexImplementationUid(); + 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(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(*pHandle))->SetCallbacks(*pHandle, pCallBacks, pAppData); + + if(error != OMX_ErrorNone) + { + (static_cast(*pHandle))->ComponentDeInit(*pHandle); + delete component; + return error; + } + if( iComponents.Append(component) != KErrNone ) + { + (static_cast(*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(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= 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(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(const_cast(iComponentNameList[index].iRoles.Ptr())), + size); + parser[size]=0; + + for( i=0, j=0, p=parser; i(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; + }