diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ad2ac6a..c202ffd 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -42,6 +42,7 @@ add_executable(MassBuilderSaveTool WIN32
Profile/Profile.cpp
MassManager/MassManager.h
MassManager/MassManager.cpp
+ Mass/Locators.h
Mass/Mass.h
Mass/Mass.cpp
Maps/LastMissionId.h
diff --git a/src/Mass/Locators.h b/src/Mass/Locators.h
new file mode 100644
index 0000000..51011c2
--- /dev/null
+++ b/src/Mass/Locators.h
@@ -0,0 +1,20 @@
+#pragma once
+
+// MassBuilderSaveTool
+// Copyright (C) 2021 Guillaume Jacquemin
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+constexpr char mass_name_locator[] = "Name_45_A037C5D54E53456407BDF091344529BB\0\f\0\0\0StrProperty";
+constexpr char steamid_locator[] = "Account\0\f\0\0\0StrProperty";
diff --git a/src/Mass/Mass.cpp b/src/Mass/Mass.cpp
index 7f6f67f..7c689af 100644
--- a/src/Mass/Mass.cpp
+++ b/src/Mass/Mass.cpp
@@ -21,24 +21,24 @@
#include
#include
+#include "Locators.h"
+
#include "Mass.h"
using namespace Corrade;
-constexpr char mass_name_locator[] = "Name_45_A037C5D54E53456407BDF091344529BB\0\x0c\0\0\0StrProperty";
-constexpr char steamid_locator[] = "Account\0\x0c\0\0\0StrProperty";
-
std::string Mass::_lastError;
-Mass::Mass(const std::string& filename) {
- _filename = filename;
+Mass::Mass(const std::string& path) {
+ _folder = Utility::Directory::path(path);
+ _filename = Utility::Directory::filename(path);
- if(!Utility::Directory::exists(_filename)) {
- _lastError = "The file " + _filename + " couldn't be found.";
+ if(!Utility::Directory::exists(path)) {
+ _lastError = path + " couldn't be found.";
return;
}
- auto mmap = Utility::Directory::mapRead(_filename);
+ auto mmap = Utility::Directory::mapRead(path);
auto iter = std::search(mmap.begin(), mmap.end(), &mass_name_locator[0], &mass_name_locator[56]);
@@ -47,7 +47,7 @@ Mass::Mass(const std::string& filename) {
_state = MassState::Valid;
}
else {
- _lastError = "The name couldn't be found in " + filename;
+ _lastError = "The name couldn't be found in " + _filename;
_state = MassState::Invalid;
}
}
@@ -56,15 +56,15 @@ auto Mass::lastError() -> std::string const& {
return _lastError;
}
-auto Mass::getNameFromFile(const std::string& filename) -> std::string {
- if(!Utility::Directory::exists(filename)) {
- _lastError = "The file " + filename + " couldn't be found.";
+auto Mass::getNameFromFile(const std::string& path) -> std::string {
+ if(!Utility::Directory::exists(path)) {
+ _lastError = path + " couldn't be found.";
return "";
}
- std::string name = "";
+ std::string name;
- auto mmap = Utility::Directory::mapRead(filename);
+ auto mmap = Utility::Directory::mapRead(path);
auto iter = std::search(mmap.begin(), mmap.end(), &mass_name_locator[0], &mass_name_locator[56]);
@@ -72,7 +72,7 @@ auto Mass::getNameFromFile(const std::string& filename) -> std::string {
name = std::string{iter + 70};
}
else {
- _lastError = "The name couldn't be found in " + filename;
+ _lastError = "The name couldn't be found in " + path;
}
return name;
@@ -86,49 +86,29 @@ auto Mass::name() -> std::string const&{
return _name;
}
-auto Mass::getName() -> std::string const& {
- if(!Utility::Directory::exists(_filename)) {
- _lastError = "The file " + _filename + " couldn't be found.";
- _state = MassState::Empty;
- return _name = "";
- }
-
- auto mmap = Utility::Directory::mapRead(_filename);
-
- auto iter = std::search(mmap.begin(), mmap.end(), &mass_name_locator[0], &mass_name_locator[56]);
-
- if(iter != mmap.end()) {
- _state = MassState::Valid;
- return _name = std::string{iter + 70};
- }
- else {
- _lastError = "The name couldn't be found in " + _filename;
- _state = MassState::Invalid;
- return _name = "";
- }
-}
-
auto Mass::state() -> MassState {
return _state;
}
auto Mass::updateSteamId(const std::string& steam_id) -> bool {
- if(!Utility::Directory::exists(_filename)) {
- _lastError = "The file " + _filename + " couldn't be found.";
+ std::string path = Utility::Directory::join(_folder, _filename);
+
+ if(!Utility::Directory::exists(path)) {
+ _lastError = path + " couldn't be found.";
_state = MassState::Empty;
return false;
}
- Utility::Directory::copy(_filename, _filename + ".tmp");
+ Utility::Directory::copy(path, path + ".tmp");
{
- auto mmap = Utility::Directory::map(_filename + ".tmp");
+ auto mmap = Utility::Directory::map(path + ".tmp");
auto iter = std::search(mmap.begin(), mmap.end(), &steamid_locator[0], &steamid_locator[23]);
if(iter == mmap.end()) {
- _lastError = "The M.A.S.S. file at " + _filename + " seems to be corrupt.";
- Utility::Directory::rm(_filename + ".tmp");
+ _lastError = "The M.A.S.S. file at " + path + " seems to be corrupt.";
+ Utility::Directory::rm(path + ".tmp");
return false;
}
@@ -141,11 +121,11 @@ auto Mass::updateSteamId(const std::string& steam_id) -> bool {
}
}
- if(Utility::Directory::exists(_filename)) {
- Utility::Directory::rm(_filename);
+ if(Utility::Directory::exists(path)) {
+ Utility::Directory::rm(path);
}
- Utility::Directory::move(_filename + ".tmp", _filename);
+ Utility::Directory::move(path + ".tmp", path);
return true;
}
diff --git a/src/Mass/Mass.h b/src/Mass/Mass.h
index 1c2d0ad..124c319 100644
--- a/src/Mass/Mass.h
+++ b/src/Mass/Mass.h
@@ -28,7 +28,7 @@ enum class MassState : UnsignedByte {
class Mass {
public:
- explicit Mass(const std::string& filename);
+ explicit Mass(const std::string& path);
Mass(const Mass&) = delete;
Mass& operator=(const Mass&) = delete;
@@ -38,12 +38,11 @@ class Mass {
static auto lastError() -> std::string const&;
- static auto getNameFromFile(const std::string& filename) -> std::string;
+ static auto getNameFromFile(const std::string& path) -> std::string;
auto filename() -> std::string const&;
auto name() -> std::string const&;
- auto getName() -> std::string const&;
auto state() -> MassState;
@@ -52,7 +51,8 @@ class Mass {
private:
static std::string _lastError;
- std::string _filename = "";
- std::string _name = "";
+ std::string _folder;
+ std::string _filename;
+ std::string _name;
MassState _state = MassState::Empty;
};
diff --git a/src/MassManager/MassManager.cpp b/src/MassManager/MassManager.cpp
index e0c4910..be83937 100644
--- a/src/MassManager/MassManager.cpp
+++ b/src/MassManager/MassManager.cpp
@@ -49,20 +49,8 @@ auto MassManager::lastError() -> std::string const& {
return _lastError;
}
-auto MassManager::massName(int hangar) -> std::string const& {
- if(hangar < 0 || hangar >= 32) {
- return empty_string;
- }
-
- return _hangars[hangar].name();
-}
-
-auto MassManager::massState(int hangar) -> MassState {
- if(hangar < 0 || hangar >= 32) {
- return MassState::Empty;
- }
-
- return _hangars[hangar].state();
+auto MassManager::hangar(int hangar) -> Mass& {
+ return _hangars[hangar];
}
void MassManager::refreshHangar(int hangar) {
diff --git a/src/MassManager/MassManager.h b/src/MassManager/MassManager.h
index 2b0d0f7..a30c7e8 100644
--- a/src/MassManager/MassManager.h
+++ b/src/MassManager/MassManager.h
@@ -31,8 +31,7 @@ class MassManager {
auto lastError() -> std::string const&;
- auto massName(int hangar) -> std::string const&;
- auto massState(int hangar) -> MassState;
+ auto hangar(int hangar) -> Mass&;
void refreshHangar(int hangar);
diff --git a/src/SaveTool/SaveTool_MainManager.cpp b/src/SaveTool/SaveTool_MainManager.cpp
index 747aea1..3708694 100644
--- a/src/SaveTool/SaveTool_MainManager.cpp
+++ b/src/SaveTool/SaveTool_MainManager.cpp
@@ -429,13 +429,13 @@ void SaveTool::drawMassManager() {
ImGui::TableSetColumnIndex(0);
ImGui::Selectable(Utility::formatString("{:.2d}", i + 1).c_str(),
false, ImGuiSelectableFlags_SpanAllColumns|ImGuiSelectableFlags_AllowItemOverlap);
- if(_massManager->massState(i) == MassState::Valid &&
+ if(_massManager->hangar(i).state() == MassState::Valid &&
ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceNoHoldToOpenOthers))
{
drag_drop_index = i;
ImGui::SetDragDropPayload("Mass", &drag_drop_index, sizeof(int));
- ImGui::Text("%s - Hangar %.2d", _massManager->massName(i).c_str(), i + 1);
+ ImGui::Text("%s - Hangar %.2d", _massManager->hangar(i).name().c_str(), i + 1);
ImGui::EndDragDropSource();
}
@@ -476,7 +476,7 @@ void SaveTool::drawMassManager() {
}
ImGui::TableSetColumnIndex(1);
- switch(_massManager->massState(i)) {
+ switch(_massManager->hangar(i).state()) {
case MassState::Empty:
ImGui::TextDisabled("");
break;
@@ -484,7 +484,7 @@ void SaveTool::drawMassManager() {
ImGui::TextDisabled("");
break;
case MassState::Valid:
- ImGui::TextUnformatted(_massManager->massName(i).c_str());
+ ImGui::TextUnformatted(_massManager->hangar(i).name().c_str());
break;
}
@@ -494,7 +494,7 @@ void SaveTool::drawMassManager() {
drawTooltip("This is the currently active frame slot.");
}
- if(_massManager->massState(i) != MassState::Empty) {
+ if(_massManager->hangar(i).state() != MassState::Empty) {
ImGui::TableSetColumnIndex(3);
ImGui::PushID(i);
if(drawUnsafeWidget(ImGui::SmallButton, ICON_FA_TRASH_ALT)) {
@@ -588,7 +588,7 @@ auto SaveTool::drawDeleteMassPopup(int mass_index) -> ImGuiID {
return ImGui::GetID("Confirmation##DeleteMassConfirmation");
}
- if(_massManager->massState(mass_index) == MassState::Empty) {
+ if(_massManager->hangar(mass_index).state() == MassState::Empty) {
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
return 0;
@@ -601,13 +601,13 @@ auto SaveTool::drawDeleteMassPopup(int mass_index) -> ImGuiID {
}
ImGui::PushTextWrapPos(windowSize().x() * 0.40f);
- if(_massManager->massState(mass_index) == MassState::Invalid) {
+ if(_massManager->hangar(mass_index).state() == MassState::Invalid) {
ImGui::Text("Are you sure you want to delete the invalid M.A.S.S. data in hangar %.2i ? This operation is irreversible.",
mass_index + 1);
}
else {
ImGui::Text("Are you sure you want to delete the M.A.S.S. named %s in hangar %.2i ? This operation is irreversible.",
- _massManager->massName(mass_index).c_str(), mass_index + 1);
+ _massManager->hangar(mass_index).name().c_str(), mass_index + 1);
}
ImGui::PopTextWrapPos();