Преглед на файлове

registration: Various style and documentation improvements
Fix logic in RealVfsFilesystem Create methods
Remove magic numbers
Fix regex errors

Zach Hilman преди 8 години
родител
ревизия
35e4a47be0
променени са 3 файла, в които са добавени 22 реда и са изтрити 18 реда
  1. 4 7
      src/core/file_sys/nca_metadata.cpp
  2. 8 5
      src/core/file_sys/registered_cache.cpp
  3. 10 6
      src/core/file_sys/vfs_real.cpp

+ 4 - 7
src/core/file_sys/nca_metadata.cpp

@@ -103,7 +103,10 @@ bool CNMT::UnionRecords(const CNMT& other) {
 std::vector<u8> CNMT::Serialize() const {
 std::vector<u8> CNMT::Serialize() const {
     const bool has_opt_header =
     const bool has_opt_header =
         header.type >= TitleType::Application && header.type <= TitleType::AOC;
         header.type >= TitleType::Application && header.type <= TitleType::AOC;
-    std::vector<u8> out(sizeof(CNMTHeader) + (has_opt_header ? sizeof(OptionalHeader) : 0));
+    const auto dead_zone = header.table_offset + sizeof(CNMTHeader);
+    std::vector<u8> out(
+        std::max(sizeof(CNMTHeader) + (has_opt_header ? sizeof(OptionalHeader) : 0), dead_zone) +
+        content_records.size() * sizeof(ContentRecord) + meta_records.size() * sizeof(MetaRecord));
     memcpy(out.data(), &header, sizeof(CNMTHeader));
     memcpy(out.data(), &header, sizeof(CNMTHeader));
 
 
     // Optional Header
     // Optional Header
@@ -113,17 +116,11 @@ std::vector<u8> CNMT::Serialize() const {
 
 
     auto offset = header.table_offset;
     auto offset = header.table_offset;
 
 
-    const auto dead_zone = offset + sizeof(CNMTHeader) - out.size();
-    if (dead_zone > 0)
-        out.resize(offset + sizeof(CNMTHeader));
-
-    out.resize(out.size() + content_records.size() * sizeof(ContentRecord));
     for (const auto& rec : content_records) {
     for (const auto& rec : content_records) {
         memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(ContentRecord));
         memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(ContentRecord));
         offset += sizeof(ContentRecord);
         offset += sizeof(ContentRecord);
     }
     }
 
 
-    out.resize(out.size() + content_records.size() * sizeof(MetaRecord));
     for (const auto& rec : meta_records) {
     for (const auto& rec : meta_records) {
         memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(MetaRecord));
         memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(MetaRecord));
         offset += sizeof(MetaRecord);
         offset += sizeof(MetaRecord);

+ 8 - 5
src/core/file_sys/registered_cache.cpp

@@ -29,8 +29,8 @@ static bool FollowsTwoDigitDirFormat(std::string_view name) {
 }
 }
 
 
 static bool FollowsNcaIdFormat(std::string_view name) {
 static bool FollowsNcaIdFormat(std::string_view name) {
-    static const std::regex nca_id_regex("[0-9A-F]{32}.nca", std::regex_constants::ECMAScript |
-                                                                 std::regex_constants::icase);
+    static const std::regex nca_id_regex("[0-9A-F]{32}\\.nca", std::regex_constants::ECMAScript |
+                                                                   std::regex_constants::icase);
     return name.size() == 36 && std::regex_match(name.begin(), name.end(), nca_id_regex);
     return name.size() == 36 && std::regex_match(name.begin(), name.end(), nca_id_regex);
 }
 }
 
 
@@ -59,8 +59,10 @@ static std::string GetCNMTName(TitleType type, u64 title_id) {
 
 
     auto index = static_cast<size_t>(type);
     auto index = static_cast<size_t>(type);
     // If the index is after the jump in TitleType, subtract it out.
     // If the index is after the jump in TitleType, subtract it out.
-    if (index >= static_cast<size_t>(TitleType::Application))
-        index -= 0x7B;
+    if (index >= static_cast<size_t>(TitleType::Application)) {
+        index -= static_cast<size_t>(TitleType::Application) -
+                 static_cast<size_t>(TitleType::FirmwarePackageB);
+    }
     return fmt::format("{}_{:016x}.cnmt", TITLE_TYPE_NAMES[index], title_id);
     return fmt::format("{}_{:016x}.cnmt", TITLE_TYPE_NAMES[index], title_id);
 }
 }
 
 
@@ -96,7 +98,8 @@ VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& dir,
             file = files[0];
             file = files[0];
         } else {
         } else {
             std::vector<VirtualFile> concat;
             std::vector<VirtualFile> concat;
-            for (u8 i = 0; i < 0x10; ++i) {
+            // Since the files are a two-digit hex number, max is FF.
+            for (size_t i = 0; i < 0x100; ++i) {
                 auto next = nca_dir->GetFile(fmt::format("{:02X}", i));
                 auto next = nca_dir->GetFile(fmt::format("{:02X}", i));
                 if (next != nullptr) {
                 if (next != nullptr) {
                     concat.push_back(std::move(next));
                     concat.push_back(std::move(next));

+ 10 - 6
src/core/file_sys/vfs_real.cpp

@@ -84,9 +84,11 @@ VirtualFile RealVfsFilesystem::OpenFile(std::string_view path_, Mode perms) {
 VirtualFile RealVfsFilesystem::CreateFile(std::string_view path_, Mode perms) {
 VirtualFile RealVfsFilesystem::CreateFile(std::string_view path_, Mode perms) {
     const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
     const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
     const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
     const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
-    if (!FileUtil::Exists(path) && !FileUtil::CreateFullPath(path_fwd) &&
-        !FileUtil::CreateEmptyFile(path))
-        return nullptr;
+    if (!FileUtil::Exists(path)) {
+        FileUtil::CreateFullPath(path_fwd);
+        if (!FileUtil::CreateEmptyFile(path))
+            return nullptr;
+    }
     return OpenFile(path, perms);
     return OpenFile(path, perms);
 }
 }
 
 
@@ -143,9 +145,11 @@ VirtualDir RealVfsFilesystem::OpenDirectory(std::string_view path_, Mode perms)
 VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, Mode perms) {
 VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, Mode perms) {
     const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
     const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
     const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
     const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
-    if (!FileUtil::Exists(path) && !FileUtil::CreateFullPath(path_fwd) &&
-        !FileUtil::CreateEmptyFile(path))
-        return nullptr;
+    if (!FileUtil::Exists(path)) {
+        FileUtil::CreateFullPath(path_fwd);
+        if (!FileUtil::CreateDir(path))
+            return nullptr;
+    }
     // Cannot use make_shared as RealVfsDirectory constructor is private
     // Cannot use make_shared as RealVfsDirectory constructor is private
     return std::shared_ptr<RealVfsDirectory>(new RealVfsDirectory(*this, path, perms));
     return std::shared_ptr<RealVfsDirectory>(new RealVfsDirectory(*this, path, perms));
 }
 }