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
This commit is contained in:
parent
f07771f3d5
commit
7c2ce9acf7
1 changed files with 46 additions and 2 deletions
|
@ -23,12 +23,52 @@
|
|||
#include <simgear/props/props.hxx>
|
||||
#include <simgear/structure/commands.hxx>
|
||||
#include <Main/globals.hxx>
|
||||
#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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue