Signed-off-by: Dmitry Timoshkov dmitry@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) {