#include <simgear/sound/soundmgr_openal.hxx>
#include <simgear/timing/sg_time.hxx>
#include <simgear/misc/interpolator.hxx>
+#include <simgear/io/HTTPRequest.hxx>
-#include <Cockpit/panel.hxx>
-#include <Cockpit/panel_io.hxx>
#include <FDM/flight.hxx>
#include <GUI/gui.h>
#include <GUI/new_gui.hxx>
#include <Scripting/NasalSys.hxx>
#include <Sound/sample_queue.hxx>
#include <Airports/xmlloader.hxx>
-#include <ATC/CommStation.hxx>
-#include <Navaids/navrecord.hxx>
-#include <Navaids/navlist.hxx>
+#include <Network/HTTPClient.hxx>
+#include <Viewer/viewmgr.hxx>
+#include <Viewer/viewer.hxx>
+#include <Environment/presets.hxx>
#include "fg_init.hxx"
#include "fg_io.hxx"
#include "globals.hxx"
#include "logger.hxx"
#include "util.hxx"
-#include "viewmgr.hxx"
#include "main.hxx"
-#include <Main/viewer.hxx>
-#include <Environment/presets.hxx>
#include <boost/scoped_array.hpp>
static bool
do_panel_load (const SGPropertyNode * arg)
{
- string panel_path =
- arg->getStringValue("path", fgGetString("/sim/panel/path"));
- if (panel_path.empty()) {
- return false;
+ string panel_path = arg->getStringValue("path");
+ if (!panel_path.empty()) {
+ // write to the standard property, which will force a load
+ fgSetString("/sim/panel/path", panel_path.c_str());
}
- 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);
- globals->get_current_panel()->unbind();
- globals->set_current_panel( new_panel );
- globals->get_current_panel()->bind();
return true;
}
-
-/**
- * Built-in command: pass a mouse click to the panel.
- *
- * button: the mouse button number, zero-based.
- * is-down: true if the button is down, false if it is up.
- * x-pos: the x position of the mouse click.
- * y-pos: the y position of the mouse click.
- */
-static bool
-do_panel_mouse_click (const SGPropertyNode * arg)
-{
- if (globals->get_current_panel() != 0)
- return globals->get_current_panel()
- ->doMouseAction(arg->getIntValue("button"),
- arg->getBoolValue("is-down") ? PU_DOWN : PU_UP,
- arg->getIntValue("x-pos"),
- arg->getIntValue("y-pos"));
- else
- return false;
-}
-
-
/**
* Built-in command: (re)load preferences.
*
return true;
}
+class RemoteXMLRequest : public simgear::HTTP::Request
+{
+public:
+ SGPropertyNode_ptr _complete;
+ SGPropertyNode_ptr _status;
+ SGPropertyNode_ptr _failed;
+ SGPropertyNode_ptr _target;
+ string propsData;
+
+ RemoteXMLRequest(const std::string& url, SGPropertyNode* targetNode) :
+ simgear::HTTP::Request(url),
+ _target(targetNode)
+ {
+ }
+
+ void setCompletionProp(SGPropertyNode_ptr p)
+ {
+ _complete = p;
+ }
+
+ void setStatusProp(SGPropertyNode_ptr p)
+ {
+ _status = p;
+ }
+
+ void setFailedProp(SGPropertyNode_ptr p)
+ {
+ _failed = p;
+ }
+protected:
+ virtual void gotBodyData(const char* s, int n)
+ {
+ propsData += string(s, n);
+ }
+
+ virtual void responseComplete()
+ {
+ int response = responseCode();
+ bool failed = false;
+ if (response == 200) {
+ try {
+ const char* buffer = propsData.c_str();
+ readProperties(buffer, propsData.size(), _target, true);
+ } catch (const sg_exception &e) {
+ SG_LOG(SG_IO, SG_WARN, "parsing XML from remote, failed: " << e.getFormattedMessage());
+ failed = true;
+ response = 406; // 'not acceptable', anything better?
+ }
+ } else {
+ failed = true;
+ }
+ // now the response data is output, signal Nasal / listeners
+ if (_complete) _complete->setBoolValue(true);
+ if (_status) _status->setIntValue(response);
+ if (_failed) _failed->setBoolValue(failed);
+ }
+};
+
+
+static bool
+do_load_xml_from_url(const SGPropertyNode * arg)
+{
+ std::string url(arg->getStringValue("url"));
+ if (url.empty())
+ return false;
+
+ SGPropertyNode *targetnode;
+ if (arg->hasValue("targetnode"))
+ targetnode = fgGetNode(arg->getStringValue("targetnode"), true);
+ else
+ targetnode = const_cast<SGPropertyNode *>(arg)->getNode("data", true);
+
+ RemoteXMLRequest* req = new RemoteXMLRequest(url, targetnode);
+
+// connect up optional reporting properties
+ if (arg->hasValue("complete"))
+ req->setCompletionProp(fgGetNode(arg->getStringValue("complete"), true));
+ if (arg->hasValue("failure"))
+ req->setFailedProp(fgGetNode(arg->getStringValue("failure"), true));
+ if (arg->hasValue("status"))
+ req->setStatusProp(fgGetNode(arg->getStringValue("status"), true));
+
+ FGHTTPClient::instance()->makeRequest(req);
+
+ return true;
+}
+
/**
* An fgcommand to allow saving of xml files via nasal,
return true;
}
-
-static SGGeod commandSearchPos(const SGPropertyNode* arg)
-{
- if (arg->hasChild("longitude-deg") && arg->hasChild("latitude-deg")) {
- return SGGeod::fromDeg(arg->getDoubleValue("longitude-deg"),
- arg->getDoubleValue("latitude-deg"));
- }
-
- // use current viewer/aircraft position
- return SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"),
- fgGetDouble("/position/latitude-deg"));
-}
-
-static bool
-do_comm_search(const SGPropertyNode* arg)
-{
- SGGeod pos = commandSearchPos(arg);
- int khz = static_cast<int>(arg->getDoubleValue("frequency-mhz") * 100.0 + 0.25);
-
- flightgear::CommStation* sta = flightgear::CommStation::findByFreq(khz, pos, NULL);
- if (!sta) {
- return true;
- }
-
- SGPropertyNode* result = fgGetNode(arg->getStringValue("result"));
- sta->createBinding(result);
- return true;
-}
-
-static bool
-do_nav_search(const SGPropertyNode* arg)
-{
- SGGeod pos = commandSearchPos(arg);
- double mhz = arg->getDoubleValue("frequency-mhz");
-
- FGNavList* navList = globals->get_navlist();
- string type(arg->getStringValue("type", "vor"));
- if (type == "dme") {
- navList = globals->get_dmelist();
- } else if (type == "tacan") {
- navList = globals->get_tacanlist();
- }
-
- FGNavRecord* nav = navList->findByFreq(mhz, pos);
- if (!nav && (type == "vor")) {
- // if we're searching VORs, look for localizers too
- nav = globals->get_loclist()->findByFreq(mhz, pos);
- }
-
- if (!nav) {
- return true;
- }
-
- SGPropertyNode* result = fgGetNode(arg->getStringValue("result"));
- nav->createBinding(result);
- return true;
-}
////////////////////////////////////////////////////////////////////////
// Command setup.
{ "load", do_load },
{ "save", do_save },
{ "panel-load", do_panel_load },
- { "panel-mouse-click", do_panel_mouse_click },
{ "preferences-load", do_preferences_load },
{ "view-cycle", do_view_cycle },
{ "screen-capture", do_screen_capture },
*/
{ "loadxml", do_load_xml_to_proptree},
{ "savexml", do_save_xml_from_proptree },
+ { "xmlhttprequest", do_load_xml_from_url },
{ "press-cockpit-button", do_press_cockpit_button },
{ "release-cockpit-button", do_release_cockpit_button },
{ "dump-scenegraph", do_dump_scene_graph },
{ "dump-terrainbranch", do_dump_terrain_branch },
{ "print-visible-scene", do_print_visible_scene_info },
{ "reload-shaders", do_reload_shaders },
-
- { "find-navaid", do_nav_search },
- { "find-comm", do_comm_search },
-
+
{ 0, 0 } // zero-terminated
};