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
48extern "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 */
165struct 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 */
191struct 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 */
202struct 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 */
237struct 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
273typedef int (*writeptype)( void *writeparm, char *p, int len );
274
275LDAP_API(int)
276LDAP_CALL
277ldap_init_templates( char *file, struct ldap_disptmpl **tmpllistp );
278
279LDAP_API(int)
280LDAP_CALL
281ldap_init_templates_buf( char *buf, long buflen,
282	struct ldap_disptmpl **tmpllistp );
283
284LDAP_API(void)
285LDAP_CALL
286ldap_free_templates( struct ldap_disptmpl *tmpllist );
287
288LDAP_API(struct ldap_disptmpl *)
289LDAP_CALL
290ldap_first_disptmpl( struct ldap_disptmpl *tmpllist );
291
292LDAP_API(struct ldap_disptmpl *)
293LDAP_CALL
294ldap_next_disptmpl( struct ldap_disptmpl *tmpllist,
295	struct ldap_disptmpl *tmpl );
296
297LDAP_API(struct ldap_disptmpl *)
298LDAP_CALL
299ldap_name2template( char *name, struct ldap_disptmpl *tmpllist );
300
301LDAP_API(struct ldap_disptmpl *)
302LDAP_CALL
303ldap_oc2template( char **oclist, struct ldap_disptmpl *tmpllist );
304
305LDAP_API(char **)
306LDAP_CALL
307ldap_tmplattrs( struct ldap_disptmpl *tmpl, char **includeattrs, int exclude,
308	 unsigned long syntaxmask );
309
310LDAP_API(struct ldap_tmplitem *)
311LDAP_CALL
312ldap_first_tmplrow( struct ldap_disptmpl *tmpl );
313
314LDAP_API(struct ldap_tmplitem *)
315LDAP_CALL
316ldap_next_tmplrow( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row );
317
318LDAP_API(struct ldap_tmplitem *)
319LDAP_CALL
320ldap_first_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row );
321
322LDAP_API(struct ldap_tmplitem *)
323LDAP_CALL
324ldap_next_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row,
325	struct ldap_tmplitem *col );
326
327LDAP_API(int)
328LDAP_CALL
329ldap_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
334LDAP_API(int)
335LDAP_CALL
336ldap_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
340LDAP_API(int)
341LDAP_CALL
342ldap_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
347LDAP_API(int)
348LDAP_CALL
349ldap_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
354LDAP_API(int)
355LDAP_CALL
356ldap_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
360LDAP_API(int)
361LDAP_CALL
362ldap_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
369LDAP_API(char *)
370LDAP_CALL
371ldap_tmplerr2string( int err );
372
373#ifdef __cplusplus
374}
375#endif
376#endif /* _DISPTMPL_H */
377