From fb5b73ce2ef7f5bf1631d654a9856e45f712aee4 Mon Sep 17 00:00:00 2001 From: Skarn Date: Sat, 12 Mar 2022 14:02:41 +0300 Subject: [PATCH] Update ApplicationProject.h, ApplicationProjectReader.cpp, and 3 more files... | fix crash on reading non-existing project directories --- src/noggit/project/ApplicationProject.h | 2 +- .../project/ApplicationProjectReader.cpp | 88 ++++++++++--------- src/noggit/project/ApplicationProjectReader.h | 2 +- .../NoggitProjectSelectionWindow.cpp | 2 +- .../components/RecentProjectsComponent.cpp | 4 +- 5 files changed, 54 insertions(+), 44 deletions(-) diff --git a/src/noggit/project/ApplicationProject.h b/src/noggit/project/ApplicationProject.h index 1dea1da2..4c24f203 100644 --- a/src/noggit/project/ApplicationProject.h +++ b/src/noggit/project/ApplicationProject.h @@ -179,7 +179,7 @@ namespace Noggit::Project std::shared_ptr loadProject(std::filesystem::path const& projectPath) { auto projectReader = ApplicationProjectReader(); - auto project = projectReader.ReadProject(projectPath); + auto project = projectReader.readProject(projectPath); assert (project.has_value()); diff --git a/src/noggit/project/ApplicationProjectReader.cpp b/src/noggit/project/ApplicationProjectReader.cpp index ea0d2f4d..5392b90a 100644 --- a/src/noggit/project/ApplicationProjectReader.cpp +++ b/src/noggit/project/ApplicationProjectReader.cpp @@ -11,88 +11,96 @@ namespace Noggit::Project { - std::optional ApplicationProjectReader::ReadProject(std::filesystem::path const& projectPath) + std::optional ApplicationProjectReader::readProject(std::filesystem::path const& project_path) { - for (const auto& entry : std::filesystem::directory_iterator(projectPath)) + for (const auto& entry : std::filesystem::directory_iterator(project_path)) { if (entry.path().extension() == std::string(".noggitproj")) { - QFile inputFile(QString::fromStdString(entry.path().generic_string())); - inputFile.open(QIODevice::ReadOnly); + QFile input_file(QString::fromStdString(entry.path().generic_string())); + input_file.open(QIODevice::ReadOnly); - auto document = QJsonDocument().fromJson(inputFile.readAll()); + auto document = QJsonDocument().fromJson(input_file.readAll()); auto root = document.object(); auto project = NoggitProject(); - project.ProjectPath = projectPath.generic_string(); + project.ProjectPath = project_path.generic_string(); if (root.contains("Project") && root["Project"].isObject()) { - auto projectConfiguration = root["Project"].toObject(); - if (projectConfiguration.contains("ProjectName")) - project.ProjectName = projectConfiguration["ProjectName"].toString().toStdString(); + auto project_configuration = root["Project"].toObject(); + if (project_configuration.contains("ProjectName")) + project.ProjectName = project_configuration["ProjectName"].toString().toStdString(); - if (projectConfiguration.contains("Bookmarks") && projectConfiguration["Bookmarks"].isArray()) + if (project_configuration.contains("Bookmarks") && project_configuration["Bookmarks"].isArray()) { - auto projectBookmarks = projectConfiguration["Bookmarks"].toArray(); + auto project_bookmarks = project_configuration["Bookmarks"].toArray(); - for (auto const& jsonBookmark : projectBookmarks) + for (auto const& json_bookmark : project_bookmarks) { auto bookmark = NoggitProjectBookmarkMap(); - bookmark.map_id = jsonBookmark.toObject().value("MapId").toInt(); - bookmark.name = jsonBookmark.toObject().value("BookmarkName").toString().toStdString(); - bookmark.camera_pitch = jsonBookmark.toObject().value("CameraPitch").toDouble(); - bookmark.camera_yaw = jsonBookmark.toObject().value("CameraYaw").toDouble(); + bookmark.map_id = json_bookmark.toObject().value("MapId").toInt(); + bookmark.name = json_bookmark.toObject().value("BookmarkName").toString().toStdString(); + bookmark.camera_pitch = json_bookmark.toObject().value("CameraPitch").toDouble(); + bookmark.camera_yaw = json_bookmark.toObject().value("CameraYaw").toDouble(); - auto bookmarkPosition = jsonBookmark.toObject().value("Position"); - auto bookmarkPositionX = bookmarkPosition.toObject().value("X").toDouble(); - auto bookmarkPositionY = bookmarkPosition.toObject().value("Y").toDouble(); - auto bookmarkPositionZ = bookmarkPosition.toObject().value("Z").toDouble(); - bookmark.position = glm::vec3(bookmarkPositionX, bookmarkPositionY, bookmarkPositionZ); + auto bookmark_position = json_bookmark.toObject().value("Position"); + auto bookmark_position_x = bookmark_position.toObject().value("X").toDouble(); + auto bookmark_position_y = bookmark_position.toObject().value("Y").toDouble(); + auto bookmark_position_z = bookmark_position.toObject().value("Z").toDouble(); + bookmark.position = glm::vec3(bookmark_position_x, bookmark_position_y, bookmark_position_z); project.Bookmarks.push_back(bookmark); } } - if (projectConfiguration.contains("PinnedMaps") && projectConfiguration["PinnedMaps"].isArray()) + if (project_configuration.contains("PinnedMaps") && project_configuration["PinnedMaps"].isArray()) { - auto projectPinnedMaps = projectConfiguration["PinnedMaps"].toArray(); + auto project_pinned_maps = project_configuration["PinnedMaps"].toArray(); - for(auto const &jsonPinnedMap : projectPinnedMaps) + for(auto const &json_pinned_map : project_pinned_maps) { - auto pinnedMap = NoggitProjectPinnedMap(); - pinnedMap.MapId = jsonPinnedMap.toObject().value("MapId").toInt(); - pinnedMap.MapName = jsonPinnedMap.toObject().value("MapName").toString().toStdString(); - project.PinnedMaps.push_back(pinnedMap); + auto pinned_map = NoggitProjectPinnedMap(); + pinned_map.MapId = json_pinned_map.toObject().value("MapId").toInt(); + pinned_map.MapName = json_pinned_map.toObject().value("MapName").toString().toStdString(); + project.PinnedMaps.push_back(pinned_map); } } - if (projectConfiguration.contains("Client") && projectConfiguration["Client"].isObject()) + if (project_configuration.contains("Client") && project_configuration["Client"].isObject()) { - auto projectClientConfiguration = projectConfiguration["Client"].toObject(); + auto project_client_configuration = project_configuration["Client"].toObject(); - if (projectClientConfiguration.contains("ClientPath")) + if (project_client_configuration.contains("ClientPath")) { - project.ClientPath = projectClientConfiguration["ClientPath"].toString().toStdString(); + project.ClientPath = project_client_configuration["ClientPath"].toString().toStdString(); } - if (projectClientConfiguration.contains("ClientVersion")) + if (project_client_configuration.contains("ClientVersion")) { - auto clientVersion = projectClientConfiguration["ClientVersion"].toString().toStdString(); + auto client_version = project_client_configuration["ClientVersion"].toString().toStdString(); - auto clientVersionEnum = Noggit::Project::ProjectVersion::WOTLK; - if (clientVersion == std::string("Shadowlands")) + auto client_version_enum = Noggit::Project::ProjectVersion::WOTLK; + if (client_version == std::string("Shadowlands")) { - clientVersionEnum = Noggit::Project::ProjectVersion::SL; + client_version_enum = Noggit::Project::ProjectVersion::SL; } - if (clientVersion == std::string("Wrath Of The Lich King")) + if (client_version == std::string("Wrath Of The Lich King")) { - clientVersionEnum = Noggit::Project::ProjectVersion::WOTLK; + client_version_enum = Noggit::Project::ProjectVersion::WOTLK; } - project.projectVersion = clientVersionEnum; + project.projectVersion = client_version_enum; } } + else + { + return {}; + } + } + else + { + return {}; } return project; diff --git a/src/noggit/project/ApplicationProjectReader.h b/src/noggit/project/ApplicationProjectReader.h index 67ff3c4b..310d68e3 100644 --- a/src/noggit/project/ApplicationProjectReader.h +++ b/src/noggit/project/ApplicationProjectReader.h @@ -13,7 +13,7 @@ namespace Noggit::Project public: ApplicationProjectReader() = default; - std::optional ReadProject(std::filesystem::path const& projectPath); + std::optional readProject(std::filesystem::path const& project_path); }; } diff --git a/src/noggit/ui/windows/projectSelection/NoggitProjectSelectionWindow.cpp b/src/noggit/ui/windows/projectSelection/NoggitProjectSelectionWindow.cpp index a82d6378..723beb12 100644 --- a/src/noggit/ui/windows/projectSelection/NoggitProjectSelectionWindow.cpp +++ b/src/noggit/ui/windows/projectSelection/NoggitProjectSelectionWindow.cpp @@ -59,7 +59,7 @@ NoggitProjectSelectionWindow::NoggitProjectSelectionWindow(Noggit::Application:: std::filesystem::path filepath(proj_file.toStdString()); - auto project = project_reader.ReadProject(filepath.parent_path()); + auto project = project_reader.readProject(filepath.parent_path()); if (!project.has_value()) { diff --git a/src/noggit/ui/windows/projectSelection/components/RecentProjectsComponent.cpp b/src/noggit/ui/windows/projectSelection/components/RecentProjectsComponent.cpp index bd2ec884..a0447e1a 100644 --- a/src/noggit/ui/windows/projectSelection/components/RecentProjectsComponent.cpp +++ b/src/noggit/ui/windows/projectSelection/components/RecentProjectsComponent.cpp @@ -25,8 +25,10 @@ void RecentProjectsComponent::buildRecentProjectsList(Noggit::Ui::Windows::Noggi auto item = new QListWidgetItem(parent->_ui->listView); auto project_reader = Noggit::Project::ApplicationProjectReader(); - auto project = project_reader.ReadProject(project_path); + if (!std::filesystem::exists(project_path) || !std::filesystem::is_directory(project_path)) + continue; + auto project = project_reader.readProject(project_path); if (!project.has_value()) continue;