[PATCH 4/8] adsldp: Implement IDirectorySearch::GetNextColumnName().

Dmitry Timoshkov dmitry at baikal.ru
Thu Mar 26 02:09:39 CDT 2020


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/adsldp/adsldp.c | 31 ++++++++++++++++++++++++++++---
 include/adshlp.h     |  2 ++
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/dlls/adsldp/adsldp.c b/dlls/adsldp/adsldp.c
index 350523222a..b59b31b21a 100644
--- a/dlls/adsldp/adsldp.c
+++ b/dlls/adsldp/adsldp.c
@@ -399,6 +399,7 @@ typedef struct
 struct ldap_search_context
 {
     LDAPMessage *res, *entry;
+    BerElement *ber;
     ULONG count, pos;
 };
 
@@ -1249,6 +1250,7 @@ static HRESULT WINAPI search_GetNextRow(IDirectorySearch *iface, ADS_SEARCH_HAND
         return S_ADS_NOMORE_ROWS;
 
     ldap_ctx->pos++;
+    ldap_ctx->ber = NULL;
 
     return S_OK;
 }
@@ -1259,10 +1261,33 @@ static HRESULT WINAPI search_GetPreviousRow(IDirectorySearch *iface, ADS_SEARCH_
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI search_GetNextColumnName(IDirectorySearch *iface, ADS_SEARCH_HANDLE res, LPWSTR *names)
+static HRESULT WINAPI search_GetNextColumnName(IDirectorySearch *iface, ADS_SEARCH_HANDLE res, LPWSTR *name)
 {
-    FIXME("%p,%p,%p: stub\n", iface, res, names);
-    return E_NOTIMPL;
+    LDAP_namespace *ldap = impl_from_IDirectorySearch(iface);
+    struct ldap_search_context *ldap_ctx = res;
+    WCHAR *attr;
+
+    TRACE("%p,%p,%p\n", iface, res, name);
+
+    if (!ldap->ld) return E_NOTIMPL;
+
+    if (!name || !ldap_ctx || !ldap_ctx->entry) return E_ADS_BAD_PARAMETER;
+
+    if (!ldap_ctx->ber)
+        attr = ldap_first_attributeW(ldap->ld, ldap_ctx->entry, &ldap_ctx->ber);
+    else
+        attr = ldap_next_attributeW(ldap->ld, ldap_ctx->entry, ldap_ctx->ber);
+
+    if (attr)
+    {
+        TRACE("=> %s\n", debugstr_w(attr));
+        *name = AllocADsStr(attr);
+        ldap_memfreeW(attr);
+        return *name ? S_OK : E_OUTOFMEMORY;
+    }
+
+    *name = NULL;
+    return S_ADS_NOMORE_COLUMNS;
 }
 
 static HRESULT WINAPI search_GetColumn(IDirectorySearch *iface, ADS_SEARCH_HANDLE res,
diff --git a/include/adshlp.h b/include/adshlp.h
index 0b08c1a99c..dac57857ed 100644
--- a/include/adshlp.h
+++ b/include/adshlp.h
@@ -28,7 +28,9 @@ HRESULT WINAPI ADsBuildVarArrayStr(LPWSTR*,DWORD,VARIANT*);
 HRESULT WINAPI ADsEnumerateNext(IEnumVARIANT*,ULONG,VARIANT*,ULONG*);
 HRESULT WINAPI ADsGetObject(LPCWSTR,REFIID,VOID**);
 HRESULT WINAPI ADsOpenObject(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,REFIID,VOID**);
+LPWSTR  WINAPI AllocADsStr(LPWSTR);
 BOOL    WINAPI FreeADsMem(LPVOID);
+BOOL    WINAPI FreeADsStr(LPWSTR);
 
 #ifdef __cplusplus
 }
-- 
2.25.1




More information about the wine-devel mailing list