Blame src/xmlgen.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include <stdlib.h>
Packit 1c1d7e
Packit 1c1d7e
#include <qdir.h>
Packit 1c1d7e
#include <qfile.h>
Packit 1c1d7e
#include <qtextstream.h>
Packit 1c1d7e
#include <qintdict.h>
Packit 1c1d7e
Packit 1c1d7e
#include "xmlgen.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "classlist.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "defargs.h"
Packit 1c1d7e
#include "outputgen.h"
Packit 1c1d7e
#include "dot.h"
Packit 1c1d7e
#include "pagedef.h"
Packit 1c1d7e
#include "filename.h"
Packit 1c1d7e
#include "version.h"
Packit 1c1d7e
#include "xmldocvisitor.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "parserintf.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
#include "memberlist.h"
Packit 1c1d7e
#include "groupdef.h"
Packit 1c1d7e
#include "memberdef.h"
Packit 1c1d7e
#include "namespacedef.h"
Packit 1c1d7e
#include "membername.h"
Packit 1c1d7e
#include "membergroup.h"
Packit 1c1d7e
#include "dirdef.h"
Packit 1c1d7e
#include "section.h"
Packit 1c1d7e
#include "htmlentity.h"
Packit 1c1d7e
#include "resourcemgr.h"
Packit 1c1d7e
Packit 1c1d7e
// no debug info
Packit 1c1d7e
#define XML_DB(x) do {} while(0)
Packit 1c1d7e
// debug to stdout
Packit 1c1d7e
//#define XML_DB(x) printf x
Packit 1c1d7e
// debug inside output
Packit 1c1d7e
//#define XML_DB(x) QCString __t;__t.sprintf x;m_t << __t
Packit 1c1d7e
Packit 1c1d7e
//------------------
Packit 1c1d7e
Packit 1c1d7e
/** Helper class mapping MemberList::ListType to a string representing */
Packit 1c1d7e
class XmlSectionMapper : public QIntDict<char>
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    XmlSectionMapper() : QIntDict<char>(47)
Packit 1c1d7e
    {
Packit 1c1d7e
      insert(MemberListType_pubTypes,"public-type");
Packit 1c1d7e
      insert(MemberListType_pubMethods,"public-func");
Packit 1c1d7e
      insert(MemberListType_pubAttribs,"public-attrib");
Packit 1c1d7e
      insert(MemberListType_pubSlots,"public-slot");
Packit 1c1d7e
      insert(MemberListType_signals,"signal");
Packit 1c1d7e
      insert(MemberListType_dcopMethods,"dcop-func");
Packit 1c1d7e
      insert(MemberListType_properties,"property");
Packit 1c1d7e
      insert(MemberListType_events,"event");
Packit 1c1d7e
      insert(MemberListType_interfaces,"interfaces");
Packit 1c1d7e
      insert(MemberListType_services,"services");
Packit 1c1d7e
      insert(MemberListType_pubStaticMethods,"public-static-func");
Packit 1c1d7e
      insert(MemberListType_pubStaticAttribs,"public-static-attrib");
Packit 1c1d7e
      insert(MemberListType_proTypes,"protected-type");
Packit 1c1d7e
      insert(MemberListType_proMethods,"protected-func");
Packit 1c1d7e
      insert(MemberListType_proAttribs,"protected-attrib");
Packit 1c1d7e
      insert(MemberListType_proSlots,"protected-slot");
Packit 1c1d7e
      insert(MemberListType_proStaticMethods,"protected-static-func");
Packit 1c1d7e
      insert(MemberListType_proStaticAttribs,"protected-static-attrib");
Packit 1c1d7e
      insert(MemberListType_pacTypes,"package-type");
Packit 1c1d7e
      insert(MemberListType_pacMethods,"package-func");
Packit 1c1d7e
      insert(MemberListType_pacAttribs,"package-attrib");
Packit 1c1d7e
      insert(MemberListType_pacStaticMethods,"package-static-func");
Packit 1c1d7e
      insert(MemberListType_pacStaticAttribs,"package-static-attrib");
Packit 1c1d7e
      insert(MemberListType_priTypes,"private-type");
Packit 1c1d7e
      insert(MemberListType_priMethods,"private-func");
Packit 1c1d7e
      insert(MemberListType_priAttribs,"private-attrib");
Packit 1c1d7e
      insert(MemberListType_priSlots,"private-slot");
Packit 1c1d7e
      insert(MemberListType_priStaticMethods,"private-static-func");
Packit 1c1d7e
      insert(MemberListType_priStaticAttribs,"private-static-attrib");
Packit 1c1d7e
      insert(MemberListType_friends,"friend");
Packit 1c1d7e
      insert(MemberListType_related,"related");
Packit 1c1d7e
      insert(MemberListType_decDefineMembers,"define");
Packit 1c1d7e
      insert(MemberListType_decProtoMembers,"prototype");
Packit 1c1d7e
      insert(MemberListType_decTypedefMembers,"typedef");
Packit 1c1d7e
      insert(MemberListType_decEnumMembers,"enum");
Packit 1c1d7e
      insert(MemberListType_decFuncMembers,"func");
Packit 1c1d7e
      insert(MemberListType_decVarMembers,"var");
Packit 1c1d7e
    }
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
static XmlSectionMapper g_xmlSectionMapper;
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
inline void writeXMLString(FTextStream &t,const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  t << convertToXML(s);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
inline void writeXMLCodeString(FTextStream &t,const char *s, int &col)
Packit 1c1d7e
{
Packit 1c1d7e
  char c;
Packit 1c1d7e
  while ((c=*s++))
Packit 1c1d7e
  {
Packit 1c1d7e
    switch(c)
Packit 1c1d7e
    {
Packit 1c1d7e
      case '\t':
Packit 1c1d7e
      {
Packit 1c1d7e
        static int tabSize = Config_getInt(TAB_SIZE);
Packit 1c1d7e
	int spacesToNextTabStop = tabSize - (col%tabSize);
Packit 1c1d7e
	col+=spacesToNextTabStop;
Packit 1c1d7e
	while (spacesToNextTabStop--) t << "<sp/>";
Packit 1c1d7e
	break;
Packit 1c1d7e
	}
Packit 1c1d7e
      case ' ':  t << "<sp/>"; col++;  break;
Packit 1c1d7e
      case '<':  t << "<"; col++;   break;
Packit 1c1d7e
      case '>':  t << ">"; col++;   break;
Packit 1c1d7e
      case '&':  t << "&"; col++;  break;
Packit 1c1d7e
      case '\'': t << "'"; col++; break;
Packit 1c1d7e
      case '"':  t << """; col++; break;
Packit 1c1d7e
      case  1: case  2: case  3: case  4: case  5: case  6: case  7: case  8:
Packit 1c1d7e
      case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
Packit 1c1d7e
      case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:
Packit 1c1d7e
      case 27: case 28: case 29: case 30: case 31:
Packit 1c1d7e
        // encode invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char)
Packit 1c1d7e
        t << "<sp value=\"" << int(c) << "\"/>";
Packit 1c1d7e
        break;
Packit 1c1d7e
      default:   s=writeUtf8Char(t,s-1); col++; break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void writeXMLHeader(FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "" << endl;;
Packit 1c1d7e
  t << "
Packit 1c1d7e
  t << "xsi:noNamespaceSchemaLocation=\"compound.xsd\" ";
Packit 1c1d7e
  t << "version=\"" << versionString << "\">" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeCombineScript()
Packit 1c1d7e
{
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/combine.xslt";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  t <<
Packit 1c1d7e
  "
Packit 1c1d7e
  "     If you have xsltproc you could use:\n"
Packit 1c1d7e
  "     xsltproc combine.xslt index.xml >all.xml\n"
Packit 1c1d7e
  "-->\n"
Packit 1c1d7e
  "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
Packit 1c1d7e
  "  <xsl:output method=\"xml\" version=\"1.0\" indent=\"no\" standalone=\"yes\" />\n"
Packit 1c1d7e
  "  <xsl:template match=\"/\">\n"
Packit 1c1d7e
  "    <doxygen version=\"{doxygenindex/@version}\">\n"
Packit 1c1d7e
  "      \n"
Packit 1c1d7e
  "      <xsl:for-each select=\"doxygenindex/compound\">\n"
Packit 1c1d7e
  "        <xsl:copy-of select=\"document( concat( @refid, '.xml' ) )/doxygen/*\" />\n"
Packit 1c1d7e
  "      </xsl:for-each>\n"
Packit 1c1d7e
  "    </doxygen>\n"
Packit 1c1d7e
  "  </xsl:template>\n"
Packit 1c1d7e
  "</xsl:stylesheet>\n";
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void writeXMLLink(FTextStream &t,const char *extRef,const char *compoundId,
Packit 1c1d7e
                  const char *anchorId,const char *text,const char *tooltip)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "
Packit 1c1d7e
  if (anchorId) t << "_1" << anchorId;
Packit 1c1d7e
  t << "\" kindref=\"";
Packit 1c1d7e
  if (anchorId) t << "member"; else t << "compound"; 
Packit 1c1d7e
  t << "\"";
Packit 1c1d7e
  if (extRef) t << " external=\"" << extRef << "\"";
Packit 1c1d7e
  if (tooltip) t << " tooltip=\"" << convertToXML(tooltip) << "\"";
Packit 1c1d7e
  t << ">";
Packit 1c1d7e
  writeXMLString(t,text);
Packit 1c1d7e
  t << "</ref>";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/** Implements TextGeneratorIntf for an XML stream. */
Packit 1c1d7e
class TextGeneratorXMLImpl : public TextGeneratorIntf
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    TextGeneratorXMLImpl(FTextStream &t): m_t(t) {}
Packit 1c1d7e
    void writeString(const char *s,bool /*keepSpaces*/) const
Packit 1c1d7e
    {
Packit 1c1d7e
      writeXMLString(m_t,s); 
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeBreak(int) const {}
Packit 1c1d7e
    void writeLink(const char *extRef,const char *file,
Packit 1c1d7e
                   const char *anchor,const char *text
Packit 1c1d7e
                  ) const
Packit 1c1d7e
    {
Packit 1c1d7e
      writeXMLLink(m_t,extRef,file,anchor,text,0);
Packit 1c1d7e
    }
Packit 1c1d7e
  private:
Packit 1c1d7e
    FTextStream &m_;;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/** Generator for producing XML formatted source code. */
Packit 1c1d7e
class XMLCodeGenerator : public CodeOutputInterface
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
Packit 1c1d7e
    XMLCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), m_isMemberRef(FALSE), m_col(0),
Packit 1c1d7e
      m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE), m_insideSpecialHL(FALSE) {}
Packit 1c1d7e
    virtual ~XMLCodeGenerator() { }
Packit 1c1d7e
Packit 1c1d7e
    void codify(const char *text)
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(codify \"%s\")\n",text));
Packit 1c1d7e
      if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "<highlight class=\"normal\">";
Packit 1c1d7e
        m_normalHLNeedStartTag=FALSE;
Packit 1c1d7e
      }
Packit 1c1d7e
      writeXMLCodeString(m_t,text,m_col);
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeCodeLink(const char *ref,const char *file,
Packit 1c1d7e
                       const char *anchor,const char *name,
Packit 1c1d7e
                       const char *tooltip)
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(writeCodeLink)\n"));
Packit 1c1d7e
      if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "<highlight class=\"normal\">";
Packit 1c1d7e
        m_normalHLNeedStartTag=FALSE;
Packit 1c1d7e
      }
Packit 1c1d7e
      writeXMLLink(m_t,ref,file,anchor,name,tooltip);
Packit 1c1d7e
      m_col+=qstrlen(name);
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeTooltip(const char *, const DocLinkInfo &, const char *,
Packit 1c1d7e
                      const char *, const SourceLinkInfo &, const SourceLinkInfo &
Packit 1c1d7e
                     )
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(writeToolTip)\n"));
Packit 1c1d7e
    }
Packit 1c1d7e
    void startCodeLine(bool)
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(startCodeLine)\n"));
Packit 1c1d7e
      m_t << "
Packit 1c1d7e
      if (m_lineNumber!=-1)
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << " lineno=\"" << m_lineNumber << "\"";
Packit 1c1d7e
        if (!m_refId.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          m_t << " refid=\"" << m_refId << "\"";
Packit 1c1d7e
          if (m_isMemberRef)
Packit 1c1d7e
          {
Packit 1c1d7e
            m_t << " refkind=\"member\"";
Packit 1c1d7e
          }
Packit 1c1d7e
          else
Packit 1c1d7e
          {
Packit 1c1d7e
            m_t << " refkind=\"compound\"";
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!m_external.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          m_t << " external=\"" << m_external << "\"";
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      m_t << ">";
Packit 1c1d7e
      m_insideCodeLine=TRUE;
Packit 1c1d7e
      m_col=0;
Packit 1c1d7e
    }
Packit 1c1d7e
    void endCodeLine()
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(endCodeLine)\n"));
Packit 1c1d7e
      if (!m_insideSpecialHL && !m_normalHLNeedStartTag)
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "</highlight>";
Packit 1c1d7e
        m_normalHLNeedStartTag=TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
      m_t << "</codeline>" << endl; // non DocBook
Packit 1c1d7e
      m_lineNumber = -1;
Packit 1c1d7e
      m_refId.resize(0);
Packit 1c1d7e
      m_external.resize(0);
Packit 1c1d7e
      m_insideCodeLine=FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void startFontClass(const char *colorClass)
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(startFontClass)\n"));
Packit 1c1d7e
      if (m_insideCodeLine && !m_insideSpecialHL && !m_normalHLNeedStartTag)
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "</highlight>";
Packit 1c1d7e
        m_normalHLNeedStartTag=TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
      m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook
Packit 1c1d7e
      m_insideSpecialHL=TRUE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void endFontClass()
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(endFontClass)\n"));
Packit 1c1d7e
      m_t << "</highlight>"; // non DocBook
Packit 1c1d7e
      m_insideSpecialHL=FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeCodeAnchor(const char *)
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(writeCodeAnchor)\n"));
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeLineNumber(const char *extRef,const char *compId,
Packit 1c1d7e
                         const char *anchorId,int l)
Packit 1c1d7e
    {
Packit 1c1d7e
      XML_DB(("(writeLineNumber)\n"));
Packit 1c1d7e
      // we remember the information provided here to use it
Packit 1c1d7e
      // at the <codeline> start tag.
Packit 1c1d7e
      m_lineNumber = l;
Packit 1c1d7e
      if (compId)
Packit 1c1d7e
      {
Packit 1c1d7e
        m_refId=compId;
Packit 1c1d7e
        if (anchorId) m_refId+=(QCString)"_1"+anchorId;
Packit 1c1d7e
        m_isMemberRef = anchorId!=0;
Packit 1c1d7e
        if (extRef) m_external=extRef;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    void setCurrentDoc(Definition *,const char *,bool)
Packit 1c1d7e
    {
Packit 1c1d7e
    }
Packit 1c1d7e
    void addWord(const char *,bool)
Packit 1c1d7e
    {
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    void finish()
Packit 1c1d7e
    {
Packit 1c1d7e
      if (m_insideCodeLine) endCodeLine();
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
  private:
Packit 1c1d7e
    FTextStream &m_;;
Packit 1c1d7e
    QCString m_refId;
Packit 1c1d7e
    QCString m_external;
Packit 1c1d7e
    int m_lineNumber;
Packit 1c1d7e
    bool m_isMemberRef;
Packit 1c1d7e
    int m_col;
Packit 1c1d7e
Packit 1c1d7e
    bool m_insideCodeLine;
Packit 1c1d7e
    bool m_normalHLNeedStartTag;
Packit 1c1d7e
    bool m_insideSpecialHL;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void writeTemplateArgumentList(ArgumentList *al,
Packit 1c1d7e
                                      FTextStream &t,
Packit 1c1d7e
                                      Definition *scope,
Packit 1c1d7e
                                      FileDef *fileScope,
Packit 1c1d7e
                                      int indent)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString indentStr;
Packit 1c1d7e
  indentStr.fill(' ',indent);
Packit 1c1d7e
  if (al)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << indentStr << "<templateparamlist>" << endl;
Packit 1c1d7e
    ArgumentListIterator ali(*al);
Packit 1c1d7e
    Argument *a;
Packit 1c1d7e
    for (ali.toFirst();(a=ali.current());++ali)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << indentStr << "  <param>" << endl;
Packit 1c1d7e
      if (!a->type.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << indentStr <<  "    <type>";
Packit 1c1d7e
        linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
Packit 1c1d7e
        t << "</type>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      if (!a->name.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << indentStr <<  "    <declname>" << a->name << "</declname>" << endl;
Packit 1c1d7e
        t << indentStr <<  "    <defname>" << a->name << "</defname>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      if (!a->defval.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << indentStr << "    <defval>";
Packit 1c1d7e
        linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
Packit 1c1d7e
        t << "</defval>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      if (!a->typeConstraint.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << indentStr << "    <typeconstraint>";
Packit 1c1d7e
        linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->typeConstraint);
Packit 1c1d7e
        t << "</typeconstraint>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << indentStr << "  </param>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    t << indentStr << "</templateparamlist>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeMemberTemplateLists(MemberDef *md,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  ArgumentList *templMd = md->templateArguments();
Packit 1c1d7e
  if (templMd) // function template prefix
Packit 1c1d7e
  {
Packit 1c1d7e
    writeTemplateArgumentList(templMd,t,md->getClassDef(),md->getFileDef(),8);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeTemplateList(ClassDef *cd,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeXMLDocBlock(FTextStream &t,
Packit 1c1d7e
                      const QCString &fileName,
Packit 1c1d7e
                      int lineNr,
Packit 1c1d7e
                      Definition *scope,
Packit 1c1d7e
                      MemberDef * md,
Packit 1c1d7e
                      const QCString &text)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString stext = text.stripWhiteSpace();
Packit 1c1d7e
  if (stext.isEmpty()) return;
Packit 1c1d7e
  // convert the documentation string into an abstract syntax tree
Packit 1c1d7e
  DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
Packit 1c1d7e
  // create a code generator
Packit 1c1d7e
  XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
Packit 1c1d7e
  // create a parse tree visitor for XML
Packit 1c1d7e
  XmlDocVisitor *visitor = new XmlDocVisitor(t,*xmlCodeGen);
Packit 1c1d7e
  // visit all nodes
Packit 1c1d7e
  root->accept(visitor);
Packit 1c1d7e
  // clean up
Packit 1c1d7e
  delete visitor;
Packit 1c1d7e
  delete xmlCodeGen;
Packit 1c1d7e
  delete root;
Packit 1c1d7e
  
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void writeXMLCodeBlock(FTextStream &t,FileDef *fd)
Packit 1c1d7e
{
Packit 1c1d7e
  ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
Packit 1c1d7e
  SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension());
Packit 1c1d7e
  pIntf->resetCodeParserState();
Packit 1c1d7e
  XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t);
Packit 1c1d7e
  pIntf->parseCode(*xmlGen,  // codeOutIntf
Packit 1c1d7e
                0,           // scopeName
Packit 1c1d7e
                fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)),
Packit 1c1d7e
                langExt,     // lang
Packit 1c1d7e
                FALSE,       // isExampleBlock
Packit 1c1d7e
                0,           // exampleName
Packit 1c1d7e
                fd,          // fileDef
Packit 1c1d7e
                -1,          // startLine
Packit 1c1d7e
                -1,          // endLine
Packit 1c1d7e
                FALSE,       // inlineFragement
Packit 1c1d7e
                0,           // memberDef
Packit 1c1d7e
                TRUE         // showLineNumbers
Packit 1c1d7e
                );
Packit 1c1d7e
  xmlGen->finish();
Packit 1c1d7e
  delete xmlGen;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeMemberReference(FTextStream &t,Definition *def,MemberDef *rmd,const char *tagName)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString scope = rmd->getScopeString();
Packit 1c1d7e
  QCString name = rmd->name();
Packit 1c1d7e
  if (!scope.isEmpty() && scope!=def->name())
Packit 1c1d7e
  {
Packit 1c1d7e
    name.prepend(scope+getLanguageSpecificSeparator(rmd->getLanguage()));
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "        <" << tagName << " refid=\"";
Packit 1c1d7e
  t << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\"";
Packit 1c1d7e
  if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << " compoundref=\"" << rmd->getBodyDef()->getOutputFileBase() << "\"";
Packit 1c1d7e
    t << " startline=\"" << rmd->getStartBodyLine() << "\"";
Packit 1c1d7e
    if (rmd->getEndBodyLine()!=-1)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " endline=\"" << rmd->getEndBodyLine() << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  t << ">" << convertToXML(name) << "</" << tagName << ">" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void stripQualifiers(QCString &typeStr)
Packit 1c1d7e
{
Packit 1c1d7e
  bool done=FALSE;
Packit 1c1d7e
  while (!done)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (typeStr.stripPrefix("static "));
Packit 1c1d7e
    else if (typeStr.stripPrefix("virtual "));
Packit 1c1d7e
    else if (typeStr.stripPrefix("volatile "));
Packit 1c1d7e
    else if (typeStr=="virtual") typeStr="";
Packit 1c1d7e
    else done=TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString classOutputFileBase(ClassDef *cd)
Packit 1c1d7e
{
Packit 1c1d7e
  //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
Packit 1c1d7e
  //if (inlineGroupedClasses && cd->partOfGroups()!=0) 
Packit 1c1d7e
  return cd->getOutputFileBase();
Packit 1c1d7e
  //else 
Packit 1c1d7e
  //  return cd->getOutputFileBase();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString memberOutputFileBase(MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
Packit 1c1d7e
  //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0) 
Packit 1c1d7e
  //  return md->getClassDef()->getXmlOutputFileBase();
Packit 1c1d7e
  //else 
Packit 1c1d7e
  //  return md->getOutputFileBase();
Packit 1c1d7e
  return md->getOutputFileBase();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,Definition *def)
Packit 1c1d7e
{
Packit 1c1d7e
Packit 1c1d7e
  // + declaration/definition arg lists
Packit 1c1d7e
  // + reimplements
Packit 1c1d7e
  // + reimplementedBy
Packit 1c1d7e
  // + exceptions
Packit 1c1d7e
  // + const/volatile specifiers
Packit 1c1d7e
  // - examples
Packit 1c1d7e
  // + source definition
Packit 1c1d7e
  // + source references
Packit 1c1d7e
  // + source referenced by
Packit 1c1d7e
  // - body code 
Packit 1c1d7e
  // + template arguments 
Packit 1c1d7e
  //     (templateArguments(), definitionTemplateParameterLists())
Packit 1c1d7e
  // - call graph
Packit 1c1d7e
  
Packit 1c1d7e
  // enum values are written as part of the enum
Packit 1c1d7e
  if (md->memberType()==MemberType_EnumValue) return;
Packit 1c1d7e
  if (md->isHidden()) return;
Packit 1c1d7e
  //if (md->name().at(0)=='@') return; // anonymous member
Packit 1c1d7e
Packit 1c1d7e
  // group members are only visible in their group
Packit 1c1d7e
  //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
Packit 1c1d7e
Packit 1c1d7e
  QCString memType;
Packit 1c1d7e
  bool isFunc=FALSE;
Packit 1c1d7e
  switch (md->memberType())
Packit 1c1d7e
  {
Packit 1c1d7e
    case MemberType_Define:      memType="define";    break;
Packit 1c1d7e
    case MemberType_Function:    memType="function";  isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_Variable:    memType="variable";  break;
Packit 1c1d7e
    case MemberType_Typedef:     memType="typedef";   break;
Packit 1c1d7e
    case MemberType_Enumeration: memType="enum";      break;
Packit 1c1d7e
    case MemberType_EnumValue:   ASSERT(0);           break;
Packit 1c1d7e
    case MemberType_Signal:      memType="signal";    isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_Slot:        memType="slot";      isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_Friend:      memType="friend";    isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_DCOP:        memType="dcop";      isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_Property:    memType="property";  break;
Packit 1c1d7e
    case MemberType_Event:       memType="event";     break;
Packit 1c1d7e
    case MemberType_Interface:   memType="interface"; break;
Packit 1c1d7e
    case MemberType_Service:     memType="service";   break;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  ti << "    
Packit 1c1d7e
     << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>" 
Packit 1c1d7e
     << convertToXML(md->name()) << "</name></member>" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
  QCString scopeName;
Packit 1c1d7e
  if (md->getClassDef()) 
Packit 1c1d7e
    scopeName=md->getClassDef()->name();
Packit 1c1d7e
  else if (md->getNamespaceDef()) 
Packit 1c1d7e
    scopeName=md->getNamespaceDef()->name();
Packit 1c1d7e
    
Packit 1c1d7e
  t << "      
Packit 1c1d7e
  //enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t;
Packit 1c1d7e
  t << memType << "\" id=\"";
Packit 1c1d7e
  if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    t << memberOutputFileBase(md);
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "_1"      // encoded `:' character (see util.cpp:convertNameToFile)
Packit 1c1d7e
    << md->anchor();
Packit 1c1d7e
  t << "\" prot=\"";
Packit 1c1d7e
  switch(md->protection())
Packit 1c1d7e
  {
Packit 1c1d7e
    case Public:    t << "public";     break;
Packit 1c1d7e
    case Protected: t << "protected";  break;
Packit 1c1d7e
    case Private:   t << "private";    break;
Packit 1c1d7e
    case Package:   t << "package";    break;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "\"";
Packit 1c1d7e
Packit 1c1d7e
  t << " static=\"";
Packit 1c1d7e
  if (md->isStatic()) t << "yes"; else t << "no";
Packit 1c1d7e
  t << "\"";
Packit 1c1d7e
Packit 1c1d7e
  if (isFunc)
Packit 1c1d7e
  {
Packit 1c1d7e
    ArgumentList *al = md->argumentList();
Packit 1c1d7e
    t << " const=\"";
Packit 1c1d7e
    if (al!=0 && al->constSpecifier)    t << "yes"; else t << "no"; 
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " explicit=\"";
Packit 1c1d7e
    if (md->isExplicit()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " inline=\"";
Packit 1c1d7e
    if (md->isInline()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    if (al!=0 && al->refQualifier!=RefQualifierNone)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " refqual=\"";
Packit 1c1d7e
      if (al->refQualifier==RefQualifierLValue) t << "lvalue"; else t << "rvalue";
Packit 1c1d7e
      t << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (md->isFinal())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " final=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (md->isSealed())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " sealed=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (md->isNew())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " new=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (md->isOptional())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " optional=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (md->isRequired())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " required=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (al && al->volatileSpecifier)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " volatile=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    t << " virt=\"";
Packit 1c1d7e
    switch (md->virtualness())
Packit 1c1d7e
    {
Packit 1c1d7e
      case Normal:  t << "non-virtual";  break;
Packit 1c1d7e
      case Virtual: t << "virtual";      break;
Packit 1c1d7e
      case Pure:    t << "pure-virtual"; break;
Packit 1c1d7e
      default: ASSERT(0);
Packit 1c1d7e
    }
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md->memberType() == MemberType_Enumeration)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << " strong=\"";
Packit 1c1d7e
    if (md->isStrong()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md->memberType() == MemberType_Variable)
Packit 1c1d7e
  {
Packit 1c1d7e
    //ArgumentList *al = md->argumentList();
Packit 1c1d7e
    //t << " volatile=\"";
Packit 1c1d7e
    //if (al && al->volatileSpecifier) t << "yes"; else t << "no"; 
Packit 1c1d7e
Packit 1c1d7e
    t << " mutable=\"";
Packit 1c1d7e
    if (md->isMutable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
    
Packit 1c1d7e
    if (md->isInitonly())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " initonly=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isAttribute())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " attribute=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isUNOProperty())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " property=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isReadonly())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " readonly=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isBound())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " bound=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isRemovable())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " removable=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isConstrained())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " constrained=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isTransient())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " transient=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isMaybeVoid())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " maybevoid=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isMaybeDefault())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " maybedefault=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    if (md->isMaybeAmbiguous())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " maybeambiguous=\"yes\"";
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (md->memberType() == MemberType_Property)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << " readable=\"";
Packit 1c1d7e
    if (md->isReadable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " writable=\"";
Packit 1c1d7e
    if (md->isWritable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " gettable=\"";
Packit 1c1d7e
    if (md->isGettable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " privategettable=\"";
Packit 1c1d7e
    if (md->isPrivateGettable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " protectedgettable=\"";
Packit 1c1d7e
    if (md->isProtectedGettable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " settable=\"";
Packit 1c1d7e
    if (md->isSettable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " privatesettable=\"";
Packit 1c1d7e
    if (md->isPrivateSettable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " protectedsettable=\"";
Packit 1c1d7e
    if (md->isProtectedSettable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    if (md->isAssign() || md->isCopy() || md->isRetain() || md->isStrong() || md->isWeak())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << " accessor=\"";
Packit 1c1d7e
      if (md->isAssign())      t << "assign";
Packit 1c1d7e
      else if (md->isCopy())   t << "copy";
Packit 1c1d7e
      else if (md->isRetain()) t << "retain";
Packit 1c1d7e
      else if (md->isStrong()) t << "strong";
Packit 1c1d7e
      else if (md->isWeak())   t << "weak";
Packit 1c1d7e
      t << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (md->memberType() == MemberType_Event)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << " add=\"";
Packit 1c1d7e
    if (md->isAddable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " remove=\"";
Packit 1c1d7e
    if (md->isRemovable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
Packit 1c1d7e
    t << " raise=\"";
Packit 1c1d7e
    if (md->isRaisable()) t << "yes"; else t << "no";
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << ">" << endl;
Packit 1c1d7e
Packit 1c1d7e
  if (md->memberType()!=MemberType_Define &&
Packit 1c1d7e
      md->memberType()!=MemberType_Enumeration
Packit 1c1d7e
     )
Packit 1c1d7e
  {
Packit 1c1d7e
    writeMemberTemplateLists(md,t);
Packit 1c1d7e
    QCString typeStr = md->typeString(); //replaceAnonymousScopes(md->typeString());
Packit 1c1d7e
    stripQualifiers(typeStr);
Packit 1c1d7e
    t << "        <type>";
Packit 1c1d7e
    linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,typeStr);
Packit 1c1d7e
    t << "</type>" << endl;
Packit 1c1d7e
    t << "        <definition>" << convertToXML(md->definition()) << "</definition>" << endl;
Packit 1c1d7e
    t << "        <argsstring>" << convertToXML(md->argsString()) << "</argsstring>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md->memberType() == MemberType_Enumeration)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        <type>";
Packit 1c1d7e
    linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->enumBaseType());
Packit 1c1d7e
    t << "</type>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "        <name>" << convertToXML(md->name()) << "</name>" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
  if (md->memberType() == MemberType_Property)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isReadable())
Packit 1c1d7e
      t << "        <read>" << convertToXML(md->getReadAccessor()) << "</read>" << endl;
Packit 1c1d7e
    if (md->isWritable())
Packit 1c1d7e
      t << "        <write>" << convertToXML(md->getWriteAccessor()) << "</write>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md->memberType()==MemberType_Variable && md->bitfieldString())
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString bitfield = md->bitfieldString();
Packit 1c1d7e
    if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
Packit 1c1d7e
    t << "        <bitfield>" << convertToXML(bitfield) << "</bitfield>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  MemberDef *rmd = md->reimplements();
Packit 1c1d7e
  if (rmd)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        
Packit 1c1d7e
      << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
Packit 1c1d7e
      << convertToXML(rmd->name()) << "</reimplements>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  MemberList *rbml = md->reimplementedBy();
Packit 1c1d7e
  if (rbml)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberListIterator mli(*rbml);
Packit 1c1d7e
    for (mli.toFirst();(rmd=mli.current());++mli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        
Packit 1c1d7e
        << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
Packit 1c1d7e
        << convertToXML(rmd->name()) << "</reimplementedby>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (isFunc) //function
Packit 1c1d7e
  {
Packit 1c1d7e
    ArgumentList *declAl = md->declArgumentList();
Packit 1c1d7e
    ArgumentList *defAl = md->argumentList();
Packit 1c1d7e
    if (declAl && defAl && declAl->count()>0)
Packit 1c1d7e
    {
Packit 1c1d7e
      ArgumentListIterator declAli(*declAl);
Packit 1c1d7e
      ArgumentListIterator defAli(*defAl);
Packit 1c1d7e
      Argument *a;
Packit 1c1d7e
      for (declAli.toFirst();(a=declAli.current());++declAli)
Packit 1c1d7e
      {
Packit 1c1d7e
        Argument *defArg = defAli.current();
Packit 1c1d7e
        t << "        <param>" << endl;
Packit 1c1d7e
        if (!a->attrib.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <attributes>";
Packit 1c1d7e
          writeXMLString(t,a->attrib);
Packit 1c1d7e
          t << "</attributes>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->type.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <type>";
Packit 1c1d7e
          linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a->type);
Packit 1c1d7e
          t << "</type>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->name.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <declname>";
Packit 1c1d7e
          writeXMLString(t,a->name); 
Packit 1c1d7e
          t << "</declname>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <defname>";
Packit 1c1d7e
          writeXMLString(t,defArg->name);
Packit 1c1d7e
          t << "</defname>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->array.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <array>"; 
Packit 1c1d7e
          writeXMLString(t,a->array); 
Packit 1c1d7e
          t << "</array>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->defval.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <defval>";
Packit 1c1d7e
          linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a->defval);
Packit 1c1d7e
          t << "</defval>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (defArg && defArg->hasDocumentation())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <briefdescription>";
Packit 1c1d7e
          writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(),
Packit 1c1d7e
                           md->getOuterScope(),md,defArg->docs);
Packit 1c1d7e
          t << "</briefdescription>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "        </param>" << endl;
Packit 1c1d7e
        if (defArg) ++defAli;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (md->memberType()==MemberType_Define && 
Packit 1c1d7e
          md->argsString()) // define
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->argumentList()->count()==0) // special case for "foo()" to
Packit 1c1d7e
                                        // disguish it from "foo".
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        <param></param>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      ArgumentListIterator ali(*md->argumentList());
Packit 1c1d7e
      Argument *a;
Packit 1c1d7e
      for (ali.toFirst();(a=ali.current());++ali)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "        <param><defname>" << a->type << "</defname></param>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md->hasOneLineInitializer() || md->hasMultiLineInitializer())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        <initializer>";
Packit 1c1d7e
    linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->initializer());
Packit 1c1d7e
    t << "</initializer>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md->excpString())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        <exceptions>";
Packit 1c1d7e
    linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->excpString());
Packit 1c1d7e
    t << "</exceptions>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  if (md->memberType()==MemberType_Enumeration) // enum
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberList *enumFields = md->enumFieldList();
Packit 1c1d7e
    if (enumFields)
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberListIterator emli(*enumFields);
Packit 1c1d7e
      MemberDef *emd;
Packit 1c1d7e
      for (emli.toFirst();(emd=emli.current());++emli)
Packit 1c1d7e
      {
Packit 1c1d7e
        ti << "    
Packit 1c1d7e
           << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>" 
Packit 1c1d7e
           << convertToXML(emd->name()) << "</name></member>" << endl;
Packit 1c1d7e
Packit 1c1d7e
        t << "        
Packit 1c1d7e
          << emd->anchor() << "\" prot=\"";
Packit 1c1d7e
        switch (emd->protection())
Packit 1c1d7e
        {
Packit 1c1d7e
          case Public:    t << "public";    break;
Packit 1c1d7e
          case Protected: t << "protected"; break;
Packit 1c1d7e
          case Private:   t << "private";   break;
Packit 1c1d7e
          case Package:   t << "package";   break;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "\">" << endl;
Packit 1c1d7e
        t << "          <name>";
Packit 1c1d7e
        writeXMLString(t,emd->name());
Packit 1c1d7e
        t << "</name>" << endl;
Packit 1c1d7e
        if (!emd->initializer().isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "          <initializer>";
Packit 1c1d7e
          writeXMLString(t,emd->initializer());
Packit 1c1d7e
          t << "</initializer>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "          <briefdescription>" << endl;
Packit 1c1d7e
        writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription());
Packit 1c1d7e
        t << "          </briefdescription>" << endl;
Packit 1c1d7e
        t << "          <detaileddescription>" << endl;
Packit 1c1d7e
        writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation());
Packit 1c1d7e
        t << "          </detaileddescription>" << endl;
Packit 1c1d7e
        t << "        </enumvalue>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "        <briefdescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,md->briefFile(),md->briefLine(),md->getOuterScope(),md,md->briefDescription());
Packit 1c1d7e
  t << "        </briefdescription>" << endl;
Packit 1c1d7e
  t << "        <detaileddescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
Packit 1c1d7e
  t << "        </detaileddescription>" << endl;
Packit 1c1d7e
  t << "        <inbodydescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,md->docFile(),md->inbodyLine(),md->getOuterScope(),md,md->inbodyDocumentation());
Packit 1c1d7e
  t << "        </inbodydescription>" << endl;
Packit 1c1d7e
  if (md->getDefLine()!=-1)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        
Packit 1c1d7e
      << stripFromPath(md->getDefFileName()) << "\" line=\"" 
Packit 1c1d7e
      << md->getDefLine() << "\"" << " column=\"" 
Packit 1c1d7e
      << md->getDefColumn() << "\"" ;
Packit 1c1d7e
    if (md->getStartBodyLine()!=-1)
Packit 1c1d7e
    {
Packit 1c1d7e
      FileDef *bodyDef = md->getBodyDef();
Packit 1c1d7e
      if (bodyDef)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << " bodyfile=\"" << stripFromPath(bodyDef->absFilePath()) << "\"";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\"" 
Packit 1c1d7e
        << md->getEndBodyLine() << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    t << "/>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
Packit 1c1d7e
  MemberSDict *mdict = md->getReferencesMembers();
Packit 1c1d7e
  if (mdict)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberSDict::Iterator mdi(*mdict);
Packit 1c1d7e
    MemberDef *rmd;
Packit 1c1d7e
    for (mdi.toFirst();(rmd=mdi.current());++mdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      writeMemberReference(t,def,rmd,"references");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  mdict = md->getReferencedByMembers();
Packit 1c1d7e
  if (mdict)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberSDict::Iterator mdi(*mdict);
Packit 1c1d7e
    MemberDef *rmd;
Packit 1c1d7e
    for (mdi.toFirst();(rmd=mdi.current());++mdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      writeMemberReference(t,def,rmd,"referencedby");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  t << "      </memberdef>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateXMLSection(Definition *d,FTextStream &ti,FTextStream &t,
Packit 1c1d7e
                      MemberList *ml,const char *kind,const char *header=0,
Packit 1c1d7e
                      const char *documentation=0)
Packit 1c1d7e
{
Packit 1c1d7e
  if (ml==0) return;
Packit 1c1d7e
  MemberListIterator mli(*ml);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    // namespace members are also inserted in the file scope, but 
Packit 1c1d7e
    // to prevent this duplication in the XML output, we filter those here.
Packit 1c1d7e
    if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      count++;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (count==0) return; // empty list
Packit 1c1d7e
Packit 1c1d7e
  t << "      <sectiondef kind=\"" << kind << "\">" << endl;
Packit 1c1d7e
  if (header)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "      <header>" << convertToXML(header) << "</header>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (documentation)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "      <description>";
Packit 1c1d7e
    writeXMLDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
Packit 1c1d7e
    t << "</description>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    // namespace members are also inserted in the file scope, but 
Packit 1c1d7e
    // to prevent this duplication in the XML output, we filter those here.
Packit 1c1d7e
    if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLForMember(md,ti,t,d);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "      </sectiondef>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeListOfAllMembers(ClassDef *cd,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "    <listofallmembers>" << endl;
Packit 1c1d7e
  if (cd->memberNameInfoSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
Packit 1c1d7e
    MemberNameInfo *mni;
Packit 1c1d7e
    for (mnii.toFirst();(mni=mnii.current());++mnii)
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberNameInfoIterator mii(*mni);
Packit 1c1d7e
      MemberInfo *mi;
Packit 1c1d7e
      for (mii.toFirst();(mi=mii.current());++mii)
Packit 1c1d7e
      {
Packit 1c1d7e
        MemberDef *md=mi->memberDef;
Packit 1c1d7e
        if (md->name().at(0)!='@') // skip anonymous members
Packit 1c1d7e
        {
Packit 1c1d7e
          Protection prot = mi->prot;
Packit 1c1d7e
          Specifier virt=md->virtualness();
Packit 1c1d7e
          t << "      
Packit 1c1d7e
            md->anchor() << "\" prot=\"";
Packit 1c1d7e
          switch (prot)
Packit 1c1d7e
          {
Packit 1c1d7e
            case Public:    t << "public";    break;
Packit 1c1d7e
            case Protected: t << "protected"; break;
Packit 1c1d7e
            case Private:   t << "private";   break;
Packit 1c1d7e
            case Package:   t << "package";   break;
Packit 1c1d7e
          }
Packit 1c1d7e
          t << "\" virt=\"";
Packit 1c1d7e
          switch(virt)
Packit 1c1d7e
          {
Packit 1c1d7e
            case Normal:  t << "non-virtual";  break;
Packit 1c1d7e
            case Virtual: t << "virtual";      break;
Packit 1c1d7e
            case Pure:    t << "pure-virtual"; break;
Packit 1c1d7e
          }
Packit 1c1d7e
          t << "\"";
Packit 1c1d7e
          if (!mi->ambiguityResolutionScope.isEmpty())
Packit 1c1d7e
          {
Packit 1c1d7e
            t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope) << "\"";
Packit 1c1d7e
          }
Packit 1c1d7e
          t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" << 
Packit 1c1d7e
            convertToXML(md->name()) << "</name></member>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "    </listofallmembers>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (cl)
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassSDict::Iterator cli(*cl);
Packit 1c1d7e
    ClassDef *cd;
Packit 1c1d7e
    for (cli.toFirst();(cd=cli.current());++cli)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "    
Packit 1c1d7e
          << "\" prot=\"";
Packit 1c1d7e
        switch(cd->protection())
Packit 1c1d7e
        {
Packit 1c1d7e
           case Public:    t << "public";     break;
Packit 1c1d7e
           case Protected: t << "protected";  break;
Packit 1c1d7e
           case Private:   t << "private";    break;
Packit 1c1d7e
           case Package:   t << "package";    break;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (nl)
Packit 1c1d7e
  {
Packit 1c1d7e
    NamespaceSDict::Iterator nli(*nl);
Packit 1c1d7e
    NamespaceDef *nd;
Packit 1c1d7e
    for (nli.toFirst();(nd=nli.current());++nli)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "    <innernamespace refid=\"" << nd->getOutputFileBase()
Packit 1c1d7e
          << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerFiles(const FileList *fl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (fl)
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<FileDef> fli(*fl);
Packit 1c1d7e
    FileDef *fd;
Packit 1c1d7e
    for (fli.toFirst();(fd=fli.current());++fli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <innerfile refid=\"" << fd->getOutputFileBase() 
Packit 1c1d7e
        << "\">" << convertToXML(fd->name()) << "</innerfile>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerPages(const PageSDict *pl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (pl)
Packit 1c1d7e
  {
Packit 1c1d7e
    PageSDict::Iterator pli(*pl);
Packit 1c1d7e
    PageDef *pd;
Packit 1c1d7e
    for (pli.toFirst();(pd=pli.current());++pli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <innerpage refid=\"" << pd->getOutputFileBase();
Packit 1c1d7e
      if (pd->getGroupDef())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "_" << pd->name();
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "\">" << convertToXML(pd->title()) << "</innerpage>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerGroups(const GroupList *gl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (gl)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupListIterator gli(*gl);
Packit 1c1d7e
    GroupDef *sgd;
Packit 1c1d7e
    for (gli.toFirst();(sgd=gli.current());++gli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <innergroup refid=\"" << sgd->getOutputFileBase()
Packit 1c1d7e
        << "\">" << convertToXML(sgd->groupTitle()) 
Packit 1c1d7e
        << "</innergroup>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerDirs(const DirList *dl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (dl)
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<DirDef> subdirs(*dl);
Packit 1c1d7e
    DirDef *subdir;
Packit 1c1d7e
    for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <innerdir refid=\"" << subdir->getOutputFileBase() 
Packit 1c1d7e
        << "\">" << convertToXML(subdir->displayName()) << "</innerdir>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
  
Packit 1c1d7e
static void generateXMLForClass(ClassDef *cd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + brief description
Packit 1c1d7e
  // + detailed description
Packit 1c1d7e
  // + template argument list(s)
Packit 1c1d7e
  // - include file
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + inheritance diagram
Packit 1c1d7e
  // + list of direct super classes
Packit 1c1d7e
  // + list of direct sub classes
Packit 1c1d7e
  // + list of inner classes
Packit 1c1d7e
  // + collaboration diagram
Packit 1c1d7e
  // + list of all members
Packit 1c1d7e
  // + user defined member sections
Packit 1c1d7e
  // + standard member sections
Packit 1c1d7e
  // + detailed member documentation
Packit 1c1d7e
  // - examples using the class
Packit 1c1d7e
Packit 1c1d7e
  if (cd->isReference())        return; // skip external references.
Packit 1c1d7e
  if (cd->isHidden())           return; // skip hidden classes.
Packit 1c1d7e
  if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
Packit 1c1d7e
  if (cd->templateMaster()!=0)  return; // skip generated template instances.
Packit 1c1d7e
  if (cd->isArtificial())       return; // skip artificially created classes
Packit 1c1d7e
Packit 1c1d7e
  msg("Generating XML output for class %s\n",cd->name().data());
Packit 1c1d7e
Packit 1c1d7e
  ti << "  
Packit 1c1d7e
     << "\" kind=\"" << cd->compoundTypeString()
Packit 1c1d7e
     << "\"><name>" << convertToXML(cd->name()) << "</name>" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  writeXMLHeader(t);
Packit 1c1d7e
  t << "  
Packit 1c1d7e
    << classOutputFileBase(cd) << "\" kind=\"" 
Packit 1c1d7e
    << cd->compoundTypeString() << "\" language=\""
Packit 1c1d7e
    << langToString(cd->getLanguage()) << "\" prot=\"";
Packit 1c1d7e
  switch (cd->protection())
Packit 1c1d7e
  {
Packit 1c1d7e
    case Public:    t << "public";    break;
Packit 1c1d7e
    case Protected: t << "protected"; break;
Packit 1c1d7e
    case Private:   t << "private";   break;
Packit 1c1d7e
    case Package:   t << "package";   break;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (cd->isFinal()) t << "\" final=\"yes";
Packit 1c1d7e
  if (cd->isSealed()) t << "\" sealed=\"yes";
Packit 1c1d7e
  if (cd->isAbstract()) t << "\" abstract=\"yes";
Packit 1c1d7e
  t << "\">" << endl;
Packit 1c1d7e
  t << "    <compoundname>"; 
Packit 1c1d7e
  writeXMLString(t,cd->name()); 
Packit 1c1d7e
  t << "</compoundname>" << endl;
Packit 1c1d7e
  if (cd->baseClasses())
Packit 1c1d7e
  {
Packit 1c1d7e
    BaseClassListIterator bcli(*cd->baseClasses());
Packit 1c1d7e
    BaseClassDef *bcd;
Packit 1c1d7e
    for (bcli.toFirst();(bcd=bcli.current());++bcli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    
Packit 1c1d7e
      if (bcd->classDef->isLinkable())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "refid=\"" << classOutputFileBase(bcd->classDef) << "\" ";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "prot=\"";
Packit 1c1d7e
      switch (bcd->prot)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Public:    t << "public";    break;
Packit 1c1d7e
        case Protected: t << "protected"; break;
Packit 1c1d7e
        case Private:   t << "private";   break;
Packit 1c1d7e
        case Package: ASSERT(0); break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "\" virt=\"";
Packit 1c1d7e
      switch(bcd->virt)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Normal:  t << "non-virtual";  break;
Packit 1c1d7e
        case Virtual: t << "virtual";      break;
Packit 1c1d7e
        case Pure:    t <<"pure-virtual"; break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "\">";
Packit 1c1d7e
      if (!bcd->templSpecifiers.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << convertToXML(
Packit 1c1d7e
              insertTemplateSpecifierInScope(
Packit 1c1d7e
              bcd->classDef->name(),bcd->templSpecifiers)
Packit 1c1d7e
           );
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << convertToXML(bcd->classDef->displayName());
Packit 1c1d7e
      }
Packit 1c1d7e
      t  << "</basecompoundref>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (cd->subClasses())
Packit 1c1d7e
  {
Packit 1c1d7e
    BaseClassListIterator bcli(*cd->subClasses());
Packit 1c1d7e
    BaseClassDef *bcd;
Packit 1c1d7e
    for (bcli.toFirst();(bcd=bcli.current());++bcli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    
Packit 1c1d7e
        << classOutputFileBase(bcd->classDef)
Packit 1c1d7e
        << "\" prot=\"";
Packit 1c1d7e
      switch (bcd->prot)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Public:    t << "public";    break;
Packit 1c1d7e
        case Protected: t << "protected"; break;
Packit 1c1d7e
        case Private:   t << "private";   break;
Packit 1c1d7e
        case Package: ASSERT(0); break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "\" virt=\"";
Packit 1c1d7e
      switch(bcd->virt)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Normal:  t << "non-virtual";  break;
Packit 1c1d7e
        case Virtual: t << "virtual";      break;
Packit 1c1d7e
        case Pure:    t << "pure-virtual"; break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "\">" << convertToXML(bcd->classDef->displayName()) 
Packit 1c1d7e
        << "</derivedcompoundref>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  IncludeInfo *ii=cd->includeInfo();
Packit 1c1d7e
  if (ii)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString nm = ii->includeName;
Packit 1c1d7e
    if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
Packit 1c1d7e
    if (!nm.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    
Packit 1c1d7e
      if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
Packit 1c1d7e
      {
Packit 1c1d7e
        t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\"";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << " local=\"" << (ii->local ? "yes" : "no") << "\">";
Packit 1c1d7e
      t << nm;
Packit 1c1d7e
      t << "</includes>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  writeInnerClasses(cd->getClassSDict(),t);
Packit 1c1d7e
Packit 1c1d7e
  writeTemplateList(cd,t);
Packit 1c1d7e
  if (cd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(cd,ti,t,mg->members(),"user-defined",mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(cd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_detailedLists)==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(cd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "    <briefdescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
Packit 1c1d7e
  t << "    </briefdescription>" << endl;
Packit 1c1d7e
  t << "    <detaileddescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
Packit 1c1d7e
  t << "    </detaileddescription>" << endl;
Packit 1c1d7e
  DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
Packit 1c1d7e
  if (!inheritanceGraph.isTrivial())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <inheritancegraph>" << endl;
Packit 1c1d7e
    inheritanceGraph.writeXML(t);
Packit 1c1d7e
    t << "    </inheritancegraph>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
Packit 1c1d7e
  if (!collaborationGraph.isTrivial())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <collaborationgraph>" << endl;
Packit 1c1d7e
    collaborationGraph.writeXML(t);
Packit 1c1d7e
    t << "    </collaborationgraph>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "    
Packit 1c1d7e
    << stripFromPath(cd->getDefFileName()) << "\" line=\"" 
Packit 1c1d7e
    << cd->getDefLine() << "\"" << " column=\"" 
Packit 1c1d7e
    << cd->getDefColumn() << "\"" ;
Packit 1c1d7e
    if (cd->getStartBodyLine()!=-1)
Packit 1c1d7e
    {
Packit 1c1d7e
      FileDef *bodyDef = cd->getBodyDef();
Packit 1c1d7e
      if (bodyDef)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << " bodyfile=\"" << stripFromPath(bodyDef->absFilePath()) << "\"";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\"" 
Packit 1c1d7e
        << cd->getEndBodyLine() << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
  t << "/>" << endl;
Packit 1c1d7e
  writeListOfAllMembers(cd,t);
Packit 1c1d7e
  t << "  </compounddef>" << endl;
Packit 1c1d7e
  t << "</doxygen>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  ti << "  </compound>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateXMLForNamespace(NamespaceDef *nd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + contained class definitions
Packit 1c1d7e
  // + contained namespace definitions
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + normal members
Packit 1c1d7e
  // + brief desc
Packit 1c1d7e
  // + detailed desc
Packit 1c1d7e
  // + location
Packit 1c1d7e
  // - files containing (parts of) the namespace definition
Packit 1c1d7e
Packit 1c1d7e
  if (nd->isReference() || nd->isHidden()) return; // skip external references
Packit 1c1d7e
Packit 1c1d7e
  ti << "  <compound refid=\"" << nd->getOutputFileBase() 
Packit 1c1d7e
     << "\" kind=\"namespace\"" << "><name>" 
Packit 1c1d7e
     << convertToXML(nd->name()) << "</name>" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
  
Packit 1c1d7e
  writeXMLHeader(t);
Packit 1c1d7e
  t << "  <compounddef id=\"" << nd->getOutputFileBase() 
Packit 1c1d7e
    << "\" kind=\"namespace\" language=\"" 
Packit 1c1d7e
    << langToString(nd->getLanguage()) << "\">" << endl;
Packit 1c1d7e
  t << "    <compoundname>";
Packit 1c1d7e
  writeXMLString(t,nd->name());
Packit 1c1d7e
  t << "</compoundname>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  writeInnerClasses(nd->getClassSDict(),t);
Packit 1c1d7e
  writeInnerNamespaces(nd->getNamespaceSDict(),t);
Packit 1c1d7e
Packit 1c1d7e
  if (nd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(nd,ti,t,mg->members(),"user-defined",mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(nd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_declarationLists)!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(nd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "    <briefdescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
Packit 1c1d7e
  t << "    </briefdescription>" << endl;
Packit 1c1d7e
  t << "    <detaileddescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
Packit 1c1d7e
  t << "    </detaileddescription>" << endl;
Packit 1c1d7e
  t << "    
Packit 1c1d7e
    << stripFromPath(nd->getDefFileName()) << "\" line=\""
Packit 1c1d7e
    << nd->getDefLine() << "\"" << " column=\""
Packit 1c1d7e
    << nd->getDefColumn() << "\"/>" << endl ;
Packit 1c1d7e
  t << "  </compounddef>" << endl;
Packit 1c1d7e
  t << "</doxygen>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  ti << "  </compound>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateXMLForFile(FileDef *fd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + includes files
Packit 1c1d7e
  // + includedby files
Packit 1c1d7e
  // + include graph
Packit 1c1d7e
  // + included by graph
Packit 1c1d7e
  // + contained class definitions
Packit 1c1d7e
  // + contained namespace definitions
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + normal members
Packit 1c1d7e
  // + brief desc
Packit 1c1d7e
  // + detailed desc
Packit 1c1d7e
  // + source code
Packit 1c1d7e
  // + location
Packit 1c1d7e
  // - number of lines
Packit 1c1d7e
  
Packit 1c1d7e
  if (fd->isReference()) return; // skip external references
Packit 1c1d7e
  
Packit 1c1d7e
  ti << "  <compound refid=\"" << fd->getOutputFileBase() 
Packit 1c1d7e
     << "\" kind=\"file\"><name>" << convertToXML(fd->name()) 
Packit 1c1d7e
     << "</name>" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  writeXMLHeader(t);
Packit 1c1d7e
  t << "  <compounddef id=\"" << fd->getOutputFileBase()
Packit 1c1d7e
    << "\" kind=\"file\" language=\"" 
Packit 1c1d7e
    << langToString(fd->getLanguage()) << "\">" << endl;
Packit 1c1d7e
  t << "    <compoundname>";
Packit 1c1d7e
  writeXMLString(t,fd->name());
Packit 1c1d7e
  t << "</compoundname>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  IncludeInfo *inc;
Packit 1c1d7e
Packit 1c1d7e
  if (fd->includeFileList())
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<IncludeInfo> ili1(*fd->includeFileList());
Packit 1c1d7e
    for (ili1.toFirst();(inc=ili1.current());++ili1)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    
Packit 1c1d7e
      if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
Packit 1c1d7e
      {
Packit 1c1d7e
        t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
Packit 1c1d7e
      t << inc->includeName;
Packit 1c1d7e
      t << "</includes>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (fd->includedByFileList())
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
Packit 1c1d7e
    for (ili2.toFirst();(inc=ili2.current());++ili2)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    
Packit 1c1d7e
      if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
Packit 1c1d7e
      {
Packit 1c1d7e
        t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
Packit 1c1d7e
      t << inc->includeName;
Packit 1c1d7e
      t << "</includedby>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  DotInclDepGraph incDepGraph(fd,FALSE);
Packit 1c1d7e
  if (!incDepGraph.isTrivial())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <incdepgraph>" << endl;
Packit 1c1d7e
    incDepGraph.writeXML(t);
Packit 1c1d7e
    t << "    </incdepgraph>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  DotInclDepGraph invIncDepGraph(fd,TRUE);
Packit 1c1d7e
  if (!invIncDepGraph.isTrivial())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <invincdepgraph>" << endl;
Packit 1c1d7e
    invIncDepGraph.writeXML(t);
Packit 1c1d7e
    t << "    </invincdepgraph>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (fd->getClassSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    writeInnerClasses(fd->getClassSDict(),t);
Packit 1c1d7e
  }
Packit 1c1d7e
  if (fd->getNamespaceSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    writeInnerNamespaces(fd->getNamespaceSDict(),t);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (fd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(fd,ti,t,mg->members(),"user-defined",mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(fd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_declarationLists)!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(fd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "    <briefdescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
Packit 1c1d7e
  t << "    </briefdescription>" << endl;
Packit 1c1d7e
  t << "    <detaileddescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
Packit 1c1d7e
  t << "    </detaileddescription>" << endl;
Packit 1c1d7e
  if (Config_getBool(XML_PROGRAMLISTING))
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <programlisting>" << endl;
Packit 1c1d7e
    writeXMLCodeBlock(t,fd);
Packit 1c1d7e
    t << "    </programlisting>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "    <location file=\"" << stripFromPath(fd->getDefFileName()) << "\"/>" << endl;
Packit 1c1d7e
  t << "  </compounddef>" << endl;
Packit 1c1d7e
  t << "</doxygen>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  ti << "  </compound>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateXMLForGroup(GroupDef *gd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + members
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + files
Packit 1c1d7e
  // + classes
Packit 1c1d7e
  // + namespaces
Packit 1c1d7e
  // - packages
Packit 1c1d7e
  // + pages
Packit 1c1d7e
  // + child groups
Packit 1c1d7e
  // - examples
Packit 1c1d7e
  // + brief description
Packit 1c1d7e
  // + detailed description
Packit 1c1d7e
Packit 1c1d7e
  if (gd->isReference()) return; // skip external references
Packit 1c1d7e
Packit 1c1d7e
  ti << "  <compound refid=\"" << gd->getOutputFileBase() 
Packit 1c1d7e
     << "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
  writeXMLHeader(t);
Packit 1c1d7e
  t << "  
Packit 1c1d7e
    << gd->getOutputFileBase() << "\" kind=\"group\">" << endl;
Packit 1c1d7e
  t << "    <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl;
Packit 1c1d7e
  t << "    <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  writeInnerFiles(gd->getFiles(),t);
Packit 1c1d7e
  writeInnerClasses(gd->getClasses(),t);
Packit 1c1d7e
  writeInnerNamespaces(gd->getNamespaces(),t);
Packit 1c1d7e
  writeInnerPages(gd->getPages(),t);
Packit 1c1d7e
  writeInnerGroups(gd->getSubGroups(),t);
Packit 1c1d7e
Packit 1c1d7e
  if (gd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(gd,ti,t,mg->members(),"user-defined",mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(gd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_declarationLists)!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLSection(gd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "    <briefdescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
Packit 1c1d7e
  t << "    </briefdescription>" << endl;
Packit 1c1d7e
  t << "    <detaileddescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
Packit 1c1d7e
  t << "    </detaileddescription>" << endl;
Packit 1c1d7e
  t << "  </compounddef>" << endl;
Packit 1c1d7e
  t << "</doxygen>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  ti << "  </compound>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateXMLForDir(DirDef *dd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  if (dd->isReference()) return; // skip external references
Packit 1c1d7e
  ti << "  <compound refid=\"" << dd->getOutputFileBase() 
Packit 1c1d7e
     << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName()) 
Packit 1c1d7e
     << "</name>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
  writeXMLHeader(t);
Packit 1c1d7e
  t << "  
Packit 1c1d7e
    << dd->getOutputFileBase() << "\" kind=\"dir\">" << endl;
Packit 1c1d7e
  t << "    <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  writeInnerDirs(&dd->subDirs(),t);
Packit 1c1d7e
  writeInnerFiles(dd->getFiles(),t);
Packit 1c1d7e
Packit 1c1d7e
  t << "    <briefdescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
Packit 1c1d7e
  t << "    </briefdescription>" << endl;
Packit 1c1d7e
  t << "    <detaileddescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
Packit 1c1d7e
  t << "    </detaileddescription>" << endl;
Packit 1c1d7e
  t << "    <location file=\"" << stripFromPath(dd->name()) << "\"/>" << endl; 
Packit 1c1d7e
  t << "  </compounddef>" << endl;
Packit 1c1d7e
  t << "</doxygen>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  ti << "  </compound>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
Packit 1c1d7e
{
Packit 1c1d7e
  // + name
Packit 1c1d7e
  // + title
Packit 1c1d7e
  // + documentation
Packit 1c1d7e
Packit 1c1d7e
  const char *kindName = isExample ? "example" : "page";
Packit 1c1d7e
Packit 1c1d7e
  if (pd->isReference()) return;
Packit 1c1d7e
  
Packit 1c1d7e
  QCString pageName = pd->getOutputFileBase();
Packit 1c1d7e
  if (pd->getGroupDef())
Packit 1c1d7e
  {
Packit 1c1d7e
    pageName+=(QCString)"_"+pd->name();
Packit 1c1d7e
  }
Packit 1c1d7e
  if (pageName=="index") pageName="indexpage"; // to prevent overwriting the generated index page.
Packit 1c1d7e
  
Packit 1c1d7e
  ti << "  
Packit 1c1d7e
     << "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name()) 
Packit 1c1d7e
     << "</name>" << endl;
Packit 1c1d7e
  
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+pageName+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
  writeXMLHeader(t);
Packit 1c1d7e
  t << "  
Packit 1c1d7e
  t << "\" kind=\"" << kindName << "\">" << endl;
Packit 1c1d7e
  t << "    <compoundname>" << convertToXML(pd->name()) 
Packit 1c1d7e
    << "</compoundname>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  if (pd==Doxygen::mainPage) // main page is special
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString title;
Packit 1c1d7e
    if (!pd->title().isEmpty() && pd->title().lower()!="notitle")
Packit 1c1d7e
    {
Packit 1c1d7e
      title = filterTitle(convertCharEntitiesToUTF8(Doxygen::mainPage->title()));
Packit 1c1d7e
    }
Packit 1c1d7e
    else 
Packit 1c1d7e
    {
Packit 1c1d7e
      title = Config_getString(PROJECT_NAME);
Packit 1c1d7e
    }
Packit 1c1d7e
    t << "    <title>" << convertToXML(convertCharEntitiesToUTF8(title)) 
Packit 1c1d7e
      << "</title>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    SectionInfo *si = Doxygen::sectionDict->find(pd->name());
Packit 1c1d7e
    if (si)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <title>" << convertToXML(convertCharEntitiesToUTF8(filterTitle(si->title))) 
Packit 1c1d7e
        << "</title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  writeInnerPages(pd->getSubPages(),t);
Packit 1c1d7e
  if(pd->showToc())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <tableofcontents/>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "    <briefdescription>" << endl;
Packit 1c1d7e
  writeXMLDocBlock(t,pd->briefFile(),pd->briefLine(),pd,0,pd->briefDescription());
Packit 1c1d7e
  t << "    </briefdescription>" << endl;
Packit 1c1d7e
  t << "    <detaileddescription>" << endl;
Packit 1c1d7e
  if (isExample)
Packit 1c1d7e
  {
Packit 1c1d7e
    writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
Packit 1c1d7e
        pd->documentation()+"\n\\include "+pd->name());
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
Packit 1c1d7e
        pd->documentation());
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "    </detaileddescription>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << "  </compounddef>" << endl;
Packit 1c1d7e
  t << "</doxygen>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  ti << "  </compound>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void generateXML()
Packit 1c1d7e
{
Packit 1c1d7e
  // + classes
Packit 1c1d7e
  // + namespaces
Packit 1c1d7e
  // + files
Packit 1c1d7e
  // + groups
Packit 1c1d7e
  // + related pages
Packit 1c1d7e
  // - examples
Packit 1c1d7e
  
Packit 1c1d7e
  QCString outputDirectory = Config_getString(XML_OUTPUT);
Packit 1c1d7e
  QDir xmlDir(outputDirectory);
Packit 1c1d7e
  createSubDirs(xmlDir);
Packit 1c1d7e
Packit 1c1d7e
  ResourceMgr::instance().copyResource("index.xsd",outputDirectory);
Packit 1c1d7e
Packit 1c1d7e
  QCString fileName=outputDirectory+"/compound.xsd";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // write compound.xsd, but replace special marker with the entities
Packit 1c1d7e
  QCString compound_xsd = ResourceMgr::instance().getAsString("compound.xsd");
Packit 1c1d7e
  const char *startLine = compound_xsd.data();
Packit 1c1d7e
  while (*startLine)
Packit 1c1d7e
  {
Packit 1c1d7e
    // find end of the line
Packit 1c1d7e
    const char *endLine = startLine+1;
Packit 1c1d7e
    while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
Packit 1c1d7e
    int len=endLine-startLine;
Packit 1c1d7e
    if (len>0)
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString s(len+1);
Packit 1c1d7e
      qstrncpy(s.rawData(),startLine,len);
Packit 1c1d7e
      s[len]='\0';
Packit 1c1d7e
      if (s.find("")!=-1)
Packit 1c1d7e
      {
Packit 1c1d7e
        FTextStream t(&f);
Packit 1c1d7e
        HtmlEntityMapper::instance()->writeXMLSchema(t);
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        f.writeBlock(startLine,len);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    startLine=endLine;
Packit 1c1d7e
  }
Packit 1c1d7e
  f.close();
Packit 1c1d7e
Packit 1c1d7e
  fileName=outputDirectory+"/index.xml";
Packit 1c1d7e
  f.setName(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  // write index header
Packit 1c1d7e
  t << "" << endl;;
Packit 1c1d7e
  t << "
Packit 1c1d7e
  t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
Packit 1c1d7e
  t << "version=\"" << versionString << "\">" << endl;
Packit 1c1d7e
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassSDict::Iterator cli(*Doxygen::classSDict);
Packit 1c1d7e
    ClassDef *cd;
Packit 1c1d7e
    for (cli.toFirst();(cd=cli.current());++cli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateXMLForClass(cd,t);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  //{
Packit 1c1d7e
  //  ClassSDict::Iterator cli(Doxygen::hiddenClasses);
Packit 1c1d7e
  //  ClassDef *cd;
Packit 1c1d7e
  //  for (cli.toFirst();(cd=cli.current());++cli)
Packit 1c1d7e
  //  {
Packit 1c1d7e
  //    msg("Generating XML output for class %s\n",cd->name().data());
Packit 1c1d7e
  //    generateXMLForClass(cd,t);
Packit 1c1d7e
  //  }
Packit 1c1d7e
  //}
Packit 1c1d7e
  NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
Packit 1c1d7e
  NamespaceDef *nd;
Packit 1c1d7e
  for (nli.toFirst();(nd=nli.current());++nli)
Packit 1c1d7e
  {
Packit 1c1d7e
    msg("Generating XML output for namespace %s\n",nd->name().data());
Packit 1c1d7e
    generateXMLForNamespace(nd,t);
Packit 1c1d7e
  }
Packit 1c1d7e
  FileNameListIterator fnli(*Doxygen::inputNameList);
Packit 1c1d7e
  FileName *fn;
Packit 1c1d7e
  for (;(fn=fnli.current());++fnli)
Packit 1c1d7e
  {
Packit 1c1d7e
    FileNameIterator fni(*fn);
Packit 1c1d7e
    FileDef *fd;
Packit 1c1d7e
    for (;(fd=fni.current());++fni)
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generating XML output for file %s\n",fd->name().data());
Packit 1c1d7e
      generateXMLForFile(fd,t);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  GroupSDict::Iterator gli(*Doxygen::groupSDict);
Packit 1c1d7e
  GroupDef *gd;
Packit 1c1d7e
  for (;(gd=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    msg("Generating XML output for group %s\n",gd->name().data());
Packit 1c1d7e
    generateXMLForGroup(gd,t);
Packit 1c1d7e
  }
Packit 1c1d7e
  {
Packit 1c1d7e
    PageSDict::Iterator pdi(*Doxygen::pageSDict);
Packit 1c1d7e
    PageDef *pd=0;
Packit 1c1d7e
    for (pdi.toFirst();(pd=pdi.current());++pdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generating XML output for page %s\n",pd->name().data());
Packit 1c1d7e
      generateXMLForPage(pd,t,FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  {
Packit 1c1d7e
    DirDef *dir;
Packit 1c1d7e
    DirSDict::Iterator sdi(*Doxygen::directories);
Packit 1c1d7e
    for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generate XML output for dir %s\n",dir->name().data());
Packit 1c1d7e
      generateXMLForDir(dir,t);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  {
Packit 1c1d7e
    PageSDict::Iterator pdi(*Doxygen::exampleSDict);
Packit 1c1d7e
    PageDef *pd=0;
Packit 1c1d7e
    for (pdi.toFirst();(pd=pdi.current());++pdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generating XML output for example %s\n",pd->name().data());
Packit 1c1d7e
      generateXMLForPage(pd,t,TRUE);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (Doxygen::mainPage)
Packit 1c1d7e
  {
Packit 1c1d7e
    msg("Generating XML output for the main page\n");
Packit 1c1d7e
    generateXMLForPage(Doxygen::mainPage,t,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //t << "  </compoundlist>" << endl;
Packit 1c1d7e
  t << "</doxygenindex>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  writeCombineScript();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e