Node highlighting.
[oweals/minetest.git] / src / filesys.cpp
index 356d3018deff2843816f19a87e486479240efa85..b95986a92bcc9f880a412d1703441ea8549d85b8 100644 (file)
@@ -18,12 +18,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "filesys.h"
-#include "strfnd.h"
+#include "util/string.h"
 #include <iostream>
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <fstream>
 #include "log.h"
+#include "config.h"
 
 namespace fs
 {
@@ -33,8 +35,8 @@ namespace fs
 #define _WIN32_WINNT 0x0501
 #include <windows.h>
 #include <malloc.h>
-#include <tchar.h> 
-#include <wchar.h> 
+#include <tchar.h>
+#include <wchar.h>
 
 #define BUFSIZE MAX_PATH
 
@@ -72,12 +74,12 @@ std::vector<DirListNode> GetDirListing(std::string pathstring)
        // Find the first file in the directory.
        hFind = FindFirstFile(DirSpec, &FindFileData);
 
-       if (hFind == INVALID_HANDLE_VALUE) 
+       if (hFind == INVALID_HANDLE_VALUE)
        {
                retval = (-1);
                goto Cleanup;
-       } 
-       else 
+       }
+       else
        {
                // NOTE:
                // Be very sure to not include '..' in the results, it will
@@ -90,7 +92,7 @@ std::vector<DirListNode> GetDirListing(std::string pathstring)
                        listing.push_back(node);
 
                // List all the other files in the directory.
-               while (FindNextFile(hFind, &FindFileData) != 0) 
+               while (FindNextFile(hFind, &FindFileData) != 0)
                {
                        DirListNode node;
                        node.name = FindFileData.cFileName;
@@ -101,7 +103,7 @@ std::vector<DirListNode> GetDirListing(std::string pathstring)
 
                dwError = GetLastError();
                FindClose(hFind);
-               if (dwError != ERROR_NO_MORE_FILES) 
+               if (dwError != ERROR_NO_MORE_FILES)
                {
                        errorstream<<"GetDirListing: FindNextFile error. Error is "
                                        <<dwError<<std::endl;
@@ -400,7 +402,11 @@ std::string TempPath()
                compatible with lua's os.tmpname which under the default
                configuration hardcodes mkstemp("/tmp/lua_XXXXXX").
        */
-       return std::string(DIR_DELIM) + "tmp";
+#ifdef __ANDROID__
+       return DIR_DELIM "sdcard" DIR_DELIM PROJECT_NAME DIR_DELIM "tmp";
+#else
+       return DIR_DELIM "tmp";
+#endif
 }
 
 #endif
@@ -684,5 +690,31 @@ std::string RemoveRelativePathComponents(std::string path)
        return path.substr(0, pos);
 }
 
+bool safeWriteToFile(const std::string &path, const std::string &content)
+{
+       std::string tmp_file = path + ".~mt";
+
+       // Write to a tmp file
+       std::ofstream os(tmp_file.c_str(), std::ios::binary);
+       if (!os.good())
+               return false;
+       os << content;
+       os.flush();
+       os.close();
+       if (os.fail()) {
+               remove(tmp_file.c_str());
+               return false;
+       }
+
+       // Copy file
+       remove(path.c_str());
+       if(rename(tmp_file.c_str(), path.c_str())) {
+               remove(tmp_file.c_str());
+               return false;
+       } else {
+               return true;
+       }
+}
+
 } // namespace fs