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