// Copyright 2017 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

#ifndef CORE_FXCRT_XML_CFX_XMLNODE_H_
#define CORE_FXCRT_XML_CFX_XMLNODE_H_

#include <memory>

#include "core/fxcrt/cfx_retain_ptr.h"
#include "core/fxcrt/cfx_seekablestreamproxy.h"

enum FX_XMLNODETYPE {
  FX_XMLNODE_Unknown = 0,
  FX_XMLNODE_Instruction,
  FX_XMLNODE_Element,
  FX_XMLNODE_Text,
  FX_XMLNODE_CharData,
};

struct FX_XMLNODE {
  int32_t iNodeNum;
  FX_XMLNODETYPE eNodeType;
};

class CFX_XMLNode {
 public:
  enum NodeItem {
    Root = 0,
    Parent,
    FirstSibling,
    PriorSibling,
    NextSibling,
    LastSibling,
    FirstNeighbor,
    PriorNeighbor,
    NextNeighbor,
    LastNeighbor,
    FirstChild,
    LastChild
  };

  CFX_XMLNode();
  virtual ~CFX_XMLNode();

  virtual FX_XMLNODETYPE GetType() const;
  virtual std::unique_ptr<CFX_XMLNode> Clone();

  int32_t CountChildNodes() const;
  CFX_XMLNode* GetChildNode(int32_t index) const;
  int32_t GetChildNodeIndex(CFX_XMLNode* pNode) const;
  int32_t InsertChildNode(CFX_XMLNode* pNode, int32_t index = -1);
  void RemoveChildNode(CFX_XMLNode* pNode);
  void DeleteChildren();

  CFX_XMLNode* GetPath(const wchar_t* pPath,
                       int32_t iLength = -1,
                       bool bQualifiedName = true) const;

  int32_t GetNodeLevel() const;
  CFX_XMLNode* GetNodeItem(CFX_XMLNode::NodeItem eItem) const;
  bool InsertNodeItem(CFX_XMLNode::NodeItem eItem, CFX_XMLNode* pNode);
  CFX_XMLNode* RemoveNodeItem(CFX_XMLNode::NodeItem eItem);

  void SaveXMLNode(const CFX_RetainPtr<CFX_SeekableStreamProxy>& pXMLStream);

  CFX_XMLNode* m_pParent;
  CFX_XMLNode* m_pChild;
  CFX_XMLNode* m_pPrior;
  CFX_XMLNode* m_pNext;
};

#endif  // CORE_FXCRT_XML_CFX_XMLNODE_H_
