From 8990b51ac8bf2a8d6528cb036590d92a9a7a8137 Mon Sep 17 00:00:00 2001 From: ShizZy Date: Thu, 19 Sep 2013 23:21:22 -0400 Subject: added a module for loading bootable binaries --- src/common/src/log.h | 4 +- src/common/src/log_manager.cpp | 4 +- src/core/core.vcxproj | 2 + src/core/core.vcxproj.filters | 2 + src/core/src/loader.cpp | 123 +++++++++++++++++++++++++++++++++++++++++ src/core/src/loader.h | 76 +++++++++++++++++++++++++ 6 files changed, 207 insertions(+), 4 deletions(-) create mode 100644 src/core/src/loader.cpp create mode 100644 src/core/src/loader.h diff --git a/src/common/src/log.h b/src/common/src/log.h index c2549affb..fb39720a3 100644 --- a/src/common/src/log.h +++ b/src/common/src/log.h @@ -47,8 +47,8 @@ enum LOG_TYPE { STREAMINGINTERFACE, VIDEO, VIDEOINTERFACE, - WII_IOB, - WII_IPC, + LOADER, + FILESYS, WII_IPC_DVD, WII_IPC_ES, WII_IPC_FILEIO, diff --git a/src/common/src/log_manager.cpp b/src/common/src/log_manager.cpp index e202d01d3..16dae6521 100644 --- a/src/common/src/log_manager.cpp +++ b/src/common/src/log_manager.cpp @@ -60,8 +60,8 @@ LogManager::LogManager() m_Log[LogTypes::CONSOLE] = new LogContainer("CONSOLE", "Dolphin Console"); m_Log[LogTypes::OSREPORT] = new LogContainer("OSREPORT", "OSReport"); m_Log[LogTypes::WIIMOTE] = new LogContainer("Wiimote", "Wiimote"); - m_Log[LogTypes::WII_IOB] = new LogContainer("WII_IOB", "WII IO Bridge"); - m_Log[LogTypes::WII_IPC] = new LogContainer("WII_IPC", "WII IPC"); + m_Log[LogTypes::LOADER] = new LogContainer("Loader", "Loader"); + m_Log[LogTypes::FILESYS] = new LogContainer("FileSys", "File System"); m_Log[LogTypes::WII_IPC_HID] = new LogContainer("WII_IPC_HID", "WII IPC HID"); m_Log[LogTypes::WII_IPC_HLE] = new LogContainer("WII_IPC_HLE", "WII IPC HLE"); m_Log[LogTypes::WII_IPC_DVD] = new LogContainer("WII_IPC_DVD", "WII IPC DVD"); diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index 081f4a489..11e31c8f5 100644 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj @@ -137,6 +137,7 @@ + @@ -155,6 +156,7 @@ + diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index cf374ee88..51aa17d76 100644 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters @@ -13,6 +13,7 @@ arm + @@ -67,6 +68,7 @@ arm\mmu + diff --git a/src/core/src/loader.cpp b/src/core/src/loader.cpp new file mode 100644 index 000000000..44cb92a29 --- /dev/null +++ b/src/core/src/loader.cpp @@ -0,0 +1,123 @@ +/** + * Copyright (C) 2013 Citrus Emulator + * + * @file loader.cpp + * @author ShizZy + * @date 2013-09-18 + * @brief Loads bootable binaries into the emu + * + * @section LICENSE + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details at + * http://www.gnu.org/copyleft/gpl.html + * + * Official project repository can be found at: + * http://code.google.com/p/gekko-gc-emu/ + */ + +#include "file_util.h" +#include "loader.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +bool _Load_BIN(std::string &filename) { + File::IOFile f(filename, "rb"); + if (f.IsOpen()) { + // TODO(ShizZy): read here to memory.... + } + return true; +} + +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(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 (File::IsDirectory(filename)) { + return FILETYPE_NORMAL_DIRECTORY; + } else if (!strcasecmp(extension.c_str(),".bin")) { + return FILETYPE_3DS_BIN; + } else if (!strcasecmp(extension.c_str(),".zip")) { + return FILETYPE_ARCHIVE_ZIP; + } else if (!strcasecmp(extension.c_str(),".rar")) { + return FILETYPE_ARCHIVE_RAR; + } else if (!strcasecmp(extension.c_str(),".r00")) { + return FILETYPE_ARCHIVE_RAR; + } else if (!strcasecmp(extension.c_str(),".r01")) { + return FILETYPE_ARCHIVE_RAR; + } + return FILETYPE_UNKNOWN; +} + +/** + * Identifies and loads a bootable file + * @param filename String filename of bootable file + * @param error_string Point to string to put error message if an error has occurred + * @return True on success, otherwise false + */ +bool LoadFile(std::string &filename, std::string *error_string) { + INFO_LOG(LOADER,"Identifying file..."); + // Note that this can modify filename! + switch (IdentifyFile(filename)) { + + case FILETYPE_3DS_BIN: + { + INFO_LOG(LOADER,"File is a BIN !"); + return _Load_BIN(filename); + } + + case FILETYPE_ERROR: + ERROR_LOG(LOADER, "Could not read file"); + *error_string = "Error reading file"; + break; + + case FILETYPE_ARCHIVE_RAR: +#ifdef WIN32 + *error_string = "RAR file detected (Require WINRAR)"; +#else + *error_string = "RAR file detected (Require UnRAR)"; +#endif + break; + + case FILETYPE_ARCHIVE_ZIP: +#ifdef WIN32 + *error_string = "ZIP file detected (Require WINRAR)"; +#else + *error_string = "ZIP file detected (Require UnRAR)"; +#endif + break; + + case FILETYPE_NORMAL_DIRECTORY: + ERROR_LOG(LOADER, "Just a directory."); + *error_string = "Just a directory."; + break; + + case FILETYPE_UNKNOWN_BIN: + case FILETYPE_UNKNOWN_ELF: + case FILETYPE_UNKNOWN: + default: + ERROR_LOG(LOADER, "Failed to identify file"); + *error_string = "Failed to identify file"; + break; + } + return false; +} + +} // namespace \ No newline at end of file diff --git a/src/core/src/loader.h b/src/core/src/loader.h new file mode 100644 index 000000000..4a0b3cf67 --- /dev/null +++ b/src/core/src/loader.h @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2013 Citrus Emulator + * + * @file loader.h + * @author ShizZy + * @date 2013-09-18 + * @brief Loads bootable binaries into the emu + * + * @section LICENSE + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details at + * http://www.gnu.org/copyleft/gpl.html + * + * Official project repository can be found at: + * http://code.google.com/p/gekko-gc-emu/ + */ + +#ifndef CORE_LOADER_H_ +#define CORE_LOADER_H_ + +#include "common.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace Loader { + +enum FileType { + FILETYPE_ERROR, + + FILETYPE_3DS_CCI, + FILETYPE_3DS_CIA, + FILETYPE_3DS_CXI, + + FILETYPE_3DS_BIN, + FILETYPE_3DS_ELF, + + FILETYPE_CTR_DISC_DIRECTORY, + + FILETYPE_UNKNOWN_BIN, + FILETYPE_UNKNOWN_ELF, + + FILETYPE_ARCHIVE_RAR, + FILETYPE_ARCHIVE_ZIP, + + FILETYPE_NORMAL_DIRECTORY, + + FILETYPE_UNKNOWN +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Identifies the type of a bootable file + * @param filename String filename of bootable file + * @return FileType of file + */ +FileType IdentifyFile(std::string &filename); + +/** + * Identifies and loads a bootable file + * @param filename String filename of bootable file + * @param error_string Point to string to put error message if an error has occurred + * @return True on success, otherwise false + */ +bool LoadFile(std::string &filename, std::string *error_string); + +} // namespace + +#endif // CORE_LOADER_H_ \ No newline at end of file -- cgit v1.2.3