• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)46 bool IFX_WriteStream::WriteString(ByteStringView str) {
47   return WriteBlock(str.unsigned_span());
48 }
49 
WriteByte(uint8_t byte)50 bool IFX_WriteStream::WriteByte(uint8_t byte) {
51   return WriteBlock(pdfium::byte_span_from_ref(byte));
52 }
53 
WriteDWord(uint32_t i)54 bool 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)61 bool 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)68 RetainPtr<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()76 bool IFX_SeekableReadStream::IsEOF() {
77   return false;
78 }
79 
GetPosition()80 FX_FILESIZE IFX_SeekableReadStream::GetPosition() {
81   return 0;
82 }
83