[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