xref: /aosp_15_r20/external/pdfium/xfa/fxfa/parser/cxfa_barcode.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2017 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_barcode.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cjx_node.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_document.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_measurement.h"
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker namespace {
14*3ac0a46fSAndroid Build Coastguard Worker 
15*3ac0a46fSAndroid Build Coastguard Worker const CXFA_Node::AttributeData kBarcodeAttributeData[] = {
16*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::Id, XFA_AttributeType::CData, nullptr},
17*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::DataRowCount, XFA_AttributeType::CData, nullptr},
18*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::Use, XFA_AttributeType::CData, nullptr},
19*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::DataPrep, XFA_AttributeType::Enum,
20*3ac0a46fSAndroid Build Coastguard Worker      (void*)XFA_AttributeValue::None},
21*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::Type, XFA_AttributeType::CData, (void*)nullptr},
22*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::TextLocation, XFA_AttributeType::Enum,
23*3ac0a46fSAndroid Build Coastguard Worker      (void*)XFA_AttributeValue::Below},
24*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::ModuleWidth, XFA_AttributeType::Measure, (void*)L"0.25mm"},
25*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::PrintCheckDigit, XFA_AttributeType::Boolean, (void*)0},
26*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::ModuleHeight, XFA_AttributeType::Measure, (void*)L"5mm"},
27*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::StartChar, XFA_AttributeType::CData, nullptr},
28*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::Truncate, XFA_AttributeType::Boolean, (void*)0},
29*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::WideNarrowRatio, XFA_AttributeType::CData, (void*)L"3:1"},
30*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::ErrorCorrectionLevel, XFA_AttributeType::CData, nullptr},
31*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::UpsMode, XFA_AttributeType::Enum,
32*3ac0a46fSAndroid Build Coastguard Worker      (void*)XFA_AttributeValue::UsCarrier},
33*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::Checksum, XFA_AttributeType::Enum,
34*3ac0a46fSAndroid Build Coastguard Worker      (void*)XFA_AttributeValue::None},
35*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::CharEncoding, XFA_AttributeType::CData, (void*)L"UTF-8"},
36*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::Usehref, XFA_AttributeType::CData, nullptr},
37*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::DataColumnCount, XFA_AttributeType::CData, nullptr},
38*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::RowColumnRatio, XFA_AttributeType::CData, nullptr},
39*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::DataLength, XFA_AttributeType::CData, nullptr},
40*3ac0a46fSAndroid Build Coastguard Worker     {XFA_Attribute::EndChar, XFA_AttributeType::CData, nullptr},
41*3ac0a46fSAndroid Build Coastguard Worker };
42*3ac0a46fSAndroid Build Coastguard Worker 
43*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
44*3ac0a46fSAndroid Build Coastguard Worker 
45*3ac0a46fSAndroid Build Coastguard Worker // static
FromNode(CXFA_Node * pNode)46*3ac0a46fSAndroid Build Coastguard Worker CXFA_Barcode* CXFA_Barcode::FromNode(CXFA_Node* pNode) {
47*3ac0a46fSAndroid Build Coastguard Worker   return pNode && pNode->GetElementType() == XFA_Element::Barcode
48*3ac0a46fSAndroid Build Coastguard Worker              ? static_cast<CXFA_Barcode*>(pNode)
49*3ac0a46fSAndroid Build Coastguard Worker              : nullptr;
50*3ac0a46fSAndroid Build Coastguard Worker }
51*3ac0a46fSAndroid Build Coastguard Worker 
CXFA_Barcode(CXFA_Document * doc,XFA_PacketType packet)52*3ac0a46fSAndroid Build Coastguard Worker CXFA_Barcode::CXFA_Barcode(CXFA_Document* doc, XFA_PacketType packet)
53*3ac0a46fSAndroid Build Coastguard Worker     : CXFA_Node(doc,
54*3ac0a46fSAndroid Build Coastguard Worker                 packet,
55*3ac0a46fSAndroid Build Coastguard Worker                 {XFA_XDPPACKET::kTemplate, XFA_XDPPACKET::kForm},
56*3ac0a46fSAndroid Build Coastguard Worker                 XFA_ObjectType::Node,
57*3ac0a46fSAndroid Build Coastguard Worker                 XFA_Element::Barcode,
58*3ac0a46fSAndroid Build Coastguard Worker                 {},
59*3ac0a46fSAndroid Build Coastguard Worker                 kBarcodeAttributeData,
60*3ac0a46fSAndroid Build Coastguard Worker                 cppgc::MakeGarbageCollected<CJX_Node>(
61*3ac0a46fSAndroid Build Coastguard Worker                     doc->GetHeap()->GetAllocationHandle(),
62*3ac0a46fSAndroid Build Coastguard Worker                     this)) {}
63*3ac0a46fSAndroid Build Coastguard Worker 
64*3ac0a46fSAndroid Build Coastguard Worker CXFA_Barcode::~CXFA_Barcode() = default;
65*3ac0a46fSAndroid Build Coastguard Worker 
GetDefaultFFWidgetType() const66*3ac0a46fSAndroid Build Coastguard Worker XFA_FFWidgetType CXFA_Barcode::GetDefaultFFWidgetType() const {
67*3ac0a46fSAndroid Build Coastguard Worker   return XFA_FFWidgetType::kBarcode;
68*3ac0a46fSAndroid Build Coastguard Worker }
69*3ac0a46fSAndroid Build Coastguard Worker 
GetBarcodeType()70*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Barcode::GetBarcodeType() {
71*3ac0a46fSAndroid Build Coastguard Worker   return WideString(JSObject()->GetCData(XFA_Attribute::Type));
72*3ac0a46fSAndroid Build Coastguard Worker }
73*3ac0a46fSAndroid Build Coastguard Worker 
GetCharEncoding()74*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> CXFA_Barcode::GetCharEncoding() {
75*3ac0a46fSAndroid Build Coastguard Worker   return JSObject()->TryCData(XFA_Attribute::CharEncoding, true);
76*3ac0a46fSAndroid Build Coastguard Worker }
77*3ac0a46fSAndroid Build Coastguard Worker 
GetChecksum()78*3ac0a46fSAndroid Build Coastguard Worker absl::optional<bool> CXFA_Barcode::GetChecksum() {
79*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<XFA_AttributeValue> checksum =
80*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryEnum(XFA_Attribute::Checksum, true);
81*3ac0a46fSAndroid Build Coastguard Worker   if (!checksum.has_value())
82*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
83*3ac0a46fSAndroid Build Coastguard Worker 
84*3ac0a46fSAndroid Build Coastguard Worker   switch (checksum.value()) {
85*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::None:
86*3ac0a46fSAndroid Build Coastguard Worker       return {false};
87*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Auto:
88*3ac0a46fSAndroid Build Coastguard Worker       return {true};
89*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Checksum_1mod10:
90*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Checksum_1mod10_1mod11:
91*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Checksum_2mod10:
92*3ac0a46fSAndroid Build Coastguard Worker     default:
93*3ac0a46fSAndroid Build Coastguard Worker       break;
94*3ac0a46fSAndroid Build Coastguard Worker   }
95*3ac0a46fSAndroid Build Coastguard Worker   return absl::nullopt;
96*3ac0a46fSAndroid Build Coastguard Worker }
97*3ac0a46fSAndroid Build Coastguard Worker 
GetDataLength()98*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> CXFA_Barcode::GetDataLength() {
99*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> wsDataLength =
100*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryCData(XFA_Attribute::DataLength, true);
101*3ac0a46fSAndroid Build Coastguard Worker   if (!wsDataLength.has_value())
102*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
103*3ac0a46fSAndroid Build Coastguard Worker 
104*3ac0a46fSAndroid Build Coastguard Worker   return FXSYS_wtoi(wsDataLength->c_str());
105*3ac0a46fSAndroid Build Coastguard Worker }
106*3ac0a46fSAndroid Build Coastguard Worker 
GetStartChar()107*3ac0a46fSAndroid Build Coastguard Worker absl::optional<char> CXFA_Barcode::GetStartChar() {
108*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> wsStartEndChar =
109*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryCData(XFA_Attribute::StartChar, true);
110*3ac0a46fSAndroid Build Coastguard Worker   if (!wsStartEndChar.has_value() || wsStartEndChar->IsEmpty())
111*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
112*3ac0a46fSAndroid Build Coastguard Worker 
113*3ac0a46fSAndroid Build Coastguard Worker   return static_cast<char>(wsStartEndChar.value()[0]);
114*3ac0a46fSAndroid Build Coastguard Worker }
115*3ac0a46fSAndroid Build Coastguard Worker 
GetEndChar()116*3ac0a46fSAndroid Build Coastguard Worker absl::optional<char> CXFA_Barcode::GetEndChar() {
117*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> wsStartEndChar =
118*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryCData(XFA_Attribute::EndChar, true);
119*3ac0a46fSAndroid Build Coastguard Worker   if (!wsStartEndChar.has_value() || wsStartEndChar->IsEmpty())
120*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
121*3ac0a46fSAndroid Build Coastguard Worker 
122*3ac0a46fSAndroid Build Coastguard Worker   return static_cast<char>(wsStartEndChar.value()[0]);
123*3ac0a46fSAndroid Build Coastguard Worker }
124*3ac0a46fSAndroid Build Coastguard Worker 
GetECLevel()125*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> CXFA_Barcode::GetECLevel() {
126*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> wsECLevel =
127*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryCData(XFA_Attribute::ErrorCorrectionLevel, true);
128*3ac0a46fSAndroid Build Coastguard Worker   if (!wsECLevel.has_value())
129*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
130*3ac0a46fSAndroid Build Coastguard Worker   return FXSYS_wtoi(wsECLevel->c_str());
131*3ac0a46fSAndroid Build Coastguard Worker }
132*3ac0a46fSAndroid Build Coastguard Worker 
GetModuleWidth()133*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> CXFA_Barcode::GetModuleWidth() {
134*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<CXFA_Measurement> moduleWidthHeight =
135*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryMeasure(XFA_Attribute::ModuleWidth, true);
136*3ac0a46fSAndroid Build Coastguard Worker   if (!moduleWidthHeight.has_value())
137*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
138*3ac0a46fSAndroid Build Coastguard Worker 
139*3ac0a46fSAndroid Build Coastguard Worker   return static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt));
140*3ac0a46fSAndroid Build Coastguard Worker }
141*3ac0a46fSAndroid Build Coastguard Worker 
GetModuleHeight()142*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> CXFA_Barcode::GetModuleHeight() {
143*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<CXFA_Measurement> moduleWidthHeight =
144*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryMeasure(XFA_Attribute::ModuleHeight, true);
145*3ac0a46fSAndroid Build Coastguard Worker   if (!moduleWidthHeight.has_value())
146*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
147*3ac0a46fSAndroid Build Coastguard Worker 
148*3ac0a46fSAndroid Build Coastguard Worker   return static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt));
149*3ac0a46fSAndroid Build Coastguard Worker }
150*3ac0a46fSAndroid Build Coastguard Worker 
GetPrintChecksum()151*3ac0a46fSAndroid Build Coastguard Worker absl::optional<bool> CXFA_Barcode::GetPrintChecksum() {
152*3ac0a46fSAndroid Build Coastguard Worker   return JSObject()->TryBoolean(XFA_Attribute::PrintCheckDigit, true);
153*3ac0a46fSAndroid Build Coastguard Worker }
154*3ac0a46fSAndroid Build Coastguard Worker 
GetTextLocation()155*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_AttributeValue> CXFA_Barcode::GetTextLocation() {
156*3ac0a46fSAndroid Build Coastguard Worker   return JSObject()->TryEnum(XFA_Attribute::TextLocation, true);
157*3ac0a46fSAndroid Build Coastguard Worker }
158*3ac0a46fSAndroid Build Coastguard Worker 
GetTruncate()159*3ac0a46fSAndroid Build Coastguard Worker absl::optional<bool> CXFA_Barcode::GetTruncate() {
160*3ac0a46fSAndroid Build Coastguard Worker   return JSObject()->TryBoolean(XFA_Attribute::Truncate, true);
161*3ac0a46fSAndroid Build Coastguard Worker }
162*3ac0a46fSAndroid Build Coastguard Worker 
GetWideNarrowRatio()163*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int8_t> CXFA_Barcode::GetWideNarrowRatio() {
164*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> wsWideNarrowRatio =
165*3ac0a46fSAndroid Build Coastguard Worker       JSObject()->TryCData(XFA_Attribute::WideNarrowRatio, true);
166*3ac0a46fSAndroid Build Coastguard Worker   if (!wsWideNarrowRatio.has_value())
167*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
168*3ac0a46fSAndroid Build Coastguard Worker 
169*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<size_t> ptPos = wsWideNarrowRatio->Find(':');
170*3ac0a46fSAndroid Build Coastguard Worker   if (!ptPos.has_value())
171*3ac0a46fSAndroid Build Coastguard Worker     return static_cast<int8_t>(FXSYS_wtoi(wsWideNarrowRatio->c_str()));
172*3ac0a46fSAndroid Build Coastguard Worker 
173*3ac0a46fSAndroid Build Coastguard Worker   int32_t fB = FXSYS_wtoi(
174*3ac0a46fSAndroid Build Coastguard Worker       wsWideNarrowRatio
175*3ac0a46fSAndroid Build Coastguard Worker           ->Last(wsWideNarrowRatio->GetLength() - (ptPos.value() + 1))
176*3ac0a46fSAndroid Build Coastguard Worker           .c_str());
177*3ac0a46fSAndroid Build Coastguard Worker   if (!fB)
178*3ac0a46fSAndroid Build Coastguard Worker     return 0;
179*3ac0a46fSAndroid Build Coastguard Worker 
180*3ac0a46fSAndroid Build Coastguard Worker   int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->First(ptPos.value()).c_str());
181*3ac0a46fSAndroid Build Coastguard Worker   float result = static_cast<float>(fA) / static_cast<float>(fB);
182*3ac0a46fSAndroid Build Coastguard Worker   return static_cast<int8_t>(result);
183*3ac0a46fSAndroid Build Coastguard Worker }
184