yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
rom_file_manager.cc
Go to the documentation of this file.
1#include "rom_file_manager.h"
2
3#include <filesystem>
4#include <fstream>
5#include <chrono>
6
7#include "absl/strings/str_format.h"
9#include "app/rom.h"
10#include "util/file_util.h"
11
12namespace yaze::editor {
13
15 : toast_manager_(toast_manager) {}
16
17absl::Status RomFileManager::LoadRom(Rom* rom, const std::string& filename) {
18 if (!rom) {
19 return absl::InvalidArgumentError("ROM pointer cannot be null");
20 }
21 if (filename.empty()) {
22 return absl::InvalidArgumentError("No filename provided");
23 }
24 return LoadRomFromFile(rom, filename);
25}
26
27absl::Status RomFileManager::SaveRom(Rom* rom) {
28 if (!IsRomLoaded(rom)) {
29 return absl::FailedPreconditionError("No ROM loaded to save");
30 }
31
32 Rom::SaveSettings settings;
33 settings.backup = true;
34 settings.save_new = false;
35 settings.z3_save = true;
36
37 auto status = rom->SaveToFile(settings);
38 if (!status.ok() && toast_manager_) {
40 absl::StrFormat("Failed to save ROM: %s", status.message()),
42 } else if (toast_manager_) {
43 toast_manager_->Show("ROM saved successfully", ToastType::kSuccess);
44 }
45 return status;
46}
47
48absl::Status RomFileManager::SaveRomAs(Rom* rom, const std::string& filename) {
49 if (!IsRomLoaded(rom)) {
50 return absl::FailedPreconditionError("No ROM loaded to save");
51 }
52 if (filename.empty()) {
53 return absl::InvalidArgumentError(
54 "No filename provided for save as");
55 }
56
57 Rom::SaveSettings settings;
58 settings.backup = false;
59 settings.save_new = true;
60 settings.filename = filename;
61 settings.z3_save = true;
62
63 auto status = rom->SaveToFile(settings);
64 if (!status.ok() && toast_manager_) {
66 absl::StrFormat("Failed to save ROM as: %s", status.message()),
68 } else if (toast_manager_) {
70 absl::StrFormat("ROM saved as: %s", filename),
72 }
73 return status;
74}
75
77 const std::string& filename) {
78 if (!rom) {
79 return absl::InvalidArgumentError("ROM pointer cannot be null");
80 }
81 if (filename.empty()) {
82 return absl::InvalidArgumentError("No filename provided");
83 }
84
85 std::string extension =
86 std::filesystem::path(filename).extension().string();
87
88 if (extension == ".yaze" || extension == ".json") {
89 return absl::UnimplementedError(
90 "Project file loading not yet implemented");
91 }
92
93 return LoadRom(rom, filename);
94}
95
97 if (!IsRomLoaded(rom)) {
98 return absl::FailedPreconditionError("No ROM loaded to backup");
99 }
100
101 std::string backup_filename = GenerateBackupFilename(rom->filename());
102
103 Rom::SaveSettings settings;
104 settings.backup = true;
105 settings.filename = backup_filename;
106 settings.z3_save = true;
107
108 auto status = rom->SaveToFile(settings);
109 if (!status.ok() && toast_manager_) {
111 absl::StrFormat("Failed to create backup: %s", status.message()),
113 } else if (toast_manager_) {
115 absl::StrFormat("Backup created: %s", backup_filename),
117 }
118 return status;
119}
120
122 if (!IsRomLoaded(rom)) {
123 return absl::FailedPreconditionError("No valid ROM to validate");
124 }
125
126 if (rom->size() < 512 * 1024 || rom->size() > 8 * 1024 * 1024) {
127 return absl::InvalidArgumentError("ROM size is outside expected range");
128 }
129 if (rom->title().empty()) {
130 return absl::InvalidArgumentError("ROM title is empty or invalid");
131 }
132
133 if (toast_manager_) {
134 toast_manager_->Show("ROM validation passed", ToastType::kSuccess);
135 }
136 return absl::OkStatus();
137}
138
140 return rom && rom->is_loaded();
141}
142
143std::string RomFileManager::GetRomFilename(Rom* rom) const {
144 if (!IsRomLoaded(rom)) {
145 return "";
146 }
147 return rom->filename();
148}
149
151 Rom* rom, const std::string& filename) {
152 if (!rom) {
153 return absl::InvalidArgumentError("ROM pointer cannot be null");
154 }
155 if (!IsValidRomFile(filename)) {
156 return absl::InvalidArgumentError(
157 absl::StrFormat("Invalid ROM file: %s", filename));
158 }
159
160 auto status = rom->LoadFromFile(filename);
161 if (!status.ok()) {
162 if (toast_manager_) {
164 absl::StrFormat("Failed to load ROM: %s", status.message()),
166 }
167 return status;
168 }
169
170 if (toast_manager_) {
171 toast_manager_->Show(absl::StrFormat("ROM loaded: %s", rom->title()),
173 }
174 return absl::OkStatus();
175}
176
178 const std::string& original_filename) const {
179 std::filesystem::path path(original_filename);
180 std::string stem = path.stem().string();
181 std::string extension = path.extension().string();
182
183 auto now = std::chrono::system_clock::now();
184 auto time_t = std::chrono::system_clock::to_time_t(now);
185
186 return absl::StrFormat("%s_backup_%ld%s", stem, time_t, extension);
187}
188
189bool RomFileManager::IsValidRomFile(const std::string& filename) const {
190 if (filename.empty()) {
191 return false;
192 }
193
194 if (!std::filesystem::exists(filename)) {
195 return false;
196 }
197
198 auto file_size = std::filesystem::file_size(filename);
199 if (file_size < 1024 * 1024 || file_size > 8 * 1024 * 1024) {
200 return false;
201 }
202
203 return true;
204}
205
206} // namespace yaze::editor
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:74
absl::Status LoadFromFile(const std::string &filename, bool z3_load=true)
Definition rom.cc:292
auto filename() const
Definition rom.h:211
absl::Status SaveToFile(const SaveSettings &settings)
Definition rom.cc:539
auto size() const
Definition rom.h:205
bool is_loaded() const
Definition rom.h:200
auto title() const
Definition rom.h:204
std::string GenerateBackupFilename(const std::string &original_filename) const
absl::Status OpenRomOrProject(Rom *rom, const std::string &filename)
absl::Status ValidateRom(Rom *rom)
RomFileManager(ToastManager *toast_manager)
std::string GetRomFilename(Rom *rom) const
absl::Status CreateBackup(Rom *rom)
absl::Status LoadRom(Rom *rom, const std::string &filename)
absl::Status SaveRom(Rom *rom)
absl::Status LoadRomFromFile(Rom *rom, const std::string &filename)
bool IsValidRomFile(const std::string &filename) const
absl::Status SaveRomAs(Rom *rom, const std::string &filename)
bool IsRomLoaded(Rom *rom) const
void Show(const std::string &message, ToastType type=ToastType::kInfo, float ttl_seconds=3.0f)
Editors are the view controllers for the application.
std::string filename
Definition rom.h:80