/*
 * Copyright (C) 2008 by Sebastian Pipping.
 * Copyright (C) 2008 Dimitri van Heesch.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
 * Documents produced by Doxygen are derivative works derived from the
 * input used in their production; they are not affected by this license.
 *
 * Sebastian Pipping <sebastian@pipping.org>
 */

#include "qhpxmlwriter.h"
#include "util.h"

#include <qfile.h>

QhpXmlWriter::QhpXmlWriter() 
    : m_out(&m_backend), m_indentLevel(0), 
      m_curLineIndented(false), m_compress(false)
{
}

QhpXmlWriter::~QhpXmlWriter()
{
}

void QhpXmlWriter::setIndentLevel(int level)
{
  m_indentLevel = level;
}

void QhpXmlWriter::setCompressionEnabled(bool enabled)
{
  m_compress = enabled;
}

void QhpXmlWriter::insert(QhpXmlWriter const & source)
{
  m_out << source.m_backend.data();
}

void QhpXmlWriter::dumpTo(QFile & file)
{
  file.writeBlock(m_backend.data(), m_backend.length());
}

void QhpXmlWriter::open(char const * elementName,
    char const * const * attributes)
{
  indent();
  openPure(elementName, attributes);
  newLine();
  m_indentLevel++;
}

void QhpXmlWriter::openClose(char const * elementName,
    char const * const * attributes)
{
  indent();
  openClosePure(elementName, attributes);
  newLine();
}

void QhpXmlWriter::openCloseContent(char const * elementName,
    char const * content)
{
  indent();
  openPure(elementName);
  m_out << convertToXML(content);
  closePure(elementName);
  newLine();
}

void QhpXmlWriter::close(char const * elementName)
{
  m_indentLevel--;
  indent();
  closePure(elementName);
  newLine();
}

void QhpXmlWriter::declaration(char const * version, char const * encoding)
{
  m_out << "<?xml version=\"" << version << "\" encoding=\"" << encoding << "\"?>";
  newLine();
}

void QhpXmlWriter::indent()
{
  if (m_curLineIndented)
  {
    return;
  }
  for (int i = 0; i < m_indentLevel; i++) 
  {
    m_out << "  ";
  }
  m_curLineIndented = true;
}

void QhpXmlWriter::newLine()
{
  if (!m_compress)
  {
    m_out << "\n";
    m_curLineIndented = false;
  }
}

void QhpXmlWriter::openPureHelper(char const * elementName,
                                  char const * const * attributes, bool close)
{
  m_out << "<" << elementName;
  if (attributes)
  {
    for (char const * const * walker = attributes;
        walker[0]; walker += 2)
    {
      char const * const key = walker[0];
      char const * const value = walker[1];
      if (!value)
      {
        continue;  
      }
      m_out << " " << key << "=\"" << convertToXML(value) << "\"";
    }
  }

  if (close)
  {
    m_out << " /";
  }
  m_out << ">";
}

void QhpXmlWriter::openPure(char const * elementName,
                            char const * const * attributes)
{
  openPureHelper(elementName, attributes, false);
}

void QhpXmlWriter::openClosePure(char const * elementName,
                                 char const * const * attributes)
{
  openPureHelper(elementName, attributes, true);
}

void QhpXmlWriter::closePure(char const * elementName)
{
  m_out << "</" << elementName << ">";
}

