21 d->_readChannels.clear();
23 d->_readChannels.push_back(
IOBuffer( d->_readBufChunkSize ) );
34 d->_readChannels.clear();
40 d->_readChannels.resize( channels );
49 if ( channel >= d->_readChannels.size() ) {
53 d->_currentReadChannel = channel;
62 return d->_currentReadChannel;
70 return d->_readChannels.size();
106 return readAll( d->_currentReadChannel );
111 if ( !
canRead() || maxSize <= 0 )
113 return read( d_func()->_currentReadChannel, maxSize );
121 return read( d->_currentReadChannel, buf, maxSize );
139 if ( !
canRead() || maxSize <= 0 )
143 const auto r =
read( channel, res.data(), maxSize );
151 if ( !
canRead() || maxSize < 0 )
154 if ( channel >= d->_readChannels.size() ) {
159 int64_t readSoFar = d->_readChannels[ channel ].read( buf, maxSize );
162 if ( readSoFar < maxSize ) {
163 int64_t readFromDev =
readData( channel, buf+readSoFar, maxSize - readSoFar );
164 if ( readFromDev > 0 )
165 return readSoFar + readFromDev;
173 if ( !
canRead() || maxSize < 0 )
176 if ( channel >= d->_readChannels.size() ) {
183 const auto maxBArrSize = int64_t( std::min(
ByteArray::maxSize(), std::size_t(std::numeric_limits<int64_t>::max()) ) );
184 if ( maxSize > maxBArrSize ) {
185 ERR <<
"Calling channelReadLine with maxSize > int64_t(ByteArray::maxSize) " << std::endl;
186 maxSize = maxBArrSize - 1;
190 int64_t readSoFar = 0;
194 if ( maxSize == 0 || maxSize >= (maxBArrSize - 1) ) {
197 maxSize = maxBArrSize;
200 int64_t lastReadSize = 0;
203 result.resize( std::min( std::size_t(maxSize), std::size_t(result.size() + d->_readBufChunkSize )) );
204 lastReadSize =
channelReadLine( channel, result.data() + readSoFar, result.size() - readSoFar );
205 if ( lastReadSize > 0)
206 readSoFar += lastReadSize;
211 }
while( lastReadSize == d->_readBufChunkSize
212 && result[readSoFar-1] !=
'\n' );
215 result.resize( maxSize );
219 if ( readSoFar > 0 ) {
221 result.resize( readSoFar );
227 result.shrink_to_fit();
236 if ( !
canRead() || maxSize < 0 )
239 if ( channel >= d->_readChannels.size() ) {
245 ERR <<
"channelReadLine needs at least a buffsize of 2" << std::endl;
249 int64_t toRead = maxSize - 1;
250 int64_t readSoFar = 0;
251 if ( d->_readChannels[channel].size () > 0 )
252 readSoFar = d->_readChannels[channel].readLine( buf, toRead + 1 );
254 if ( readSoFar == toRead || ( readSoFar > 0 && buf[readSoFar-1] ==
'\n' ) ) {
255 buf[readSoFar] =
'\0';
259 bool hasError =
false;
262 while ( readSoFar < toRead ) {
263 const auto r =
readData( channel, buf+readSoFar, 1 );
274 if ( buf[readSoFar-1] ==
'\n' )
278 if ( readSoFar == 0 )
279 return hasError ? -1 : 0;
281 buf[readSoFar] =
'\0';
296 if ( !
canRead() || channel >= d->_readChannels.size() )
298 return d->_readChannels[channel].canReadLine();
305 return write( data.data(), data.size() );
326 return d_func()->_readyRead;
331 return d_func()->_channelReadyRead;
336 return d_func()->_sigBytesWritten;
341 return d_func()->_sigAllBytesWritten;
virtual int64_t rawBytesAvailable(uint channel) const =0
uint currentReadChannel() const
SignalProxy< void(int64_t)> sigBytesWritten()
int readChannelCount() const
virtual bool open(const OpenMode mode)
void setReadChannelCount(uint channels)
IODevicePrivate(IODevice &p)
void setReadChannel(uint channel)
ByteArray channelReadLine(uint channel, int64_t maxSize=0)
bool write(const Pathname &path_r, const std::string &key_r, const std::string &val_r, const std::string &newcomment_r)
Add or change a value in sysconfig file path_r.
static std::size_t maxSize()
virtual int64_t writeData(const char *data, int64_t count)=0
virtual void readChannelChanged(uint channel)=0
int64_t write(const ByteArray &data)
ByteArray read(int64_t maxSize)
constexpr std::string_view outOfRangeErrMsg("Channel index out of range")
SignalProxy< void(uint)> sigChannelReadyRead()
SignalProxy< void()> sigReadyRead()
SignalProxy< void()> sigAllBytesWritten()
ZYPP_IMPL_PRIVATE(UnixSignalSource)
virtual int64_t bytesAvailable() const
virtual ByteArray readLine(const int64_t maxSize=0)
virtual int64_t readData(uint channel, char *buffer, int64_t bufsize)=0
bool waitForReadyRead(int timeout)