From: <eg...@us...> - 2007-07-05 20:21:15
|
Revision: 614 http://svn.sourceforge.net/opengate/?rev=614&view=rev Author: egore Date: 2007-07-05 13:21:18 -0700 (Thu, 05 Jul 2007) Log Message: ----------- Add .svnignore files to hide stuff from svn that does not belong there. To update these files, go into the directory, edit it to your needs and call "svn propset svn:ignore -F .svnignore ." afterwards Also add authentication against the meta server. Also add improved commandline parsing based on getopt. I guess it's good I have to write C++ at work. This helps a lot :-) Modified Paths: -------------- branches/ogsector/configure.ac branches/ogsector/runClient.sh branches/ogsector/src/Makefile.am branches/ogsector/src/Makefile.in branches/ogsector/src/metaserver.cpp branches/ogsector/src/metaserver.h branches/ogsector/src/networkClient.cpp branches/ogsector/src/networkClient.h branches/ogsector/src/opengateclient.cpp Added Paths: ----------- branches/ogsector/.svnignore branches/ogsector/src/.svnignore Property Changed: ---------------- branches/ogsector/ branches/ogsector/src/ Property changes on: branches/ogsector ___________________________________________________________________ Name: svn:ignore + *.log configure Makefile.in config.h Makefile config.status stamp-h1 opengate.depend autom4te.cache Added: branches/ogsector/.svnignore =================================================================== --- branches/ogsector/.svnignore (rev 0) +++ branches/ogsector/.svnignore 2007-07-05 20:21:18 UTC (rev 614) @@ -0,0 +1,9 @@ +*.log +configure +Makefile.in +config.h +Makefile +config.status +stamp-h1 +opengate.depend +autom4te.cache Modified: branches/ogsector/configure.ac =================================================================== --- branches/ogsector/configure.ac 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/configure.ac 2007-07-05 20:21:18 UTC (rev 614) @@ -54,7 +54,7 @@ AC_SUBST([CXXFLAGS], ["${CXXFLAGS} -Wall -I$OGSECTOR_EXTERNALS_PATH/include"]) AC_SUBST([CXXFLAGS], ["${CXXFLAGS} -I$OGSECTOR_EXTERNALS_PATH/ogreopcode/include"]) AC_SUBST([CXXFLAGS], ["${CXXFLAGS} -I$OGSECTOR_EXTERNALS_PATH/ogreopcode/opcode132"]) -AC_SUBST([LDFLAGS], ["${LDFLAGS} -L$OGSECTOR_EXTERNALS_PATH/lib/ -lOpcode -lOgreOpcode"]) +AC_SUBST([LDFLAGS], ["${LDFLAGS} -L$OGSECTOR_EXTERNALS_PATH/lib/ -lOpcode -lOgreOpcode -lboost_regex"]) #AC_SUBST([CXXFLAGS], ["-g -Wall ${CXXFLAGS}"]) dnl #libopcode Modified: branches/ogsector/runClient.sh =================================================================== --- branches/ogsector/runClient.sh 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/runClient.sh 2007-07-05 20:21:18 UTC (rev 614) @@ -10,6 +10,4 @@ export LD_LIBRARY_PATH=./externals/lib:$LD_LIBRARY_PATH -echo "starting client for user: $USERNAME and looking for host: $HOSTNAME" - -./src/opengateclient $USERNAME $HOSTNAME --ogreconfig=0 +./src/opengateclient --no-config $* Property changes on: branches/ogsector/src ___________________________________________________________________ Name: svn:ignore + opengateserver .deps Makefile testopenalmanager opengateclient Added: branches/ogsector/src/.svnignore =================================================================== --- branches/ogsector/src/.svnignore (rev 0) +++ branches/ogsector/src/.svnignore 2007-07-05 20:21:18 UTC (rev 614) @@ -0,0 +1,5 @@ +opengateserver +.deps +Makefile +testopenalmanager +opengateclient Modified: branches/ogsector/src/Makefile.am =================================================================== --- branches/ogsector/src/Makefile.am 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/src/Makefile.am 2007-07-05 20:21:18 UTC (rev 614) @@ -56,7 +56,9 @@ Vessel.h \ Vessel.cpp \ VesselManager.h \ - VesselManager.cpp + VesselManager.cpp \ + metaserver.h \ + metaserver.cpp opengateserver_SOURCES = \ opengateserver.cpp \ Modified: branches/ogsector/src/Makefile.in =================================================================== --- branches/ogsector/src/Makefile.in 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/src/Makefile.in 2007-07-05 20:21:18 UTC (rev 614) @@ -60,7 +60,7 @@ OpcodeWrapper.$(OBJEXT) Projectile.$(OBJEXT) Sector.$(OBJEXT) \ SectorObjects.$(OBJEXT) ShipConfigDialog.$(OBJEXT) \ UnDockedState.$(OBJEXT) Vessel.$(OBJEXT) \ - VesselManager.$(OBJEXT) + VesselManager.$(OBJEXT) metaserver.$(OBJEXT) opengateclient_OBJECTS = $(am_opengateclient_OBJECTS) opengateclient_LDADD = $(LDADD) am_opengateserver_OBJECTS = opengateserver.$(OBJEXT) common.$(OBJEXT) \ @@ -237,7 +237,9 @@ Vessel.h \ Vessel.cpp \ VesselManager.h \ - VesselManager.cpp + VesselManager.cpp \ + metaserver.h \ + metaserver.cpp opengateserver_SOURCES = \ opengateserver.cpp \ @@ -354,6 +356,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Vessel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VesselManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metaserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/networkClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/networkProtocol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/networkServer.Po@am__quote@ Modified: branches/ogsector/src/metaserver.cpp =================================================================== --- branches/ogsector/src/metaserver.cpp 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/src/metaserver.cpp 2007-07-05 20:21:18 UTC (rev 614) @@ -19,59 +19,63 @@ ***************************************************************************/ #include "metaserver.h" +#include <boost/regex.hpp> namespace OpenGate{ -MetaConnection::MetaConnection( asio::io_service & io_service, const std::string & hostName ) - : io_service_( io_service ), socket_( io_service ), resolver_( io_service ), - hostname_( hostName ) { +MetaConnection::MetaConnection(asio::io_service & io_service) : + io_service_( io_service ), socket_( io_service ), resolver_( io_service ) { + // Get instance to the log manager log_ = LogManager::getSingletonPtr(); + hostname_ = std::string( "opacma.ontheserver.de" ); - try { - asio::ip::tcp::resolver::query query(hostName.c_str(), "http"); - asio::ip::tcp::resolver::iterator endpoint_iterator = resolver_.resolve(query); - asio::ip::tcp::resolver::iterator end; + log_->info( std::string( "Querying " ) + hostname_); - // Try each endpoint until we successfully establish a connection. - asio::error error = asio::error::host_not_found; - while (error && endpoint_iterator != end) - { + asio::error error = asio::error::host_not_found; + try{ + tcp::resolver::query query(hostname_, "http"); + tcp::resolver::iterator endpoint_iterator = resolver_.resolve(query); + tcp::resolver::iterator end; + + while ( error && endpoint_iterator != end ) { socket_.close(); - socket_.connect(*endpoint_iterator++, asio::assign_error(error)); + socket_.connect( *endpoint_iterator++, asio::assign_error( error ) ); } - if (error) - throw error; - } catch ( asio::error & e) { log_->fatal( e.what() ); + } catch ( std::exception & e) { + log_->fatal( std::string( "Exception: " ) + e.what() ); } catch (...) { log_->fatal( "Unkown exception occured while resolving the metaserver" ); } +} +MetaConnection::~MetaConnection() { + // asio doesn't need a cleanup, right? } -#define SCRIPT_PATH "/script/schnittstelle/" +int MetaConnection::login( const std::string & userName, const std::string & passwd ) { -void MetaConnection::login( const std::string & userName, const std::string & passwd ) { + std::cout << userName << ":" << passwd << std::endl; + try { - // Form the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. asio::streambuf request; std::ostream request_stream(&request); - request_stream << "GET " SCRIPT_PATH << "?action=login&username=" <<userName <<"&password=" << passwd << " HTTP/1.0\r\n"; + request_stream << "GET " << "/script/schnittstelle/?action=login&username=" << userName << "&password=" << passwd << " HTTP/1.0\r\n"; request_stream << "Host: " << hostname_ << "\r\n"; request_stream << "Accept: */*\r\n"; request_stream << "Connection: close\r\n\r\n"; // Send the request. - asio::write(socket, request); + asio::write(socket_, request); // Read the response status line. asio::streambuf response; - asio::read_until(socket, response, boost::regex("\r\n")); + asio::read_until(socket_, response, boost::regex("\r\n")); // Check that response is OK. std::istream response_stream(&response); @@ -81,41 +85,65 @@ response_stream >> status_code; std::string status_message; std::getline(response_stream, status_message); - if (!response_stream || http_version.substr(0, 5) != "HTTP/"){ - log_->fatal( "Invalid response from metaserver " ); - return; + if ( !response_stream || http_version.substr(0, 5) != "HTTP/" ) { + std::cout << "Invalid response\n"; + return -1; } - if (status_code != 200){ - log_->fatal( std::string("Response returned with status code ") /* + status_code FIXME: I suck at CPP streams */ ); - return; + if (status_code != 200) { + std::cout << "Response returned with status code " << status_code << "\n"; + return -2; } // Read the response headers, which are terminated by a blank line. - asio::read_until(socket, response, boost::regex("\r\n\r\n")); + asio::read_until(socket_, response, boost::regex("\r\n\r\n")); - // Process the response headers. + // Process the response headers. (to get the crap of the response before reading the body!) std::string header; - while (std::getline(response_stream, header) && header != "\r") - std::cout << header << "\n"; - std::cout << "\n"; + while (std::getline(response_stream, header) && header != "\r"); - // Write whatever content we already have to output. - if (response.size() > 0) - std::cout << &response; + // We got a usefull body. The body is an int, lets use it. + if (response.size() > 0) { + std::ostringstream stream; + stream << &response; + int returncode = toInt( stream.str() ); + switch (returncode) { + case -101: log_->warn ( std::string ("no action given") ); return -3; + case -102: log_->warn ( std::string ("action given but unknown") ); return -3; + case -103: log_->warn ( std::string ("database is not available") ); return -3; + case -8: log_->warn ( std::string ("no username given") ); return -3; + case -9: log_->warn ( std::string ("no password given") ); return -3; + case -10: log_->warn ( std::string ("username doesn't exist") ); return -3; + case -11: log_->warn ( std::string ("password incorrect") ); return -3; + default: + if (returncode > 0) { + return returncode; + } else { + log_->warn ( std::string ("unkown return code for login ") + toStr( returncode ) ); + return -4; + } + } + } + asio::error error = asio::error::eof; // Read until EOF, writing data to output as we go. - asio::error error = asio::error::eof; - while (asio::read(socket, response, + while (asio::read(socket_, response, asio::transfer_at_least(1), asio::assign_error(error))) std::cout << &response; if (error != asio::error::eof) throw error; + } catch ( asio::error & e) { log_->fatal( e.what() ); + return -5; + } catch ( std::exception & e) { + log_->fatal( std::string( "Exception: " ) + e.what() ); + return -5; } catch (...) { - log_->fatal( "Unkown exception occured while resolving the metaserver" ); + log_->fatal( "Unkown exception occured while resolving the server" ); + return -5; } + return 1; } } // namespace OpenGate Modified: branches/ogsector/src/metaserver.h =================================================================== --- branches/ogsector/src/metaserver.h 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/src/metaserver.h 2007-07-05 20:21:18 UTC (rev 614) @@ -22,27 +22,27 @@ #define _OPENGATE_METASERVER__H #include <asio.hpp> -#include <boost/bind.hpp> - #include "LogManager.h" +using asio::ip::tcp; + namespace OpenGate{ class MetaConnection { public: - MetaConnection( asio::io_service & io_service, const std::string & hostName ); - + MetaConnection(asio::io_service & io_service); ~MetaConnection(); - void login( const std::string & userName, const std::string & passwd ); + int login( const std::string & userName, const std::string & passwd = "" ); + private: - asio::io_service & io_service_; - asio::ip::tcp::socket socket_; - asio::ip::tcp::resolver resolver_; + LogManager *log_; std::string hostname_; - LogManager *log_; + asio::io_service & io_service_; + tcp::socket socket_; + tcp::resolver resolver_; }; Modified: branches/ogsector/src/networkClient.cpp =================================================================== --- branches/ogsector/src/networkClient.cpp 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/src/networkClient.cpp 2007-07-05 20:21:18 UTC (rev 614) @@ -35,7 +35,7 @@ pingTime_ = 0; userID_ = 0; - log_->info( std::string( "Connecting to " ) + hostname_ + ":" + toStr( 1234 ) ); + log_->info( std::string( "Connecting to " ) + hostname_ + ":" + toStr( (int)OG_PORT ) ); asio::error error = asio::error::host_not_found; try{ @@ -52,6 +52,7 @@ } catch ( std::exception & e) { log_->fatal( std::string( "Exception: " ) + e.what() ); } catch (...) { + log_->fatal( "Unkown exception occured while resolving the server" ); } if ( !error ){ log_->info( "Connected: waiting for userID. " ); Modified: branches/ogsector/src/networkClient.h =================================================================== --- branches/ogsector/src/networkClient.h 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/src/networkClient.h 2007-07-05 20:21:18 UTC (rev 614) @@ -87,7 +87,7 @@ asio::io_service & io_service_; tcp::socket socket_; - tcp::resolver resolver_; + tcp::resolver resolver_; std::string hostname_; bool online_; Modified: branches/ogsector/src/opengateclient.cpp =================================================================== --- branches/ogsector/src/opengateclient.cpp 2007-07-05 20:17:15 UTC (rev 613) +++ branches/ogsector/src/opengateclient.cpp 2007-07-05 20:21:18 UTC (rev 614) @@ -31,39 +31,99 @@ #include "GameStateManager.h" #include "DockedState.h" #include "UnDockedState.h" +#include "metaserver.h" +#include <getopt.h> int main( int argc, char * argv[ ] ) { + int option_dialog = 1; + std::string username = "testuser"; + std::string hostname = "localhost"; + std::string password = "dummy"; + OpenGate::LogManager *log = new OpenGate::LogManager(); log->setLogFile( "OpenGate.log" ); log->setChatLogFile( "OpenGateChat.log" ); + + while (1) { + static struct option long_options[] = { + /* These options set a flag. */ + {"config", no_argument, &option_dialog, 1}, + {"no-config", no_argument, &option_dialog, 0}, + /* These options don't set a flag. We distinguish them by their indices. */ + {"help", no_argument, 0, 'h'}, + {"username", required_argument, 0, 'u'}, + {"password", required_argument, 0, 'p'}, + {"server", required_argument, 0, 's'}, + {0, 0, 0, 0} + }; + + /* getopt_long stores the option index here. */ + int option_index = 0; + int c = getopt_long (argc, argv, "cnh:u:p:", long_options, &option_index); + + /* Detect the end of the options. */ + if (c == -1) + break; + + switch (c) { + case 0: + // If this option set a flag, do nothing else now + if (long_options[option_index].flag != 0) + break; + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + case 'h': +#ifdef PACKAGE_NAME + std::cout << PACKAGE_NAME << std::endl; +#endif + std::cout << std::endl << "Usage instructions" << std::endl; + std::cout << " -h --help Show this information" << std::endl; + std::cout << " -u name --username=name Set username to 'name'" << std::endl; + std::cout << " -p pass --password=pass Set password to 'pass'" << std::endl; + std::cout << " -s server --server=server Set server hostname to 'server'" << std::endl; + std::cout << std::endl; + std::cout << " -c --config Show config dialog" << std::endl; + std::cout << " -n --no-config Disable config dialog, reuse last settings" << std::endl; + delete log; + return EXIT_SUCCESS; + case 'u': + log->debug ( std::string ("Setting username to ") + optarg); + username = optarg; + break; + case 'p': + log->debug ( std::string ("Setting password to ") + optarg); + password = optarg; + break; + case 's': + log->debug ( std::string ("Setting server to ") + optarg); + hostname = optarg; + break; + case '?': + // getopt_long already printed an error message. + break; + default: + // Fail on unkown options + abort(); + } + } + log->info("Starting up"); #ifdef PACKAGE_STRING log->info(PACKAGE_STRING); #endif - std::string username = "testuser"; - std::string hostname = "localhost"; - std::string password = ""; - bool dialog = true; - if ( argc > 1 ){ - username = argv[ 1 ]; - } - if ( argc > 2 ){ - username = argv[ 1 ]; - hostname = argv[ 2 ]; - } - if ( argc > 3 ){ - std::string dialogStr( argv[ 3 ] ); - if ( dialogStr.find( "--ogreconfig=0", 0 ) != std::string::npos ) dialog = false; - } - log->info( std::string( "User: " + username + " looking for host: " + hostname ) ); asio::io_service io_service; OpenGate::NetworkClient nw( io_service, hostname ); + OpenGate::MetaConnection meta( io_service ); + if (meta.login( username, password ) > 0) { if ( nw.online() ){ // //** waiting for userid; @@ -82,7 +142,7 @@ } try { - OpenGate::GameStateManager gameStateMgr( nw, dialog ); + OpenGate::GameStateManager gameStateMgr( nw, option_dialog ); OpenGate::DockedState::create( &gameStateMgr, "DockedState" ); OpenGate::UnDockedState::create( &gameStateMgr, "UnDockedState" ); gameStateMgr.start( gameStateMgr.findByName( "DockedState" ) ); @@ -95,6 +155,9 @@ log->fatal( std::string("An exception has occured: ") + e.getFullDescription().c_str() ); #endif } + + } + nw.close(); delete log; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |