2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "core/socket/stream/SocketContext.h"
44#include "core/socket/stream/SocketConnection.h"
46#ifndef DOXYGEN_SHOULD_SKIP_THIS
48#include "log/Logger.h"
58namespace core::socket::
stream {
93 if (available != 0 && consumed == 0) {
116 <<
" ReadFromPeer: New SocketContext != nullptr: SocketContextSwitch still in progress";
199 const std::time_t time = std::chrono::system_clock::to_time_t(timePoint);
200 std::tm* tm_ptr = std::gmtime(&time);
203 std::string onlineSince =
"Formatting error";
206 if (std::strftime(buffer,
sizeof(buffer),
"%Y-%m-%d %H:%M:%S", tm_ptr) > 0) {
207 onlineSince = std::string(buffer) +
" UTC";
214 const std::chrono::time_point<std::chrono::system_clock>& later) {
215 using seconds_duration_type = std::chrono::duration<std::chrono::seconds::rep>::rep;
217 const seconds_duration_type totalSeconds = std::chrono::duration_cast<std::chrono::seconds>(later - bevore).count();
220 const seconds_duration_type days = totalSeconds / 86400;
221 seconds_duration_type remainder = totalSeconds % 86400;
222 const seconds_duration_type hours = remainder / 3600;
223 remainder = remainder % 3600;
224 const seconds_duration_type minutes = remainder / 60;
225 const seconds_duration_type seconds = remainder % 60;
228 std::ostringstream oss;
230 oss << days <<
" day" << (days == 1 ?
"" :
"s") <<
", ";
232 oss << std::setw(2) << std::setfill(
'0') << hours <<
":" << std::setw(2) << std::setfill(
'0') << minutes <<
":" << std::setw(2)
233 << std::setfill(
'0') << seconds;
virtual std::size_t onReceivedFromPeer()=0
virtual void shutdownRead()=0
virtual void sendToPeer(const char *chunk, std::size_t chunkLen)=0
virtual void setTimeout(const utils::Timeval &timeout)=0
const std::string & getConnectionName() const
void setSocketContext(SocketContext *socketContext)
virtual std::size_t getTotalRead() const =0
virtual std::size_t getTotalQueued() const =0
virtual void streamEof()=0
virtual void shutdownWrite(bool forceClose)=0
virtual std::size_t readFromPeer(char *chunk, std::size_t chunkLen)=0
virtual std::size_t getTotalSent() const =0
virtual bool streamToPeer(core::pipe::Source *source)=0
virtual std::size_t getTotalProcessed() const =0
std::string getOnlineSince() const override
SocketConnection * getSocketConnection() const
virtual void switchSocketContext(SocketContext *newSocketContext)
std::size_t getTotalProcessed() const override
SocketContext(core::socket::stream::SocketConnection *socketConnection)
std::size_t alreadyTotalQueued
static std::string timePointToString(const std::chrono::time_point< std::chrono::system_clock > &timePoint)
std::size_t readFromPeer(char *chunk, std::size_t chunklen) const final
~SocketContext() override
void onReadError(int errnum) override
virtual void onConnected()=0
void sendToPeer(const char *chunk, std::size_t chunkLen) const final
static std::string durationToString(const std::chrono::time_point< std::chrono::system_clock > &bevore, const std::chrono::time_point< std::chrono::system_clock > &later=std::chrono::system_clock::now())
std::size_t getTotalSent() const override
void shutdownWrite(bool forceClose=false)
core::socket::stream::SocketContext * newSocketContext
std::size_t alreadyTotalProcessed
void onWriteError(int errnum) override
std::size_t getTotalQueued() const override
bool streamToPeer(core::pipe::Source *source) const
core::socket::stream::SocketConnection * socketConnection
std::string getOnlineDuration() const override
virtual void onDisconnected()=0
void readFromPeer(std::size_t available)
std::chrono::time_point< std::chrono::system_clock > onlineSinceTimePoint
void setTimeout(const utils::Timeval &timeout) final
std::size_t getTotalRead() const override