diff --git a/src/Main/util.cxx b/src/Main/util.cxx index 8dd2bd54d..5eed37734 100644 --- a/src/Main/util.cxx +++ b/src/Main/util.cxx @@ -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 diff --git a/src/Main/util.hxx b/src/Main/util.hxx index 5e1aca890..5172ca23e 100644 --- a/src/Main/util.hxx +++ b/src/Main/util.hxx @@ -17,14 +17,10 @@ // // $Id$ - #ifndef __UTIL_HXX #define __UTIL_HXX 1 -#ifndef __cplusplus -# error This library requires C++ -#endif - +#include /** * 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 diff --git a/src/Scripting/CMakeLists.txt b/src/Scripting/CMakeLists.txt index e91d6aeb6..44024e55c 100644 --- a/src/Scripting/CMakeLists.txt +++ b/src/Scripting/CMakeLists.txt @@ -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 index 000000000..fb29bc924 --- /dev/null +++ b/src/Scripting/NasalHTTP.cxx @@ -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
+#include
+#include + +#include +#include + +#include +#include +#include +#include + +typedef nasal::Ghost NasalRequest; +typedef nasal::Ghost NasalFileRequest; +typedef nasal::Ghost NasalMemoryRequest; + +FGHTTPClient& requireHTTPClient(naContext c) +{ + FGHTTPClient* http = + static_cast(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(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(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(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(&Request::abort)) + .method("done", &Request::done) + .method("fail", &Request::fail) + .method("always", &Request::always); + + using simgear::HTTP::FileRequest; + NasalFileRequest::init("http.FileRequest") + .bases(); + + using simgear::HTTP::MemoryRequest; + NasalMemoryRequest::init("http.MemoryRequest") + .bases() + .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 index 000000000..41d9996ad --- /dev/null +++ b/src/Scripting/NasalHTTP.hxx @@ -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 + +naRef initNasalHTTP(naRef globals, naContext c); + +#endif // of SCRIPTING_NASAL_HTTP_HXX diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index ffef17dc6..e55ba5a31 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -40,6 +40,7 @@ #include "NasalCanvas.hxx" #include "NasalClipboard.hxx" #include "NasalCondition.hxx" +#include "NasalHTTP.hxx" #include "NasalString.hxx" #include
@@ -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)