X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fmetar_main.cxx;h=977ebf4c1f6f05889d2b59b4548d81363e2e3a6e;hb=43fcbd22463b32d95678edf920d7184055b2d63e;hp=bf7430d127194b5223563ffcd7c7614226506300;hpb=1b3ea65b5e41fe1fd29fb8415527331a3627aa36;p=flightgear.git diff --git a/src/Main/metar_main.cxx b/src/Main/metar_main.cxx index bf7430d12..977ebf4c1 100644 --- a/src/Main/metar_main.cxx +++ b/src/Main/metar_main.cxx @@ -26,63 +26,23 @@ #include #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__) \ - || defined( __FreeBSD__ ) || defined ( sgi ) +#if defined(__linux__) || defined(__sun) || defined(__CYGWIN__) || defined( __FreeBSD__ ) || defined ( sgi ) # define R "\033[31;1m" // red # define G "\033[32;1m" // green # define Y "\033[33;1m" // yellow @@ -227,7 +187,7 @@ void printReport(SGMetar *m) if ((i = m->getWindDir()) == -1) cout << "from variable directions"; else - cout << "from the " << azimuthName(i) << " (" << i << "°)"; + cout << "from the " << azimuthName(i) << " (" << i << "°)"; cout << " at " << rnd(d, -1) << " km/h"; cout << "\t\t" << rnd(m->getWindSpeed_kt(), -1) << " kt"; @@ -248,19 +208,19 @@ void printReport(SGMetar *m) if (from != to) { cout << "\t\t\tvariable from " << azimuthName(from); cout << " to " << azimuthName(to); - cout << " (" << from << "°--" << to << "°)" << endl; + cout << " (" << from << "°--" << to << "°)" << endl; } } // temperature/humidity/air pressure if ((d = m->getTemperature_C()) != NaN) { - cout << "Temperature:\t\t" << d << "°C\t\t\t\t\t"; - cout << rnd(m->getTemperature_F(), -1) << "°F" << endl; + cout << "Temperature:\t\t" << d << "°C\t\t\t\t\t"; + cout << rnd(m->getTemperature_F(), -1) << "°F" << endl; if ((d = m->getDewpoint_C()) != NaN) { - cout << "Dewpoint:\t\t" << d << "°C\t\t\t\t\t"; - cout << rnd(m->getDewpoint_F(), -1) << "°F" << endl; + cout << "Dewpoint:\t\t" << d << "°C\t\t\t\t\t"; + cout << rnd(m->getDewpoint_F(), -1) << "°F" << endl; cout << "Rel. Humidity:\t\t" << rnd(m->getRelHumidity()) << "%" << endl; } } @@ -329,7 +289,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) @@ -463,7 +423,7 @@ void printArgs(SGMetar *m, double airport_elevation) sprintf(&buf[strlen(buf)], ":%.0lf", gust_speed); args.push_back(buf); } - + // output everything //cout << "fgfs" << endl; @@ -548,9 +508,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(); @@ -574,34 +536,49 @@ int main(int argc, char *argv[]) shown = true; } - try { - MetarRequest* mr = new MetarRequest(argv[i]); + try + { + static const std::string NOAA_BASE_URL = + "http://weather.noaa.gov/pub/data/observations/metar/stations/"; + HTTP::MemoryRequest* mr = new HTTP::MemoryRequest + ( + NOAA_BASE_URL + + boost::to_upper_copy(argv[i]) + ".TXT" + ); 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) { + if( mr->isComplete() ) break; - } - sleepForMSec(1); + SGTimeStamp::sleepForMSec(1); } - - if (!mr->complete) { - throw sg_io_exception("metar download failed (or timed out)"); + + if( !mr->isComplete() ) + throw sg_io_exception("metar download timed out"); + if( mr->responseCode() != 200 ) + { + std::cerr << "metar download failed: " + << mr->url() + << " (" << mr->responseCode() + << " " << mr->responseReason() << ")" + << std::endl; + throw sg_io_exception("metar download failed"); } - SGMetar *m = new SGMetar(mr->metarData); - + + SGMetar *m = new SGMetar(mr->responseBody()); + //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) { - cerr << G"INPUT: " << m->getData() << ""N << endl; + cerr << G "INPUT: " << m->getData() << "" N << endl; const char *unused = m->getUnusedData(); if (*unused) - cerr << R"UNUSED: " << unused << ""N << endl; + cerr << R "UNUSED: " << unused << "" N << endl; } if (report) @@ -611,7 +588,7 @@ int main(int argc, char *argv[]) delete m; } catch (const sg_io_exception& e) { - cerr << R"ERROR: " << e.getFormattedMessage().c_str() << ""N << endl << endl; + cerr << R "ERROR: " << e.getFormattedMessage().c_str() << "" N << endl << endl; } } }