#include <simgear/compiler.h>
#include <simgear/debug/logstream.hxx>
+#include <simgear/misc/commands.hxx>
#include <simgear/misc/strutils.hxx>
-#include <simgear/misc/props.hxx>
-#include <simgear/misc/props_io.hxx>
+#include <simgear/props/props.hxx>
+#include <simgear/props/props_io.hxx>
#include STL_STRSTREAM
void
PropsChannel::node_not_found_error( const string& node_name )
{
- string error = "ERR Node \"";
+ string error = "-ERR Node \"";
error += node_name;
error += "\" not found.";
push( error.c_str() );
}
else if ( command == "set" )
{
- if ( tokens.size() == 3 )
- {
- node->getNode( tokens[1].c_str(), true )->setStringValue(tokens[2].c_str());
+ if ( tokens.size() >= 2 )
+ {
+ string value, tmp;
+ if ( tokens.size() == 3 ) {
+ value = tokens[2];
+ } else {
+ value = "";
+ }
+ node->getNode( tokens[1].c_str(), true )
+ ->setStringValue(value.c_str());
if ( mode == PROMPT )
{
// now fetch and write out the new value as confirmation
// of the change
- string value = node->getStringValue ( tokens[1].c_str(), "" );
- string tmp = tokens[1] + " = '" + value + "' (";
+ value = node->getStringValue ( tokens[1].c_str(), "" );
+ tmp = tokens[1] + " = '" + value + "' (";
tmp += getValueTypeString( node->getNode( tokens[1].c_str() ) );
tmp += ")";
push( tmp.c_str() );
push( getTerminator() );
}
+ }
+ }
+ else if ( command == "run" )
+ {
+ if ( tokens.size() == 2 )
+ {
+ string tmp;
+ SGPropertyNode args;
+ if ( !globals->get_commands()
+ ->execute(tokens[1].c_str(), &args) )
+ {
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "Command " << tokens[1] << " failed.");
+ if ( mode == PROMPT ) {
+ tmp += "*failed*";
+ push( tmp.c_str() );
+ push( getTerminator() );
+ }
+ } else {
+ if ( mode == PROMPT ) {
+ tmp += "<completed>";
+ push( tmp.c_str() );
+ push( getTerminator() );
+ }
+ }
}
}
else if (command == "quit")
prompt switch to interactive mode (default)\r\n\
pwd display your current path\r\n\
quit terminate connection\r\n\
+run <command> run built in command\r\n\
set <var> <val> set <var> to a new <val>\r\n\
show <var> synonym for get\r\n";
push( msg );
// tokens:
// props,port#
// props,medium,direction,hz,hostname,port#,style
- if (tokens.size() == 2)
+ if (tokens.size() == 2) {
port = atoi( tokens[1].c_str() );
- else if (tokens.size() == 7)
+ set_hz( 5 ); // default to processing requests @ 5Hz
+ } else if (tokens.size() == 7) {
+ char* endptr;
+ errno = 0;
+ int hz = strtol( tokens[3].c_str(), &endptr, 10 );
+ if (errno != 0) {
+ SG_LOG( SG_IO, SG_ALERT, "I/O poll frequency out of range" );
+ set_hz( 5 ); // default to processing requests @ 5Hz
+ } else {
+ SG_LOG( SG_IO, SG_INFO, "Setting I/O poll frequency to "
+ << hz << " Hz");
+ set_hz( hz );
+ }
port = atoi( tokens[5].c_str() );
- else
+ } else {
throw FGProtocolConfigError( "FGProps: incorrect number of configuration arguments" );
+ }
}
/**
netChannel::listen( 5 );
SG_LOG( SG_IO, SG_INFO, "Props server started on port " << port );
- set_hz( 5 ); // default to processing requests @ 5Hz
set_enabled( true );
return true;
}