From c5cbc57895bcf85a17ed70e13fa8f6994fbc53d9 Mon Sep 17 00:00:00 2001 From: James Turner Date: Fri, 21 Oct 2011 12:48:42 +0100 Subject: [PATCH] Bring metar helper into CMake world, and use new HTTP code. --- src/Main/CMakeLists.txt | 10 ++++++ src/Main/metar_main.cxx | 69 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/Main/CMakeLists.txt b/src/Main/CMakeLists.txt index 8398ff650..565ec65b1 100644 --- a/src/Main/CMakeLists.txt +++ b/src/Main/CMakeLists.txt @@ -84,3 +84,13 @@ target_link_libraries(fgfs ) install(TARGETS fgfs RUNTIME DESTINATION bin) + +add_executable(metar metar_main.cxx) +target_link_libraries(metar + ${SIMGEAR_LIBRARIES} + ${SIMGEAR_CORE_LIBRARY_DEPENDENCIES} + ${PLATFORM_LIBS} +) + +install(TARGETS metar RUNTIME DESTINATION bin) + diff --git a/src/Main/metar_main.cxx b/src/Main/metar_main.cxx index 04edbcab1..a80c1da2c 100644 --- a/src/Main/metar_main.cxx +++ b/src/Main/metar_main.cxx @@ -31,7 +31,54 @@ #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__) \ @@ -501,6 +548,9 @@ int main(int argc, char *argv[]) string proxy_host, proxy_port; getproxy(proxy_host, proxy_port); + 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(); @@ -525,7 +575,24 @@ 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.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; + } + 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) { -- 2.39.5