From bcf30ffc53d7cf007f0bcd1ba9aca44fe2a2acde Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Thu, 13 Mar 2025 22:56:37 +0800 Subject: session(SRecvData::data): use std::string instead of char* --- src/session.cpp | 41 +++++++++++++++++++++++++---------------- src/session.hpp | 5 +++++ 2 files changed, 30 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/session.cpp b/src/session.cpp index 228f183..61e1402 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -4,6 +4,7 @@ #include "server.hpp" #include "sessionManager.hpp" #include +#include #include #include #include @@ -66,23 +67,35 @@ void CSession::recvLoop() { } } +bool CSession::SRecvData::isEmpty() const { + return data.empty() || std::ranges::all_of(data, [](char c) { return std::isspace(c); }); +} + +void CSession::SRecvData::sanitize() { + if (!data.empty() && data.back() == '\n') + data.pop_back(); + + if (const auto start = data.find_first_not_of(" \t\r\n"); start != std::string::npos) { + const auto end = data.find_last_not_of(" \t\r\n"); + data = data.substr(start, end - start + 1); + } else + data.clear(); +} + std::unique_ptr CSession::read() { auto recvData = std::make_unique(); - char buffer[1024] = {0}; - ssize_t dataSize = recv(m_sockfd.get(), buffer, sizeof(buffer), 0); - if (dataSize < 0) { + recvData->data.resize(recvData->size); + ssize_t size = recv(m_sockfd.get(), &recvData->data[0], recvData->size, 0); + + if (size < 0) { recvData->good = false; onErrno(READ); - } - if (dataSize == 0) { + } else if (size == 0) recvData->good = false; // onDisconnect(); - } - - if (dataSize > 0) { - recvData->data = std::string(buffer, dataSize); - } + else + recvData->data.resize(size); onRecv(*recvData); m_isReading = false; @@ -113,16 +126,12 @@ bool CSession::registerSession() { if (!recvData->good) return false; - if (recvData->data.empty() || recvData->data[0] == '\n' || recvData->data[0] == ' ') { + recvData->sanitize(); + if (recvData->isEmpty()) { write("Name cannot be empty"); return registerSession(); } - // Remove trailing newline if present - if (!recvData->data.empty() && recvData->data.back() == '\n') { - recvData->data.pop_back(); - } - if (g_pSessionManager->nameExists(recvData->data)) { write("Name already exists"); return registerSession(); diff --git a/src/session.hpp b/src/session.hpp index 77687f9..d7bc11c 100644 --- a/src/session.hpp +++ b/src/session.hpp @@ -14,9 +14,14 @@ class CSession { struct SRecvData { std::string data; + const size_t size = 1024; bool good = true; + + bool isEmpty() const; + void sanitize(); }; + std::string getName(); void setSelf(std::pair> *self); -- cgit v1.2.3