Huw Davies : ole32: Use OleCreateFromDataEx to implement OleCreateFromData.

Alexandre Julliard julliard at winehq.org
Tue May 19 09:23:10 CDT 2009


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue May 19 12:09:08 2009 +0100

ole32: Use OleCreateFromDataEx to implement OleCreateFromData.

---

 dlls/ole32/ole2impl.c |  110 +++---------------------------------------------
 1 files changed, 7 insertions(+), 103 deletions(-)

diff --git a/dlls/ole32/ole2impl.c b/dlls/ole32/ole2impl.c
index e226687..e4eccc1 100644
--- a/dlls/ole32/ole2impl.c
+++ b/dlls/ole32/ole2impl.c
@@ -184,112 +184,16 @@ HRESULT WINAPI OleCreateFromDataEx(IDataObject *data, REFIID iid, DWORD flags,
 
 /******************************************************************************
  *		OleCreateFromData        [OLE32.@]
- *
- * Author   : Abey George
- * Creates an embedded object from data transfer object retrieved from
- * the clipboard or OLE drag and drop.
- * Returns  : S_OK - Embedded object was created successfully.
- *            OLE_E_STATIC - OLE can create only a static object
- *            DV_E_FORMATETC - No acceptable format is available (only error return code)
- * TODO : CF_FILENAME, CF_EMBEDEDOBJECT formats. Parameter renderopt is currently ignored.
  */
-
-HRESULT WINAPI OleCreateFromData(LPDATAOBJECT pSrcDataObject, REFIID riid,
-                DWORD renderopt, LPFORMATETC pFormatEtc,
-                LPOLECLIENTSITE pClientSite, LPSTORAGE pStg,
-                LPVOID* ppvObj)
+HRESULT WINAPI OleCreateFromData(LPDATAOBJECT data, REFIID iid,
+                                 DWORD renderopt, LPFORMATETC fmt,
+                                 LPOLECLIENTSITE client_site, LPSTORAGE stg,
+                                 LPVOID* obj)
 {
-  IEnumFORMATETC *pfmt;
-  FORMATETC fmt;
-  CHAR szFmtName[MAX_CLIPFORMAT_NAME];
-  STGMEDIUM std;
-  HRESULT hr;
-  HRESULT hr1;
-
-  hr = IDataObject_EnumFormatEtc(pSrcDataObject, DATADIR_GET, &pfmt);
-
-  if (hr == S_OK)
-  {
-    memset(&std, 0, sizeof(STGMEDIUM));
-
-    hr = IEnumFORMATETC_Next(pfmt, 1, &fmt, NULL);
-    while (hr == S_OK)
-    {
-      GetClipboardFormatNameA(fmt.cfFormat, szFmtName, MAX_CLIPFORMAT_NAME-1);
-
-      /* first, Check for Embedded Object, Embed Source or Filename */
-      /* TODO: Currently checks only for Embed Source. */
-
-      if (!strcmp(szFmtName, CF_EMBEDSOURCE))
-      {
-        std.tymed = TYMED_HGLOBAL;
-
-        if ((hr1 = IDataObject_GetData(pSrcDataObject, &fmt, &std)) == S_OK)
-        {
-          ILockBytes *ptrILockBytes = 0;
-          IStorage *pStorage = 0;
-          IOleObject *pOleObject = 0;
-          IPersistStorage *pPersistStorage = 0;
-          CLSID clsID;
-
-          /* Create ILock bytes */
-
-          hr1 = CreateILockBytesOnHGlobal(std.u.hGlobal, FALSE, &ptrILockBytes);
-
-          /* Open storage on the ILock bytes */
-
-          if (hr1 == S_OK)
-            hr1 = StgOpenStorageOnILockBytes(ptrILockBytes, NULL, STGM_SHARE_EXCLUSIVE, NULL, 0, &pStorage);
-
-          /* Get Class ID from the opened storage */
-
-          if (hr1 == S_OK)
-            hr1 = ReadClassStg(pStorage, &clsID);
-
-          /* Create default handler for Persist storage */
-
-          if (hr1 == S_OK)
-            hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)&pPersistStorage);
-
-          /* Load the storage to Persist storage */
-
-          if (hr1 == S_OK)
-            hr1 = IPersistStorage_Load(pPersistStorage, pStorage);
-
-          /* Query for IOleObject */
-
-          if (hr1 == S_OK)
-            hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)&pOleObject);
-
-          /* Set client site with the IOleObject */
-
-          if (hr1 == S_OK)
-            hr1 = IOleObject_SetClientSite(pOleObject, pClientSite);
-
-          IPersistStorage_Release(pPersistStorage);
-          /* Query for the requested interface */
-
-          if (hr1 == S_OK)
-            hr1 = IPersistStorage_QueryInterface(pPersistStorage, riid, ppvObj);
-
-          IPersistStorage_Release(pPersistStorage);
-
-          IStorage_Release(pStorage);
-
-          if (hr1 == S_OK)
-            return S_OK;
-        }
-
-        /* Return error */
-
-        return DV_E_FORMATETC;
-      }
-
-      hr = IEnumFORMATETC_Next(pfmt, 1, &fmt, NULL);
-    }
-  }
+    DWORD advf = ADVF_PRIMEFIRST;
 
-  return DV_E_FORMATETC;
+    return OleCreateFromDataEx(data, iid, 0, renderopt, fmt ? 1 : 0, fmt ? &advf : NULL,
+                               fmt, NULL, NULL, client_site, stg, obj);
 }
 
 




More information about the wine-cvs mailing list