コード例 #1
0
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();
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
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();
}