| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | #include "SocketStream.h"#include <stdint.h>  // for uint8_t#include <cstdio>    // for NULL, ssize_t#include "TCPSocket.h"  // for TCPSocket#include "TLSSocket.h"  // for TLSSocketusing namespace bell;int SocketBuffer::open(const std::string& hostname, int port, bool isSSL) {  if (internalSocket != nullptr) {    close();  }  if (isSSL) {    internalSocket = std::make_unique<bell::TLSSocket>();  } else {    internalSocket = std::make_unique<bell::TCPSocket>();  }  internalSocket->open(hostname, port);  return 0;}int SocketBuffer::close() {  if (internalSocket != nullptr && isOpen()) {    pubsync();    internalSocket->close();    internalSocket = nullptr;  }  return 0;}int SocketBuffer::sync() {  ssize_t bw, n = pptr() - pbase();  while (n > 0) {    bw = internalSocket->write(reinterpret_cast<uint8_t*>(pptr() - n), n);    if (bw < 0) {      setp(pptr() - n, obuf + bufLen);      pbump(n);      return -1;    }    n -= bw;  }  setp(obuf, obuf + bufLen);  return 0;}SocketBuffer::int_type SocketBuffer::underflow() {  ssize_t br = internalSocket->read(reinterpret_cast<uint8_t*>(ibuf), bufLen);  if (br <= 0) {    setg(NULL, NULL, NULL);    return traits_type::eof();  }  setg(ibuf, ibuf, ibuf + br);  return traits_type::to_int_type(*ibuf);}SocketBuffer::int_type SocketBuffer::overflow(int_type c) {  if (sync() < 0)    return traits_type::eof();  if (traits_type::eq_int_type(c, traits_type::eof()))    return traits_type::not_eof(c);  *pptr() = traits_type::to_char_type(c);  pbump(1);  return c;}std::streamsize SocketBuffer::xsgetn(char_type* __s, std::streamsize __n) {  const std::streamsize bn = egptr() - gptr();  if (__n <= bn) {    traits_type::copy(__s, gptr(), __n);    gbump(__n);    return __n;  }  traits_type::copy(__s, gptr(), bn);  setg(NULL, NULL, NULL);  std::streamsize remain = __n - bn;  char_type* end = __s + __n;  ssize_t br;  while (remain > 0) {    br = internalSocket->read(reinterpret_cast<uint8_t*>(end - remain), remain);    if (br <= 0)      return (__n - remain);    remain -= br;  }  return __n;}std::streamsize SocketBuffer::xsputn(const char_type* __s,                                     std::streamsize __n) {  if (pptr() + __n <= epptr()) {    traits_type::copy(pptr(), __s, __n);    pbump(__n);    return __n;  }  if (sync() < 0)    return 0;  ssize_t bw;  std::streamsize remain = __n;  const char_type* end = __s + __n;  while (remain > bufLen) {    bw = internalSocket->write((uint8_t*)(end - remain), remain);    if (bw < 0)      return (__n - remain);    remain -= bw;  }  if (remain > 0) {    traits_type::copy(pptr(), end - remain, remain);    pbump(remain);  }  return __n;}
 |