X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Foptions.cxx;h=b4a3bc830f01596d1678689f0b6c07bc48456a3e;hb=38226af24ec01e8f0a20d7fd73ef838a69f6ef25;hp=bededfb71e43ed8cbbfe535954bb60a1f5d57440;hpb=988a6771aaf6657ed02e24d32a286e943386857b;p=flightgear.git diff --git a/src/Main/options.cxx b/src/Main/options.cxx index bededfb71..b4a3bc830 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include // rint() #include @@ -38,20 +40,13 @@ #include #include -#include - #include #include #include #include #include #include - -// #include -// #include -// #include -// #include - +#include #include #include @@ -62,7 +57,10 @@ #include "util.hxx" #include "viewmgr.hxx" #include
+#include + #include +#include using std::string; using std::sort; @@ -70,8 +68,10 @@ using std::cout; using std::cerr; using std::endl; -#ifndef VERSION -#define VERSION "CVS "__DATE__ +#if defined( HAVE_VERSION_H ) && HAVE_VERSION_H +# include +#else +# include #endif #define NEW_DEFAULT_MODEL_HZ 120 @@ -99,6 +99,8 @@ atoi( const string& str ) return ::atoi( str.c_str() ); } +static int fgSetupProxy( const char *arg ); + /** * Set a few fail-safe default property values. * @@ -120,6 +122,7 @@ fgSetDefaults () // Otherwise, default to Scenery being in $FG_ROOT/Scenery globals->set_fg_scenery(""); } + // Position (deliberately out of range) fgSetDouble("/position/longitude-deg", 9999.0); fgSetDouble("/position/latitude-deg", 9999.0); @@ -186,8 +189,8 @@ fgSetDefaults () // Features fgSetBool("/sim/hud/color/antialiased", false); - fgSetBool("/sim/hud/enable3d", true); - fgSetBool("/sim/hud/visibility", false); + fgSetBool("/sim/hud/enable3d[1]", true); + fgSetBool("/sim/hud/visibility[1]", false); fgSetBool("/sim/panel/visibility", true); fgSetBool("/sim/sound/enabled", true); fgSetBool("/sim/sound/working", true); @@ -221,7 +224,7 @@ fgSetDefaults () // HUD options fgSetString("/sim/startup/units", "feet"); fgSetString("/sim/hud/frame-stat-type", "tris"); - + // Time options fgSetInt("/sim/startup/time-offset", 0); fgSetString("/sim/startup/time-offset-type", "system-offset"); @@ -238,6 +241,15 @@ fgSetDefaults () fgSetString("/sim/multiplay/txhost", "0"); fgSetInt("/sim/multiplay/rxport", 0); fgSetInt("/sim/multiplay/txport", 0); + + fgSetString("/sim/version/flightgear", FLIGHTGEAR_VERSION); + fgSetString("/sim/version/simgear", SG_STRINGIZE(SIMGEAR_VERSION)); + fgSetString("/sim/version/openscenegraph", osgGetVersion()); + fgSetString("/sim/version/revision", REVISION); + fgSetInt("/sim/version/build-number", HUDSON_BUILD_NUMBER); + fgSetString("/sim/version/build-id", HUDSON_BUILD_ID); + if( (envp = ::getenv( "http_proxy" )) != NULL ) + fgSetupProxy( envp ); } static bool @@ -349,7 +361,7 @@ parse_time(const string& time_in) { // parse a date string (yyyy:mm:dd:hh:mm:ss) into a time_t (seconds) -static long int +static long int parse_date( const string& date) { struct tm gmt; @@ -487,7 +499,7 @@ parse_time_offset( const string& time_str) { } -// Parse --fov=x.xx type option +// Parse --fov=x.xx type option static double parse_fov( const string& arg ) { double fov = atof(arg); @@ -514,7 +526,7 @@ parse_fov( const string& arg ) { // point values are ok. // // Serial example "--nmea=serial,dir,hz,device,baud" where -// +// // device = OS device name of serial line to be open()'ed // baud = {300, 1200, 2400, ..., 230400} // @@ -530,6 +542,14 @@ parse_fov( const string& arg ) { static bool add_channel( const string& type, const string& channel_str ) { + // This check is neccessary to prevent fgviewer from segfaulting when given + // weird options. (It doesn't run the full initailization) + if(!globals->get_channel_options_list()) + { + SG_LOG(SG_GENERAL, SG_ALERT, "Option " << type << "=" << channel_str + << " ignored."); + return false; + } SG_LOG(SG_GENERAL, SG_INFO, "Channel string = " << channel_str ); globals->get_channel_options_list()->push_back( type + "," + channel_str ); return true; @@ -770,7 +790,7 @@ fgOptRoc( const char *arg ) static int fgOptFgRoot( const char *arg ) { - globals->set_fg_root(arg); + // this option is dealt with by fgInitFGRoot return FG_OPTIONS_OK; } @@ -781,6 +801,13 @@ fgOptFgScenery( const char *arg ) return FG_OPTIONS_OK; } +static int +fgOptFgAircraft(const char* arg) +{ + // this option is dealt with by fgInitFGAircraft + return FG_OPTIONS_OK; +} + static int fgOptFov( const char *arg ) { @@ -874,12 +901,18 @@ fgOptStartDateGmt( const char *arg ) static int fgSetupProxy( const char *arg ) { - string options = arg; + string options = simgear::strutils::strip( arg ); string host, port, auth; string::size_type pos; + // this is NURLP - NURLP is not an url parser + if( simgear::strutils::starts_with( options, "http://" ) ) + options = options.substr( 7 ); + if( simgear::strutils::ends_with( options, "/" ) ) + options = options.substr( 0, options.length() - 1 ); + host = port = auth = ""; - if ((pos = options.find("@")) != string::npos) + if ((pos = options.find("@")) != string::npos) auth = options.substr(0, pos++); else pos = 0; @@ -960,7 +993,7 @@ fgOptViewOffset( const char *arg ) } else { default_view_offset = atof( woffset.c_str() ) * SGD_DEGREES_TO_RADIANS; } - /* apparently not used (CLO, 11 Jun 2002) + /* apparently not used (CLO, 11 Jun 2002) FGViewer *pilot_view = (FGViewer *)globals->get_viewmgr()->get_view( 0 ); */ // this will work without calls to the viewer... @@ -973,16 +1006,14 @@ fgOptViewOffset( const char *arg ) static int fgOptVisibilityMeters( const char *arg ) { - double visibility = atof( arg ); - fgDefaultWeatherValue("visibility-m", visibility); + Environment::Presets::VisibilitySingleton::instance()->preset( atof( arg ) ); return FG_OPTIONS_OK; } static int fgOptVisibilityMiles( const char *arg ) { - double visibility = atof( arg ) * 5280.0 * SG_FEET_TO_METER; - fgDefaultWeatherValue("visibility-m", visibility); + Environment::Presets::VisibilitySingleton::instance()->preset( atof( arg ) * 5280.0 * SG_FEET_TO_METER ); return FG_OPTIONS_OK; } @@ -993,7 +1024,7 @@ fgOptRandomWind( const char *arg ) double max_hdg = min_hdg + (20 - sqrt(sg_random() * 400)); double speed = sg_random() * sg_random() * 40; double gust = speed + (10 - sqrt(sg_random() * 100)); - fgSetupWind(min_hdg, max_hdg, speed, gust); + Environment::Presets::WindSingleton::instance()->preset(min_hdg, max_hdg, speed, gust); return FG_OPTIONS_OK; } @@ -1005,14 +1036,14 @@ fgOptWind( const char *arg ) SG_LOG( SG_GENERAL, SG_ALERT, "bad wind value " << arg ); return FG_OPTIONS_ERROR; } - fgSetupWind(min_hdg, max_hdg, speed, gust); + Environment::Presets::WindSingleton::instance()->preset(min_hdg, max_hdg, speed, gust); return FG_OPTIONS_OK; } static int fgOptTurbulence( const char *arg ) { - fgDefaultWeatherValue("turbulence/magnitude-norm", atof(arg)); + Environment::Presets::TurbulenceSingleton::instance()->preset( atof(arg) ); return FG_OPTIONS_OK; } @@ -1029,9 +1060,7 @@ fgOptCeiling( const char *arg ) elevation = atof(spec.substr(0, pos).c_str()); thickness = atof(spec.substr(pos + 1).c_str()); } - fgSetDouble("/environment/clouds/layer[0]/elevation-ft", elevation); - fgSetDouble("/environment/clouds/layer[0]/thickness-ft", thickness); - fgSetString("/environment/clouds/layer[0]/coverage", "overcast"); + Environment::Presets::CeilingSingleton::instance()->preset( elevation, thickness ); return FG_OPTIONS_OK; } @@ -1198,7 +1227,9 @@ fgOptParking( const char *arg ) static int fgOptVersion( const char *arg ) { - cerr << "FlightGear version: " << VERSION << endl; + cerr << "FlightGear version: " << FLIGHTGEAR_VERSION << endl; + cerr << "Revision: " << REVISION << endl; + cerr << "Build-Id: " << HUDSON_BUILD_ID << endl; cerr << "FG_ROOT=" << globals->get_fg_root() << endl; cerr << "FG_HOME=" << fgGetString("/sim/fg-home") << endl; cerr << "FG_SCENERY="; @@ -1231,6 +1262,26 @@ fgOptFgviewer(const char* arg) return FG_OPTIONS_OK; } +static int +fgOptCallSign(const char * arg) +{ + int i; + char callsign[11]; + strncpy(callsign,arg,10); + callsign[10]=0; + for (i=0;callsign[i];i++) + { + char c = callsign[i]; + if (c >= 'A' && c <= 'Z') continue; + if (c >= 'a' && c <= 'z') continue; + if (c >= '0' && c <= '9') continue; + if (c == '-' || c == '_') continue; + // convert any other illegal characters + callsign[i]='-'; + } + fgSetString("sim/multiplay/callsign", callsign ); + return FG_OPTIONS_OK; +} static map fgOptionMap; @@ -1272,7 +1323,7 @@ struct OptionDesc { const char *s_param; int (*func)( const char * ); } fgOptionArray[] = { - + {"language", true, OPTION_FUNC, "", false, "", fgOptLanguage }, {"disable-game-mode", false, OPTION_BOOL, "/sim/startup/game-mode", false, "", 0 }, {"enable-game-mode", false, OPTION_BOOL, "/sim/startup/game-mode", true, "", 0 }, @@ -1284,27 +1335,29 @@ struct OptionDesc { {"enable-mouse-pointer", false, OPTION_STRING, "/sim/startup/mouse-pointer", false, "enabled", 0 }, {"disable-random-objects", false, OPTION_BOOL, "/sim/rendering/random-objects", false, "", 0 }, {"enable-random-objects", false, OPTION_BOOL, "/sim/rendering/random-objects", true, "", 0 }, - {"disable-real-weather-fetch", false, OPTION_BOOL, "/environment/params/real-world-weather-fetch", false, "", 0 }, - {"enable-real-weather-fetch", false, OPTION_BOOL, "/environment/params/real-world-weather-fetch", true, "", 0 }, + {"disable-real-weather-fetch", false, OPTION_BOOL, "/environment/realwx/enabled", false, "", 0 }, + {"enable-real-weather-fetch", false, OPTION_BOOL, "/environment/realwx/enabled", true, "", 0 }, {"metar", true, OPTION_STRING, "/environment/metar/data", false, "", 0 }, {"disable-ai-models", false, OPTION_BOOL, "/sim/ai/enabled", false, "", 0 }, {"enable-ai-models", false, OPTION_BOOL, "/sim/ai/enabled", true, "", 0 }, + {"disable-ai-traffic", false, OPTION_BOOL, "/sim/traffic-manager/enabled", false, "", 0 }, + {"enable-ai-traffic", false, OPTION_BOOL, "/sim/traffic-manager/enabled", true, "", 0 }, {"disable-freeze", false, OPTION_BOOL, "/sim/freeze/master", false, "", 0 }, {"enable-freeze", false, OPTION_BOOL, "/sim/freeze/master", true, "", 0 }, {"disable-fuel-freeze", false, OPTION_BOOL, "/sim/freeze/fuel", false, "", 0 }, {"enable-fuel-freeze", false, OPTION_BOOL, "/sim/freeze/fuel", true, "", 0 }, {"disable-clock-freeze", false, OPTION_BOOL, "/sim/freeze/clock", false, "", 0 }, {"enable-clock-freeze", false, OPTION_BOOL, "/sim/freeze/clock", true, "", 0 }, - {"disable-hud-3d", false, OPTION_BOOL, "/sim/hud/enable3d", false, "", 0 }, - {"enable-hud-3d", false, OPTION_BOOL, "/sim/hud/enable3d", true, "", 0 }, + {"disable-hud-3d", false, OPTION_BOOL, "/sim/hud/enable3d[1]", false, "", 0 }, + {"enable-hud-3d", false, OPTION_BOOL, "/sim/hud/enable3d[1]", true, "", 0 }, {"disable-anti-alias-hud", false, OPTION_BOOL, "/sim/hud/color/antialiased", false, "", 0 }, {"enable-anti-alias-hud", false, OPTION_BOOL, "/sim/hud/color/antialiased", true, "", 0 }, {"control", true, OPTION_STRING, "/sim/control-mode", false, "", 0 }, {"disable-auto-coordination", false, OPTION_BOOL, "/sim/auto-coordination", false, "", 0 }, {"enable-auto-coordination", false, OPTION_BOOL, "/sim/auto-coordination", true, "", 0 }, {"browser-app", true, OPTION_STRING, "/sim/startup/browser-app", false, "", 0 }, - {"disable-hud", false, OPTION_BOOL, "/sim/hud/visibility", false, "", 0 }, - {"enable-hud", false, OPTION_BOOL, "/sim/hud/visibility", true, "", 0 }, + {"disable-hud", false, OPTION_BOOL, "/sim/hud/visibility[1]", false, "", 0 }, + {"enable-hud", false, OPTION_BOOL, "/sim/hud/visibility[1]", true, "", 0 }, {"disable-panel", false, OPTION_BOOL, "/sim/panel/visibility", false, "", 0 }, {"enable-panel", false, OPTION_BOOL, "/sim/panel/visibility", true, "", 0 }, {"disable-sound", false, OPTION_BOOL, "/sim/sound/working", false, "", 0 }, @@ -1337,6 +1390,7 @@ struct OptionDesc { {"roc", true, OPTION_FUNC, "", false, "", fgOptRoc }, {"fg-root", true, OPTION_FUNC, "", false, "", fgOptFgRoot }, {"fg-scenery", true, OPTION_FUNC, "", false, "", fgOptFgScenery }, + {"fg-aircraft", true, OPTION_FUNC, "", false, "", fgOptFgAircraft }, {"fdm", true, OPTION_STRING, "/sim/flight-model", false, "", 0 }, {"aero", true, OPTION_STRING, "/sim/aero", false, "", 0 }, {"aircraft-dir", true, OPTION_STRING, "/sim/aircraft-dir", false, "", 0 }, @@ -1373,7 +1427,7 @@ struct OptionDesc { {"enable-skyblend", false, OPTION_BOOL, "/sim/rendering/skyblend", true, "", 0 }, {"disable-textures", false, OPTION_BOOL, "/sim/rendering/textures", false, "", 0 }, {"enable-textures", false, OPTION_BOOL, "/sim/rendering/textures", true, "", 0 }, - {"texture-filtering", false, OPTION_INT, "/sim/rendering/filtering", 1, "", 0 }, + {"texture-filtering", false, OPTION_INT, "/sim/rendering/filtering", 1, "", 0 }, {"disable-wireframe", false, OPTION_BOOL, "/sim/rendering/wireframe", false, "", 0 }, {"enable-wireframe", false, OPTION_BOOL, "/sim/rendering/wireframe", true, "", 0 }, {"geometry", true, OPTION_FUNC, "", false, "", fgOptGeometry }, @@ -1414,8 +1468,11 @@ struct OptionDesc { {"joyclient", true, OPTION_CHANNEL, "", false, "", 0 }, {"jsclient", true, OPTION_CHANNEL, "", false, "", 0 }, {"proxy", true, OPTION_FUNC, "", false, "", fgSetupProxy }, - {"callsign", true, OPTION_STRING, "sim/multiplay/callsign", false, "", 0 }, + {"callsign", true, OPTION_FUNC, "", false, "", fgOptCallSign}, {"multiplay", true, OPTION_CHANNEL, "", false, "", 0 }, +#ifdef FG_HAVE_HLA + {"hla", true, OPTION_CHANNEL, "", false, "", 0 }, +#endif {"trace-read", true, OPTION_FUNC, "", false, "", fgOptTraceRead }, {"trace-write", true, OPTION_FUNC, "", false, "", fgOptTraceWrite }, {"log-level", true, OPTION_FUNC, "", false, "", fgOptLogLevel }, @@ -1443,8 +1500,8 @@ struct OptionDesc { {"ai-scenario", true, OPTION_FUNC, "", false, "", fgOptScenario }, {"parking-id", true, OPTION_FUNC, "", false, "", fgOptParking }, {"version", false, OPTION_FUNC, "", false, "", fgOptVersion }, - {"enable-fpe", false, OPTION_FUNC, "", false, "", fgOptFpe}, - {"fgviewer", false, OPTION_FUNC, "", false, "", fgOptFgviewer}, + {"enable-fpe", false, OPTION_FUNC, "", false, "", fgOptFpe}, + {"fgviewer", false, OPTION_FUNC, "", false, "", fgOptFgviewer}, {0} }; @@ -1526,6 +1583,10 @@ parse_option (const string& arg) SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg ); return FG_OPTIONS_ERROR; } + } else if ( arg.find("-psn_") == 0) { + // on Mac, when launched from the GUI, we are passed the ProcessSerialNumber + // as an argument (and no others). Silently ignore the argument here. + return FG_OPTIONS_OK; } else if ( arg.find( "--" ) == 0 ) { size_t pos = arg.find( '=' ); string arg_name, arg_value; @@ -1572,6 +1633,7 @@ parse_option (const string& arg) } break; case OPTION_CHANNEL: + // XXX return value of add_channel should be checked? if ( pt->has_param && !arg_value.empty() ) { add_channel( pt->option, arg_value ); } else if ( !pt->has_param && arg_value.empty() ) { @@ -1619,7 +1681,7 @@ fgParseArgs (int argc, char **argv) bool verbose = false; bool help = false; - SG_LOG(SG_GENERAL, SG_INFO, "Processing command line arguments"); + SG_LOG(SG_GENERAL, SG_ALERT, "Processing command line arguments"); for (int i = 1; i < argc; i++) { string arg = argv[i]; @@ -1639,7 +1701,7 @@ fgParseArgs (int argc, char **argv) fgOptLogLevel( "alert" ); SGPath path( globals->get_fg_root() ); path.append("Aircraft"); - fgShowAircraft(path, true); + fgShowAircraft(path); exit(0); } else if (result == FG_OPTIONS_SHOW_SOUND_DEVICES) { @@ -1652,7 +1714,7 @@ fgParseArgs (int argc, char **argv) cout << endl << "No. Device" << endl; vector devices = smgr.get_available_devices(); - for (int i=0; i::size_type i=0; iget_locale(); @@ -1731,7 +1793,7 @@ fgUsage (bool verbose) cout << "Make sure the file options.xml is located in the FlightGear base directory," << endl; cout << "and the location of the base directory is specified by setting $FG_ROOT or" << endl; cout << "by adding --fg-root=path as a program argument." << endl; - + exit(-1); } @@ -1775,7 +1837,7 @@ fgUsage (bool verbose) tmp.append(", -"); tmp.append(short_name->getStringValue()); } - + if (tmp.size() <= 25) { msg+= " --"; msg += tmp; @@ -1844,135 +1906,3 @@ fgUsage (bool verbose) cin.get(); #endif } - -// A simple function to return an integer depending on the position -// of the status string within the array in order to determine the hierarchy. -unsigned int getNumMaturity(const char * str) -{ - // changes should also be reflected in $FG_ROOT/data/options.xml & - // $FG_ROOT/data/Translations/string-default.xml - const char* levels[] = {"alpha","beta","early-production","production"}; - - for (size_t i=0; i<(sizeof(levels)/sizeof(levels[0]));i++) - if (strcmp(str,levels[i])==0) - return i; - - return 0; -}; - - -static void fgSearchAircraft(const SGPath &path, string_list &aircraft, - bool recursive) -{ - - ulDirEnt* dire; - ulDir *dirp = ulOpenDir(path.str().c_str()); - if (dirp == NULL) { - cerr << "Unable to open aircraft directory '" << path.str() << '\'' << endl; - exit(-1); - } - - while ((dire = ulReadDir(dirp)) != NULL) { - char *ptr; - - if (dire->d_isdir) { - if (recursive && strcmp("CVS", dire->d_name) - && strcmp(".", dire->d_name) && strcmp("..", dire->d_name)) - { - SGPath next = path; - next.append(dire->d_name); - - fgSearchAircraft(next, aircraft, true); - } - } else if ((ptr = strstr(dire->d_name, "-set.xml")) && (ptr[8] == '\0')) { - - SGPath afile = path; - afile.append(dire->d_name); - - *ptr = '\0'; - - SGPropertyNode root; - try { - readProperties(afile.str(), &root); - } catch (...) { - continue; - } - - SGPropertyNode *desc = NULL; - SGPropertyNode *status = NULL; - - SGPropertyNode *node = root.getNode("sim"); - if (node) { - desc = node->getNode("description"); - // if a status tag is found, read it in - if (node->hasValue("status")) - status = node->getNode("status"); - } - - //additionally display status information where it is available - - string descStr(" "); - descStr += dire->d_name; - if (desc) { - if (descStr.size() <= 27+3) { - descStr.append(29+3-descStr.size(), ' '); - } else { - descStr += '\n'; - descStr.append( 32, ' '); - } - descStr += desc->getStringValue(); - } - - SGPropertyNode * required_status - = fgGetNode ("/sim/aircraft-min-status", true); - - // If the node holds the value "all", then there wasn't any status - // level specified, so we simply go ahead and output ALL aircraft - if (strcmp(required_status->getStringValue(),"all")==0) { - aircraft.push_back(descStr); - } - else - { - // If the node doesn't hold "all" as its value, then we are supposed - // to show only aircraft meeting specific status (development status) - // requirements: - - if (node->hasValue("status")) { - //Compare (minimally) required status level with actual aircraft status: - if ( getNumMaturity(status->getStringValue() ) >= - getNumMaturity(required_status->getStringValue() ) ) - aircraft.push_back(descStr); } - - } - - - } - } - - ulCloseDir(dirp); -} - -/* - * Search in the current directory, and in on directory deeper - * for -set.xml configuration files and show the aircaft name - * and the contents of the tag in a sorted manner. - * - * @parampath the directory to search for configuration files - * @param recursive defines whether the directory should be searched recursively - */ -void fgShowAircraft(const SGPath &path, bool recursive) { - string_list aircraft; - - fgSearchAircraft( path, aircraft, recursive ); - - sort(aircraft.begin(), aircraft.end()); - SG_LOG( SG_GENERAL, SG_ALERT, "" ); // To popup the console on Windows - cout << "Available aircraft:" << endl; - for ( unsigned int i = 0; i < aircraft.size(); i++ ) { - cout << aircraft[i] << endl; - } -#ifdef _MSC_VER - cout << "Hit a key to continue..." << endl; - cin.get(); -#endif -}