1
0
Fork 0

Bring metar helper into CMake world, and use new HTTP code.

This commit is contained in:
James Turner 2011-10-21 12:48:42 +01:00
parent 8ef07230c4
commit c5cbc57895
2 changed files with 78 additions and 1 deletions

View file

@ -84,3 +84,13 @@ target_link_libraries(fgfs
) )
install(TARGETS fgfs RUNTIME DESTINATION bin) 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)

View file

@ -31,7 +31,54 @@
#include <simgear/environment/metar.hxx> #include <simgear/environment/metar.hxx>
#include <simgear/structure/exception.hxx> #include <simgear/structure/exception.hxx>
#include <simgear/io/HTTPClient.hxx>
#include <simgear/io/HTTPRequest.hxx>
#include <simgear/timing/timestamp.hxx>
#include <simgear/misc/sg_sleep.hxx>
using namespace std; 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 // text color
#if defined(__linux__) || defined(__sun) || defined(__CYGWIN__) \ #if defined(__linux__) || defined(__sun) || defined(__CYGWIN__) \
@ -501,6 +548,9 @@ int main(int argc, char *argv[])
string proxy_host, proxy_port; string proxy_host, proxy_port;
getproxy(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++) { for (int i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
usage(); usage();
@ -525,7 +575,24 @@ int main(int argc, char *argv[])
} }
try { 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"); //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) { if (verbose) {