FGHTTP: add getOrCreate helper
Avoids duplicate creation when launcher & remote-tape are used
This commit is contained in:
parent
8716801c8c
commit
497a99f8d7
4 changed files with 34 additions and 25 deletions
src
|
@ -623,11 +623,7 @@ bool runLauncherDialog()
|
||||||
globals->packageRoot()->setLocale(globals->get_locale()->getPreferredLanguage());
|
globals->packageRoot()->setLocale(globals->get_locale()->getPreferredLanguage());
|
||||||
|
|
||||||
// startup the HTTP system now since packages needs it
|
// startup the HTTP system now since packages needs it
|
||||||
FGHTTPClient* http = globals->add_new_subsystem<FGHTTPClient>();
|
FGHTTPClient::getOrCreate();
|
||||||
|
|
||||||
// we guard against re-init in the global phase; bind and postinit
|
|
||||||
// will happen as normal
|
|
||||||
http->init();
|
|
||||||
|
|
||||||
QPointer<NaturalEarthDataLoaderThread> naturalEarthLoader = new NaturalEarthDataLoaderThread;
|
QPointer<NaturalEarthDataLoaderThread> naturalEarthLoader = new NaturalEarthDataLoaderThread;
|
||||||
naturalEarthLoader->start();
|
naturalEarthLoader->start();
|
||||||
|
|
|
@ -1623,7 +1623,7 @@ fgOptLoadTape(const char* arg)
|
||||||
|
|
||||||
virtual ~ DelayedTapeLoader() {}
|
virtual ~ DelayedTapeLoader() {}
|
||||||
|
|
||||||
virtual void valueChanged(SGPropertyNode * node)
|
void valueChanged(SGPropertyNode* node) override
|
||||||
{
|
{
|
||||||
if (!fgGetBool("/sim/signals/fdm-initialized")) {
|
if (!fgGetBool("/sim/signals/fdm-initialized")) {
|
||||||
return;
|
return;
|
||||||
|
@ -1651,17 +1651,17 @@ fgOptLoadTape(const char* arg)
|
||||||
|
|
||||||
SGPropertyNode_ptr properties(new SGPropertyNode);
|
SGPropertyNode_ptr properties(new SGPropertyNode);
|
||||||
simgear::HTTP::FileRequestRef filerequest;
|
simgear::HTTP::FileRequestRef filerequest;
|
||||||
|
SGTimeStamp timeout;
|
||||||
|
|
||||||
std::string path = urlToLocalPath(arg);
|
std::string path = urlToLocalPath(arg);
|
||||||
if (path == "") {
|
if (path.empty()) {
|
||||||
// <arg> is a local file.
|
// <arg> is a local file.
|
||||||
//
|
//
|
||||||
// Load the recording's header if it is a Continuous recording.
|
// Load the recording's header if it is a Continuous recording.
|
||||||
//
|
//
|
||||||
path = FGReplay::makeTapePath(arg);
|
path = FGReplay::makeTapePath(arg);
|
||||||
(void) FGReplay::loadContinuousHeader(path.c_str(), nullptr /*in*/, properties);
|
(void) FGReplay::loadContinuousHeader(path.c_str(), nullptr /*in*/, properties);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// <arg> is a URL. Start download.
|
// <arg> is a URL. Start download.
|
||||||
//
|
//
|
||||||
// Load the recording's header if it is a Continuous recording.
|
// 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.
|
// directly in order to download at least the header.
|
||||||
//
|
//
|
||||||
const char* url = arg;
|
const char* url = arg;
|
||||||
FGHTTPClient* http = globals->add_new_subsystem<FGHTTPClient>();
|
FGHTTPClient* http = FGHTTPClient::getOrCreate();
|
||||||
http->init();
|
SG_LOG(SG_GENERAL, SG_MANDATORY_INFO, "Replaying url " << url << " using local path: " << path);
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT, "Replaying url " << url << " using local path: " << path);
|
|
||||||
filerequest.reset(new simgear::HTTP::FileRequest(url, path, true /*append*/));
|
filerequest.reset(new simgear::HTTP::FileRequest(url, path, true /*append*/));
|
||||||
filerequest->setAcceptEncoding(""); // "" means request any supported compression.
|
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
|
// Can be useful to limite download speed for testing background
|
||||||
// download.
|
// download.
|
||||||
//
|
//
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT, "Limiting download speed"
|
SG_LOG(SG_GENERAL, SG_MANDATORY_INFO, "Limiting download speed"
|
||||||
<< " /sim/replay/download-max-bytes-per-sec=" << max_download_speed
|
<< " /sim/replay/download-max-bytes-per-sec=" << max_download_speed);
|
||||||
);
|
|
||||||
filerequest->setMaxBytesPerSec(max_download_speed);
|
filerequest->setMaxBytesPerSec(max_download_speed);
|
||||||
}
|
}
|
||||||
http->client()->makeRequest(filerequest);
|
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
|
// portion of the recording to be downloaded. We give up after a fixed
|
||||||
// timeout.
|
// timeout.
|
||||||
//
|
//
|
||||||
time_t t0 = time(NULL);
|
timeout.stamp();
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT, "Starting download from: " << url);
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
// Run http client's update() to download any pending data.
|
// Run http client's update() to download any pending data.
|
||||||
http->update(0);
|
http->update(0);
|
||||||
|
@ -1720,14 +1717,14 @@ fgOptLoadTape(const char* arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we get here, need to download some more.
|
// 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);
|
SG_LOG(SG_GENERAL, SG_POPUP, "Timeout while reading downloaded recording from " << url << ". local path=" << path);
|
||||||
return FG_OPTIONS_EXIT;
|
return FG_OPTIONS_EXIT;
|
||||||
}
|
}
|
||||||
SGTimeStamp::sleepForMSec(1000);
|
SGTimeStamp::sleepForMSec(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set aircraft from recording header if we loaded it above; this has to
|
// 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
|
// 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
|
// 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 aircraft = properties->getStringValue("meta/aircraft-type");
|
||||||
std::string airport = properties->getStringValue("meta/closest-airport-id");
|
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
|
// Override aircraft and airport settings to match what is in the
|
||||||
// recording.
|
// recording.
|
||||||
//
|
//
|
||||||
|
@ -2847,16 +2844,16 @@ OptionResult Options::processOptions()
|
||||||
globals->append_fg_scenery(root);
|
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
|
// This might not be necessary, because we always end up calling
|
||||||
// Options::initAircraft() later on, which also knows to use
|
// Options::initAircraft() later on, which also knows to use
|
||||||
// g_load_tape_aircraft if it is not "".
|
// 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);
|
fgSetString("/sim/aircraft", g_load_tape_aircraft);
|
||||||
}
|
}
|
||||||
if (g_load_tape_airport != "") {
|
if (!g_load_tape_airport.empty()) {
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT, "overriding airport from " << fgGetString("/sim/presets/airport-id") << " to " << g_load_tape_airport);
|
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());
|
fgOptAirport(g_load_tape_airport.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()
|
void FGHTTPClient::init()
|
||||||
{
|
{
|
||||||
// launcher may need to setup HTTP access abnormally early, so
|
// launcher may need to setup HTTP access abnormally early, so
|
||||||
|
|
|
@ -42,6 +42,9 @@ public:
|
||||||
// Subsystem identification.
|
// Subsystem identification.
|
||||||
static const char* staticSubsystemClassId() { return "http"; }
|
static const char* staticSubsystemClassId() { return "http"; }
|
||||||
|
|
||||||
|
|
||||||
|
static FGHTTPClient* getOrCreate();
|
||||||
|
|
||||||
void makeRequest(const simgear::HTTP::Request_ptr& req);
|
void makeRequest(const simgear::HTTP::Request_ptr& req);
|
||||||
|
|
||||||
simgear::HTTP::Client* client() { return _http.get(); }
|
simgear::HTTP::Client* client() { return _http.get(); }
|
||||||
|
|
Loading…
Add table
Reference in a new issue