diff options
Diffstat (limited to 'src/emu/webengine.c')
-rw-r--r-- | src/emu/webengine.c | 105 |
1 files changed, 52 insertions, 53 deletions
diff --git a/src/emu/webengine.c b/src/emu/webengine.c index 292eb6b0dfc..67cc254ac7e 100644 --- a/src/emu/webengine.c +++ b/src/emu/webengine.c @@ -48,18 +48,18 @@ // WEB ENGINE //************************************************************************** -void web_engine::websocket_ready_handler(struct mg_connection *conn) { +void web_engine::websocket_ready_handler(struct mg_connection *conn) { static const char *message = "update_machine"; mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, message, strlen(message)); m_websockets.append(*global_alloc(simple_list_wrapper<mg_connection>(conn))); -} +} // Arguments: // flags: first byte of websocket frame, see websocket RFC, // http://tools.ietf.org/html/rfc6455, section 5.2 // data, data_len: payload data. Mask, if any, is already applied. int web_engine::websocket_data_handler(struct mg_connection *conn, int flags, - char *data, size_t data_len) + char *data, size_t data_len) { // just Echo example for now if ((flags & 0x0f) == WEBSOCKET_OPCODE_TEXT) @@ -68,15 +68,15 @@ int web_engine::websocket_data_handler(struct mg_connection *conn, int flags, // Returning zero means stoping websocket conversation. // Close the conversation if client has sent us "exit" string. return memcmp(data, "exit", 4); -} +} static void get_qsvar(const struct mg_request_info *request_info, - const char *name, char *dst, size_t dst_len) { - const char *qs = request_info->query_string; - mg_get_var(qs, strlen(qs == NULL ? "" : qs), name, dst, dst_len); + const char *name, char *dst, size_t dst_len) { + const char *qs = request_info->query_string; + mg_get_var(qs, strlen(qs == NULL ? "" : qs), name, dst, dst_len); } -int web_engine::json_game_handler(struct mg_connection *conn) +int web_engine::json_game_handler(struct mg_connection *conn) { Json::Value data; data["name"] = m_machine->system().name; @@ -103,12 +103,12 @@ int web_engine::json_game_handler(struct mg_connection *conn) return 1; } -int web_engine::json_slider_handler(struct mg_connection *conn) +int web_engine::json_slider_handler(struct mg_connection *conn) { const slider_state *curslider; astring tempstring; Json::Value array(Json::arrayValue); - + /* add all sliders */ for (curslider = ui_get_slider_list(); curslider != NULL; curslider = curslider->next) { @@ -151,29 +151,29 @@ int web_engine::json_slider_handler(struct mg_connection *conn) } // This function will be called by mongoose on every new request. -int web_engine::begin_request_handler(struct mg_connection *conn) +int web_engine::begin_request_handler(struct mg_connection *conn) { const struct mg_request_info *request_info = mg_get_request_info(conn); - if (!strncmp(request_info->uri, "/json/",6)) + if (!strncmp(request_info->uri, "/json/",6)) { - if (!strcmp(request_info->uri, "/json/game")) + if (!strcmp(request_info->uri, "/json/game")) { return json_game_handler(conn); - } - if (!strcmp(request_info->uri, "/json/slider")) + } + if (!strcmp(request_info->uri, "/json/slider")) { return json_slider_handler(conn); - } + } } - else if (!strncmp(request_info->uri, "/cmd",4)) + else if (!strncmp(request_info->uri, "/cmd",4)) { char cmd_name[64]; get_qsvar(request_info, "name", cmd_name, sizeof(cmd_name)); - + if(!strcmp(cmd_name,"softreset")) { m_machine->schedule_soft_reset(); - } + } else if(!strcmp(cmd_name,"hardreset")) { m_machine->schedule_hard_reset(); @@ -181,8 +181,8 @@ int web_engine::begin_request_handler(struct mg_connection *conn) else if(!strcmp(cmd_name,"exit")) { m_machine->schedule_exit(); - } - + } + // Send HTTP reply to the client mg_printf(conn, "HTTP/1.1 200 OK\r\n" @@ -195,7 +195,7 @@ int web_engine::begin_request_handler(struct mg_connection *conn) // the client, and mongoose should not send client any more data. return 1; } - else if (!strncmp(request_info->uri, "/slider",7)) + else if (!strncmp(request_info->uri, "/slider",7)) { char cmd_id[64]; char cmd_val[64]; @@ -206,17 +206,17 @@ int web_engine::begin_request_handler(struct mg_connection *conn) const slider_state *curslider; for (curslider = ui_get_slider_list(); curslider != NULL; curslider = curslider->next) { - if (cnt==id) + if (cnt==id) (*curslider->update)(machine(), curslider->arg, NULL, atoi(cmd_val)); cnt++; } for (curslider = (slider_state*)machine().osd().get_slider_list(); curslider != NULL; curslider = curslider->next) { - if (cnt==id) + if (cnt==id) (*curslider->update)(machine(), curslider->arg, NULL, atoi(cmd_val)); cnt++; } - + // Send HTTP reply to the client mg_printf(conn, "HTTP/1.1 200 OK\r\n" @@ -229,7 +229,7 @@ int web_engine::begin_request_handler(struct mg_connection *conn) // the client, and mongoose should not send client any more data. return 1; } - else if (!strncmp(request_info->uri, "/screenshot.png",15)) + else if (!strncmp(request_info->uri, "/screenshot.png",15)) { screen_device_iterator iter(m_machine->root_device()); screen_device *screen = iter.first(); @@ -251,25 +251,25 @@ int web_engine::begin_request_handler(struct mg_connection *conn) m_machine->video().save_snapshot(screen, file); astring fullpath(file.fullpath()); file.close(); - + mg_send_file(conn,fullpath); return 1; } return 0; -} +} -void *web_engine::websocket_keepalive() +void *web_engine::websocket_keepalive() { - while(!m_exiting_core) + while(!m_exiting_core) { - osd_ticks_t curtime = osd_ticks(); + osd_ticks_t curtime = osd_ticks(); if ((curtime - m_lastupdatetime) > osd_ticks_per_second() * 5) { m_lastupdatetime = curtime; for (simple_list_wrapper<mg_connection> *curitem = m_websockets.first(); curitem != NULL; curitem = curitem->next()) { - int status = mg_websocket_write(curitem->object(), WEBSOCKET_OPCODE_PING, NULL, 0); + int status = mg_websocket_write(curitem->object(), WEBSOCKET_OPCODE_PING, NULL, 0); if (status==0) m_websockets.detach(*curitem); // remove inactive clients } } @@ -284,26 +284,26 @@ void *web_engine::websocket_keepalive() static void websocket_ready_handler_static(struct mg_connection *conn) { const struct mg_request_info *request_info = mg_get_request_info(conn); - web_engine *engine = static_cast<web_engine *>(request_info->user_data); + web_engine *engine = static_cast<web_engine *>(request_info->user_data); engine->websocket_ready_handler(conn); } static int websocket_data_handler_static(struct mg_connection *conn, int flags, - char *data, size_t data_len) + char *data, size_t data_len) { const struct mg_request_info *request_info = mg_get_request_info(conn); - web_engine *engine = static_cast<web_engine *>(request_info->user_data); + web_engine *engine = static_cast<web_engine *>(request_info->user_data); return engine->websocket_data_handler(conn, flags, data, data_len); } -static int begin_request_handler_static(struct mg_connection *conn) +static int begin_request_handler_static(struct mg_connection *conn) { - const struct mg_request_info *request_info = mg_get_request_info(conn); - web_engine *engine = static_cast<web_engine *>(request_info->user_data); + const struct mg_request_info *request_info = mg_get_request_info(conn); + web_engine *engine = static_cast<web_engine *>(request_info->user_data); return engine->begin_request_handler(conn); } -static void *websocket_keepalive_static(void *thread_func_param) +static void *websocket_keepalive_static(void *thread_func_param) { web_engine *engine = static_cast<web_engine *>(thread_func_param); return engine->websocket_keepalive(); @@ -315,35 +315,34 @@ static void *websocket_keepalive_static(void *thread_func_param) web_engine::web_engine(emu_options &options) : m_options(options), - m_machine(NULL), - m_ctx(NULL), - m_lastupdatetime(0), - m_exiting_core(false) - + m_machine(NULL), + m_ctx(NULL), + m_lastupdatetime(0), + m_exiting_core(false) + { - struct mg_callbacks callbacks; // List of options. Last element must be NULL. const char *web_options[] = { - "listening_ports", options.http_port(), + "listening_ports", options.http_port(), "document_root", options.http_path(), NULL }; - // Prepare callbacks structure. + // Prepare callbacks structure. memset(&callbacks, 0, sizeof(callbacks)); callbacks.begin_request = begin_request_handler_static; - callbacks.websocket_ready = websocket_ready_handler_static; - callbacks.websocket_data = websocket_data_handler_static; + callbacks.websocket_ready = websocket_ready_handler_static; + callbacks.websocket_data = websocket_data_handler_static; // Start the web server. if (m_options.http()) { m_ctx = mg_start(&callbacks, this, web_options); - + mg_start_thread(websocket_keepalive_static, this); } - + } //------------------------------------------------- @@ -368,7 +367,7 @@ void web_engine::close() { mg_websocket_write(curitem->object(), WEBSOCKET_OPCODE_CONNECTION_CLOSE, NULL, 0); } - // Stop the server. + // Stop the server. mg_stop(m_ctx); } @@ -376,7 +375,7 @@ void web_engine::close() void web_engine::push_message(const char *message) { for (simple_list_wrapper<mg_connection> *curitem = m_websockets.first(); curitem != NULL; curitem = curitem->next()) - { + { int status = mg_websocket_write(curitem->object(), WEBSOCKET_OPCODE_TEXT, message, strlen(message)); if (status==0) m_websockets.detach(*curitem); // remove inactive clients } |