[PATCH 7/8] adsldp: Implement IADs::Get().

Dmitry Timoshkov dmitry at baikal.ru
Fri Mar 20 02:21:36 CDT 2020


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/adsldp/adsldp.c | 39 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

diff --git a/dlls/adsldp/adsldp.c b/dlls/adsldp/adsldp.c
index 59ccdb740c..b12d03262c 100644
--- a/dlls/adsldp/adsldp.c
+++ b/dlls/adsldp/adsldp.c
@@ -551,8 +551,43 @@ static HRESULT WINAPI ldapns_SetInfo(IADs *iface)
 
 static HRESULT WINAPI ldapns_Get(IADs *iface, BSTR name, VARIANT *prop)
 {
-    FIXME("%p,%s,%p: stub\n", iface, debugstr_w(name), prop);
-    return E_NOTIMPL;
+    LDAP_namespace *ldap = impl_from_IADs(iface);
+    HRESULT hr;
+    ULONG i;
+
+    TRACE("%p,%s,%p\n", iface, debugstr_w(name), prop);
+
+    if (!name || !prop) return E_ADS_BAD_PARAMETER;
+
+    if (!ldap->attrs_count)
+    {
+        hr = IADs_GetInfo(iface);
+        if (hr != S_OK) return hr;
+    }
+
+    for (i = 0; i < ldap->attrs_count; i++)
+    {
+        if (!wcsicmp(name, ldap->attrs[i].name))
+        {
+            ULONG count = ldap_count_valuesW(ldap->attrs[i].values);
+            if (!count)
+            {
+                V_BSTR(prop) = NULL;
+                V_VT(prop) = VT_BSTR;
+                return S_OK;
+            }
+
+            if (count > 1)
+                FIXME("attr %s has %u values\n", debugstr_w(ldap->attrs[i].name), count);
+
+            V_BSTR(prop) = SysAllocString(ldap->attrs[i].values[0]);
+            if (!V_BSTR(prop)) return E_OUTOFMEMORY;
+            V_VT(prop) = VT_BSTR;
+            return S_OK;
+        }
+    }
+
+    return E_ADS_PROPERTY_NOT_FOUND;
 }
 
 static HRESULT WINAPI ldapns_Put(IADs *iface, BSTR name, VARIANT prop)
-- 
2.25.1




More information about the wine-devel mailing list