summaryrefslogtreecommitdiff
path: root/xfa
diff options
context:
space:
mode:
authorDan Sinclair <dsinclair@chromium.org>2017-11-27 19:58:46 +0000
committerChromium commit bot <commit-bot@chromium.org>2017-11-27 19:58:46 +0000
commit9b93815edae6687d79d73c153c30d27e280c7571 (patch)
treebf56d32e5cebd4b5611a221115342badab72aafc /xfa
parent9a48fd1aabf105b168f5d8fc26549ae0d41d002e (diff)
downloadpdfium-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>
Diffstat (limited to 'xfa')
-rw-r--r--xfa/fxfa/parser/cxfa_node.cpp82
-rw-r--r--xfa/fxfa/parser/cxfa_node.h3
-rw-r--r--xfa/fxfa/parser/xfa_utils.cpp25
-rw-r--r--xfa/fxfa/parser/xfa_utils.h5
4 files changed, 56 insertions, 59 deletions
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);