#include <simgear/structure/event_mgr.hxx>
#include <simgear/sound/soundmgr_openal.hxx>
#include <simgear/timing/sg_time.hxx>
-#include <simgear/io/HTTPRequest.hxx>
+#include <simgear/io/HTTPMemoryRequest.hxx>
#include <FDM/flight.hxx>
#include <GUI/gui.h>
#include <boost/scoped_array.hpp>
-#ifdef FG_HAVE_GPERFTOOLS
+#if FG_HAVE_GPERFTOOLS
# include <google/profiler.h>
#endif
}
-\f
+
////////////////////////////////////////////////////////////////////////
// Command implementations.
////////////////////////////////////////////////////////////////////////
SGPropertyNode_ptr args(new SGPropertyNode);
args->setStringValue("id", "sim-pause");
- if (!paused) {
+ if (!paused && fgGetBool("/sim/view-name-popup")) {
args->setStringValue("label", "Simulation is paused");
globals->get_commands()->execute("show-message", args);
} else {
}
static void
-do_view_next( bool )
+do_view_next(bool do_it)
{
+ // Only switch view if really requested to do so (and not for example while
+ // reset/reposition where /command/view/next is set to false)
+ if( do_it )
+ {
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->next_view();
+ }
}
static void
-do_view_prev( bool )
+do_view_prev(bool do_it)
{
+ if( do_it )
+ {
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->prev_view();
+ }
}
/**
do_property_cycle (const SGPropertyNode * arg)
{
SGPropertyNode * prop = get_prop(arg);
- vector<SGPropertyNode_ptr> values = arg->getChildren("value");
+ std::vector<SGPropertyNode_ptr> values = arg->getChildren("value");
+
+ bool wrap = arg->getBoolValue("wrap", true);
+ // compatible with knob/pick animations
+ int offset = arg->getIntValue("offset", 1);
+
int selection = -1;
int nSelections = values.size();
// Try to find the current selection
for (int i = 0; i < nSelections; i++) {
if (compare_values(prop, values[i])) {
- selection = i + 1;
+ selection = i;
break;
}
}
- // Default or wrap to the first selection
- if (selection < 0 || selection >= nSelections)
+ if (selection < 0) { // default to first selection
selection = 0;
-
+ } else {
+ selection += offset;
+ if (wrap) {
+ selection = (selection + nSelections) % nSelections;
+ } else {
+ SG_CLAMP_RANGE(selection, 0, nSelections - 1);
+ }
+ }
+
prop->setUnspecifiedValue(values[selection]->getStringValue());
return true;
}
float volume = arg->getFloatValue("volume");
// cout << "playing " << path << " / " << file << endl;
try {
- static FGSampleQueue *queue = 0;
+ FGSampleQueue *queue = globals->get_chatter_queue();
if ( !queue ) {
- queue = new FGSampleQueue(smgr, "chatter");
- queue->tie_to_listener();
+ queue = new FGSampleQueue(smgr, "chatter");
+ queue->tie_to_listener();
+ globals->set_chatter_queue(queue);
}
SGSoundSample *msg = new SGSoundSample(file.c_str(), path);
return true;
}
-class RemoteXMLRequest : public simgear::HTTP::Request
+class RemoteXMLRequest:
+ public simgear::HTTP::MemoryRequest
{
public:
SGPropertyNode_ptr _complete;
SGPropertyNode_ptr _status;
SGPropertyNode_ptr _failed;
SGPropertyNode_ptr _target;
- string propsData;
- mutable string _requestBody;
- int _requestBodyLength;
- string _method;
-
+
RemoteXMLRequest(const std::string& url, SGPropertyNode* targetNode) :
- simgear::HTTP::Request(url),
- _target(targetNode),
- _requestBodyLength(-1),
- _method("GET")
+ simgear::HTTP::MemoryRequest(url),
+ _target(targetNode)
{
}
{
_failed = p;
}
-
- void setRequestData(const SGPropertyNode* body)
- {
- _method = "POST";
- std::stringstream buf;
- writeProperties(buf, body, true);
- _requestBody = buf.str();
- _requestBodyLength = _requestBody.size();
- }
- virtual std::string method() const
- {
- return _method;
- }
protected:
- virtual int requestBodyLength() const
- {
- return _requestBodyLength;
- }
- virtual void getBodyData(char* s, int& count) const
- {
- int toRead = std::min(count, (int) _requestBody.size());
- memcpy(s, _requestBody.c_str(), toRead);
- count = toRead;
- _requestBody = _requestBody.substr(count);
- }
-
- virtual std::string requestBodyType() const
- {
- return "application/xml";
- }
-
- virtual void gotBodyData(const char* s, int n)
- {
- propsData += string(s, n);
- }
-
- virtual void failed()
+ virtual void onFail()
{
SG_LOG(SG_IO, SG_INFO, "network level failure in RemoteXMLRequest");
if (_failed) {
}
}
- virtual void responseComplete()
+ virtual void onDone()
{
- simgear::HTTP::Request::responseComplete();
-
int response = responseCode();
bool failed = false;
if (response == 200) {
try {
- const char* buffer = propsData.c_str();
- readProperties(buffer, propsData.size(), _target, true);
+ const char* buffer = responseBody().c_str();
+ readProperties(buffer, responseBody().size(), _target, true);
} catch (const sg_exception &e) {
SG_LOG(SG_IO, SG_WARN, "parsing XML from remote, failed: " << e.getFormattedMessage());
failed = true;
RemoteXMLRequest* req = new RemoteXMLRequest(url, targetnode);
if (arg->hasChild("body"))
- req->setRequestData(arg->getChild("body"));
+ req->setBodyData(arg->getChild("body"));
// connect up optional reporting properties
if (arg->hasValue("complete"))
// Optional profiling commands using gperftools:
// http://code.google.com/p/gperftools/
-#ifndef FG_HAVE_GPERFTOOLS
+#if !FG_HAVE_GPERFTOOLS
static void
no_profiling_support()
{
static bool
do_profiler_start(const SGPropertyNode *arg)
{
-#ifdef FG_HAVE_GPERFTOOLS
+#if FG_HAVE_GPERFTOOLS
const char *filename = arg->getStringValue("filename", "fgfs.profile");
ProfilerStart(filename);
return true;
static bool
do_profiler_stop(const SGPropertyNode *arg)
{
-#ifdef FG_HAVE_GPERFTOOLS
+#if FG_HAVE_GPERFTOOLS
ProfilerStop();
return true;
#else
fgTie( "/command/view/next", dummy(0), do_view_next );
fgTie( "/command/view/prev", dummy(0), do_view_prev );
- SGPropertyNode* profiler_available =
- globals->get_props()->getNode("/sim/debug/profiler-available", true);
-#ifdef FG_HAVE_GPERFTOOLS
- profiler_available->setBoolValue(true);
-#else
- profiler_available->setBoolValue(false);
-#endif
- profiler_available->setAttributes(SGPropertyNode::READ);
+ globals->get_props()->setValueReadOnly( "/sim/debug/profiler-available",
+ bool(FG_HAVE_GPERFTOOLS) );
}
// end of fg_commands.cxx