X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_commands.cxx;h=9303b17727f14e55cdef5540dd2a5334cbffd0f3;hb=6a9051883c1e5c1b7534ba0c833ebe86c85425a9;hp=860f9a1f9c9d54f1fdfcf8bcde3bfb069f095dca;hpb=b75e1af83856c916744062475f71a96e765e9d7e;p=flightgear.git diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx index 860f9a1f9..9303b1772 100644 --- a/src/Main/fg_commands.cxx +++ b/src/Main/fg_commands.cxx @@ -1,12 +1,25 @@ // fg_commands.cxx - internal FGFS commands. -#include "fg_commands.hxx" +#include + +#include STL_STRING +#include STL_FSTREAM #include #include #include #include +#include +#include + +#include "fg_commands.hxx" + +SG_USING_STD(string); +#if !defined(SG_HAVE_NATIVE_SGI_COMPILERS) +SG_USING_STD(ifstream); +SG_USING_STD(ofstream); +#endif #include "fg_props.hxx" #include "fg_io.hxx" @@ -37,6 +50,104 @@ do_exit (const SGPropertyNode * arg) } +/** + * Built-in command: load flight. + * + * file (optional): the name of the file to load (relative to current + * directory). Defaults to "fgfs.sav". + */ +static bool +do_load (const SGPropertyNode * arg) +{ + const string &file = arg->getStringValue("file", "fgfs.sav"); + ifstream input(file.c_str()); + if (input.good() && fgLoadFlight(input)) { + input.close(); + SG_LOG(SG_INPUT, SG_INFO, "Restored flight from " << file); + return true; + } else { + SG_LOG(SG_INPUT, SG_ALERT, "Cannot load flight from " << file); + return false; + } +} + + +/** + * Built-in command: save flight. + * + * file (optional): the name of the file to save (relative to the + * current directory). Defaults to "fgfs.sav". + */ +static bool +do_save (const SGPropertyNode * arg) +{ + const string &file = arg->getStringValue("file", "fgfs.sav"); + SG_LOG(SG_INPUT, SG_INFO, "Saving flight"); + ofstream output(file.c_str()); + if (output.good() && fgSaveFlight(output)) { + output.close(); + SG_LOG(SG_INPUT, SG_INFO, "Saved flight to " << file); + return true; + } else { + SG_LOG(SG_INPUT, SG_ALERT, "Cannot save flight to " << file); + return false; + } +} + + +/** + * Built-in command: (re)load the panel. + * + * path (optional): the file name to load the panel from + * (relative to FG_ROOT). Defaults to the value of /sim/panel/path, + * and if that's unspecified, to "Panels/Default/default.xml". + */ +static bool +do_panel_load (const SGPropertyNode * arg) +{ + string panel_path = + arg->getStringValue("path", + fgGetString("/sim/panel/path", + "Panels/Default/default.xml")); + FGPanel * new_panel = fgReadPanel(panel_path); + if (new_panel == 0) { + SG_LOG(SG_INPUT, SG_ALERT, + "Error reading new panel from " << panel_path); + return false; + } + SG_LOG(SG_INPUT, SG_INFO, "Loaded new panel from " << panel_path); + current_panel->unbind(); + delete current_panel; + current_panel = new_panel; + current_panel->bind(); + return true; +} + + +/** + * Built-in command: (re)load preferences. + * + * path (optional): the file name to load the panel from (relative + * to FG_ROOT). Defaults to "preferences.xml". + */ +static bool +do_preferences_load (const SGPropertyNode * arg) +{ + const string &path = arg->getStringValue("path", "preferences.xml"); + SGPath props_path(globals->get_fg_root()); + props_path.append(path); + SG_LOG(SG_INPUT, SG_INFO, "Reading global preferences from " + << props_path.str()); + if (!readProperties(props_path.str(), globals->get_props())) { + SG_LOG(SG_INPUT, SG_ALERT, "Failed to reread global preferences"); + return false; + } else { + SG_LOG(SG_INPUT, SG_INFO, "Successfully read global preferences."); + return true; + } +} + + /** * Built-in command: cycle view. */ @@ -94,17 +205,17 @@ do_property_assign (const SGPropertyNode * arg) SGPropertyNode * node = fgGetNode(propname, true); switch (node->getType()) { - case SGValue::BOOL: + case SGPropertyNode::BOOL: return node->setBoolValue(arg->getBoolValue("value")); - case SGValue::INT: + case SGPropertyNode::INT: return node->setIntValue(arg->getIntValue("value")); - case SGValue::LONG: + case SGPropertyNode::LONG: return node->setLongValue(arg->getLongValue("value")); - case SGValue::FLOAT: + case SGPropertyNode::FLOAT: return node->setFloatValue(arg->getFloatValue("value")); - case SGValue::DOUBLE: + case SGPropertyNode::DOUBLE: return node->setDoubleValue(arg->getDoubleValue("value")); - case SGValue::STRING: + case SGPropertyNode::STRING: return node->setStringValue(arg->getStringValue("value")); default: return node->setUnknownValue(arg->getStringValue("value")); @@ -128,21 +239,21 @@ do_property_adjust (const SGPropertyNode * arg) SGPropertyNode * node = fgGetNode(propname, true); switch (node->getType()) { - case SGValue::BOOL: + case SGPropertyNode::BOOL: if (arg->getBoolValue("step")) return node->setBoolValue(!node->getBoolValue()); else return true; - case SGValue::INT: + case SGPropertyNode::INT: return node->setIntValue(node->getIntValue() + arg->getIntValue("step")); - case SGValue::LONG: + case SGPropertyNode::LONG: return node->setLongValue(node->getLongValue() + arg->getLongValue("step")); - case SGValue::FLOAT: + case SGPropertyNode::FLOAT: return node->setFloatValue(node->getFloatValue() + arg->getFloatValue("step")); - case SGValue::DOUBLE: + case SGPropertyNode::DOUBLE: return node->setDoubleValue(node->getDoubleValue() + arg->getDoubleValue("step")); default: // doesn't make sense with strings @@ -205,6 +316,10 @@ static struct { } built_ins [] = { "null", do_null, "exit", do_exit, + "load", do_load, + "save", do_save, + "panel-load", do_panel_load, + "preferences-load", do_preferences_load, "view-cycle", do_view_cycle, "screen-capture", do_screen_capture, "property-toggle", do_property_toggle,