FX_BOOL CFDE_CSSStyleSheet::LoadFromSyntax(IFDE_CSSSyntaxParser* pSyntax) { Reset(); m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0); if (m_pAllocator == NULL) { return FALSE; } FDE_CSSSYNTAXSTATUS eStatus; do { switch (eStatus = pSyntax->DoSyntaxParse()) { case FDE_CSSSYNTAXSTATUS_StyleRule: eStatus = LoadStyleRule(pSyntax, m_RuleArray); break; case FDE_CSSSYNTAXSTATUS_MediaRule: eStatus = LoadMediaRule(pSyntax); break; case FDE_CSSSYNTAXSTATUS_FontFaceRule: eStatus = LoadFontFaceRule(pSyntax, m_RuleArray); break; case FDE_CSSSYNTAXSTATUS_ImportRule: eStatus = LoadImportRule(pSyntax); break; case FDE_CSSSYNTAXSTATUS_PageRule: eStatus = LoadPageRule(pSyntax); break; default: break; } } while (eStatus >= FDE_CSSSYNTAXSTATUS_None); m_Selectors.RemoveAll(); m_StringCache.RemoveAll(); return eStatus != FDE_CSSSYNTAXSTATUS_Error; }
bool CFX_CSSStyleSheet::LoadBuffer(const wchar_t* pBuffer, int32_t iBufSize) { ASSERT(pBuffer); ASSERT(iBufSize > 0); auto pSyntax = pdfium::MakeUnique<CFX_CSSSyntaxParser>(pBuffer, iBufSize); Reset(); CFX_CSSSyntaxStatus eStatus; do { switch (eStatus = pSyntax->DoSyntaxParse()) { case CFX_CSSSyntaxStatus::StyleRule: eStatus = LoadStyleRule(pSyntax.get(), &m_RuleArray); break; default: break; } } while (eStatus >= CFX_CSSSyntaxStatus::None); m_StringCache.clear(); return eStatus != CFX_CSSSyntaxStatus::Error; }
FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule( IFDE_CSSSyntaxParser* pSyntax) { FX_DWORD dwMediaList = 0; CFDE_CSSMediaRule* pMediaRule = NULL; for (;;) { switch (pSyntax->DoSyntaxParse()) { case FDE_CSSSYNTAXSTATUS_MediaType: { int32_t iLen; const FX_WCHAR* psz = pSyntax->GetCurrentString(iLen); FDE_LPCCSSMEDIATYPETABLE pMediaType = FDE_GetCSSMediaTypeByName(psz, iLen); if (pMediaType != NULL) { dwMediaList |= pMediaType->wValue; } } break; case FDE_CSSSYNTAXSTATUS_StyleRule: if (pMediaRule == NULL) { SkipRuleSet(pSyntax); } else { FDE_CSSSYNTAXSTATUS eStatus = LoadStyleRule(pSyntax, pMediaRule->GetArray()); if (eStatus < FDE_CSSSYNTAXSTATUS_None) { return eStatus; } } break; case FDE_CSSSYNTAXSTATUS_DeclOpen: if ((dwMediaList & m_dwMediaList) > 0 && pMediaRule == NULL) { pMediaRule = FDE_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList); m_RuleArray.Add(pMediaRule); } break; case FDE_CSSSYNTAXSTATUS_DeclClose: return FDE_CSSSYNTAXSTATUS_None; FDE_CSSSWITCHDEFAULTS(); } } }