30#include "../ows/ows.h"
46 wr->propertyname = NULL;
55 wr->resulttype = NULL;
60 wr->insert_results = NULL;
61 wr->delete_results = 0;
62 wr->update_results = 0;
76 fprintf(output,
"[\n");
78 fprintf(output,
" request -> %i\n", wr->request);
79 fprintf(output,
" format -> %i\n", wr->format);
80 fprintf(output,
" maxfeatures -> %i\n", wr->maxfeatures);
83 fprintf(output,
" typename -> ");
85 fprintf(output,
"\n");
88 if (wr->propertyname) {
89 fprintf(output,
"propertyname -> ");
91 fprintf(output,
"\n");
95 fprintf(output,
"bbox -> ");
97 fprintf(output,
"\n");
101 fprintf(output,
"srs -> ");
103 fprintf(output,
"\n");
107 fprintf(output,
" featureid -> ");
109 fprintf(output,
"\n");
113 fprintf(output,
" filter -> ");
115 fprintf(output,
"\n");
119 fprintf(output,
" operation -> ");
121 fprintf(output,
"\n");
125 fprintf(output,
" handle -> ");
127 fprintf(output,
"\n");
130 if (wr->resulttype) {
131 fprintf(output,
" resulttype -> ");
133 fprintf(output,
"\n");
137 fprintf(output,
" sortby -> ");
139 fprintf(output,
"\n");
143 fprintf(output,
" sections -> ");
145 fprintf(output,
"\n");
148 if (wr->insert_results) {
149 fprintf(output,
" insert_results -> ");
151 fprintf(output,
"\n");
155 fprintf(output,
" callback -> ");
157 fprintf(output,
"\n");
160 fprintf(output,
"]\n");
172 if (wr->typename)
list_free(wr->typename);
173 if (wr->propertyname)
mlist_free(wr->propertyname);
182 if (wr->sections)
list_free(wr->sections);
183 if (wr->insert_results)
alist_free(wr->insert_results);
196 assert(o && wr && cgi);
203 "VERSION parameter is not valid (use 1.0.0 or 1.1.0)",
"version");
216 assert(o && wr && layer_name);
222 for (ln = wr->typename->first ; ln ; ln = ln->
next) {
237 "Not retrievable layer(s), Forbidden operation.",
"typename");
245 "Not writable layer(s), Forbidden Transaction Operation",
"typename");
271 assert(o && wr && layer_name);
281 if (f->
size != wr->typename->size) {
284 "featureid list and typename lists must have the same size",
"");
288 ln_tpn = wr->typename->first;
291 for (mln = f->
first ; mln ; mln = mln->
next) {
318 if (!wr->typename && !
in_list(layer_name, layer))
336 "Not-retrievable layer(s), GetFeature Operation not allowed",
347 "Not-writable layer(s), Transaction Operation not allowed",
355 if (wr->typename) ln_tpn = ln_tpn->
next;
373 assert(o && wr && layer_name);
384 if (wr->typename && wr->typename->first->next) {
388 if (srid != srid_tmp) {
390 "Layers in TYPENAME must have the same SRS",
"GetFeature");
398 "The srsName value use an unsupported value, for requested layer(s)",
"GetFeature");
404 wr->srs->honours_authority_axis_order =
true;
405 wr->srs->is_long =
true;
412 "The srsName value use an unsupported value, for requested layer(s)",
"GetFeature");
426 bool honours_authority_axis_order_if_no_explicit_srs =
false;
428 assert(o && wr && layer_name && wr->srs);
436 srid = wr->srs->srid;
438 honours_authority_axis_order_if_no_explicit_srs =
true;
442 "Bad parameters for Bbox, must be Xmin,Ymin,Xmax,Ymax[,crsuri]",
"NULL");
487 "OutputFormat is not supported",
"GetFeature");
517 "ResultType isn't valid, must be results or hits",
"resultType");
538 for (ln = l->
first ; ln ; ln = ln->
next) {
589 if (mf > 0) wr->maxfeatures = mf;
591 "MaxFeatures isn't valid, must be > 0",
"GetFeature");
603 assert(o && prop && layer_name);
607 for (ln = ns->
first ; ln ; ln = ln->
next) {
633 assert(o && wr && layer_name);
645 "propertyname list size and typename list size must be similar",
"GetFeature");
649 for (mln = f->
first, ln_tpn = layer_name->
first ; mln ; mln = mln->
next, ln_tpn = ln_tpn->
next) {
663 "PropertyName values not available",
"GetFeature");
669 wr->propertyname = f;
688 if (wr->filter->size != wr->typename->size)
690 "Filter list size and typename list size must be similar",
"GetFeature");
715 "Only Delete operation is supported with GET method, use POST method for insert and update operations",
739 "FILTER, BBOX and FEATUREID are mutually exclusive, just use one of these parameters",
"request");
751 bool version =
false;
753 assert(o && wr && cgi);
768 for (ln = l->
first ; ln ; ln = ln->
next) {
769 if (version ==
false) {
782 if (version ==
false) {
784 "VERSION parameter is not valid (use 1.0.0 or 1.1.0)",
796 "UPDATESEQUENCE value must be omit or 0, function not (yet) implemented",
816 "Not supported format : use text/xml or application/xml",
"acceptFormats");
828 assert(o && wr && cgi);
856 assert(o && wr && cgi);
887 assert(o && wr && cgi);
908 assert(o && wr && cgi);
942 "REQUEST is not supported",
"REQUEST");
955 switch (wf->request) {
975 "Only Delete Operation is supported with GET method, use POST instead for Insert and Update.",
void wfs_get_capabilities(ows *o, wfs_request *wr)
void ows_bbox_free(ows_bbox *b)
void alist_free(alist *al)
int ows_version_get(ows_version *v)
bool ows_layer_in_list(const ows_layer_list *ll, buffer *name)
void list_add_by_copy(list *l, buffer *value)
void buffer_empty(buffer *buf)
ows_bbox * ows_bbox_init()
list * list_explode_start_end(char separator_start, char separator_end, buffer *value)
void buffer_copy(buffer *dest, const buffer *src)
bool buffer_cmp(const buffer *buf, const char *str)
buffer * fe_xpath_property_name(ows *o, buffer *typename, buffer *property)
bool in_list(const list *l, const buffer *value)
void buffer_add_str(buffer *buf, const char *str)
void list_flush(const list *l, FILE *output)
void buffer_flush(buffer *buf, FILE *output)
void wfs_delete(ows *o, wfs_request *wr)
bool buffer_case_cmp(const buffer *buf, const char *str)
bool ows_srs_set_from_srsname(ows *o, ows_srs *s, const char *srsname)
bool ows_layer_match_table(const ows *o, const buffer *name)
void ows_bbox_flush(const ows_bbox *b, FILE *output)
bool ows_srs_set_from_srid(ows *o, ows_srs *s, int srid)
void wfs_describe_feature_type(ows *o, wfs_request *wr)
buffer * array_get(const array *a, const char *key)
void alist_flush(const alist *al, FILE *output)
void wfs_error(ows *o, wfs_request *wf, enum wfs_error_code code, char *message, char *locator)
void ows_error(ows *o, enum ows_error_code code, char *message, char *locator)
bool ows_bbox_set_from_str(ows *o, ows_bbox *bb, const char *str, int srid, bool honours_authority_axis_order_if_no_explicit_srs)
bool buffer_ncmp(const buffer *buf, const char *str, size_t n)
mlist * mlist_explode(char separator_start, char separator_end, buffer *value)
void wfs_parse_operation(ows *o, wfs_request *wr, buffer *op)
void buffer_add_head_str(buffer *buf, char *str)
buffer * ows_layer_no_uri_to_uri(const ows_layer_list *ll, buffer *name_no_uri)
bool array_is_key(const array *a, const char *key)
void ows_srs_flush(ows_srs *c, FILE *output)
bool ows_layer_retrievable(const ows_layer_list *ll, const buffer *name)
list * ows_layer_list_ns_prefix(ows_layer_list *ll, list *layer_name_prefix)
array * ows_psql_describe_table(ows *o, buffer *layer_name)
void buffer_free(buffer *buf)
void mlist_flush(const mlist *ml, FILE *output)
void wfs_get_feature(ows *o, wfs_request *wr)
void buffer_shift(buffer *buf, size_t len)
list * list_split(char separator, const buffer *value, bool reverse)
int ows_srs_get_srid_from_layer(ows *o, buffer *layer_name)
void wfs_request_flush(wfs_request *wr, FILE *output)
void ows_srs_free(ows_srs *c)
void ows_version_set(ows_version *v, int major, int minor, int release)
bool ows_layer_writable(const ows_layer_list *ll, const buffer *name)
list * list_explode(char separator, const buffer *value)
bool check_regexp(const char *str_request, const char *str_regex)
buffer * ows_layer_prefix_to_uri(ows_layer_list *ll, buffer *layer_name_prefix)
void mlist_free(mlist *ml)
@ WFS_ERROR_EXCLUSIVE_PARAMETERS
@ WFS_ERROR_INCORRECT_SIZE_PARAMETER
@ WFS_ERROR_LAYER_NOT_WRITABLE
@ WFS_ERROR_OUTPUT_FORMAT_NOT_SUPPORTED
@ WFS_ERROR_LAYER_NOT_RETRIEVABLE
@ WFS_ERROR_LAYER_NOT_DEFINED
@ OWS_ERROR_OPERATION_NOT_SUPPORTED
@ OWS_ERROR_VERSION_NEGOTIATION_FAILED
@ OWS_ERROR_MISSING_PARAMETER_VALUE
@ OWS_ERROR_INVALID_PARAMETER_VALUE
@ OWS_ERROR_INVALID_UPDATE_SEQUENCE
@ WFS_DESCRIBE_FEATURE_TYPE
char * buf
size to next realloc
struct Ows_layer_node * next
ows_version * wfs_default_version
static list * wfs_request_check_fid(ows *o, wfs_request *wr, list *layer_name)
static void wfs_request_check_get_capabilities(ows *o, wfs_request *wr, const array *cgi)
static void wfs_request_check_propertyname(ows *o, wfs_request *wr, list *layer_name)
buffer * wfs_request_remove_prop_ns_prefix(ows *o, buffer *prop, list *layer_name)
static void wfs_request_check_operation(ows *o, wfs_request *wr)
void wfs_request_free(wfs_request *wr)
static void wfs_request_check_resulttype(ows *o, wfs_request *wr)
void wfs_request_check(ows *o, wfs_request *wr, const array *cgi)
static void wfs_request_check_maxfeatures(ows *o, wfs_request *wr)
wfs_request * wfs_request_init()
static void wfs_request_check_output(ows *o, wfs_request *wr)
static list * wfs_request_check_typename(ows *o, wfs_request *wr, list *layer_name)
static void wfs_request_check_get_feature(ows *o, wfs_request *wr, const array *cgi)
static void wfs_request_check_describe_feature_type(ows *o, wfs_request *wr, const array *cgi)
static void wfs_request_check_filter(ows *o, wfs_request *wr)
static void wfs_request_check_srs(ows *o, wfs_request *wr, list *layer_name)
static void wfs_request_check_version(ows *o, wfs_request *wr, const array *cgi)
static void wfs_request_check_sortby(ows *o, wfs_request *wr, list *layer_name)
static void wfs_request_check_parameters(ows *o, wfs_request *wr)
static void wfs_request_check_bbox(ows *o, wfs_request *wr, list *layer_name)
void wfs(ows *o, wfs_request *wf)
static void wfs_request_check_transaction(ows *o, wfs_request *wr, const array *cgi)