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(Rom* rom, RomVersionManager* version_manager,
17 ProposalApprovalManager* approval_manager)
18 : rom_(rom),
19 version_mgr_(version_manager),
20 approval_mgr_(approval_manager) {}
21
22void RomServiceImpl::SetConfig(const Config& config) {
23 config_ = config;
24}
25
26grpc::Status RomServiceImpl::ReadBytes(grpc::ServerContext* context,
27 const rom_svc::ReadBytesRequest* request,
28 rom_svc::ReadBytesResponse* response) {
29 if (!rom_ || !rom_->is_loaded()) {
30 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
31 "ROM not loaded");
32 }
33
34 uint32_t offset = request->offset();
35 uint32_t length = request->length();
36
37 // Validate range
38 if (offset + length > rom_->size()) {
39 return grpc::Status(grpc::StatusCode::OUT_OF_RANGE,
40 absl::StrFormat("Read beyond ROM: 0x%X+%d > %d",
41 offset, length, rom_->size()));
42 }
43
44 // Read data
45 const auto* data = rom_->data() + offset;
46 response->set_data(data, length);
47
48 return grpc::Status::OK;
49}
50
51grpc::Status RomServiceImpl::WriteBytes(
52 grpc::ServerContext* context, const rom_svc::WriteBytesRequest* request,
53 rom_svc::WriteBytesResponse* response) {
54 if (!rom_ || !rom_->is_loaded()) {
55 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
56 "ROM not loaded");
57 }
58
59 uint32_t offset = request->offset();
60 const std::string& data = request->data();
61
62 // Validate range
63 if (offset + data.size() > rom_->size()) {
64 return grpc::Status(grpc::StatusCode::OUT_OF_RANGE,
65 absl::StrFormat("Write beyond ROM: 0x%X+%zu > %d",
66 offset, data.size(), rom_->size()));
67 }
68
69 // Check if approval required
70 if (config_.require_approval_for_writes && approval_mgr_) {
71 // Create a proposal for this write
72 std::string proposal_id =
73 absl::StrFormat("write_0x%X_%zu_bytes", offset, data.size());
74
75 // Check if proposal is approved
76 if (!approval_mgr_->IsProposalApproved(proposal_id)) {
77 response->set_success(false);
78 response->set_error("Write requires approval");
79 response->set_proposal_id(proposal_id);
80 return grpc::Status::OK; // Not an error, just needs approval
81 }
82 }
83
84 // Create snapshot before write
85 if (version_mgr_) {
86 std::string snapshot_desc = absl::StrFormat(
87 "Before write to 0x%X (%zu bytes)", offset, data.size());
88 // Creator is "system" for now, could be passed in context
89 version_mgr_->CreateSnapshot(snapshot_desc, "system");
90 }
91
92 // Perform write
93 std::memcpy(rom_->mutable_data() + offset, data.data(), data.size());
94
95 response->set_success(true);
96
97 return grpc::Status::OK;
98}
99
100grpc::Status RomServiceImpl::GetRomInfo(
101 grpc::ServerContext* context, const rom_svc::GetRomInfoRequest* request,
102 rom_svc::GetRomInfoResponse* response) {
103 if (!rom_ || !rom_->is_loaded()) {
104 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
105 "ROM not loaded");
106 }
107
108 response->set_title(rom_->title());
109 response->set_size(rom_->size());
110 // response->set_is_loaded(rom_->is_loaded()); // Not in proto
111 // response->set_filename(rom_->filename()); // Not in proto
112 // Proto has: title, size, checksum, is_expanded, version
113
114 return grpc::Status::OK;
115}
116
117grpc::Status RomServiceImpl::ReadOverworldMap(
118 grpc::ServerContext* context, const rom_svc::ReadOverworldMapRequest* request,
119 rom_svc::ReadOverworldMapResponse* response) {
120 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
121}
122
123grpc::Status RomServiceImpl::ReadDungeonRoom(
124 grpc::ServerContext* context, const rom_svc::ReadDungeonRoomRequest* request,
125 rom_svc::ReadDungeonRoomResponse* response) {
126 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
127}
128
129grpc::Status RomServiceImpl::ReadSprite(
130 grpc::ServerContext* context, const rom_svc::ReadSpriteRequest* request,
131 rom_svc::ReadSpriteResponse* response) {
132 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
133}
134
135grpc::Status RomServiceImpl::WriteOverworldTile(
136 grpc::ServerContext* context, const rom_svc::WriteOverworldTileRequest* request,
137 rom_svc::WriteOverworldTileResponse* response) {
138 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
139}
140
141grpc::Status RomServiceImpl::WriteDungeonTile(
142 grpc::ServerContext* context, const rom_svc::WriteDungeonTileRequest* request,
143 rom_svc::WriteDungeonTileResponse* response) {
144 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
145}
146
147grpc::Status RomServiceImpl::SubmitRomProposal(
148 grpc::ServerContext* context, const rom_svc::SubmitRomProposalRequest* request,
149 rom_svc::SubmitRomProposalResponse* response) {
150 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
151}
152
153grpc::Status RomServiceImpl::GetProposalStatus(
154 grpc::ServerContext* context, const rom_svc::GetProposalStatusRequest* request,
155 rom_svc::GetProposalStatusResponse* response) {
156 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
157}
158
159grpc::Status RomServiceImpl::CreateSnapshot(
160 grpc::ServerContext* context, const rom_svc::CreateSnapshotRequest* request,
161 rom_svc::CreateSnapshotResponse* response) {
162 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
163}
164
165grpc::Status RomServiceImpl::RestoreSnapshot(
166 grpc::ServerContext* context, const rom_svc::RestoreSnapshotRequest* request,
167 rom_svc::RestoreSnapshotResponse* response) {
168 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
169}
170
171grpc::Status RomServiceImpl::ListSnapshots(
172 grpc::ServerContext* context, const rom_svc::ListSnapshotsRequest* request,
173 rom_svc::ListSnapshotsResponse* response) {
174 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Not implemented");
175}
176
177} // namespace net
178
179} // namespace yaze
180
181#endif // YAZE_WITH_GRPC