// 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/cxfa_valuedata.h"

#include "xfa/fxfa/parser/cxfa_node.h"

XFA_Element CXFA_ValueData::GetChildValueClassID() const {
  if (!m_pNode)
    return XFA_Element::Unknown;
  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
    return pNode->GetElementType();
  return XFA_Element::Unknown;
}

WideString CXFA_ValueData::GetChildValueContent() const {
  if (!m_pNode)
    return L"";

  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
  if (!pNode)
    return L"";

  return pNode->JSObject()->TryContent(false, true).value_or(L"");
}

CXFA_ArcData CXFA_ValueData::GetArcData() const {
  return CXFA_ArcData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                              : nullptr);
}

CXFA_LineData CXFA_ValueData::GetLineData() const {
  return CXFA_LineData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                               : nullptr);
}

CXFA_RectangleData CXFA_ValueData::GetRectangleData() const {
  return CXFA_RectangleData(
      m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild) : nullptr);
}

CXFA_TextData CXFA_ValueData::GetTextData() const {
  return CXFA_TextData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                               : nullptr);
}

CXFA_ExDataData CXFA_ValueData::GetExData() const {
  return CXFA_ExDataData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                                 : nullptr);
}

CXFA_ImageData CXFA_ValueData::GetImageData() const {
  return CXFA_ImageData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                                : nullptr);
}
