Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/adsldp/adsldp.c | 123 +++++++++++++++++++++++++++++++++++++++++++ include/iads.idl | 4 +- 2 files changed, 124 insertions(+), 3 deletions(-)
diff --git a/dlls/adsldp/adsldp.c b/dlls/adsldp/adsldp.c index c49f9ef70b..caf404c3c6 100644 --- a/dlls/adsldp/adsldp.c +++ b/dlls/adsldp/adsldp.c @@ -381,6 +381,7 @@ typedef struct { IADs IADs_iface; IADsOpenDSObject IADsOpenDSObject_iface; + IDirectorySearch IDirectorySearch_iface; LONG ref; LDAP *ld; BSTR host; @@ -419,6 +420,13 @@ static HRESULT WINAPI ldapns_QueryInterface(IADs *iface, REFIID riid, void **obj return S_OK; }
+ if (IsEqualGUID(riid, &IID_IDirectorySearch)) + { + IADs_AddRef(iface); + *obj = &ldap->IDirectorySearch_iface; + return S_OK; + } + FIXME("interface %s is not implemented\n", debugstr_guid(riid)); return E_NOINTERFACE; } @@ -1046,6 +1054,120 @@ static const IADsOpenDSObjectVtbl IADsOpenDSObject_vtbl = openobj_OpenDSObject };
+static inline LDAP_namespace *impl_from_IDirectorySearch(IDirectorySearch *iface) +{ + return CONTAINING_RECORD(iface, LDAP_namespace, IDirectorySearch_iface); +} + +static HRESULT WINAPI search_QueryInterface(IDirectorySearch *iface, REFIID riid, void **obj) +{ + TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj); + + if (!riid || !obj) return E_INVALIDARG; + + if (IsEqualGUID(riid, &IID_IDirectorySearch) || + IsEqualGUID(riid, &IID_IUnknown)) + { + IDirectorySearch_AddRef(iface); + *obj = iface; + return S_OK; + } + + FIXME("interface %s is not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI search_AddRef(IDirectorySearch *iface) +{ + LDAP_namespace *ldap = impl_from_IDirectorySearch(iface); + return IADs_AddRef(&ldap->IADs_iface); +} + +static ULONG WINAPI search_Release(IDirectorySearch *iface) +{ + LDAP_namespace *ldap = impl_from_IDirectorySearch(iface); + return IADs_Release(&ldap->IADs_iface); +} + +static HRESULT WINAPI search_SetSearchPreference(IDirectorySearch *iface, PADS_SEARCHPREF_INFO prefs, DWORD count) +{ + FIXME("%p,%p,%u: stub\n", iface, prefs, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_ExecuteSearch(IDirectorySearch *iface, LPWSTR filter, LPWSTR *names, + DWORD count, PADS_SEARCH_HANDLE res) +{ + FIXME("%p,%s,%p,%u,%p: stub\n", iface, debugstr_w(filter), names, count, res); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_AbandonSearch(IDirectorySearch *iface, ADS_SEARCH_HANDLE res) +{ + FIXME("%p,%p: stub\n", iface, res); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_GetFirstRow(IDirectorySearch *iface, ADS_SEARCH_HANDLE res) +{ + FIXME("%p,%p: stub\n", iface, res); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_GetNextRow(IDirectorySearch *iface, ADS_SEARCH_HANDLE res) +{ + FIXME("%p,%p: stub\n", iface, res); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_GetPreviousRow(IDirectorySearch *iface, ADS_SEARCH_HANDLE res) +{ + FIXME("%p,%p: stub\n", iface, res); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_GetNextColumnName(IDirectorySearch *iface, ADS_SEARCH_HANDLE res, LPWSTR *names) +{ + FIXME("%p,%p,%p: stub\n", iface, res, names); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_GetColumn(IDirectorySearch *iface, ADS_SEARCH_HANDLE res, + LPWSTR name, PADS_SEARCH_COLUMN col) +{ + FIXME("%p,%p,%s,%p: stub\n", iface, res, debugstr_w(name), col); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_FreeColumn(IDirectorySearch *iface, PADS_SEARCH_COLUMN col) +{ + FIXME("%p,%p: stub\n", iface, col); + return E_NOTIMPL; +} + +static HRESULT WINAPI search_CloseSearchHandle(IDirectorySearch *iface, ADS_SEARCH_HANDLE res) +{ + FIXME("%p,%p: stub\n", iface, res); + return E_NOTIMPL; +} + +static const IDirectorySearchVtbl IDirectorySearch_vtbl = +{ + search_QueryInterface, + search_AddRef, + search_Release, + search_SetSearchPreference, + search_ExecuteSearch, + search_AbandonSearch, + search_GetFirstRow, + search_GetNextRow, + search_GetPreviousRow, + search_GetNextColumnName, + search_GetColumn, + search_FreeColumn, + search_CloseSearchHandle +}; + static HRESULT LDAPNamespace_create(REFIID riid, void **obj) { LDAP_namespace *ldap; @@ -1056,6 +1178,7 @@ static HRESULT LDAPNamespace_create(REFIID riid, void **obj)
ldap->IADs_iface.lpVtbl = &IADs_vtbl; ldap->IADsOpenDSObject_iface.lpVtbl = &IADsOpenDSObject_vtbl; + ldap->IDirectorySearch_iface.lpVtbl = &IDirectorySearch_vtbl; ldap->ref = 1; ldap->ld = NULL; ldap->host = NULL; diff --git a/include/iads.idl b/include/iads.idl index 8553a03d8c..fdee17859d 100644 --- a/include/iads.idl +++ b/include/iads.idl @@ -99,8 +99,6 @@ typedef enum ADS_SEARCHPREF_EXTENDED_DN } ADS_SEARCHPREF_ENUM;
-typedef ADS_SEARCHPREF_ENUM *PADS_SEARCHPREF_INFO; - typedef enum { ADS_STATUS_S_OK, @@ -328,7 +326,7 @@ typedef struct ads_searchpref_info ADS_SEARCHPREF dwSearchPref; ADSVALUE vValue; ADS_STATUS dwStatus; -} ADS_SEARCHPREF_INFO; +} ADS_SEARCHPREF_INFO, *PADS_SEARCHPREF_INFO;
typedef struct ads_search_column {