]> git.mxchange.org Git - flightgear.git/blobdiff - src/Network/props.cxx
Make several assumptions:
[flightgear.git] / src / Network / props.cxx
index 8752da41b927eb48ec5d9c2cd96ec6813d22443f..3504f99c8c75115730f0a0584e6e49310d05a8f4 100644 (file)
 
 #include <simgear/compiler.h>
 #include <simgear/debug/logstream.hxx>
+#include <simgear/structure/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
+#include <sstream>
 
 #include <Main/globals.hxx>
 #include <Main/viewmgr.hxx>
 
 #include "props.hxx"
 
-#if !defined(SG_HAVE_NATIVE_SGI_COMPILERS)
-SG_USING_STD(strstream);
+SG_USING_STD(stringstream);
 SG_USING_STD(ends);
-#endif
 
 /**
  * Props connection class.
@@ -118,7 +117,7 @@ PropsChannel::collectIncomingData( const char* s, int n )
 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() );
@@ -172,59 +171,38 @@ PropsChannel::foundTerminator()
 
     SGPropertyNode* node = globals->get_props()->getNode( path.c_str() );
 
-    if (!tokens.empty())
-    {
+    if (!tokens.empty()) {
        string command = tokens[0];
 
-       if (command == "ls")
-       {
+       if (command == "ls") {
            SGPropertyNode* dir = node;
-           if (tokens.size() == 2)
-           {
-               if (tokens[1][0] == '/')
-               {
+           if (tokens.size() == 2) {
+               if (tokens[1][0] == '/') {
                    dir = globals->get_props()->getNode( tokens[1].c_str() );
-               }
-               else
-               {
+               } else {
                    string s = path;
                    s += "/";
                    s += tokens[1];
                    dir = globals->get_props()->getNode( s.c_str() );
                }
 
-               if (dir == 0)
-               {
+               if (dir == 0) {
                    node_not_found_error( tokens[1] );
                    goto prompt;
                }
            }
 
-           for (int i = 0; i < dir->nChildren(); i++)
-           {
+           for (int i = 0; i < dir->nChildren(); i++) {
                SGPropertyNode * child = dir->getChild(i);
-               string name = child->getName();
-               string line = name;
-
-               if (dir->getChild( name.c_str(), 1 ))
-               {
-                   char buf[16];
-                   sprintf(buf, "[%d]", child->getIndex());
-                   line += buf;
-               }
+               string line = child->getDisplayName(true);
 
-               if ( child->nChildren() > 0 )
-               {
+               if ( child->nChildren() > 0 ) {
                    line += "/";
-               }
-               else
-               {
-                   if (mode == PROMPT)
-                   {
-                       string value = dir->getStringValue( name.c_str(), "" );
+               } else {
+                   if (mode == PROMPT) {
+                       string value = child->getStringValue();
                        line += " =\t'" + value + "'\t(";
-                       line += getValueTypeString(
-                                       dir->getNode( name.c_str() ) );
+                       line += getValueTypeString( child );
                        line += ")";
                    }
                }
@@ -232,75 +210,52 @@ PropsChannel::foundTerminator()
                line += getTerminator();
                push( line.c_str() );
            }
-       }
-       else if ( command == "dump" )
-       {
-           strstream buf;
-           if ( tokens.size() <= 1 )
-           {
+       } else if ( command == "dump" ) {
+           stringstream buf;
+           if ( tokens.size() <= 1 ) {
                writeProperties( buf, node );
                buf << ends; // null terminate the string
-               push( buf.str() );
+               push( buf.str().c_str() );
                push( getTerminator() );
-           }
-           else
-           {
+           } else {
                SGPropertyNode *child = node->getNode( tokens[1].c_str() );
-               if ( child )
-               {
+               if ( child ) {
                    writeProperties ( buf, child );
                    buf << ends; // null terminate the string
-                   push( buf.str() );
+                   push( buf.str().c_str() );
                    push( getTerminator() );
-               }
-               else
-               {
+               } else {
                    node_not_found_error( tokens[1] );
                }
            }
        }
-       else if ( command == "cd" )
-       {
-           if (tokens.size() == 2)
-           {
-               try
-               {
+       else if ( command == "cd" ) {
+           if (tokens.size() == 2) {
+               try {
                    SGPropertyNode* child = node->getNode( tokens[1].c_str() );
-                   if ( child )
-                   {
+                   if ( child ) {
                        node = child;
                        path = node->getPath();
-                   }
-                   else
-                   {
+                   } else {
                        node_not_found_error( tokens[1] );
                    }
-               }
-               catch (...)
-               {
+               } catch (...) {
                    // Ignore attempt to move past root node with ".."
                }
            }
-       }
-       else if ( command == "pwd" )
-       {
+       } else if ( command == "pwd" ) {
            string ttt = node->getPath();
-           if (ttt.empty())
-           {
+           if (ttt.empty()) {
                ttt = "/";
            }
 
            push( ttt.c_str() );
            push( getTerminator() );
-       }
-       else if ( command == "get" || command == "show" )
-       {
-           if ( tokens.size() == 2 )
-           {
+       } else if ( command == "get" || command == "show" ) {
+           if ( tokens.size() == 2 ) {
                string tmp;     
                string value = node->getStringValue ( tokens[1].c_str(), "" );
-               if ( mode == PROMPT )
-               {
+               if ( mode == PROMPT ) {
                    tmp = tokens[1];
                    tmp += " = '";
                    tmp += value;
@@ -308,50 +263,131 @@ PropsChannel::foundTerminator()
                    tmp += getValueTypeString(
                                     node->getNode( tokens[1].c_str() ) );
                    tmp += ")";
-               }
-               else
-               {
+               } else {
                    tmp = value;
                }
                push( tmp.c_str() );
                push( getTerminator() );
            }
-       }
-       else if ( command == "set" )
-       {
-           if ( tokens.size() == 3 )
-           {
-               node->getNode( tokens[1].c_str(), true )->setStringValue(tokens[2].c_str());
-
-               if ( mode == PROMPT )
-               {
+       } else if ( command == "set" ) {
+           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 == "reinit" ) {
+           if ( tokens.size() == 2 ) {
+               string tmp;     
+                SGPropertyNode args;
+                for ( unsigned int i = 1; i < tokens.size(); ++i ) {
+                    cout << "props: adding subsystem = " << tokens[i] << endl;
+                    SGPropertyNode *node = args.getNode("subsystem", i-1, true);
+                    node->setStringValue( tokens[i].c_str() );
+                }
+                if ( !globals->get_commands()
+                         ->execute( "reinit", &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")
-       {
+       } else if ( command == "run" ) {
+            string tmp;        
+            if ( tokens.size() >= 2 ) {
+                SGPropertyNode args;
+                if ( tokens[1] == "reinit" ) {
+                    for ( unsigned int i = 2; i < tokens.size(); ++i ) {
+                        cout << "props: adding subsystem = " << tokens[i]
+                             << endl;
+                        SGPropertyNode *node
+                            = args.getNode("subsystem", i-2, true);
+                        node->setStringValue( tokens[i].c_str() );
+                    }
+                } else if ( tokens[1] == "set-sea-level-air-temp-degc" ) {
+                    for ( unsigned int i = 2; i < tokens.size(); ++i ) {
+                        cout << "props: set-sl command = " << tokens[i]
+                             << endl;
+                        SGPropertyNode *node
+                            = args.getNode("temp-degc", i-2, true);
+                        node->setStringValue( tokens[i].c_str() );
+                    }
+                } else if ( tokens[1] == "set-outside-air-temp-degc" ) {
+                    for ( unsigned int i = 2; i < tokens.size(); ++i ) {
+                        cout << "props: set-oat command = " << tokens[i]
+                             << endl;
+                        SGPropertyNode *node
+                            = args.getNode("temp-degc", i-2, true);
+                        node->setStringValue( tokens[i].c_str() );
+                    }
+                } else if ( tokens[1] == "timeofday" ) {
+                    for ( unsigned int i = 2; i < tokens.size(); ++i ) {
+                        cout << "props: time of day command = " << tokens[i]
+                             << endl;
+                        SGPropertyNode *node
+                            = args.getNode("timeofday", i-2, true);
+                        node->setStringValue( tokens[i].c_str() );
+                    }
+                }
+                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 ( mode == PROMPT ) {
+                    tmp += "no command specified";
+                    push( tmp.c_str() );
+                    push( getTerminator() );
+                }
+            }
+       } else if (command == "quit") {
            close();
            shouldDelete();
            return;
-       }
-       else if ( command == "data" )
-       {
+       } else if ( command == "data" ) {
            mode = DATA;
-       }
-       else if ( command == "prompt" )
-       {
+       } else if ( command == "prompt" ) {
            mode = PROMPT;
-       }
-       else
-       {
+       } else {
            const char* msg = "\
 Valid commands are:\r\n\
 \r\n\
@@ -364,6 +400,7 @@ ls [<dir>]         list directory\r\n\
 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 );
@@ -371,11 +408,9 @@ show <var>         synonym for get\r\n";
     }
 
  prompt:
-    if (mode == PROMPT)
-    {
+    if (mode == PROMPT) {
        string prompt = node->getPath();
-       if (prompt.empty())
-       {
+       if (prompt.empty()) {
            prompt = "/";
        }
        prompt += "> ";
@@ -393,12 +428,25 @@ FGProps::FGProps( const vector<string>& tokens )
     // 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" );
+    }
 }
 
 /**
@@ -426,7 +474,6 @@ FGProps::open()
     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;
 }
@@ -437,6 +484,7 @@ FGProps::open()
 bool
 FGProps::close()
 {
+    SG_LOG( SG_IO, SG_INFO, "closing FGProps" );   
     return true;
 }