Update ApplicationProject.h, ApplicationProjectReader.cpp, and 3 more files... | fix crash on reading non-existing project directories

This commit is contained in:
Skarn
2022-03-12 14:02:41 +03:00
parent ca82d85413
commit fb5b73ce2e
5 changed files with 54 additions and 44 deletions

View File

@@ -179,7 +179,7 @@ namespace Noggit::Project
std::shared_ptr<NoggitProject> loadProject(std::filesystem::path const& projectPath) std::shared_ptr<NoggitProject> loadProject(std::filesystem::path const& projectPath)
{ {
auto projectReader = ApplicationProjectReader(); auto projectReader = ApplicationProjectReader();
auto project = projectReader.ReadProject(projectPath); auto project = projectReader.readProject(projectPath);
assert (project.has_value()); assert (project.has_value());

View File

@@ -11,88 +11,96 @@
namespace Noggit::Project namespace Noggit::Project
{ {
std::optional<NoggitProject> ApplicationProjectReader::ReadProject(std::filesystem::path const& projectPath) std::optional<NoggitProject> 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")) if (entry.path().extension() == std::string(".noggitproj"))
{ {
QFile inputFile(QString::fromStdString(entry.path().generic_string())); QFile input_file(QString::fromStdString(entry.path().generic_string()));
inputFile.open(QIODevice::ReadOnly); input_file.open(QIODevice::ReadOnly);
auto document = QJsonDocument().fromJson(inputFile.readAll()); auto document = QJsonDocument().fromJson(input_file.readAll());
auto root = document.object(); auto root = document.object();
auto project = NoggitProject(); auto project = NoggitProject();
project.ProjectPath = projectPath.generic_string(); project.ProjectPath = project_path.generic_string();
if (root.contains("Project") && root["Project"].isObject()) if (root.contains("Project") && root["Project"].isObject())
{ {
auto projectConfiguration = root["Project"].toObject(); auto project_configuration = root["Project"].toObject();
if (projectConfiguration.contains("ProjectName")) if (project_configuration.contains("ProjectName"))
project.ProjectName = projectConfiguration["ProjectName"].toString().toStdString(); 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(); auto bookmark = NoggitProjectBookmarkMap();
bookmark.map_id = jsonBookmark.toObject().value("MapId").toInt(); bookmark.map_id = json_bookmark.toObject().value("MapId").toInt();
bookmark.name = jsonBookmark.toObject().value("BookmarkName").toString().toStdString(); bookmark.name = json_bookmark.toObject().value("BookmarkName").toString().toStdString();
bookmark.camera_pitch = jsonBookmark.toObject().value("CameraPitch").toDouble(); bookmark.camera_pitch = json_bookmark.toObject().value("CameraPitch").toDouble();
bookmark.camera_yaw = jsonBookmark.toObject().value("CameraYaw").toDouble(); bookmark.camera_yaw = json_bookmark.toObject().value("CameraYaw").toDouble();
auto bookmarkPosition = jsonBookmark.toObject().value("Position"); auto bookmark_position = json_bookmark.toObject().value("Position");
auto bookmarkPositionX = bookmarkPosition.toObject().value("X").toDouble(); auto bookmark_position_x = bookmark_position.toObject().value("X").toDouble();
auto bookmarkPositionY = bookmarkPosition.toObject().value("Y").toDouble(); auto bookmark_position_y = bookmark_position.toObject().value("Y").toDouble();
auto bookmarkPositionZ = bookmarkPosition.toObject().value("Z").toDouble(); auto bookmark_position_z = bookmark_position.toObject().value("Z").toDouble();
bookmark.position = glm::vec3(bookmarkPositionX, bookmarkPositionY, bookmarkPositionZ); bookmark.position = glm::vec3(bookmark_position_x, bookmark_position_y, bookmark_position_z);
project.Bookmarks.push_back(bookmark); 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(); auto pinned_map = NoggitProjectPinnedMap();
pinnedMap.MapId = jsonPinnedMap.toObject().value("MapId").toInt(); pinned_map.MapId = json_pinned_map.toObject().value("MapId").toInt();
pinnedMap.MapName = jsonPinnedMap.toObject().value("MapName").toString().toStdString(); pinned_map.MapName = json_pinned_map.toObject().value("MapName").toString().toStdString();
project.PinnedMaps.push_back(pinnedMap); 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; auto client_version_enum = Noggit::Project::ProjectVersion::WOTLK;
if (clientVersion == std::string("Shadowlands")) 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; return project;

View File

@@ -13,7 +13,7 @@ namespace Noggit::Project
public: public:
ApplicationProjectReader() = default; ApplicationProjectReader() = default;
std::optional<NoggitProject> ReadProject(std::filesystem::path const& projectPath); std::optional<NoggitProject> readProject(std::filesystem::path const& project_path);
}; };
} }

View File

@@ -59,7 +59,7 @@ NoggitProjectSelectionWindow::NoggitProjectSelectionWindow(Noggit::Application::
std::filesystem::path filepath(proj_file.toStdString()); 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()) if (!project.has_value())
{ {

View File

@@ -25,8 +25,10 @@ void RecentProjectsComponent::buildRecentProjectsList(Noggit::Ui::Windows::Noggi
auto item = new QListWidgetItem(parent->_ui->listView); auto item = new QListWidgetItem(parent->_ui->listView);
auto project_reader = Noggit::Project::ApplicationProjectReader(); 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()) if (!project.has_value())
continue; continue;