ECode CActivityOne::CreateInstance( /* [in] */ const String& moduleName, /* [in] */ const String& className, /* [out] */ IInterface** object) { assert(object != NULL); AutoPtr<IModuleInfo> moduleInfo; ECode ec = _CReflector_AcquireModuleInfo( moduleName.string(), (IModuleInfo**)&moduleInfo); if (FAILED(ec)) { ALOGD("Acquire \"%s\" module info failed!\n", moduleName.string()); return ec; } AutoPtr<IClassInfo> classInfo; ec = moduleInfo->GetClassInfo( className.string(), (IClassInfo**)&classInfo); if (FAILED(ec)) { ALOGD("Acquire \"%s\" class info failed!\n", className.string()); return ec; } AutoPtr<IInterface> testObject; ec = classInfo->CreateObject((IInterface**)&testObject); if (FAILED(ec)) { ALOGD("Create object failed!\n"); return ec; } *object = testObject; REFCOUNT_ADD(*object); return NOERROR; }
ELAPI _CObject_ReflectInterfaceInfo( /* [in] */ PInterface object, /* [out] */ IInterfaceInfo** interfaceInfo) { if (!object || !interfaceInfo) { return E_INVALID_ARGUMENT; } EIID iid; ECode ec = object->GetInterfaceID(object, &iid); if (FAILED(ec)) return E_INVALID_ARGUMENT; IObject* iObject = (IObject*)object->Probe(EIID_IObject); if (iObject == NULL) return E_NO_INTERFACE; ClassID clsid; ec = iObject->GetClassID(&clsid); if (FAILED(ec)) return E_INVALID_ARGUMENT; AutoPtr<IModuleInfo> obj; ec = _CReflector_AcquireModuleInfo(String(clsid.mUunm), (IModuleInfo**)&obj); if (FAILED(ec)) { return ec; } CModuleInfo* moduleInfo = (CModuleInfo*)obj.Get(); ClassDirEntry* classDir = NULL; ClassDescriptor* clsDesc = NULL; ClassInterface* cifDir = NULL; InterfaceDirEntry* ifDir = NULL; InterfaceDescriptor* ifDesc = NULL; UInt16 index = 0; Int32 base = moduleInfo->mClsModule->mBase; *interfaceInfo = NULL; for (Int32 i = 0; i < moduleInfo->mClsMod->mClassCount; i++) { classDir = getClassDirAddr(base, moduleInfo->mClsMod->mClassDirs, i); clsDesc = adjustClassDescAddr(base, classDir->mDesc); //find the class if (clsDesc->mClsid == clsid.mClsid) { for (Int32 j = 0; j < clsDesc->mInterfaceCount; j++) { cifDir = getCIFAddr(base, clsDesc->mInterfaces, j); index = cifDir->mIndex; ifDir = getInterfaceDirAddr(base, moduleInfo->mClsMod->mInterfaceDirs, index); ifDesc = adjustInterfaceDescAddr(base, ifDir->mDesc); //find the interface if (ifDesc->mIID == iid) { ec = g_objInfoList.AcquireInterfaceInfo( moduleInfo->mClsModule, index, (IInterface **)interfaceInfo); return ec; } } } } return E_DOES_NOT_EXIST; }
ECode CClsModule::GetModuleInfo( /* [out] */ IModuleInfo** moduleInfo) { if (!moduleInfo) { return E_INVALID_ARGUMENT; } return _CReflector_AcquireModuleInfo( String(adjustNameAddr(mBase, mClsMod->mUunm)), moduleInfo); }
ELAPI _CObject_ReflectModuleInfo( /* [in] */ PInterface object, /* [out] */ IModuleInfo** moduleInfo) { if (!object || !moduleInfo) { return E_INVALID_ARGUMENT; } IObject* iObject = (IObject*)object->Probe(EIID_IObject); if (iObject == NULL) return E_NO_INTERFACE; ClassID clsid; ECode ec = iObject->GetClassID(&clsid); if (FAILED(ec)) { return E_NO_INTERFACE; } return _CReflector_AcquireModuleInfo(String(clsid.mUunm), moduleInfo); }