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"
6#include "app/rom.h"
8
9// Proto namespace alias for convenience
10namespace rom_svc = ::yaze::proto;
11
12namespace yaze {
13
14namespace net {
15
16RomServiceImpl::RomServiceImpl(
17 Rom* rom,
18 RomVersionManager* version_manager,
19 ProposalApprovalManager* approval_manager)
20 : rom_(rom),
21 version_mgr_(version_manager),
22 approval_mgr_(approval_manager) {
23}
24
25void RomServiceImpl::SetConfig(const Config& config) {
26 config_ = config;
27}
28
29grpc::Status RomServiceImpl::ReadBytes(
30 grpc::ServerContext* context,
31 const rom_svc::ReadBytesRequest* request,
32 rom_svc::ReadBytesResponse* response) {
33
34 if (!rom_ || !rom_->is_loaded()) {
35 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "ROM not loaded");
36 }
37
38 uint32_t address = request->address();
39 uint32_t length = request->length();
40
41 // Validate range
42 if (address + length > rom_->size()) {
43 return grpc::Status(
44 grpc::StatusCode::OUT_OF_RANGE,
45 absl::StrFormat("Read beyond ROM: 0x%X+%d > %d",
46 address, length, rom_->size()));
47 }
48
49 // Read data
50 const auto* data = rom_->data() + address;
51 response->set_data(data, length);
52 response->set_success(true);
53
54 return grpc::Status::OK;
55}
56
57grpc::Status RomServiceImpl::WriteBytes(
58 grpc::ServerContext* context,
59 const rom_svc::WriteBytesRequest* request,
60 rom_svc::WriteBytesResponse* response) {
61
62 if (!rom_ || !rom_->is_loaded()) {
63 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "ROM not loaded");
64 }
65
66 uint32_t address = request->address();
67 const std::string& data = request->data();
68
69 // Validate range
70 if (address + data.size() > rom_->size()) {
71 return grpc::Status(
72 grpc::StatusCode::OUT_OF_RANGE,
73 absl::StrFormat("Write beyond ROM: 0x%X+%zu > %d",
74 address, data.size(), rom_->size()));
75 }
76
77 // Check if approval required
78 if (config_.require_approval_for_writes && approval_mgr_) {
79 // Create a proposal for this write
80 std::string proposal_id = absl::StrFormat(
81 "write_0x%X_%zu_bytes", address, data.size());
82
83 if (request->has_proposal_id()) {
84 proposal_id = request->proposal_id();
85 }
86
87 // Check if proposal is approved
88 auto status = approval_mgr_->GetProposalStatus(proposal_id);
89 if (status != ProposalApprovalManager::ApprovalStatus::kApproved) {
90 response->set_success(false);
91 response->set_message("Write requires approval");
92 response->set_proposal_id(proposal_id);
93 return grpc::Status::OK; // Not an error, just needs approval
94 }
95 }
96
97 // Create snapshot before write
98 if (version_mgr_) {
99 std::string snapshot_desc = absl::StrFormat(
100 "Before write to 0x%X (%zu bytes)", address, data.size());
101 auto snapshot_result = version_mgr_->CreateSnapshot(snapshot_desc);
102 if (snapshot_result.ok()) {
103 response->set_snapshot_id(std::to_string(snapshot_result.value()));
104 }
105 }
106
107 // Perform write
108 std::memcpy(rom_->mutable_data() + address, data.data(), data.size());
109
110 response->set_success(true);
111 response->set_message("Write successful");
112
113 return grpc::Status::OK;
114}
115
116grpc::Status RomServiceImpl::GetRomInfo(
117 grpc::ServerContext* context,
118 const rom_svc::GetRomInfoRequest* request,
119 rom_svc::GetRomInfoResponse* response) {
120
121 if (!rom_ || !rom_->is_loaded()) {
122 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "ROM not loaded");
123 }
124
125 auto* info = response->mutable_info();
126 info->set_title(rom_->title());
127 info->set_size(rom_->size());
128 info->set_is_loaded(rom_->is_loaded());
129 info->set_filename(rom_->filename());
130
131 return grpc::Status::OK;
132}
133
134grpc::Status RomServiceImpl::GetTileData(
135 grpc::ServerContext* context,
136 const rom_svc::GetTileDataRequest* request,
137 rom_svc::GetTileDataResponse* response) {
138
139 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
140 "GetTileData not yet implemented");
141}
142
143grpc::Status RomServiceImpl::SetTileData(
144 grpc::ServerContext* context,
145 const rom_svc::SetTileDataRequest* request,
146 rom_svc::SetTileDataResponse* response) {
147
148 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
149 "SetTileData not yet implemented");
150}
151
152grpc::Status RomServiceImpl::GetMapData(
153 grpc::ServerContext* context,
154 const rom_svc::GetMapDataRequest* request,
155 rom_svc::GetMapDataResponse* response) {
156
157 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
158 "GetMapData not yet implemented");
159}
160
161grpc::Status RomServiceImpl::SetMapData(
162 grpc::ServerContext* context,
163 const rom_svc::SetMapDataRequest* request,
164 rom_svc::SetMapDataResponse* response) {
165
166 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
167 "SetMapData not yet implemented");
168}
169
170grpc::Status RomServiceImpl::GetSpriteData(
171 grpc::ServerContext* context,
172 const rom_svc::GetSpriteDataRequest* request,
173 rom_svc::GetSpriteDataResponse* response) {
174
175 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
176 "GetSpriteData not yet implemented");
177}
178
179grpc::Status RomServiceImpl::SetSpriteData(
180 grpc::ServerContext* context,
181 const rom_svc::SetSpriteDataRequest* request,
182 rom_svc::SetSpriteDataResponse* response) {
183
184 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
185 "SetSpriteData not yet implemented");
186}
187
188grpc::Status RomServiceImpl::GetDialogue(
189 grpc::ServerContext* context,
190 const rom_svc::GetDialogueRequest* request,
191 rom_svc::GetDialogueResponse* response) {
192
193 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
194 "GetDialogue not yet implemented");
195}
196
197grpc::Status RomServiceImpl::SetDialogue(
198 grpc::ServerContext* context,
199 const rom_svc::SetDialogueRequest* request,
200 rom_svc::SetDialogueResponse* response) {
201
202 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
203 "SetDialogue not yet implemented");
204}
205
206} // namespace net
207
208} // namespace yaze
209
210#endif // YAZE_WITH_GRPC
Main namespace for the application.
Definition controller.cc:20