X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fmetar_main.cxx;h=9158dc89a1ec891d2ec1112003f2c3f44fb76e4a;hb=33425c671d20fc7a7fbb87c2db28aef455b5b5dd;hp=0857bac5dc6bacf8cf62f63b35467924be704677;hpb=a251fd35cb3ad3f6b30982f1b74702ca0dec5b67;p=flightgear.git diff --git a/src/Main/metar_main.cxx b/src/Main/metar_main.cxx index 0857bac5d..9158dc89a 100644 --- a/src/Main/metar_main.cxx +++ b/src/Main/metar_main.cxx @@ -24,12 +24,62 @@ #include #include #include +#include +#include +#include #include #include #include +#include +#include +#include +#include + using namespace std; +using namespace simgear; + +class MetarRequest : public HTTP::Request +{ +public: + bool complete; + bool failed; + string metarData; + bool fromProxy; + + MetarRequest(const std::string& stationId) : + HTTP::Request("http://weather.noaa.gov/pub/data/observations/metar/stations/" + stationId + ".TXT"), + complete(false), + failed(false) + { + fromProxy = false; + } + +protected: + + virtual void responseHeader(const string& key, const string& value) + { + if (key == "x-metarproxy") { + fromProxy = true; + } + } + + virtual void gotBodyData(const char* s, int n) + { + metarData += string(s, n); + } + + virtual void responseComplete() + { + if (responseCode() == 200) { + complete = true; + } else { + SG_LOG(SG_ENVIRONMENT, SG_WARN, "metar download failed:" << url() << ": reason:" << responseReason()); + failed = true; + } + } +}; // text color #if defined(__linux__) || defined(__sun) || defined(__CYGWIN__) \ @@ -76,7 +126,7 @@ const char *azimuthName(double d) double rnd(double r, int g = 0) { double f = pow(10.0, g); - return f * rint(r / f); + return f * floor(r / f + 0.5); } @@ -280,7 +330,7 @@ void printReport(SGMetar *m) surface.push_back(buf); } - if (surface.size()) { + if (! surface.empty()) { vector::iterator rwysurf = surface.begin(); for (i = 0; rwysurf != surface.end(); rwysurf++, i++) { if (i) @@ -499,6 +549,11 @@ int main(int argc, char *argv[]) string proxy_host, proxy_port; getproxy(proxy_host, proxy_port); + Socket::initSockets(); + + HTTP::Client http; + http.setProxy(proxy_host, atoi(proxy_port.c_str())); + for (int i = 1; i < argc; i++) { if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) usage(); @@ -523,7 +578,25 @@ int main(int argc, char *argv[]) } try { - SGMetar *m = new SGMetar(argv[i], proxy_host, proxy_port, "", time(0)); + MetarRequest* mr = new MetarRequest(argv[i]); + HTTP::Request_ptr own(mr); + http.makeRequest(mr); + + // spin until the request completes, fails or times out + SGTimeStamp start(SGTimeStamp::now()); + while (start.elapsedMSec() < 8000) { + http.update(); + if (mr->complete || mr->failed) { + break; + } + SGTimeStamp::sleepForMSec(1); + } + + if (!mr->complete) { + throw sg_io_exception("metar download failed (or timed out)"); + } + SGMetar *m = new SGMetar(mr->metarData); + //SGMetar *m = new SGMetar("2004/01/11 01:20\nLOWG 110120Z AUTO VRB01KT 0050 1600N R35/0600 FG M06/M06 Q1019 88//////\n"); if (verbose) {