5#include "absl/strings/str_format.h"
10namespace rom_svc = ::yaze::proto;
16RomServiceImpl::RomServiceImpl(Rom* rom, RomVersionManager* version_manager,
17 ProposalApprovalManager* approval_manager)
19 version_mgr_(version_manager),
20 approval_mgr_(approval_manager) {}
22void RomServiceImpl::SetConfig(
const Config& config) {
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,
34 uint32_t offset = request->offset();
35 uint32_t length = request->length();
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()));
45 const auto* data = rom_->data() + offset;
46 response->set_data(data, length);
48 return grpc::Status::OK;
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,
59 uint32_t offset = request->offset();
60 const std::string& data = request->data();
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()));
70 if (config_.require_approval_for_writes && approval_mgr_) {
72 std::string proposal_id =
73 absl::StrFormat(
"write_0x%X_%zu_bytes", offset, data.size());
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;
86 std::string snapshot_desc = absl::StrFormat(
87 "Before write to 0x%X (%zu bytes)", offset, data.size());
89 version_mgr_->CreateSnapshot(snapshot_desc,
"system");
93 std::memcpy(rom_->mutable_data() + offset, data.data(), data.size());
95 response->set_success(
true);
97 return grpc::Status::OK;
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,
108 response->set_title(rom_->title());
109 response->set_size(rom_->size());
114 return grpc::Status::OK;
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");