136 lines
3.6 KiB
C++

#pragma once
#include "types.h"
#include <vector>
#include <string>
#include <memory>
#include <cstring>
namespace scar {
// Wire format message header
struct MessageHeader {
uint32_t length; // Total message length including header
MessageType type; // Message type
uint8_t version; // Protocol version
uint16_t reserved; // Reserved for future use
} __attribute__((packed));
class Message {
public:
Message(MessageType type);
virtual ~Message() = default;
MessageType type() const { return header_.type; }
// Serialize to wire format
virtual std::vector<uint8_t> serialize() const;
// Deserialize from wire format
static std::unique_ptr<Message> deserialize(const std::vector<uint8_t>& data);
protected:
MessageHeader header_;
std::vector<uint8_t> payload_;
void setPayload(const std::vector<uint8_t>& data);
const std::vector<uint8_t>& payload() const { return payload_; }
};
// Login request message
class LoginRequest : public Message {
public:
LoginRequest(const std::string& username, const std::string& password);
std::vector<uint8_t> serialize() const override;
static std::unique_ptr<LoginRequest> deserialize(const std::vector<uint8_t>& payload);
const std::string& username() const { return username_; }
const std::string& password() const { return password_; }
private:
std::string username_;
std::string password_;
};
// Login response message
class LoginResponse : public Message {
public:
LoginResponse(bool success, const std::string& token = "", ErrorCode error = ErrorCode::NONE);
std::vector<uint8_t> serialize() const override;
static std::unique_ptr<LoginResponse> deserialize(const std::vector<uint8_t>& payload);
bool success() const { return success_; }
const std::string& token() const { return token_; }
ErrorCode error() const { return error_; }
private:
bool success_;
std::string token_;
ErrorCode error_;
};
// Text message
class TextMessage : public Message {
public:
TextMessage(const std::string& sender, const std::string& content);
std::vector<uint8_t> serialize() const override;
static std::unique_ptr<TextMessage> deserialize(const std::vector<uint8_t>& payload);
const std::string& sender() const { return sender_; }
const std::string& content() const { return content_; }
private:
std::string sender_;
std::string content_;
};
// Screen share start message
class ScreenShareStart : public Message {
public:
ScreenShareStart(uint32_t width, uint32_t height);
std::vector<uint8_t> serialize() const override;
static std::unique_ptr<ScreenShareStart> deserialize(const std::vector<uint8_t>& payload);
uint32_t width() const { return width_; }
uint32_t height() const { return height_; }
private:
uint32_t width_;
uint32_t height_;
};
// Screen share data message
class ScreenShareData : public Message {
public:
ScreenShareData(const std::vector<uint8_t>& frameData);
std::vector<uint8_t> serialize() const override;
static std::unique_ptr<ScreenShareData> deserialize(const std::vector<uint8_t>& payload);
const std::vector<uint8_t>& frameData() const { return frameData_; }
private:
std::vector<uint8_t> frameData_;
};
// Screen share stop message
class ScreenShareStop : public Message {
public:
ScreenShareStop();
std::vector<uint8_t> serialize() const override;
static std::unique_ptr<ScreenShareStop> deserialize(const std::vector<uint8_t>& payload);
};
} // namespace scar