751 size_t len; |
751 size_t len; |
752 const char* str = do_vsnprintf(_buffer, _buflen, format, argptr, true, len); |
752 const char* str = do_vsnprintf(_buffer, _buflen, format, argptr, true, len); |
753 write(str, len); |
753 write(str, len); |
754 } |
754 } |
755 |
755 |
756 bufferedStream::bufferedStream(size_t initial_size) : outputStream() { |
756 bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() { |
757 buffer_length = initial_size; |
757 buffer_length = initial_size; |
758 buffer = NEW_C_HEAP_ARRAY(char, buffer_length); |
758 buffer = NEW_C_HEAP_ARRAY(char, buffer_length); |
759 buffer_pos = 0; |
759 buffer_pos = 0; |
760 buffer_fixed = false; |
760 buffer_fixed = false; |
761 } |
761 buffer_max = bufmax; |
762 |
762 } |
763 bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size) : outputStream() { |
763 |
|
764 bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax) : outputStream() { |
764 buffer_length = fixed_buffer_size; |
765 buffer_length = fixed_buffer_size; |
765 buffer = fixed_buffer; |
766 buffer = fixed_buffer; |
766 buffer_pos = 0; |
767 buffer_pos = 0; |
767 buffer_fixed = true; |
768 buffer_fixed = true; |
|
769 buffer_max = bufmax; |
768 } |
770 } |
769 |
771 |
770 void bufferedStream::write(const char* s, size_t len) { |
772 void bufferedStream::write(const char* s, size_t len) { |
|
773 |
|
774 if(buffer_pos + len > buffer_max) { |
|
775 flush(); |
|
776 } |
|
777 |
771 size_t end = buffer_pos + len; |
778 size_t end = buffer_pos + len; |
772 if (end >= buffer_length) { |
779 if (end >= buffer_length) { |
773 if (buffer_fixed) { |
780 if (buffer_fixed) { |
774 // if buffer cannot resize, silently truncate |
781 // if buffer cannot resize, silently truncate |
775 len = buffer_length - buffer_pos - 1; |
782 len = buffer_length - buffer_pos - 1; |
829 return hpi::recv(_socket, buf, (int)len, 0); |
836 return hpi::recv(_socket, buf, (int)len, 0); |
830 } |
837 } |
831 |
838 |
832 void networkStream::flush() { |
839 void networkStream::flush() { |
833 if (size() != 0) { |
840 if (size() != 0) { |
834 hpi::send(_socket, (char *)base(), (int)size(), 0); |
841 int result = hpi::raw_send(_socket, (char *)base(), (int)size(), 0); |
|
842 assert(result != -1, "connection error"); |
|
843 assert(result == (int)size(), "didn't send enough data"); |
835 } |
844 } |
836 reset(); |
845 reset(); |
837 } |
846 } |
838 |
847 |
839 networkStream::~networkStream() { |
848 networkStream::~networkStream() { |