]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/metar_main.cxx
Reset: clear the osg object cache
[flightgear.git] / src / Main / metar_main.cxx
index 36567ffb30b640fcc9f9636ae46ceaed130546f5..d97ed1a6fae0f634bd51235a2463a898c7aa977d 100644 (file)
 //
 // 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 <cstdio>
+
+#include <boost/algorithm/string.hpp>
 
-#include <simgear/debug/logstream.hxx>
 #include <simgear/environment/metar.hxx>
 #include <simgear/structure/exception.hxx>
 
+#include <simgear/io/HTTPClient.hxx>
+#include <simgear/io/HTTPMemoryRequest.hxx>
+#include <simgear/io/raw_socket.hxx>
+#include <simgear/timing/timestamp.hxx>
+
 using namespace std;
+using namespace simgear;
 
 // text color
 #if defined(__linux__) || defined(__sun) || defined(__CYGWIN__) \
@@ -75,11 +86,11 @@ 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);
 }
 
 
-ostream& operator<<(ostream& s, SGMetarVisibility& v)
+ostream& operator<<(ostream& s, const SGMetarVisibility& v)
 {
        ostringstream buf;
        int m = v.getModifier();
@@ -154,7 +165,7 @@ void printReport(SGMetar *m)
 
 
        // directed visibility
-       SGMetarVisibility *dirvis = m->getDirVisibility();
+       const SGMetarVisibility *dirvis = m->getDirVisibility();
        for (i = 0; i < 8; i++, dirvis++)
                if (dirvis->getVisibility_m() != NaN)
                        cout << "\t\t\t" << *dirvis << endl;
@@ -269,7 +280,7 @@ void printReport(SGMetar *m)
                if ((s = rwy.getExtentString()) && strlen(s))
                        surface.push_back(s);
                if ((d = rwy.getDepth()) != NaN) {
-                       sprintf(buf, "%.0lf mm", d * 1000.0);
+                       sprintf(buf, "%.1lf mm", d * 1000.0);
                        surface.push_back(buf);
                }
                if ((s = rwy.getFrictionString()) && strlen(s))
@@ -279,7 +290,7 @@ void printReport(SGMetar *m)
                        surface.push_back(buf);
                }
 
-               if (surface.size()) {
+               if (! surface.empty()) {
                        vector<string>::iterator rwysurf = surface.begin();
                        for (i = 0; rwysurf != surface.end(); rwysurf++, i++) {
                                if (i)
@@ -484,7 +495,6 @@ void usage()
        );
 }
 
-
 int main(int argc, char *argv[])
 {
        bool report = true;
@@ -499,6 +509,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();
@@ -522,8 +537,41 @@ int main(int argc, char *argv[])
                                shown = true;
                        }
 
-                       try {
-                               SGMetar *m = new SGMetar(argv[i], proxy_host, proxy_port, "", time(0));
+                       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<std::string>(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->isComplete() )
+                        break;
+                    SGTimeStamp::sleepForMSec(1);
+                }
+                
+                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->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) {