5#include "absl/strings/str_format.h"
10namespace rom_svc = ::yaze::proto;
16RomServiceImpl::RomServiceImpl(
18 RomVersionManager* version_manager,
19 ProposalApprovalManager* approval_manager)
21 version_mgr_(version_manager),
22 approval_mgr_(approval_manager) {
25void RomServiceImpl::SetConfig(
const Config& config) {
29grpc::Status RomServiceImpl::ReadBytes(
30 grpc::ServerContext* context,
31 const rom_svc::ReadBytesRequest* request,
32 rom_svc::ReadBytesResponse* response) {
34 if (!rom_ || !rom_->is_loaded()) {
35 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
"ROM not loaded");
38 uint32_t address = request->address();
39 uint32_t length = request->length();
42 if (address + length > rom_->size()) {
44 grpc::StatusCode::OUT_OF_RANGE,
45 absl::StrFormat(
"Read beyond ROM: 0x%X+%d > %d",
46 address, length, rom_->size()));
50 const auto* data = rom_->data() + address;
51 response->set_data(data, length);
52 response->set_success(
true);
54 return grpc::Status::OK;
57grpc::Status RomServiceImpl::WriteBytes(
58 grpc::ServerContext* context,
59 const rom_svc::WriteBytesRequest* request,
60 rom_svc::WriteBytesResponse* response) {
62 if (!rom_ || !rom_->is_loaded()) {
63 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
"ROM not loaded");
66 uint32_t address = request->address();
67 const std::string& data = request->data();
70 if (address + data.size() > rom_->size()) {
72 grpc::StatusCode::OUT_OF_RANGE,
73 absl::StrFormat(
"Write beyond ROM: 0x%X+%zu > %d",
74 address, data.size(), rom_->size()));
78 if (config_.require_approval_for_writes && approval_mgr_) {
80 std::string proposal_id = absl::StrFormat(
81 "write_0x%X_%zu_bytes", address, data.size());
83 if (request->has_proposal_id()) {
84 proposal_id = request->proposal_id();
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;
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()));
108 std::memcpy(rom_->mutable_data() + address, data.data(), data.size());
110 response->set_success(
true);
111 response->set_message(
"Write successful");
113 return grpc::Status::OK;
116grpc::Status RomServiceImpl::GetRomInfo(
117 grpc::ServerContext* context,
118 const rom_svc::GetRomInfoRequest* request,
119 rom_svc::GetRomInfoResponse* response) {
121 if (!rom_ || !rom_->is_loaded()) {
122 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
"ROM not loaded");
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());
131 return grpc::Status::OK;
134grpc::Status RomServiceImpl::GetTileData(
135 grpc::ServerContext* context,
136 const rom_svc::GetTileDataRequest* request,
137 rom_svc::GetTileDataResponse* response) {
139 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
140 "GetTileData not yet implemented");
143grpc::Status RomServiceImpl::SetTileData(
144 grpc::ServerContext* context,
145 const rom_svc::SetTileDataRequest* request,
146 rom_svc::SetTileDataResponse* response) {
148 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
149 "SetTileData not yet implemented");
152grpc::Status RomServiceImpl::GetMapData(
153 grpc::ServerContext* context,
154 const rom_svc::GetMapDataRequest* request,
155 rom_svc::GetMapDataResponse* response) {
157 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
158 "GetMapData not yet implemented");
161grpc::Status RomServiceImpl::SetMapData(
162 grpc::ServerContext* context,
163 const rom_svc::SetMapDataRequest* request,
164 rom_svc::SetMapDataResponse* response) {
166 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
167 "SetMapData not yet implemented");
170grpc::Status RomServiceImpl::GetSpriteData(
171 grpc::ServerContext* context,
172 const rom_svc::GetSpriteDataRequest* request,
173 rom_svc::GetSpriteDataResponse* response) {
175 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
176 "GetSpriteData not yet implemented");
179grpc::Status RomServiceImpl::SetSpriteData(
180 grpc::ServerContext* context,
181 const rom_svc::SetSpriteDataRequest* request,
182 rom_svc::SetSpriteDataResponse* response) {
184 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
185 "SetSpriteData not yet implemented");
188grpc::Status RomServiceImpl::GetDialogue(
189 grpc::ServerContext* context,
190 const rom_svc::GetDialogueRequest* request,
191 rom_svc::GetDialogueResponse* response) {
193 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
194 "GetDialogue not yet implemented");
197grpc::Status RomServiceImpl::SetDialogue(
198 grpc::ServerContext* context,
199 const rom_svc::SetDialogueRequest* request,
200 rom_svc::SetDialogueResponse* response) {
202 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
203 "SetDialogue not yet implemented");
Main namespace for the application.