From 7c2ce9acf757b37f01569a7eb5948485a6d3469d Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Mon, 10 Mar 2014 22:58:52 +0100 Subject: [PATCH] allow binding of arguments for fg-commands thru run.cgi to run a fg-command with args, POST run.cgi?value=my-command and post the args node as JSON content like this: { name: '', children: [ { name: 'property', index: 0, value: 'first-value is here' }, { name: 'property', index: 1, value: 'first-value is here' } ] } or whatever arguments the requested command takes --- src/Network/http/RunUriHandler.cxx | 48 ++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/Network/http/RunUriHandler.cxx b/src/Network/http/RunUriHandler.cxx index 798a81874..c0e5bac48 100644 --- a/src/Network/http/RunUriHandler.cxx +++ b/src/Network/http/RunUriHandler.cxx @@ -23,12 +23,52 @@ #include #include #include
+#include <3rdparty/cjson/cJSON.h> + using std::string; namespace flightgear { namespace http { +static void JsonToProp( cJSON * json, SGPropertyNode_ptr base ) +{ + if( NULL == json ) return; + + cJSON * cj = cJSON_GetObjectItem( json, "name" ); + if( NULL == cj ) return; // a node with no name? + char * name = cj->valuestring; + if( NULL == name ) return; // still no name? + + //TODO: check valid name + + int index = 0; + cj = cJSON_GetObjectItem( json, "index" ); + if( NULL != cj ) index = cj->valueint; + if( index < 0 ) return; + + SGPropertyNode_ptr n = base->getNode( name, index, true ); + cJSON * children = cJSON_GetObjectItem( json, "children" ); + if( NULL != children ) { + for( int i = 0; i < cJSON_GetArraySize( children ); i++ ) { + JsonToProp( cJSON_GetArrayItem( children, i ), n ); + } + } else { + //TODO: set correct type +/* + char * type = ""; + cj = cJSON_GetObjectItem( json, "type" ); + if( NULL != cj ) type = cj->valuestring; +*/ + char * value = NULL; + cj = cJSON_GetObjectItem( json, "value" ); + if( NULL != cj ) value = cj->valuestring; + + if( NULL != value ) + n->setUnspecifiedValue( value ); + } +} + bool RunUriHandler::handleRequest( const HTTPRequest & request, HTTPResponse & response ) { response.Header["Content-Type"] = "text/plain"; @@ -39,8 +79,12 @@ bool RunUriHandler::handleRequest( const HTTPRequest & request, HTTPResponse & r return true; } - SGPropertyNode args; - if ( globals->get_commands()->execute(command.c_str(), &args) ) { + SGPropertyNode_ptr args = new SGPropertyNode(); + cJSON * json = cJSON_Parse( request.Content.c_str() ); + JsonToProp( json, args ); + + cJSON_Delete( json ); + if ( globals->get_commands()->execute(command.c_str(), args) ) { response.Content = "ok."; return true; } -- 2.39.5