ole: ITypeInfo::Invoke rewrite.
[wine] / dlls / wldap32 / control.c
1 /*
2  * WLDAP32 - LDAP support for Wine
3  *
4  * Copyright 2005 Hans Leidekker
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "config.h"
22
23 #include "wine/port.h"
24 #include "wine/debug.h"
25
26 #include <stdarg.h>
27
28 #include "windef.h"
29 #include "winbase.h"
30 #include "winnls.h"
31
32 #ifdef HAVE_LDAP_H
33 #include <ldap.h>
34 #else
35 #define LDAP_SUCCESS        0x00
36 #define LDAP_NOT_SUPPORTED  0x5c
37 #endif
38
39 #include "winldap_private.h"
40 #include "wldap32.h"
41
42 WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
43
44 /***********************************************************************
45  *      ldap_control_freeA     (WLDAP32.@)
46  *
47  * See ldap_control_freeW.
48  */
49 ULONG ldap_control_freeA( LDAPControlA *control )
50 {
51     ULONG ret = LDAP_SUCCESS;
52 #ifdef HAVE_LDAP
53
54     TRACE( "(%p)\n", control );
55     controlfreeA( control );
56
57 #endif
58     return ret;
59 }
60
61 /***********************************************************************
62  *      ldap_control_freeW     (WLDAP32.@)
63  *
64  * Free an LDAPControl structure.
65  *
66  * PARAMS
67  *  control  [I] LDAPControl structure to free.
68  *
69  * RETURNS
70  *  LDAP_SUCCESS
71  */
72 ULONG ldap_control_freeW( LDAPControlW *control )
73 {
74     ULONG ret = LDAP_SUCCESS;
75 #ifdef HAVE_LDAP
76
77     TRACE( "(%p)\n", control );
78     controlfreeW( control );
79
80 #endif
81     return ret;
82 }
83
84 /***********************************************************************
85  *      ldap_controls_freeA     (WLDAP32.@)
86  *
87  * See ldap_controls_freeW.
88  */
89 ULONG ldap_controls_freeA( LDAPControlA **controls )
90 {
91     ULONG ret = LDAP_SUCCESS;
92 #ifdef HAVE_LDAP
93
94     TRACE( "(%p)\n", controls );
95     controlarrayfreeA( controls );
96
97 #endif
98     return ret;
99 }
100
101 /***********************************************************************
102  *      ldap_controls_freeW     (WLDAP32.@)
103  *
104  * Free an array of LDAPControl structures.
105  *
106  * PARAMS
107  *  controls  [I] Array of LDAPControl structures to free.
108  *
109  * RETURNS
110  *  LDAP_SUCCESS
111  */
112 ULONG ldap_controls_freeW( LDAPControlW **controls )
113 {
114     ULONG ret = LDAP_SUCCESS;
115 #ifdef HAVE_LDAP
116
117     TRACE( "(%p)\n", controls );
118     controlarrayfreeW( controls );
119
120 #endif
121     return ret;
122 }
123
124 /***********************************************************************
125  *      ldap_create_sort_controlA     (WLDAP32.@)
126  *
127  * See ldap_create_sort_controlW.
128  */
129 ULONG ldap_create_sort_controlA( WLDAP32_LDAP *ld, PLDAPSortKeyA *sortkey,
130     UCHAR critical, PLDAPControlA *control )
131 {
132     ULONG ret = LDAP_NOT_SUPPORTED;
133 #ifdef HAVE_LDAP
134     LDAPSortKeyW **sortkeyW = NULL;
135     LDAPControlW *controlW = NULL;
136
137     TRACE( "(%p, %p, 0x%02x, %p)\n", ld, sortkey, critical, control );
138
139     if (!ld || !sortkey || !control)
140         return WLDAP32_LDAP_PARAM_ERROR;
141
142     sortkeyW = sortkeyarrayAtoW( sortkey );
143     if (!sortkeyW) return WLDAP32_LDAP_NO_MEMORY;
144
145     ret = ldap_create_sort_controlW( ld, sortkeyW, critical, &controlW );
146
147     *control = controlWtoA( controlW );
148     if (!*control) ret = WLDAP32_LDAP_NO_MEMORY;
149
150     ldap_control_freeW( controlW );
151     sortkeyarrayfreeW( sortkeyW );
152
153 #endif
154     return ret;
155 }
156
157 /***********************************************************************
158  *      ldap_create_sort_controlW     (WLDAP32.@)
159  *
160  * Create a control for server sorted search results.
161  *
162  * PARAMS
163  *  ld       [I] Pointer to an LDAP context.
164  *  sortkey  [I] Array of LDAPSortKey structures, each specifying an
165  *               attribute to use as a sort key, a matching rule and
166  *               the sort order (ascending or descending).
167  *  critical [I] Tells the server this control is critical to the
168  *               search operation.
169  *  control  [O] LDAPControl created.
170  *
171  * RETURNS
172  *  Success: LDAP_SUCCESS
173  *  Failure: An LDAP error code.
174  *
175  * NOTES
176  *  Pass the created control as a server control in subsequent calls
177  *  to ldap_search_ext(_s) to obtain sorted search results.
178  */
179 ULONG ldap_create_sort_controlW( WLDAP32_LDAP *ld, PLDAPSortKeyW *sortkey,
180     UCHAR critical, PLDAPControlW *control )
181 {
182     ULONG ret = LDAP_NOT_SUPPORTED;
183 #ifdef HAVE_LDAP
184     LDAPSortKey **sortkeyU = NULL;
185     LDAPControl *controlU = NULL;
186
187     TRACE( "(%p, %p, 0x%02x, %p)\n", ld, sortkey, critical, control );
188
189     if (!ld || !sortkey || !control)
190         return WLDAP32_LDAP_PARAM_ERROR;
191
192     sortkeyU = sortkeyarrayWtoU( sortkey );
193     if (!sortkeyU) return WLDAP32_LDAP_NO_MEMORY;
194
195     ret = ldap_create_sort_control( ld, sortkeyU, critical, &controlU );
196
197     *control = controlUtoW( controlU );
198     if (!*control) ret = WLDAP32_LDAP_NO_MEMORY;
199
200     ldap_control_free( controlU );
201     sortkeyarrayfreeU( sortkeyU );
202
203 #endif
204     return ret;
205 }
206
207 /***********************************************************************
208  *      ldap_create_vlv_controlA     (WLDAP32.@)
209  *
210  * See ldap_create_vlv_controlW.
211  */
212 INT ldap_create_vlv_controlA( WLDAP32_LDAP *ld, WLDAP32_LDAPVLVInfo *info,
213     UCHAR critical, LDAPControlA **control )
214 {
215     INT ret = LDAP_NOT_SUPPORTED;
216 #ifdef HAVE_LDAP
217     LDAPControlW **controlW = NULL;
218
219     TRACE( "(%p, %p, 0x%02x, %p)\n", ld, info, critical, control );
220
221     if (!ld) return ~0UL;
222
223     ret = ldap_create_vlv_controlW( ld, info, critical, controlW );
224
225     *control = controlWtoA( *controlW );
226     ldap_control_freeW( *controlW );
227
228 #endif
229     return ret;
230 }
231
232 /***********************************************************************
233  *      ldap_create_vlv_controlW     (WLDAP32.@)
234  *
235  * Create a virtual list view control.
236  *
237  * PARAMS
238  *  ld       [I] Pointer to an LDAP context.
239  *  info     [I] LDAPVLVInfo structure specifying a list view window.
240  *  critical [I] Tells the server this control is critical to the
241  *               search operation.
242  *  control  [O] LDAPControl created.
243  *
244  * RETURNS
245  *  Success: LDAP_SUCCESS
246  *  Failure: An LDAP error code.
247  *
248  * NOTES
249  *  Pass the created control in conjuction with a sort control as
250  *  server controls in subsequent calls to ldap_search_ext(_s). The
251  *  server will then return a sorted, contiguous subset of results
252  *  that meets the criteria specified in the LDAPVLVInfo structure.
253  */
254 INT ldap_create_vlv_controlW( WLDAP32_LDAP *ld, WLDAP32_LDAPVLVInfo *info,
255     UCHAR critical, LDAPControlW **control )
256 {
257     INT ret = LDAP_NOT_SUPPORTED;
258 #ifdef HAVE_LDAP
259     LDAPControl **controlU = NULL;
260
261     TRACE( "(%p, %p, 0x%02x, %p)\n", ld, info, critical, control );
262
263     if (!ld) return ~0UL;
264
265     ret = ldap_create_vlv_control( ld, (LDAPVLVInfo *)info, controlU );
266
267     *control = controlUtoW( *controlU );
268     ldap_control_free( *controlU );
269
270 #endif
271     return ret;
272 }
273
274 /***********************************************************************
275  *      ldap_encode_sort_controlA     (WLDAP32.@)
276  *
277  * See ldap_encode_sort_controlW.
278  */
279 ULONG ldap_encode_sort_controlA( WLDAP32_LDAP *ld, PLDAPSortKeyA *sortkeys,
280     PLDAPControlA control, BOOLEAN critical )
281 {
282     return ldap_create_sort_controlA( ld, sortkeys, critical, &control );
283 }
284
285 /***********************************************************************
286  *      ldap_encode_sort_controlW     (WLDAP32.@)
287  *
288  * Create a control for server sorted search results.
289  *
290  * PARAMS
291  *  ld       [I] Pointer to an LDAP context.
292  *  sortkey  [I] Array of LDAPSortKey structures, each specifying an
293  *               attribute to use as a sort key, a matching rule and
294  *               the sort order (ascending or descending).
295  *  critical [I] Tells the server this control is critical to the
296  *               search operation.
297  *  control  [O] LDAPControl created.
298  *
299  * RETURNS
300  *  Success: LDAP_SUCCESS
301  *  Failure: An LDAP error code.
302  *
303  * NOTES
304  *  This function is obsolete. Use its equivalent
305  *  ldap_create_sort_control instead.
306  */
307 ULONG ldap_encode_sort_controlW( WLDAP32_LDAP *ld, PLDAPSortKeyW *sortkeys,
308     PLDAPControlW control, BOOLEAN critical )
309 {
310     return ldap_create_sort_controlW( ld, sortkeys, critical, &control );
311 }
312
313 /***********************************************************************
314  *      ldap_free_controlsA     (WLDAP32.@)
315  *
316  * See ldap_free_controlsW.
317  */
318 ULONG ldap_free_controlsA( LDAPControlA **controls )
319 {
320     return ldap_controls_freeA( controls );
321 }
322
323 /***********************************************************************
324  *      ldap_free_controlsW     (WLDAP32.@)
325  *
326  * Free an array of LDAPControl structures.
327  *
328  * PARAMS
329  *  controls  [I] Array of LDAPControl structures to free.
330  *
331  * RETURNS
332  *  LDAP_SUCCESS
333  *  
334  * NOTES
335  *  Obsolete, use ldap_controls_freeW.
336  */
337 ULONG ldap_free_controlsW( LDAPControlW **controls )
338 {
339     return ldap_controls_freeW( controls );
340 }