/mordor/streams/buffered.h

http://github.com/mozy/mordor · C Header · 65 lines · 40 code · 13 blank · 12 comment · 2 complexity · 30bf23d4deb6a5d03c8385a5aaa916f5 MD5 · raw file

  1. #ifndef __MORDOR_BUFFERED_STREAM_H__
  2. #define __MORDOR_BUFFERED_STREAM_H__
  3. // Copyright (c) 2009 - Mozy, Inc.
  4. #include "buffer.h"
  5. #include "filter.h"
  6. namespace Mordor {
  7. /* NOTE:
  8. * In current implementation, BufferedStream inherits parent stream's
  9. * read-write thread-safe ability only when parent stream is seekless.
  10. * Problem:
  11. * When parent stream is seekable, read() operation will operate both
  12. * m_readBuffer and m_writeBuffer, and so does write(). Read-write
  13. * thread-safe ability can't be held anymore inside BufferedStream itself.
  14. * TODO:
  15. * enhance the implementaton to allow BufferedStream inherits parent stream's
  16. * read-write thread-safe ability also for seekable stream.
  17. */
  18. class BufferedStream : public FilterStream
  19. {
  20. public:
  21. typedef boost::shared_ptr<BufferedStream> ptr;
  22. BufferedStream(Stream::ptr parent, bool own = true);
  23. size_t bufferSize() { return m_bufferSize; }
  24. void bufferSize(size_t bufferSize) { m_bufferSize = bufferSize; }
  25. bool allowPartialReads() { return m_allowPartialReads; }
  26. void allowPartialReads(bool allowPartialReads) { m_allowPartialReads = allowPartialReads; }
  27. bool flushMultiplesOfBuffer() { return m_flushMultiplesOfBuffer; }
  28. void flushMultiplesOfBuffer(bool flushMultiplesOfBuffer ) { m_flushMultiplesOfBuffer = flushMultiplesOfBuffer; }
  29. bool supportsFind() { return supportsRead(); }
  30. bool supportsUnread() { return supportsRead() && (!supportsWrite() || !supportsSeek()); }
  31. void close(CloseType type = BOTH);
  32. size_t read(Buffer &buffer, size_t length);
  33. size_t read(void *buffer, size_t length);
  34. size_t write(const Buffer &buffer, size_t length);
  35. size_t write(const void *buffer, size_t length);
  36. long long seek(long long offset, Anchor anchor = BEGIN);
  37. long long size();
  38. void truncate(long long size);
  39. void flush(bool flushParent = true);
  40. ptrdiff_t find(char delim, size_t sanitySize = ~0, bool throwIfNotFound = true);
  41. ptrdiff_t find(const std::string &str, size_t sanitySize = ~0, bool throwIfNotFound = true);
  42. void unread(const Buffer &b, size_t len = ~0);
  43. private:
  44. template <class T> size_t readInternal(T &buffer, size_t length);
  45. size_t flushWrite(size_t length);
  46. private:
  47. size_t m_bufferSize;
  48. bool m_allowPartialReads, m_flushMultiplesOfBuffer;
  49. Buffer m_readBuffer, m_writeBuffer;
  50. };
  51. }
  52. #endif