| // Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights |
| // reserved. Use of this source code is governed by a BSD-style license that |
| // can be found in the LICENSE file. |
| |
| #ifndef CEF_LIBCEF_BROWSER_STREAM_IMPL_H_ |
| #define CEF_LIBCEF_BROWSER_STREAM_IMPL_H_ |
| #pragma once |
| |
| #include "include/cef_stream.h" |
| |
| #include <stdio.h> |
| #include <string> |
| |
| #include "base/synchronization/lock.h" |
| |
| // Implementation of CefStreamReader for files. |
| class CefFileReader : public CefStreamReader { |
| public: |
| CefFileReader(FILE* file, bool close); |
| ~CefFileReader() override; |
| |
| size_t Read(void* ptr, size_t size, size_t n) override; |
| int Seek(int64 offset, int whence) override; |
| int64 Tell() override; |
| int Eof() override; |
| bool MayBlock() override { return true; } |
| |
| protected: |
| bool close_; |
| FILE* file_; |
| |
| base::Lock lock_; |
| |
| IMPLEMENT_REFCOUNTING(CefFileReader); |
| }; |
| |
| // Implementation of CefStreamWriter for files. |
| class CefFileWriter : public CefStreamWriter { |
| public: |
| CefFileWriter(FILE* file, bool close); |
| ~CefFileWriter() override; |
| |
| size_t Write(const void* ptr, size_t size, size_t n) override; |
| int Seek(int64 offset, int whence) override; |
| int64 Tell() override; |
| int Flush() override; |
| bool MayBlock() override { return true; } |
| |
| protected: |
| FILE* file_; |
| bool close_; |
| |
| base::Lock lock_; |
| |
| IMPLEMENT_REFCOUNTING(CefFileWriter); |
| }; |
| |
| // Implementation of CefStreamReader for byte buffers. |
| class CefBytesReader : public CefStreamReader { |
| public: |
| CefBytesReader(void* data, int64 datasize, bool copy); |
| ~CefBytesReader() override; |
| |
| size_t Read(void* ptr, size_t size, size_t n) override; |
| int Seek(int64 offset, int whence) override; |
| int64 Tell() override; |
| int Eof() override; |
| bool MayBlock() override { return false; } |
| |
| void SetData(void* data, int64 datasize, bool copy); |
| |
| void* GetData() { return data_; } |
| size_t GetDataSize() { return offset_; } |
| |
| protected: |
| void* data_; |
| int64 datasize_; |
| bool copy_; |
| int64 offset_; |
| |
| base::Lock lock_; |
| |
| IMPLEMENT_REFCOUNTING(CefBytesReader); |
| }; |
| |
| // Implementation of CefStreamWriter for byte buffers. |
| class CefBytesWriter : public CefStreamWriter { |
| public: |
| explicit CefBytesWriter(size_t grow); |
| ~CefBytesWriter() override; |
| |
| size_t Write(const void* ptr, size_t size, size_t n) override; |
| int Seek(int64 offset, int whence) override; |
| int64 Tell() override; |
| int Flush() override; |
| bool MayBlock() override { return false; } |
| |
| void* GetData() { return data_; } |
| int64 GetDataSize() { return offset_; } |
| std::string GetDataString(); |
| |
| protected: |
| size_t Grow(size_t size); |
| |
| size_t grow_; |
| void* data_; |
| int64 datasize_; |
| int64 offset_; |
| |
| base::Lock lock_; |
| |
| IMPLEMENT_REFCOUNTING(CefBytesWriter); |
| }; |
| |
| // Implementation of CefStreamReader for handlers. |
| class CefHandlerReader : public CefStreamReader { |
| public: |
| explicit CefHandlerReader(CefRefPtr<CefReadHandler> handler) |
| : handler_(handler) {} |
| |
| size_t Read(void* ptr, size_t size, size_t n) override { |
| return handler_->Read(ptr, size, n); |
| } |
| int Seek(int64 offset, int whence) override { |
| return handler_->Seek(offset, whence); |
| } |
| int64 Tell() override { return handler_->Tell(); } |
| int Eof() override { return handler_->Eof(); } |
| bool MayBlock() override { return handler_->MayBlock(); } |
| |
| protected: |
| CefRefPtr<CefReadHandler> handler_; |
| |
| IMPLEMENT_REFCOUNTING(CefHandlerReader); |
| }; |
| |
| // Implementation of CefStreamWriter for handlers. |
| class CefHandlerWriter : public CefStreamWriter { |
| public: |
| explicit CefHandlerWriter(CefRefPtr<CefWriteHandler> handler) |
| : handler_(handler) {} |
| |
| size_t Write(const void* ptr, size_t size, size_t n) override { |
| return handler_->Write(ptr, size, n); |
| } |
| int Seek(int64 offset, int whence) override { |
| return handler_->Seek(offset, whence); |
| } |
| int64 Tell() override { return handler_->Tell(); } |
| int Flush() override { return handler_->Flush(); } |
| bool MayBlock() override { return handler_->MayBlock(); } |
| |
| protected: |
| CefRefPtr<CefWriteHandler> handler_; |
| |
| IMPLEMENT_REFCOUNTING(CefHandlerWriter); |
| }; |
| |
| #endif // CEF_LIBCEF_BROWSER_STREAM_IMPL_H_ |