//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#include <iomanip>
#include <sstream>
+#include <iostream>
#include <string.h>
+#include <time.h>
+#include <cstdlib>
#include <simgear/debug/logstream.hxx>
#include <simgear/environment/metar.hxx>
#include <simgear/structure/exception.hxx>
+#include <simgear/io/HTTPClient.hxx>
+#include <simgear/io/HTTPRequest.hxx>
+#include <simgear/timing/timestamp.hxx>
+
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__) \
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);
}
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();
}
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) {