// 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() {
  if (!m_pNode)
    return XFA_Element::Unknown;
  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
    return pNode->GetElementType();
  return XFA_Element::Unknown;
}

bool CXFA_ValueData::GetChildValueContent(WideString& wsContent) {
  if (!m_pNode)
    return false;
  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
    return pNode->JSNode()->TryContent(wsContent, false, true);
  return false;
}

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

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

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

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

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

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