| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | 
							- #pragma once
 
- #include <iostream>  // for streamsize, basic_streambuf<>::int_type, ios...
 
- #include <memory>    // for unique_ptr, operator!=
 
- #include <string>    // for char_traits, string
 
- #include "BellSocket.h"  // for Socket
 
- namespace bell {
 
- class SocketBuffer : public std::streambuf {
 
-  private:
 
-   std::unique_ptr<bell::Socket> internalSocket;
 
-   static const int bufLen = 1024;
 
-   char ibuf[bufLen], obuf[bufLen];
 
-  public:
 
-   SocketBuffer() { internalSocket = nullptr; }
 
-   SocketBuffer(const std::string& hostname, int port, bool isSSL = false) {
 
-     open(hostname, port);
 
-   }
 
-   int open(const std::string& hostname, int port, bool isSSL = false);
 
-   int close();
 
-   bool isOpen() {
 
-     return internalSocket != nullptr && internalSocket->isOpen();
 
-   }
 
-   ~SocketBuffer() { close(); }
 
-  protected:
 
-   virtual int sync();
 
-   virtual int_type underflow();
 
-   virtual int_type overflow(int_type c = traits_type::eof());
 
-   virtual std::streamsize xsgetn(char_type* __s, std::streamsize __n);
 
-   virtual std::streamsize xsputn(const char_type* __s, std::streamsize __n);
 
- };
 
- class SocketStream : public std::iostream {
 
-  private:
 
-   SocketBuffer socketBuf;
 
-  public:
 
-   SocketStream() : std::iostream(&socketBuf) {}
 
-   SocketStream(const std::string& hostname, int port, bool isSSL = false)
 
-       : std::iostream(&socketBuf) {
 
-     open(hostname, port, isSSL);
 
-   }
 
-   SocketBuffer* rdbuf() { return &socketBuf; }
 
-   int open(const std::string& hostname, int port, bool isSSL = false) {
 
-     int err = socketBuf.open(hostname, port, isSSL);
 
-     if (err)
 
-       setstate(std::ios::failbit);
 
-     return err;
 
-   }
 
-   int close() { return socketBuf.close(); }
 
-   bool isOpen() { return socketBuf.isOpen(); }
 
- };
 
- }  // namespace bell
 
 
  |