Home | History | Annotate | Download | only in parser
      1 // Copyright 2016 PDFium Authors. All rights reserved.
      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/fpdfapi/parser/cpdf_stream_acc.h"
      8 
      9 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
     10 
     11 CPDF_StreamAcc::CPDF_StreamAcc()
     12     : m_pData(nullptr),
     13       m_dwSize(0),
     14       m_bNewBuf(false),
     15       m_pImageParam(nullptr),
     16       m_pStream(nullptr),
     17       m_pSrcData(nullptr) {}
     18 
     19 void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream,
     20                                  bool bRawAccess,
     21                                  uint32_t estimated_size,
     22                                  bool bImageAcc) {
     23   if (!pStream)
     24     return;
     25 
     26   m_pStream = pStream;
     27   if (pStream->IsMemoryBased() && (!pStream->HasFilter() || bRawAccess)) {
     28     m_dwSize = pStream->GetRawSize();
     29     m_pData = pStream->GetRawData();
     30     return;
     31   }
     32   uint32_t dwSrcSize = pStream->GetRawSize();
     33   if (dwSrcSize == 0)
     34     return;
     35 
     36   uint8_t* pSrcData;
     37   if (!pStream->IsMemoryBased()) {
     38     pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize);
     39     if (!pStream->ReadRawData(0, pSrcData, dwSrcSize))
     40       return;
     41   } else {
     42     pSrcData = pStream->GetRawData();
     43   }
     44   if (!pStream->HasFilter() || bRawAccess) {
     45     m_pData = pSrcData;
     46     m_dwSize = dwSrcSize;
     47   } else if (!PDF_DataDecode(pSrcData, dwSrcSize, m_pStream->GetDict(), m_pData,
     48                              m_dwSize, m_ImageDecoder, m_pImageParam,
     49                              estimated_size, bImageAcc)) {
     50     m_pData = pSrcData;
     51     m_dwSize = dwSrcSize;
     52   }
     53   if (pSrcData != pStream->GetRawData() && pSrcData != m_pData)
     54     FX_Free(pSrcData);
     55   m_pSrcData = nullptr;
     56   m_bNewBuf = m_pData != pStream->GetRawData();
     57 }
     58 
     59 CPDF_StreamAcc::~CPDF_StreamAcc() {
     60   if (m_bNewBuf)
     61     FX_Free(m_pData);
     62   FX_Free(m_pSrcData);
     63 }
     64 
     65 const uint8_t* CPDF_StreamAcc::GetData() const {
     66   if (m_bNewBuf)
     67     return m_pData;
     68   return m_pStream ? m_pStream->GetRawData() : nullptr;
     69 }
     70 
     71 uint32_t CPDF_StreamAcc::GetSize() const {
     72   if (m_bNewBuf)
     73     return m_dwSize;
     74   return m_pStream ? m_pStream->GetRawSize() : 0;
     75 }
     76 
     77 std::unique_ptr<uint8_t, FxFreeDeleter> CPDF_StreamAcc::DetachData() {
     78   if (m_bNewBuf) {
     79     std::unique_ptr<uint8_t, FxFreeDeleter> p(m_pData);
     80     m_pData = nullptr;
     81     m_dwSize = 0;
     82     return p;
     83   }
     84   std::unique_ptr<uint8_t, FxFreeDeleter> p(FX_Alloc(uint8_t, m_dwSize));
     85   FXSYS_memcpy(p.get(), m_pData, m_dwSize);
     86   return p;
     87 }
     88