summaryrefslogtreecommitdiffstats
path: root/src/core/loader/loader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/loader/loader.cpp')
-rw-r--r--src/core/loader/loader.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp
new file mode 100644
index 000000000..96cb81de0
--- /dev/null
+++ b/src/core/loader/loader.cpp
@@ -0,0 +1,77 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include <memory>
+
+#include "core/loader/loader.h"
+#include "core/loader/elf.h"
+#include "core/loader/ncch.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+namespace Loader {
+
+/**
+ * Identifies the type of a bootable file
+ * @param filename String filename of bootable file
+ * @todo (ShizZy) this function sucks... make it actually check file contents etc.
+ * @return FileType of file
+ */
+FileType IdentifyFile(const std::string &filename) {
+ if (filename.size() == 0) {
+ ERROR_LOG(LOADER, "invalid filename %s", filename.c_str());
+ return FileType::Error;
+ }
+ std::string extension = filename.size() >= 5 ? filename.substr(filename.size() - 4) : "";
+
+ if (!strcasecmp(extension.c_str(), ".elf")) {
+ return FileType::ELF; // TODO(bunnei): Do some filetype checking :p
+ }
+ else if (!strcasecmp(extension.c_str(), ".axf")) {
+ return FileType::ELF; // TODO(bunnei): Do some filetype checking :p
+ }
+ else if (!strcasecmp(extension.c_str(), ".cxi")) {
+ return FileType::CXI; // TODO(bunnei): Do some filetype checking :p
+ }
+ else if (!strcasecmp(extension.c_str(), ".cci")) {
+ return FileType::CCI; // TODO(bunnei): Do some filetype checking :p
+ }
+ return FileType::Unknown;
+}
+
+/**
+ * Identifies and loads a bootable file
+ * @param filename String filename of bootable file
+ * @return ResultStatus result of function
+ */
+ResultStatus LoadFile(const std::string& filename) {
+ INFO_LOG(LOADER, "Loading file %s...", filename.c_str());
+
+ switch (IdentifyFile(filename)) {
+
+ // Standard ELF file format...
+ case FileType::ELF: {
+ return AppLoader_ELF(filename).Load();
+ }
+
+ // NCCH/NCSD container formats...
+ case FileType::CXI:
+ case FileType::CCI: {
+ return AppLoader_NCCH(filename).Load();
+ }
+
+ // Error occurred durring IdentifyFile...
+ case FileType::Error:
+
+ // IdentifyFile could know identify file type...
+ case FileType::Unknown:
+
+ default:
+ return ResultStatus::ErrorInvalidFormat;
+ }
+
+ return ResultStatus::Error;
+}
+
+} // namespace Loader