| // Copyright 2017 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/cxfa_barcode.h" |
| |
| #include "fxjs/xfa/cjx_node.h" |
| #include "xfa/fxfa/parser/cxfa_document.h" |
| #include "xfa/fxfa/parser/cxfa_measurement.h" |
| |
| namespace { |
| |
| const CXFA_Node::AttributeData kBarcodeAttributeData[] = { |
| {XFA_Attribute::Id, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::DataRowCount, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::Use, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::DataPrep, XFA_AttributeType::Enum, |
| (void*)XFA_AttributeValue::None}, |
| {XFA_Attribute::Type, XFA_AttributeType::CData, (void*)nullptr}, |
| {XFA_Attribute::TextLocation, XFA_AttributeType::Enum, |
| (void*)XFA_AttributeValue::Below}, |
| {XFA_Attribute::ModuleWidth, XFA_AttributeType::Measure, (void*)L"0.25mm"}, |
| {XFA_Attribute::PrintCheckDigit, XFA_AttributeType::Boolean, (void*)0}, |
| {XFA_Attribute::ModuleHeight, XFA_AttributeType::Measure, (void*)L"5mm"}, |
| {XFA_Attribute::StartChar, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::Truncate, XFA_AttributeType::Boolean, (void*)0}, |
| {XFA_Attribute::WideNarrowRatio, XFA_AttributeType::CData, (void*)L"3:1"}, |
| {XFA_Attribute::ErrorCorrectionLevel, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::UpsMode, XFA_AttributeType::Enum, |
| (void*)XFA_AttributeValue::UsCarrier}, |
| {XFA_Attribute::Checksum, XFA_AttributeType::Enum, |
| (void*)XFA_AttributeValue::None}, |
| {XFA_Attribute::CharEncoding, XFA_AttributeType::CData, (void*)L"UTF-8"}, |
| {XFA_Attribute::Usehref, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::DataColumnCount, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::RowColumnRatio, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::DataLength, XFA_AttributeType::CData, nullptr}, |
| {XFA_Attribute::EndChar, XFA_AttributeType::CData, nullptr}, |
| }; |
| |
| } // namespace |
| |
| CXFA_Barcode::CXFA_Barcode(CXFA_Document* doc, XFA_PacketType packet) |
| : CXFA_Node(doc, |
| packet, |
| (XFA_XDPPACKET_Template | XFA_XDPPACKET_Form), |
| XFA_ObjectType::Node, |
| XFA_Element::Barcode, |
| {}, |
| kBarcodeAttributeData, |
| cppgc::MakeGarbageCollected<CJX_Node>( |
| doc->GetHeap()->GetAllocationHandle(), |
| this)) {} |
| |
| CXFA_Barcode::~CXFA_Barcode() = default; |
| |
| XFA_FFWidgetType CXFA_Barcode::GetDefaultFFWidgetType() const { |
| return XFA_FFWidgetType::kBarcode; |
| } |
| |
| WideString CXFA_Barcode::GetBarcodeType() { |
| return WideString(JSObject()->GetCData(XFA_Attribute::Type)); |
| } |
| |
| Optional<WideString> CXFA_Barcode::GetCharEncoding() { |
| return JSObject()->TryCData(XFA_Attribute::CharEncoding, true); |
| } |
| |
| Optional<bool> CXFA_Barcode::GetChecksum() { |
| Optional<XFA_AttributeValue> checksum = |
| JSObject()->TryEnum(XFA_Attribute::Checksum, true); |
| if (!checksum) |
| return {}; |
| |
| switch (*checksum) { |
| case XFA_AttributeValue::None: |
| return {false}; |
| case XFA_AttributeValue::Auto: |
| return {true}; |
| case XFA_AttributeValue::Checksum_1mod10: |
| case XFA_AttributeValue::Checksum_1mod10_1mod11: |
| case XFA_AttributeValue::Checksum_2mod10: |
| default: |
| break; |
| } |
| return {}; |
| } |
| |
| Optional<int32_t> CXFA_Barcode::GetDataLength() { |
| Optional<WideString> wsDataLength = |
| JSObject()->TryCData(XFA_Attribute::DataLength, true); |
| if (!wsDataLength) |
| return {}; |
| |
| return {FXSYS_wtoi(wsDataLength->c_str())}; |
| } |
| |
| Optional<char> CXFA_Barcode::GetStartChar() { |
| Optional<WideString> wsStartEndChar = |
| JSObject()->TryCData(XFA_Attribute::StartChar, true); |
| if (!wsStartEndChar || wsStartEndChar->IsEmpty()) |
| return {}; |
| |
| return {static_cast<char>((*wsStartEndChar)[0])}; |
| } |
| |
| Optional<char> CXFA_Barcode::GetEndChar() { |
| Optional<WideString> wsStartEndChar = |
| JSObject()->TryCData(XFA_Attribute::EndChar, true); |
| if (!wsStartEndChar || wsStartEndChar->IsEmpty()) |
| return {}; |
| |
| return {static_cast<char>((*wsStartEndChar)[0])}; |
| } |
| |
| Optional<int32_t> CXFA_Barcode::GetECLevel() { |
| Optional<WideString> wsECLevel = |
| JSObject()->TryCData(XFA_Attribute::ErrorCorrectionLevel, true); |
| if (!wsECLevel) |
| return {}; |
| return {FXSYS_wtoi(wsECLevel->c_str())}; |
| } |
| |
| Optional<int32_t> CXFA_Barcode::GetModuleWidth() { |
| Optional<CXFA_Measurement> moduleWidthHeight = |
| JSObject()->TryMeasure(XFA_Attribute::ModuleWidth, true); |
| if (!moduleWidthHeight) |
| return {}; |
| |
| return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))}; |
| } |
| |
| Optional<int32_t> CXFA_Barcode::GetModuleHeight() { |
| Optional<CXFA_Measurement> moduleWidthHeight = |
| JSObject()->TryMeasure(XFA_Attribute::ModuleHeight, true); |
| if (!moduleWidthHeight) |
| return {}; |
| |
| return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))}; |
| } |
| |
| Optional<bool> CXFA_Barcode::GetPrintChecksum() { |
| return JSObject()->TryBoolean(XFA_Attribute::PrintCheckDigit, true); |
| } |
| |
| Optional<XFA_AttributeValue> CXFA_Barcode::GetTextLocation() { |
| return JSObject()->TryEnum(XFA_Attribute::TextLocation, true); |
| } |
| |
| Optional<bool> CXFA_Barcode::GetTruncate() { |
| return JSObject()->TryBoolean(XFA_Attribute::Truncate, true); |
| } |
| |
| Optional<int8_t> CXFA_Barcode::GetWideNarrowRatio() { |
| Optional<WideString> wsWideNarrowRatio = |
| JSObject()->TryCData(XFA_Attribute::WideNarrowRatio, true); |
| if (!wsWideNarrowRatio) |
| return {}; |
| |
| Optional<size_t> ptPos = wsWideNarrowRatio->Find(':'); |
| if (!ptPos) |
| return {static_cast<int8_t>(FXSYS_wtoi(wsWideNarrowRatio->c_str()))}; |
| |
| int32_t fB = FXSYS_wtoi( |
| wsWideNarrowRatio->Last(wsWideNarrowRatio->GetLength() - (*ptPos + 1)) |
| .c_str()); |
| if (!fB) |
| return {0}; |
| |
| int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->First(*ptPos).c_str()); |
| float result = static_cast<float>(fA) / static_cast<float>(fB); |
| return {static_cast<int8_t>(result)}; |
| } |