| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | // MGStreamAdapter.cpp#include "MGStreamAdapter.h"mg_buf::mg_buf(struct mg_connection* _conn) : conn(_conn) {  setp(buffer, buffer + BUF_SIZE - 1);  // -1 to leave space for overflow '\0'}mg_buf::int_type mg_buf::overflow(int_type c) {  if (c != EOF) {    *pptr() = c;    pbump(1);  }  if (flush_buffer() == EOF) {    return EOF;  }  return c;}int mg_buf::flush_buffer() {  int len = int(pptr() - pbase());  if (mg_write(conn, buffer, len) != len) {    return EOF;  }  pbump(-len);  // reset put pointer accordingly  return len;}int mg_buf::sync() {  if (flush_buffer() == EOF) {    return -1;  // return -1 on error  }  return 0;}MGStreamAdapter::MGStreamAdapter(struct mg_connection* _conn)    : std::ostream(&buf), buf(_conn) {  rdbuf(&buf);  // set the custom streambuf}mg_read_buf::mg_read_buf(struct mg_connection* _conn) : conn(_conn) {  setg(buffer + BUF_SIZE,   // beginning of putback area       buffer + BUF_SIZE,   // read position       buffer + BUF_SIZE);  // end position}mg_read_buf::int_type mg_read_buf::underflow() {  if (gptr() < egptr()) {  // buffer not exhausted    return traits_type::to_int_type(*gptr());  }  char* base = buffer;  char* start = base;  if (eback() == base) {  // true when this isn't the first fill    // Make arrangements for putback characters    std::memmove(base, egptr() - 2, 2);    start += 2;  }  // Read new characters  int n = mg_read(conn, start, buffer + BUF_SIZE - start);  if (n == 0) {    return traits_type::eof();  }  // Set buffer pointers  setg(base, start, start + n);  // Return next character  return traits_type::to_int_type(*gptr());}MGInputStreamAdapter::MGInputStreamAdapter(struct mg_connection* _conn)    : std::istream(&buf), buf(_conn) {  rdbuf(&buf);  // set the custom streambuf}
 |