1 /*
2  * Copyright (c) 2001 by Sun Microsystems, Inc.
3  * All rights reserved.
4  */
5 
6 #pragma ident	"%Z%%M%	%I%	%E% SMI"
7 
8 /*
9  * The contents of this file are subject to the Netscape Public
10  * License Version 1.1 (the "License"); you may not use this file
11  * except in compliance with the License. You may obtain a copy of
12  * the License at http://www.mozilla.org/NPL/
13  *
14  * Software distributed under the License is distributed on an "AS
15  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
16  * implied. See the License for the specific language governing
17  * rights and limitations under the License.
18  *
19  * The Original Code is Mozilla Communicator client code, released
20  * March 31, 1998.
21  *
22  * The Initial Developer of the Original Code is Netscape
23  * Communications Corporation. Portions created by Netscape are
24  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
25  * Rights Reserved.
26  *
27  * Contributor(s):
28  */
29 
30 /*
31  * Copyright (c) 1993, 1994 Regents of the University of Michigan.
32  * All rights reserved.
33  *
34  * Redistribution and use in source and binary forms are permitted
35  * provided that this notice is preserved and that due credit is given
36  * to the University of Michigan at Ann Arbor. The name of the University
37  * may not be used to endorse or promote products derived from this
38  * software without specific prior written permission. This software
39  * is provided ``as is'' without express or implied warranty.
40  *
41  * disptmpl.h:  display template library defines
42  */
43 
44 #ifndef _DISPTMPL_H
45 #define _DISPTMPL_H
46 
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
51 /* calling conventions used by library */
52 #ifndef LDAP_CALL
53 #if defined( _WINDOWS ) || defined( _WIN32 )
54 #define LDAP_C __cdecl
55 #ifndef _WIN32
56 #define __stdcall _far _pascal
57 #define LDAP_CALLBACK _loadds
58 #else
59 #define LDAP_CALLBACK
60 #endif /* _WIN32 */
61 #define LDAP_PASCAL __stdcall
62 #define LDAP_CALL LDAP_PASCAL
63 #else /* _WINDOWS */
64 #define LDAP_C
65 #define LDAP_CALLBACK
66 #define LDAP_PASCAL
67 #define LDAP_CALL
68 #endif /* _WINDOWS */
69 #endif /* LDAP_CALL */
70 
71 #ifndef _SOLARIS_SDK
72 
73 #define LDAP_TEMPLATE_VERSION	1
74 
75 /*
76  * general types of items (confined to most significant byte)
77  */
78 #define LDAP_SYN_TYPE_TEXT		0x01000000L
79 #define LDAP_SYN_TYPE_IMAGE		0x02000000L
80 #define LDAP_SYN_TYPE_BOOLEAN		0x04000000L
81 #define LDAP_SYN_TYPE_BUTTON		0x08000000L
82 #define LDAP_SYN_TYPE_ACTION		0x10000000L
83 
84 
85 /*
86  * syntax options (confined to second most significant byte)
87  */
88 #define LDAP_SYN_OPT_DEFER		0x00010000L
89 
90 
91 /*
92  * display template item syntax ids (defined by common agreement)
93  * these are the valid values for the ti_syntaxid of the tmplitem
94  * struct (defined below).  A general type is encoded in the
95  * most-significant 8 bits, and some options are encoded in the next
96  * 8 bits.  The lower 16 bits are reserved for the distinct types.
97  */
98 #define LDAP_SYN_CASEIGNORESTR	( 1 | LDAP_SYN_TYPE_TEXT )
99 #define LDAP_SYN_MULTILINESTR	( 2 | LDAP_SYN_TYPE_TEXT )
100 #define LDAP_SYN_DN		( 3 | LDAP_SYN_TYPE_TEXT )
101 #define LDAP_SYN_BOOLEAN	( 4 | LDAP_SYN_TYPE_BOOLEAN )
102 #define LDAP_SYN_JPEGIMAGE	( 5 | LDAP_SYN_TYPE_IMAGE )
103 #define LDAP_SYN_JPEGBUTTON	( 6 | LDAP_SYN_TYPE_BUTTON | LDAP_SYN_OPT_DEFER )
104 #define LDAP_SYN_FAXIMAGE	( 7 | LDAP_SYN_TYPE_IMAGE )
105 #define LDAP_SYN_FAXBUTTON	( 8 | LDAP_SYN_TYPE_BUTTON | LDAP_SYN_OPT_DEFER )
106 #define LDAP_SYN_AUDIOBUTTON	( 9 | LDAP_SYN_TYPE_BUTTON | LDAP_SYN_OPT_DEFER )
107 #define LDAP_SYN_TIME		( 10 | LDAP_SYN_TYPE_TEXT )
108 #define LDAP_SYN_DATE		( 11 | LDAP_SYN_TYPE_TEXT )
109 #define LDAP_SYN_LABELEDURL	( 12 | LDAP_SYN_TYPE_TEXT )
110 #define LDAP_SYN_SEARCHACTION	( 13 | LDAP_SYN_TYPE_ACTION )
111 #define LDAP_SYN_LINKACTION	( 14 | LDAP_SYN_TYPE_ACTION )
112 #define LDAP_SYN_ADDDNACTION	( 15 | LDAP_SYN_TYPE_ACTION )
113 #define LDAP_SYN_VERIFYDNACTION ( 16 | LDAP_SYN_TYPE_ACTION )
114 #define LDAP_SYN_RFC822ADDR	( 17 | LDAP_SYN_TYPE_TEXT )
115 
116 
117 /*
118  * handy macros
119  */
120 #define LDAP_GET_SYN_TYPE( syid )	((syid) & 0xFF000000UL )
121 #define LDAP_GET_SYN_OPTIONS( syid )	((syid) & 0x00FF0000UL )
122 
123 
124 /*
125  * display options for output routines (used by entry2text and friends)
126  */
127 /*
128  * use calculated label width (based on length of longest label in
129  * template) instead of contant width
130  */
131 #define LDAP_DISP_OPT_AUTOLABELWIDTH	0x00000001L
132 #define LDAP_DISP_OPT_HTMLBODYONLY	0x00000002L
133 
134 /*
135  * perform search actions (applies to ldap_entry2text_search only)
136  */
137 #define LDAP_DISP_OPT_DOSEARCHACTIONS	0x00000002L
138 
139 /*
140  * include additional info. relevant to "non leaf" entries only
141  * used by ldap_entry2html and ldap_entry2html_search to include "Browse"
142  * and "Move Up" HREFs
143  */
144 #define LDAP_DISP_OPT_NONLEAF		0x00000004L
145 
146 #endif /* ifndef _SOLARIS_SDK */
147 
148 /*
149  * display template item options (may not apply to all types)
150  * if this bit is set in ti_options, it applies.
151  */
152 #define LDAP_DITEM_OPT_READONLY		0x00000001L
153 #define LDAP_DITEM_OPT_SORTVALUES	0x00000002L
154 #define LDAP_DITEM_OPT_SINGLEVALUED	0x00000004L
155 #define LDAP_DITEM_OPT_HIDEIFEMPTY	0x00000008L
156 #define LDAP_DITEM_OPT_VALUEREQUIRED	0x00000010L
157 #define LDAP_DITEM_OPT_HIDEIFFALSE	0x00000020L	/* booleans only */
158 
159 
160 #ifndef _SOLARIS_SDK
161 
162 /*
163  * display template item structure
164  */
165 struct ldap_tmplitem {
166     unsigned long		ti_syntaxid;
167     unsigned long		ti_options;
168     char  			*ti_attrname;
169     char			*ti_label;
170     char			**ti_args;
171     struct ldap_tmplitem	*ti_next_in_row;
172     struct ldap_tmplitem	*ti_next_in_col;
173     void			*ti_appdata;
174 };
175 
176 #define NULLTMPLITEM	((struct ldap_tmplitem *)0)
177 
178 #define LDAP_SET_TMPLITEM_APPDATA( ti, datap )	\
179 	(ti)->ti_appdata = (void *)(datap)
180 
181 #define LDAP_GET_TMPLITEM_APPDATA( ti, type )	\
182 	(type)((ti)->ti_appdata)
183 
184 #define LDAP_IS_TMPLITEM_OPTION_SET( ti, option )	\
185 	(((ti)->ti_options & option ) != 0 )
186 
187 
188 /*
189  * object class array structure
190  */
191 struct ldap_oclist {
192     char		**oc_objclasses;
193     struct ldap_oclist	*oc_next;
194 };
195 
196 #define NULLOCLIST	((struct ldap_oclist *)0)
197 
198 
199 /*
200  * add defaults list
201  */
202 struct ldap_adddeflist {
203     int			ad_source;
204 #define LDAP_ADSRC_CONSTANTVALUE	1
205 #define LDAP_ADSRC_ADDERSDN		2
206     char		*ad_attrname;
207     char		*ad_value;
208     struct ldap_adddeflist	*ad_next;
209 };
210 
211 #define NULLADLIST	((struct ldap_adddeflist *)0)
212 
213 
214 /*
215  * display template global options
216  * if this bit is set in dt_options, it applies.
217  */
218 /*
219  * users should be allowed to try to add objects of these entries
220  */
221 #define LDAP_DTMPL_OPT_ADDABLE		0x00000001L
222 
223 /*
224  * users should be allowed to do "modify RDN" operation of these entries
225  */
226 #define LDAP_DTMPL_OPT_ALLOWMODRDN	0x00000002L
227 
228 /*
229  * this template is an alternate view, not a primary view
230  */
231 #define LDAP_DTMPL_OPT_ALTVIEW		0x00000004L
232 
233 
234 /*
235  * display template structure
236  */
237 struct ldap_disptmpl {
238     char			*dt_name;
239     char			*dt_pluralname;
240     char			*dt_iconname;
241     unsigned long		dt_options;
242     char			*dt_authattrname;
243     char			*dt_defrdnattrname;
244     char			*dt_defaddlocation;
245     struct ldap_oclist		*dt_oclist;
246     struct ldap_adddeflist	*dt_adddeflist;
247     struct ldap_tmplitem	*dt_items;
248     void			*dt_appdata;
249     struct ldap_disptmpl	*dt_next;
250 };
251 
252 #define NULLDISPTMPL	((struct ldap_disptmpl *)0)
253 
254 #define LDAP_SET_DISPTMPL_APPDATA( dt, datap )	\
255 	(dt)->dt_appdata = (void *)(datap)
256 
257 #define LDAP_GET_DISPTMPL_APPDATA( dt, type )	\
258 	(type)((dt)->dt_appdata)
259 
260 #define LDAP_IS_DISPTMPL_OPTION_SET( dt, option )	\
261 	(((dt)->dt_options & option ) != 0 )
262 
263 #define LDAP_TMPL_ERR_VERSION	1
264 #define LDAP_TMPL_ERR_MEM	2
265 #define LDAP_TMPL_ERR_SYNTAX	3
266 #define LDAP_TMPL_ERR_FILE	4
267 
268 /*
269  * buffer size needed for entry2text and vals2text
270  */
271 #define LDAP_DTMPL_BUFSIZ	8192
272 
273 typedef int (*writeptype)( void *writeparm, char *p, int len );
274 
275 LDAP_API(int)
276 LDAP_CALL
277 ldap_init_templates( char *file, struct ldap_disptmpl **tmpllistp );
278 
279 LDAP_API(int)
280 LDAP_CALL
281 ldap_init_templates_buf( char *buf, long buflen,
282 	struct ldap_disptmpl **tmpllistp );
283 
284 LDAP_API(void)
285 LDAP_CALL
286 ldap_free_templates( struct ldap_disptmpl *tmpllist );
287 
288 LDAP_API(struct ldap_disptmpl *)
289 LDAP_CALL
290 ldap_first_disptmpl( struct ldap_disptmpl *tmpllist );
291 
292 LDAP_API(struct ldap_disptmpl *)
293 LDAP_CALL
294 ldap_next_disptmpl( struct ldap_disptmpl *tmpllist,
295 	struct ldap_disptmpl *tmpl );
296 
297 LDAP_API(struct ldap_disptmpl *)
298 LDAP_CALL
299 ldap_name2template( char *name, struct ldap_disptmpl *tmpllist );
300 
301 LDAP_API(struct ldap_disptmpl *)
302 LDAP_CALL
303 ldap_oc2template( char **oclist, struct ldap_disptmpl *tmpllist );
304 
305 LDAP_API(char **)
306 LDAP_CALL
307 ldap_tmplattrs( struct ldap_disptmpl *tmpl, char **includeattrs, int exclude,
308 	 unsigned long syntaxmask );
309 
310 LDAP_API(struct ldap_tmplitem *)
311 LDAP_CALL
312 ldap_first_tmplrow( struct ldap_disptmpl *tmpl );
313 
314 LDAP_API(struct ldap_tmplitem *)
315 LDAP_CALL
316 ldap_next_tmplrow( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row );
317 
318 LDAP_API(struct ldap_tmplitem *)
319 LDAP_CALL
320 ldap_first_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row );
321 
322 LDAP_API(struct ldap_tmplitem *)
323 LDAP_CALL
324 ldap_next_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row,
325 	struct ldap_tmplitem *col );
326 
327 LDAP_API(int)
328 LDAP_CALL
329 ldap_entry2text( LDAP *ld, char *buf, LDAPMessage *entry,
330 	struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals,
331 	writeptype writeproc, void *writeparm, char *eol, int rdncount,
332 	unsigned long opts );
333 
334 LDAP_API(int)
335 LDAP_CALL
336 ldap_vals2text( LDAP *ld, char *buf, char **vals, char *label, int labelwidth,
337 	unsigned long syntaxid, writeptype writeproc, void *writeparm,
338 	char *eol, int rdncount );
339 
340 LDAP_API(int)
341 LDAP_CALL
342 ldap_entry2text_search( LDAP *ld, char *dn, char *base, LDAPMessage *entry,
343 	struct ldap_disptmpl *tmpllist, char **defattrs, char ***defvals,
344 	writeptype writeproc, void *writeparm, char *eol, int rdncount,
345 	unsigned long opts );
346 
347 LDAP_API(int)
348 LDAP_CALL
349 ldap_entry2html( LDAP *ld, char *buf, LDAPMessage *entry,
350 	struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals,
351 	writeptype writeproc, void *writeparm, char *eol, int rdncount,
352 	unsigned long opts, char *urlprefix, char *base );
353 
354 LDAP_API(int)
355 LDAP_CALL
356 ldap_vals2html( LDAP *ld, char *buf, char **vals, char *label, int labelwidth,
357 	unsigned long syntaxid, writeptype writeproc, void *writeparm,
358 	char *eol, int rdncount, char *urlprefix );
359 
360 LDAP_API(int)
361 LDAP_CALL
362 ldap_entry2html_search( LDAP *ld, char *dn, char *base, LDAPMessage *entry,
363 	struct ldap_disptmpl *tmpllist, char **defattrs, char ***defvals,
364 	writeptype writeproc, void *writeparm, char *eol, int rdncount,
365 	unsigned long opts, char *urlprefix );
366 
367 #endif /* ifndef _SOLARIS_SDK */
368 
369 LDAP_API(char *)
370 LDAP_CALL
371 ldap_tmplerr2string( int err );
372 
373 #ifdef __cplusplus
374 }
375 #endif
376 #endif /* _DISPTMPL_H */
377