1 /*
2    WebDAV 207 multi-status response handling
3    Copyright (C) 1999-2003, Joe Orton <joe@manyfish.co.uk>
4 
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public
7    License as published by the Free Software Foundation; either
8    version 2 of the License, or (at your option) any later version.
9 
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14 
15    You should have received a copy of the GNU Library General Public
16    License along with this library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18    MA 02111-1307, USA
19 
20 */
21 
22 #ifndef DAV207_H
23 #define DAV207_H
24 
25 #include "ne_xml.h"
26 #include "ne_request.h" /* for ne_request */
27 
28 BEGIN_NEON_DECLS
29 
30 /* The defined state integer for the '{DAV:}prop' element. */
31 #define NE_207_STATE_PROP (50)
32 /* This interface reserves the state integers 'x' where 0 < x < 100 */
33 #define NE_207_STATE_TOP (100)
34 
35 /* Handling of 207 multistatus XML documents.  A "multistatus"
36  * document is made up of a set of responses, each concerned with a
37  * particular resource.  Each response may have an associated result
38  * status and failure description.  A response is made up of a set of
39  * propstats, each of which again may have an associated result status
40  * and failure description. */
41 
42 /* Start and end response callbacks trigger at the start and end of
43  * each "response" within the multistatus body. 'href' gives the URI
44  * of the resource which is subject of this response.  The return
45  * value of a 'start_response' callback is passed as the 'response'
46  * parameter to the corresponding 'end_response' parameter. */
47 typedef void *ne_207_start_response(void *userdata, const char *href);
48 typedef void ne_207_end_response(void *userdata, void *response,
49                                  const ne_status *status,
50                                  const char *description);
51 
52 /* Similarly, start and end callbacks for each propstat within the
53  * response.  The return value of the 'start_response' callback for
54  * the response in which this propstat is contains is passed as the
55  * 'response' parameter.  The return value of each 'start_propstat' is
56  * passed as the 'propstat' parameter' to the corresponding
57  * 'end_propstat' callback. */
58 typedef void *ne_207_start_propstat(void *userdata, void *response);
59 typedef void ne_207_end_propstat(void *userdata, void *propstat,
60                                  const ne_status *status,
61                                  const char *description);
62 
63 typedef struct ne_207_parser_s ne_207_parser;
64 
65 /* Create 207 parser an add the handlers the the given parser's
66  * handler stack. */
67 ne_207_parser *ne_207_create(ne_xml_parser *parser, void *userdata);
68 
69 /* Register response handling callbacks. */
70 void ne_207_set_response_handlers(ne_207_parser *p,
71                                   ne_207_start_response *start,
72                                   ne_207_end_response *end);
73 
74 /* Register propstat handling callbacks. */
75 void ne_207_set_propstat_handlers(ne_207_parser *p,
76                                   ne_207_start_propstat *start,
77                                   ne_207_end_propstat *end);
78 
79 /* Destroy the parser */
80 void ne_207_destroy(ne_207_parser *p);
81 
82 /* An acceptance function which only accepts 207 responses */
83 int ne_accept_207(void *userdata, ne_request *req, const ne_status *status);
84 
85 void *ne_207_get_current_propstat(ne_207_parser *p);
86 void *ne_207_get_current_response(ne_207_parser *p);
87 
88 /* Dispatch request 'req', returning:
89  *  NE_ERROR: for a dispatch error, or a non-2xx response, or a
90  *            207 response which contained a non-2xx propstat
91  *  NE_OK: for a 2xx response or a 207 response which contained
92  *            only 2xx-class propstats.
93  * The request object is destroyed in both cases. */
94 int ne_simple_request(ne_session *sess, ne_request *req);
95 
96 END_NEON_DECLS
97 
98 #endif /* DAV207_H */
99