diff options
Diffstat (limited to 'core/fpdfapi/parser/cpdf_parser.cpp')
-rw-r--r-- | core/fpdfapi/parser/cpdf_parser.cpp | 116 |
1 files changed, 0 insertions, 116 deletions
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index 32c616c1c6..da51eb1c83 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -1258,122 +1258,6 @@ FX_FILESIZE CPDF_Parser::GetObjectSize(uint32_t objnum) const { return *it - offset; } -std::vector<uint8_t> CPDF_Parser::GetIndirectBinary(uint32_t objnum) { - std::vector<uint8_t> buffer; - if (!IsValidObjectNumber(objnum)) - return buffer; - - if (GetObjectType(objnum) == ObjectType::kCompressed) { - CFX_RetainPtr<CPDF_StreamAcc> pObjStream = - GetObjectStream(m_ObjectInfo[objnum].pos); - if (!pObjStream) - return buffer; - - int32_t offset = GetStreamFirst(pObjStream); - const uint8_t* pData = pObjStream->GetData(); - uint32_t totalsize = pObjStream->GetSize(); - auto file = pdfium::MakeRetain<CFX_MemoryStream>( - const_cast<uint8_t*>(pData), static_cast<size_t>(totalsize), false); - CPDF_SyntaxParser syntax; - syntax.InitParser(file, 0); - - for (int i = GetStreamNCount(pObjStream); i > 0; --i) { - uint32_t thisnum = syntax.GetDirectNum(); - uint32_t thisoff = syntax.GetDirectNum(); - if (thisnum != objnum) - continue; - - size_t size = 0; - if (i == 1) { - size = totalsize - (thisoff + offset); - } else { - syntax.GetDirectNum(); // Skip nextnum. - uint32_t nextoff = syntax.GetDirectNum(); - size = nextoff - thisoff; - } - - buffer.resize(size); - memcpy(buffer.data(), pData + thisoff + offset, size); - break; - } - return buffer; - } - - if (GetObjectType(objnum) != ObjectType::kNotCompressed) - return buffer; - - FX_FILESIZE pos = m_ObjectInfo[objnum].pos; - if (pos == 0) - return buffer; - - FX_FILESIZE SavedPos = m_pSyntax->GetPos(); - m_pSyntax->SetPos(pos); - - bool bIsNumber; - CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); - if (!bIsNumber) { - m_pSyntax->SetPos(SavedPos); - return buffer; - } - - uint32_t parser_objnum = FXSYS_atoui(word.c_str()); - if (parser_objnum && parser_objnum != objnum) { - m_pSyntax->SetPos(SavedPos); - return buffer; - } - - word = m_pSyntax->GetNextWord(&bIsNumber); - if (!bIsNumber) { - m_pSyntax->SetPos(SavedPos); - return buffer; - } - - if (m_pSyntax->GetKeyword() != "obj") { - m_pSyntax->SetPos(SavedPos); - return buffer; - } - - auto it = m_SortedOffset.find(pos); - if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) { - m_pSyntax->SetPos(SavedPos); - return buffer; - } - - FX_FILESIZE nextoff = *it; - bool bNextOffValid = false; - if (nextoff != pos) { - m_pSyntax->SetPos(nextoff); - word = m_pSyntax->GetNextWord(&bIsNumber); - if (word == "xref") { - bNextOffValid = true; - } else if (bIsNumber) { - word = m_pSyntax->GetNextWord(&bIsNumber); - if (bIsNumber && m_pSyntax->GetKeyword() == "obj") { - bNextOffValid = true; - } - } - } - - if (!bNextOffValid) { - m_pSyntax->SetPos(pos); - while (1) { - if (m_pSyntax->GetKeyword() == "endobj") - break; - - if (m_pSyntax->GetPos() == m_pSyntax->m_FileLen) - break; - } - nextoff = m_pSyntax->GetPos(); - } - - size_t size = (uint32_t)(nextoff - pos); - buffer.resize(size); - m_pSyntax->SetPos(pos); - m_pSyntax->ReadBlock(buffer.data(), size); - m_pSyntax->SetPos(SavedPos); - return buffer; -} - std::unique_ptr<CPDF_Object> CPDF_Parser::ParseIndirectObjectAt( CPDF_IndirectObjectHolder* pObjList, FX_FILESIZE pos, |