Salome HOME
Suppress memory leak when using Kernel_Utils::decode()
[modules/smesh.git] / src / SMESHUtils / SMESH_File.cxx
index d4311bb71ef29464b7b926b689e2f1bbbc5dfa61..1e249c43089790f7fb640714a8481b8878445da5 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -36,6 +36,8 @@
 
 #include <boost/filesystem.hpp>
 
+#include <Basics_Utils.hxx>
+
 namespace boofs = boost::filesystem;
 
 //================================================================================
@@ -75,11 +77,17 @@ SMESH_File::~SMESH_File()
 
 bool SMESH_File::open()
 {
-  int length = size();
+  long length = size();
   if ( !_map && length > 0 )
   {
 #ifdef WIN32
-    _file = CreateFile(_name.data(), GENERIC_READ, FILE_SHARE_READ,
+#  ifdef UNICODE
+    std::wstring  aName = Kernel_Utils::utf8_decode_s(_name);
+    const wchar_t* name = aName.c_str();
+#  else
+    char* name = _name.data();
+#  endif
+    _file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ,
                        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     bool ok = ( _file != INVALID_HANDLE_VALUE );
 #else
@@ -168,7 +176,12 @@ bool SMESH_File::remove()
   close();
 
   boost::system::error_code err;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  boofs::remove(name.c_str(), err);
+#else
   boofs::remove( _name, err );
+#endif
   _error = err.message();
 
   return !err;
@@ -185,10 +198,15 @@ long SMESH_File::size()
   if ( _size >= 0 ) return _size; // size of an open file
 
   boost::system::error_code err;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  boost::uintmax_t size = boofs::file_size(name.c_str(), err);
+#else
   boost::uintmax_t size = boofs::file_size( _name, err );
+#endif
   _error = err.message();
 
-  return err ? -1 : (long) size;
+  return !err ? (long) size : -1;
 }
 
 //================================================================================
@@ -200,7 +218,13 @@ long SMESH_File::size()
 bool SMESH_File::exists()
 {
   boost::system::error_code err;
-  bool res = boofs::exists( _name, err );
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  bool res = boofs::exists(name.c_str(), err);
+#else
+  bool res = boofs::exists(_name, err);
+#endif
+
   _error = err.message();
 
   return err ? false : res;
@@ -215,7 +239,12 @@ bool SMESH_File::exists()
 bool SMESH_File::isDirectory()
 {
   boost::system::error_code err;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  bool res = boofs::is_directory(name.c_str(), err);
+#else
   bool res = boofs::is_directory( _name, err );
+#endif
   _error = err.message();
 
   return err ? false : res;
@@ -271,7 +300,7 @@ void SMESH_File::rewind()
 
 bool SMESH_File::getInts(std::vector<int>& ints)
 {
-  int i = 0;
+  size_t i = 0;
   while ( i < ints.size() )
   {
     while ( !isdigit( *_pos ) && !eof()) ++_pos;
@@ -290,9 +319,16 @@ bool SMESH_File::getInts(std::vector<int>& ints)
 
 bool SMESH_File::openForWriting()
 {
-#ifdef WIN32
+  close();
 
-  _file = CreateFile( _name.c_str(),          // name of the write
+#ifdef WIN32
+#ifdef UNICODE
+  std::wstring  aName = Kernel_Utils::utf8_decode_s(_name);
+  const wchar_t* name = aName.c_str();
+#else
+  char* name = _name.data();
+#endif
+  _file = CreateFile( name,                   // name of the write
                       GENERIC_WRITE,          // open for writing
                       0,                      // do not share
                       NULL,                   // default security
@@ -300,7 +336,6 @@ bool SMESH_File::openForWriting()
                       FILE_ATTRIBUTE_NORMAL,  // normal file
                       NULL);                  // no attr. template
   return ( _file != INVALID_HANDLE_VALUE );
-
 #else
 
   _file = ::open( _name.c_str(),
@@ -330,7 +365,7 @@ bool SMESH_File::writeRaw(const void* data, size_t size)
 #else
 
   ssize_t nbWritten = ::write( _file, data, size );
-  return ( nbWritten == size );
+  return ( nbWritten == (ssize_t) size );
 
 #endif
 }