Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
ECode CClsModule::GetModuleInfo(
    /* [out] */ IModuleInfo** moduleInfo)
{
    if (!moduleInfo) {
        return E_INVALID_ARGUMENT;
    }

    return _CReflector_AcquireModuleInfo(
            String(adjustNameAddr(mBase, mClsMod->mUunm)), moduleInfo);
}
Ejemplo n.º 4
0
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);
}