Просмотр исходного кода

game_list: Populate control data from installed NAND

Zach Hilman 8 лет назад
Родитель
Сommit
10812f8407
2 измененных файлов с 35 добавлено и 31 удалено
  1. 34 30
      src/yuzu/game_list.cpp
  2. 1 1
      src/yuzu/main.cpp

+ 34 - 30
src/yuzu/game_list.cpp

@@ -403,6 +403,28 @@ void GameList::RefreshGameDirectory() {
     }
 }
 
+static void GetMetadataFromControlNCA(const std::shared_ptr<FileSys::NCA>& nca,
+                                      std::vector<u8>& icon, std::string& name) {
+    const auto control_dir = FileSys::ExtractRomFS(nca->GetRomFS());
+    if (control_dir == nullptr)
+        return;
+
+    const auto nacp_file = control_dir->GetFile("control.nacp");
+    if (nacp_file == nullptr)
+        return;
+    FileSys::NACP nacp(nacp_file);
+    name = nacp.GetApplicationName();
+
+    FileSys::VirtualFile icon_file = nullptr;
+    for (const auto& language : FileSys::LANGUAGE_NAMES) {
+        icon_file = control_dir->GetFile("icon_" + std::string(language) + ".dat");
+        if (icon_file != nullptr) {
+            icon = icon_file->ReadAllBytes();
+            break;
+        }
+    }
+}
+
 void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsigned int recursion) {
     const auto usernand = Service::FileSystem::GetUserNANDContents();
     const auto installed_games = usernand->ListEntriesFilter(FileSys::TitleType::Application,
@@ -421,22 +443,8 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
 
         const auto& control =
             usernand->GetEntry(game.title_id, FileSys::ContentRecordType::Control);
-        if (control != nullptr) {
-            const auto control_dir = FileSys::ExtractRomFS(control->GetRomFS());
-
-            const auto nacp_file = control_dir->GetFile("control.nacp");
-            FileSys::NACP nacp(nacp_file);
-            name = nacp.GetApplicationName();
-
-            FileSys::VirtualFile icon_file = nullptr;
-            for (const auto& language : FileSys::LANGUAGE_NAMES) {
-                icon_file = control_dir->GetFile("icon_" + std::string(language) + ".dat");
-                if (icon_file != nullptr) {
-                    icon = icon_file->ReadAllBytes();
-                    break;
-                }
-            }
-        }
+        if (control != nullptr)
+            GetMetadataFromControlNCA(control, icon, name);
         emit EntryReady({
             new GameListItemPath(
                 FormatGameName(file->GetFullPath()), icon, QString::fromStdString(name),
@@ -450,6 +458,15 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
 
     boost::container::flat_map<u64, std::shared_ptr<FileSys::NCA>> nca_control_map;
 
+    const auto control_data = usernand->ListEntriesFilter(FileSys::TitleType::Application,
+                                                          FileSys::ContentRecordType::Control);
+
+    for (const auto& entry : control_data) {
+        const auto nca = usernand->GetEntry(entry);
+        if (nca != nullptr)
+            nca_control_map.insert_or_assign(entry.title_id, nca);
+    }
+
     const auto nca_control_callback =
         [this, &nca_control_map](u64* num_entries_out, const std::string& directory,
                                  const std::string& virtual_name) -> bool {
@@ -503,20 +520,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
                 // Use from metadata pool.
                 if (nca_control_map.find(program_id) != nca_control_map.end()) {
                     const auto nca = nca_control_map[program_id];
-                    const auto control_dir = FileSys::ExtractRomFS(nca->GetRomFS());
-
-                    const auto nacp_file = control_dir->GetFile("control.nacp");
-                    FileSys::NACP nacp(nacp_file);
-                    name = nacp.GetApplicationName();
-
-                    FileSys::VirtualFile icon_file = nullptr;
-                    for (const auto& language : FileSys::LANGUAGE_NAMES) {
-                        icon_file = control_dir->GetFile("icon_" + std::string(language) + ".dat");
-                        if (icon_file != nullptr) {
-                            icon = icon_file->ReadAllBytes();
-                            break;
-                        }
-                    }
+                    GetMetadataFromControlNCA(nca, icon, name);
                 }
             }
 

+ 1 - 1
src/yuzu/main.cpp

@@ -682,7 +682,7 @@ void GMainWindow::OnMenuInstallToNAND() {
             }
 
             if (index >= 5)
-                index += 0x80;
+                index += 0x7B;
 
             if (Service::FileSystem::GetUserNANDContents()->InstallEntry(
                     nca, static_cast<FileSys::TitleType>(index))) {