/*
 * webkernel.h
 *
 * A small embeddable web server.
 *
 * Header file.
 *
 * Author: Dario Rodriguez dario@softhome.net
 * This library is licensed on the terms of the GNU LGPL v2+
 */

#ifndef WEBKERNEL_H
#define WEBKERNEL_H
#include <sys/select.h>
#include "sbuf.h"
#include "socklib.h"

typedef void wk;
typedef enum wk_event {
        wke_init=0,
        wke_fini,
        wke_connected,
        wke_closed,
} wk_event;

typedef struct wk_uri {
        char *method;
        char *protocol;
        char *path;
        char *query;
        char *headers;
        void *uriuserptr;
} wk_uri;

typedef enum wk_error {
        wkerr_notfound=404,
        wkerr_internal=500,
        wkerr_notimplemented=501,
} wk_error;

typedef enum wk_action {
        wkact_finished=0,
        wkact_continuation,
} wk_action;

wk *wk_init(int serverfd, sselect *ssel, void (*callback_event)(/*wk *web,int connid, wk_event event, void *userptr*/), wk_action (*callback_http)(/*wk *web,int connid, wk_uri *uri, void *userptr*/),wk_action (*callback_post)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), wk_action (*callback_continuation)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), void *userptr);
void wk_free(wk *web);

wk_uri *wk_geturi(wk *web, int connid); /* for use in callback_event() when wke_closed */

int wk_service(wk *web); /* To be called after sselelect_wait() but before sselect_getXXX() */

int wk_serve_cookieadd(wk *web, int connid, char *cookiename, char *value, char *domain, int maxage, char *attributes);
int wk_serve_etagset(wk *web, int connid, char *etag);
int wk_serve_generic_headers(wk *web, int connid, int datalen, const char *mime, int *etagnotmodified);
int wk_serve_buffer_as_file(wk *web, int connid, void *data, int datalen, const char *mime);
int wk_serve_file(wk *web, int connid, char *filename, const char *mime);
int wk_serve_error(wk *web, int connid, wk_error wkerror);
int wk_serve_redirect(wk *web, int connid, char *newlocation);
int wk_writestr(wk *web, int connid, const char *str);
int wk_write(wk *web, int connid, const void *data, int datalen);
int wk_close(wk *web, int connid);

char *wk_uri_getheader(wk_uri *wkuri, char *header, char *defaultvalue);
char *wk_uri_getheaderbynum(wk_uri *wkuri, int num);

char *wk_uri_getvar(wk_uri *wkuri, char *varname, int *len);
char *wk_uri_copyvar(wk_uri *uri, char *varname, char *dest, int destlen);
char *wk_uri_getcookie(wk_uri *uri, char *cookiename, int *len);
char *wk_uri_copycookie(wk_uri *uri, char *cookiename, char *dest, int destlen);

int wk_post_addvalid(wk *web, int connid, char *varname, char *tofile);
char *wk_post_get(wk *web, int connid, char *varname, int *isfile);

const char *mime_getdefault(const char *filename, const char *defaultmime);
int uri_urldecode(char *component); /* simple decoder for url-encoded strings. In-place substitution, outputs UTF-8 data */

int wk_sbufacquire(wk *web);
sbuf *wk_sbufget(wk *web, int sbufid);
int wk_sbufrelease(wk *web, int sbufid);

#endif