1 /*
2 **	HYPERTEXT OBJECT BUILDER
3 **
4 **	(c) COPYRIGHT MIT 1999.
5 **	Please first read the full copyright statement in the file COPYRIGH.
6 **	@(#) $Id$
7 **
8 **	This generates of a hypertext object and calls the application
9 **	via callbacks.
10 */
11 
12 /* Library include files */
13 #include "wwwsys.h"
14 #include "WWWUtil.h"
15 #include "WWWCore.h"
16 #include "HText.h"
17 #include "HTextImp.h"
18 
19 /* Default callbacks that the application can register */
20 PRIVATE HText_new * 			text_new;
21 PRIVATE HText_delete *			text_delete;
22 PRIVATE HText_build *		       	text_build;
23 PRIVATE HText_addText *			text_addText;
24 PRIVATE HText_foundLink *		text_foundLink;
25 PRIVATE HText_beginElement *		text_beginElement;
26 PRIVATE HText_endElement *		text_endElement;
27 PRIVATE HText_unparsedBeginElement *	text_unparsedBeginElement;
28 PRIVATE HText_unparsedEndElement *	text_unparsedEndElement;
29 PRIVATE HText_unparsedEntity *		text_unparsedEntity;
30 
31 /* HText handler instance */
32 struct _HTextImp {
33     HText *			app;
34     HText_new * 		text_new;
35     HText_delete *		text_delete;
36     HText_build *		text_build;
37     HText_addText *		text_addText;
38     HText_foundLink *		text_foundLink;
39     HText_beginElement *	text_beginElement;
40     HText_endElement *		text_endElement;
41     HText_unparsedBeginElement *text_unparsedBeginElement;
42     HText_unparsedEndElement *	text_unparsedEndElement;
43     HText_unparsedEntity *	text_unparsedEntity;
44 };
45 
46 /* --------------------------------------------------------------------------- */
47 
HTextImp_new(HTRequest * request,HTParentAnchor * anchor,HTStream * output_stream)48 PUBLIC HTextImp * HTextImp_new (HTRequest *	 request,
49 				HTParentAnchor * anchor,
50 				HTStream *	 output_stream)
51 {
52     HTextImp * me = NULL;
53     if ((me = (HTextImp *) HT_CALLOC(1, sizeof (HTextImp))) == NULL)
54 	HT_OUTOFMEM("HTextImp_new");
55     me->text_new = text_new;
56     me->text_delete = text_delete;
57     me->text_build = text_build;
58     me->text_addText = text_addText;
59     me->text_foundLink = text_foundLink;
60     me->text_beginElement = text_beginElement;
61     me->text_endElement = text_endElement;
62     me->text_unparsedBeginElement = text_unparsedBeginElement;
63     me->text_unparsedEndElement = text_unparsedEndElement;
64     me->text_unparsedEntity = text_unparsedEntity;
65     if (me->text_new) me->app = (*me->text_new)(request, anchor, output_stream);
66     return me;
67 }
68 
HTextImp_delete(HTextImp * me)69 PUBLIC BOOL HTextImp_delete (HTextImp * me)
70 {
71     if (me) {
72 
73 	/*
74 	** Note that we do not call the delete method on the app
75 	** HText object as this normally stays around after the
76 	** request has been deleted and certainly it should be
77 	** deleted by the app and not libwww
78 	*/
79 	HT_FREE(me);
80 	return YES;
81     }
82     return NO;
83 }
84 
HTextImp_build(HTextImp * me,HTextStatus status)85 PUBLIC void HTextImp_build (HTextImp * me, HTextStatus status)
86 {
87     if (me && me->text_build)
88 	(*me->text_build)(me->app, status);
89 }
90 
HTextImp_addText(HTextImp * me,const char * buffer,int length)91 PUBLIC void HTextImp_addText (HTextImp * 	me,
92 			      const char * 	buffer,
93 			      int 		length)
94 {
95     if (me && me->text_addText)
96 	(*me->text_addText)(me->app, buffer, length);
97 }
98 
HTextImp_foundLink(HTextImp * me,int element_number,int attribute_number,HTChildAnchor * anchor,const BOOL * present,const char ** value)99 PUBLIC void HTextImp_foundLink (HTextImp * 	me,
100 				int 		element_number,
101 				int 		attribute_number,
102 				HTChildAnchor *anchor,
103 				const BOOL *	present,
104 				const char **	value)
105 {
106     if (me && me->text_foundLink)
107 	(*me->text_foundLink)(me->app, element_number, attribute_number,
108 			   anchor, present, value);
109 }
110 
HTextImp_beginElement(HTextImp * me,int element_number,const BOOL * present,const char ** value)111 PUBLIC void HTextImp_beginElement (HTextImp * 	me,
112 				   int		element_number,
113 				   const BOOL *	present,
114 				   const char **value)
115 {
116     if (me && me->text_beginElement)
117 	(*me->text_beginElement)(me->app, element_number, present, value);
118 }
119 
HTextImp_endElement(HTextImp * me,int element_number)120 PUBLIC void HTextImp_endElement (HTextImp * 	me,
121 				 int		element_number)
122 {
123     if (me && me->text_endElement)
124 	(*me->text_endElement)(me->app, element_number);
125 }
126 
HTextImp_unparsedBeginElement(HTextImp * me,const char * buffer,int length)127 PUBLIC void HTextImp_unparsedBeginElement (HTextImp * 	me,
128 					   const char * buffer,
129 					   int 		length)
130 {
131     if (me && me->text_unparsedBeginElement)
132 	(*me->text_unparsedBeginElement)(me->app, buffer, length);
133 }
134 
HTextImp_unparsedEndElement(HTextImp * me,const char * buffer,int length)135 PUBLIC void HTextImp_unparsedEndElement (HTextImp * 	me,
136 					 const char * buffer,
137 					 int 		length)
138 {
139     if (me && me->text_unparsedEndElement)
140 	(*me->text_unparsedEndElement)(me->app, buffer, length);
141 }
142 
HTextImp_unparsedEntity(HTextImp * me,const char * buffer,int length)143 PUBLIC void HTextImp_unparsedEntity (HTextImp * 	me,
144 				     const char * 	buffer,
145 				     int 		length)
146 {
147     if (me && me->text_unparsedEntity)
148 	(*me->text_unparsedEntity)(me->app, buffer, length);
149 }
150 
151 /* --------------------------------------------------------------------------- */
152 
HText_registerCDCallback(HText_new * ncb,HText_delete * dcb)153 PUBLIC BOOL HText_registerCDCallback (HText_new * ncb,
154 					  HText_delete * dcb)
155 {
156     if (ncb && dcb) {
157 	text_new = ncb;
158 	text_delete = dcb;
159 	return YES;
160     }
161     return NO;
162 }
163 
HText_unregisterCDCallback(void)164 PUBLIC BOOL HText_unregisterCDCallback (void)
165 {
166     text_new = NULL;
167     text_delete = NULL;
168     return YES;
169 }
170 
HText_registerBuildCallback(HText_build * bcb)171 PUBLIC BOOL HText_registerBuildCallback (HText_build * bcb)
172 {
173     text_build = bcb;
174     return YES;
175 }
176 
HText_registerTextCallback(HText_addText * tcb)177 PUBLIC BOOL HText_registerTextCallback (HText_addText * tcb)
178 {
179     text_addText = tcb;
180     return YES;
181 }
182 
HText_unregisterTextCallback(void)183 PUBLIC BOOL HText_unregisterTextCallback (void)
184 {
185     text_addText = NULL;
186     return YES;
187 }
188 
HText_registerLinkCallback(HText_foundLink * lcb)189 PUBLIC BOOL HText_registerLinkCallback (HText_foundLink * lcb)
190 {
191     text_foundLink = lcb;
192     return YES;
193 }
194 
HText_unregisterLinkCallback(void)195 PUBLIC BOOL HText_unregisterLinkCallback (void)
196 {
197     text_foundLink = NULL;
198     return YES;
199 }
200 
HText_registerElementCallback(HText_beginElement * bcb,HText_endElement * ecb)201 PUBLIC BOOL HText_registerElementCallback (HText_beginElement * bcb,
202 					       HText_endElement * ecb)
203 {
204     text_beginElement = bcb;
205     text_endElement = ecb;
206     return YES;
207 }
208 
HText_unregisterElementCallback(void)209 PUBLIC BOOL HText_unregisterElementCallback (void)
210 {
211     text_beginElement = NULL;
212     return YES;
213 }
214 
HText_registerUnparsedElementCallback(HText_unparsedBeginElement * ubcb,HText_unparsedBeginElement * uecb)215 PUBLIC BOOL HText_registerUnparsedElementCallback (HText_unparsedBeginElement * ubcb,
216 						   HText_unparsedBeginElement * uecb)
217 {
218     text_unparsedBeginElement = ubcb;
219     text_unparsedEndElement = uecb;
220     return YES;
221 }
222 
HText_unregisterUnparsedElementCallback(void)223 PUBLIC BOOL HText_unregisterUnparsedElementCallback (void)
224 {
225     text_unparsedBeginElement = NULL;
226     text_unparsedEndElement = NULL;
227     return YES;
228 }
229 
HText_registerUnparsedEntityCallback(HText_unparsedEntity * tcb)230 PUBLIC BOOL HText_registerUnparsedEntityCallback (HText_unparsedEntity * tcb)
231 {
232     text_unparsedEntity = tcb;
233     return YES;
234 }
235 
HText_unregisterUnparsedEntityCallback(void)236 PUBLIC BOOL HText_unregisterUnparsedEntityCallback (void)
237 {
238     text_unparsedEntity = NULL;
239     return YES;
240 }
241