MGStreamAdapter.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // MGStreamAdapter.cpp
  2. #include "MGStreamAdapter.h"
  3. mg_buf::mg_buf(struct mg_connection* _conn) : conn(_conn) {
  4. setp(buffer, buffer + BUF_SIZE - 1); // -1 to leave space for overflow '\0'
  5. }
  6. mg_buf::int_type mg_buf::overflow(int_type c) {
  7. if (c != EOF) {
  8. *pptr() = c;
  9. pbump(1);
  10. }
  11. if (flush_buffer() == EOF) {
  12. return EOF;
  13. }
  14. return c;
  15. }
  16. int mg_buf::flush_buffer() {
  17. int len = int(pptr() - pbase());
  18. if (mg_write(conn, buffer, len) != len) {
  19. return EOF;
  20. }
  21. pbump(-len); // reset put pointer accordingly
  22. return len;
  23. }
  24. int mg_buf::sync() {
  25. if (flush_buffer() == EOF) {
  26. return -1; // return -1 on error
  27. }
  28. return 0;
  29. }
  30. MGStreamAdapter::MGStreamAdapter(struct mg_connection* _conn) : std::ostream(&buf), buf(_conn) {
  31. rdbuf(&buf); // set the custom streambuf
  32. }
  33. mg_read_buf::mg_read_buf(struct mg_connection* _conn) : conn(_conn) {
  34. setg(buffer + BUF_SIZE, // beginning of putback area
  35. buffer + BUF_SIZE, // read position
  36. buffer + BUF_SIZE); // end position
  37. }
  38. mg_read_buf::int_type mg_read_buf::underflow() {
  39. if (gptr() < egptr()) { // buffer not exhausted
  40. return traits_type::to_int_type(*gptr());
  41. }
  42. char* base = buffer;
  43. char* start = base;
  44. if (eback() == base) { // true when this isn't the first fill
  45. // Make arrangements for putback characters
  46. std::memmove(base, egptr() - 2, 2);
  47. start += 2;
  48. }
  49. // Read new characters
  50. int n = mg_read(conn, start, buffer + BUF_SIZE - start);
  51. if (n == 0) {
  52. return traits_type::eof();
  53. }
  54. // Set buffer pointers
  55. setg(base, start, start + n);
  56. // Return next character
  57. return traits_type::to_int_type(*gptr());
  58. }
  59. MGInputStreamAdapter::MGInputStreamAdapter(struct mg_connection* _conn) : std::istream(&buf), buf(_conn) {
  60. rdbuf(&buf); // set the custom streambuf
  61. }