add set-save-files
This commit is contained in:
+20
-20
@@ -45,7 +45,7 @@ static void flush_and_free_bufferevent(struct bufferevent* bev) {
|
|||||||
ProxyServer::ProxyServer(
|
ProxyServer::ProxyServer(
|
||||||
shared_ptr<struct event_base> base,
|
shared_ptr<struct event_base> base,
|
||||||
shared_ptr<ServerState> state)
|
shared_ptr<ServerState> state)
|
||||||
: save_quests(false),
|
: save_files(false),
|
||||||
base(base),
|
base(base),
|
||||||
state(state) { }
|
state(state) { }
|
||||||
|
|
||||||
@@ -333,7 +333,7 @@ void ProxyServer::LinkedSession::resume(
|
|||||||
this->server_input_crypt.reset();
|
this->server_input_crypt.reset();
|
||||||
this->server_output_crypt.reset();
|
this->server_output_crypt.reset();
|
||||||
|
|
||||||
this->saving_quest_files.clear();
|
this->saving_files.clear();
|
||||||
|
|
||||||
// Connect to the remote server. The command handlers will do the login steps
|
// Connect to the remote server. The command handlers will do the login steps
|
||||||
// and set up forwarding
|
// and set up forwarding
|
||||||
@@ -368,7 +368,7 @@ void ProxyServer::LinkedSession::resume(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
ProxyServer::LinkedSession::SavingQuestFile::SavingQuestFile(
|
ProxyServer::LinkedSession::SavingFile::SavingFile(
|
||||||
const std::string& basename,
|
const std::string& basename,
|
||||||
const std::string& output_filename,
|
const std::string& output_filename,
|
||||||
uint32_t remaining_bytes)
|
uint32_t remaining_bytes)
|
||||||
@@ -773,7 +773,7 @@ void ProxyServer::LinkedSession::on_server_input() {
|
|||||||
|
|
||||||
case 0x44:
|
case 0x44:
|
||||||
case 0xA6: {
|
case 0xA6: {
|
||||||
if (!this->server->save_quests) {
|
if (!this->server->save_files) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -804,16 +804,16 @@ void ProxyServer::LinkedSession::on_server_input() {
|
|||||||
output_filename[0] = '_';
|
output_filename[0] = '_';
|
||||||
}
|
}
|
||||||
|
|
||||||
SavingQuestFile sqf(cmd->filename, output_filename, cmd->file_size);
|
SavingFile sf(cmd->filename, output_filename, cmd->file_size);
|
||||||
this->saving_quest_files.emplace(cmd->filename, move(sqf));
|
this->saving_files.emplace(cmd->filename, move(sf));
|
||||||
log(INFO, "[ProxyServer/%08" PRIX32 "] Opened quest file %s",
|
log(INFO, "[ProxyServer/%08" PRIX32 "] Opened file %s",
|
||||||
this->license->serial_number, output_filename.c_str());
|
this->license->serial_number, output_filename.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0x13:
|
case 0x13:
|
||||||
case 0xA7: {
|
case 0xA7: {
|
||||||
if (!this->server->save_quests) {
|
if (!this->server->save_files) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -829,11 +829,11 @@ void ProxyServer::LinkedSession::on_server_input() {
|
|||||||
}
|
}
|
||||||
const auto* cmd = reinterpret_cast<const WriteFileCommand*>(data.data());
|
const auto* cmd = reinterpret_cast<const WriteFileCommand*>(data.data());
|
||||||
|
|
||||||
SavingQuestFile* sqf = nullptr;
|
SavingFile* sf = nullptr;
|
||||||
try {
|
try {
|
||||||
sqf = &this->saving_quest_files.at(cmd->filename);
|
sf = &this->saving_files.at(cmd->filename);
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
log(WARNING, "[ProxyServer/%08" PRIX32 "] Can\'t find saving quest file %s",
|
log(WARNING, "[ProxyServer/%08" PRIX32 "] Received data for non-open file %s",
|
||||||
this->license->serial_number, cmd->filename);
|
this->license->serial_number, cmd->filename);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -847,26 +847,26 @@ void ProxyServer::LinkedSession::on_server_input() {
|
|||||||
|
|
||||||
log(INFO, "[ProxyServer/%08" PRIX32 "] Writing %zu bytes to %s",
|
log(INFO, "[ProxyServer/%08" PRIX32 "] Writing %zu bytes to %s",
|
||||||
this->license->serial_number, bytes_to_write,
|
this->license->serial_number, bytes_to_write,
|
||||||
sqf->output_filename.c_str());
|
sf->output_filename.c_str());
|
||||||
fwritex(sqf->f.get(), cmd->data, bytes_to_write);
|
fwritex(sf->f.get(), cmd->data, bytes_to_write);
|
||||||
if (bytes_to_write > sqf->remaining_bytes) {
|
if (bytes_to_write > sf->remaining_bytes) {
|
||||||
log(WARNING, "[ProxyServer/%08" PRIX32 "] Chunk size extends beyond original file size; file may be truncated",
|
log(WARNING, "[ProxyServer/%08" PRIX32 "] Chunk size extends beyond original file size; file may be truncated",
|
||||||
this->license->serial_number);
|
this->license->serial_number);
|
||||||
sqf->remaining_bytes = 0;
|
sf->remaining_bytes = 0;
|
||||||
} else {
|
} else {
|
||||||
sqf->remaining_bytes -= bytes_to_write;
|
sf->remaining_bytes -= bytes_to_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sqf->remaining_bytes == 0) {
|
if (sf->remaining_bytes == 0) {
|
||||||
log(INFO, "[ProxyServer/%08" PRIX32 "] File %s is complete",
|
log(INFO, "[ProxyServer/%08" PRIX32 "] File %s is complete",
|
||||||
this->license->serial_number, sqf->output_filename.c_str());
|
this->license->serial_number, sf->output_filename.c_str());
|
||||||
this->saving_quest_files.erase(cmd->filename);
|
this->saving_files.erase(cmd->filename);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0xB8: {
|
case 0xB8: {
|
||||||
if (!this->server->save_quests) {
|
if (!this->server->save_files) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (data.size() < 4) {
|
if (data.size() < 4) {
|
||||||
|
|||||||
+4
-4
@@ -62,18 +62,18 @@ public:
|
|||||||
std::shared_ptr<PSOEncryption> server_input_crypt;
|
std::shared_ptr<PSOEncryption> server_input_crypt;
|
||||||
std::shared_ptr<PSOEncryption> server_output_crypt;
|
std::shared_ptr<PSOEncryption> server_output_crypt;
|
||||||
|
|
||||||
struct SavingQuestFile {
|
struct SavingFile {
|
||||||
std::string basename;
|
std::string basename;
|
||||||
std::string output_filename;
|
std::string output_filename;
|
||||||
uint32_t remaining_bytes;
|
uint32_t remaining_bytes;
|
||||||
std::unique_ptr<FILE, std::function<void(FILE*)>> f;
|
std::unique_ptr<FILE, std::function<void(FILE*)>> f;
|
||||||
|
|
||||||
SavingQuestFile(
|
SavingFile(
|
||||||
const std::string& basename,
|
const std::string& basename,
|
||||||
const std::string& output_filename,
|
const std::string& output_filename,
|
||||||
uint32_t remaining_bytes);
|
uint32_t remaining_bytes);
|
||||||
};
|
};
|
||||||
std::unordered_map<std::string, SavingQuestFile> saving_quest_files;
|
std::unordered_map<std::string, SavingFile> saving_files;
|
||||||
|
|
||||||
LinkedSession(
|
LinkedSession(
|
||||||
ProxyServer* server,
|
ProxyServer* server,
|
||||||
@@ -112,7 +112,7 @@ public:
|
|||||||
std::shared_ptr<LinkedSession> get_session();
|
std::shared_ptr<LinkedSession> get_session();
|
||||||
void delete_session(uint32_t serial_number);
|
void delete_session(uint32_t serial_number);
|
||||||
|
|
||||||
bool save_quests;
|
bool save_files;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct ListeningSocket {
|
struct ListeningSocket {
|
||||||
|
|||||||
+7
-11
@@ -97,8 +97,10 @@ Proxy commands (these will only work when exactly one client is connected):\n\
|
|||||||
Send a lobby event update to yourself.\n\
|
Send a lobby event update to yourself.\n\
|
||||||
warp <area-id>\n\
|
warp <area-id>\n\
|
||||||
Send yourself to a specific area.\n\
|
Send yourself to a specific area.\n\
|
||||||
ship\n\
|
set-save-files <on|off>\n\
|
||||||
Request the ship select menu from the server.\n\
|
Enable or disable saving of game files. When this is on, any file that the\n\
|
||||||
|
remote server sends to the client will be saved to the current directory.\n\
|
||||||
|
This includes data like quests, Episode 3 card definitions, and GBA games.\n\
|
||||||
");
|
");
|
||||||
|
|
||||||
|
|
||||||
@@ -293,12 +295,6 @@ Proxy commands (these will only work when exactly one client is connected):\n\
|
|||||||
session->send_to_end(&cmds, sizeof(cmds), false);
|
session->send_to_end(&cmds, sizeof(cmds), false);
|
||||||
session->send_to_end(&cmds, sizeof(cmds), true);
|
session->send_to_end(&cmds, sizeof(cmds), true);
|
||||||
|
|
||||||
} else if (command_name == "ship") {
|
|
||||||
auto session = this->get_proxy_session();
|
|
||||||
|
|
||||||
static const string data("\xA0\x00\x04\x00", 4);
|
|
||||||
session->send_to_end(data, true);
|
|
||||||
|
|
||||||
} else if ((command_name == "info-board") || (command_name == "info-board-data")) {
|
} else if ((command_name == "info-board") || (command_name == "info-board-data")) {
|
||||||
auto session = this->get_proxy_session();
|
auto session = this->get_proxy_session();
|
||||||
|
|
||||||
@@ -316,12 +312,12 @@ Proxy commands (these will only work when exactly one client is connected):\n\
|
|||||||
|
|
||||||
session->send_to_end(data, true);
|
session->send_to_end(data, true);
|
||||||
|
|
||||||
} else if (command_name == "set-save-quests") {
|
} else if (command_name == "set-save-files") {
|
||||||
if (this->state->proxy_server.get()) {
|
if (this->state->proxy_server.get()) {
|
||||||
if (command_args == "on") {
|
if (command_args == "on") {
|
||||||
this->state->proxy_server->save_quests = true;
|
this->state->proxy_server->save_files = true;
|
||||||
} else if (command_args == "off") {
|
} else if (command_args == "off") {
|
||||||
this->state->proxy_server->save_quests = false;
|
this->state->proxy_server->save_files = false;
|
||||||
} else {
|
} else {
|
||||||
throw invalid_argument("argument must be \"on\" or \"off\"");
|
throw invalid_argument("argument must be \"on\" or \"off\"");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user