[PATCH 5/8] ole32: Use single call to read/write serialization header of class moniker.

Nikolay Sivov nsivov at codeweavers.com
Tue Sep 14 03:47:54 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/ole32/classmoniker.c  | 73 ++++++++++++++++++--------------------
 dlls/ole32/tests/moniker.c | 33 +++++++++++++++--
 2 files changed, 64 insertions(+), 42 deletions(-)

diff --git a/dlls/ole32/classmoniker.c b/dlls/ole32/classmoniker.c
index 1aa008270a1..4872014a508 100644
--- a/dlls/ole32/classmoniker.c
+++ b/dlls/ole32/classmoniker.c
@@ -43,7 +43,13 @@ typedef struct ClassMoniker
     IMoniker IMoniker_iface;
     IROTData IROTData_iface;
     LONG ref;
-    CLSID clsid; /* clsid identified by this moniker */
+
+    struct
+    {
+        CLSID clsid;
+        DWORD data_len;
+    } header;
+
     IUnknown *pMarshal; /* custom marshaler */
 } ClassMoniker;
 
@@ -171,41 +177,33 @@ static HRESULT WINAPI ClassMoniker_IsDirty(IMoniker* iface)
     return S_FALSE;
 }
 
-/******************************************************************************
- *        ClassMoniker_Load
- ******************************************************************************/
-static HRESULT WINAPI ClassMoniker_Load(IMoniker* iface,IStream* pStm)
+static HRESULT WINAPI ClassMoniker_Load(IMoniker *iface, IStream *stream)
 {
-    ClassMoniker *This = impl_from_IMoniker(iface);
+    ClassMoniker *moniker = impl_from_IMoniker(iface);
+    ULONG length;
     HRESULT hr;
-    DWORD zero;
 
-    TRACE("(%p)\n", pStm);
+    TRACE("%p, %p\n", iface, stream);
 
-    hr = IStream_Read(pStm, &This->clsid, sizeof(This->clsid), NULL);
-    if (hr != S_OK) return STG_E_READFAULT;
+    hr = IStream_Read(stream, &moniker->header, sizeof(moniker->header), &length);
+    if (hr != S_OK || length != sizeof(moniker->header)) return STG_E_READFAULT;
 
-    hr = IStream_Read(pStm, &zero, sizeof(zero), NULL);
-    if ((hr != S_OK) || (zero != 0)) return STG_E_READFAULT;
+    if (moniker->header.data_len)
+    {
+        FIXME("Moniker data of length %u was ignored.\n", moniker->header.data_len);
+        moniker->header.data_len = 0;
+    }
 
     return S_OK;
 }
 
-/******************************************************************************
- *        ClassMoniker_Save
- ******************************************************************************/
-static HRESULT WINAPI ClassMoniker_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty)
+static HRESULT WINAPI ClassMoniker_Save(IMoniker *iface, IStream *stream, BOOL clear_dirty)
 {
-    ClassMoniker *This = impl_from_IMoniker(iface);
-    HRESULT hr;
-    DWORD zero = 0;
-
-    TRACE("(%p, %s)\n", pStm, fClearDirty ? "TRUE" : "FALSE");
+    ClassMoniker *moniker = impl_from_IMoniker(iface);
 
-    hr = IStream_Write(pStm, &This->clsid, sizeof(This->clsid), NULL);
-    if (FAILED(hr)) return hr;
+    TRACE("%p, %p, %d\n", iface, stream, clear_dirty);
 
-    return IStream_Write(pStm, &zero, sizeof(zero), NULL);
+    return IStream_Write(stream, &moniker->header, sizeof(moniker->header), NULL);
 }
 
 /******************************************************************************
@@ -230,7 +228,7 @@ static HRESULT WINAPI ClassMoniker_BindToObject(IMoniker* iface,
                                             REFIID riid,
                                             VOID** ppvResult)
 {
-    ClassMoniker *This = impl_from_IMoniker(iface);
+    ClassMoniker *moniker = impl_from_IMoniker(iface);
     BIND_OPTS2 bindopts;
     IClassActivator *pActivator;
     HRESULT hr;
@@ -241,7 +239,7 @@ static HRESULT WINAPI ClassMoniker_BindToObject(IMoniker* iface,
     IBindCtx_GetBindOptions(pbc, (BIND_OPTS *)&bindopts);
 
     if (!pmkToLeft)
-        return CoGetClassObject(&This->clsid, bindopts.dwClassContext, NULL,
+        return CoGetClassObject(&moniker->header.clsid, bindopts.dwClassContext, NULL,
                                 riid, ppvResult);
     else
     {
@@ -249,7 +247,7 @@ static HRESULT WINAPI ClassMoniker_BindToObject(IMoniker* iface,
                                    (void **)&pActivator);
         if (FAILED(hr)) return hr;
 
-        hr = IClassActivator_GetClassObject(pActivator, &This->clsid,
+        hr = IClassActivator_GetClassObject(pActivator, &moniker->header.clsid,
                                             bindopts.dwClassContext,
                                             bindopts.locale, riid, ppvResult);
 
@@ -395,19 +393,16 @@ static HRESULT WINAPI ClassMoniker_IsEqual(IMoniker *iface, IMoniker *other)
     if (!other_moniker)
         return S_FALSE;
 
-    return IsEqualGUID(&moniker->clsid, &other_moniker->clsid) ? S_OK : S_FALSE;
+    return IsEqualGUID(&moniker->header.clsid, &other_moniker->header.clsid) ? S_OK : S_FALSE;
 }
 
-/******************************************************************************
- *        ClassMoniker_Hash
- ******************************************************************************/
-static HRESULT WINAPI ClassMoniker_Hash(IMoniker* iface,DWORD* pdwHash)
+static HRESULT WINAPI ClassMoniker_Hash(IMoniker *iface, DWORD *hash)
 {
-    ClassMoniker *This = impl_from_IMoniker(iface);
+    ClassMoniker *moniker = impl_from_IMoniker(iface);
 
-    TRACE("(%p)\n", pdwHash);
+    TRACE("%p, %p\n", iface, hash);
 
-    *pdwHash = This->clsid.Data1;
+    *hash = moniker->header.clsid.Data1;
 
     return S_OK;
 }
@@ -464,7 +459,7 @@ static HRESULT WINAPI ClassMoniker_CommonPrefixWith(IMoniker *iface, IMoniker *o
 
     if (other_moniker)
     {
-        if (!IsEqualGUID(&moniker->clsid, &other_moniker->clsid)) return MK_E_NOPREFIX;
+        if (!IsEqualGUID(&moniker->header.clsid, &other_moniker->header.clsid)) return MK_E_NOPREFIX;
 
         *prefix = iface;
         IMoniker_AddRef(iface);
@@ -495,7 +490,7 @@ static HRESULT WINAPI ClassMoniker_GetDisplayName(IMoniker *iface,
 {
     ClassMoniker *moniker = impl_from_IMoniker(iface);
     static const int name_len = CHARS_IN_GUID + 5 /* prefix */;
-    const GUID *guid = &moniker->clsid;
+    const GUID *guid = &moniker->header.clsid;
 
     TRACE("%p, %p, %p, %p.\n", iface, pbc, pmkToLeft, name);
 
@@ -602,7 +597,7 @@ static HRESULT WINAPI ClassMonikerROTData_GetComparisonData(IROTData* iface,
     /* write CLSID of the moniker */
     memcpy(pbData, &CLSID_ClassMoniker, sizeof(CLSID));
     /* write CLSID the moniker represents */
-    memcpy(pbData+sizeof(CLSID), &This->clsid, sizeof(CLSID));
+    memcpy(pbData+sizeof(CLSID), &This->header.clsid, sizeof(CLSID));
 
     return S_OK;
 }
@@ -659,7 +654,7 @@ HRESULT WINAPI CreateClassMoniker(REFCLSID rclsid, IMoniker **moniker)
     object->IMoniker_iface.lpVtbl = &ClassMonikerVtbl;
     object->IROTData_iface.lpVtbl = &ROTDataVtbl;
     object->ref = 1;
-    object->clsid = *rclsid;
+    object->header.clsid = *rclsid;
 
     *moniker = &object->IMoniker_iface;
 
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index d8d52295ff2..86b47e28b89 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -1774,6 +1774,36 @@ static void test_class_moniker(void)
     IBindCtx *bindctx;
     IUnknown *unknown;
     FILETIME filetime;
+    ULONG eaten;
+
+    hr = CreateBindCtx(0, &bindctx);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    /* Extended syntax, handled by class moniker directly, only CLSID is meaningful for equality. */
+    hr = MkParseDisplayName(bindctx, L"clsid:11111111-0000-0000-2222-444444444444;extra data:", &eaten, &moniker);
+todo_wine
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+    {
+        ok(eaten == 54, "Unexpected length %u.\n", eaten);
+
+        hr = MkParseDisplayName(bindctx, L"clsid:11111111-0000-0000-2222-444444444444;different extra data:", &eaten, &moniker2);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+        TEST_DISPLAY_NAME(moniker, L"clsid:11111111-0000-0000-2222-444444444444;extra data:");
+        TEST_MONIKER_TYPE(moniker, MKSYS_CLASSMONIKER);
+
+        TEST_MONIKER_TYPE(moniker2, MKSYS_CLASSMONIKER);
+
+        hr = IMoniker_IsEqual(moniker, moniker2);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+        hr = IMoniker_IsEqual(moniker2, moniker);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+        IMoniker_Release(moniker2);
+        IMoniker_Release(moniker);
+    }
 
     hr = CreateClassMoniker(&CLSID_StdComponentCategoriesMgr, &moniker);
     ok_ole_success(hr, CreateClassMoniker);
@@ -1801,9 +1831,6 @@ static void test_class_moniker(void)
     /* IsSystemMoniker test */
     TEST_MONIKER_TYPE(moniker, MKSYS_CLASSMONIKER);
 
-    hr = CreateBindCtx(0, &bindctx);
-    ok_ole_success(hr, CreateBindCtx);
-
     /* IsRunning test */
     hr = IMoniker_IsRunning(moniker, NULL, NULL, NULL);
     ok(hr == E_NOTIMPL, "IMoniker_IsRunning should return E_NOTIMPL, not 0x%08x\n", hr);
-- 
2.33.0




More information about the wine-devel mailing list