diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-11-27 19:58:46 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-11-27 19:58:46 +0000 |
commit | 9b93815edae6687d79d73c153c30d27e280c7571 (patch) | |
tree | bf56d32e5cebd4b5611a221115342badab72aafc | |
parent | 9a48fd1aabf105b168f5d8fc26549ae0d41d002e (diff) | |
download | pdfium-9b93815edae6687d79d73c153c30d27e280c7571.tar.xz |
Add helpers to get attribute information
This CL adds helpers to CXFA_Node to get the type of an attribute and
the default value for a given attribute.
Change-Id: I8bf41f568fe1da650fb3df4232b63d2e48038e07
Reviewed-on: https://pdfium-review.googlesource.com/19330
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
-rw-r--r-- | fxjs/cjx_node.cpp | 52 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_node.cpp | 82 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_node.h | 3 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_utils.cpp | 25 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_utils.h | 5 |
5 files changed, 73 insertions, 94 deletions
diff --git a/fxjs/cjx_node.cpp b/fxjs/cjx_node.cpp index f01ead60a9..e81a239578 100644 --- a/fxjs/cjx_node.cpp +++ b/fxjs/cjx_node.cpp @@ -190,33 +190,25 @@ bool CJX_Node::HasAttribute(XFA_Attribute eAttr) { bool CJX_Node::SetAttribute(XFA_Attribute eAttr, const WideStringView& wsValue, bool bNotify) { - const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr); - - XFA_AttributeType eType = pAttr->eType; - if (eType == XFA_AttributeType::NotSure) { - const XFA_NOTSUREATTRIBUTE* pNotsure = - XFA_GetNotsureAttribute(GetXFANode()->GetElementType(), pAttr->eName); - eType = pNotsure ? pNotsure->eType : XFA_AttributeType::CData; - } + XFA_AttributeType eType = GetXFANode()->GetAttributeType(eAttr); switch (eType) { case XFA_AttributeType::Enum: { const XFA_ATTRIBUTEENUMINFO* pEnum = XFA_GetAttributeEnumByName(wsValue); - return SetEnum(pAttr->eName, - pEnum ? pEnum->eName - : (XFA_ATTRIBUTEENUM)(intptr_t)(pAttr->pDefValue), - bNotify); + return SetEnum( + eAttr, pEnum ? pEnum->eName : *(GetXFANode()->GetDefaultEnum(eAttr)), + bNotify); } break; case XFA_AttributeType::CData: - return SetCData(pAttr->eName, WideString(wsValue), bNotify, false); + return SetCData(eAttr, WideString(wsValue), bNotify, false); case XFA_AttributeType::Boolean: - return SetBoolean(pAttr->eName, wsValue != L"0", bNotify); + return SetBoolean(eAttr, wsValue != L"0", bNotify); case XFA_AttributeType::Integer: - return SetInteger(pAttr->eName, + return SetInteger(eAttr, FXSYS_round(FXSYS_wcstof(wsValue.unterminated_c_str(), wsValue.GetLength(), nullptr)), bNotify); case XFA_AttributeType::Measure: - return SetMeasure(pAttr->eName, CXFA_Measurement(wsValue), bNotify); + return SetMeasure(eAttr, CXFA_Measurement(wsValue), bNotify); default: break; } @@ -245,41 +237,32 @@ WideString CJX_Node::GetAttribute(XFA_Attribute attr) { pdfium::Optional<WideString> CJX_Node::TryAttribute(XFA_Attribute eAttr, bool bUseDefault) { - const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr); - - XFA_AttributeType eType = pAttr->eType; - if (eType == XFA_AttributeType::NotSure) { - const XFA_NOTSUREATTRIBUTE* pNotsure = - XFA_GetNotsureAttribute(GetXFANode()->GetElementType(), pAttr->eName); - eType = pNotsure ? pNotsure->eType : XFA_AttributeType::CData; - } + XFA_AttributeType eType = GetXFANode()->GetAttributeType(eAttr); switch (eType) { case XFA_AttributeType::Enum: { - pdfium::Optional<XFA_ATTRIBUTEENUM> value = - TryEnum(pAttr->eName, bUseDefault); + pdfium::Optional<XFA_ATTRIBUTEENUM> value = TryEnum(eAttr, bUseDefault); if (!value) return {}; return {GetAttributeEnumByID(*value)->pName}; } case XFA_AttributeType::CData: - return TryCData(pAttr->eName, bUseDefault); + return TryCData(eAttr, bUseDefault); case XFA_AttributeType::Boolean: { - pdfium::Optional<bool> value = TryBoolean(pAttr->eName, bUseDefault); + pdfium::Optional<bool> value = TryBoolean(eAttr, bUseDefault); if (!value) return {}; return {*value ? L"1" : L"0"}; } case XFA_AttributeType::Integer: { - pdfium::Optional<int32_t> iValue = TryInteger(pAttr->eName, bUseDefault); + pdfium::Optional<int32_t> iValue = TryInteger(eAttr, bUseDefault); if (!iValue) return {}; return {WideString::Format(L"%d", *iValue)}; } case XFA_AttributeType::Measure: { - pdfium::Optional<CXFA_Measurement> value = - TryMeasure(pAttr->eName, bUseDefault); + pdfium::Optional<CXFA_Measurement> value = TryMeasure(eAttr, bUseDefault); if (!value) return {}; @@ -3118,11 +3101,10 @@ bool CJX_Node::SetCData(XFA_Attribute eAttr, } return true; } - - const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttr); ASSERT(elem->GetType() == FX_XMLNODE_Element); - WideString wsAttrName = pInfo->pName; - if (pInfo->eName == XFA_Attribute::ContentType) + + WideString wsAttrName = CXFA_Node::AttributeToName(eAttr); + if (eAttr == XFA_Attribute::ContentType) wsAttrName = L"xfa:" + wsAttrName; elem->SetString(wsAttrName, wsValue); diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp index ee2a6df071..f11876f255 100644 --- a/xfa/fxfa/parser/cxfa_node.cpp +++ b/xfa/fxfa/parser/cxfa_node.cpp @@ -333,6 +333,17 @@ XFA_Attribute CXFA_Node::GetAttribute(size_t i) const { return *(m_Attributes + i); } +XFA_AttributeType CXFA_Node::GetAttributeType(XFA_Attribute type) const { + const XFA_ATTRIBUTEINFO* attr = XFA_GetAttributeByID(type); + XFA_AttributeType eType = attr->eType; + if (eType != XFA_AttributeType::NotSure) + return eType; + + const XFA_NOTSUREATTRIBUTE* pNotsure = + XFA_GetNotsureAttribute(GetElementType(), attr->eName); + return pNotsure ? pNotsure->eType : XFA_AttributeType::CData; +} + CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem, XFA_ObjectType eType) const { CXFA_Node* pNode = nullptr; @@ -1318,56 +1329,69 @@ CXFA_Node* CXFA_Node::CreateInstance(bool bDataMerge) { } pdfium::Optional<bool> CXFA_Node::GetDefaultBoolean(XFA_Attribute attr) const { - void* pValue = nullptr; - if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr, - XFA_AttributeType::Boolean, - GetPacketID())) { + pdfium::Optional<void*> value = + GetDefaultValue(attr, XFA_AttributeType::Boolean); + if (!value) return {}; - } - return {!!pValue}; + return {!!*value}; } pdfium::Optional<int32_t> CXFA_Node::GetDefaultInteger( XFA_Attribute attr) const { - void* pValue = nullptr; - if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr, - XFA_AttributeType::Integer, - GetPacketID())) { + pdfium::Optional<void*> value = + GetDefaultValue(attr, XFA_AttributeType::Integer); + if (!value) return {}; - } - return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(pValue))}; + return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(*value))}; } pdfium::Optional<CXFA_Measurement> CXFA_Node::GetDefaultMeasurement( XFA_Attribute attr) const { - void* pValue = nullptr; - if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr, - XFA_AttributeType::Measure, - GetPacketID())) { + pdfium::Optional<void*> value = + GetDefaultValue(attr, XFA_AttributeType::Measure); + if (!value) return {}; - } + CXFA_Measurement measure; - memcpy(&measure, pValue, sizeof(measure)); + memcpy(&measure, *value, sizeof(measure)); return {measure}; } pdfium::Optional<WideString> CXFA_Node::GetDefaultCData( XFA_Attribute attr) const { - void* pValue = nullptr; - if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr, - XFA_AttributeType::CData, GetPacketID())) { + pdfium::Optional<void*> value = + GetDefaultValue(attr, XFA_AttributeType::CData); + if (!value) return {}; - } - WideStringView view((const wchar_t*)pValue); - return {WideString(view)}; + + return {WideString(static_cast<const wchar_t*>(*value))}; } pdfium::Optional<XFA_ATTRIBUTEENUM> CXFA_Node::GetDefaultEnum( XFA_Attribute attr) const { - void* pValue = nullptr; - if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr, - XFA_AttributeType::Enum, GetPacketID())) { + pdfium::Optional<void*> value = + GetDefaultValue(attr, XFA_AttributeType::Enum); + if (!value) return {}; - } - return {static_cast<XFA_ATTRIBUTEENUM>(reinterpret_cast<uintptr_t>(pValue))}; + return {static_cast<XFA_ATTRIBUTEENUM>(reinterpret_cast<uintptr_t>(*value))}; +} + +pdfium::Optional<void*> CXFA_Node::GetDefaultValue( + XFA_Attribute attr, + XFA_AttributeType eType) const { + const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(attr); + if (!pInfo) + return {}; + if (GetPacketID() && (GetPacketID() & pInfo->dwPackets) == 0) + return {}; + if (pInfo->eType == eType) + return {pInfo->pDefValue}; + if (pInfo->eType != XFA_AttributeType::NotSure) + return {}; + + const XFA_NOTSUREATTRIBUTE* pAttr = + XFA_GetNotsureAttribute(GetElementType(), attr, eType); + if (pAttr) + return {pAttr->pValue}; + return {}; } diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h index e5f47a1828..7465f31106 100644 --- a/xfa/fxfa/parser/cxfa_node.h +++ b/xfa/fxfa/parser/cxfa_node.h @@ -70,6 +70,7 @@ class CXFA_Node : public CXFA_Object { bool HasAttribute(XFA_Attribute attr) const; XFA_Attribute GetAttribute(size_t i) const; + XFA_AttributeType GetAttributeType(XFA_Attribute type) const; uint32_t GetPacketID() const { return m_ePacket; } @@ -183,6 +184,8 @@ class CXFA_Node : public CXFA_Object { const PropertyData* GetPropertyData(XFA_Element property) const; pdfium::Optional<XFA_Element> GetFirstPropertyWithFlag(uint8_t flag); void OnRemoved(bool bNotify); + pdfium::Optional<void*> GetDefaultValue(XFA_Attribute attr, + XFA_AttributeType eType) const; const PropertyData* m_Properties; const XFA_Attribute* m_Attributes; diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp index 7fb5ff573d..2f5b479166 100644 --- a/xfa/fxfa/parser/xfa_utils.cpp +++ b/xfa/fxfa/parser/xfa_utils.cpp @@ -243,31 +243,6 @@ const XFA_NOTSUREATTRIBUTE* XFA_GetNotsureAttribute(XFA_Element eElement, return nullptr; } -bool XFA_GetAttributeDefaultValue(void*& pValue, - XFA_Element eElement, - XFA_Attribute eAttribute, - XFA_AttributeType eType, - uint32_t dwPacket) { - const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttribute); - if (!pInfo) - return false; - if (dwPacket && (dwPacket & pInfo->dwPackets) == 0) - return false; - if (pInfo->eType == eType) { - pValue = pInfo->pDefValue; - return true; - } - if (pInfo->eType == XFA_AttributeType::NotSure) { - const XFA_NOTSUREATTRIBUTE* pAttr = - XFA_GetNotsureAttribute(eElement, eAttribute, eType); - if (pAttr) { - pValue = pAttr->pValue; - return true; - } - } - return false; -} - const XFA_ATTRIBUTEINFO* XFA_GetAttributeByID(XFA_Attribute eName) { ASSERT(static_cast<uint8_t>(eName) < g_iXFAAttributeCount); return g_XFAAttributeData + static_cast<uint8_t>(eName); diff --git a/xfa/fxfa/parser/xfa_utils.h b/xfa/fxfa/parser/xfa_utils.h index afc1076d35..7a7eb1546c 100644 --- a/xfa/fxfa/parser/xfa_utils.h +++ b/xfa/fxfa/parser/xfa_utils.h @@ -49,11 +49,6 @@ const XFA_SCRIPTATTRIBUTEINFO* XFA_GetScriptAttributeByName( const XFA_Attribute* XFA_GetElementAttributes(XFA_Element eElement, int32_t& iCount); -bool XFA_GetAttributeDefaultValue(void*& pValue, - XFA_Element eElement, - XFA_Attribute eAttribute, - XFA_AttributeType eType, - uint32_t dwPacket); const XFA_ATTRIBUTEINFO* XFA_GetAttributeByID(XFA_Attribute eName); const XFA_ATTRIBUTEENUMINFO* XFA_GetAttributeEnumByName( const WideStringView& wsName); |