#include <simgear/structure/exception.hxx>
#include <simgear/structure/commands.hxx>
#include <simgear/props/props.hxx>
+#include <simgear/props/props_io.hxx>
#include <simgear/structure/event_mgr.hxx>
#include <simgear/sound/soundmgr_openal.hxx>
#include <simgear/timing/sg_time.hxx>
fgSetBool("/sim/signals/exit", true);
if (fgGetBool("/sim/startup/save-on-exit")) {
-#ifdef _WIN32
- char* envp = ::getenv( "APPDATA" );
- if ( envp != NULL ) {
- SGPath config( envp );
- config.append( "flightgear.org" );
-#else
- if ( homedir != NULL ) {
- SGPath config( homedir );
- config.append( ".fgfs" );
-#endif
- config.append( "autosave.xml" );
- config.create_dir( 0700 );
- SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << config.str());
- try {
- writeProperties(config.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE);
- } catch (const sg_exception &e) {
- guiErrorMessage("Error writing autosave.xml: ", e);
- }
+ SGPath autosaveFile(fgGetString("/sim/fg-home"));
+ autosaveFile.append( "autosave.xml" );
+ autosaveFile.create_dir( 0700 );
+ SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << autosaveFile.str());
+ try {
+ writeProperties(autosaveFile.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE);
+ } catch (const sg_exception &e) {
+ guiErrorMessage("Error writing autosave.xml: ", e);
+ }
+
+ SG_LOG(SG_INPUT, SG_DEBUG, "Finished Saving user settings");
- SG_LOG(SG_INPUT, SG_DEBUG, "Finished Saving user settings");
- }
}
fgOSExit(arg->getIntValue("status", 0));
#endif
+/**
+ * Built-in command: replay the FDR buffer
+ */
+static bool
+do_replay (const SGPropertyNode * arg)
+{
+ FGReplay *r = (FGReplay *)(globals->get_subsystem( "replay" ));
+ return r->start();
+}
+
+/**
+ * Built-in command: pause/unpause the sim
+ */
static bool
do_pause (const SGPropertyNode * arg)
{
bool paused = fgGetBool("/sim/freeze/master",true) || fgGetBool("/sim/freeze/clock",true);
- fgSetBool("/sim/freeze/master",!paused);
- fgSetBool("/sim/freeze/clock",!paused);
- if (fgGetBool("/sim/freeze/replay-state",false))
- fgSetBool("/sim/replay/disable",true);
+ if (paused && (fgGetInt("/sim/freeze/replay-state",0)>0))
+ {
+ do_replay(NULL);
+ }
+ else
+ {
+ fgSetBool("/sim/freeze/master",!paused);
+ fgSetBool("/sim/freeze/clock",!paused);
+ }
return true;
}
do_property_assign (const SGPropertyNode * arg)
{
SGPropertyNode * prop = get_prop(arg);
- const SGPropertyNode * prop2 = get_prop2(arg);
const SGPropertyNode * value = arg->getNode("value");
if (value != 0)
return prop->setUnspecifiedValue(value->getStringValue());
- else if (prop2)
- return prop->setUnspecifiedValue(prop2->getStringValue());
else
- return false;
+ {
+ const SGPropertyNode * prop2 = get_prop2(arg);
+ if (prop2)
+ return prop->setUnspecifiedValue(prop2->getStringValue());
+ else
+ return false;
+ }
}
}
}
+static bool
+do_open_browser (const SGPropertyNode * arg)
+{
+ string path;
+ if (arg->hasValue("path"))
+ path = arg->getStringValue("path");
+ else
+ if (arg->hasValue("url"))
+ path = arg->getStringValue("url");
+ else
+ return false;
+
+ return openBrowser(path);
+}
/**
* Apply a value in the active XML-configured dialog.
do_add_model (const SGPropertyNode * arg)
{
SGPropertyNode * model = fgGetNode("models", true);
- for (int i = 0;; i++) {
- if (i < 0)
- return false;
- if (!model->getChild("model", i, false)) {
- model = model->getChild("model", i, true);
- break;
- }
- }
+ int i;
+ for (i = 0; model->hasChild("model",i); i++);
+ model = model->getChild("model", i, true);
copyProperties(arg, model);
if (model->hasValue("elevation-m"))
model->setDoubleValue("elevation-ft", model->getDoubleValue("elevation-m")
return true;
}
-/**
- * Built-in command: replay the FDR buffer
- */
-static bool
-do_replay (const SGPropertyNode * arg)
-{
- // freeze the fdm, resume from sim pause
- fgSetInt( "/sim/freeze/replay-state", 1 );
- fgSetBool("/sim/freeze/master", 0 );
- fgSetBool("/sim/freeze/clock", 0 );
- fgSetDouble( "/sim/replay/time", -1 );
-
- // cout << "start = " << r->get_start_time()
- // << " end = " << r->get_end_time() << endl;
-
- return true;
-}
-
/*
static bool
do_decrease_visibility (const SGPropertyNode * arg)
std::string icao = arg->getStringValue("icao");
if (icao.empty()) {
if (file.isRelative()) {
- file = globals->resolve_maybe_aircraft_path(file.str());
+ SGPath absPath = globals->resolve_maybe_aircraft_path(file.str());
+ if (!absPath.isNull())
+ file = absPath;
+ else
+ {
+ SG_LOG(SG_IO, SG_ALERT, "loadxml: Cannot find XML property file '"
+ << file.str() << "'.");
+ return false;
+ }
}
} else {
if (!XMLLoader::findAirportData(icao, file.str(), file)) {
{ "dialog-close", do_dialog_close },
{ "dialog-update", do_dialog_update },
{ "dialog-apply", do_dialog_apply },
+ { "open-browser", do_open_browser },
{ "gui-redraw", do_gui_redraw },
{ "add-model", do_add_model },
{ "set-cursor", do_set_cursor },