--- a/web_main.c Sun Jul 06 23:33:24 2008 +0300
+++ b/web_main.c Mon Jul 07 04:36:03 2008 +0300
@@ -23,6 +23,8 @@
#include "remote_pool.h"
#include "render_remote.h"
#include "config.h"
+#include "tile.h"
+#include "static.h"
#define MIN_CHUNK_SIZE 4096
#define OVERFLOW_BUFFER 4096
@@ -153,7 +155,7 @@
render_remote_flush(ctx->render_info);
}
-static void _http_render_execute (struct evhttp_request *request, u_int32_t img_w, u_int32_t img_h) {
+static int _http_render_execute (struct evhttp_request *request, struct render *render) {
// render request context
struct render_request *ctx = calloc(1, sizeof(struct render_request));
@@ -164,19 +166,8 @@
ctx->headers_sent = 0;
ctx->bytes_sent = 0;
- // render context
- struct render render;
-
- if (
- render_init(&render)
- || render_set_mode(&render, RENDER_PNG)
- || render_set_size(&render, img_w, img_h)
- || render_region_full(&render)
- )
- ERROR("render_*");
-
// initiate the remote render operation
- if ((ctx->render_info = render_remote(&render, &remote_pool,
+ if ((ctx->render_info = render_remote(render, &remote_pool,
&_render_sent,
&_render_data,
&_render_done,
@@ -193,43 +184,110 @@
INFO("render [%p]: started", ctx);
- return;
+ return 0;
error:
- evhttp_send_error(request, 500, "Internal Server Error");
+ _render_cleanup(ctx);
- _render_cleanup(ctx);
+ return -1;
}
/*
- * HTTP request handler
+ * HTTP request handlers
*/
void http_render (struct evhttp_request *request, void *arg) {
// gather some info about the request
const char *uri = evhttp_request_get_uri(request);
char *peer_address;
- u_short peer_port;
+ unsigned short peer_port;
+ struct render render;
evhttp_request_get_peer(request, &peer_address, &peer_port);
- unsigned long int img_w = 256, img_h = 256;
+ u_int32_t img_w = 256, img_h = 256;
// parse request arguments
struct http_qarg qarg_spec[] = {
- { "w", QARG_UINT, &img_w },
- { "h", QARG_UINT, &img_h },
- { NULL, QARG_END, NULL }
+ { "w", QARG_UINT32, &img_w, QARG_OPTIONAL },
+ { "h", QARG_UINT32, &img_h, QARG_OPTIONAL },
+ { NULL, QARG_END, NULL, 0 }
};
- http_qarg_parse(request, qarg_spec);
+ if (http_qarg_parse(request, qarg_spec))
+ goto error;
+
+ // build the render op
+ if (
+ render_init(&render)
+ || render_set_mode(&render, RENDER_PNG)
+ || render_set_size(&render, img_w, img_h)
+ || render_region_full(&render)
+ )
+ ERROR("render_*");
// request log
- INFO("REQ: [%s:%d] method=%d, uri=%s, img_w=%lu, img_h=%lu", peer_address, peer_port, evhttp_request_get_type(request), uri, img_w, img_h);
+ INFO("REQ: [%s:%d] method=%d, uri=%s, img_w=%u, img_h=%u", peer_address, peer_port, evhttp_request_get_type(request), uri, img_w, img_h);
// do it
- _http_render_execute(request, img_w, img_h);
+ if (_http_render_execute(request, &render))
+ goto error;
+
+ return;
+
+error:
+ evhttp_send_error(request, 500, "Internal Server Error");
}
+void http_tile (struct evhttp_request *request, void *arg) {
+ // gather some info about the request
+ const char *uri = evhttp_request_get_uri(request);
+ char *peer_address;
+ unsigned short peer_port;
+ struct render render;
+
+ evhttp_request_get_peer(request, &peer_address, &peer_port);
+
+ u_int32_t x, y, sw, sh;
+ u_int16_t z;
+
+ // parse request arguments
+ struct http_qarg qarg_spec[] = {
+ { "x", QARG_UINT32, &x, QARG_REQUIRED },
+ { "y", QARG_UINT32, &y, QARG_REQUIRED },
+ { "z", QARG_UINT16, &z, QARG_REQUIRED },
+ { "sw", QARG_UINT32, &sw, QARG_REQUIRED },
+ { "sh", QARG_UINT32, &sh, QARG_REQUIRED },
+ { NULL, QARG_END, NULL, 0 }
+ };
+
+ if (http_qarg_parse(request, qarg_spec))
+ goto error;
+
+ // build the render op
+ if (
+ render_init(&render)
+ || render_set_mode(&render, RENDER_PNG)
+ || render_set_tile(&render, sw, sh, x, y, z)
+ )
+ ERROR("render_*");
+
+ // request log
+ INFO("REQ: [%s:%d] method=%d, uri=%s, pos=(%u, %u), zoom=%hu, screen=[%ux%u]",
+ peer_address, peer_port, evhttp_request_get_type(request), uri, x, y, z, sw, sh);
+
+ // do it
+ if (_http_render_execute(request, &render))
+ goto error;
+
+ return;
+
+error:
+ evhttp_send_error(request, 500, "Internal Server Error");
+}
+
+/*
+ * Signal handling
+ */
struct event ev_sigint;
void sigint_handler (int signal, short event, void *arg) {
@@ -327,8 +385,19 @@
if (evhttp_bind_socket(http_server, "0.0.0.0", 8117))
FATAL("evhttp_bind_socket");
- // add our http request handler
- evhttp_set_cb(http_server, "/render", &http_render, NULL);
+ // add our http request handlers
+ evhttp_set_cb(http_server, "/render", &http_render, NULL);
+ evhttp_set_cb(http_server, "/tile", &http_tile, NULL);
+
+ // and then static files
+ struct static_file static_index;
+ struct static_dir static_files;
+
+ if (static_init(&static_index, http_server, "/", "static/index.html"))
+ FATAL("static_init: index.html");
+
+ if (static_dir_init(&static_files, http_server, "/static", "static"))
+ FATAL("static_dir_init: static");
// we shall now run
INFO("RUN 0.0.0.0:8117");