From b5237e885df72f6c37532fc8af9573966e7b07e5 Mon Sep 17 00:00:00 2001
From: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
Date: Tue, 6 Jan 2015 21:30:40 +0000
Subject: Loader: Keep a reference to the file and pass it to the correct
 AppLoader, instead of loading it multiple times.

---
 src/core/loader/loader.cpp | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

(limited to 'src/core/loader/loader.cpp')

diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp
index 32196a1dc6..fd32b7b204 100644
--- a/src/core/loader/loader.cpp
+++ b/src/core/loader/loader.cpp
@@ -56,20 +56,24 @@ FileType IdentifyFile(const std::string &filename) {
 ResultStatus LoadFile(const std::string& filename) {
     LOG_INFO(Loader, "Loading file %s...", filename.c_str());
 
+    std::unique_ptr<FileUtil::IOFile> file(new FileUtil::IOFile(filename, "rb"));
+    if (!file->IsOpen())
+        return ResultStatus::Error;
+
     switch (IdentifyFile(filename)) {
 
     //3DSX file format...
     case FileType::THREEDSX:
-        return AppLoader_THREEDSX(filename).Load();
+        return AppLoader_THREEDSX(std::move(file)).Load();
 
     // Standard ELF file format...
     case FileType::ELF:
-        return AppLoader_ELF(filename).Load();
+        return AppLoader_ELF(std::move(file)).Load();
 
     // NCCH/NCSD container formats...
     case FileType::CXI:
     case FileType::CCI: {
-        AppLoader_NCCH app_loader(filename);
+        AppLoader_NCCH app_loader(std::move(file));
 
         // Load application and RomFS
         if (ResultStatus::Success == app_loader.Load()) {
@@ -83,16 +87,11 @@ ResultStatus LoadFile(const std::string& filename) {
     // Raw BIN file format...
     case FileType::BIN:
     {
-        LOG_INFO(Loader, "Loading BIN file %s...", filename.c_str());
-
-        FileUtil::IOFile file(filename, "rb");
-
-        if (file.IsOpen()) {
-            file.ReadBytes(Memory::GetPointer(Memory::EXEFS_CODE_VADDR), (size_t)file.GetSize());
-            Kernel::LoadExec(Memory::EXEFS_CODE_VADDR);
-        } else {
+        size_t size = (size_t)file->GetSize();
+        if (file->ReadBytes(Memory::GetPointer(Memory::EXEFS_CODE_VADDR), size) != size)
             return ResultStatus::Error;
-        }
+
+        Kernel::LoadExec(Memory::EXEFS_CODE_VADDR);
         return ResultStatus::Success;
     }
 
-- 
cgit v1.2.3-70-g09d2