[dali_2.2.20] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / public-api / loader / navigation-mesh-factory.cpp
index 5f66539..7e09332 100644 (file)
 
 // INTERNAL INCLUDES
 #include <dali-scene3d/internal/algorithm/navigation-mesh-impl.h>
+#include <dali/devel-api/adaptor-framework/file-stream.h>
 
 namespace Dali::Scene3D::Loader
 {
 std::unique_ptr<Algorithm::NavigationMesh> NavigationMeshFactory::CreateFromFile(std::string filename)
 {
   std::vector<uint8_t> buffer;
-  auto                 fin = fopen(filename.c_str(), "rb");
-  if(!fin)
+
+  Dali::FileStream fileStream(filename, Dali::FileStream::READ | Dali::FileStream::BINARY);
+  auto             fin = fileStream.GetFile();
+
+  if(DALI_UNLIKELY(!fin))
+  {
+    const int bufferLength = 128;
+    char      buffer[bufferLength];
+
+    // Return type of stderror_r is different between system type. We should not use return value.
+    [[maybe_unused]] auto ret = strerror_r(errno, buffer, bufferLength - 1);
+
+    DALI_LOG_ERROR("NavigationMesh: Can't open %s for reading: %s", filename.c_str(), buffer);
+    return nullptr;
+  }
+
+  if(DALI_UNLIKELY(fseek(fin, 0, SEEK_END)))
+  {
+    DALI_LOG_ERROR("NavigationMesh: Error reading file: %s\n", filename.c_str());
+    return nullptr;
+  }
+
+  auto size = ftell(fin);
+  if(DALI_UNLIKELY(size < 0))
   {
-    DALI_LOG_ERROR("NavigationMesh: Can't open %s for reading: %s", filename.c_str(), strerror(errno));
+    DALI_LOG_ERROR("NavigationMesh: Error reading file: %s\n", filename.c_str());
     return nullptr;
   }
-  else
+
+  auto fileSize = size_t(size);
+  if(DALI_UNLIKELY(fseek(fin, 0, SEEK_SET)))
   {
-    fseek(fin, 0, SEEK_END);
-    auto size = ftell(fin);
-    fseek(fin, 0, SEEK_SET);
-    buffer.resize(size);
-    auto count = fread(buffer.data(), 1, size, fin);
-    if(!count)
-    {
-      DALI_LOG_ERROR("NavigationMesh: Error reading file: %s\n", filename.c_str());
-      fclose(fin);
-      return nullptr;
-    }
-    fclose(fin);
-
-    return CreateFromBuffer(buffer);
+    DALI_LOG_ERROR("NavigationMesh: Error reading file: %s\n", filename.c_str());
+    return nullptr;
+  }
+
+  buffer.resize(size);
+  auto count = fread(buffer.data(), 1, fileSize, fin);
+  if(DALI_UNLIKELY(count != fileSize))
+  {
+    DALI_LOG_ERROR("NavigationMesh: Error reading file: %s\n", filename.c_str());
+    return nullptr;
   }
+  return CreateFromBuffer(buffer);
 }
 
 std::unique_ptr<Algorithm::NavigationMesh> NavigationMeshFactory::CreateFromBuffer(const std::vector<uint8_t>& buffer)