SNode.C
Loading...
Searching...
No Matches
core::socket::stream::SocketReader Class Referenceabstract

#include <SocketReader.h>

Inheritance diagram for core::socket::stream::SocketReader:
Collaboration diagram for core::socket::stream::SocketReader:

Public Member Functions

 SocketReader ()=delete
Public Member Functions inherited from core::DescriptorEventReceiver
 DescriptorEventReceiver (const std::string &name, DescriptorEventPublisher &descriptorEventPublisher, const utils::Timeval &timeout=TIMEOUT::DISABLE)
int getRegisteredFd () const
bool isEnabled () const
bool isSuspended () const
void setTimeout (const utils::Timeval &timeout)
utils::Timeval getTimeout (const utils::Timeval &currentTime) const
void checkTimeout (const utils::Timeval &currentTime)
Public Member Functions inherited from core::EventReceiver
 EventReceiver (const std::string &name)
 EventReceiver (EventReceiver &)=delete
 EventReceiver (EventReceiver &&)=delete
EventReceiveroperator= (EventReceiver &)=delete
EventReceiveroperator= (EventReceiver &&)=delete
virtual void destruct ()
void span ()
void relax ()
const std::string & getName () const

Protected Member Functions

 SocketReader (const std::string &instanceName, const std::function< void(int)> &onStatus, const utils::Timeval &timeout, std::size_t blockSize, const utils::Timeval &terminateTimeout)
std::size_t getTotalRead () const
std::size_t getTotalProcessed () const
virtual ssize_t read (char *chunk, std::size_t chunkLen)
void setBlockSize (std::size_t readBlockSize)
std::size_t readFromPeer (char *chunk, std::size_t chunkLen)
void shutdownRead ()
Protected Member Functions inherited from core::eventreceiver::ReadEventReceiver
 ReadEventReceiver (const std::string &name, const utils::Timeval &timeout)
virtual void readTimeout ()
Protected Member Functions inherited from core::DescriptorEventReceiver
bool enable (int fd)
void disable ()
void suspend ()
void resume ()
Protected Member Functions inherited from core::Observer
void observed ()
void unObserved ()
virtual void unobservedEvent ()=0
 Observer ()=default
 Observer (Observer &)=delete
 Observer (Observer &&)=delete
virtual ~Observer ()
Protected Member Functions inherited from core::EventReceiver
virtual ~EventReceiver ()=default
 EventReceiver (const std::string &name)
 EventReceiver (EventReceiver &)=delete
 EventReceiver (EventReceiver &&)=delete
EventReceiveroperator= (EventReceiver &)=delete
EventReceiveroperator= (EventReceiver &&)=delete
virtual void destruct ()
void span ()
void relax ()
const std::string & getName () const

Protected Attributes

utils::Timeval terminateTimeout

Private Member Functions

virtual void onReceivedFromPeer (std::size_t available)=0
void readEvent () final
std::size_t doRead ()
void signalEvent (int sigNum) final

Private Attributes

std::function< void(int)> onStatus
std::vector< char > readBuffer
std::size_t blockSize = 0
std::size_t totalRead = 0
std::size_t totalProcessed = 0
std::size_t size = 0
std::size_t cursor = 0
bool shutdownInProgress = false

Additional Inherited Members

Static Public Member Functions inherited from core::EventReceiver
static void atNextTick (const std::function< void(void)> &callBack)
Static Protected Member Functions inherited from core::EventReceiver
static void atNextTick (const std::function< void(void)> &callBack)

Detailed Description

Definition at line 61 of file SocketReader.h.

Constructor & Destructor Documentation

◆ SocketReader() [1/2]

core::socket::stream::SocketReader::SocketReader ( )
delete

◆ SocketReader() [2/2]

core::socket::stream::SocketReader::SocketReader ( const std::string & instanceName,
const std::function< void(int)> & onStatus,
const utils::Timeval & timeout,
std::size_t blockSize,
const utils::Timeval & terminateTimeout )
explicitprotected

Definition at line 55 of file SocketReader.cpp.

60 : core::eventreceiver::ReadEventReceiver(instanceName, timeout)
64 }
void setBlockSize(std::size_t readBlockSize)
std::function< void(int)> onStatus

References onStatus, core::eventreceiver::ReadEventReceiver::ReadEventReceiver(), setBlockSize(), terminateTimeout, and utils::Timeval::Timeval().

Here is the call graph for this function:

Member Function Documentation

◆ doRead()

std::size_t core::socket::stream::SocketReader::doRead ( )
private

Definition at line 89 of file SocketReader.cpp.

89 {
90 errno = 0;
91
92 if (size == 0) {
93 cursor = 0;
94
95 ssize_t retRead = 0;
96 if (!shutdownInProgress) {
97 const std::size_t readLen = blockSize - size;
98 retRead = read(readBuffer.data() + size, readLen);
99 }
100 if (retRead > 0) {
101 totalRead += static_cast<std::size_t>(retRead);
102
103 size += static_cast<std::size_t>(retRead);
104
105 if (!isSuspended()) {
106 suspend();
107 }
108 span();
109 } else if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
110 if (isSuspended()) {
111 resume();
112 }
113 } else {
114 onStatus(errno);
115 }
116 } else {
117 span();
118 }
119
120 return size;
121 }
virtual ssize_t read(char *chunk, std::size_t chunkLen)

References blockSize, cursor, core::DescriptorEventReceiver::isSuspended(), onStatus, read(), readBuffer, core::DescriptorEventReceiver::resume(), shutdownInProgress, size, core::EventReceiver::span(), core::DescriptorEventReceiver::suspend(), and totalRead.

Referenced by readEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getTotalProcessed()

std::size_t core::socket::stream::SocketReader::getTotalProcessed ( ) const
protected

Definition at line 70 of file SocketReader.cpp.

70 {
71 return totalProcessed;
72 }

References totalProcessed.

◆ getTotalRead()

std::size_t core::socket::stream::SocketReader::getTotalRead ( ) const
protected

Definition at line 66 of file SocketReader.cpp.

66 {
67 return totalRead;
68 }

References totalRead.

◆ onReceivedFromPeer()

virtual void core::socket::stream::SocketReader::onReceivedFromPeer ( std::size_t available)
privatepure virtual

◆ read()

ssize_t core::socket::stream::SocketReader::read ( char * chunk,
std::size_t chunkLen )
protectedvirtual

Reimplemented in core::socket::stream::tls::SocketReader.

Definition at line 85 of file SocketReader.cpp.

85 {
86 return core::system::recv(this->getRegisteredFd(), chunk, chunkLen, 0);
87 }
ssize_t recv(int sockfd, void *buf, std::size_t len, int flags)
Definition socket.cpp:91

References core::DescriptorEventReceiver::getRegisteredFd(), and core::system::recv().

Referenced by doRead(), and core::socket::stream::tls::SocketReader::read().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readEvent()

void core::socket::stream::SocketReader::readEvent ( )
finalprivatevirtual

Implements core::eventreceiver::ReadEventReceiver.

Definition at line 74 of file SocketReader.cpp.

74 {
75 const std::size_t available = doRead();
76
77 if (available > 0) {
78 onReceivedFromPeer(available);
79 }
80 }
virtual void onReceivedFromPeer(std::size_t available)=0

References doRead(), and onReceivedFromPeer().

Here is the call graph for this function:

◆ readFromPeer()

std::size_t core::socket::stream::SocketReader::readFromPeer ( char * chunk,
std::size_t chunkLen )
protected

Definition at line 128 of file SocketReader.cpp.

128 {
129 const std::size_t maxReturn = std::min(chunkLen, size);
130
131 std::copy(readBuffer.data() + cursor, readBuffer.data() + cursor + maxReturn, chunk);
132
133 cursor += maxReturn;
134 size -= maxReturn;
135 totalProcessed += maxReturn;
136
137 return maxReturn;
138 }

References cursor, readBuffer, size, and totalProcessed.

◆ setBlockSize()

void core::socket::stream::SocketReader::setBlockSize ( std::size_t readBlockSize)
protected

Definition at line 123 of file SocketReader.cpp.

123 {
124 readBuffer.resize(readBlockSize);
125 blockSize = readBlockSize;
126 }

References blockSize, and readBuffer.

Referenced by SocketReader().

Here is the caller graph for this function:

◆ shutdownRead()

void core::socket::stream::SocketReader::shutdownRead ( )
protected

Definition at line 140 of file SocketReader.cpp.

140 {
141 readBuffer.clear();
142
143 size = 0;
144 cursor = 0;
145
146 shutdownInProgress = true;
147
149 }
void setTimeout(const utils::Timeval &timeout)

References cursor, readBuffer, core::DescriptorEventReceiver::setTimeout(), shutdownInProgress, size, and terminateTimeout.

Here is the call graph for this function:

◆ signalEvent()

void core::socket::stream::SocketReader::signalEvent ( int sigNum)
finalprivatevirtual

Reimplemented from core::eventreceiver::ReadEventReceiver.

Definition at line 82 of file SocketReader.cpp.

82 { // Do nothing in case a signal was received
83 }

Member Data Documentation

◆ blockSize

std::size_t core::socket::stream::SocketReader::blockSize = 0
private

Definition at line 96 of file SocketReader.h.

Referenced by doRead(), and setBlockSize().

◆ cursor

std::size_t core::socket::stream::SocketReader::cursor = 0
private

Definition at line 102 of file SocketReader.h.

Referenced by doRead(), readFromPeer(), and shutdownRead().

◆ onStatus

std::function<void(int)> core::socket::stream::SocketReader::onStatus
private

Definition at line 93 of file SocketReader.h.

Referenced by doRead(), and SocketReader().

◆ readBuffer

std::vector<char> core::socket::stream::SocketReader::readBuffer
private

Definition at line 95 of file SocketReader.h.

Referenced by doRead(), readFromPeer(), setBlockSize(), and shutdownRead().

◆ shutdownInProgress

bool core::socket::stream::SocketReader::shutdownInProgress = false
private

Definition at line 104 of file SocketReader.h.

Referenced by doRead(), and shutdownRead().

◆ size

std::size_t core::socket::stream::SocketReader::size = 0
private

Definition at line 101 of file SocketReader.h.

Referenced by doRead(), readFromPeer(), and shutdownRead().

◆ terminateTimeout

utils::Timeval core::socket::stream::SocketReader::terminateTimeout
protected

Definition at line 107 of file SocketReader.h.

Referenced by shutdownRead(), and SocketReader().

◆ totalProcessed

std::size_t core::socket::stream::SocketReader::totalProcessed = 0
private

Definition at line 99 of file SocketReader.h.

Referenced by getTotalProcessed(), and readFromPeer().

◆ totalRead

std::size_t core::socket::stream::SocketReader::totalRead = 0
private

Definition at line 98 of file SocketReader.h.

Referenced by doRead(), and getTotalRead().


The documentation for this class was generated from the following files: