Dmitry Timoshkov : adsldp: Implement IDirectorySearch::GetNextColumnName().
Alexandre Julliard
julliard at winehq.org
Thu Mar 26 16:27:25 CDT 2020
Module: wine
Branch: master
Commit: 3adc9c5b215aac869cff7e36aeeddc9bc2ace670
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3adc9c5b215aac869cff7e36aeeddc9bc2ace670
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Thu Mar 26 15:09:39 2020 +0800
adsldp: Implement IDirectorySearch::GetNextColumnName().
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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
}
More information about the wine-cvs
mailing list