Jacek Caban : atl100: Added AtlGetObjectSourceInterface implementation.

Alexandre Julliard julliard at winehq.org
Tue Jan 15 13:46:18 CST 2013


Module: wine
Branch: master
Commit: 852a42e2759f6a3ae417ddfab8c755730990d577
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=852a42e2759f6a3ae417ddfab8c755730990d577

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jan 15 12:45:47 2013 +0100

atl100: Added AtlGetObjectSourceInterface implementation.

---

 dlls/atl/atl.spec       |    2 +-
 dlls/atl100/atl.c       |  111 +++++++++++++++++++++++++++++++++++++++++++++++
 dlls/atl100/atl100.spec |    2 +-
 dlls/atl80/atl80.spec   |    2 +-
 include/atlbase.h       |    1 +
 5 files changed, 115 insertions(+), 3 deletions(-)

diff --git a/dlls/atl/atl.spec b/dlls/atl/atl.spec
index cb071f5..7b36397 100644
--- a/dlls/atl/atl.spec
+++ b/dlls/atl/atl.spec
@@ -45,7 +45,7 @@
 51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) atl100.AtlIPersistStreamInit_Save
 52 stub AtlIPersistPropertyBag_Load
 53 stub AtlIPersistPropertyBag_Save
-54 stub AtlGetObjectSourceInterface
+54 stdcall AtlGetObjectSourceInterface(ptr ptr ptr ptr ptr) atl100.AtlGetObjectSourceInterface
 55 stub AtlModuleUnRegisterTypeLib
 56 stdcall AtlModuleLoadTypeLib(ptr wstr ptr ptr)
 57 stdcall AtlModuleUnregisterServerEx(ptr long ptr)
diff --git a/dlls/atl100/atl.c b/dlls/atl100/atl.c
index 28b8cbc..28321c2 100644
--- a/dlls/atl100/atl.c
+++ b/dlls/atl100/atl.c
@@ -595,6 +595,117 @@ BOOL WINAPI AtlWaitWithMessageLoop(HANDLE handle)
     }
 }
 
+static HRESULT get_default_source(ITypeLib *typelib, const CLSID *clsid, IID *iid)
+{
+    ITypeInfo *typeinfo, *src_typeinfo = NULL;
+    TYPEATTR *attr;
+    int type_flags;
+    unsigned i;
+    HRESULT hres;
+
+    hres = ITypeLib_GetTypeInfoOfGuid(typelib, clsid, &typeinfo);
+    if(FAILED(hres))
+        return hres;
+
+    hres = ITypeInfo_GetTypeAttr(typeinfo, &attr);
+    if(FAILED(hres)) {
+        ITypeInfo_Release(typeinfo);
+        return hres;
+    }
+
+    for(i=0; i < attr->cImplTypes; i++) {
+        hres = ITypeInfo_GetImplTypeFlags(typeinfo, i, &type_flags);
+        if(SUCCEEDED(hres) && type_flags == (IMPLTYPEFLAG_FSOURCE|IMPLTYPEFLAG_FDEFAULT)) {
+            HREFTYPE ref;
+
+            hres = ITypeInfo_GetRefTypeOfImplType(typeinfo, i, &ref);
+            if(SUCCEEDED(hres))
+                hres = ITypeInfo_GetRefTypeInfo(typeinfo, ref, &src_typeinfo);
+            break;
+        }
+    }
+
+    ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
+    ITypeInfo_Release(typeinfo);
+    if(FAILED(hres))
+        return hres;
+
+    if(!src_typeinfo) {
+        *iid = IID_NULL;
+        return S_OK;
+    }
+
+    hres = ITypeInfo_GetTypeAttr(src_typeinfo, &attr);
+    if(SUCCEEDED(hres)) {
+        *iid = attr->guid;
+        ITypeInfo_ReleaseTypeAttr(src_typeinfo, attr);
+    }
+    ITypeInfo_Release(src_typeinfo);
+    return hres;
+}
+
+/***********************************************************************
+ *           AtlGetObjectSourceInterface    [atl100.54]
+ */
+HRESULT WINAPI AtlGetObjectSourceInterface(IUnknown *unk, GUID *libid, IID *iid, unsigned short *major, unsigned short *minor)
+{
+    IProvideClassInfo2 *classinfo;
+    ITypeInfo *typeinfo;
+    ITypeLib *typelib;
+    IPersist *persist;
+    IDispatch *disp;
+    HRESULT hres;
+
+    TRACE("(%p %p %p %p %p)\n", unk, libid, iid, major, minor);
+
+    hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp);
+    if(FAILED(hres))
+        return hres;
+
+    hres = IDispatch_GetTypeInfo(disp, 0, 0, &typeinfo);
+    IDispatch_Release(disp);
+    if(FAILED(hres))
+        return hres;
+
+    hres = ITypeInfo_GetContainingTypeLib(typeinfo, &typelib, 0);
+    ITypeInfo_Release(typeinfo);
+    if(SUCCEEDED(hres)) {
+        TLIBATTR *attr;
+
+        hres = ITypeLib_GetLibAttr(typelib, &attr);
+        if(SUCCEEDED(hres)) {
+            *libid = attr->guid;
+            *major = attr->wMajorVerNum;
+            *minor = attr->wMinorVerNum;
+            ITypeLib_ReleaseTLibAttr(typelib, attr);
+        }else {
+            ITypeLib_Release(typelib);
+        }
+    }
+    if(FAILED(hres))
+        return hres;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&classinfo);
+    if(SUCCEEDED(hres)) {
+        hres = IProvideClassInfo2_GetGUID(classinfo, GUIDKIND_DEFAULT_SOURCE_DISP_IID, iid);
+        IProvideClassInfo2_Release(classinfo);
+        ITypeLib_Release(typelib);
+        return hres;
+    }
+
+    hres = IUnknown_QueryInterface(unk, &IID_IPersist, (void**)&persist);
+    if(SUCCEEDED(hres)) {
+        CLSID clsid;
+
+        hres = IPersist_GetClassID(persist, &clsid);
+        if(SUCCEEDED(hres))
+            hres = get_default_source(typelib, &clsid, iid);
+        IPersist_Release(persist);
+    }
+
+    return hres;
+}
+
 /***********************************************************************
  *           AtlGetVersion              [atl100.@]
  */
diff --git a/dlls/atl100/atl100.spec b/dlls/atl100/atl100.spec
index 1eae2ed..2de1102 100644
--- a/dlls/atl100/atl100.spec
+++ b/dlls/atl100/atl100.spec
@@ -37,7 +37,7 @@
 51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr)
 52 stub AtlIPersistPropertyBag_Load
 53 stub AtlIPersistPropertyBag_Save
-54 stub AtlGetObjectSourceInterface
+54 stdcall AtlGetObjectSourceInterface(ptr ptr ptr ptr ptr)
 56 stdcall AtlLoadTypeLib(long wstr ptr ptr)
 58 stdcall AtlModuleAddTermFunc(ptr ptr long)
 59 stub AtlAxCreateControlLic
diff --git a/dlls/atl80/atl80.spec b/dlls/atl80/atl80.spec
index bf36bbc..620c719 100644
--- a/dlls/atl80/atl80.spec
+++ b/dlls/atl80/atl80.spec
@@ -39,7 +39,7 @@
 51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) atl100.AtlIPersistStreamInit_Save
 52 stub AtlIPersistPropertyBag_Load
 53 stub AtlIPersistPropertyBag_Save
-54 stub AtlGetObjectSourceInterface
+54 stdcall AtlGetObjectSourceInterface(ptr ptr ptr ptr ptr) atl100.AtlGetObjectSourceInterface
 55 stub AtlUnRegisterTypeLib
 56 stdcall AtlLoadTypeLib(long wstr ptr ptr) atl100.AtlLoadTypeLib
 58 stdcall AtlModuleAddTermFunc(ptr ptr long) atl100.AtlModuleAddTermFunc
diff --git a/include/atlbase.h b/include/atlbase.h
index 84a22b4..8bacb97 100644
--- a/include/atlbase.h
+++ b/include/atlbase.h
@@ -257,5 +257,6 @@ HRESULT WINAPI AtlRegisterClassCategoriesHelper(REFCLSID,const struct _ATL_CATMA
 HRESULT WINAPI AtlComModuleGetClassObject(_ATL_COM_MODULE*,REFCLSID,REFIID,void**);
 HRESULT WINAPI AtlComModuleUnregisterServer(_ATL_COM_MODULE*,BOOL,const CLSID*);
 BOOL WINAPI AtlWaitWithMessageLoop(HANDLE);
+HRESULT WINAPI AtlGetObjectSourceInterface(IUnknown*,GUID*,IID*,unsigned short*,unsigned short*);
 
 #endif /* __WINE_ATLBASE_H__ */




More information about the wine-cvs mailing list