yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
wasm_patch_export.h
Go to the documentation of this file.
1#ifndef YAZE_APP_PLATFORM_WASM_WASM_PATCH_EXPORT_H_
2#define YAZE_APP_PLATFORM_WASM_WASM_PATCH_EXPORT_H_
3
4#ifdef __EMSCRIPTEN__
5
6#include <cstdint>
7#include <string>
8#include <utility>
9#include <vector>
10
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
13
14namespace yaze {
15namespace platform {
16
21struct PatchInfo {
22 size_t changed_bytes; // Total number of changed bytes
23 size_t num_regions; // Number of distinct changed regions
24 std::vector<std::pair<size_t, size_t>> changed_regions; // List of (offset, length) pairs
25};
26
35class WasmPatchExport {
36 public:
50 static absl::Status ExportBPS(const std::vector<uint8_t>& original,
51 const std::vector<uint8_t>& modified,
52 const std::string& filename);
53
67 static absl::Status ExportIPS(const std::vector<uint8_t>& original,
68 const std::vector<uint8_t>& modified,
69 const std::string& filename);
70
81 static PatchInfo GetPatchPreview(const std::vector<uint8_t>& original,
82 const std::vector<uint8_t>& modified);
83
84 private:
85 // CRC32 calculation
86 static uint32_t CalculateCRC32(const std::vector<uint8_t>& data);
87 static uint32_t CalculateCRC32(const uint8_t* data, size_t size);
88
89 // BPS format helpers
90 static void WriteVariableLength(std::vector<uint8_t>& output, uint64_t value);
91 static std::vector<uint8_t> GenerateBPSPatch(const std::vector<uint8_t>& source,
92 const std::vector<uint8_t>& target);
93
94 // IPS format helpers
95 static void WriteIPS24BitOffset(std::vector<uint8_t>& output, uint32_t offset);
96 static void WriteIPS16BitSize(std::vector<uint8_t>& output, uint16_t size);
97 static std::vector<uint8_t> GenerateIPSPatch(const std::vector<uint8_t>& source,
98 const std::vector<uint8_t>& target);
99
100 // Common helpers
101 static std::vector<std::pair<size_t, size_t>> FindChangedRegions(
102 const std::vector<uint8_t>& original,
103 const std::vector<uint8_t>& modified);
104
105 // Browser download functionality (implemented via EM_JS)
106 static absl::Status DownloadPatchFile(const std::string& filename,
107 const std::vector<uint8_t>& data,
108 const std::string& mime_type);
109};
110
111} // namespace platform
112} // namespace yaze
113
114#else // !__EMSCRIPTEN__
115
116// Stub implementation for non-WASM builds
117namespace yaze {
118namespace platform {
119
120struct PatchInfo {
121 size_t changed_bytes = 0;
122 size_t num_regions = 0;
123 std::vector<std::pair<size_t, size_t>> changed_regions;
124};
125
127 public:
128 static absl::Status ExportBPS(const std::vector<uint8_t>&,
129 const std::vector<uint8_t>&,
130 const std::string&) {
131 return absl::UnimplementedError("Patch export is only available in WASM builds");
132 }
133
134 static absl::Status ExportIPS(const std::vector<uint8_t>&,
135 const std::vector<uint8_t>&,
136 const std::string&) {
137 return absl::UnimplementedError("Patch export is only available in WASM builds");
138 }
139
140 static PatchInfo GetPatchPreview(const std::vector<uint8_t>&,
141 const std::vector<uint8_t>&) {
142 return PatchInfo{};
143 }
144};
145
146} // namespace platform
147} // namespace yaze
148
149#endif // __EMSCRIPTEN__
150
151#endif // YAZE_APP_PLATFORM_WASM_WASM_PATCH_EXPORT_H_
static absl::Status ExportIPS(const std::vector< uint8_t > &, const std::vector< uint8_t > &, const std::string &)
static PatchInfo GetPatchPreview(const std::vector< uint8_t > &, const std::vector< uint8_t > &)
static absl::Status ExportBPS(const std::vector< uint8_t > &, const std::vector< uint8_t > &, const std::string &)
uint32_t CalculateCRC32(const uint8_t *data, size_t size)
std::vector< std::pair< size_t, size_t > > changed_regions