mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-27 10:37:49 +08:00
82 lines
3.2 KiB
C
82 lines
3.2 KiB
C
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
#include "mongoose.h"
|
||
|
|
||
|
static int static_value = 123; // Exposed and changeable via the form
|
||
|
|
||
|
static void print_html_form(struct mg_connection *conn) {
|
||
|
mg_send_header(conn, "Content-Type", "text/html");
|
||
|
mg_send_header(conn, "Cache-Control", "max-age=0, post-check=0, "
|
||
|
"pre-check=0, no-store, no-cache, must-revalidate");
|
||
|
|
||
|
// Note that all the following normally should reside in static HTML page
|
||
|
mg_printf_data(conn, "%s", "<html><head>");
|
||
|
// It is better to use local copy though
|
||
|
mg_printf_data(conn, "<script src=\"%s\"></script>",
|
||
|
"http://code.jquery.com/jquery-1.11.0.min.js");
|
||
|
mg_printf_data(conn, "%s", "<script> jQuery(function() {\n");
|
||
|
// Here is the ajax call that fetches data from the device and
|
||
|
// updates the form
|
||
|
mg_printf_data(conn, "%s", "$.ajax({ url: '/get_value', dataType: 'json', "
|
||
|
"success: function(d) { $('#val').val(d.value); }});\n");
|
||
|
// This ajax call is triggered when submit button is pressed. It sends new
|
||
|
// value to the device.
|
||
|
mg_printf_data(conn, "%s", "$(document).on('click', '#button', function() {"
|
||
|
" $.ajax({ url: '/set_value', dataType: 'json', "
|
||
|
" data: { new_value: $('#val').val() } });\n"
|
||
|
" return false; });\n");
|
||
|
mg_printf_data(conn, "%s", "});</script>");
|
||
|
mg_printf_data(conn, "%s", "</head><body>");
|
||
|
mg_printf_data(conn, "%s", "<h1>Ajax form submission example</h1>");
|
||
|
mg_printf_data(conn, "%s", "<form>");
|
||
|
mg_printf_data(conn, "%s", "Device value: <input type=text id=val />");
|
||
|
mg_printf_data(conn, "%s", "<input type=submit id=button />");
|
||
|
mg_printf_data(conn, "%s", "</form>");
|
||
|
mg_printf_data(conn, "%s", "</body></html>");
|
||
|
}
|
||
|
|
||
|
static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
|
||
|
if (ev == MG_REQUEST) {
|
||
|
if (strcmp(conn->uri, "/get_value") == 0) {
|
||
|
mg_printf_data(conn, "{\"value\": %d}", static_value);
|
||
|
} else if (strcmp(conn->uri, "/set_value") == 0) {
|
||
|
// This Ajax endpoint sets the new value for the device variable
|
||
|
char buf[100] = "";
|
||
|
mg_get_var(conn, "new_value", buf, sizeof(buf)); // Get form variable
|
||
|
static_value = atoi(buf); // Set new value
|
||
|
mg_printf_data(conn, "%s", "{\"success\": true}");
|
||
|
printf("Setting value to [%d]\n", static_value); // Debug trace
|
||
|
} else {
|
||
|
// Better way is to set "document_root" option, put "index.html" file
|
||
|
// into document_root and return MG_FALSE here. We're printing HTML
|
||
|
// page by hands just to keep everything in one C file.
|
||
|
print_html_form(conn);
|
||
|
}
|
||
|
return MG_TRUE;
|
||
|
} else if (ev == MG_AUTH) {
|
||
|
return MG_TRUE;
|
||
|
}
|
||
|
|
||
|
return MG_FALSE;
|
||
|
}
|
||
|
|
||
|
int main(void) {
|
||
|
struct mg_server *server;
|
||
|
|
||
|
// Create and configure the server
|
||
|
server = mg_create_server(NULL, ev_handler);
|
||
|
mg_set_option(server, "listening_port", "8000");
|
||
|
|
||
|
// Serve request. Hit Ctrl-C to terminate the program
|
||
|
printf("Starting on port %s\n", mg_get_option(server, "listening_port"));
|
||
|
for (;;) {
|
||
|
mg_poll_server(server, 1000);
|
||
|
}
|
||
|
|
||
|
// Cleanup, and free server instance
|
||
|
mg_destroy_server(&server);
|
||
|
|
||
|
return 0;
|
||
|
}
|