web_main.c
changeset 27 1e79b4cc8f1b
parent 26 6d615203d963
--- 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");