Lua FileSystem API
This commit is contained in:
parent
f96cb74a08
commit
e8418a8ca0
@ -10,6 +10,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
|
#include <fstream>
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "Format.h"
|
#include "Format.h"
|
||||||
#include "LuaLuna.h"
|
#include "LuaLuna.h"
|
||||||
@ -38,12 +39,15 @@
|
|||||||
#include "LuaSlider.h"
|
#include "LuaSlider.h"
|
||||||
#include "LuaProgressBar.h"
|
#include "LuaProgressBar.h"
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
#ifdef WIN
|
#ifdef WIN
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
#else
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <dirent.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
}
|
||||||
|
|
||||||
GameModel * luacon_model;
|
GameModel * luacon_model;
|
||||||
Simulation * luacon_sim;
|
Simulation * luacon_sim;
|
||||||
@ -93,6 +97,7 @@ LuaScriptInterface::LuaScriptInterface(GameController * c, GameModel * m):
|
|||||||
initElementsAPI();
|
initElementsAPI();
|
||||||
initVirtualMachineAPI();
|
initVirtualMachineAPI();
|
||||||
initGraphicsAPI();
|
initGraphicsAPI();
|
||||||
|
initFileSystemAPI();
|
||||||
|
|
||||||
//Old TPT API
|
//Old TPT API
|
||||||
int i = 0, j;
|
int i = 0, j;
|
||||||
@ -1350,6 +1355,252 @@ int LuaScriptInterface::graphics_fillRect(lua_State * l)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LuaScriptInterface::initFileSystemAPI()
|
||||||
|
{
|
||||||
|
//Methods
|
||||||
|
struct luaL_reg fileSystemAPIMethods [] = {
|
||||||
|
{"list", fileSystem_list},
|
||||||
|
{"exists", fileSystem_exists},
|
||||||
|
{"isFile", fileSystem_isFile},
|
||||||
|
{"isDirectory", fileSystem_isDirectory},
|
||||||
|
{"makeDirectory", fileSystem_makeDirectory},
|
||||||
|
{"removeDirectory", fileSystem_removeDirectory},
|
||||||
|
{"removeFile", fileSystem_removeFile},
|
||||||
|
{"move", fileSystem_move},
|
||||||
|
{"copy", fileSystem_copy},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
luaL_register(l, "fileSystem", fileSystemAPIMethods);
|
||||||
|
|
||||||
|
//elem shortcut
|
||||||
|
lua_getglobal(l, "fileSystem");
|
||||||
|
lua_setglobal(l, "fs");
|
||||||
|
|
||||||
|
int fileSystemAPI = lua_gettop(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_list(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * directoryName = lua_tostring(l, 1);
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
lua_newtable(l);
|
||||||
|
|
||||||
|
DIR * directory;
|
||||||
|
struct dirent * entry;
|
||||||
|
|
||||||
|
directory = opendir(directoryName);
|
||||||
|
if (directory != NULL)
|
||||||
|
{
|
||||||
|
while (entry = readdir(directory))
|
||||||
|
{
|
||||||
|
if(strncmp(entry->d_name, "..", 3) && strncmp(entry->d_name, ".", 2))
|
||||||
|
{
|
||||||
|
lua_pushstring(l, entry->d_name);
|
||||||
|
lua_rawseti(l, -2, index++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(directory);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lua_pushnil(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_exists(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
|
||||||
|
bool exists = false;
|
||||||
|
#ifdef WIN
|
||||||
|
struct _stat s;
|
||||||
|
if(_stat(filename, &s) == 0)
|
||||||
|
#else
|
||||||
|
struct stat s;
|
||||||
|
if(stat(filename, &s) == 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if(s.st_mode & S_IFDIR)
|
||||||
|
{
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
else if(s.st_mode & S_IFREG)
|
||||||
|
{
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exists = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushboolean(l, exists);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_isFile(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
|
||||||
|
bool exists = false;
|
||||||
|
#ifdef WIN
|
||||||
|
struct _stat s;
|
||||||
|
if(_stat(filename, &s) == 0)
|
||||||
|
#else
|
||||||
|
struct stat s;
|
||||||
|
if(stat(filename, &s) == 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if(s.st_mode & S_IFDIR)
|
||||||
|
{
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
else if(s.st_mode & S_IFREG)
|
||||||
|
{
|
||||||
|
exists = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exists = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exists = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushboolean(l, exists);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_isDirectory(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
|
||||||
|
bool exists = false;
|
||||||
|
#ifdef WIN
|
||||||
|
struct _stat s;
|
||||||
|
if(_stat(filename, &s) == 0)
|
||||||
|
#else
|
||||||
|
struct stat s;
|
||||||
|
if(stat(filename, &s) == 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if(s.st_mode & S_IFDIR)
|
||||||
|
{
|
||||||
|
exists = false;
|
||||||
|
}
|
||||||
|
else if(s.st_mode & S_IFREG)
|
||||||
|
{
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exists = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exists = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushboolean(l, exists);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_makeDirectory(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
#ifdef WIN
|
||||||
|
ret = _mkdir(filename);
|
||||||
|
#else
|
||||||
|
ret = mkdir(filename, 0755);
|
||||||
|
#endif
|
||||||
|
lua_pushboolean(l, ret == 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_removeDirectory(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
#ifdef WIN
|
||||||
|
ret = _rmdir(filename);
|
||||||
|
#else
|
||||||
|
ret = rmdir(filename);
|
||||||
|
#endif
|
||||||
|
lua_pushboolean(l, ret == 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_removeFile(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
#ifdef WIN
|
||||||
|
ret = _unlink(filename);
|
||||||
|
#else
|
||||||
|
ret = unlink(filename);
|
||||||
|
#endif
|
||||||
|
lua_pushboolean(l, ret == 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_move(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
const char * newFilename = lua_tostring(l, 2);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
ret = rename(filename, newFilename);
|
||||||
|
|
||||||
|
lua_pushboolean(l, ret == 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::fileSystem_copy(lua_State * l)
|
||||||
|
{
|
||||||
|
const char * filename = lua_tostring(l, 1);
|
||||||
|
const char * newFilename = lua_tostring(l, 2);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
std::ifstream source(filename, std::ios::binary);
|
||||||
|
std::ofstream dest(newFilename, std::ios::binary);
|
||||||
|
source.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
dest.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
|
||||||
|
std::istreambuf_iterator<char> begin_source(source);
|
||||||
|
std::istreambuf_iterator<char> end_source;
|
||||||
|
std::ostreambuf_iterator<char> begin_dest(dest);
|
||||||
|
std::copy(begin_source, end_source, begin_dest);
|
||||||
|
|
||||||
|
source.close();
|
||||||
|
dest.close();
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
catch (std::exception & e)
|
||||||
|
{
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushboolean(l, ret == 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LuaScriptInterface::OnBrushChanged(int brushType, int rx, int ry)
|
bool LuaScriptInterface::OnBrushChanged(int brushType, int rx, int ry)
|
||||||
{
|
{
|
||||||
|
@ -64,6 +64,7 @@ class LuaScriptInterface: public CommandInterface
|
|||||||
static int renderer_renderModes(lua_State * l);
|
static int renderer_renderModes(lua_State * l);
|
||||||
static int renderer_displayModes(lua_State * l);
|
static int renderer_displayModes(lua_State * l);
|
||||||
static int renderer_colourMode(lua_State * l);
|
static int renderer_colourMode(lua_State * l);
|
||||||
|
static int renderer_decorations(lua_State * l);
|
||||||
|
|
||||||
//Elements
|
//Elements
|
||||||
static pim::VirtualMachine * updateVirtualMachines[PT_NUM];
|
static pim::VirtualMachine * updateVirtualMachines[PT_NUM];
|
||||||
@ -93,6 +94,17 @@ class LuaScriptInterface: public CommandInterface
|
|||||||
static int graphics_drawRect(lua_State * l);
|
static int graphics_drawRect(lua_State * l);
|
||||||
static int graphics_fillRect(lua_State * l);
|
static int graphics_fillRect(lua_State * l);
|
||||||
|
|
||||||
|
void initFileSystemAPI();
|
||||||
|
static int fileSystem_list(lua_State * l);
|
||||||
|
static int fileSystem_exists(lua_State * l);
|
||||||
|
static int fileSystem_isFile(lua_State * l);
|
||||||
|
static int fileSystem_isDirectory(lua_State * l);
|
||||||
|
static int fileSystem_makeDirectory(lua_State * l);
|
||||||
|
static int fileSystem_removeDirectory(lua_State * l);
|
||||||
|
static int fileSystem_removeFile(lua_State * l);
|
||||||
|
static int fileSystem_move(lua_State * l);
|
||||||
|
static int fileSystem_copy(lua_State * l);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ui::Window * Window;
|
ui::Window * Window;
|
||||||
lua_State *l;
|
lua_State *l;
|
||||||
|
Reference in New Issue
Block a user