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 TLSSocket
- using 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;
- }
|