blob: 6c5332509a522274db450701589d25c1f3344843 [file] [log] [blame]
// Copyright 2016 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "xfa/fxfa/parser/xfa_basic_data.h"
#include <utility>
#include "fxjs/xfa/cjx_arc.h"
#include "fxjs/xfa/cjx_area.h"
#include "fxjs/xfa/cjx_assist.h"
#include "fxjs/xfa/cjx_barcode.h"
#include "fxjs/xfa/cjx_bind.h"
#include "fxjs/xfa/cjx_binditems.h"
#include "fxjs/xfa/cjx_bookend.h"
#include "fxjs/xfa/cjx_boolean.h"
#include "fxjs/xfa/cjx_border.h"
#include "fxjs/xfa/cjx_break.h"
#include "fxjs/xfa/cjx_breakafter.h"
#include "fxjs/xfa/cjx_breakbefore.h"
#include "fxjs/xfa/cjx_button.h"
#include "fxjs/xfa/cjx_calculate.h"
#include "fxjs/xfa/cjx_caption.h"
#include "fxjs/xfa/cjx_certificate.h"
#include "fxjs/xfa/cjx_certificates.h"
#include "fxjs/xfa/cjx_checkbutton.h"
#include "fxjs/xfa/cjx_choicelist.h"
#include "fxjs/xfa/cjx_color.h"
#include "fxjs/xfa/cjx_comb.h"
#include "fxjs/xfa/cjx_command.h"
#include "fxjs/xfa/cjx_connect.h"
#include "fxjs/xfa/cjx_connectstring.h"
#include "fxjs/xfa/cjx_contentarea.h"
#include "fxjs/xfa/cjx_corner.h"
#include "fxjs/xfa/cjx_datavalue.h"
#include "fxjs/xfa/cjx_datawindow.h"
#include "fxjs/xfa/cjx_date.h"
#include "fxjs/xfa/cjx_datetime.h"
#include "fxjs/xfa/cjx_datetimeedit.h"
#include "fxjs/xfa/cjx_decimal.h"
#include "fxjs/xfa/cjx_defaultui.h"
#include "fxjs/xfa/cjx_delete.h"
#include "fxjs/xfa/cjx_delta.h"
#include "fxjs/xfa/cjx_desc.h"
#include "fxjs/xfa/cjx_digestmethod.h"
#include "fxjs/xfa/cjx_digestmethods.h"
#include "fxjs/xfa/cjx_draw.h"
#include "fxjs/xfa/cjx_edge.h"
#include "fxjs/xfa/cjx_encoding.h"
#include "fxjs/xfa/cjx_encodings.h"
#include "fxjs/xfa/cjx_encrypt.h"
#include "fxjs/xfa/cjx_event.h"
#include "fxjs/xfa/cjx_eventpseudomodel.h"
#include "fxjs/xfa/cjx_exclgroup.h"
#include "fxjs/xfa/cjx_exdata.h"
#include "fxjs/xfa/cjx_execute.h"
#include "fxjs/xfa/cjx_exobject.h"
#include "fxjs/xfa/cjx_extras.h"
#include "fxjs/xfa/cjx_field.h"
#include "fxjs/xfa/cjx_fill.h"
#include "fxjs/xfa/cjx_filter.h"
#include "fxjs/xfa/cjx_float.h"
#include "fxjs/xfa/cjx_font.h"
#include "fxjs/xfa/cjx_format.h"
#include "fxjs/xfa/cjx_handler.h"
#include "fxjs/xfa/cjx_hostpseudomodel.h"
#include "fxjs/xfa/cjx_image.h"
#include "fxjs/xfa/cjx_imageedit.h"
#include "fxjs/xfa/cjx_insert.h"
#include "fxjs/xfa/cjx_instancemanager.h"
#include "fxjs/xfa/cjx_integer.h"
#include "fxjs/xfa/cjx_issuers.h"
#include "fxjs/xfa/cjx_items.h"
#include "fxjs/xfa/cjx_keep.h"
#include "fxjs/xfa/cjx_keyusage.h"
#include "fxjs/xfa/cjx_layoutpseudomodel.h"
#include "fxjs/xfa/cjx_line.h"
#include "fxjs/xfa/cjx_linear.h"
#include "fxjs/xfa/cjx_logpseudomodel.h"
#include "fxjs/xfa/cjx_manifest.h"
#include "fxjs/xfa/cjx_map.h"
#include "fxjs/xfa/cjx_margin.h"
#include "fxjs/xfa/cjx_mdp.h"
#include "fxjs/xfa/cjx_medium.h"
#include "fxjs/xfa/cjx_message.h"
#include "fxjs/xfa/cjx_node.h"
#include "fxjs/xfa/cjx_numericedit.h"
#include "fxjs/xfa/cjx_occur.h"
#include "fxjs/xfa/cjx_oid.h"
#include "fxjs/xfa/cjx_oids.h"
#include "fxjs/xfa/cjx_operation.h"
#include "fxjs/xfa/cjx_overflow.h"
#include "fxjs/xfa/cjx_packet.h"
#include "fxjs/xfa/cjx_pagearea.h"
#include "fxjs/xfa/cjx_pageset.h"
#include "fxjs/xfa/cjx_para.h"
#include "fxjs/xfa/cjx_password.h"
#include "fxjs/xfa/cjx_passwordedit.h"
#include "fxjs/xfa/cjx_pattern.h"
#include "fxjs/xfa/cjx_picture.h"
#include "fxjs/xfa/cjx_query.h"
#include "fxjs/xfa/cjx_radial.h"
#include "fxjs/xfa/cjx_reason.h"
#include "fxjs/xfa/cjx_reasons.h"
#include "fxjs/xfa/cjx_recordset.h"
#include "fxjs/xfa/cjx_rectangle.h"
#include "fxjs/xfa/cjx_ref.h"
#include "fxjs/xfa/cjx_rootelement.h"
#include "fxjs/xfa/cjx_script.h"
#include "fxjs/xfa/cjx_select.h"
#include "fxjs/xfa/cjx_setproperty.h"
#include "fxjs/xfa/cjx_signature.h"
#include "fxjs/xfa/cjx_signatureproperties.h"
#include "fxjs/xfa/cjx_signaturepseudomodel.h"
#include "fxjs/xfa/cjx_signdata.h"
#include "fxjs/xfa/cjx_signing.h"
#include "fxjs/xfa/cjx_soapaction.h"
#include "fxjs/xfa/cjx_soapaddress.h"
#include "fxjs/xfa/cjx_solid.h"
#include "fxjs/xfa/cjx_source.h"
#include "fxjs/xfa/cjx_sourceset.h"
#include "fxjs/xfa/cjx_speak.h"
#include "fxjs/xfa/cjx_stipple.h"
#include "fxjs/xfa/cjx_subform.h"
#include "fxjs/xfa/cjx_subformset.h"
#include "fxjs/xfa/cjx_subjectdn.h"
#include "fxjs/xfa/cjx_subjectdns.h"
#include "fxjs/xfa/cjx_submit.h"
#include "fxjs/xfa/cjx_text.h"
#include "fxjs/xfa/cjx_textedit.h"
#include "fxjs/xfa/cjx_time.h"
#include "fxjs/xfa/cjx_timestamp.h"
#include "fxjs/xfa/cjx_tooltip.h"
#include "fxjs/xfa/cjx_traversal.h"
#include "fxjs/xfa/cjx_traverse.h"
#include "fxjs/xfa/cjx_tree.h"
#include "fxjs/xfa/cjx_treelist.h"
#include "fxjs/xfa/cjx_ui.h"
#include "fxjs/xfa/cjx_update.h"
#include "fxjs/xfa/cjx_uri.h"
#include "fxjs/xfa/cjx_user.h"
#include "fxjs/xfa/cjx_validate.h"
#include "fxjs/xfa/cjx_value.h"
#include "fxjs/xfa/cjx_variables.h"
#include "fxjs/xfa/cjx_wsdladdress.h"
#include "fxjs/xfa/cjx_wsdlconnection.h"
#include "fxjs/xfa/cjx_xfa.h"
#include "fxjs/xfa/cjx_xmlconnection.h"
#include "fxjs/xfa/cjx_xsdconnection.h"
#include "xfa/fxfa/fxfa_basic.h"
namespace {
struct ElementRecord {
uint32_t hash; // Hashed as wide string.
XFA_Element element;
XFA_Element parent;
const char* name;
};
const ElementRecord g_ElementTable[] = {
#undef ELEM____
#define ELEM____(a, b, c, d) {a, XFA_Element::c, XFA_Element::d, b},
#include "xfa/fxfa/parser/elements.inc"
#undef ELEM____
};
struct AttributeRecord {
uint32_t hash; // Hashed as wide string.
XFA_Attribute attribute;
XFA_ScriptType script_type;
const char* name;
};
const AttributeRecord g_AttributeTable[] = {
#undef ATTR____
#define ATTR____(a, b, c, d) {a, XFA_Attribute::c, XFA_ScriptType::d, b},
#include "xfa/fxfa/parser/attributes.inc"
#undef ATTR____
};
struct AttributeValueRecord {
uint32_t uHash; // |pName| hashed as WideString.
XFA_AttributeValue eName;
const char* pName;
};
const AttributeValueRecord g_AttributeValueTable[] = {
#undef VALUE____
#define VALUE____(a, b, c) {a, XFA_AttributeValue::c, b},
#include "xfa/fxfa/parser/attribute_values.inc"
#undef VALUE____
};
struct ElementAttributeRecord {
XFA_Element element;
XFA_Attribute attribute;
XFA_ATTRIBUTE_CALLBACK callback;
};
const ElementAttributeRecord g_ElementAttributeTable[] = {
#undef ELEM_ATTR____
#define ELEM_ATTR____(a, b, c) \
{XFA_Element::a, XFA_Attribute::b, \
reinterpret_cast<XFA_ATTRIBUTE_CALLBACK>(c)},
#include "xfa/fxfa/parser/element_attributes.inc"
#undef ELEM_ATTR____
};
} // namespace
ByteStringView XFA_ElementToName(XFA_Element elem) {
return g_ElementTable[static_cast<size_t>(elem)].name;
}
XFA_Element XFA_GetElementByName(const WideString& name) {
uint32_t hash = FX_HashCode_GetW(name.AsStringView(), false);
auto* elem = std::lower_bound(
std::begin(g_ElementTable), std::end(g_ElementTable), hash,
[](const ElementRecord& a, uint32_t hash) { return a.hash < hash; });
if (elem != std::end(g_ElementTable) && name.EqualsASCII(elem->name))
return elem->element;
return XFA_Element::Unknown;
}
ByteStringView XFA_AttributeToName(XFA_Attribute attr) {
return g_AttributeTable[static_cast<size_t>(attr)].name;
}
Optional<XFA_ATTRIBUTEINFO> XFA_GetAttributeByName(const WideStringView& name) {
uint32_t hash = FX_HashCode_GetW(name, false);
auto* elem = std::lower_bound(
std::begin(g_AttributeTable), std::end(g_AttributeTable), hash,
[](const AttributeRecord& a, uint32_t hash) { return a.hash < hash; });
if (elem != std::end(g_AttributeTable) && name.EqualsASCII(elem->name)) {
XFA_ATTRIBUTEINFO result;
result.attribute = elem->attribute;
result.eValueType = elem->script_type;
return result;
}
return {};
}
ByteStringView XFA_AttributeValueToName(XFA_AttributeValue item) {
return g_AttributeValueTable[static_cast<int32_t>(item)].pName;
}
Optional<XFA_AttributeValue> XFA_GetAttributeValueByName(
const WideStringView& name) {
auto* it = std::lower_bound(std::begin(g_AttributeValueTable),
std::end(g_AttributeValueTable),
FX_HashCode_GetW(name, false),
[](const AttributeValueRecord& arg,
uint32_t hash) { return arg.uHash < hash; });
if (it != std::end(g_AttributeValueTable) && name.EqualsASCII(it->pName))
return it->eName;
return {};
}
Optional<XFA_SCRIPTATTRIBUTEINFO> XFA_GetScriptAttributeByName(
XFA_Element element,
WideStringView attribute_name) {
Optional<XFA_ATTRIBUTEINFO> attr = XFA_GetAttributeByName(attribute_name);
if (!attr.has_value())
return {};
while (element != XFA_Element::Unknown) {
auto compound_key = std::make_pair(element, attr.value().attribute);
auto* it = std::lower_bound(
std::begin(g_ElementAttributeTable), std::end(g_ElementAttributeTable),
compound_key,
[](const ElementAttributeRecord& arg,
const std::pair<XFA_Element, XFA_Attribute>& key) {
return std::make_pair(arg.element, arg.attribute) < key;
});
if (it != std::end(g_ElementAttributeTable) &&
compound_key == std::make_pair(it->element, it->attribute)) {
XFA_SCRIPTATTRIBUTEINFO result;
result.attribute = attr.value().attribute;
result.eValueType = attr.value().eValueType;
result.callback = it->callback;
return result;
}
element = g_ElementTable[static_cast<size_t>(element)].parent;
}
return {};
}