diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-06-21 21:18:28 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-06-22 11:13:20 +0800 |
| commit | 2320470d342db4cb5ae0ae717dfc5ac94bd3f2d2 (patch) | |
| tree | a20a988ea60284374865405118bf38324b1a368a /src/server | |
| parent | 3e11125a1694d61fb0bd578783437acfca8eacc3 (diff) | |
internal(server): remove return of std::any for callbacks
use bool for cases for premature return
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/client.cpp | 24 | ||||
| -rw-r--r-- | src/server/clients.cpp | 15 |
2 files changed, 20 insertions, 19 deletions
diff --git a/src/server/client.cpp b/src/server/client.cpp index 33cbf9d..c59100e 100644 --- a/src/server/client.cpp +++ b/src/server/client.cpp @@ -40,7 +40,7 @@ Client::~Client() { m_sockfd.reset(); } -void Client::recvLoop(std::optional<std::function<std::any(const SRecvData &)>> cb) { +void Client::recvLoop(std::optional<std::function<bool(const SRecvData &)>> cb) { while (true) { auto recvData = read(); if (!recvData->good) @@ -52,8 +52,8 @@ void Client::recvLoop(std::optional<std::function<std::any(const SRecvData &)>> pClients->m_vDatas.push_back({recvData->data, self}); - if (cb) - (*cb)(*recvData); + if (cb && !(*cb)(*recvData)) + return; } } @@ -76,7 +76,7 @@ void SRecvData::sanitize() { data.clear(); } -UP<SRecvData> Client::read(std::optional<std::function<std::any(const SRecvData &)>> cb) { +UP<SRecvData> Client::read(std::optional<std::function<bool(const SRecvData &)>> cb) { auto recvData = std::make_unique<SRecvData>(); recvData->data.resize(recvData->size); @@ -84,8 +84,10 @@ UP<SRecvData> Client::read(std::optional<std::function<std::any(const SRecvData if (size < 0 || size == 0) { recvData->good = false; - if (cb) - (*cb)(*recvData); + if (cb && !(*cb)(*recvData)) { + m_szReading.reset(); + return nullptr; + } } else { recvData->data.resize(size); recvData->good = true; @@ -95,13 +97,13 @@ UP<SRecvData> Client::read(std::optional<std::function<std::any(const SRecvData return recvData; } -UP<SRecvData> Client::read(const std::string &msg, std::optional<std::function<std::any(const SRecvData &)>> cb) { +UP<SRecvData> Client::read(const std::string &msg, std::optional<std::function<bool(const SRecvData &)>> cb) { write("{}", msg); m_szReading = msg; return read(cb); } -void Client::runLoop(bool resumeHist, std::optional<std::function<std::any(const SRecvData &)>> cb) { +void Client::runLoop(bool resumeHist, std::optional<std::function<bool(const SRecvData &)>> cb) { if (resumeHist) resumeHistory(); @@ -124,13 +126,13 @@ bool Client::isValid() { return getsockopt(m_sockfd->get(), SOL_SOCKET, SO_ERROR, &err, &size) >= 0 && err == 0; } -bool Client::write(const std::string &msg, std::optional<std::function<std::any(const SRecvData &)>> cb) { - const auto r = write("{}", msg); +bool Client::write(const std::string &msg, std::optional<std::function<bool(const SRecvData &)>> cb) { + auto r = write("{}", msg); if (cb) { auto recvData = std::make_unique<SRecvData>(); recvData->data = msg; recvData->good = r; - (*cb)(*recvData); + r = (*cb)(*recvData); } return r; } diff --git a/src/server/clients.cpp b/src/server/clients.cpp index 2bf82b4..e1dd161 100644 --- a/src/server/clients.cpp +++ b/src/server/clients.cpp @@ -1,7 +1,6 @@ #include "libsock/server/clients.hpp" #include "libsock/server/client.hpp" #include <algorithm> -#include <any> #include <ranges> #include <stdexcept> #include <unistd.h> @@ -12,12 +11,12 @@ using namespace LibSock::Server; namespace LibSock { namespace Server { -void Clients::shutdownClients(std::optional<std::function<std::any(const std::vector<std::pair<std::jthread, SP<Client>>> &)>> cb) { +void Clients::shutdownClients(std::optional<std::function<bool(const std::vector<std::pair<std::jthread, SP<Client>>> &)>> cb) { if (m_vClients.empty()) return; - if (cb) - (*cb)(m_vClients); + if (cb && !(*cb)(m_vClients)) + return; for (auto &[thread, client] : m_vClients) { if (thread.joinable()) @@ -58,7 +57,7 @@ Clients::~Clients() { } } -WP<Client> Clients::newClient(std::function<std::any(const WP<Client> &)> loopFunc, SP<Server> server) { +WP<Client> Clients::newClient(std::function<void(const WP<Client> &)> loopFunc, SP<Server> server) { SP client = SP<Client>(new Client(server, shared_from_this())); auto &instance = m_vClients.emplace_back(std::jthread([&client, &loopFunc]() { loopFunc(client); }), client); instance.second->self = std::weak_ptr<Client>(instance.second); @@ -93,7 +92,7 @@ std::vector<SData> Clients::getDatas() const { return m_vDatas; } -void Clients::kick(WP<Client> clientWeak, const bool kill, const std::string &reason, std::optional<std::function<std::any(const std::vector<std::pair<std::jthread, SP<Client>>>::iterator &)>> cb) { +void Clients::kick(WP<Client> clientWeak, const bool kill, const std::string &reason, std::optional<std::function<bool(const std::vector<std::pair<std::jthread, SP<Client>>>::iterator &)>> cb) { auto client = clientWeak.lock(); if (!client) return; @@ -103,8 +102,8 @@ void Clients::kick(WP<Client> clientWeak, const bool kill, const std::string &re if (client) // this only exist when the client is registered // not sure why the second is null - if (cb) - (*cb)(it); + if (cb && !(*cb)(it)) + return; if (!reason.empty()) client->write(reason); |
