yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
rom_service_impl.cc
Go to the documentation of this file.
2
3#ifdef YAZE_WITH_GRPC
4
5#include "absl/strings/str_format.h"
7#include "rom/rom.h"
8
9// Proto namespace alias for convenience
10namespace rom_svc = ::yaze::proto;
11
12namespace yaze {
13
14namespace net {
15
16RomServiceImpl::RomServiceImpl(RomGetter rom_getter,
17 RomVersionManager* version_manager,
18 ProposalApprovalManager* approval_manager)
19 : rom_getter_(rom_getter),
20 version_mgr_(version_manager),
21 approval_mgr_(approval_manager) {}
22
23void RomServiceImpl::SetConfig(const Config& config) {
24 config_ = config;
25}
26
27grpc::Status RomServiceImpl::ReadBytes(grpc::ServerContext* context,
28 const rom_svc::ReadBytesRequest* request,
29 rom_svc::ReadBytesResponse* response) {
30 Rom* rom = rom_getter_();
31 if (!rom || !rom->is_loaded()) {
32 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
33 "ROM not loaded");
34 }
35
36 uint32_t offset = request->offset();
37 uint32_t length = request->length();
38
39 // Validate range
40 if (offset + length > rom->size()) {
41 return grpc::Status(grpc::StatusCode::OUT_OF_RANGE,
42 absl::StrFormat("Read beyond ROM: 0x%X+%d > %d", offset,
43 length, rom->size()));
44 }
45
46 // Read data
47 const auto* data = rom->data() + offset;
48 response->set_data(data, length);
49
50 return grpc::Status::OK;
51}
52
53grpc::Status RomServiceImpl::WriteBytes(
54 grpc::ServerContext* context, const rom_svc::WriteBytesRequest* request,
55 rom_svc::WriteBytesResponse* response) {
56 Rom* rom = rom_getter_();
57 if (!rom || !rom->is_loaded()) {
58 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
59 "ROM not loaded");
60 }
61
62 uint32_t offset = request->offset();
63 const std::string& data = request->data();
64
65 // Validate range
66 if (offset + data.size() > rom->size()) {
67 return grpc::Status(grpc::StatusCode::OUT_OF_RANGE,
68 absl::StrFormat("Write beyond ROM: 0x%X+%zu > %d",
69 offset, data.size(), rom->size()));
70 }
71
72 if (config_.require_approval_for_writes) {
73 return grpc::Status(grpc::StatusCode::PERMISSION_DENIED,
74 "Direct ROM writes disabled; use proposal system");
75 }
76
77 // Create auto-snapshot if enabled
78 auto status = MaybeCreateSnapshot(absl::StrFormat(
79 "Auto-snapshot before write at 0x%X (%zu bytes)", offset, data.size()));
80 if (!status.ok()) {
81 return grpc::Status(
82 grpc::StatusCode::INTERNAL,
83 "Failed to create safety snapshot: " + std::string(status.message()));
84 }
85
86 // Perform the write
87 std::memcpy(rom->mutable_data() + offset, data.data(), data.size());
88 response->set_success(true);
89
90 return grpc::Status::OK;
91}
92
93grpc::Status RomServiceImpl::GetRomInfo(
94 grpc::ServerContext* context, const rom_svc::GetRomInfoRequest* request,
95 rom_svc::GetRomInfoResponse* response) {
96 Rom* rom = rom_getter_();
97 if (!rom || !rom->is_loaded()) {
98 response->set_title("ROM not loaded");
99 return grpc::Status::OK;
100 }
101
102 response->set_title(rom->title());
103 response->set_size(rom->size());
104 // Removed checksum, is_expanded, version as they don't exist in yaze::Rom
105
106 return grpc::Status::OK;
107}
108
109// ... Stubs for other methods to keep it building ...
110grpc::Status RomServiceImpl::ReadOverworldMap(
111 grpc::ServerContext* context,
112 const rom_svc::ReadOverworldMapRequest* request,
113 rom_svc::ReadOverworldMapResponse* response) {
114 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
115}
116grpc::Status RomServiceImpl::WriteOverworldTile(
117 grpc::ServerContext* context,
118 const rom_svc::WriteOverworldTileRequest* request,
119 rom_svc::WriteOverworldTileResponse* response) {
120 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
121}
122grpc::Status RomServiceImpl::ReadDungeonRoom(
123 grpc::ServerContext* context,
124 const rom_svc::ReadDungeonRoomRequest* request,
125 rom_svc::ReadDungeonRoomResponse* response) {
126 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
127}
128grpc::Status RomServiceImpl::WriteDungeonTile(
129 grpc::ServerContext* context,
130 const rom_svc::WriteDungeonTileRequest* request,
131 rom_svc::WriteDungeonTileResponse* response) {
132 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
133}
134grpc::Status RomServiceImpl::ReadSprite(
135 grpc::ServerContext* context, const rom_svc::ReadSpriteRequest* request,
136 rom_svc::ReadSpriteResponse* response) {
137 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
138}
139grpc::Status RomServiceImpl::SubmitRomProposal(
140 grpc::ServerContext* context,
141 const rom_svc::SubmitRomProposalRequest* request,
142 rom_svc::SubmitRomProposalResponse* response) {
143 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
144}
145grpc::Status RomServiceImpl::GetProposalStatus(
146 grpc::ServerContext* context,
147 const rom_svc::GetProposalStatusRequest* request,
148 rom_svc::GetProposalStatusResponse* response) {
149 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
150}
151grpc::Status RomServiceImpl::CreateSnapshot(
152 grpc::ServerContext* context, const rom_svc::CreateSnapshotRequest* request,
153 rom_svc::CreateSnapshotResponse* response) {
154 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
155}
156grpc::Status RomServiceImpl::RestoreSnapshot(
157 grpc::ServerContext* context,
158 const rom_svc::RestoreSnapshotRequest* request,
159 rom_svc::RestoreSnapshotResponse* response) {
160 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
161}
162grpc::Status RomServiceImpl::ListSnapshots(
163 grpc::ServerContext* context, const rom_svc::ListSnapshotsRequest* request,
164 rom_svc::ListSnapshotsResponse* response) {
165 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
166}
167
168grpc::Status RomServiceImpl::ValidateRomLoaded() {
169 Rom* rom = rom_getter_();
170 if (!rom || !rom->is_loaded()) {
171 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
172 "ROM not loaded");
173 }
174 return grpc::Status::OK;
175}
176
177absl::Status RomServiceImpl::MaybeCreateSnapshot(
178 const std::string& description) {
179 if (!config_.enable_version_management || !version_mgr_) {
180 return absl::OkStatus();
181 }
182 return version_mgr_->CreateSnapshot(description, "gRPC", false).status();
183}
184
185} // namespace net
186
187} // namespace yaze
188
189#endif // YAZE_WITH_GRPC