summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am1
-rw-r--r--src/utils/files.cpp52
-rw-r--r--src/utils/files.h5
-rw-r--r--src/utils/files_unittest.cpp71
4 files changed, 104 insertions, 25 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index a05e4bc41..b0f6348c5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -656,6 +656,7 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \
utils/dtor.h \
utils/files.cpp \
utils/files.h \
+ utils/files_unittest.cpp \
utils/fuzzer.cpp \
utils/fuzzer.h \
utils/gettext.h \
diff --git a/src/utils/files.cpp b/src/utils/files.cpp
index fa69cd6af..6f57d3062 100644
--- a/src/utils/files.cpp
+++ b/src/utils/files.cpp
@@ -18,7 +18,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#if defined(ANDROID) || defined(__native_client__)
#include "utils/files.h"
#include "logger.h"
@@ -63,6 +62,7 @@ void Files::extractLocale()
}
#endif // ANDROID
+#if defined(ANDROID) || defined(__native_client__)
void Files::copyPhysFsFile(const std::string &inFile,
const std::string &outFile)
{
@@ -100,33 +100,39 @@ void Files::extractZip(const std::string &zipName, const std::string &inDir,
remove(zipName.c_str());
}
-int Files::renameFile(const std::string &pFrom, const std::string &pTo)
-{
- FILE *file = fopen(pFrom.c_str(), "rb");
- if (file == NULL)
- return -1;
-
- fseek(file, 0, SEEK_END);
- size_t sz = ftell(file);
- fseek(file, 0, SEEK_SET);
+#endif // ANDROID __native_client__
- char *buf = (char *)malloc(sz + 1);
- if (fread(buf, 1, sz, file) != sz)
+int Files::renameFile(const std::string &srcName, const std::string &dstName)
+{
+ FILE *srcFile = fopen(srcName.c_str(), "rb");
+ if (srcFile == nullptr)
return -1;
- fclose(file);
- buf[sz] = 0;
-
- file = fopen(pTo.c_str(), "w+b");
- if (file == NULL)
+ FILE *dstFile = fopen(dstName.c_str(), "w+b");
+ if (dstFile == nullptr)
+ {
+ fclose(srcFile);
return -1;
+ }
- if (fwrite(buf, 1, sz, file) != sz)
- return -1;
- fclose(file);
+ const int chunkSize = 500000;
+ char *buf = new char[chunkSize];
+ size_t sz = 0;
+ while ((sz = fread(buf, 1, chunkSize, srcFile)))
+ {
+ if (fwrite(buf, 1, sz, dstFile) != sz)
+ {
+ delete [] buf;
+ fclose(srcFile);
+ fclose(dstFile);
+ ::remove(dstName.c_str());
+ return -1;
+ }
+ }
- free(buf);
+ delete [] buf;
+ fclose(srcFile);
+ fclose(dstFile);
+ ::remove(srcName.c_str());
return 0;
}
-
-#endif // ANDROID __native_client__
diff --git a/src/utils/files.h b/src/utils/files.h
index 4a44631cf..735812563 100644
--- a/src/utils/files.h
+++ b/src/utils/files.h
@@ -21,7 +21,6 @@
#ifndef UTILS_FILES_H
#define UTILS_FILES_H
-#if defined(ANDROID) || defined(__native_client__)
#include <string>
namespace Files
@@ -29,15 +28,17 @@ namespace Files
#ifdef ANDROID
void extractLocale();
#endif
+
+#if defined(ANDROID) || defined(__native_client__)
void copyPhysFsFile(const std::string &inFile, const std::string &outFile);
void copyPhysFsDir(const std::string &inDir, const std::string &outDir);
void extractZip(const std::string &zipName, const std::string &inDir,
const std::string &outDir);
+#endif // ANDROID __native_client__
int renameFile(const std::string &pFrom, const std::string &pTo);
} // namespace Files
-#endif // ANDROID __native_client__
#endif // UTILS_FILES_H
diff --git a/src/utils/files_unittest.cpp b/src/utils/files_unittest.cpp
new file mode 100644
index 000000000..63e1fc271
--- /dev/null
+++ b/src/utils/files_unittest.cpp
@@ -0,0 +1,71 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2013 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * 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
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "utils/files.h"
+
+#include "logger.h"
+
+#include "utils/physfstools.h"
+
+#include "gtest/gtest.h"
+
+#include "resources/resourcemanager.h"
+
+#include "debug.h"
+
+static void init()
+{
+ PHYSFS_init("manaplus");
+ dirSeparator = "/";
+ logger = new Logger();
+ ResourceManager *resman = ResourceManager::getInstance();
+ resman->addToSearchPath("data", false);
+ resman->addToSearchPath("../data", false);
+}
+
+TEST(Files, renameFile)
+{
+ init();
+ const int sz = 1234567;
+ char *buf = new char[sz];
+ for (int f = 0; f < sz; f ++)
+ buf[f] = f;
+
+ const std::string name1 = "file1.test";
+ const std::string name2 = "file2.test";
+ FILE *file = fopen(name1.c_str(), "w+b");
+ fwrite(buf, 1, sz, file);
+ fclose(file);
+
+ EXPECT_EQ(0, Files::renameFile(name1, name2));
+ char *buf2 = new char[sz];
+ FILE *file2 = fopen(name2.c_str(), "rb");
+ EXPECT_NE(nullptr, file2);
+ fread(buf2, 1, sz, file2);
+ fclose(file2);
+ ::remove(name1.c_str());
+ ::remove(name2.c_str());
+
+ for (int f = 0; f < sz; f ++)
+ EXPECT_EQ(buf[f], buf2[f]);
+
+ delete [] buf;
+ delete [] buf2;
+}