X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-hreq.c;h=16114675a08001310630b132e0086bdf0b48261d;hb=1205c90cccd3144bab24b4b5fd8dcbf0d0e6b570;hp=60ff6b0167d3d963f69b6ec2d61763213a69c7d0;hpb=cc4b56b6710624c069642d1a510d0060949fe5b9;p=src%2Fapp-framework-binder.git diff --git a/src/afb-hreq.c b/src/afb-hreq.c index 60ff6b01..16114675 100644 --- a/src/afb-hreq.c +++ b/src/afb-hreq.c @@ -36,6 +36,12 @@ struct hreq_data { char *value; }; +static const struct afb_req_itf afb_hreq_itf = { + .argument = (void*)afb_hreq_get_argument, + .is_argument_file = (void*)afb_hreq_is_argument_a_file, + .iterate_arguments = (void*)afb_hreq_iterate_arguments +}; + static struct hreq_data *get_data(struct afb_hreq *hreq, const char *key, int create) { struct hreq_data *data = hreq->data; @@ -279,12 +285,6 @@ const char *afb_hreq_get_header(struct afb_hreq *hreq, const char *name) return MHD_lookup_connection_value(hreq->connection, MHD_HEADER_KIND, name); } -const struct afb_req_itf afb_hreq_itf = { - .get_cookie = (void*)afb_hreq_get_cookie, - .get_argument = (void*)afb_hreq_get_argument -}; - - void afb_hreq_post_end(struct afb_hreq *hreq) { struct hreq_data *data = hreq->data; @@ -340,3 +340,53 @@ int afb_hreq_post_add_file(struct afb_hreq *hreq, const char *key, const char *f } +int afb_hreq_is_argument_a_file(struct afb_hreq *hreq, const char *key) +{ + struct hreq_data *hdat = get_data(hreq, key, 0); + return hdat != NULL && hdat->file != 0; +} + + +struct afb_req afb_hreq_to_req(struct afb_hreq *hreq) +{ + return (struct afb_req){ .itf = &afb_hreq_itf, .data = hreq }; +} + +struct iterator_data +{ + struct afb_hreq *hreq; + int (*iterator)(void *closure, const char *key, const char *value, int isfile); + void *closure; +}; + +static int itargs(struct iterator_data *id, enum MHD_ValueKind kind, const char *key, const char *value) +{ + if (get_data(id->hreq, key, 0)) + return 1; + return id->iterator(id->closure, key, value, 0); +} + +void afb_hreq_iterate_arguments(struct afb_hreq *hreq, int (*iterator)(void *closure, const char *key, const char *value, int isfile), void *closure) +{ + struct iterator_data id = { .hreq = hreq, .iterator = iterator, .closure = closure }; + struct hreq_data *data = hreq->data; + while (data) { + if (!iterator(closure, data->key, data->value, !!data->file)) + return; + data = data->next; + } + MHD_get_connection_values (hreq->connection, MHD_GET_ARGUMENT_KIND, (void*)itargs, &id); +} + +void afb_hreq_drop_data(struct afb_hreq *hreq) +{ + struct hreq_data *data = hreq->data; + while (data) { + hreq->data = data->next; + free(data->key); + free(data->value); + free(data); + data = hreq->data; + } +} +