1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_parser.h" 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_module.h" 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_page.h" 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../fpdf_page/pageint.h" 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <limits.h> 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _PARSER_OBJECT_LEVLE_ 64 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern const FX_LPCSTR _PDF_CharType; 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type")); 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pType) { 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pType = pDict->GetElementValue(FX_BSTRC("FT")); 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pType) { 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pType->GetString() == FX_BSTRC("Sig")) { 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_INT32 _CompareDWord(const void* p1, const void* p2) 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2); 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int _CompareFileSize(const void* p1, const void* p2) 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret > 0) { 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ret < 0) { 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Parser::CPDF_Parser() 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = NULL; 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = NULL; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pEncryptDict = NULL; 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pSecurityHandler = NULL; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized = NULL; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwFirstPageNo = 0; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwXrefStartObjNum = 0; 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bOwnFileRead = TRUE; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bForceUseSecurityHandler = FALSE; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Parser::~CPDF_Parser() 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CloseParser(FALSE); 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetLastObjNum() 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwSize = m_CrossRef.GetSize(); 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwSize ? dwSize - 1 : 0; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict) 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pEncryptDict = pDict; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::CloseParser(FX_BOOL bReParse) 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bVersionUpdated = FALSE; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument && !bReParse) { 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pDocument; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = NULL; 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer) { 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer->Release(); 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = NULL; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseEncryptHandler(); 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetEncryptDictionary(NULL); 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bOwnFileRead && m_Syntax.m_pFileAccess != NULL) { 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_pFileAccess->Release(); 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_pFileAccess = NULL; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = m_ObjectStreamMap.GetStartPosition(); 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID objnum; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_StreamAcc* pStream; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream); 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pStream; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjectStreamMap.RemoveAll(); 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.RemoveAll(); 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.RemoveAll(); 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.RemoveAll(); 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjVersion.RemoveAll(); 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iLen = m_Trailers.GetSize(); 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < iLen; ++i) { 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Trailers.GetAt(i)->Release(); 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Trailers.RemoveAll(); 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pLinearized) { 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized->Release(); 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized = NULL; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_INT32 GetHeaderOffset(IFX_FileRead* pFile) 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE buf[4]; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = 0; 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFile->ReadBlock(buf, offset, 4)) { 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*(FX_DWORD*)buf == tag) { 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return offset; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset ++; 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset > 1024) { 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartParse(FX_LPCSTR filename, FX_BOOL bReParse) 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_FileRead* pFileAccess = FX_CreateFileRead(filename); 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFileAccess) { 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FILE; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartParse(pFileAccess, bReParse); 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartParse(FX_LPCWSTR filename, FX_BOOL bReParse) 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_FileRead* pFileAccess = FX_CreateFileRead(filename); 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFileAccess) { 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FILE; 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartParse(pFileAccess, bReParse); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler(); 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*); 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CloseParser(bReParse); 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bXRefStream = FALSE; 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = 0; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bOwnFileRead = bOwnFileRead; 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = GetHeaderOffset(pFileAccess); 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == -1) { 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bOwnFileRead && pFileAccess) { 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFileAccess->Release(); 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.InitParser(pFileAccess, offset); 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.GetCharAt(5, ch); 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FileVersion = (ch - '0') * 10; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.GetCharAt(7, ch); 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FileVersion += ch - '0'; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bReParse) { 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = FX_NEW CPDF_Document(this); 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bXRefRebuilt = FALSE; 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) { 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE startxref_offset = m_Syntax.SavePos(); 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(startxref_offset); 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.GetKeyword(); 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNumber; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bNumber) { 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadAllCrossRefV4(m_LastXRefOffset) && !LoadAllCrossRefV5(m_LastXRefOffset)) { 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!RebuildCrossRef()) { 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bXRefRebuilt = TRUE; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = 0; 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!RebuildCrossRef()) { 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bXRefRebuilt = TRUE; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwRet = SetEncryptHandler(); 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet != PDFPARSE_ERROR_SUCCESS) { 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwRet; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->LoadDoc(); 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) { 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bXRefRebuilt) { 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseEncryptHandler(); 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!RebuildCrossRef()) { 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwRet = SetEncryptHandler(); 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet != PDFPARSE_ERROR_SUCCESS) { 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwRet; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->LoadDoc(); 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument->GetRoot() == NULL) { 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD RootObjNum = GetRootObjNum(); 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (RootObjNum == 0) { 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseEncryptHandler(); 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RebuildCrossRef(); 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RootObjNum = GetRootObjNum(); 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (RootObjNum == 0) { 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwRet = SetEncryptHandler(); 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet != PDFPARSE_ERROR_SUCCESS) { 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwRet; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata")); 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) { 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_SUCCESS; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::SetEncryptHandler() 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseEncryptHandler(); 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetEncryptDictionary(NULL); 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer == NULL) { 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pEncryptObj = m_pTrailer->GetElement(FX_BSTRC("Encrypt")); 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEncryptObj) { 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEncryptObj->GetType() == PDFOBJ_DICTIONARY) { 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetEncryptDictionary((CPDF_Dictionary*)pEncryptObj); 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (pEncryptObj->GetType() == PDFOBJ_REFERENCE) { 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pEncryptObj = m_pDocument->GetIndirectObject(((CPDF_Reference*)pEncryptObj)->GetRefObjNum()); 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEncryptObj) { 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetEncryptDictionary(pEncryptObj->GetDict()); 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bForceUseSecurityHandler) { 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD err = PDFPARSE_ERROR_HANDLER; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pSecurityHandler == NULL) { 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_HANDLER; 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) { 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return err; 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_CryptoHandler* pCryptoHandler = m_pSecurityHandler->CreateCryptoHandler(); 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) { 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pCryptoHandler; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCryptoHandler = NULL; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_HANDLER; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.SetEncrypt(pCryptoHandler); 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_pEncryptDict) { 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString filter = m_pEncryptDict->GetString(FX_BSTRC("Filter")); 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_SecurityHandler* pSecurityHandler = NULL; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD err = PDFPARSE_ERROR_HANDLER; 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (filter == FX_BSTRC("Standard")) { 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSecurityHandler = FPDF_CreateStandardSecurityHandler(); 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov err = PDFPARSE_ERROR_PASSWORD; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSecurityHandler == NULL) { 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_HANDLER; 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) { 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pSecurityHandler; 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pSecurityHandler = NULL; 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return err; 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pSecurityHandler = pSecurityHandler; 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_CryptoHandler* pCryptoHandler = pSecurityHandler->CreateCryptoHandler(); 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) { 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pCryptoHandler; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCryptoHandler = NULL; 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_HANDLER; 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.SetEncrypt(pCryptoHandler); 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_SUCCESS; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::ReleaseEncryptHandler() 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.m_pCryptoHandler) { 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_Syntax.m_pCryptoHandler; 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_pCryptoHandler = NULL; 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pSecurityHandler && !m_bForceUseSecurityHandler) { 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pSecurityHandler; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pSecurityHandler = NULL; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 1) { 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_CrossRef[objnum]; 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 2) { 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_CrossRef[(FX_INT32)m_CrossRef[objnum]]; 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_INT32 GetDirectInteger(CPDF_Dictionary* pDict, FX_BSTR key) 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = pDict->GetElement(key); 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj == NULL) { 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj->GetType() == PDFOBJ_NUMBER) { 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ((CPDF_Number*)pObj)->GetInteger(); 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL CheckDirectType(CPDF_Dictionary* pDict, FX_BSTR key, FX_INT32 iType) 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = pDict->GetElement(key); 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pObj) { 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pObj->GetType() == iType; 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) { 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = LoadTrailerV4(); 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer == NULL) { 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (xrefsize <= 0 || xrefsize > (1 << 20)) { 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetSize(xrefsize); 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.SetSize(xrefsize); 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FileSizeArray CrossRefList, XRefStreamList; 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CrossRefList.Add(xrefpos); 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm"))); 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckDirectType(m_pTrailer, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) { 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE newxrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev")); 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (newxrefpos == xrefpos) { 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xrefpos = newxrefpos; 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (xrefpos) { 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CrossRefList.InsertAt(0, xrefpos); 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadCrossRefV4(xrefpos, 0, TRUE, FALSE); 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = LoadTrailerV4(); 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL) { 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckDirectType(pDict, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) { 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->Release(); 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newxrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev")); 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (newxrefpos == xrefpos) { 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->Release(); 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xrefpos = newxrefpos; 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm"))); 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Trailers.Add(pDict); 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < CrossRefList.GetSize(); i ++) 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) { 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, FX_DWORD dwObjCount) 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) { 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = LoadTrailerV4(); 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer == NULL) { 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (xrefsize == 0) { 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FileSizeArray CrossRefList, XRefStreamList; 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CrossRefList.Add(xrefpos); 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm"))); 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev")); 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (xrefpos) { 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CrossRefList.InsertAt(0, xrefpos); 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LoadCrossRefV4(xrefpos, 0, TRUE, FALSE); 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = LoadTrailerV4(); 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL) { 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev")); 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm"))); 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Trailers.Add(pDict); 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 1; i < CrossRefList.GetSize(); i ++) 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) { 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount) 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(dwStartPos); 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(pos); 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD start_objnum = 0; 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD count = dwObjCount; 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Syntax.SavePos(); 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 recordsize = 20; 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBuf[1024 * recordsize] = '\0'; 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nBlocks = count / 1024 + 1; 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 block = 0; block < nBlocks; block ++) { 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024; 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwReadSize = block_size * recordsize; 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) { 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pBuf); 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_Syntax.ReadBlock((FX_LPBYTE)pBuf, dwReadSize)) { 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pBuf); 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < block_size; i ++) { 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum = start_objnum + block * 1024 + i; 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* pEntry = pBuf + i * recordsize; 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEntry[17] == 'f') { 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetAtGrow(objnum, 0); 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.SetAtGrow(objnum, 0); 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = FXSYS_atoi(pEntry); 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == 0) { 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 c = 0; c < 10; c ++) { 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEntry[c] < '0' || pEntry[c] > '9') { 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pBuf); 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetAtGrow(objnum, offset); 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 version = FXSYS_atoi(pEntry + 11); 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (version >= 1) { 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bVersionUpdated = TRUE; 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjVersion.SetAtGrow(objnum, version); 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(m_CrossRef[objnum]); 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.SetAtGrow(objnum, 1); 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pBuf); 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos + count * recordsize); 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst) 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos); 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.GetKeyword() != FX_BSTRC("xref")) { 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(pos); 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (streampos) { 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&streampos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(streampos); 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Syntax.SavePos(); 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word.IsEmpty()) { 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD start_objnum = FXSYS_atoi(word); 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (start_objnum >= (1 << 20)) { 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD count = m_Syntax.GetDirectNum(); 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.ToNextWord(); 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SavedPos = m_Syntax.SavePos(); 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFirstItem = FALSE; 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 recordsize = 20; 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFirst) { 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFirstItem = TRUE; 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwXrefStartObjNum = start_objnum; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bSkip) { 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBuf[1024 * recordsize] = '\0'; 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nBlocks = count / 1024 + 1; 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFirstBlock = TRUE; 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 block = 0; block < nBlocks; block ++) { 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024; 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.ReadBlock((FX_LPBYTE)pBuf, block_size * recordsize); 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < block_size; i ++) { 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum = start_objnum + block * 1024 + i; 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* pEntry = pBuf + i * recordsize; 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEntry[17] == 'f') { 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFirstItem) { 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objnum = 0; 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFirstItem = FALSE; 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFirstBlock) { 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 version = FXSYS_atoi(pEntry + 11); 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == 0 && version == 65535 && start_objnum != 0) { 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_objnum--; 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objnum = 0; 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetAtGrow(objnum, 0); 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.SetAtGrow(objnum, 0); 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == 0) { 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 c = 0; c < 10; c ++) { 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEntry[c] < '0' || pEntry[c] > '9') { 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pBuf); 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetAtGrow(objnum, offset); 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 version = FXSYS_atoi(pEntry + 11); 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (version >= 1) { 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bVersionUpdated = TRUE; 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjVersion.SetAtGrow(objnum, version); 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(m_CrossRef[objnum]); 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.SetAtGrow(objnum, 1); 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFirstBlock) { 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFirstBlock = FALSE; 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pBuf); 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos + count * recordsize); 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (streampos) 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV5(streampos, streampos, FALSE)) { 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos) 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) { 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (xrefpos) 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) { 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjectStreamMap.InitHashTable(101, FALSE); 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bXRefStream = TRUE; 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::RebuildCrossRef() 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.RemoveAll(); 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.RemoveAll(); 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.RemoveAll(); 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjVersion.RemoveAll(); 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer) { 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer->Release(); 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = NULL; 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 status = 0; 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 inside_index = 0; 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum, gennum; 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 depth = 0; 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE buffer = FX_Alloc(FX_BYTE, 4096); 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_Syntax.m_HeaderOffset; 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE start_pos, start_pos1; 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1; 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bInUpdate = FALSE; 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos < m_Syntax.m_FileLen) { 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bOverFlow = FALSE; 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos); 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (size > 4096) { 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = 4096; 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < size; i ++) { 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE byte = buffer[i]; 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pData = buffer + i; 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (status) { 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (_PDF_CharType[byte] == 'W') { 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 1; 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte <= '9' && byte >= '0') { 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 1; 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == '%') { 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 0; 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 9; 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == '(') { 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 10; 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov depth = 1; 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == '<') { 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 1; 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 11; 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == '\\') { 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 13; 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == 't') { 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 7; 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 1; 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (_PDF_CharType[byte] == 'W') { 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte <= '9' && byte >= '0') { 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_pos = pos + i; 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 2; 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objnum = byte - '0'; 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == 't') { 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 7; 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 1; 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == 'x') { 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 8; 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 1; 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte <= '9' && byte >= '0') { 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objnum = objnum * 10 + byte - '0'; 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (_PDF_CharType[byte] == 'W') { 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 3; 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 14; 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 0; 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 3: 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte <= '9' && byte >= '0') { 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_pos1 = pos + i; 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 4; 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov gennum = byte - '0'; 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (_PDF_CharType[byte] == 'W') { 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == 't') { 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 7; 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 1; 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 4: 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte <= '9' && byte >= '0') { 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov gennum = gennum * 10 + byte - '0'; 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (_PDF_CharType[byte] == 'W') { 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 5; 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 5: 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == 'o') { 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 6; 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 1; 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (_PDF_CharType[byte] == 'W') { 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte <= '9' && byte >= '0') { 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objnum = gennum; 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov gennum = byte - '0'; 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_pos = start_pos1; 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_pos1 = pos + i; 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 4; 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == 't') { 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 7; 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 1; 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 6: 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (inside_index) { 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte != 'b') { 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index ++; 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte != 'j') { 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index ++; 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 3: 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') { 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum > 0x1000000) { 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset; 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_obj = start_pos; 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(obj_pos); 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE obj_end = 0; 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pObject = ParseIndirectObjectAtByStrict(m_pDocument, obj_pos, objnum, NULL, &obj_end); 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObject) { 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int iType = pObject->GetType(); 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iType == PDFOBJ_STREAM) { 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pStream = (CPDF_Stream*)pObject; 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = pStream->GetDict(); 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict) { 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict->KeyExist(FX_BSTRC("Type"))) { 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString bsValue = pDict->GetString(FX_BSTRC("Type")); 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bsValue == FX_BSTRC("XRef") && pDict->KeyExist(FX_BSTRC("Size"))) { 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pRoot = pDict->GetElement(FX_BSTRC("Root")); 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pRoot && pRoot->GetDict() && pRoot->GetDict()->GetElement(FX_BSTRC("Pages"))) { 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer) { 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer->Release(); 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = (CPDF_Dictionary*)pDict->Clone(); 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = 0; 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(obj_pos); 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = m_Syntax.FindTag(FX_BSTRC("obj"), 0); 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == -1) { 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = 0; 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset += 3; 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE nLen = obj_end - obj_pos - offset; 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_DWORD)nLen > size - i) { 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos = obj_end + m_Syntax.m_HeaderOffset; 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bOverFlow = TRUE; 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i += (FX_DWORD)nLen; 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_CrossRef.GetSize() > (FX_INT32)objnum && m_CrossRef[objnum]) { 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObject) { 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD oldgen = m_ObjVersion.GetAt(objnum); 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef[objnum] = obj_pos; 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjVersion.SetAt(objnum, (FX_SHORT)gennum); 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (oldgen != gennum) { 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bVersionUpdated = TRUE; 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetAtGrow(objnum, obj_pos); 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.SetAtGrow(objnum, 1); 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjVersion.SetAtGrow(objnum, (FX_SHORT)gennum); 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObject) { 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObject->Release(); 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 7: 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (inside_index == 7) { 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') { 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_trailer = pos + i - 7; 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffset); 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0); 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj) { 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj->GetType() != PDFOBJ_DICTIONARY && pObj->GetType() != PDFOBJ_STREAM) { 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pTrailer = NULL; 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj->GetType() == PDFOBJ_STREAM) { 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTrailer = ((CPDF_Stream*)pObj)->GetDict(); 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTrailer = (CPDF_Dictionary*)pObj; 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pTrailer) { 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer) { 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pRoot = pTrailer->GetElement(FX_BSTRC("Root")); 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pRoot == NULL || (pRoot->GetType() == PDFOBJ_REFERENCE && 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FX_DWORD)m_CrossRef.GetSize() > ((CPDF_Reference*)pRoot)->GetRefObjNum() && 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.GetAt(((CPDF_Reference*)pRoot)->GetRefObjNum()) != 0)) { 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = pTrailer->GetStartPos(); 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString key; 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = pTrailer->GetNextElement(pos, key); 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer->SetAt(key, pObj->Clone(), m_pDocument); 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj->GetType() == PDFOBJ_STREAM) { 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = (CPDF_Dictionary*)pTrailer->Clone(); 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = pTrailer; 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSavePos = m_Syntax.SavePos(); 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString strWord = m_Syntax.GetKeyword(); 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!strWord.Compare(FX_BSTRC("startxref"))) { 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNumber = FALSE; 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber); 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNumber) { 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = FXSYS_atoi(bsOffset); 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(dwSavePos); 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bInUpdate = TRUE; 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == "trailer"[inside_index]) { 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index ++; 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 8: 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (inside_index == 4) { 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_xref = pos + i - 4; 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 1; 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == "xref"[inside_index]) { 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index ++; 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 9: 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == '\r' || byte == '\n') { 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 10: 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == ')') { 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (depth > 0) { 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov depth--; 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == '(') { 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov depth++; 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!depth) { 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 11: 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == '<' && inside_index == 1) { 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 12; 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == '>') { 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index = 0; 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 12: 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 13: 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (_PDF_CharType[byte] == 'D' || _PDF_CharType[byte] == 'W') { 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 14: 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (_PDF_CharType[byte] == 'W') { 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == '%' || byte == '(' || byte == '<' || byte == '\\') { 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (inside_index == 6) { 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte == "endobj"[inside_index]) { 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inside_index++; 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bOverFlow) { 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = 0; 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos += size; 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (last_xref != -1 && last_xref > last_obj) { 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_trailer = last_xref; 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (last_trailer == -1 || last_xref < last_obj) { 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_trailer = m_Syntax.m_FileLen; 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset; 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(offset); 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(buffer); 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_DWORD _GetVarInt(FX_LPCBYTE p, FX_INT32 n) 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD result = 0; 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < n; i ++) { 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = result * 256 + p[i]; 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef) 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pStream = (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos, 0, NULL); 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pStream) { 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument) { 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->InsertIndirectObject(pStream->m_ObjNum, pStream); 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStream->GetType() != PDFOBJ_STREAM) { 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev = pStream->GetDict()->GetInteger(FX_BSTRC("Prev")); 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 size = pStream->GetDict()->GetInteger(FX_BSTRC("Size")); 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (size < 0) { 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream->Release(); 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bMainXRef) { 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone(); 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetSize(size); 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type.SetSize(size)) { 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(m_V5Type.GetData(), 0, size); 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone()); 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DWordArray IndexArray, WidthArray; 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD nSegs = 0; 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC("Index")); 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IndexArray.Add(0); 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IndexArray.Add(size); 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nSegs = 1; 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IndexArray.Add(pArray->GetInteger(i)); 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nSegs = pArray->GetCount() / 2; 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray = pStream->GetDict()->GetArray(FX_BSTRC("W")); 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) { 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream->Release(); 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD totalwidth = 0; 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD i; 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < pArray->GetCount(); i ++) { 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov WidthArray.Add(pArray->GetInteger(i)); 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (totalwidth + WidthArray[i] < totalwidth) { 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream->Release(); 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov totalwidth += WidthArray[i]; 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (totalwidth == 0 || WidthArray.GetSize() < 3) { 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream->Release(); 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_StreamAcc acc; 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov acc.LoadAllData(pStream); 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pData = acc.GetData(); 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwTotalSize = acc.GetSize(); 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD segindex = 0; 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < nSegs; i ++) { 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 startnum = IndexArray[i * 2]; 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (startnum < 0) { 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwXrefStartObjNum = startnum; 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD count = IndexArray[i * 2 + 1]; 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (segindex + count < segindex || segindex + count == 0 || 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FX_DWORD)totalwidth >= UINT_MAX / (segindex + count) || (segindex + count) * (FX_DWORD)totalwidth > dwTotalSize) { 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE segstart = pData + segindex * (FX_DWORD)totalwidth; 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_DWORD)startnum + count < (FX_DWORD)startnum || 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FX_DWORD)startnum + count > (FX_DWORD)m_V5Type.GetSize()) { 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD j = 0; j < count; j ++) { 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 type = 1; 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE entrystart = segstart + j * totalwidth; 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (WidthArray[0]) { 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _GetVarInt(entrystart, WidthArray[0]); 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[startnum + j] == 255) { 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]); 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef[startnum + j] = offset; 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(offset); 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[startnum + j]) { 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type[startnum + j] = type; 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 0) { 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef[startnum + j] = 0; 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]); 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef[startnum + j] = offset; 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 1) { 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SortedOffset.Add(offset); 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset < 0 || offset >= m_V5Type.GetSize()) { 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream->Release(); 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type[offset] = 255; 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov segindex += count; 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream->Release(); 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Array* CPDF_Parser::GetIDArray() 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pID = m_pTrailer->GetElement(FX_BSTRC("ID")); 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pID == NULL) { 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pID->GetType() == PDFOBJ_REFERENCE) { 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pID = ParseIndirectObject(NULL, ((CPDF_Reference*)pID)->GetRefObjNum()); 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer->SetAt(FX_BSTRC("ID"), pID); 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pID == NULL || pID->GetType() != PDFOBJ_ARRAY) { 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Array*)pID; 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetRootObjNum() 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Root")); 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) { 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRef->GetRefObjNum(); 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetInfoObjNum() 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Info")); 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) { 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRef->GetRefObjNum(); 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bForm = FALSE; 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 0) { 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 2) { 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_CrossRef[objnum]; 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) { 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos; 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos); 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bForm = m_Syntax.SearchMultiWord(FX_BSTRC("/Form\0stream"), TRUE, size) == 0; 1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext) 1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { 1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) { 1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_CrossRef[objnum]; 1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos <= 0) { 1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ParseIndirectObjectAt(pObjList, pos, objnum, pContext); 1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 2) { 1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]); 1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObjStream == NULL) { 1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N")); 1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); 1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_SyntaxParser syntax; 1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE)); 1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov syntax.InitParser((IFX_FileStream*)file, 0); 1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pRet = NULL; 1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (n) { 1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD thisnum = syntax.GetDirectNum(); 1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD thisoff = syntax.GetDirectNum(); 1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (thisnum == objnum) { 1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov syntax.RestorePos(offset + thisoff); 1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext); 1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov n --; 1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) 1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_StreamAcc* pStreamAcc = NULL; 1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_ObjectStreamMap.Lookup((void*)(FX_UINTPTR)objnum, (void*&)pStreamAcc)) { 1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pStreamAcc; 1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CPDF_Stream* pStream = (CPDF_Stream*)m_pDocument->GetIndirectObject(objnum); 1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) { 1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamAcc = FX_NEW CPDF_StreamAcc; 1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStreamAcc->LoadAllData(pStream); 1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjectStreamMap.SetAt((void*)(FX_UINTPTR)objnum, pStreamAcc); 1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pStreamAcc; 1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) 1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { 1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 2) { 1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objnum = (FX_DWORD)m_CrossRef[objnum]; 1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) { 1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = m_CrossRef[objnum]; 1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == 0) { 1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) { 1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ((FX_FILESIZE*)pResult)[1] - offset; 1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, FX_LPBYTE& pBuffer, FX_DWORD& size) 1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBuffer = NULL; 1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = 0; 1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { 1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 2) { 1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]); 1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObjStream == NULL) { 1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N")); 1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); 1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_SyntaxParser syntax; 1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pData = pObjStream->GetData(); 1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD totalsize = pObjStream->GetSize(); 1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pData, (size_t)totalsize, FALSE)); 1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov syntax.InitParser((IFX_FileStream*)file, 0); 1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (n) { 1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD thisnum = syntax.GetDirectNum(); 1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD thisoff = syntax.GetDirectNum(); 1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (thisnum == objnum) { 1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (n == 1) { 1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = totalsize - (thisoff + offset); 1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD nextnum = syntax.GetDirectNum(); 1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD nextoff = syntax.GetDirectNum(); 1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = nextoff - thisoff; 1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBuffer = FX_Alloc(FX_BYTE, size); 1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(pBuffer, pData + thisoff + offset, size); 1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov n --; 1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_V5Type[objnum] == 1) { 1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_CrossRef[objnum]; 1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos == 0) { 1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos); 1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD real_objnum = FXSYS_atoi(word); 1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (real_objnum && real_objnum != objnum) { 1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov word = m_Syntax.GetNextWord(bIsNumber); 1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1]; 1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNextOffValid = FALSE; 1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nextoff != pos) { 1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(nextoff); 1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov word = m_Syntax.GetNextWord(bIsNumber); 1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("xref")) { 1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bNextOffValid = TRUE; 1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (bIsNumber) { 1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov word = m_Syntax.GetNextWord(bIsNumber); 1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bIsNumber && m_Syntax.GetKeyword() == FX_BSTRC("obj")) { 1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bNextOffValid = TRUE; 1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bNextOffValid) { 1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos); 1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.GetKeyword() == FX_BSTRC("endobj")) { 1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.SavePos() == m_Syntax.m_FileLen) { 1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nextoff = m_Syntax.SavePos(); 1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = (FX_DWORD)(nextoff - pos); 1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBuffer = FX_Alloc(FX_BYTE, size); 1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos); 1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.ReadBlock(pBuffer, size); 1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum, 1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PARSE_CONTEXT* pContext) 1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos); 1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE objOffset = m_Syntax.SavePos(); 1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objOffset -= word.GetLength(); 1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD real_objnum = FXSYS_atoi(word); 1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum && real_objnum != objnum) { 1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov word = m_Syntax.GetNextWord(bIsNumber); 1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD gennum = FXSYS_atoi(word); 1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, gennum, 0, pContext); 1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE endOffset = m_Syntax.SavePos(); 1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString bsWord = m_Syntax.GetKeyword(); 1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bsWord == FX_BSTRC("endobj")) { 1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov endOffset = m_Syntax.SavePos(); 1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objSize = endOffset - objOffset; 1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj && !objnum) { 1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->m_ObjNum = real_objnum; 1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pObj; 1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1389ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum, 1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos) 1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(pos); 1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD real_objnum = FXSYS_atoi(word); 1401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum && real_objnum != objnum) { 1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov word = m_Syntax.GetNextWord(bIsNumber); 1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD gennum = FXSYS_atoi(word); 1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext); 1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResultPos) { 1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pResultPos = m_Syntax.m_Pos; 1418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pObj; 1421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary* CPDF_Parser::LoadTrailerV4() 1423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) { 1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0); 1428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj == NULL || pObj->GetType() != PDFOBJ_DICTIONARY) { 1429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj) { 1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Dictionary*)pObj; 1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision) 1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pSecurityHandler == NULL) { 1439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (FX_DWORD) - 1; 1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwPermission = m_pSecurityHandler->GetPermissions(); 1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pEncryptDict && m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) { 1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwPermission &= 0xFFFFFFFC; 1444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwPermission |= 0xFFFFF0C0; 1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(bCheckRevision && m_pEncryptDict->GetInteger(FX_BSTRC("R")) == 2) { 1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwPermission &= 0xFFFFF0FF; 1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwPermission; 1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1451ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::IsOwner() 1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pSecurityHandler == NULL ? TRUE : m_pSecurityHandler->IsOwner(); 1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced) 1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ASSERT(m_pSecurityHandler == NULL); 1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pSecurityHandler && !m_bForceUseSecurityHandler) { 1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pSecurityHandler; 1460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pSecurityHandler = NULL; 1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bForceUseSecurityHandler = bForced; 1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pSecurityHandler = pSecurityHandler; 1464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bForceUseSecurityHandler) { 1465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_pCryptoHandler = pSecurityHandler->CreateCryptoHandler(); 1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler); 1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset) 1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.InitParser(pFileAccess, offset); 1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9); 1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 1476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum = FXSYS_atoi(word); 1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov word = m_Syntax.GetNextWord(bIsNumber); 1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD gennum = FXSYS_atoi(word); 1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) { 1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(SavedPos); 1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized = m_Syntax.GetObject(NULL, objnum, gennum, 0); 1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pLinearized) { 1492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) { 1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.GetNextWord(bIsNumber); 1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L")); 1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pLen) { 1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized->Release(); 1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pLen->GetInteger() != (int)pFileAccess->GetSize()) { 1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P")); 1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNo && pNo->GetType() == PDFOBJ_NUMBER) { 1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwFirstPageNo = pNo->GetInteger(); 1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pTable = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T")); 1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pTable && pTable->GetType() == PDFOBJ_NUMBER) { 1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = pTable->GetInteger(); 1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized->Release(); 1515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized = NULL; 1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1518ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead) 1519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CloseParser(bReParse); 1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bXRefStream = FALSE; 1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = 0; 1523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bOwnFileRead = bOwnFileRead; 1524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = GetHeaderOffset(pFileAccess); 1525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == -1) { 1526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 1527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!IsLinearizedFile(pFileAccess, offset)) { 1529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_pFileAccess = NULL; 1530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartParse(pFileAccess, bReParse, bOwnFileRead); 1531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bReParse) { 1533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = FX_NEW CPDF_Document(this); 1534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos(); 1536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bXRefRebuilt = FALSE; 1537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bLoadV4 = FALSE; 1538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE, FALSE)) && !LoadCrossRefV5(dwFirstXRefOffset, dwFirstXRefOffset, TRUE)) { 1539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!RebuildCrossRef()) { 1540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 1541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bXRefRebuilt = TRUE; 1543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = 0; 1544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bLoadV4) { 1546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = LoadTrailerV4(); 1547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer == NULL) { 1548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); 1551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (xrefsize == 0) { 1552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossRef.SetSize(xrefsize); 1555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_V5Type.SetSize(xrefsize); 1556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwRet = SetEncryptHandler(); 1558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet != PDFPARSE_ERROR_SUCCESS) { 1559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwRet; 1560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); 1562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) { 1563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bXRefRebuilt) { 1564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 1565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseEncryptHandler(); 1567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!RebuildCrossRef()) { 1568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 1569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwRet = SetEncryptHandler(); 1571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet != PDFPARSE_ERROR_SUCCESS) { 1572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwRet; 1573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); 1575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument->GetRoot() == NULL) { 1576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 1577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 1580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD RootObjNum = GetRootObjNum(); 1581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (RootObjNum == 0) { 1582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseEncryptHandler(); 1583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RebuildCrossRef(); 1584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RootObjNum = GetRootObjNum(); 1585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (RootObjNum == 0) { 1586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 1587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwRet = SetEncryptHandler(); 1589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet != PDFPARSE_ERROR_SUCCESS) { 1590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dwRet; 1591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) { 1594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata")); 1595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) { 1596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); 1597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_SUCCESS; 1600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1601ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos) 1602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) { 1604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (xrefpos) 1607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) { 1608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjectStreamMap.InitHashTable(101, FALSE); 1611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bXRefStream = TRUE; 1612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1614ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable() 1615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum; 1617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_MetadataObjnum = 0; 1618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer) { 1619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer->Release(); 1620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = NULL; 1621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset); 1623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSavedPos = m_Syntax.SavePos(); 1624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch = 0; 1625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwCount = 0; 1626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.GetNextChar(ch); 1627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 type = _PDF_CharType[ch]; 1628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (type == 'W') { 1629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++dwCount; 1630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_HeaderOffset)) { 1631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.GetNextChar(ch); 1634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 1635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset += dwCount; 1637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = m_ObjectStreamMap.GetStartPosition(); 1638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 1639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID objnum; 1640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_StreamAcc* pStream; 1641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream); 1642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pStream; 1643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ObjectStreamMap.RemoveAll(); 1645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { 1646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LastXRefOffset = 0; 1647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_FORMAT; 1649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_DWORD), _CompareDWord); 1651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; 1652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFPARSE_ERROR_SUCCESS; 1653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1654ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SyntaxParser::CPDF_SyntaxParser() 1655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileAccess = NULL; 1657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCryptoHandler = NULL; 1658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileBuf = NULL; 1659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize; 1660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileBuf = NULL; 1661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_MetadataObjnum = 0; 1662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwWordPos = 0; 1663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_FPDFAPI_MINI_) 1664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bFileStream = TRUE; 1665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 1666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bFileStream = FALSE; 1667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1669ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SyntaxParser::~CPDF_SyntaxParser() 1670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileBuf) { 1672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_pFileBuf); 1673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1675ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, FX_BYTE& ch) 1676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE save_pos = m_Pos; 1678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = pos; 1679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL ret = GetNextChar(ch); 1680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = save_pos; 1681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ret; 1682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1683ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::GetNextChar(FX_BYTE& ch) 1684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_Pos + m_HeaderOffset; 1686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos >= m_FileLen) { 1687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { 1690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE read_pos = pos; 1691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD read_size = m_BufSize; 1692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)read_size > m_FileLen) { 1693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_size = (FX_DWORD)m_FileLen; 1694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) { 1696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_FileLen < (FX_FILESIZE)read_size) { 1697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_pos = 0; 1698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_size = (FX_DWORD)m_FileLen; 1699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_pos = m_FileLen - read_size; 1701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) { 1704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BufOffset = read_pos; 1707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ch = m_pFileBuf[pos - m_BufOffset]; 1709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos ++; 1710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1712ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch) 1713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos += m_HeaderOffset; 1715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos >= m_FileLen) { 1716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { 1719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE read_pos; 1720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos < (FX_FILESIZE)m_BufSize) { 1721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_pos = 0; 1722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_pos = pos - m_BufSize + 1; 1724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD read_size = m_BufSize; 1726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) { 1727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_FileLen < (FX_FILESIZE)read_size) { 1728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_pos = 0; 1729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_size = (FX_DWORD)m_FileLen; 1730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_pos = m_FileLen - read_size; 1732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) { 1735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BufOffset = read_pos; 1738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ch = m_pFileBuf[pos - m_BufOffset]; 1740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1742ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::ReadBlock(FX_LPBYTE pBuf, FX_DWORD size) 1743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) { 1745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos += size; 1748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_WORD_BUFFER 256 1751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::GetNextWord() 1752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordSize = 0; 1754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bIsNumber = TRUE; 1755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 1756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE type = _PDF_CharType[ch]; 1760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (type == 'W') { 1762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 1766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch != '%') { 1768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '\r' || ch == '\n') { 1775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 1779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 'D') { 1781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bIsNumber = FALSE; 1782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 1783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '/') { 1784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 1789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type != 'R' && type != 'N') { 1790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 1791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_WordSize < MAX_WORD_BUFFER) { 1794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 1795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '<') { 1798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '<') { 1802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 1803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 1805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '>') { 1807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '>') { 1811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 1812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 1814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_WordSize < MAX_WORD_BUFFER) { 1820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 1821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type != 'N') { 1823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bIsNumber = FALSE; 1824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 1829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 'D' || type == 'W') { 1830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 1831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1835ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::ReadString() 1836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 1838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 1840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteTextBuf buf; 1842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 parlevel = 0; 1843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 status = 0, iEscCode = 0; 1844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (status) { 1846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 1847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == ')') { 1848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parlevel == 0) { 1849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return buf.GetByteString(); 1850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parlevel --; 1852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar(')'); 1853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '(') { 1854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parlevel ++; 1855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar('('); 1856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '\\') { 1857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 1; 1858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar(ch); 1860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 1863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch >= '0' && ch <= '7') { 1864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iEscCode = ch - '0'; 1865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 2; 1866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == 'n') { 1869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar('\n'); 1870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == 'r') { 1871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar('\r'); 1872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == 't') { 1873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar('\t'); 1874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == 'b') { 1875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar('\b'); 1876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == 'f') { 1877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar('\f'); 1878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '\r') { 1879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 4; 1880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '\n') { 1882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar(ch); 1884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 1886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 1888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch >= '0' && ch <= '7') { 1889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iEscCode = iEscCode * 8 + ch - '0'; 1890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 3; 1891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar(iEscCode); 1893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 1894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 3: 1898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch >= '0' && ch <= '7') { 1899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iEscCode = iEscCode * 8 + ch - '0'; 1900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar(iEscCode); 1901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 1902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendChar(iEscCode); 1904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 1905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 4: 1909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status = 0; 1910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch != '\n') { 1911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetNextChar(ch); 1920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return buf.GetByteString(); 1921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1922ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::ReadHexString() 1923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 1925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 1927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_BinaryBuf buf; 1929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFirst = TRUE; 1930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE code = 0; 1931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '>') { 1933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch >= '0' && ch <= '9') { 1936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFirst) { 1937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code = (ch - '0') * 16; 1938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code += ch - '0'; 1940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendByte((FX_BYTE)code); 1941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFirst = !bFirst; 1943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch >= 'A' && ch <= 'F') { 1944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFirst) { 1945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code = (ch - 'A' + 10) * 16; 1946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code += ch - 'A' + 10; 1948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendByte((FX_BYTE)code); 1949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFirst = !bFirst; 1951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch >= 'a' && ch <= 'f') { 1952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bFirst) { 1953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code = (ch - 'a' + 10) * 16; 1954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code += ch - 'a' + 10; 1956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendByte((FX_BYTE)code); 1957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFirst = !bFirst; 1959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bFirst) { 1965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf.AppendByte((FX_BYTE)code); 1966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return buf.GetByteString(); 1968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::ToNextLine() 1970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 1972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '\n') { 1977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '\r') { 1980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetNextChar(ch); 1981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '\n') { 1982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 1985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::ToNextWord() 1991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 1993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 1994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE type = _PDF_CharType[ch]; 1997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 1998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (type == 'W') { 1999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwWordPos = m_Pos; 2000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 2001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 2002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 2004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch != '%') { 2006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 2010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 2011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '\r' || ch == '\n') { 2013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 2017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 2019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2020ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber) 2021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetNextWord(); 2023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bIsNumber = m_bIsNumber; 2024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); 2025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2026ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::GetKeyword() 2027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetNextWord(); 2029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); 2030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2031ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, FX_INT32 level, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt) 2032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (level > _PARSER_OBJECT_LEVLE_) { 2034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 2039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = GetNextWord(bIsNumber); 2040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pRet = NULL; 2041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word.GetLength() == 0) { 2042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_INVALID; 2044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE wordOffset = m_Pos - word.GetLength(); 2048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bIsNumber) { 2049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString nextword = GetNextWord(bIsNumber); 2051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bIsNumber) { 2052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString nextword2 = GetNextWord(bIsNumber); 2053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nextword2 == FX_BSTRC("R")) { 2054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum = FXSYS_atoi(word); 2055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_REFERENCE; 2057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_Reference::Create(pObjList, objnum); 2059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NUMBER; 2064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_Number::Create(word); 2066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NUMBER; 2072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_Number::Create(word); 2074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) { 2078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_BOOLEAN; 2080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_Boolean::Create(word == FX_BSTRC("true")); 2082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("null")) { 2085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NULL; 2087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_Null::Create(); 2089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("(")) { 2092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_STRING; 2094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos - 1; 2096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString str = ReadString(); 2097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCryptoHandler && bDecrypt) { 2098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCryptoHandler->Decrypt(objnum, gennum, str); 2099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_String::Create(str, FALSE); 2101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("<")) { 2104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_STRING; 2106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos - 1; 2108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString str = ReadHexString(); 2109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCryptoHandler && bDecrypt) { 2110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCryptoHandler->Decrypt(objnum, gennum, str); 2111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_String::Create(str, TRUE); 2113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("[")) { 2116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_ARRAY; 2118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = CPDF_Array::Create(); 2120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE firstPos = m_Pos - 1; 2121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj == NULL) { 2125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray; 2126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray->Add(pObj); 2128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word[0] == '/') { 2131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NAME; 2133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); 2135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 2136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("<<")) { 2138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE saveDictOffset = m_Pos - 2; 2139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwDictSize = 0; 2140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_DICTIONARY; 2142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext) { 2144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pContext->m_DictStart = SavedPos; 2145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = CPDF_Dictionary::Create(); 2147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nKeys = 0; 2148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSignValuePos = 0; 2149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 2151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString key = GetNextWord(bIsNumber); 2152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key.IsEmpty()) { 2153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->Release(); 2154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos - key.GetLength(); 2157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key == FX_BSTRC(">>")) { 2158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwDictSize = m_Pos - saveDictOffset; 2159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key == FX_BSTRC("endobj")) { 2162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwDictSize = m_Pos - 6 - saveDictOffset; 2163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key[0] != '/') { 2167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 2168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nKeys ++; 2170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov key = PDF_NameDecode(key); 2171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key == FX_BSTRC("/Contents")) { 2172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwSignValuePos = m_Pos; 2173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj == NULL) { 2176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 2177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key.GetLength() == 1) { 2179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj); 2180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nKeys < 32) { 2182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj); 2183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj); 2185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsSignatureDict(pDict)) { 2189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSavePos = m_Pos; 2190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = dwSignValuePos; 2191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, NULL, FALSE); 2192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->SetAt(FX_BSTRC("Contents"), pObj); 2193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = dwSavePos; 2194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext) { 2196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pContext->m_DictEnd = m_Pos; 2197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDict; 2199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 2203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString nextword = GetNextWord(bIsNumber); 2204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nextword == FX_BSTRC("stream")) { 2205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum); 2206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStream) { 2207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pStream; 2208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->Release(); 2210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDict; 2214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC(">>")) { 2217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_INVALID; 2222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2225ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, 2226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 level, struct PARSE_CONTEXT* pContext) 2227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (level > _PARSER_OBJECT_LEVLE_) { 2229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 2234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = GetNextWord(bIsNumber); 2235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word.GetLength() == 0) { 2236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_INVALID; 2238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bIsNumber) { 2242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString nextword = GetNextWord(bIsNumber); 2244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bIsNumber) { 2245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString nextword2 = GetNextWord(bIsNumber); 2246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nextword2 == FX_BSTRC("R")) { 2247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum = FXSYS_atoi(word); 2248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_REFERENCE; 2250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_Reference::Create(pObjList, objnum); 2252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NUMBER; 2256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_Number::Create(word); 2258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NUMBER; 2263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_Number::Create(word); 2265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) { 2268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_BOOLEAN; 2270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_Boolean::Create(word == FX_BSTRC("true")); 2272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("null")) { 2274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NULL; 2276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_Null::Create(); 2278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("(")) { 2280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_STRING; 2282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString str = ReadString(); 2284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCryptoHandler) { 2285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCryptoHandler->Decrypt(objnum, gennum, str); 2286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_String::Create(str, FALSE); 2288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("<")) { 2290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_STRING; 2292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString str = ReadHexString(); 2294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCryptoHandler) { 2295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCryptoHandler->Decrypt(objnum, gennum, str); 2296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_String::Create(str, TRUE); 2298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("[")) { 2300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_ARRAY; 2302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = CPDF_Array::Create(); 2304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj == NULL) { 2307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_WordBuffer[0] == ']') { 2308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray; 2309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray->Release(); 2311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pArray->Add(pObj); 2314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word[0] == '/') { 2317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_NAME; 2319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); 2321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC("<<")) { 2323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_DICTIONARY; 2325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext) { 2327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pContext->m_DictStart = SavedPos; 2328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = CPDF_Dictionary::Create(); 2330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 2332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString key = GetNextWord(bIsNumber); 2334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key.IsEmpty()) { 2335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->Release(); 2336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key == FX_BSTRC(">>")) { 2339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key == FX_BSTRC("endobj")) { 2342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key[0] != '/') { 2346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 2347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov key = PDF_NameDecode(key); 2349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1); 2350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj == NULL) { 2351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->Release(); 2352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 2353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 2355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == 0x0A || ch == 0x0D) { 2358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key.GetLength() == 1) { 2364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj); 2365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj); 2367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext) { 2370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pContext->m_DictEnd = m_Pos; 2371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDict; 2373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 2377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString nextword = GetNextWord(bIsNumber); 2378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nextword == FX_BSTRC("stream")) { 2379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum); 2380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStream) { 2381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pStream; 2382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->Release(); 2384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDict; 2388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (word == FX_BSTRC(">>")) { 2391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = SavedPos; 2392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bTypeOnly) { 2395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CPDF_Object*)PDFOBJ_INVALID; 2396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2399ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext, 2400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum, FX_DWORD gennum) 2401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC("Length")); 2403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD len = 0; 2404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pLenObj && (pLenObj->GetType() != PDFOBJ_REFERENCE || 2405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((((CPDF_Reference*)pLenObj)->GetObjList() != NULL) && 2406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum))) { 2407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_Pos; 2408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pLenObj) { 2409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = pLenObj->GetInteger(); 2410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = pos; 2412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (len > 0x40000000) { 2413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ToNextLine(); 2417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE StreamStartPos = m_Pos; 2418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext) { 2419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pContext->m_DataStart = m_Pos; 2420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos += len; 2422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_CryptoHandler* pCryptoHandler = objnum == (FX_DWORD)m_MetadataObjnum ? NULL : m_pCryptoHandler; 2423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCryptoHandler == NULL) { 2424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_Pos; 2425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetNextWord(); 2426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_WordSize < 9 || FXSYS_memcmp32(m_WordBuffer, "endstream", 9)) { 2427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = StreamStartPos; 2428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = FindTag(FX_BSTRC("endstream"), 0); 2429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset >= 0) { 2430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE curPos = m_Pos; 2431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = StreamStartPos; 2432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE endobjOffset = FindTag(FX_BSTRC("endobj"), 0); 2433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (endobjOffset < offset && endobjOffset >= 0) { 2434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = endobjOffset; 2435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = curPos; 2437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE byte1, byte2; 2439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetCharAt(StreamStartPos + offset - 1, byte1); 2440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetCharAt(StreamStartPos + offset - 2, byte2); 2441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte1 == 0x0a && byte2 == 0x0d) { 2442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len -= 2; 2443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (byte1 == 0x0a || byte1 == 0x0d) { 2444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len --; 2445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = (FX_DWORD)offset; 2447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDict->SetAtInteger(FX_BSTRC("Length"), len); 2448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = StreamStartPos; 2450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FindTag(FX_BSTRC("endobj"), 0) < 0) { 2451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = StreamStartPos; 2457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pStream; 2458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_) 2459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream = FX_NEW CPDF_Stream(m_pFileAccess, pCryptoHandler, m_HeaderOffset + m_Pos, len, pDict, gennum); 2460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos += len; 2461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 2462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pData = FX_Alloc(FX_BYTE, len); 2463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pData) { 2464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 2465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReadBlock(pData, len); 2467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCryptoHandler) { 2468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_BinaryBuf dest_buf; 2469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len)); 2470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID context = pCryptoHandler->DecryptStart(objnum, gennum); 2471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCryptoHandler->DecryptStream(context, pData, len, dest_buf); 2472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCryptoHandler->DecryptFinish(context, dest_buf); 2473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pData); 2474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData = dest_buf.GetBuffer(); 2475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = dest_buf.GetSize(); 2476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf.DetachBuffer(); 2477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStream = FX_NEW CPDF_Stream(pData, len, pDict); 2479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 2480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pContext) { 2481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pContext->m_DataEnd = pContext->m_DataStart + len; 2482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StreamStartPos = m_Pos; 2484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetNextWord(); 2485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_WordSize == 6 && 0 == FXSYS_memcmp32(m_WordBuffer, "endobj", 6)) { 2486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = StreamStartPos; 2487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pStream; 2489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset) 2491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileBuf) { 2493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_pFileBuf); 2494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileBuf = NULL; 2495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileBuf = FX_Alloc(FX_BYTE, m_BufSize); 2497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_HeaderOffset = HeaderOffset; 2498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FileLen = pFileAccess->GetSize(); 2499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = 0; 2500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileAccess = pFileAccess; 2501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BufOffset = 0; 2502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFileAccess->ReadBlock(m_pFileBuf, 0, (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize)); 2503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2504ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_SyntaxParser::GetDirectNum() 2505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetNextWord(); 2507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bIsNumber) { 2508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 2509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize] = 0; 2511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FXSYS_atoi((FX_LPCSTR)m_WordBuffer); 2512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2513ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen) 2514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE type = _PDF_CharType[tag[0]]; 2516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bCheckLeft = type != 'D' && type != 'W'; 2517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[tag[taglen - 1]]; 2518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bCheckRight = type != 'D' || type != 'W'; 2519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 2520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpos + (FX_INT32)taglen, ch)) { 2521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE type = _PDF_CharType[ch]; 2522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 'N' || type == 'R') { 2523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) { 2527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE type = _PDF_CharType[ch]; 2528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 'N' || type == 'R') { 2529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2534ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit) 2535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 taglen = tag.GetLength(); 2537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (taglen == 0) { 2538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_Pos; 2541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = 0; 2542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bForward) { 2543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = taglen - 1; 2544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE tag_data = tag; 2546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE byte; 2547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bForward) { 2549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (limit) { 2550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos >= m_Pos + limit) { 2551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetCharAt(pos, byte)) { 2555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (limit) { 2559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos <= m_Pos - limit) { 2560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetCharAtBackward(pos, byte)) { 2564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (byte == tag_data[offset]) { 2568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bForward) { 2569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset ++; 2570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset < taglen) { 2571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos ++; 2572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 2573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset --; 2576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset >= 0) { 2577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos --; 2578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 2579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos; 2582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bWholeWord || IsWholeWord(startpos, limit, tag, taglen)) { 2583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = startpos; 2584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bForward) { 2588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = byte == tag_data[0] ? 1 : 0; 2589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos ++; 2590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1; 2592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos --; 2593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos < 0) { 2595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct _SearchTagRecord { 2601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE m_pTag; 2602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD m_Len; 2603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD m_Offset; 2604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 2605ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_SyntaxParser::SearchMultiWord(FX_BSTR tags, FX_BOOL bWholeWord, FX_FILESIZE limit) 2606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 ntags = 1, i; 2608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < tags.GetLength(); i ++) 2609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (tags[i] == 0) { 2610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ntags ++; 2611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags); 2613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD start = 0, itag = 0, max_len = 0; 2614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i <= tags.GetLength(); i ++) { 2615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (tags[i] == 0) { 2616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD len = i - start; 2617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (len > max_len) { 2618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov max_len = len; 2619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[itag].m_pTag = tags.GetPtr() + start; 2621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[itag].m_Len = len; 2622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[itag].m_Offset = 0; 2623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start = i + 1; 2624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov itag ++; 2625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_Pos; 2628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE byte; 2629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetCharAt(pos++, byte); 2630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 found = -1; 2631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < ntags; i ++) { 2633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) { 2634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[i].m_Offset ++; 2635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPatterns[i].m_Offset == pPatterns[i].m_Len) { 2636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bWholeWord || IsWholeWord(pos - pPatterns[i].m_Len, limit, pPatterns[i].m_pTag, pPatterns[i].m_Len)) { 2637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov found = i; 2638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto end; 2639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPatterns[i].m_pTag[0] == byte) { 2641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[i].m_Offset = 1; 2642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[i].m_Offset = 0; 2644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPatterns[i].m_pTag[0] == byte) { 2649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[i].m_Offset = 1; 2650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPatterns[i].m_Offset = 0; 2652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (limit && pos >= m_Pos + limit) { 2656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto end; 2657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetCharAt(pos, byte)) { 2659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto end; 2660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos ++; 2662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovend: 2664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pPatterns); 2665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return found; 2666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2667ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CPDF_SyntaxParser::FindTag(FX_BSTR tag, FX_FILESIZE limit) 2668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 taglen = tag.GetLength(); 2670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 match = 0; 2671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov limit += m_Pos; 2672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE startpos = m_Pos; 2673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 2675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 2676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 2677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == tag[match]) { 2679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov match ++; 2680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (match == taglen) { 2681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_Pos - startpos - taglen; 2682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov match = ch == tag[0] ? 1 : 0; 2685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (limit && m_Pos == limit) { 2687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 2688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 2691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::GetBinary(FX_BYTE* buffer, FX_DWORD size) 2693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD offset = 0; 2695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 2696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 2697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 2698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 2699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer[offset++] = ch; 2701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == size) { 2702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2706ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DataAvail::CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead) 2707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileAvail = pFileAvail; 2709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileRead = pFileRead; 2710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = 0; 2711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwFileLen = 0; 2712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileRead) { 2713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize(); 2714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwCurrentOffset = 0; 2716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordSize = 0; 2717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwXRefOffset = 0; 2718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bufferOffset = 0; 2719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwFirstPageNo = 0; 2720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bufferSize = 0; 2721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PagesObjNum = 0; 2722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwCurrentXRefSteam = 0; 2723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwAcroFormObjNum = 0; 2724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwInfoObjNum = 0; 2725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = 0; 2726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwEncryptObjNum = 0; 2727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwPrevXRefOffset = 0; 2728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwLastXRefOffset = 0; 2729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bDocAvail = FALSE; 2730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bMainXRefLoad = FALSE; 2731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bDocAvail = FALSE; 2732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLinearized = FALSE; 2733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPagesLoad = FALSE; 2734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPagesTreeLoad = FALSE; 2735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bMainXRefLoadedOK = FALSE; 2736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bAnnotsLoad = FALSE; 2737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bHaveAcroForm = FALSE; 2738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bAcroFormLoad = FALSE; 2739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPageLoadedOK = FALSE; 2740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bNeedDownLoadResource = FALSE; 2741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLinearizedFormParamLoad = FALSE; 2742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized = NULL; 2743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRoot = NULL; 2744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer = NULL; 2745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrentParser = NULL; 2746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pAcroForm = NULL; 2747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPageDict = NULL; 2748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPageResource = NULL; 2749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pageMapCheckState = NULL; 2750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_HEADER; 2751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_parser.m_bOwnFileRead = FALSE; 2752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bTotalLoadPageTree = FALSE; 2753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bCurPageDictLoadOK = FALSE; 2754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLinearedDataOK = FALSE; 2755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pagesLoadState = NULL; 2756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2757ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DataAvail::~CPDF_DataAvail() 2758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pLinearized) { 2760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized->Release(); 2761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRoot) { 2763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRoot->Release(); 2764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTrailer) { 2766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTrailer->Release(); 2767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pageMapCheckState) { 2769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pageMapCheckState; 2770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pagesLoadState) { 2772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pagesLoadState; 2773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 i = 0; 2775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = m_arrayAcroforms.GetSize(); 2776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < iSize; ++i) { 2777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release(); 2778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DataAvail::SetDocument(CPDF_Document* pDoc) 2781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument = pDoc; 2783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2784ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) 2785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser()); 2787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pParser == NULL) { 2788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 2789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum >= (FX_DWORD)pParser->m_CrossRef.GetSize()) { 2791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 2792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pParser->m_V5Type[objnum] == 2) { 2794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objnum = (FX_DWORD)pParser->m_CrossRef[objnum]; 2795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pParser->m_V5Type[objnum] == 1 || pParser->m_V5Type[objnum] == 255) { 2797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = pParser->m_CrossRef[objnum]; 2798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == 0) { 2799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 2800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPVOID pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), pParser->m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 2802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pResult == NULL) { 2803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 2804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == pParser->m_SortedOffset.GetSize() - 1) { 2806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 2807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset); 2809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 2811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2812ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array) 2813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!obj_array.GetSize()) { 2815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD count = 0; 2818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray new_obj_array; 2819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 i = 0; 2820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < obj_array.GetSize(); i++) { 2821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pObj = (CPDF_Object *)obj_array[i]; 2822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pObj) { 2823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 2824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 type = pObj->GetType(); 2826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (type) { 2827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_ARRAY: { 2828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array *pArray = pObj->GetArray(); 2829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD k = 0; k < pArray->GetCount(); k++) { 2830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_obj_array.Add(pArray->GetElement(k)); 2831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_STREAM: 2835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj = pObj->GetDict(); 2836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_DICTIONARY: { 2837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pDict = pObj->GetDict(); 2838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict->GetString("Type") == "Page" && !bParsePage) { 2839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 2840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = pDict->GetStartPos(); 2842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 2843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *value; 2844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString key; 2845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov value = pDict->GetNextElement(pos, key); 2846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (key != "Parent") { 2847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_obj_array.Add(value); 2848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_REFERENCE: { 2853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference *pRef = (CPDF_Reference*)pObj; 2854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwNum = pRef->GetRefObjNum(); 2855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset; 2856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD size = GetObjectSize(pRef->GetRefObjNum(), offset); 2857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!size) { 2858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512); 2861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(offset, size)) { 2862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(offset, size); 2863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret_array.Add(pObj); 2864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count++; 2865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (!m_objnum_array.Find(dwNum)) { 2866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objnum_array.AddObjNum(dwNum); 2867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pReferred = m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), NULL); 2868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pReferred) { 2869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_obj_array.Add(pReferred); 2870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 2874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (count > 0) { 2877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = new_obj_array.GetSize(); 2878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < iSize; ++i) { 2879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pObj = (CPDF_Object *)new_obj_array[i]; 2880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 type = pObj->GetType(); 2881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == PDFOBJ_REFERENCE) { 2882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference *pRef = (CPDF_Reference *)pObj; 2883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwNum = pRef->GetRefObjNum(); 2884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_objnum_array.Find(dwNum)) { 2885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret_array.Add(pObj); 2886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret_array.Add(pObj); 2889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov obj_array.RemoveAll(); 2894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov obj_array.Append(new_obj_array); 2895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return IsObjectsAvail(obj_array, FALSE, pHints, ret_array); 2896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2897ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsDocAvail(IFX_DownloadHints* pHints) 2898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_dwFileLen && m_pFileRead) { 2900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize(); 2901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_dwFileLen) { 2902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (!m_bDocAvail) { 2906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckDocStatus(pHints)) { 2907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2912ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) 2913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_objs_array.GetSize()) { 2915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 2916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objnum_array.RemoveAll(); 2917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray obj_array; 2918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov obj_array.Append(m_arrayAcroforms); 2919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); 2920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 2921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 2922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 2924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray new_objs_array; 2926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 2927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 2928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = m_arrayAcroforms.GetSize(); 2929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < iSize; ++i) { 2930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release(); 2931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_arrayAcroforms.RemoveAll(); 2933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 2935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.Append(new_objs_array); 2936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 2938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2940ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckAcroForm(IFX_DownloadHints* pHints) 2941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 2943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist); 2944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bExist) { 2945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGETREE; 2946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pAcroForm) { 2949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_ERROR) { 2950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 2951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 2954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_arrayAcroforms.Add(m_pAcroForm); 2956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGETREE; 2957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 2958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2959ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckDocStatus(IFX_DownloadHints *pHints) 2960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (m_docStatus) { 2962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_HEADER: 2963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckHeader(pHints); 2964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_FIRSTPAGE: 2965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_FIRSTPAGE_PREPARE: 2966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckFirstPage(pHints); 2967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_END: 2968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckEnd(pHints); 2969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_CROSSREF: 2970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckCrossRef(pHints); 2971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_CROSSREF_ITEM: 2972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckCrossRefItem(pHints); 2973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_CROSSREF_STREAM: 2974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckAllCrossRefStream(pHints); 2975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_TRAILER: 2976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckTrailer(pHints); 2977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_TRAILER_APPEND: 2978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckTrailerAppend(pHints); 2979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_LOADALLCRSOSSREF: 2980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadAllXref(pHints); 2981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_LOADALLFILE: 2982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadAllFile(pHints); 2983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_ROOT: 2984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckRoot(pHints); 2985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_INFO: 2986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckInfo(pHints); 2987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_ACROFORM: 2988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckAcroForm(pHints); 2989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_PAGETREE: 2990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bTotalLoadPageTree) { 2991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckPages(pHints); 2992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadDocPages(pHints); 2994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_PAGE: 2996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bTotalLoadPageTree) { 2997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckPage(pHints); 2998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGE_LATERLOAD; 3000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_ERROR: 3003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadAllFile(pHints); 3004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_PAGE_LATERLOAD: 3005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGE; 3006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 3007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bDocAvail = TRUE; 3008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3011ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPageStatus(IFX_DownloadHints* pHints) 3012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (m_docStatus) { 3014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_PAGETREE: 3015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckPages(pHints); 3016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_PAGE: 3017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckPage(pHints); 3018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_ERROR: 3019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadAllFile(pHints); 3020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 3021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPagesTreeLoad = TRUE; 3022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPagesLoad = TRUE; 3023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3026ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadAllFile(IFX_DownloadHints* pHints) 3027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileAvail->IsDataAvail(0, (FX_DWORD)m_dwFileLen)) { 3029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_DONE; 3030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(0, (FX_DWORD)m_dwFileLen); 3033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3035ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints) 3036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset); 3038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_parser.m_bOwnFileRead = FALSE; 3039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) { 3040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_qsort(m_parser.m_SortedOffset.GetData(), m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); 3044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwRootObjNum = m_parser.GetRootObjNum(); 3045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwInfoObjNum = m_parser.GetInfoObjNum(); 3046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrentParser = &m_parser; 3047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ROOT; 3048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3050ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile) 3051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pRet = NULL; 3053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pExistInFile) { 3054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pExistInFile = TRUE; 3055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument == NULL) { 3057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = m_parser.GetObjectOffset(objnum); 3058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset < 0) { 3059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pExistInFile = FALSE; 3060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 3061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD size = (FX_DWORD)m_parser.GetObjectSize(objnum); 3063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = (FX_DWORD)(((FX_FILESIZE)(offset + size + 512)) > m_dwFileLen ? m_dwFileLen - offset : size + 512); 3064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(offset, size)) { 3065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(offset, size); 3066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 3067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = m_parser.ParseIndirectObject(NULL, objnum); 3069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pRet && pExistInFile) { 3070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pExistInFile = FALSE; 3071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 3073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset; 3075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD size = GetObjectSize(objnum, offset); 3076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512); 3077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(offset, size)) { 3078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(offset, size); 3079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 3080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser()); 3082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRet = pParser->ParseIndirectObject(NULL, objnum, NULL); 3083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pRet && pExistInFile) { 3084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pExistInFile = FALSE; 3085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pRet; 3087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3088ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckInfo(IFX_DownloadHints* pHints) 3089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 3091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist); 3092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bExist) { 3093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHaveAcroForm) { 3094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ACROFORM; 3095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGETREE; 3097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pInfo) { 3101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_ERROR) { 3102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Pos == m_dwFileLen) { 3106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pInfo) { 3111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pInfo->Release(); 3112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHaveAcroForm) { 3114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ACROFORM; 3115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGETREE; 3117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3120ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckRoot(IFX_DownloadHints* pHints) 3121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 3123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist); 3124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bExist) { 3125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pRoot) { 3129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_ERROR) { 3130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference* pRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("Pages")); 3136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) { 3137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PagesObjNum = pRef->GetRefObjNum(); 3141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference* pAcroFormRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("AcroForm")); 3142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pAcroFormRef && pAcroFormRef->GetType() == PDFOBJ_REFERENCE) { 3143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bHaveAcroForm = TRUE; 3144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwAcroFormObjNum = pAcroFormRef->GetRefObjNum(); 3145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_dwInfoObjNum) { 3147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_INFO; 3148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHaveAcroForm) { 3150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ACROFORM; 3151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGETREE; 3153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3157ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::PreparePageItem() 3158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pRoot = m_pDocument->GetRoot(); 3160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference* pRef = (CPDF_Reference*)pRoot->GetElement(FX_BSTRC("Pages")); 3161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) { 3162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PagesObjNum = pRef->GetRefObjNum(); 3166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrentParser = (CPDF_Parser *)m_pDocument->GetParser(); 3167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGETREE; 3168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3170ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsFirstCheck(int iPage) 3171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pageMapCheckState) { 3173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord(); 3174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwValue = 0; 3176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pageMapCheckState->Lookup(iPage, dwValue)) { 3177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pageMapCheckState->SetAt(iPage, 1); 3178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwValue != 0) { 3181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pageMapCheckState->SetAt(iPage, 1); 3184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DataAvail::ResetFirstCheck(int iPage) 3187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pageMapCheckState) { 3189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord(); 3190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwValue = 1; 3192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pageMapCheckState->Lookup(iPage, dwValue)) { 3193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 3194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pageMapCheckState->SetAt(iPage, 0); 3196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3197ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints) 3198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD i = 0; 3200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD iLen = m_PageObjList.GetSize(); 3201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DWordArray UnavailObjList; 3202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (; i < iLen; ++i) { 3203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i); 3204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 3205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pObj = GetObject(dwPageObjNum, pHints, &bExist); 3206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pObj) { 3207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bExist) { 3208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov UnavailObjList.Add(dwPageObjNum); 3209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 3211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj->GetType() == PDFOBJ_ARRAY) { 3213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array *pArray = pObj->GetArray(); 3214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray) { 3215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = pArray->GetCount(); 3216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pItem = NULL; 3217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 j = 0; j < iSize; ++j) { 3218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pItem = pArray->GetElement(j); 3219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pItem && pItem->GetType() == PDFOBJ_REFERENCE) { 3220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov UnavailObjList.Add(((CPDF_Reference *)pItem)->GetRefObjNum()); 3221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pObj->GetType() != PDFOBJ_DICTIONARY) { 3226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 3227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 3228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString type = pObj->GetDict()->GetString(FX_BSTRC("Type")); 3230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == FX_BSTRC("Pages")) { 3231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PagesArray.Add(pObj); 3232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 3233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 3235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PageObjList.RemoveAll(); 3237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (UnavailObjList.GetSize()) { 3238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PageObjList.Append(UnavailObjList); 3239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i = 0; 3242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iLen = m_PagesArray.GetSize(); 3243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (; i < iLen; ++i) { 3244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pPages = (CPDF_Object *)m_PagesArray.GetAt(i); 3245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPages) { 3246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 3247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetPageKids(m_pCurrentParser, pPages)) { 3249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 3250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (i++ < iLen) { 3251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages = (CPDF_Object *)m_PagesArray.GetAt(i); 3252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 3253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PagesArray.RemoveAll(); 3255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 3259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PagesArray.RemoveAll(); 3261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_PageObjList.GetSize()) { 3262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_DONE; 3263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3267ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages) 3268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pParser) { 3270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pKids = pPages->GetDict()->GetElement(FX_BSTRC("Kids")); 3274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pKids) { 3275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (pKids->GetType()) { 3278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_REFERENCE: { 3279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference *pKid = (CPDF_Reference *)pKids; 3280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PageObjList.Add(pKid->GetRefObjNum()); 3281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_ARRAY: { 3284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array *pKidsArray = (CPDF_Array *)pKids; 3285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) { 3286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference *pKid = (CPDF_Reference *)pKidsArray->GetElement(i); 3287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PageObjList.Add(pKid->GetRefObjNum()); 3288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 3292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3297ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPages(IFX_DownloadHints* pHints) 3298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 3300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist); 3301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bExist) { 3302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPages) { 3306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_ERROR) { 3307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNeedLoad = FALSE; 3313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetPageKids(m_pCurrentParser, pPages)) { 3314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 3315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 3319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGE; 3320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3322ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints) 3323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD req_size = 1024; 3325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)req_size > m_dwFileLen) { 3326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov req_size = (FX_DWORD)m_dwFileLen; 3327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileAvail->IsDataAvail(0, req_size)) { 3329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE buffer[1024]; 3330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileRead->ReadBlock(buffer, 0, req_size); 3331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsLinearizedFile(buffer, req_size)) { 3332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_FIRSTPAGE; 3333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_ERROR) { 3335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_END; 3338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(0, req_size); 3342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3344ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints *pHints) 3345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwFirstPageEndOffset = 0; 3347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pEndOffSet = m_pLinearized->GetDict()->GetElement(FX_BSTRC("E")); 3348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pEndOffSet) { 3349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pXRefOffset = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T")); 3353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pXRefOffset) { 3354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pFileLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L")); 3358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pFileLen) { 3359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNeedDownLoad = FALSE; 3363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEndOffSet->GetType() == PDFOBJ_NUMBER) { 3364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwEnd = pEndOffSet->GetInteger(); 3365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwEnd += 512; 3366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)dwEnd > m_dwFileLen) { 3367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwEnd = (FX_DWORD)m_dwFileLen; 3368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iStartPos = (FX_INT32)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen); 3370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = dwEnd > 1024 ? dwEnd - 1024 : 0; 3371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) { 3372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(iStartPos, iSize); 3373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bNeedDownLoad = TRUE; 3374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwLastXRefOffset = 0; 3377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwFileLen = 0; 3378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pXRefOffset->GetType() == PDFOBJ_NUMBER) { 3379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwLastXRefOffset = pXRefOffset->GetInteger(); 3380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFileLen->GetType() == PDFOBJ_NUMBER) { 3382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwFileLen = pFileLen->GetInteger(); 3383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(dwFileLen - m_dwLastXRefOffset))) { 3385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_FIRSTPAGE) { 3386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwSize = (FX_DWORD)(dwFileLen - m_dwLastXRefOffset); 3387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE offset = m_dwLastXRefOffset; 3388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwSize < 512 && dwFileLen > 512) { 3389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwSize = 512; 3390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offset = dwFileLen - 512; 3391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(offset, dwSize); 3393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE; 3396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bNeedDownLoad && m_docStatus == PDF_DATAAVAIL_FIRSTPAGE_PREPARE) { 3398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_DONE; 3399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE; 3402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3404ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object * CPDF_DataAvail::ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum) 3405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); 3407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.RestorePos(pos); 3408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsNumber; 3409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber); 3410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 3411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 3412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD real_objnum = FXSYS_atoi(word); 3414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (objnum && real_objnum != objnum) { 3415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 3416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov word = m_syntaxParser.GetNextWord(bIsNumber); 3418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bIsNumber) { 3419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 3420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD gennum = FXSYS_atoi(word); 3422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) { 3423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.RestorePos(SavedPos); 3424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 3425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pObj = m_syntaxParser.GetObject(NULL, objnum, gennum, 0); 3427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.RestorePos(SavedPos); 3428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pObj; 3429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3430ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_DataAvail::IsLinearizedPDF() 3431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD req_size = 1024; 3433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(0, req_size)) { 3434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDF_UNKNOW_LINEARIZED; 3435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileRead) { 3437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDF_NOT_LINEARIZED; 3438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSize = m_pFileRead->GetSize(); 3440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwSize < (FX_FILESIZE)req_size) { 3441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDF_UNKNOW_LINEARIZED; 3442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE buffer[1024]; 3444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileRead->ReadBlock(buffer, 0, req_size); 3445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsLinearizedFile(buffer, req_size)) { 3446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDF_IS_LINEARIZED; 3447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDF_NOT_LINEARIZED; 3449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3450ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen) 3451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE)); 3453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 offset = GetHeaderOffset((IFX_FileStream*)file); 3454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (offset == -1) { 3455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwHeaderOffset = offset; 3459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.InitParser((IFX_FileStream*)file, offset); 3460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); 3461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNumber = FALSE; 3462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSavePos = m_syntaxParser.SavePos(); 3463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber); 3464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bNumber) { 3465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objnum = FXSYS_atoi(wordObjNum); 3468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pLinearized) { 3469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized->Release(); 3470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized = NULL; 3471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLinearized = ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum); 3473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pLinearized) { 3474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) { 3477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L")); 3478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pLen) { 3479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)pLen->GetInteger() != m_pFileRead->GetSize()) { 3482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLinearized = TRUE; 3485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P")); 3486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNo && pNo->GetType() == PDFOBJ_NUMBER) { 3487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwFirstPageNo = pNo->GetInteger(); 3488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3493ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) 3494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0); 3496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos); 3497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) { 3498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE buffer[1024]; 3499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileRead->ReadBlock(buffer, req_pos, dwSize); 3500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE)); 3501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.InitParser((IFX_FileStream*)file, 0); 3502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.RestorePos(dwSize - 1); 3503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_syntaxParser.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, dwSize)) { 3504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNumber; 3505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.GetNextWord(bNumber); 3506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber); 3507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bNumber) { 3508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); 3512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) { 3513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwLastXRefOffset = m_dwXRefOffset; 3517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetStartOffset(m_dwXRefOffset); 3518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_CROSSREF; 3519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(req_pos, dwSize); 3526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3528ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILESIZE &xref_offset) 3529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xref_offset = 0; 3531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD req_size = (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 3532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) { 3533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = (FX_INT32)(m_Pos + req_size - m_dwCurrentXRefSteam); 3534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_BinaryBuf buf(iSize); 3535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pBuf = buf.GetBuffer(); 3536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); 3537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE)); 3538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_parser.m_Syntax.InitParser((IFX_FileStream*)file, 0); 3539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNumber = FALSE; 3540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSavePos = m_parser.m_Syntax.SavePos(); 3541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber); 3542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bNumber) { 3543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 3544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD objNum = FXSYS_atoi(objnum); 3546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL); 3547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pObj) { 3548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos += m_parser.m_Syntax.SavePos(); 3549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 3550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pName = pObj->GetDict()->GetElement(FX_BSTRC("Type")); 3552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pName && pName->GetType() == PDFOBJ_NAME) { 3553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pName->GetString() == FX_BSTRC("XRef")) { 3554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos += m_parser.m_Syntax.SavePos(); 3555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xref_offset = pObj->GetDict()->GetInteger(FX_BSTRC("Prev")); 3556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 3557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 3558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 3560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 3561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->Release(); 3564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 3565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(m_Pos, req_size); 3567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 3568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset) 3570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = dwOffset; 3572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_WORD_BUFFER 256 3574ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token) 3575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordSize = 0; 3577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE ch; 3578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 3579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE type = _PDF_CharType[ch]; 3582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 3583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (type == 'W') { 3584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 3585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 3588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch != '%') { 3590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 3593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 3594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '\r' || ch == '\n') { 3597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 3601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 'D') { 3603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 3604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '/') { 3605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 3606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 3607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 3610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type != 'R' && type != 'N') { 3611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 3612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString ret(m_WordBuffer, m_WordSize); 3613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov token = ret; 3614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_WordSize < MAX_WORD_BUFFER) { 3617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 3618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '<') { 3621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 3622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '<') { 3625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 3626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 3628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (ch == '>') { 3630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 3631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (ch == '>') { 3634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 3635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 3637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString ret(m_WordBuffer, m_WordSize); 3640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov token = ret; 3641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 3644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_WordSize < MAX_WORD_BUFFER) { 3645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_WordBuffer[m_WordSize++] = ch; 3646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextChar(ch)) { 3648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type = _PDF_CharType[ch]; 3651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == 'D' || type == 'W') { 3652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos --; 3653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString ret(m_WordBuffer, m_WordSize); 3657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov token = ret; 3658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3660ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch) 3661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE pos = m_Pos; 3663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos >= m_dwFileLen) { 3664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bufferOffset >= pos || (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <= pos) { 3667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE read_pos = pos; 3668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD read_size = 512; 3669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)read_size > m_dwFileLen) { 3670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_size = (FX_DWORD)m_dwFileLen; 3671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) { 3673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov read_pos = m_dwFileLen - read_size; 3674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) { 3676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bufferOffset = read_pos; 3679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bufferSize = read_size; 3680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ch = m_bufferData[pos - m_bufferOffset]; 3682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos ++; 3683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3685ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints *pHints) 3686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = 0; 3688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString token; 3689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 3690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextToken(token)) { 3691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 3692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(m_Pos, iSize); 3693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (token == "trailer") { 3696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwTrailerOffset = m_Pos; 3697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_TRAILER; 3698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3702ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints *pHints) 3703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE xref_offset = 0; 3705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwRet = CheckCrossRefStream(pHints, xref_offset); 3706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet == 1) { 3707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!xref_offset) { 3708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF; 3709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwCurrentXRefSteam = xref_offset; 3711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos = xref_offset; 3712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (dwRet == -1) { 3715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3719ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) 3720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwSavePos = m_Pos; 3722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = 0; 3723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString token; 3724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextToken(token)) { 3725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 3726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(m_Pos, iSize); 3727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (token == "xref") { 3730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CrossOffset.InsertAt(0, m_dwXRefOffset); 3731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 3732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetNextToken(token)) { 3733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 3734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(m_Pos, iSize); 3735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM; 3736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (token == "trailer") { 3739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwTrailerOffset = m_Pos; 3740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_TRAILER; 3741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3750ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints) 3751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Pos < m_dwFileLen) { 3753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos(); 3754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = (FX_INT32)(dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512); 3755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) { 3756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(dwAppendPos, iSize); 3757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_dwPrevXRefOffset) { 3761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetStartOffset(m_dwPrevXRefOffset); 3762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_CROSSREF; 3763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF; 3765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3768ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints) 3769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iTrailerSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 3771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) { 3772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = (FX_INT32)(m_Pos + iTrailerSize - m_dwTrailerOffset); 3773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_BinaryBuf buf(iSize); 3774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pBuf = buf.GetBuffer(); 3775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pBuf) { 3776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) { 3780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE)); 3783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_syntaxParser.InitParser((IFX_FileStream*)file, 0); 3784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pTrailer = m_syntaxParser.GetObject(NULL, 0, 0, 0); 3785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pTrailer) { 3786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Pos += m_syntaxParser.SavePos(); 3787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(m_Pos, iTrailerSize); 3788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pTrailerDict = pTrailer->GetDict(); 3791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pTrailerDict) { 3792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pEncrypt = pTrailerDict->GetElement("Encrypt"); 3793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pEncrypt && pEncrypt->GetType() == PDFOBJ_REFERENCE) { 3794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTrailer->Release(); 3796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD xrefpos = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("Prev")); 3800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (xrefpos) { 3801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwPrevXRefOffset = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("XRefStm")); 3802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTrailer->Release(); 3803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_dwPrevXRefOffset) { 3804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwPrevXRefOffset = xrefpos; 3807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_dwPrevXRefOffset >= m_dwFileLen) { 3808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SetStartOffset(m_dwPrevXRefOffset); 3811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND; 3812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_dwPrevXRefOffset = 0; 3817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND; 3818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTrailer->Release(); 3819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(m_Pos, iTrailerSize); 3823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3825ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints) 3826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (TRUE) { 3828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (m_docStatus) { 3829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_PAGETREE: 3830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadDocPages(pHints)) { 3831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_PAGE: 3835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadDocPage(iPage, pHints)) { 3836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_DATAAVAIL_ERROR: 3840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LoadAllFile(pHints); 3841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 3842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPagesTreeLoad = TRUE; 3843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPagesLoad = TRUE; 3844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bCurPageDictLoadOK = TRUE; 3845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGE; 3846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3850ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints) 3851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 3853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pPages = GetObject(dwPageNo, pHints, &bExist); 3854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bExist) { 3855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPages) { 3859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_ERROR) { 3860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPages->GetType() != PDFOBJ_ARRAY) { 3866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 3867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_type = PDF_PAGENODE_PAGES; 3871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = (CPDF_Array*)pPages; 3872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pArray->GetCount(); ++i) { 3873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pKid = (CPDF_Object *)pArray->GetElement(i); 3874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) { 3875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 3876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageNode *pNode = FX_NEW CPDF_PageNode(); 3878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_childNode.Add(pNode); 3879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum(); 3880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 3882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3884ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints) 3885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 3887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pPage = GetObject(dwPageNo, pHints, &bExist); 3888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bExist) { 3889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPage) { 3893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_docStatus == PDF_DATAAVAIL_ERROR) { 3894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPage->GetType() == PDFOBJ_ARRAY) { 3900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_dwPageNo = dwPageNo; 3901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_type = PDF_PAGENODE_ARRAY; 3902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPage->Release(); 3903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPage->GetType() != PDFOBJ_DICTIONARY) { 3906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPage->Release(); 3907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_dwPageNo = dwPageNo; 3911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString type = pPage->GetDict()->GetString(FX_BSTRC("Type")); 3912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == FX_BSTRC("Pages")) { 3913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_type = PDF_PAGENODE_PAGES; 3914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pKids = pPage->GetDict()->GetElement(FX_BSTRC("Kids")); 3915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pKids) { 3916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGE; 3917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (pKids->GetType()) { 3920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_REFERENCE: { 3921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Reference *pKid = (CPDF_Reference *)pKids; 3922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageNode *pNode = FX_NEW CPDF_PageNode(); 3923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_childNode.Add(pNode); 3924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode->m_dwPageNo = pKid->GetRefObjNum(); 3925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDFOBJ_ARRAY: { 3928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array *pKidsArray = (CPDF_Array *)pKids; 3929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) { 3930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pKid = (CPDF_Object *)pKidsArray->GetElement(i); 3931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) { 3932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 3933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageNode *pNode = FX_NEW CPDF_PageNode(); 3935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_childNode.Add(pNode); 3936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum(); 3937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 3941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (type == FX_BSTRC("Page")) { 3944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPageNode->m_type = PDF_PAGENODE_PAGE; 3945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 3946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPage->Release(); 3947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPage->Release(); 3951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3953ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints) 3954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = pageNodes.m_childNode.GetSize(); 3956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!iSize) { 3957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 3958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < iSize; ++i) { 3961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageNode *pNode = (CPDF_PageNode*)pageNodes.m_childNode.GetAt(i); 3962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pNode) { 3963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 3964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (pNode->m_type) { 3966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_PAGENODE_UNKOWN: 3967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) { 3968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 3971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_PAGENODE_PAGE: 3973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iCount++; 3974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPage == iCount && m_pDocument) { 3975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->m_PageList.SetAt(iPage, pNode->m_dwPageNo); 3976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_PAGENODE_PAGES: 3979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckPageNode(*pNode, iPage, iCount, pHints)) { 3980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PDF_PAGENODE_ARRAY: 3984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints)) { 3985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 3986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --i; 3988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 3989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPage == iCount) { 3991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_DONE; 3992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 3996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3997ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints) 3998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDocument->GetPageCount() <= iPage || m_pDocument->m_PageList.GetAt(iPage)) { 4000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_DONE; 4001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) { 4004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (iPage == 0) { 4005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_DONE; 4006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 4009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iCount = -1; 4012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CheckPageNode(m_pageNodes, iPage, iCount, pHints); 4013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4014ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints) 4015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bExist = FALSE; 4017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist); 4018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bExist) { 4019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 4020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPages) { 4023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pPagesDict = pPages->GetDict(); 4026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPagesDict) { 4027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 4028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_ERROR; 4029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPagesDict->KeyExist(FX_BSTRC("Kids"))) { 4032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 4033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pPagesDict->GetInteger(FX_BSTRC("Count")); 4036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (count > 0) { 4037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 4038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPages->Release(); 4041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4043ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadDocPages(IFX_DownloadHints* pHints) 4044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints)) { 4046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (CheckPageCount(pHints)) { 4049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_docStatus = PDF_DATAAVAIL_PAGE; 4050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bTotalLoadPageTree = TRUE; 4053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4056ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadPages(IFX_DownloadHints* pHints) 4057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (!m_bPagesTreeLoad) { 4059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckPageStatus(pHints)) { 4060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bPagesLoad) { 4064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDocument->LoadPages(); 4067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4069ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckLinearizedData(IFX_DownloadHints* pHints) 4070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bLinearedDataOK) { 4072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset))) { 4075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pHints->AddSegment(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset)); 4076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwRet = 0; 4079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bMainXRefLoad) { 4080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dwRet = ((CPDF_Parser *)m_pDocument->GetParser())->LoadLinearizedMainXRefTable(); 4081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dwRet == PDFPARSE_ERROR_SUCCESS) { 4082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!PreparePageItem()) { 4083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bMainXRefLoadedOK = TRUE; 4086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bMainXRefLoad = TRUE; 4088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLinearedDataOK = TRUE; 4090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4092ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPageAnnots(FX_INT32 iPage, IFX_DownloadHints* pHints) 4093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_objs_array.GetSize()) { 4095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objnum_array.RemoveAll(); 4097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pPageDict = m_pDocument->GetPage(iPage); 4098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pPageDict) { 4099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pAnnots = pPageDict->GetElement(FX_BSTRC("Annots")); 4102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pAnnots) { 4103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray obj_array; 4106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov obj_array.Add(pAnnots); 4107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); 4108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 4109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 4112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray new_objs_array; 4114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 4115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 4117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.Append(new_objs_array); 4118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 4120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4122ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckLinearizedFirstPage(FX_INT32 iPage, IFX_DownloadHints* pHints) 4123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bAnnotsLoad) { 4125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckPageAnnots(iPage, pHints)) { 4126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bAnnotsLoad = TRUE; 4129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bAnnotsLoad) 4131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckLinearizedData(pHints)) { 4132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPageLoadedOK = FALSE; 4135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4137ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::HaveResourceAncestor(CPDF_Dictionary *pDict) 4138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pParent = pDict->GetElement("Parent"); 4140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pParent) { 4141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pParentDict = pParent->GetDict(); 4144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pParentDict) { 4145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pRet = pParentDict->GetElement("Resource"); 4148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pRet) { 4149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPageResource = pRet; 4150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return HaveResourceAncestor(pParentDict); 4153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4155ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsPageAvail(FX_INT32 iPage, IFX_DownloadHints* pHints) 4156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pDocument) { 4158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (IsFirstCheck(iPage)) { 4161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bCurPageDictLoadOK = FALSE; 4162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPageLoadedOK = FALSE; 4163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bAnnotsLoad = FALSE; 4164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bNeedDownLoadResource = FALSE; 4165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objnum_array.RemoveAll(); 4167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pagesLoadState == NULL) { 4169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pagesLoadState = FX_NEW CFX_CMapDWordToDWord(); 4170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD dwPageLoad = 0; 4172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pagesLoadState->Lookup(iPage, dwPageLoad) && dwPageLoad != 0) { 4173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bLinearized) { 4176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_DWORD)iPage == m_dwFirstPageNo) { 4177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pagesLoadState->SetAt(iPage, TRUE); 4178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckLinearizedData(pHints)) { 4181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bMainXRefLoadedOK) { 4184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bTotalLoadPageTree) { 4185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadPages(pHints)) { 4186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) { 4190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!LoadAllFile(pHints)) { 4195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_Parser *)m_pDocument->GetParser())->RebuildCrossRef(); 4198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ResetFirstCheck(iPage); 4199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bTotalLoadPageTree) { 4203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) { 4204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bHaveAcroForm && !m_bAcroFormLoad) { 4209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckAcroFormSubObject(pHints)) { 4210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bAcroFormLoad = TRUE; 4213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bPageLoadedOK) { 4215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_objs_array.GetSize()) { 4216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objnum_array.RemoveAll(); 4218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPageDict = m_pDocument->GetPage(iPage); 4219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pPageDict) { 4220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ResetFirstCheck(iPage); 4221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray obj_array; 4224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov obj_array.Add(m_pPageDict); 4225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); 4226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 4227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPageLoadedOK = TRUE; 4229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 4231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray new_objs_array; 4234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 4235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 4237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPageLoadedOK = TRUE; 4238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.Append(new_objs_array); 4240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 4241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bPageLoadedOK) { 4245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bAnnotsLoad) { 4246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!CheckPageAnnots(iPage, pHints)) { 4247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bAnnotsLoad = TRUE; 4250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pPageDict && !m_bNeedDownLoadResource) { 4253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pRes = m_pPageDict->GetElement("Resource"); 4254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pRes) { 4255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bNeedDownLoadResource = HaveResourceAncestor(m_pPageDict); 4256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bNeedDownLoadResource = FALSE; 4258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bNeedDownLoadResource) { 4260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = CheckResources(pHints); 4261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 4262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bNeedDownLoadResource = FALSE; 4265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPageLoadedOK = FALSE; 4267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bAnnotsLoad = FALSE; 4268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bCurPageDictLoadOK = FALSE; 4269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ResetFirstCheck(iPage); 4270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pagesLoadState->SetAt(iPage, TRUE); 4271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4273ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints) 4274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_objs_array.GetSize()) { 4276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray obj_array; 4278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov obj_array.Add(m_pPageResource); 4279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); 4280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bRet) { 4281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 4284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 4285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray new_objs_array; 4286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 4287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 4289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.Append(new_objs_array); 4290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bRet; 4292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) 4295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPos) { 4297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pPos = m_dwLastXRefOffset; 4298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSize) { 4300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pSize = (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset); 4301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4303ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_DataAvail::IsFormAvail(IFX_DownloadHints *pHints) 4304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pDocument) { 4306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFFORM_AVAIL; 4307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bLinearizedFormParamLoad) { 4309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary *pRoot = m_pDocument->GetRoot(); 4310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pRoot) { 4311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFFORM_AVAIL; 4312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object *pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm")); 4314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pAcroForm) { 4315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFFORM_NOTEXIST; 4316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_bMainXRefLoad && !CheckLinearizedData(pHints)) { 4318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFFORM_NOTAVAIL; 4319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_objs_array.GetSize()) { 4321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.Add(pAcroForm->GetDict()); 4322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bLinearizedFormParamLoad = TRUE; 4324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray new_objs_array; 4326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 4327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.RemoveAll(); 4328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bRet) { 4329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_objs_array.Append(new_objs_array); 4330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFFORM_NOTAVAIL; 4331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFFORM_AVAIL; 4333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum) 4335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iNext = 0; 4337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (BinarySearch(dwObjNum, iNext)) { 4338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 4339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_number_array.InsertAt(iNext, dwObjNum); 4341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4342ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum) 4343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iNext = 0; 4345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return BinarySearch(dwObjNum, iNext); 4346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4347ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, FX_INT32 &iNext) 4348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iLen = m_number_array.GetSize(); 4350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iLow = 0; 4351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iHigh = iLen - 1; 4352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iMid = 0; 4353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (iLow <= iHigh) { 4354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iMid = (iLow + iHigh) / 2; 4355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD tt = m_number_array.GetAt(iMid); 4356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_number_array.GetAt(iMid) == value) { 4357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iNext = iMid; 4358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 4359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_number_array.GetAt(iMid) > value) { 4360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iHigh = iMid - 1; 4361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_number_array.GetAt(iMid) < value) { 4362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iLow = iMid + 1; 4363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iNext = iLow; 4366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 4367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4368ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_PageNode::~CPDF_PageNode() 4369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 iSize = m_childNode.GetSize(); 4371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_INT32 i = 0; i < iSize; ++i) { 4372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i]; 4373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pNode) { 4374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pNode; 4375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_childNode.RemoveAll(); 4378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4379