generated from AfonsoCMSousa/CPP-Template
194 lines
5.0 KiB
C++
194 lines
5.0 KiB
C++
#ifndef HANDLE_HPP
|
|
#define HANDLE_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
#include <thread>
|
|
#include <vector>
|
|
|
|
#include "file.hpp" // for parce_args
|
|
#include "net.hpp" // for socket operations
|
|
#include "server_structs.h"
|
|
|
|
using namespace std;
|
|
|
|
class PacketReader {
|
|
private:
|
|
const u_char *buffer_;
|
|
size_t buffer_size_;
|
|
size_t offset_ = 0;
|
|
bool error_ = false;
|
|
|
|
public:
|
|
PacketReader(); // TODO:
|
|
~PacketReader(); // TODO:
|
|
|
|
bool read_uint8(uint8_t &value) {
|
|
size_t __bytes = sizeof(value);
|
|
|
|
if (offset_ + __bytes > buffer_size_) {
|
|
error_ = true;
|
|
return false;
|
|
}
|
|
|
|
memcpy(&value, buffer_ + offset_, sizeof(value));
|
|
|
|
offset_++;
|
|
return true;
|
|
}
|
|
|
|
bool read_uint16(uint16_t &value) {
|
|
size_t __bytes = sizeof(value);
|
|
|
|
if (offset_ + __bytes > buffer_size_) {
|
|
error_ = true;
|
|
return false;
|
|
}
|
|
|
|
memcpy(&value, buffer_ + offset_, sizeof(value));
|
|
value = ntohs(value);
|
|
|
|
offset_ += 2;
|
|
return true;
|
|
}
|
|
|
|
bool read_uint32(uint32_t &value) {
|
|
size_t __bytes = sizeof(value);
|
|
|
|
if (offset_ + __bytes > buffer_size_) {
|
|
error_ = true;
|
|
return false;
|
|
}
|
|
|
|
memcpy(&value, buffer_ + offset_, sizeof(value));
|
|
value = ntohl(value);
|
|
|
|
offset_ += 4;
|
|
return true;
|
|
}
|
|
|
|
bool read_float(float &value) {
|
|
size_t __bytes = sizeof(value);
|
|
|
|
if (offset_ + __bytes > buffer_size_) {
|
|
error_ = true;
|
|
return false;
|
|
}
|
|
|
|
uint32_t v_int;
|
|
memcpy(&v_int, buffer_ + offset_, sizeof(v_int));
|
|
v_int = ntohl(v_int);
|
|
|
|
memcpy(&value, &v_int, sizeof(value));
|
|
|
|
offset_ += 4;
|
|
return true;
|
|
}
|
|
|
|
bool read_string_utf32l(string &value) {
|
|
uint8_t __length;
|
|
if (!read_uint8(__length))
|
|
return false;
|
|
|
|
if (offset_ + (__length * sizeof(uint32_t)) > buffer_size_) {
|
|
error_ = true;
|
|
return false;
|
|
}
|
|
|
|
value.clear();
|
|
for (size_t i = 0; i < __length; i++) {
|
|
uint32_t codeunit;
|
|
if (!read_uint32(codeunit))
|
|
return false;
|
|
|
|
if (codeunit == 0) {
|
|
break; // null terminator
|
|
}
|
|
|
|
value.push_back(static_cast<char>(codeunit));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool has_error() const {
|
|
return error_;
|
|
}
|
|
};
|
|
|
|
class ProtocolHandler {
|
|
private:
|
|
trackAtributes track_info_;
|
|
carAtributes player_info_[64];
|
|
|
|
public:
|
|
ProtocolHandler();
|
|
~ProtocolHandler();
|
|
|
|
bool handle_new_session(PacketReader &reader) {
|
|
|
|
if (!reader.read_uint8(track_info_.protocol_version))
|
|
return false;
|
|
if (!reader.read_uint8(track_info_.session_index))
|
|
return false;
|
|
if (!reader.read_uint8(track_info_.current_session_index))
|
|
return false;
|
|
if (!reader.read_uint8(track_info_.session_count))
|
|
return false;
|
|
|
|
/*
|
|
* str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.server_name, str_len_8, &ok);
|
|
|
|
str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.track, str_len_8, &ok);
|
|
|
|
str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.track_config, str_len_8, &ok);
|
|
|
|
str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.session_name, str_len_8, &ok);
|
|
|
|
trackInfo.typ = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
trackInfo.time = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
trackInfo.laps = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
trackInfo.wait_time = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
trackInfo.ambient_temp = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
trackInfo.road_temp = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
|
|
str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok);
|
|
read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.weather_graphics, str_len_8, &ok);
|
|
*/
|
|
|
|
if (!reader.read_string_utf32l(track_info_.server_name))
|
|
return false;
|
|
if (!reader.read_string_utf32l(track_info_.track))
|
|
return false;
|
|
if (!reader.read_string_utf32l(track_info_.track_config))
|
|
return false;
|
|
if (!reader.read_string_utf32l(track_info_.session_name))
|
|
return false;
|
|
if (!reader.read_uint8(track_info_.typ))
|
|
return false;
|
|
if (!reader.read_uint16(track_info_.time))
|
|
return false;
|
|
if (!reader.read_uint16(track_info_.laps))
|
|
return false;
|
|
if (!reader.read_uint16(track_info_.wait_time))
|
|
return false;
|
|
if (!reader.read_uint8(track_info_.ambient_temp))
|
|
return false;
|
|
if (!reader.read_uint8(track_info_.road_temp))
|
|
return false;
|
|
if (!reader.read_string_utf32l(track_info_.weather_graphics))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
};
|
|
#endif // HANDLE_HPP
|