FX_DWORD CPDF_StreamContentParser::Parse(const uint8_t* pData, FX_DWORD dwSize, FX_DWORD max_cost) { if (m_Level > _FPDF_MAX_FORM_LEVEL_) { return dwSize; } FX_DWORD InitObjCount = m_pObjectList->CountObjects(); CPDF_StreamParser syntax(pData, dwSize); CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax); m_CompatCount = 0; while (1) { FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount; if (max_cost && cost >= max_cost) { break; } switch (syntax.ParseNextElement()) { case CPDF_StreamParser::EndOfData: return m_pSyntax->GetPos(); case CPDF_StreamParser::Keyword: OnOperator((char*)syntax.GetWordBuf()); ClearAllParams(); break; case CPDF_StreamParser::Number: AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize()); break; case CPDF_StreamParser::Name: AddNameParam((const FX_CHAR*)syntax.GetWordBuf() + 1, syntax.GetWordSize() - 1); break; default: AddObjectParam(syntax.GetObject()); } } return m_pSyntax->GetPos(); }
void CPDF_StreamContentParser::EndDict() { if (m_ObjectSize == 0) { return; } CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1]; if (pCurObj->GetType() != PDFOBJ_DICTIONARY) { return; } m_ObjectSize --; if (m_ObjectSize == 0) { AddObjectParam(pCurObj); } else { if (!m_pObjectState[m_ObjectSize]) { pCurObj->Release(); } } m_pObjectState[m_ObjectSize] = FALSE; }
FX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject) { if (m_ObjectSize == 0) { AddObjectParam(pObject); return TRUE; } FX_BOOL bInArrayOrDict = TRUE; CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1]; if (pCurObj->GetType() == PDFOBJ_ARRAY) { ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument); } else { if (!m_bDictName && m_pDictName[0]) { ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument); } else { bInArrayOrDict = FALSE; } m_bDictName = TRUE; } return bInArrayOrDict; }
FX_DWORD CPDF_StreamContentParser::Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost) { if (m_Level > _FPDF_MAX_FORM_LEVEL_) { return dwSize; } FX_DWORD InitObjCount = m_pObjectList->CountObjects(); CPDF_StreamParser syntax(pData, dwSize); m_pSyntax = &syntax; m_CompatCount = 0; while (1) { FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount; if (max_cost && cost >= max_cost) { break; } switch (syntax.ParseNextElement()) { case CPDF_StreamParser::EndOfData: return m_pSyntax->GetPos(); case CPDF_StreamParser::Keyword: if(!OnOperator((char*)syntax.GetWordBuf()) && _PDF_HasInvalidOpChar((char*)syntax.GetWordBuf())) { m_bAbort = TRUE; } if (m_bAbort) { return m_pSyntax->GetPos(); } ClearAllParams(); break; case CPDF_StreamParser::Number: AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize()); break; case CPDF_StreamParser::Name: AddNameParam((FX_LPCSTR)syntax.GetWordBuf() + 1, syntax.GetWordSize() - 1); break; default: AddObjectParam(syntax.GetObject()); } } return m_pSyntax->GetPos(); }