1 // Copyright 2017 The PDFium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "core/fxcrt/fx_stream.h" 8 9 #include <memory> 10 #include <utility> 11 12 #include "core/fxcrt/fileaccess_iface.h" 13 14 namespace { 15 16 class CFX_CRTFileStream final : public IFX_SeekableStream { 17 public: 18 CONSTRUCT_VIA_MAKE_RETAIN; 19 20 // IFX_SeekableStream: GetSize()21 FX_FILESIZE GetSize() override { return m_pFile->GetSize(); } IsEOF()22 bool IsEOF() override { return GetPosition() >= GetSize(); } GetPosition()23 FX_FILESIZE GetPosition() override { return m_pFile->GetPosition(); } ReadBlockAtOffset(pdfium::span<uint8_t> buffer,FX_FILESIZE offset)24 bool ReadBlockAtOffset(pdfium::span<uint8_t> buffer, 25 FX_FILESIZE offset) override { 26 return m_pFile->ReadPos(buffer, offset) > 0; 27 } WriteBlock(pdfium::span<const uint8_t> buffer)28 bool WriteBlock(pdfium::span<const uint8_t> buffer) override { 29 if (m_pFile->SetPosition(GetSize()) == static_cast<FX_FILESIZE>(-1)) { 30 return false; 31 } 32 return !!m_pFile->Write(buffer); 33 } Flush()34 bool Flush() override { return m_pFile->Flush(); } 35 36 private: CFX_CRTFileStream(std::unique_ptr<FileAccessIface> pFA)37 explicit CFX_CRTFileStream(std::unique_ptr<FileAccessIface> pFA) 38 : m_pFile(std::move(pFA)) {} 39 ~CFX_CRTFileStream() override = default; 40 41 std::unique_ptr<FileAccessIface> m_pFile; 42 }; 43 44 } // namespace 45 WriteString(ByteStringView str)46bool IFX_WriteStream::WriteString(ByteStringView str) { 47 return WriteBlock(str.unsigned_span()); 48 } 49 WriteByte(uint8_t byte)50bool IFX_WriteStream::WriteByte(uint8_t byte) { 51 return WriteBlock(pdfium::byte_span_from_ref(byte)); 52 } 53 WriteDWord(uint32_t i)54bool IFX_WriteStream::WriteDWord(uint32_t i) { 55 char buf[20] = {}; 56 FXSYS_itoa(i, buf, 10); 57 auto buf_span = pdfium::as_byte_span(buf); 58 return WriteBlock(buf_span.first(strlen(buf))); 59 } 60 WriteFilesize(FX_FILESIZE size)61bool IFX_WriteStream::WriteFilesize(FX_FILESIZE size) { 62 char buf[20] = {}; 63 FXSYS_i64toa(size, buf, 10); 64 return WriteBlock(pdfium::as_writable_byte_span(buf).first(strlen(buf))); 65 } 66 67 // static CreateFromFilename(const char * filename)68RetainPtr<IFX_SeekableReadStream> IFX_SeekableReadStream::CreateFromFilename( 69 const char* filename) { 70 std::unique_ptr<FileAccessIface> pFA = FileAccessIface::Create(); 71 if (!pFA->Open(filename)) 72 return nullptr; 73 return pdfium::MakeRetain<CFX_CRTFileStream>(std::move(pFA)); 74 } 75 IsEOF()76bool IFX_SeekableReadStream::IsEOF() { 77 return false; 78 } 79 GetPosition()80FX_FILESIZE IFX_SeekableReadStream::GetPosition() { 81 return 0; 82 } 83