diff --git a/src/GUI/QtLauncher.cxx b/src/GUI/QtLauncher.cxx index e9453b2b9..9f7901e6f 100644 --- a/src/GUI/QtLauncher.cxx +++ b/src/GUI/QtLauncher.cxx @@ -623,11 +623,7 @@ bool runLauncherDialog() globals->packageRoot()->setLocale(globals->get_locale()->getPreferredLanguage()); // startup the HTTP system now since packages needs it - FGHTTPClient* http = globals->add_new_subsystem<FGHTTPClient>(); - - // we guard against re-init in the global phase; bind and postinit - // will happen as normal - http->init(); + FGHTTPClient::getOrCreate(); QPointer<NaturalEarthDataLoaderThread> naturalEarthLoader = new NaturalEarthDataLoaderThread; naturalEarthLoader->start(); diff --git a/src/Main/options.cxx b/src/Main/options.cxx index bbdb7d165..6fe600cec 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -1623,7 +1623,7 @@ fgOptLoadTape(const char* arg) virtual ~ DelayedTapeLoader() {} - virtual void valueChanged(SGPropertyNode * node) + void valueChanged(SGPropertyNode* node) override { if (!fgGetBool("/sim/signals/fdm-initialized")) { return; @@ -1651,17 +1651,17 @@ fgOptLoadTape(const char* arg) SGPropertyNode_ptr properties(new SGPropertyNode); simgear::HTTP::FileRequestRef filerequest; - + SGTimeStamp timeout; + std::string path = urlToLocalPath(arg); - if (path == "") { + if (path.empty()) { // <arg> is a local file. // // Load the recording's header if it is a Continuous recording. // path = FGReplay::makeTapePath(arg); (void) FGReplay::loadContinuousHeader(path.c_str(), nullptr /*in*/, properties); - } - else { + } else { // <arg> is a URL. Start download. // // Load the recording's header if it is a Continuous recording. @@ -1671,9 +1671,8 @@ fgOptLoadTape(const char* arg) // directly in order to download at least the header. // const char* url = arg; - FGHTTPClient* http = globals->add_new_subsystem<FGHTTPClient>(); - http->init(); - SG_LOG(SG_GENERAL, SG_ALERT, "Replaying url " << url << " using local path: " << path); + FGHTTPClient* http = FGHTTPClient::getOrCreate(); + SG_LOG(SG_GENERAL, SG_MANDATORY_INFO, "Replaying url " << url << " using local path: " << path); filerequest.reset(new simgear::HTTP::FileRequest(url, path, true /*append*/)); filerequest->setAcceptEncoding(""); // "" means request any supported compression. @@ -1682,9 +1681,8 @@ fgOptLoadTape(const char* arg) // Can be useful to limite download speed for testing background // download. // - SG_LOG(SG_GENERAL, SG_ALERT, "Limiting download speed" - << " /sim/replay/download-max-bytes-per-sec=" << max_download_speed - ); + SG_LOG(SG_GENERAL, SG_MANDATORY_INFO, "Limiting download speed" + << " /sim/replay/download-max-bytes-per-sec=" << max_download_speed); filerequest->setMaxBytesPerSec(max_download_speed); } http->client()->makeRequest(filerequest); @@ -1697,8 +1695,7 @@ fgOptLoadTape(const char* arg) // portion of the recording to be downloaded. We give up after a fixed // timeout. // - time_t t0 = time(NULL); - SG_LOG(SG_GENERAL, SG_ALERT, "Starting download from: " << url); + timeout.stamp(); for(;;) { // Run http client's update() to download any pending data. http->update(0); @@ -1720,14 +1717,14 @@ fgOptLoadTape(const char* arg) } // If we get here, need to download some more. - if (time(NULL) - t0 > 30) { + if (timeout.elapsedMSec() > (30 * 1000)) { SG_LOG(SG_GENERAL, SG_POPUP, "Timeout while reading downloaded recording from " << url << ". local path=" << path); return FG_OPTIONS_EXIT; } SGTimeStamp::sleepForMSec(1000); } } - + // Set aircraft from recording header if we loaded it above; this has to // happen now, before the FDM is initialised. Also set the airport; we // don't actually have to do this because the replay doesn't need terrain @@ -1735,7 +1732,7 @@ fgOptLoadTape(const char* arg) // std::string aircraft = properties->getStringValue("meta/aircraft-type"); std::string airport = properties->getStringValue("meta/closest-airport-id"); - SG_LOG(SG_GENERAL, SG_ALERT, "From recording header: aircraft=" << aircraft << " airport=" << airport); + SG_LOG(SG_GENERAL, SG_MANDATORY_INFO, "From recording header: aircraft=" << aircraft << " airport=" << airport); // Override aircraft and airport settings to match what is in the // recording. // @@ -2847,16 +2844,16 @@ OptionResult Options::processOptions() globals->append_fg_scenery(root); } - if (g_load_tape_aircraft != "") { + if (!g_load_tape_aircraft.empty()) { // This might not be necessary, because we always end up calling // Options::initAircraft() later on, which also knows to use // g_load_tape_aircraft if it is not "". // - SG_LOG(SG_GENERAL, SG_ALERT, "overriding aircraft from " << fgGetString("/sim/aircraft") << " to " << g_load_tape_aircraft); + SG_LOG(SG_GENERAL, SG_MANDATORY_INFO, "overriding aircraft from " << fgGetString("/sim/aircraft") << " to " << g_load_tape_aircraft); fgSetString("/sim/aircraft", g_load_tape_aircraft); } - if (g_load_tape_airport != "") { - SG_LOG(SG_GENERAL, SG_ALERT, "overriding airport from " << fgGetString("/sim/presets/airport-id") << " to " << g_load_tape_airport); + if (!g_load_tape_airport.empty()) { + SG_LOG(SG_GENERAL, SG_MANDATORY_INFO, "overriding airport from " << fgGetString("/sim/presets/airport-id") << " to " << g_load_tape_airport); fgOptAirport(g_load_tape_airport.c_str()); } diff --git a/src/Network/HTTPClient.cxx b/src/Network/HTTPClient.cxx index f06b4c8f3..06c5bb6ab 100644 --- a/src/Network/HTTPClient.cxx +++ b/src/Network/HTTPClient.cxx @@ -86,6 +86,19 @@ FGHTTPClient::~FGHTTPClient() { } +FGHTTPClient* FGHTTPClient::getOrCreate() +{ + auto ext = globals->get_subsystem<FGHTTPClient>(); + if (ext) { + return ext; + } + + ext = globals->add_new_subsystem<FGHTTPClient>(); + ext->init(); + return ext; +} + + void FGHTTPClient::init() { // launcher may need to setup HTTP access abnormally early, so diff --git a/src/Network/HTTPClient.hxx b/src/Network/HTTPClient.hxx index 07be3a452..95fc70797 100644 --- a/src/Network/HTTPClient.hxx +++ b/src/Network/HTTPClient.hxx @@ -42,6 +42,9 @@ public: // Subsystem identification. static const char* staticSubsystemClassId() { return "http"; } + + static FGHTTPClient* getOrCreate(); + void makeRequest(const simgear::HTTP::Request_ptr& req); simgear::HTTP::Client* client() { return _http.get(); }