summaryrefslogtreecommitdiff
path: root/src/utils/files.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/files.cpp')
-rw-r--r--src/utils/files.cpp39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/utils/files.cpp b/src/utils/files.cpp
index cb43ff5df..206a4d4bd 100644
--- a/src/utils/files.cpp
+++ b/src/utils/files.cpp
@@ -1,6 +1,6 @@
/*
* The ManaPlus Client
- * Copyright (C) 2013 The ManaPlus Developers
+ * Copyright (C) 2013-2014 The ManaPlus Developers
*
* This file is part of The ManaPlus Client.
*
@@ -126,6 +126,7 @@ void Files::extractZip(const std::string &restrict zipName,
int Files::renameFile(const std::string &restrict srcName,
const std::string &restrict dstName)
{
+#if defined __native_client__
FILE *srcFile = fopen(srcName.c_str(), "rb");
if (srcFile == nullptr)
return -1;
@@ -158,4 +159,40 @@ int Files::renameFile(const std::string &restrict srcName,
return 0;
return -1;
+#else
+ return ::rename(srcName.c_str(), dstName.c_str());
+#endif
+}
+
+int Files::copyFile(const std::string &restrict srcName,
+ const std::string &restrict dstName)
+{
+ FILE *srcFile = fopen(srcName.c_str(), "rb");
+ if (srcFile == nullptr)
+ return -1;
+ FILE *dstFile = fopen(dstName.c_str(), "w+b");
+ if (dstFile == nullptr)
+ {
+ fclose(srcFile);
+ return -1;
+ }
+
+ 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);
+ return -1;
+ }
+ }
+
+ delete [] buf;
+ fclose(srcFile);
+ fclose(dstFile);
+ return 0;
}