X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2Fhttpd.cxx;h=31d4b93375af4724799b0b1184b99a102ed29df1;hb=5f2fff4ec45a0c20bca076d5b09c433370288f4d;hp=e1d2b6c3beef5c7b5022956a65d290cd586ba82c;hpb=d05121ef4689d2b50b3fe1848cbb0d1f5a1db877;p=flightgear.git diff --git a/src/Network/httpd.cxx b/src/Network/httpd.cxx index e1d2b6c3b..31d4b9337 100644 --- a/src/Network/httpd.cxx +++ b/src/Network/httpd.cxx @@ -20,7 +20,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -31,9 +31,10 @@ #include -#include // atoi() atof() - -#include STL_STRING +#include // sort() +#include // atoi() atof() +#include +#include #include #include @@ -46,9 +47,7 @@ #include "httpd.hxx" -SG_USING_STD(string); -SG_USING_STD(cout); - +using std::string; bool FGHttpd::open() { if ( is_enabled() ) { @@ -67,7 +66,7 @@ bool FGHttpd::open() { bool FGHttpd::process() { - netChannel::poll(); + simgear::NetChannel::poll(); return true; } @@ -76,15 +75,22 @@ bool FGHttpd::process() { bool FGHttpd::close() { SG_LOG( SG_IO, SG_INFO, "closing FGHttpd" ); - // the following delete causes a seg fault, gdb is not helpful. - // delete server; - + delete server; set_enabled( false ); return true; } +class CompareNodes { +public: + bool operator() (const SGPropertyNode *a, const SGPropertyNode *b) const { + int r = strcmp(a->getName(), b->getName()); + return r ? r < 0 : a->getIndex() < b->getIndex(); + } +}; + + // Handle http GET requests void HttpdChannel::foundTerminator (void) { @@ -93,7 +99,7 @@ void HttpdChannel::foundTerminator (void) { const string s = buffer.getData(); if ( s.find( "GET " ) == 0 ) { - printf("echo: %s\n", s.c_str()); + SG_LOG( SG_IO, SG_INFO, "echo: " << s ); string rest = s.substr(4); string request; @@ -112,7 +118,7 @@ void HttpdChannel::foundTerminator (void) { // request to update property value string args = request.substr( pos + 1 ); request = request.substr( 0, pos ); - printf("'%s' '%s'\n", request.c_str(), args.c_str()); + SG_LOG( SG_IO, SG_INFO, "'" << request << "' '" << args << "'" ); request = urlDecode(request); // parse args looking for "value=" @@ -128,12 +134,12 @@ void HttpdChannel::foundTerminator (void) { done = true; } - printf(" arg = %s\n", arg.c_str() ); + SG_LOG( SG_IO, SG_INFO, " arg = " << arg ); string::size_type apos = arg.find("="); if ( apos != string::npos ) { string a = arg.substr( 0, apos ); string b = arg.substr( apos + 1 ); - printf(" a = %s b = %s\n", a.c_str(), b.c_str() ); + SG_LOG( SG_IO, SG_INFO, " a = " << a << " b = " << b ); if ( request == "/run.cgi" ) { // execute a command if ( a == "value" ) { @@ -195,8 +201,15 @@ void HttpdChannel::foundTerminator (void) { response += "\""; response += getTerminator(); - for (int i = 0; i < node->nChildren(); i++) { - SGPropertyNode *child = node->getChild(i); + + vector children; + for (int i = 0; i < node->nChildren(); i++) + children.push_back(node->getChild(i)); + std::sort(children.begin(), children.end(), CompareNodes()); + + vector::iterator it, end = children.end(); + for (it = children.begin(); it != end; ++it) { + SGPropertyNode *child = *it; string name = child->getDisplayName(true); string line = ""; if ( child->nChildren() > 0 ) { @@ -252,9 +265,9 @@ void HttpdChannel::foundTerminator (void) { push( "HTTP/1.1 200 OK" ); push( getTerminator() ); - printf("size = %d\n", response.length()); + SG_LOG( SG_IO, SG_INFO, "size = " << response.length() ); char ctmp[256]; - sprintf(ctmp, "Content-Length: %d", response.length()); + sprintf(ctmp, "Content-Length: %u", (unsigned)response.length()); push( ctmp ); push( getTerminator() );