diff --git a/server/src/sock/intrasock.cpp b/server/src/sock/intrasock.cpp index 4075edc..c1a78c5 100644 --- a/server/src/sock/intrasock.cpp +++ b/server/src/sock/intrasock.cpp @@ -1,2 +1,50 @@ #include "intrasock.hpp" +/******************************/ +/* BEGIN INTRACONNECTION CODE */ +/******************************/ + +sosc::IntraConnection::IntraConnection(TcpClient client) { + this->client = client; + this->client_open = true; +} + +int sosc::IntraConnection::Receive(Packet* packet, bool block) { + if(!this->client_open) + return PCK_ERR; + + int status; + bool first_recv = true; + while((status = packet->Parse(this->buffer, &this->buffer)) != PCK_OK) { + if(status == PCK_ERR) + return PCK_ERR; + if(!block && !first_recv) + return PCK_MORE; + + status = this->client.Receive + (&this->buffer, SOSC_TCP_APPEND | (block ? SOSC_TCP_BLOCK : 0)); + + if(status == -1) + return PCK_ERR; + first_recv = false; + } + + return PCK_OK; +} + +bool sosc::IntraConnection::Send(const Packet& packet) { + if(!this->client_open) + return false; + + +} + +/****************************/ +/* END INTRACONNECTION CODE */ +/****************************/ +/* BEGIN INTRASERVER CODE */ +/****************************/ + +/****************************/ +/* END INTRASERVER CODE */ +/****************************/ diff --git a/server/src/sock/intrasock.hpp b/server/src/sock/intrasock.hpp index 22ec09f..2d6fafd 100644 --- a/server/src/sock/intrasock.hpp +++ b/server/src/sock/intrasock.hpp @@ -2,6 +2,7 @@ #define SOSC_INTSOCK_H #include "tcpsock.hpp" +#include "packet.hpp" namespace sosc { class IntraConnection { @@ -9,11 +10,16 @@ public: int Receive(Packet* packet, bool block = false); bool Send(const Packet& packet); + inline bool IsOpen() const { + return this->client_open; + } + void Close(); ~IntraConnection(); private: IntraConnection(TcpClient client); + bool client_open; TcpClient client; std::string buffer; @@ -22,9 +28,18 @@ private: class IntraServer { public: + bool Listen(uint16_t port); + int Accept(IntraConnection *client); + inline bool IsOpen() const { + return this->server_open; + } + + void Close(); + ~IntraServer(); private: - + bool server_open; + TcpServer server; }; } diff --git a/server/src/sock/packet.cpp b/server/src/sock/packet.cpp index 5563382..5474b9a 100644 --- a/server/src/sock/packet.cpp +++ b/server/src/sock/packet.cpp @@ -1,7 +1,7 @@ #include "packet.hpp" bool sosc::Packet::AddRegion(std::string data) { - if(this->regions.size() == 256) + if(this->regions.size() >= 256) return false; this->regions.push_back(data); @@ -12,7 +12,43 @@ bool sosc::Packet::AddRegions(std::vector data) { if(this->regions.size() + data.size() > 256) return false; + for(auto i = data.begin(); i != data.end(); ++i) + this->regions.push_back(*i); +} + +void sosc::Packet::SetRegion(uint8_t index, std::string data) { + if(index >= this->regions.size()) + this->regions.resize(index + 1); + this->regions[index] = data; +} + +void sosc::Packet::SetRegions + (uint8_t start, std::vector data) +{ + if(start + data.size() > 256) + return; + + if(start + data.size() > this->regions.size()) + this->regions.resize(start + data.size()); + + for(int i = 0; i < data.size(); ++i) + this->regions[start + i] = data[i]; +} + +void sosc::Packet::DeleteRegion(uint8_t index) { + if(index >= this->regions.size()) + return; + + this->regions.erase(this->regions.begin() + index); +} + +void sosc::Packet::DeleteRegions(uint8_t start, uint8_t length) { + if(start + length > 256) + return; + + for(int i = 0; i < length; ++i) + this->regions.erase(this->regions.begin() + start); } int sosc::Packet::Parse(const std::string& data, std::string* extra) { @@ -74,8 +110,10 @@ int sosc::Packet::Parse(const std::string& data, std::string* extra) { ptr += region_lengths[i]; } - if(length > expected_length) + if(length > expected_length && extra != nullptr) *extra = data.substr(expected_length); + else + *extra = ""; return PCK_OK; } diff --git a/server/src/sock/packet.hpp b/server/src/sock/packet.hpp index 023b010..4330f9a 100644 --- a/server/src/sock/packet.hpp +++ b/server/src/sock/packet.hpp @@ -21,7 +21,7 @@ public: bool AddRegion(std::string data); bool AddRegions(std::vector data); - void SetRegion(uint8_t index); + void SetRegion(uint8_t index, std::string data); void SetRegions(uint8_t start, std::vector data); void DeleteRegion(uint8_t index); @@ -41,10 +41,14 @@ public: return this->id; } + inline int RegionCount() const { + return this->regions.size(); + } + inline std::string operator [] (const std::vector::size_type index) const { - return regions[index]; + return this->regions[index]; } std::string ToString() const;