]> git.mxchange.org Git - flightgear.git/commitdiff
Expose HTTP module to Nasal.
authorThomas Geymayer <tomgey@gmail.com>
Mon, 14 Oct 2013 23:02:05 +0000 (01:02 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Sun, 27 Oct 2013 18:39:22 +0000 (19:39 +0100)
src/Main/util.cxx
src/Main/util.hxx
src/Scripting/CMakeLists.txt
src/Scripting/NasalHTTP.cxx [new file with mode: 0644]
src/Scripting/NasalHTTP.hxx [new file with mode: 0644]
src/Scripting/NasalSys.cxx

index 8dd2bd54d92566778e3d456fc754663ce33a998b..5eed377345eeeb3cc6bb20d1d30b4a5c9732f3f7 100644 (file)
@@ -91,5 +91,12 @@ const char *fgValidatePath (const char *str, bool write)
     return result[0] ? result : 0;
 }
 
+//------------------------------------------------------------------------------
+std::string fgValidatePath(const std::string& path, bool write)
+{
+  const char* validate_path = fgValidatePath(path.c_str(), write);
+  return std::string(validate_path ? validate_path : "");
+}
+
 // end of util.cxx
 
index 5e1aca890de268cbd8e468dd84eee11447067716..5172ca23e12be59494122c3444fe62fdda68617b 100644 (file)
 //
 // $Id$
 
-
 #ifndef __UTIL_HXX
 #define __UTIL_HXX 1
 
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
+#include <string>
 
 /**
  * Move a value towards a target.
@@ -37,7 +33,7 @@
  *        (elapsed time/smoothing time)
  * @return The new value.
  */
-extern double fgGetLowPass (double current, double target, double timeratio);
+double fgGetLowPass (double current, double target, double timeratio);
 
 /**
  * Validation listener interface for io.nas, used by fgcommands.
@@ -45,6 +41,7 @@ extern double fgGetLowPass (double current, double target, double timeratio);
  * @param write True for write operations and false for read operations.
  * @return The validated path on success or 0 if access denied.
  */
-extern const char *fgValidatePath (const char *path, bool write);
+const char *fgValidatePath (const char *path, bool write);
+std::string fgValidatePath(const std::string& path, bool write);
 
 #endif // __UTIL_HXX
index e91d6aeb649caf148bb13359e2efc4ed64cdd913..44024e55c654cd9c1162df0447866ba2e84105b0 100644 (file)
@@ -1,27 +1,29 @@
 include(FlightGearComponent)
 
 set(SOURCES
-       NasalSys.cxx
-       nasal-props.cxx
-    NasalPositioned.cxx
-    NasalPositioned_cppbind.cxx
-    NasalCanvas.cxx
-    NasalClipboard.cxx
-    NasalCondition.cxx
-    NasalString.cxx
-    NasalModelData.cxx
-       )
+  NasalSys.cxx
+  nasal-props.cxx
+  NasalPositioned.cxx
+  NasalPositioned_cppbind.cxx
+  NasalCanvas.cxx
+  NasalClipboard.cxx
+  NasalCondition.cxx
+  NasalHTTP.cxx
+  NasalString.cxx
+  NasalModelData.cxx
+)
 
 set(HEADERS
-       NasalSys.hxx
-    NasalSys_private.hxx
-    NasalPositioned.hxx
-    NasalCanvas.hxx
-    NasalClipboard.hxx
-    NasalCondition.hxx
-    NasalString.hxx
-    NasalModelData.hxx
-       )
+  NasalSys.hxx
+  NasalSys_private.hxx
+  NasalPositioned.hxx
+  NasalCanvas.hxx
+  NasalClipboard.hxx
+  NasalCondition.hxx
+  NasalHTTP.hxx
+  NasalString.hxx
+  NasalModelData.hxx
+)
 
 if(WIN32)
   list(APPEND SOURCES ClipboardWindows.cxx)
diff --git a/src/Scripting/NasalHTTP.cxx b/src/Scripting/NasalHTTP.cxx
new file mode 100644 (file)
index 0000000..fb29bc9
--- /dev/null
@@ -0,0 +1,125 @@
+// Expose HTTP module to Nasal
+//
+// Copyright (C) 2013 Thomas Geymayer
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "NasalHTTP.hxx"
+#include <Main/globals.hxx>
+#include <Main/util.hxx>
+#include <Network/HTTPClient.hxx>
+
+#include <simgear/io/HTTPFileRequest.hxx>
+#include <simgear/io/HTTPMemoryRequest.hxx>
+
+#include <simgear/nasal/cppbind/from_nasal.hxx>
+#include <simgear/nasal/cppbind/to_nasal.hxx>
+#include <simgear/nasal/cppbind/NasalHash.hxx>
+#include <simgear/nasal/cppbind/Ghost.hxx>
+
+typedef nasal::Ghost<simgear::HTTP::Request_ptr> NasalRequest;
+typedef nasal::Ghost<simgear::HTTP::FileRequestRef> NasalFileRequest;
+typedef nasal::Ghost<simgear::HTTP::MemoryRequestRef> NasalMemoryRequest;
+
+FGHTTPClient& requireHTTPClient(naContext c)
+{
+  FGHTTPClient* http =
+    static_cast<FGHTTPClient*>(globals->get_subsystem("http"));
+  if( !http )
+    naRuntimeError(c, "Failed to get HTTP subsystem");
+
+  return *http;
+}
+
+/**
+ * urlretrieve(url, filename)
+ */
+static naRef f_urlretrieve(const nasal::CallContext& ctx)
+{
+  // Check for write access to target file
+  const std::string filename = ctx.requireArg<std::string>(1);
+  const std::string validated_path = fgValidatePath(filename, true);
+
+  if( validated_path.empty() )
+    naRuntimeError( ctx.c,
+                    "Access denied: can not write to %s",
+                    filename.c_str() );
+
+  return ctx.to_nasal
+  (
+    requireHTTPClient(ctx.c).client()
+    ->urlretrieve
+    (
+      ctx.requireArg<std::string>(0), // url
+      validated_path                  // filename
+    )
+  );
+}
+
+/**
+ * urlload(url)
+ */
+static naRef f_urlload(const nasal::CallContext& ctx)
+{
+  return ctx.to_nasal
+  (
+    requireHTTPClient(ctx.c).client()
+    ->urlload
+    (
+      ctx.requireArg<std::string>(0) // url
+    )
+  );
+}
+
+naRef initNasalHTTP(naRef globals, naContext c)
+{
+  using simgear::HTTP::Request;
+  NasalRequest::init("http.Request")
+    .member("url", &Request::url)
+    .member("method", &Request::method)
+    .member("scheme", &Request::scheme)
+    .member("path", &Request::path)
+    .member("host", &Request::host)
+    .member("port", &Request::port)
+    .member("query", &Request::query)
+    .member("status", &Request::responseCode)
+    .member("reason", &Request::responseReason)
+    .member("readyState", &Request::readyState)
+    .method("abort", static_cast<void (Request::*)()>(&Request::abort))
+    .method("done", &Request::done)
+    .method("fail", &Request::fail)
+    .method("always", &Request::always);
+
+  using simgear::HTTP::FileRequest;
+  NasalFileRequest::init("http.FileRequest")
+    .bases<NasalRequest>();
+
+  using simgear::HTTP::MemoryRequest;
+  NasalMemoryRequest::init("http.MemoryRequest")
+    .bases<NasalRequest>()
+    .member("response", &MemoryRequest::responseBody);
+
+  nasal::Hash globals_module(globals, c),
+              http = globals_module.createHash("http");
+
+  http.set("urlretrieve", f_urlretrieve);
+  http.set("urlload", f_urlload);
+
+  return naNil();
+}
diff --git a/src/Scripting/NasalHTTP.hxx b/src/Scripting/NasalHTTP.hxx
new file mode 100644 (file)
index 0000000..41d9996
--- /dev/null
@@ -0,0 +1,26 @@
+//@file Expose HTTP module to Nasal
+//
+// Copyright (C) 2013 Thomas Geymayer
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+#ifndef SCRIPTING_NASAL_HTTP_HXX
+#define SCRIPTING_NASAL_HTTP_HXX
+
+#include <simgear/nasal/nasal.h>
+
+naRef initNasalHTTP(naRef globals, naContext c);
+
+#endif // of SCRIPTING_NASAL_HTTP_HXX
index ffef17dc64beb38a41165f4ccc1466d4868ad08d..e55ba5a31f8d65332f708b3c0c7787a5d21f642b 100644 (file)
@@ -40,6 +40,7 @@
 #include "NasalCanvas.hxx"
 #include "NasalClipboard.hxx"
 #include "NasalCondition.hxx"
+#include "NasalHTTP.hxx"
 #include "NasalString.hxx"
 
 #include <Main/globals.hxx>
@@ -778,6 +779,7 @@ void FGNasalSys::init()
     NasalClipboard::init(this);
     initNasalCanvas(_globals, _context);
     initNasalCondition(_globals, _context);
+    initNasalHTTP(_globals, _context);
   
     NasalTimerObj::init("Timer")
       .method("start", &TimerObj::start)