summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZach Hilman <zachhilman@gmail.com>2018-08-10 05:10:32 +0200
committerZach Hilman <zachhilman@gmail.com>2018-08-12 04:50:48 +0200
commit167bfddafadb843236c0fa683cf97eaffaa5ea1a (patch)
treebd67e895222feb751c4d4625143b9d352eb62847
parentqt: Add 'Install to NAND' option to menu (diff)
downloadyuzu-167bfddafadb843236c0fa683cf97eaffaa5ea1a.tar
yuzu-167bfddafadb843236c0fa683cf97eaffaa5ea1a.tar.gz
yuzu-167bfddafadb843236c0fa683cf97eaffaa5ea1a.tar.bz2
yuzu-167bfddafadb843236c0fa683cf97eaffaa5ea1a.tar.lz
yuzu-167bfddafadb843236c0fa683cf97eaffaa5ea1a.tar.xz
yuzu-167bfddafadb843236c0fa683cf97eaffaa5ea1a.tar.zst
yuzu-167bfddafadb843236c0fa683cf97eaffaa5ea1a.zip
-rw-r--r--src/common/hex_util.h2
-rw-r--r--src/core/file_sys/nca_metadata.cpp10
-rw-r--r--src/core/file_sys/nca_metadata.h4
-rw-r--r--src/core/file_sys/registered_cache.cpp24
-rw-r--r--src/core/file_sys/registered_cache.h13
-rw-r--r--src/core/file_sys/vfs_concat.cpp8
-rw-r--r--src/core/file_sys/vfs_concat.h6
-rw-r--r--src/yuzu/main.cpp40
8 files changed, 60 insertions, 47 deletions
diff --git a/src/common/hex_util.h b/src/common/hex_util.h
index f16c58aab..13d586015 100644
--- a/src/common/hex_util.h
+++ b/src/common/hex_util.h
@@ -5,6 +5,8 @@
#pragma once
#include <array>
+#include <cstddef>
+#include <string>
#include <fmt/format.h>
#include "common/common_types.h"
diff --git a/src/core/file_sys/nca_metadata.cpp b/src/core/file_sys/nca_metadata.cpp
index fa06897b7..118a0c287 100644
--- a/src/core/file_sys/nca_metadata.cpp
+++ b/src/core/file_sys/nca_metadata.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <cstring>
#include "common/common_funcs.h"
#include "common/swap.h"
#include "content_archive.h"
@@ -67,9 +68,10 @@ const std::vector<MetaRecord>& CNMT::GetMetaRecords() const {
bool CNMT::UnionRecords(const CNMT& other) {
bool change = false;
for (const auto& rec : other.content_records) {
- const auto iter = std::find_if(
- content_records.begin(), content_records.end(),
- [rec](const ContentRecord& r) { return r.nca_id == rec.nca_id && r.type == rec.type; });
+ const auto iter = std::find_if(content_records.begin(), content_records.end(),
+ [&rec](const ContentRecord& r) {
+ return r.nca_id == rec.nca_id && r.type == rec.type;
+ });
if (iter == content_records.end()) {
content_records.emplace_back(rec);
++header->number_content_entries;
@@ -78,7 +80,7 @@ bool CNMT::UnionRecords(const CNMT& other) {
}
for (const auto& rec : other.meta_records) {
const auto iter =
- std::find_if(meta_records.begin(), meta_records.end(), [rec](const MetaRecord& r) {
+ std::find_if(meta_records.begin(), meta_records.end(), [&rec](const MetaRecord& r) {
return r.title_id == rec.title_id && r.title_version == rec.title_version &&
r.type == rec.type;
});
diff --git a/src/core/file_sys/nca_metadata.h b/src/core/file_sys/nca_metadata.h
index 7b0725f36..6cd919e54 100644
--- a/src/core/file_sys/nca_metadata.h
+++ b/src/core/file_sys/nca_metadata.h
@@ -4,7 +4,11 @@
#pragma once
+#include <cstring>
#include <memory>
+#include <vector>
+#include "common/common_types.h"
+#include "common/swap.h"
#include "core/file_sys/vfs.h"
namespace FileSys {
diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp
index 766fef254..3e7706171 100644
--- a/src/core/file_sys/registered_cache.cpp
+++ b/src/core/file_sys/registered_cache.cpp
@@ -23,13 +23,13 @@ bool operator<(const RegisteredCacheEntry& lhs, const RegisteredCacheEntry& rhs)
}
static bool FollowsTwoDigitDirFormat(std::string_view name) {
- const static std::regex two_digit_regex(
+ static const std::regex two_digit_regex(
"000000[0123456789abcdefABCDEF][0123456789abcdefABCDEF]");
return std::regex_match(name.begin(), name.end(), two_digit_regex);
}
static bool FollowsNcaIdFormat(std::string_view name) {
- const static std::regex nca_id_regex("[0123456789abcdefABCDEF]+.nca");
+ static const std::regex nca_id_regex("[0123456789abcdefABCDEF]+.nca");
return name.size() == 36 && std::regex_match(name.begin(), name.end(), nca_id_regex);
}
@@ -56,7 +56,7 @@ static std::string GetCNMTName(TitleType type, u64 title_id) {
"" ///< Currently unknown 'DeltaTitle'
};
- size_t index = static_cast<size_t>(type);
+ auto index = static_cast<size_t>(type);
if (index >= 0x80)
index -= 0x80;
return fmt::format("{}_{:016x}.cnmt", TITLE_TYPE_NAMES[index], title_id);
@@ -90,15 +90,15 @@ VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& dir,
VirtualFile file = nullptr;
const auto files = nca_dir->GetFiles();
- if (files.size() == 1 && files[0]->GetName() == "00")
+ if (files.size() == 1 && files[0]->GetName() == "00") {
file = files[0];
- else {
+ } else {
std::vector<VirtualFile> concat;
for (u8 i = 0; i < 0x10; ++i) {
auto next = nca_dir->GetFile(fmt::format("{:02X}", i));
- if (next != nullptr)
+ if (next != nullptr) {
concat.push_back(std::move(next));
- else {
+ } else {
next = nca_dir->GetFile(fmt::format("{:02x}", i));
if (next != nullptr)
concat.push_back(std::move(next));
@@ -146,7 +146,8 @@ boost::optional<NcaID> RegisteredCache::GetNcaIDFromMetadata(u64 title_id,
return boost::make_optional(iter->nca_id);
}
-void RegisteredCache::AccumulateFiles(std::vector<NcaID>& ids) const {
+std::vector<NcaID> RegisteredCache::AccumulateFiles() const {
+ std::vector<NcaID> ids;
for (const auto& d2_dir : dir->GetSubdirectories()) {
if (FollowsNcaIdFormat(d2_dir->GetName())) {
ids.push_back(HexStringToArray<0x10, true>(d2_dir->GetName().substr(0, 0x20)));
@@ -175,6 +176,7 @@ void RegisteredCache::AccumulateFiles(std::vector<NcaID>& ids) const {
if (FollowsNcaIdFormat(d2_file->GetName()))
ids.push_back(HexStringToArray<0x10, true>(d2_file->GetName().substr(0, 0x20)));
}
+ return ids;
}
void RegisteredCache::ProcessFiles(const std::vector<NcaID>& ids) {
@@ -185,8 +187,9 @@ void RegisteredCache::ProcessFiles(const std::vector<NcaID>& ids) {
continue;
const auto nca = std::make_shared<NCA>(parser(file, id));
if (nca->GetStatus() != Loader::ResultStatus::Success ||
- nca->GetType() != NCAContentType::Meta)
+ nca->GetType() != NCAContentType::Meta) {
continue;
+ }
const auto section0 = nca->GetSubdirectories()[0];
@@ -218,8 +221,7 @@ void RegisteredCache::AccumulateYuzuMeta() {
void RegisteredCache::Refresh() {
if (dir == nullptr)
return;
- std::vector<NcaID> ids;
- AccumulateFiles(ids);
+ const auto ids = AccumulateFiles();
ProcessFiles(ids);
AccumulateYuzuMeta();
}
diff --git a/src/core/file_sys/registered_cache.h b/src/core/file_sys/registered_cache.h
index ba2e3403f..baaed02dd 100644
--- a/src/core/file_sys/registered_cache.h
+++ b/src/core/file_sys/registered_cache.h
@@ -5,14 +5,17 @@
#pragma once
#include <array>
+#include <functional>
#include <map>
#include <memory>
#include <string>
+#include <vector>
#include <boost/container/flat_map.hpp>
#include "common/common_funcs.h"
+#include "common/common_types.h"
#include "content_archive.h"
+#include "core/file_sys/nca_metadata.h"
#include "core/file_sys/vfs.h"
-#include "nca_metadata.h"
namespace FileSys {
class XCI;
@@ -49,9 +52,9 @@ public:
// Parsing function defines the conversion from raw file to NCA. If there are other steps
// besides creating the NCA from the file (e.g. NAX0 on SD Card), that should go in a custom
// parsing function.
- RegisteredCache(VirtualDir dir,
- RegisteredCacheParsingFunction parsing_function =
- [](const VirtualFile& file, const NcaID& id) { return file; });
+ explicit RegisteredCache(VirtualDir dir,
+ RegisteredCacheParsingFunction parsing_function =
+ [](const VirtualFile& file, const NcaID& id) { return file; });
void Refresh();
@@ -86,7 +89,7 @@ private:
void IterateAllMetadata(std::vector<T>& out,
std::function<T(const CNMT&, const ContentRecord&)> proc,
std::function<bool(const CNMT&, const ContentRecord&)> filter) const;
- void AccumulateFiles(std::vector<NcaID>& ids) const;
+ std::vector<NcaID> AccumulateFiles() const;
void ProcessFiles(const std::vector<NcaID>& ids);
void AccumulateYuzuMeta();
boost::optional<NcaID> GetNcaIDFromMetadata(u64 title_id, ContentRecordType type) const;
diff --git a/src/core/file_sys/vfs_concat.cpp b/src/core/file_sys/vfs_concat.cpp
index 1d439e0a4..88a9a5259 100644
--- a/src/core/file_sys/vfs_concat.cpp
+++ b/src/core/file_sys/vfs_concat.cpp
@@ -9,17 +9,17 @@
namespace FileSys {
-VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string_view name) {
+VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name) {
if (files.empty())
return nullptr;
if (files.size() == 1)
return files[0];
- return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), name));
+ return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name)));
}
-ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string_view name)
- : name(name) {
+ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string name)
+ : name(std::move(name)) {
size_t next_offset = 0;
for (const auto& file : files_) {
files[next_offset] = file;
diff --git a/src/core/file_sys/vfs_concat.h b/src/core/file_sys/vfs_concat.h
index d319c5786..686d32515 100644
--- a/src/core/file_sys/vfs_concat.h
+++ b/src/core/file_sys/vfs_concat.h
@@ -12,14 +12,14 @@
namespace FileSys {
// Wrapper function to allow for more efficient handling of files.size() == 0, 1 cases.
-VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string_view name = "");
+VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name = "");
// Class that wraps multiple vfs files and concatenates them, making reads seamless. Currently
// read-only.
class ConcatenatedVfsFile : public VfsFile {
- friend VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string_view name);
+ friend VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name);
- ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string_view name);
+ ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string name);
public:
std::string GetName() const override;
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index c48191486..fd237df43 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -619,7 +619,7 @@ void GMainWindow::OnMenuLoadFolder() {
}
void GMainWindow::OnMenuInstallToNAND() {
- const static QString file_filter =
+ const QString file_filter =
tr("Installable Switch File (*.nca *.xci);;Nintendo Content Archive (*.nca);;NX Cartridge "
"Image (*.xci)");
QString filename = QFileDialog::getOpenFileName(this, tr("Install File"),
@@ -629,36 +629,36 @@ void GMainWindow::OnMenuInstallToNAND() {
const auto xci = std::make_shared<FileSys::XCI>(
vfs->OpenFile(filename.toStdString(), FileSys::Mode::Read));
if (xci->GetStatus() != Loader::ResultStatus::Success) {
- QMessageBox::critical(
+ QMessageBox::warning(
this, tr("Failed to Install XCI"),
tr("The XCI file you provided is invalid. Please double-check your encryption "
"keys and the file and try again."));
return;
}
- if (!Service::FileSystem::GetUserNANDContents()->InstallEntry(xci)) {
- QMessageBox::critical(
- this, tr("Failed to Install XCI"),
- tr("There was an error while attempting to install the provided XCI file. It "
- "could have an incorrect format or be missing a metadata entry. Please "
- "double-check your file and try again."));
- } else {
+ if (Service::FileSystem::GetUserNANDContents()->InstallEntry(xci)) {
QMessageBox::information(this, tr("Successfully Installed XCI"),
tr("The file was successfully installed."));
game_list->PopulateAsync(UISettings::values.gamedir,
UISettings::values.gamedir_deepscan);
+ } else {
+ QMessageBox::warning(
+ this, tr("Failed to Install XCI"),
+ tr("There was an error while attempting to install the provided XCI file. It "
+ "could have an incorrect format or be missing a metadata entry. Please "
+ "double-check your file and try again."));
}
} else {
const auto nca = std::make_shared<FileSys::NCA>(
vfs->OpenFile(filename.toStdString(), FileSys::Mode::Read));
if (nca->GetStatus() != Loader::ResultStatus::Success) {
- QMessageBox::critical(
+ QMessageBox::warning(
this, tr("Failed to Install NCA"),
tr("The NCA file you provided is invalid. Please double-check your encryption "
"keys and the file and try again."));
return;
}
- const static QStringList tt_options{"System Application",
+ static const QStringList tt_options{"System Application",
"System Archive",
"System Application Update",
"Firmware Package (Type A)",
@@ -676,26 +676,26 @@ void GMainWindow::OnMenuInstallToNAND() {
auto index = tt_options.indexOf(item);
if (!ok || index == -1) {
- QMessageBox::critical(this, tr("Failed to Install NCA"),
- tr("The title type you selected for the NCA is invalid."));
+ QMessageBox::warning(this, tr("Failed to Install NCA"),
+ tr("The title type you selected for the NCA is invalid."));
return;
}
if (index >= 5)
index += 0x80;
- if (!Service::FileSystem::GetUserNANDContents()->InstallEntry(
+ if (Service::FileSystem::GetUserNANDContents()->InstallEntry(
nca, static_cast<FileSys::TitleType>(index))) {
- QMessageBox::critical(this, tr("Failed to Install NCA"),
- tr("There was an error while attempting to install the "
- "provided NCA file. An error might have occured creating "
- "the metadata file or parsing the NCA. Please "
- "double-check your file and try again."));
- } else {
QMessageBox::information(this, tr("Successfully Installed NCA"),
tr("The file was successfully installed."));
game_list->PopulateAsync(UISettings::values.gamedir,
UISettings::values.gamedir_deepscan);
+ } else {
+ QMessageBox::warning(this, tr("Failed to Install NCA"),
+ tr("There was an error while attempting to install the "
+ "provided NCA file. An error might have occured creating "
+ "the metadata file or parsing the NCA. Please "
+ "double-check your file and try again."));
}
}
}