123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #ifndef ECFIFOBUFFER_H
- #define ECFIFOBUFFER_H
- #include <kopano/zcdefs.h>
- #include <condition_variable>
- #include <deque>
- #include <mutex>
- #include <kopano/kcodes.h>
- namespace KC {
- class _kc_export ECFifoBuffer _kc_final {
- public:
- typedef std::deque<unsigned char> storage_type;
- typedef storage_type::size_type size_type;
- enum close_flags { cfRead = 1, cfWrite = 2 };
- ECFifoBuffer(size_type ulMaxSize = 131072);
- ECRESULT Write(const void *lpBuf, size_type cbBuf, unsigned int ulTimeoutMs, size_type *lpcbWritten);
- ECRESULT Read(void *lpBuf, size_type cbBuf, unsigned int ulTimeoutMs, size_type *lpcbRead);
- ECRESULT Close(close_flags flags);
- _kc_hidden ECRESULT Flush(void);
- _kc_hidden bool IsClosed(ULONG flags) const;
- _kc_hidden bool IsEmpty(void) const;
- _kc_hidden bool IsFull(void) const;
-
- private:
-
- ECFifoBuffer(const ECFifoBuffer &) = delete;
- ECFifoBuffer &operator=(const ECFifoBuffer &) = delete;
-
- storage_type m_storage;
- size_type m_ulMaxSize;
- bool m_bReaderClosed = false, m_bWriterClosed = false;
- std::mutex m_hMutex;
- std::condition_variable m_hCondNotEmpty, m_hCondNotFull, m_hCondFlushed;
- };
- inline bool ECFifoBuffer::IsClosed(ULONG flags) const {
- switch (flags) {
- case cfRead:
- return m_bReaderClosed;
- case cfWrite:
- return m_bWriterClosed;
- case cfRead|cfWrite:
- return m_bReaderClosed && m_bWriterClosed;
- default:
- assert(false);
- return false;
- }
- }
- inline bool ECFifoBuffer::IsEmpty() const {
- return m_storage.empty();
- }
- inline bool ECFifoBuffer::IsFull() const {
- return m_storage.size() == m_ulMaxSize;
- }
- }
- #endif
|