[PATCH 4/4] adsldp: Implement IParseDisplayName::ParseDisplayName.

Dmitry Timoshkov dmitry at baikal.ru
Tue Mar 10 02:42:55 CDT 2020


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/adsldp/adsldp.c     | 24 ++++++++++++++++++++++--
 dlls/adsldp/tests/ldap.c |  3 +--
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/dlls/adsldp/adsldp.c b/dlls/adsldp/adsldp.c
index 536932c966..acebf717aa 100644
--- a/dlls/adsldp/adsldp.c
+++ b/dlls/adsldp/adsldp.c
@@ -101,8 +101,28 @@ static ULONG WINAPI ldap_Release(IParseDisplayName *iface)
 static HRESULT WINAPI ldap_ParseDisplayName(IParseDisplayName *iface, IBindCtx *bc,
                                             LPOLESTR name, ULONG *eaten, IMoniker **mk)
 {
-    FIXME("%p,%p,%s,%p,%p: stub\n", iface, bc, debugstr_w(name), eaten, mk);
-    return E_NOTIMPL;
+    HRESULT hr;
+    IADsOpenDSObject *ads_open;
+    IDispatch *disp;
+
+    TRACE("%p,%p,%s,%p,%p\n", iface, bc, debugstr_w(name), eaten, mk);
+
+    hr = LDAPNamespace_create(&IID_IADsOpenDSObject, (void **)&ads_open);
+    if (hr != S_OK) return hr;
+
+    hr = IADsOpenDSObject_OpenDSObject(ads_open, name, NULL, NULL, ADS_SECURE_AUTHENTICATION, &disp);
+    if (hr == S_OK)
+    {
+        hr = CreatePointerMoniker((IUnknown *)disp, mk);
+        if (hr == S_OK)
+            *eaten = wcslen(name);
+
+        IDispatch_Release(disp);
+    }
+
+    IADsOpenDSObject_Release(ads_open);
+
+    return hr;
 }
 
 static const IParseDisplayNameVtbl LDAP_PARSE_vtbl =
diff --git a/dlls/adsldp/tests/ldap.c b/dlls/adsldp/tests/ldap.c
index c5d97b55df..0ecba26817 100644
--- a/dlls/adsldp/tests/ldap.c
+++ b/dlls/adsldp/tests/ldap.c
@@ -122,7 +122,6 @@ static void test_ParseDisplayName(void)
 
         count = 0xdeadbeef;
         hr = IParseDisplayName_ParseDisplayName(parse, bc, path, &count, &mk);
-todo_wine
         ok(hr == test[i].hr || hr == test[i].hr_ads_open, "%d: got %#x, expected %#x\n", i, hr, test[i].hr);
         if (hr == S_OK)
         {
@@ -139,7 +138,7 @@ todo_wine
 
         count = 0xdeadbeef;
         hr = MkParseDisplayName(bc, test[i].path, &count, &mk);
-todo_wine
+todo_wine_if(i == 0 || i == 1 || i == 11 || i == 12)
         ok(hr == test[i].hr, "%d: got %#x, expected %#x\n", i, hr, test[i].hr);
         if (hr == S_OK)
         {
-- 
2.20.1




More information about the wine-devel mailing list