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
11CXFA_Occur::CXFA_Occur(CXFA_Node* pNode) : CXFA_Data(pNode) {}
12
13int32_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
22int32_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
31bool 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
49void 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
59void 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