1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "xfa/fxfa/parser/cxfa_occur.h"
8
9 #include "xfa/fxfa/parser/xfa_object.h"
10
CXFA_Occur(CXFA_Node * pNode)11 CXFA_Occur::CXFA_Occur(CXFA_Node* pNode) : CXFA_Data(pNode) {}
12
GetMax()13 int32_t CXFA_Occur::GetMax() {
14 int32_t iMax = 1;
15 if (m_pNode) {
16 if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, true))
17 iMax = GetMin();
18 }
19 return iMax;
20 }
21
GetMin()22 int32_t CXFA_Occur::GetMin() {
23 int32_t iMin = 1;
24 if (m_pNode) {
25 if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, true) || iMin < 0)
26 iMin = 1;
27 }
28 return iMin;
29 }
30
GetOccurInfo(int32_t & iMin,int32_t & iMax,int32_t & iInit)31 bool CXFA_Occur::GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit) {
32 if (!m_pNode)
33 return false;
34 if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, false) || iMin < 0)
35 iMin = 1;
36 if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, false)) {
37 if (iMin == 0)
38 iMax = 1;
39 else
40 iMax = iMin;
41 }
42 if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, false) ||
43 iInit < iMin) {
44 iInit = iMin;
45 }
46 return true;
47 }
48
SetMax(int32_t iMax)49 void CXFA_Occur::SetMax(int32_t iMax) {
50 iMax = (iMax != -1 && iMax < 1) ? 1 : iMax;
51 m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, false);
52 int32_t iMin = GetMin();
53 if (iMax != -1 && iMax < iMin) {
54 iMin = iMax;
55 m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, false);
56 }
57 }
58
SetMin(int32_t iMin)59 void CXFA_Occur::SetMin(int32_t iMin) {
60 iMin = (iMin < 0) ? 1 : iMin;
61 m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, false);
62 int32_t iMax = GetMax();
63 if (iMax > 0 && iMax < iMin) {
64 iMax = iMin;
65 m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, false);
66 }
67 }
68