1 /* libxml2 - Library for parsing XML documents
2  * Copyright (C) 2006-2019 Free Software Foundation, Inc.
3  *
4  * This file is not part of the GNU gettext program, but is used with
5  * GNU gettext.
6  *
7  * The original copyright notice is as follows:
8  */
9 
10 /*
11  * Copyright (C) 1998-2012 Daniel Veillard.  All Rights Reserved.
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a copy
14  * of this software and associated documentation files (the "Software"), to deal
15  * in the Software without restriction, including without limitation the rights
16  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17  * copies of the Software, and to permit persons to whom the Software is fur-
18  * nished to do so, subject to the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be included in
21  * all copies or substantial portions of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
25  * NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
26  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29  * THE SOFTWARE.
30  *
31  * Author: Daniel Veillard
32  */
33 
34 /*
35  * Summary: interface for the I/O interfaces used by the parser
36  * Description: interface for the I/O interfaces used by the parser
37  */
38 
39 #ifndef __XML_IO_H__
40 #define __XML_IO_H__
41 
42 #include <stdio.h>
43 #include <libxml/xmlversion.h>
44 
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48 
49 /*
50  * Those are the functions and datatypes for the parser input
51  * I/O structures.
52  */
53 
54 /**
55  * xmlInputMatchCallback:
56  * @filename: the filename or URI
57  *
58  * Callback used in the I/O Input API to detect if the current handler
59  * can provide input fonctionnalities for this resource.
60  *
61  * Returns 1 if yes and 0 if another Input module should be used
62  */
63 typedef int (XMLCALL *xmlInputMatchCallback) (char const *filename);
64 /**
65  * xmlInputOpenCallback:
66  * @filename: the filename or URI
67  *
68  * Callback used in the I/O Input API to open the resource
69  *
70  * Returns an Input context or NULL in case or error
71  */
72 typedef void * (XMLCALL *xmlInputOpenCallback) (char const *filename);
73 /**
74  * xmlInputReadCallback:
75  * @context:  an Input context
76  * @buffer:  the buffer to store data read
77  * @len:  the length of the buffer in bytes
78  *
79  * Callback used in the I/O Input API to read the resource
80  *
81  * Returns the number of bytes read or -1 in case of error
82  */
83 typedef int (XMLCALL *xmlInputReadCallback) (void * context, char * buffer, int len);
84 /**
85  * xmlInputCloseCallback:
86  * @context:  an Input context
87  *
88  * Callback used in the I/O Input API to close the resource
89  *
90  * Returns 0 or -1 in case of error
91  */
92 typedef int (XMLCALL *xmlInputCloseCallback) (void * context);
93 
94 #ifdef LIBXML_OUTPUT_ENABLED
95 /*
96  * Those are the functions and datatypes for the library output
97  * I/O structures.
98  */
99 
100 /**
101  * xmlOutputMatchCallback:
102  * @filename: the filename or URI
103  *
104  * Callback used in the I/O Output API to detect if the current handler
105  * can provide output fonctionnalities for this resource.
106  *
107  * Returns 1 if yes and 0 if another Output module should be used
108  */
109 typedef int (XMLCALL *xmlOutputMatchCallback) (char const *filename);
110 /**
111  * xmlOutputOpenCallback:
112  * @filename: the filename or URI
113  *
114  * Callback used in the I/O Output API to open the resource
115  *
116  * Returns an Output context or NULL in case or error
117  */
118 typedef void * (XMLCALL *xmlOutputOpenCallback) (char const *filename);
119 /**
120  * xmlOutputWriteCallback:
121  * @context:  an Output context
122  * @buffer:  the buffer of data to write
123  * @len:  the length of the buffer in bytes
124  *
125  * Callback used in the I/O Output API to write to the resource
126  *
127  * Returns the number of bytes written or -1 in case of error
128  */
129 typedef int (XMLCALL *xmlOutputWriteCallback) (void * context, const char * buffer,
130                                        int len);
131 /**
132  * xmlOutputCloseCallback:
133  * @context:  an Output context
134  *
135  * Callback used in the I/O Output API to close the resource
136  *
137  * Returns 0 or -1 in case of error
138  */
139 typedef int (XMLCALL *xmlOutputCloseCallback) (void * context);
140 #endif /* LIBXML_OUTPUT_ENABLED */
141 
142 #ifdef __cplusplus
143 }
144 #endif
145 
146 #include <libxml/globals.h>
147 #include <libxml/tree.h>
148 #include <libxml/parser.h>
149 #include <libxml/encoding.h>
150 
151 #ifdef __cplusplus
152 extern "C" {
153 #endif
154 struct _xmlParserInputBuffer {
155     void*                  context;
156     xmlInputReadCallback   readcallback;
157     xmlInputCloseCallback  closecallback;
158 
159     xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */
160 
161     xmlBufPtr buffer;    /* Local buffer encoded in UTF-8 */
162     xmlBufPtr raw;       /* if encoder != NULL buffer for raw input */
163     int	compressed;	    /* -1=unknown, 0=not compressed, 1=compressed */
164     int error;
165     unsigned long rawconsumed;/* amount consumed from raw */
166 };
167 
168 
169 #ifdef LIBXML_OUTPUT_ENABLED
170 struct _xmlOutputBuffer {
171     void*                   context;
172     xmlOutputWriteCallback  writecallback;
173     xmlOutputCloseCallback  closecallback;
174 
175     xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */
176 
177     xmlBufPtr buffer;    /* Local buffer encoded in UTF-8 or ISOLatin */
178     xmlBufPtr conv;      /* if encoder != NULL buffer for output */
179     int written;            /* total number of byte written */
180     int error;
181 };
182 #endif /* LIBXML_OUTPUT_ENABLED */
183 
184 /*
185  * Interfaces for input
186  */
187 XMLPUBFUN void XMLCALL
188 	xmlCleanupInputCallbacks		(void);
189 
190 XMLPUBFUN int XMLCALL
191 	xmlPopInputCallbacks			(void);
192 
193 XMLPUBFUN void XMLCALL
194 	xmlRegisterDefaultInputCallbacks	(void);
195 XMLPUBFUN xmlParserInputBufferPtr XMLCALL
196 	xmlAllocParserInputBuffer		(xmlCharEncoding enc);
197 
198 XMLPUBFUN xmlParserInputBufferPtr XMLCALL
199 	xmlParserInputBufferCreateFilename	(const char *URI,
200                                                  xmlCharEncoding enc);
201 XMLPUBFUN xmlParserInputBufferPtr XMLCALL
202 	xmlParserInputBufferCreateFile		(FILE *file,
203                                                  xmlCharEncoding enc);
204 XMLPUBFUN xmlParserInputBufferPtr XMLCALL
205 	xmlParserInputBufferCreateFd		(int fd,
206 	                                         xmlCharEncoding enc);
207 XMLPUBFUN xmlParserInputBufferPtr XMLCALL
208 	xmlParserInputBufferCreateMem		(const char *mem, int size,
209 	                                         xmlCharEncoding enc);
210 XMLPUBFUN xmlParserInputBufferPtr XMLCALL
211 	xmlParserInputBufferCreateStatic	(const char *mem, int size,
212 	                                         xmlCharEncoding enc);
213 XMLPUBFUN xmlParserInputBufferPtr XMLCALL
214 	xmlParserInputBufferCreateIO		(xmlInputReadCallback   ioread,
215 						 xmlInputCloseCallback  ioclose,
216 						 void *ioctx,
217 	                                         xmlCharEncoding enc);
218 XMLPUBFUN int XMLCALL
219 	xmlParserInputBufferRead		(xmlParserInputBufferPtr in,
220 						 int len);
221 XMLPUBFUN int XMLCALL
222 	xmlParserInputBufferGrow		(xmlParserInputBufferPtr in,
223 						 int len);
224 XMLPUBFUN int XMLCALL
225 	xmlParserInputBufferPush		(xmlParserInputBufferPtr in,
226 						 int len,
227 						 const char *buf);
228 XMLPUBFUN void XMLCALL
229 	xmlFreeParserInputBuffer		(xmlParserInputBufferPtr in);
230 XMLPUBFUN char * XMLCALL
231 	xmlParserGetDirectory			(const char *filename);
232 
233 XMLPUBFUN int XMLCALL
234 	xmlRegisterInputCallbacks		(xmlInputMatchCallback matchFunc,
235 						 xmlInputOpenCallback openFunc,
236 						 xmlInputReadCallback readFunc,
237 						 xmlInputCloseCallback closeFunc);
238 
239 xmlParserInputBufferPtr
240 	__xmlParserInputBufferCreateFilename(const char *URI,
241 						xmlCharEncoding enc);
242 
243 #ifdef LIBXML_OUTPUT_ENABLED
244 /*
245  * Interfaces for output
246  */
247 XMLPUBFUN void XMLCALL
248 	xmlCleanupOutputCallbacks		(void);
249 XMLPUBFUN void XMLCALL
250 	xmlRegisterDefaultOutputCallbacks(void);
251 XMLPUBFUN xmlOutputBufferPtr XMLCALL
252 	xmlAllocOutputBuffer		(xmlCharEncodingHandlerPtr encoder);
253 
254 XMLPUBFUN xmlOutputBufferPtr XMLCALL
255 	xmlOutputBufferCreateFilename	(const char *URI,
256 					 xmlCharEncodingHandlerPtr encoder,
257 					 int compression);
258 
259 XMLPUBFUN xmlOutputBufferPtr XMLCALL
260 	xmlOutputBufferCreateFile	(FILE *file,
261 					 xmlCharEncodingHandlerPtr encoder);
262 
263 XMLPUBFUN xmlOutputBufferPtr XMLCALL
264 	xmlOutputBufferCreateBuffer	(xmlBufferPtr buffer,
265 					 xmlCharEncodingHandlerPtr encoder);
266 
267 XMLPUBFUN xmlOutputBufferPtr XMLCALL
268 	xmlOutputBufferCreateFd		(int fd,
269 					 xmlCharEncodingHandlerPtr encoder);
270 
271 XMLPUBFUN xmlOutputBufferPtr XMLCALL
272 	xmlOutputBufferCreateIO		(xmlOutputWriteCallback   iowrite,
273 					 xmlOutputCloseCallback  ioclose,
274 					 void *ioctx,
275 					 xmlCharEncodingHandlerPtr encoder);
276 
277 /* Couple of APIs to get the output without digging into the buffers */
278 XMLPUBFUN const xmlChar * XMLCALL
279         xmlOutputBufferGetContent       (xmlOutputBufferPtr out);
280 XMLPUBFUN size_t XMLCALL
281         xmlOutputBufferGetSize          (xmlOutputBufferPtr out);
282 
283 XMLPUBFUN int XMLCALL
284 	xmlOutputBufferWrite		(xmlOutputBufferPtr out,
285 					 int len,
286 					 const char *buf);
287 XMLPUBFUN int XMLCALL
288 	xmlOutputBufferWriteString	(xmlOutputBufferPtr out,
289 					 const char *str);
290 XMLPUBFUN int XMLCALL
291 	xmlOutputBufferWriteEscape	(xmlOutputBufferPtr out,
292 					 const xmlChar *str,
293 					 xmlCharEncodingOutputFunc escaping);
294 
295 XMLPUBFUN int XMLCALL
296 	xmlOutputBufferFlush		(xmlOutputBufferPtr out);
297 XMLPUBFUN int XMLCALL
298 	xmlOutputBufferClose		(xmlOutputBufferPtr out);
299 
300 XMLPUBFUN int XMLCALL
301 	xmlRegisterOutputCallbacks	(xmlOutputMatchCallback matchFunc,
302 					 xmlOutputOpenCallback openFunc,
303 					 xmlOutputWriteCallback writeFunc,
304 					 xmlOutputCloseCallback closeFunc);
305 
306 xmlOutputBufferPtr
307 	__xmlOutputBufferCreateFilename(const char *URI,
308                               xmlCharEncodingHandlerPtr encoder,
309                               int compression);
310 
311 #ifdef LIBXML_HTTP_ENABLED
312 /*  This function only exists if HTTP support built into the library  */
313 XMLPUBFUN void XMLCALL
314 	xmlRegisterHTTPPostCallbacks	(void );
315 #endif /* LIBXML_HTTP_ENABLED */
316 
317 #endif /* LIBXML_OUTPUT_ENABLED */
318 
319 XMLPUBFUN xmlParserInputPtr XMLCALL
320 	xmlCheckHTTPInput		(xmlParserCtxtPtr ctxt,
321 					 xmlParserInputPtr ret);
322 
323 /*
324  * A predefined entity loader disabling network accesses
325  */
326 XMLPUBFUN xmlParserInputPtr XMLCALL
327 	xmlNoNetExternalEntityLoader	(const char *URL,
328 					 const char *ID,
329 					 xmlParserCtxtPtr ctxt);
330 
331 /*
332  * xmlNormalizeWindowsPath is obsolete, don't use it.
333  * Check xmlCanonicPath in uri.h for a better alternative.
334  */
335 XMLPUBFUN xmlChar * XMLCALL
336 	xmlNormalizeWindowsPath		(const xmlChar *path);
337 
338 XMLPUBFUN int XMLCALL
339 	xmlCheckFilename		(const char *path);
340 /**
341  * Default 'file://' protocol callbacks
342  */
343 XMLPUBFUN int XMLCALL
344 	xmlFileMatch			(const char *filename);
345 XMLPUBFUN void * XMLCALL
346 	xmlFileOpen			(const char *filename);
347 XMLPUBFUN int XMLCALL
348 	xmlFileRead			(void * context,
349 					 char * buffer,
350 					 int len);
351 XMLPUBFUN int XMLCALL
352 	xmlFileClose			(void * context);
353 
354 /**
355  * Default 'http://' protocol callbacks
356  */
357 #ifdef LIBXML_HTTP_ENABLED
358 XMLPUBFUN int XMLCALL
359 	xmlIOHTTPMatch			(const char *filename);
360 XMLPUBFUN void * XMLCALL
361 	xmlIOHTTPOpen			(const char *filename);
362 #ifdef LIBXML_OUTPUT_ENABLED
363 XMLPUBFUN void * XMLCALL
364 	xmlIOHTTPOpenW			(const char * post_uri,
365 					 int   compression );
366 #endif /* LIBXML_OUTPUT_ENABLED */
367 XMLPUBFUN int XMLCALL
368 	xmlIOHTTPRead			(void * context,
369 					 char * buffer,
370 					 int len);
371 XMLPUBFUN int XMLCALL
372 	xmlIOHTTPClose			(void * context);
373 #endif /* LIBXML_HTTP_ENABLED */
374 
375 /**
376  * Default 'ftp://' protocol callbacks
377  */
378 #ifdef LIBXML_FTP_ENABLED
379 XMLPUBFUN int XMLCALL
380 	xmlIOFTPMatch			(const char *filename);
381 XMLPUBFUN void * XMLCALL
382 	xmlIOFTPOpen			(const char *filename);
383 XMLPUBFUN int XMLCALL
384 	xmlIOFTPRead			(void * context,
385 					 char * buffer,
386 					 int len);
387 XMLPUBFUN int XMLCALL
388 	xmlIOFTPClose			(void * context);
389 #endif /* LIBXML_FTP_ENABLED */
390 
391 #ifdef __cplusplus
392 }
393 #endif
394 
395 #endif /* __XML_IO_H__ */
396