[Filesystem] Fix for writing data with 'w' mode 62/118662/1
authorTomasz Marciniak <t.marciniak@samsung.com>
Mon, 13 Mar 2017 12:19:35 +0000 (13:19 +0100)
committerTomasz Marciniak <t.marciniak@samsung.com>
Mon, 13 Mar 2017 12:30:42 +0000 (13:30 +0100)
[Feature] If stream is opened with 'w' mode and file exists
its content is discarded before writing data.

[Verification] Code compiles.
TCT (Auto) pass rate 100%

Change-Id: I5579b7f17175c39a8bf57b210a2a1ff29c1e7e2e
Signed-off-by: Tomasz Marciniak <t.marciniak@samsung.com>
src/filesystem/filesystem_file.cc
src/filesystem/filesystem_file.h
src/filesystem/filesystem_instance.cc
src/filesystem/filesystem_manager.cc
src/filesystem/filesystem_manager.h
src/filesystem/js/file_stream.js

index fc3d89c6800bcec6a8b9c27174b74dbac79df1ed..a12047e7def55b65f67f51ab39ee3377e9adf724 100644 (file)
@@ -218,9 +218,16 @@ bool FilesystemFile::Read(FilesystemBuffer* data,
   return true;
 }
 
-bool FilesystemFile::Write(const FilesystemBuffer& data, size_t offset) {
+bool FilesystemFile::Write(const FilesystemBuffer& data, size_t offset, bool rewrite) {
   LoggerD("Enter");
-  FILE* file = fopen(path.c_str(), "r+");
+
+  FILE* file = nullptr;
+  if (rewrite) {
+    file = fopen(path.c_str(), "w");
+  } else {
+    file = fopen(path.c_str(), "r+");
+  }
+
   if (!file) {
     LoggerE("Cannot open file %s to write!", path.c_str());
     return false;
index 5779eafbf0fd8ac0d1c5fdef3d658e1241b64baf..c7f2ece446b63067c7d4435bc8cbcfb300f00027 100644 (file)
@@ -45,7 +45,7 @@ class FilesystemFile {
   FilesystemFile(const std::string& path_);
 
   bool Read(FilesystemBuffer* data, size_t offset, size_t length);
-  bool Write(const FilesystemBuffer& data, size_t offset);
+  bool Write(const FilesystemBuffer& data, size_t offset, bool rewrite);
 };
 
 }  // namespace filesystem
index 54b0a2e17cc560f9b606512da2a6664e5c7ff4a1..47ffc97c7e7c250a8b74746c05de0154ccd59521 100644 (file)
@@ -216,11 +216,13 @@ void FilesystemInstance::FileWrite(const picojson::value& args,
   CHECK_EXIST(args, "location", out)
   CHECK_EXIST(args, "data", out)
   CHECK_EXIST(args, "offset", out)
+  CHECK_EXIST(args, "rewrite", out)
 
   double callback_id = args.get("callbackId").get<double>();
   const std::string& location = args.get("location").get<std::string>();
   const std::string& data = args.get("data").get<std::string>();
   size_t offset = static_cast<size_t>(args.get("location").get<double>());
+  bool rewrite = static_cast<size_t>(args.get("rewrite").get<bool>());
 
   auto onSuccess = [this, callback_id]() {
     LoggerD("enter");
@@ -247,6 +249,7 @@ void FilesystemInstance::FileWrite(const picojson::value& args,
                 location,
                 data,
                 offset,
+                rewrite,
                 onSuccess,
                 onError));
 }
@@ -258,10 +261,12 @@ void FilesystemInstance::FileWriteSync(const picojson::value& args,
   CHECK_EXIST(args, "location", out)
   CHECK_EXIST(args, "data", out)
   CHECK_EXIST(args, "offset", out)
+  CHECK_EXIST(args, "rewrite", out)
 
   const std::string& location = args.get("location").get<std::string>();
   const std::string& data = args.get("data").get<std::string>();
   size_t offset = static_cast<size_t>(args.get("offset").get<double>());
+  bool rewrite = static_cast<size_t>(args.get("rewrite").get<bool>());
 
   auto onSuccess = [this, &out]() {
     LoggerD("enter");
@@ -274,7 +279,7 @@ void FilesystemInstance::FileWriteSync(const picojson::value& args,
   };
 
   FilesystemManager::GetInstance().FileWrite(
-      location, data, offset, onSuccess, onError);
+      location, data, offset, rewrite, onSuccess, onError);
 }
 
 void FilesystemInstance::FileStat(const picojson::value& args,
index 468a095dda14d1cd8127532f3543557ca1504b97..dc96e58ec1f8c246fa8a1d9bd55f2c74be4d5ab0 100644 (file)
@@ -412,6 +412,7 @@ void FilesystemManager::FileWrite(
     const std::string& path,
     const std::string& data,
     size_t offset,
+    bool rewrite,
     const std::function<void()>& success_cb,
     const std::function<void(FilesystemError)>& error_cb) {
 
@@ -425,7 +426,7 @@ void FilesystemManager::FileWrite(
     return;
   }
 
-  if (file.Write(buffer, offset)) {
+  if (file.Write(buffer, offset, rewrite)) {
     success_cb();
   } else {
     LoggerE("Cannot write to file %s!", path.c_str());
index d455ed9a4b0ff5fd3e11e3dd7d917465098b1424..b2060fb1a00597530b85c8caf48c2264a2016ec7 100644 (file)
@@ -101,6 +101,7 @@ class FilesystemManager {
   void FileWrite(const std::string& path,
                  const std::string& data,
                  size_t offset,
+                 bool rewrite,
                  const std::function<void()>& success_cb,
                  const std::function<void(FilesystemError)>& error_cb);
 
index 1d3f708b74d09b183ad55150bc65692422a2bf6b..221f87e11b63c51bee22a044336ee3bb4e8d5eff 100644 (file)
@@ -68,6 +68,11 @@ function FileStream(data, mode, encoding) {
       value: false,
       writable: true,
       enumerable: false
+    },
+    _rewrite: {
+      value: mode === 'w' ? true : false,
+      writable: true,
+      enumerable: false
     }
   });
 }
@@ -277,7 +282,8 @@ function write() {
   var data = {
     location: commonFS_.toRealPath(this._file.fullPath),
     offset: this.position,
-    data: Base64.encodeString(args.stringData)
+    data: Base64.encodeString(args.stringData),
+    rewrite: this._rewrite
   };
 
   var result = native_.callSync('File_writeSync', data);
@@ -288,6 +294,7 @@ function write() {
   can_change_size = true;
   this.position = this.position + args.stringData.length;
   can_change_size = false;
+  this._rewrite = false;
 };
 
 FileStream.prototype.write = function() {
@@ -314,7 +321,8 @@ function writeBytes() {
   var data = {
     location: commonFS_.toRealPath(this._file.fullPath),
     offset: this.position,
-    data: Base64.encode(args.byteData)
+    data: Base64.encode(args.byteData),
+    rewrite: this._rewrite
   };
 
   var result = native_.callSync('File_writeSync', data);
@@ -325,6 +333,7 @@ function writeBytes() {
   can_change_size = true;
   this.position = this.position + args.byteData.length;
   can_change_size = false;
+  this._rewrite = false;
 };
 
 FileStream.prototype.writeBytes = function() {
@@ -359,7 +368,8 @@ function writeBase64() {
   var data = {
     location: commonFS_.toRealPath(this._file.fullPath),
     offset: this.position,
-    data: args.base64Data
+    data: args.base64Data,
+    rewrite: this._rewrite
   };
 
   var result = native_.callSync('File_writeSync', data);
@@ -373,6 +383,7 @@ function writeBase64() {
   can_change_size = true;
   this.position += decoded.length;
   can_change_size = false;
+  this._rewrite = false;
 };
 
 FileStream.prototype.writeBase64 = function() {