refactor: Update ROM service implementation and CMake configurations
- Adjusted paths in CMake files to reference the correct location of `rom_service.proto`. - Refactored `RomServiceImpl` to use a namespace alias for improved readability and maintainability. - Updated method parameters in `RomServiceImpl` to utilize the new namespace alias for consistency. - Added a new `rom_service.proto` file to define the ROM manipulation service, enabling remote operations for reading and writing ROM data. - Enhanced the `RecentFilesManager` to utilize a utility function for retrieving the configuration directory, improving code clarity. - Included necessary updates in CMake configurations to integrate the new proto file and ensure proper build setup.
This commit is contained in:
@@ -85,7 +85,7 @@ if(YAZE_WITH_GRPC)
|
||||
target_add_protobuf(yaze_core_lib
|
||||
${PROJECT_SOURCE_DIR}/src/app/core/proto/imgui_test_harness.proto)
|
||||
target_add_protobuf(yaze_core_lib
|
||||
${PROJECT_SOURCE_DIR}/protos/rom_service.proto)
|
||||
${PROJECT_SOURCE_DIR}/src/protos/rom_service.proto)
|
||||
|
||||
# Add test harness implementation
|
||||
target_sources(yaze_core_lib PRIVATE
|
||||
|
||||
@@ -1051,7 +1051,7 @@ absl::Status YazeProject::SaveToJsonFormat() {
|
||||
|
||||
// RecentFilesManager implementation
|
||||
std::string RecentFilesManager::GetFilePath() const {
|
||||
return GetConfigDirectory() + "/" + kRecentFilesFilename;
|
||||
return util::GetConfigDirectory() + "/" + kRecentFilesFilename;
|
||||
}
|
||||
|
||||
void RecentFilesManager::Save() {
|
||||
|
||||
@@ -67,7 +67,7 @@ endif()
|
||||
|
||||
# Add gRPC support for ROM service
|
||||
if(YAZE_WITH_GRPC)
|
||||
target_add_protobuf(yaze_net ${PROJECT_SOURCE_DIR}/protos/rom_service.proto)
|
||||
target_add_protobuf(yaze_net ${PROJECT_SOURCE_DIR}/src/protos/rom_service.proto)
|
||||
|
||||
target_link_libraries(yaze_net PUBLIC
|
||||
grpc++
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
#include "app/rom.h"
|
||||
#include "app/net/rom_version_manager.h"
|
||||
|
||||
// Proto namespace alias for convenience
|
||||
namespace rom_svc = ::yaze::proto;
|
||||
|
||||
namespace yaze {
|
||||
namespace app {
|
||||
namespace net {
|
||||
@@ -15,8 +18,8 @@ RomServiceImpl::RomServiceImpl(
|
||||
RomVersionManager* version_manager,
|
||||
ProposalApprovalManager* approval_manager)
|
||||
: rom_(rom),
|
||||
version_manager_(version_manager),
|
||||
approval_manager_(approval_manager) {
|
||||
version_mgr_(version_manager),
|
||||
approval_mgr_(approval_manager) {
|
||||
}
|
||||
|
||||
void RomServiceImpl::SetConfig(const Config& config) {
|
||||
@@ -25,8 +28,8 @@ void RomServiceImpl::SetConfig(const Config& config) {
|
||||
|
||||
grpc::Status RomServiceImpl::ReadBytes(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::ReadBytesRequest* request,
|
||||
rom_service::ReadBytesResponse* response) {
|
||||
const rom_svc::ReadBytesRequest* request,
|
||||
rom_svc::ReadBytesResponse* response) {
|
||||
|
||||
if (!rom_ || !rom_->is_loaded()) {
|
||||
return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "ROM not loaded");
|
||||
@@ -53,8 +56,8 @@ grpc::Status RomServiceImpl::ReadBytes(
|
||||
|
||||
grpc::Status RomServiceImpl::WriteBytes(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::WriteBytesRequest* request,
|
||||
rom_service::WriteBytesResponse* response) {
|
||||
const rom_svc::WriteBytesRequest* request,
|
||||
rom_svc::WriteBytesResponse* response) {
|
||||
|
||||
if (!rom_ || !rom_->is_loaded()) {
|
||||
return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "ROM not loaded");
|
||||
@@ -72,7 +75,7 @@ grpc::Status RomServiceImpl::WriteBytes(
|
||||
}
|
||||
|
||||
// Check if approval required
|
||||
if (config_.require_approval_for_writes && approval_manager_) {
|
||||
if (config_.require_approval_for_writes && approval_mgr_) {
|
||||
// Create a proposal for this write
|
||||
std::string proposal_id = absl::StrFormat(
|
||||
"write_0x%X_%zu_bytes", address, data.size());
|
||||
@@ -82,7 +85,7 @@ grpc::Status RomServiceImpl::WriteBytes(
|
||||
}
|
||||
|
||||
// Check if proposal is approved
|
||||
auto status = approval_manager_->GetProposalStatus(proposal_id);
|
||||
auto status = approval_mgr_->GetProposalStatus(proposal_id);
|
||||
if (status != ProposalApprovalManager::ApprovalStatus::kApproved) {
|
||||
response->set_success(false);
|
||||
response->set_message("Write requires approval");
|
||||
@@ -92,10 +95,10 @@ grpc::Status RomServiceImpl::WriteBytes(
|
||||
}
|
||||
|
||||
// Create snapshot before write
|
||||
if (version_manager_) {
|
||||
if (version_mgr_) {
|
||||
std::string snapshot_desc = absl::StrFormat(
|
||||
"Before write to 0x%X (%zu bytes)", address, data.size());
|
||||
auto snapshot_result = version_manager_->CreateSnapshot(snapshot_desc);
|
||||
auto snapshot_result = version_mgr_->CreateSnapshot(snapshot_desc);
|
||||
if (snapshot_result.ok()) {
|
||||
response->set_snapshot_id(std::to_string(snapshot_result.value()));
|
||||
}
|
||||
@@ -112,8 +115,8 @@ grpc::Status RomServiceImpl::WriteBytes(
|
||||
|
||||
grpc::Status RomServiceImpl::GetRomInfo(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::GetRomInfoRequest* request,
|
||||
rom_service::GetRomInfoResponse* response) {
|
||||
const rom_svc::GetRomInfoRequest* request,
|
||||
rom_svc::GetRomInfoResponse* response) {
|
||||
|
||||
if (!rom_ || !rom_->is_loaded()) {
|
||||
return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "ROM not loaded");
|
||||
@@ -130,8 +133,8 @@ grpc::Status RomServiceImpl::GetRomInfo(
|
||||
|
||||
grpc::Status RomServiceImpl::GetTileData(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::GetTileDataRequest* request,
|
||||
rom_service::GetTileDataResponse* response) {
|
||||
const rom_svc::GetTileDataRequest* request,
|
||||
rom_svc::GetTileDataResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"GetTileData not yet implemented");
|
||||
@@ -139,8 +142,8 @@ grpc::Status RomServiceImpl::GetTileData(
|
||||
|
||||
grpc::Status RomServiceImpl::SetTileData(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::SetTileDataRequest* request,
|
||||
rom_service::SetTileDataResponse* response) {
|
||||
const rom_svc::SetTileDataRequest* request,
|
||||
rom_svc::SetTileDataResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"SetTileData not yet implemented");
|
||||
@@ -148,8 +151,8 @@ grpc::Status RomServiceImpl::SetTileData(
|
||||
|
||||
grpc::Status RomServiceImpl::GetMapData(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::GetMapDataRequest* request,
|
||||
rom_service::GetMapDataResponse* response) {
|
||||
const rom_svc::GetMapDataRequest* request,
|
||||
rom_svc::GetMapDataResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"GetMapData not yet implemented");
|
||||
@@ -157,8 +160,8 @@ grpc::Status RomServiceImpl::GetMapData(
|
||||
|
||||
grpc::Status RomServiceImpl::SetMapData(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::SetMapDataRequest* request,
|
||||
rom_service::SetMapDataResponse* response) {
|
||||
const rom_svc::SetMapDataRequest* request,
|
||||
rom_svc::SetMapDataResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"SetMapData not yet implemented");
|
||||
@@ -166,8 +169,8 @@ grpc::Status RomServiceImpl::SetMapData(
|
||||
|
||||
grpc::Status RomServiceImpl::GetSpriteData(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::GetSpriteDataRequest* request,
|
||||
rom_service::GetSpriteDataResponse* response) {
|
||||
const rom_svc::GetSpriteDataRequest* request,
|
||||
rom_svc::GetSpriteDataResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"GetSpriteData not yet implemented");
|
||||
@@ -175,8 +178,8 @@ grpc::Status RomServiceImpl::GetSpriteData(
|
||||
|
||||
grpc::Status RomServiceImpl::SetSpriteData(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::SetSpriteDataRequest* request,
|
||||
rom_service::SetSpriteDataResponse* response) {
|
||||
const rom_svc::SetSpriteDataRequest* request,
|
||||
rom_svc::SetSpriteDataResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"SetSpriteData not yet implemented");
|
||||
@@ -184,8 +187,8 @@ grpc::Status RomServiceImpl::SetSpriteData(
|
||||
|
||||
grpc::Status RomServiceImpl::GetDialogue(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::GetDialogueRequest* request,
|
||||
rom_service::GetDialogueResponse* response) {
|
||||
const rom_svc::GetDialogueRequest* request,
|
||||
rom_svc::GetDialogueResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"GetDialogue not yet implemented");
|
||||
@@ -193,8 +196,8 @@ grpc::Status RomServiceImpl::GetDialogue(
|
||||
|
||||
grpc::Status RomServiceImpl::SetDialogue(
|
||||
grpc::ServerContext* context,
|
||||
const rom_service::SetDialogueRequest* request,
|
||||
rom_service::SetDialogueResponse* response) {
|
||||
const rom_svc::SetDialogueRequest* request,
|
||||
rom_svc::SetDialogueResponse* response) {
|
||||
|
||||
return grpc::Status(grpc::StatusCode::UNIMPLEMENTED,
|
||||
"SetDialogue not yet implemented");
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#ifdef YAZE_WITH_GRPC
|
||||
#include <grpcpp/grpcpp.h>
|
||||
#include "protos/rom_service.grpc.pb.h"
|
||||
// Note: Proto files will be generated to build directory
|
||||
#endif
|
||||
|
||||
#include "app/rom.h"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "absl/strings/str_cat.h"
|
||||
#include "absl/strings/str_format.h"
|
||||
#include "absl/strings/str_join.h"
|
||||
#include "absl/strings/str_split.h"
|
||||
#include "cli/service/agent/todo_manager.h"
|
||||
|
||||
|
||||
223
src/protos/rom_service.proto
Normal file
223
src/protos/rom_service.proto
Normal file
@@ -0,0 +1,223 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package yaze.proto;
|
||||
|
||||
// ROM Manipulation Service
|
||||
// Enables remote clients to read, write, and inspect ROM data
|
||||
service RomService {
|
||||
// Read bytes from ROM
|
||||
rpc ReadBytes(ReadBytesRequest) returns (ReadBytesResponse);
|
||||
|
||||
// Write bytes to ROM
|
||||
rpc WriteBytes(WriteBytesRequest) returns (WriteBytesResponse);
|
||||
|
||||
// Get ROM information
|
||||
rpc GetRomInfo(GetRomInfoRequest) returns (GetRomInfoResponse);
|
||||
|
||||
// Read specific ROM structures
|
||||
rpc ReadOverworldMap(ReadOverworldMapRequest) returns (ReadOverworldMapResponse);
|
||||
rpc ReadDungeonRoom(ReadDungeonRoomRequest) returns (ReadDungeonRoomResponse);
|
||||
rpc ReadSprite(ReadSpriteRequest) returns (ReadSpriteResponse);
|
||||
|
||||
// Write specific ROM structures
|
||||
rpc WriteOverworldTile(WriteOverworldTileRequest) returns (WriteOverworldTileResponse);
|
||||
rpc WriteDungeonTile(WriteDungeonTileRequest) returns (WriteDungeonTileResponse);
|
||||
|
||||
// Proposal-based changes (collaborative mode)
|
||||
rpc SubmitRomProposal(SubmitRomProposalRequest) returns (SubmitRomProposalResponse);
|
||||
rpc GetProposalStatus(GetProposalStatusRequest) returns (GetProposalStatusResponse);
|
||||
|
||||
// Version management
|
||||
rpc CreateSnapshot(CreateSnapshotRequest) returns (CreateSnapshotResponse);
|
||||
rpc RestoreSnapshot(RestoreSnapshotRequest) returns (RestoreSnapshotResponse);
|
||||
rpc ListSnapshots(ListSnapshotsRequest) returns (ListSnapshotsResponse);
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Basic ROM Operations
|
||||
// ============================================================================
|
||||
|
||||
message ReadBytesRequest {
|
||||
uint32 offset = 1;
|
||||
uint32 length = 2;
|
||||
}
|
||||
|
||||
message ReadBytesResponse {
|
||||
bytes data = 1;
|
||||
string error = 2;
|
||||
}
|
||||
|
||||
message WriteBytesRequest {
|
||||
uint32 offset = 1;
|
||||
bytes data = 2;
|
||||
bool require_approval = 3; // Submit as proposal if true
|
||||
}
|
||||
|
||||
message WriteBytesResponse {
|
||||
bool success = 1;
|
||||
string error = 2;
|
||||
string proposal_id = 3; // Set if submitted as proposal
|
||||
}
|
||||
|
||||
message GetRomInfoRequest {
|
||||
// Empty for now
|
||||
}
|
||||
|
||||
message GetRomInfoResponse {
|
||||
string title = 1;
|
||||
uint32 size = 2;
|
||||
string checksum = 3;
|
||||
bool is_expanded = 4;
|
||||
string version = 5;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Overworld Operations
|
||||
// ============================================================================
|
||||
|
||||
message ReadOverworldMapRequest {
|
||||
uint32 map_id = 1; // 0-159
|
||||
}
|
||||
|
||||
message ReadOverworldMapResponse {
|
||||
uint32 map_id = 1;
|
||||
repeated uint32 tile16_data = 2; // 512 tiles (32x16)
|
||||
bytes raw_data = 3;
|
||||
string error = 4;
|
||||
}
|
||||
|
||||
message WriteOverworldTileRequest {
|
||||
uint32 map_id = 1;
|
||||
uint32 x = 2;
|
||||
uint32 y = 3;
|
||||
uint32 tile16_id = 4;
|
||||
bool require_approval = 5;
|
||||
string description = 6; // For proposal description
|
||||
}
|
||||
|
||||
message WriteOverworldTileResponse {
|
||||
bool success = 1;
|
||||
string error = 2;
|
||||
string proposal_id = 3;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Dungeon Operations
|
||||
// ============================================================================
|
||||
|
||||
message ReadDungeonRoomRequest {
|
||||
uint32 room_id = 1; // 0-295
|
||||
}
|
||||
|
||||
message ReadDungeonRoomResponse {
|
||||
uint32 room_id = 1;
|
||||
repeated uint32 tile16_data = 2;
|
||||
bytes raw_data = 3;
|
||||
string error = 4;
|
||||
}
|
||||
|
||||
message WriteDungeonTileRequest {
|
||||
uint32 room_id = 1;
|
||||
uint32 x = 2;
|
||||
uint32 y = 3;
|
||||
uint32 tile16_id = 4;
|
||||
bool require_approval = 5;
|
||||
string description = 6;
|
||||
}
|
||||
|
||||
message WriteDungeonTileResponse {
|
||||
bool success = 1;
|
||||
string error = 2;
|
||||
string proposal_id = 3;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Sprite Operations
|
||||
// ============================================================================
|
||||
|
||||
message ReadSpriteRequest {
|
||||
uint32 sprite_id = 1;
|
||||
}
|
||||
|
||||
message ReadSpriteResponse {
|
||||
uint32 sprite_id = 1;
|
||||
bytes sprite_data = 2;
|
||||
string error = 3;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Proposal System
|
||||
// ============================================================================
|
||||
|
||||
message SubmitRomProposalRequest {
|
||||
string description = 1;
|
||||
string username = 2;
|
||||
|
||||
oneof proposal_type {
|
||||
WriteBytesRequest write_bytes = 3;
|
||||
WriteOverworldTileRequest overworld_tile = 4;
|
||||
WriteDungeonTileRequest dungeon_tile = 5;
|
||||
}
|
||||
}
|
||||
|
||||
message SubmitRomProposalResponse {
|
||||
bool success = 1;
|
||||
string proposal_id = 2;
|
||||
string error = 3;
|
||||
}
|
||||
|
||||
message GetProposalStatusRequest {
|
||||
string proposal_id = 1;
|
||||
}
|
||||
|
||||
message GetProposalStatusResponse {
|
||||
string proposal_id = 1;
|
||||
string status = 2; // pending, approved, rejected, applied
|
||||
repeated string voters = 3;
|
||||
int32 approval_count = 4;
|
||||
int32 rejection_count = 5;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Version Management
|
||||
// ============================================================================
|
||||
|
||||
message CreateSnapshotRequest {
|
||||
string description = 1;
|
||||
string username = 2;
|
||||
bool is_checkpoint = 3;
|
||||
}
|
||||
|
||||
message CreateSnapshotResponse {
|
||||
bool success = 1;
|
||||
string snapshot_id = 2;
|
||||
string error = 3;
|
||||
}
|
||||
|
||||
message RestoreSnapshotRequest {
|
||||
string snapshot_id = 1;
|
||||
}
|
||||
|
||||
message RestoreSnapshotResponse {
|
||||
bool success = 1;
|
||||
string error = 2;
|
||||
}
|
||||
|
||||
message ListSnapshotsRequest {
|
||||
uint32 max_results = 1; // 0 = all
|
||||
}
|
||||
|
||||
message SnapshotInfo {
|
||||
string snapshot_id = 1;
|
||||
string description = 2;
|
||||
string username = 3;
|
||||
int64 timestamp = 4;
|
||||
bool is_checkpoint = 5;
|
||||
bool is_safe_point = 6;
|
||||
uint64 size_bytes = 7;
|
||||
}
|
||||
|
||||
message ListSnapshotsResponse {
|
||||
repeated SnapshotInfo snapshots = 1;
|
||||
string error = 2;
|
||||
}
|
||||
Reference in New Issue
Block a user