Files
psopeeps-newserv/src/PatchDownloadSession.hh
T
Martin Michelsen d9d33c2d65 add patch downloader
2025-10-18 01:03:00 -07:00

62 lines
1.7 KiB
C++

#pragma once
#include <asio.hpp>
#include <map>
#include <memory>
#include <phosg/Filesystem.hh>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include "Channel.hh"
#include "CommandFormats.hh"
#include "PSOEncryption.hh"
#include "PSOProtocol.hh"
class PatchDownloadSession {
public:
PatchDownloadSession(
std::shared_ptr<asio::io_context> io_context,
const std::string& remote_host,
uint16_t remote_port,
const std::string& output_dir,
Version version,
const std::string& username,
const std::string& password,
const std::string& email,
bool show_command_data);
PatchDownloadSession(const PatchDownloadSession&) = delete;
PatchDownloadSession(PatchDownloadSession&&) = delete;
PatchDownloadSession& operator=(const PatchDownloadSession&) = delete;
PatchDownloadSession& operator=(PatchDownloadSession&&) = delete;
virtual ~PatchDownloadSession() = default;
asio::awaitable<void> run();
protected:
// Config (must be set by caller)
std::string remote_host;
uint16_t remote_port;
std::string output_dir;
Version version;
std::string username;
std::string password;
std::string email;
bool show_command_data;
// State (set during session)
phosg::PrefixedLogger log;
std::shared_ptr<asio::io_context> io_context;
std::shared_ptr<Channel> channel;
std::vector<std::string> dir_path;
std::unique_ptr<FILE, void (*)(FILE*)> current_file;
size_t current_file_bytes_remaining = 0;
std::vector<C_FileInformation_Patch_0F> pending_checksum_results;
static void check_path_token(const std::string& token);
std::string resolve_filename(const std::string& filename) const;
asio::awaitable<void> on_message(Channel::Message& msg);
};