diff --git a/src/common/Platform.cpp b/src/common/Platform.cpp index 9ee154349..3d91948a4 100644 --- a/src/common/Platform.cpp +++ b/src/common/Platform.cpp @@ -279,13 +279,26 @@ bool DirectoryExists(ByteString directory) bool RemoveFile(ByteString filename) { - return std::remove(filename.c_str()) == 0; +#ifdef WIN + return _wremove(WinWiden(filename).c_str()) == 0; +#else + return remove(filename.c_str()) == 0; +#endif +} + +bool RenameFile(ByteString filename, ByteString newFilename) +{ +#ifdef WIN + return _wrename(WinWiden(filename).c_str(), WinWiden(newFilename).c_str()) == 0; +#else + return rename(filename.c_str(), newFilename.c_str()) == 0; +#endif } bool DeleteDirectory(ByteString folder) { #ifdef WIN - return _rmdir(folder.c_str()) == 0; + return _wrmdir(WinWiden(folder).c_str()) == 0; #else return rmdir(folder.c_str()) == 0; #endif @@ -294,7 +307,7 @@ bool DeleteDirectory(ByteString folder) bool MakeDirectory(ByteString dir) { #ifdef WIN - return _mkdir(dir.c_str()) == 0; + return _wmkdir(WinWiden(dir).c_str()) == 0; #else return mkdir(dir.c_str(), 0755) == 0; #endif diff --git a/src/common/Platform.h b/src/common/Platform.h index 90bf3759a..1c5ed87d6 100644 --- a/src/common/Platform.h +++ b/src/common/Platform.h @@ -28,6 +28,7 @@ namespace Platform * @return true on success */ bool RemoveFile(ByteString filename); + bool RenameFile(ByteString filename, ByteString newFilename); /** * @return true on success diff --git a/src/lua/LegacyLuaAPI.cpp b/src/lua/LegacyLuaAPI.cpp index 906f40eb8..1550a7a88 100644 --- a/src/lua/LegacyLuaAPI.cpp +++ b/src/lua/LegacyLuaAPI.cpp @@ -1277,33 +1277,14 @@ int luatpt_getscript(lua_State* l) return luaL_error(l, "Invalid Script ID"); } - // FIXME: winapi - FILE *outputfile = fopen(filename.c_str(), "r"); - if (outputfile) + if (Platform::FileExists(filename) && confirmPrompt && !ConfirmPrompt::Blocking("File already exists, overwrite?", filename.FromUtf8(), "Overwrite")) { - fclose(outputfile); - outputfile = NULL; - if (!confirmPrompt || ConfirmPrompt::Blocking("File already exists, overwrite?", filename.FromUtf8(), "Overwrite")) - { - outputfile = fopen(filename.c_str(), "wb"); - } - else - { - return 0; - } + return 0; } - else - { - outputfile = fopen(filename.c_str(), "wb"); - } - if (!outputfile) + if (!Client::Ref().WriteFile(std::vector(scriptData.begin(), scriptData.end()), filename)) { return luaL_error(l, "Unable to write to file"); } - - fputs(scriptData.c_str(), outputfile); - fclose(outputfile); - outputfile = NULL; if (runScript) { tpt_lua_dostring(l, ByteString::Build("dofile('", filename, "')")); diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp index e47201697..e7eeb98e5 100644 --- a/src/lua/LuaScriptInterface.cpp +++ b/src/lua/LuaScriptInterface.cpp @@ -308,11 +308,11 @@ tpt.partsdata = nil"); tptElements = lua_gettop(l); for (int i = 1; i < PT_NUM; i++) { + tpt_lua_pushString(l, luacon_sim->elements[i].Name.ToLower()); lua_newtable(l); currentElement = lua_gettop(l); lua_pushinteger(l, i); lua_setfield(l, currentElement, "id"); - lua_newtable(l); currentElementMeta = lua_gettop(l); lua_pushcfunction(l, luacon_elementwrite); @@ -320,8 +320,7 @@ tpt.partsdata = nil"); lua_pushcfunction(l, luacon_elementread); lua_setfield(l, currentElementMeta, "__index"); lua_setmetatable(l, currentElement); - - lua_setfield(l, tptElements, luacon_sim->elements[i].Name.ToUtf8().ToLower().c_str()); + lua_settable(l, tptElements); } lua_setfield(l, tptProperties, "el"); @@ -329,6 +328,7 @@ tpt.partsdata = nil"); tptElementTransitions = lua_gettop(l); for (int i = 1; i < PT_NUM; i++) { + tpt_lua_pushString(l, luacon_sim->elements[i].Name.ToLower()); lua_newtable(l); currentElement = lua_gettop(l); lua_newtable(l); @@ -340,8 +340,7 @@ tpt.partsdata = nil"); lua_pushcfunction(l, luacon_transitionread); lua_setfield(l, currentElementMeta, "__index"); lua_setmetatable(l, currentElement); - - lua_setfield(l, tptElementTransitions, luacon_sim->elements[i].Name.ToUtf8().ToLower().c_str()); + lua_settable(l, tptElementTransitions); } lua_setfield(l, tptProperties, "eltransition"); @@ -920,13 +919,16 @@ void LuaScriptInterface::initSimulationAPI() int particlePropertiesCount = 0; for (auto &prop : Particle::GetProperties()) { + tpt_lua_pushByteString(l, "FIELD_" + prop.Name.ToUpper()); lua_pushinteger(l, particlePropertiesCount++); - lua_setfield(l, -2, ("FIELD_" + prop.Name.ToUpper()).c_str()); + lua_settable(l, -3); } for (auto &alias : Particle::GetPropertyAliases()) { - lua_getfield(l, -1, ("FIELD_" + alias.to.ToUpper()).c_str()); - lua_setfield(l, -2, ("FIELD_" + alias.from.ToUpper()).c_str()); + tpt_lua_pushByteString(l, "FIELD_" + alias.from.ToUpper()); + tpt_lua_pushByteString(l, "FIELD_" + alias.to.ToUpper()); + lua_gettable(l, -3); + lua_settable(l, -3); } } @@ -2764,13 +2766,15 @@ void LuaScriptInterface::initElementsAPI() { if(luacon_sim->elements[i].Enabled) { + tpt_lua_pushByteString(l, luacon_sim->elements[i].Identifier); lua_pushinteger(l, i); - lua_setfield(l, -2, luacon_sim->elements[i].Identifier.c_str()); + lua_settable(l, -3); ByteString realIdentifier = ByteString::Build("DEFAULT_PT_", luacon_sim->elements[i].Name.ToUtf8()); if (i != 0 && i != PT_NBHL && i != PT_NWHL && luacon_sim->elements[i].Identifier != realIdentifier) { + tpt_lua_pushByteString(l, realIdentifier); lua_pushinteger(l, i); - lua_setfield(l, -2, realIdentifier.c_str()); + lua_settable(l, -3); } } } @@ -2872,8 +2876,9 @@ int LuaScriptInterface::elements_loadDefault(lua_State * l) return luaL_error(l, "Invalid element"); lua_getglobal(l, "elements"); + tpt_lua_pushByteString(l, luacon_sim->elements[id].Identifier); lua_pushnil(l); - lua_setfield(l, -2, luacon_sim->elements[id].Identifier.c_str()); + lua_settable(l, -3); auto const &elementList = GetElements(); if (id < (int)elementList.size()) @@ -2881,8 +2886,9 @@ int LuaScriptInterface::elements_loadDefault(lua_State * l) else luacon_sim->elements[id] = Element(); + tpt_lua_pushByteString(l, luacon_sim->elements[id].Identifier); lua_pushinteger(l, id); - lua_setfield(l, -2, luacon_sim->elements[id].Identifier.c_str()); + lua_settable(l, -3); lua_pop(l, 1); } else @@ -2980,8 +2986,9 @@ int LuaScriptInterface::elements_allocate(lua_State * l) luacon_sim->elements[newID].Identifier = identifier; lua_getglobal(l, "elements"); + tpt_lua_pushByteString(l, identifier); lua_pushinteger(l, newID); - lua_setfield(l, -2, identifier.c_str()); + lua_settable(l, -3); lua_pop(l, 1); for (auto elem = 0; elem < PT_NUM; ++elem) @@ -3185,7 +3192,8 @@ int LuaScriptInterface::elements_element(lua_State * l) //Write values from native data to a table for (auto &prop : Element::GetProperties()) { - lua_getfield(l, -1, prop.Name.c_str()); + tpt_lua_pushByteString(l, prop.Name); + lua_gettable(l, -2); if (lua_type(l, -1) != LUA_TNIL) { intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + prop.Offset); @@ -3275,7 +3283,7 @@ int LuaScriptInterface::elements_element(lua_State * l) lua_pop(l, 1); lua_getfield(l, -1, "DefaultProperties"); - SetDefaultProperties(l, id, -1); + SetDefaultProperties(l, id, lua_gettop(l)); lua_pop(l, 1); luacon_model->BuildMenus(); @@ -3291,9 +3299,10 @@ int LuaScriptInterface::elements_element(lua_State * l) lua_newtable(l); for (auto &prop : Element::GetProperties()) { + tpt_lua_pushByteString(l, prop.Name); intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + prop.Offset); LuaGetProperty(l, prop, propertyAddress); - lua_setfield(l, -2, prop.Name.c_str()); + lua_settable(l, -3); } tpt_lua_pushByteString(l, luacon_sim->elements[id].Identifier); @@ -3312,13 +3321,16 @@ void LuaScriptInterface::GetDefaultProperties(lua_State * l, int id) for (auto &prop : Particle::GetProperties()) { auto propertyAddress = reinterpret_cast((reinterpret_cast(&luacon_sim->elements[id].DefaultProperties)) + prop.Offset); + tpt_lua_pushByteString(l, prop.Name); LuaGetProperty(l, prop, propertyAddress); - lua_setfield(l, -2, prop.Name.c_str()); + lua_settable(l, -3); } for (auto &alias : Particle::GetPropertyAliases()) { - lua_getfield(l, -1, alias.to.c_str()); - lua_setfield(l, -2, alias.from.c_str()); + tpt_lua_pushByteString(l, alias.from); + tpt_lua_pushByteString(l, alias.to); + lua_gettable(l, -3); + lua_settable(l, -3); } } @@ -3328,7 +3340,8 @@ void LuaScriptInterface::SetDefaultProperties(lua_State * l, int id, int stackPo { for (auto &prop : Particle::GetProperties()) { - lua_getfield(l, stackPos, prop.Name.c_str()); + tpt_lua_pushByteString(l, prop.Name); + lua_gettable(l, stackPos); if (lua_type(l, -1) == LUA_TNIL) { for (auto &alias : Particle::GetPropertyAliases()) @@ -3336,7 +3349,8 @@ void LuaScriptInterface::SetDefaultProperties(lua_State * l, int id, int stackPo if (alias.to == prop.Name) { lua_pop(l, 1); - lua_getfield(l, stackPos, alias.from.c_str()); + tpt_lua_pushByteString(l, alias.from); + lua_gettable(l, stackPos); } } } @@ -3536,8 +3550,9 @@ int LuaScriptInterface::elements_free(lua_State * l) luacon_model->BuildMenus(); lua_getglobal(l, "elements"); + tpt_lua_pushByteString(l, identifier); lua_pushnil(l); - lua_setfield(l, -2, identifier.c_str()); + lua_settable(l, -3); lua_pop(l, 1); return 0; @@ -3790,7 +3805,7 @@ int LuaScriptInterface::fileSystem_list(lua_State * l) if (name != "." && name != "..") { index += 1; - lua_pushstring(l, name.c_str()); + tpt_lua_pushByteString(l, name); lua_rawseti(l, -2, index); } } @@ -3846,9 +3861,7 @@ int LuaScriptInterface::fileSystem_removeDirectory(lua_State * l) int LuaScriptInterface::fileSystem_removeFile(lua_State * l) { auto filename = tpt_lua_checkByteString(l, 1); - - bool ret = Platform::RemoveFile(filename); - lua_pushboolean(l, ret); + lua_pushboolean(l, Platform::RemoveFile(filename)); return 1; } @@ -3856,12 +3869,7 @@ int LuaScriptInterface::fileSystem_move(lua_State * l) { auto filename = tpt_lua_checkByteString(l, 1); auto newFilename = tpt_lua_checkByteString(l, 2); - int ret = 0; - - // FIXME: winapi - ret = rename(filename.c_str(), newFilename.c_str()); - - lua_pushboolean(l, ret == 0); + lua_pushboolean(l, Platform::RenameFile(filename, newFilename)); return 1; } @@ -3869,32 +3877,8 @@ int LuaScriptInterface::fileSystem_copy(lua_State * l) { auto filename = tpt_lua_checkByteString(l, 1); auto newFilename = tpt_lua_checkByteString(l, 2); - int ret = 0; - - try - { - // FIXME: winapi - 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 begin_source(source); - std::istreambuf_iterator end_source; - std::ostreambuf_iterator 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); + std::vector fileData; + lua_pushboolean(l, Client::Ref().ReadFile(fileData, filename) && Client::Ref().WriteFile(fileData, newFilename)); return 1; } @@ -4155,7 +4139,7 @@ static int http_request_finish(lua_State *l) int status_out; std::vector headers; ByteString data = rh->Finish(status_out, headers); - lua_pushlstring(l, data.c_str(), data.size()); + lua_pushlstring(l, &data[0], data.size()); lua_pushinteger(l, status_out); lua_newtable(l); for (auto i = 0; i < int(headers.size()); ++i)