Blame src/docsets.cpp

Packit Service 50c9f2
/******************************************************************************
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Permission to use, copy, modify, and distribute this software and its
Packit Service 50c9f2
 * documentation under the terms of the GNU General Public License is hereby 
Packit Service 50c9f2
 * granted. No representations are made about the suitability of this software 
Packit Service 50c9f2
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit Service 50c9f2
 * See the GNU General Public License for more details.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Documents produced by Doxygen are derivative works derived from the
Packit Service 50c9f2
 * input used in their production; they are not affected by this license.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 */
Packit Service 50c9f2
Packit Service 50c9f2
#include <qfile.h>
Packit Service 50c9f2
#include "docsets.h"
Packit Service 50c9f2
#include "config.h"
Packit Service 50c9f2
#include "message.h"
Packit Service 50c9f2
#include "doxygen.h"
Packit Service 50c9f2
#include "groupdef.h"
Packit Service 50c9f2
#include "classdef.h"
Packit Service 50c9f2
#include "filedef.h"
Packit Service 50c9f2
#include "memberdef.h"
Packit Service 50c9f2
#include "namespacedef.h"
Packit Service 50c9f2
#include "util.h"
Packit Service 50c9f2
Packit Service 50c9f2
DocSets::DocSets() : m_nodes(17), m_scopes(17)
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_nf = 0;
Packit Service 50c9f2
  m_tf = 0;
Packit Service 50c9f2
  m_dc = 0;
Packit Service 50c9f2
  m_id = 0;
Packit Service 50c9f2
  m_nodes.setAutoDelete(TRUE);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
DocSets::~DocSets()
Packit Service 50c9f2
{
Packit Service 50c9f2
  delete m_nf;
Packit Service 50c9f2
  delete m_tf;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::initialize()
Packit Service 50c9f2
{
Packit Service 50c9f2
  // -- get config options
Packit Service 50c9f2
  QCString projectName = Config_getString(PROJECT_NAME);
Packit Service 50c9f2
  if (projectName.isEmpty()) projectName="root";
Packit Service 50c9f2
  QCString bundleId = Config_getString(DOCSET_BUNDLE_ID);
Packit Service 50c9f2
  if (bundleId.isEmpty()) bundleId="org.doxygen.Project";
Packit Service 50c9f2
  QCString feedName = Config_getString(DOCSET_FEEDNAME);
Packit Service 50c9f2
  if (feedName.isEmpty()) feedName="FeedName";
Packit Service 50c9f2
  QCString publisherId = Config_getString(DOCSET_PUBLISHER_ID);
Packit Service 50c9f2
  if (publisherId.isEmpty()) publisherId="PublisherId";
Packit Service 50c9f2
  QCString publisherName = Config_getString(DOCSET_PUBLISHER_NAME);
Packit Service 50c9f2
  if (publisherName.isEmpty()) publisherName="PublisherName";
Packit Service 50c9f2
  QCString projectNumber = Config_getString(PROJECT_NUMBER);
Packit Service 50c9f2
  if (projectNumber.isEmpty()) projectNumber="ProjectNumber";
Packit Service 50c9f2
Packit Service 50c9f2
  // -- write Makefile
Packit Service 50c9f2
  {
Packit Service 50c9f2
  QCString mfName = Config_getString(HTML_OUTPUT) + "/Makefile";
Packit Service 50c9f2
  QFile makefile(mfName);
Packit Service 50c9f2
  if (!makefile.open(IO_WriteOnly))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("Could not open file %s for writing\n",mfName.data());
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  FTextStream ts(&makefile);
Packit Service 50c9f2
Packit Service 50c9f2
  ts << "DOCSET_NAME=" << bundleId << ".docset\n" 
Packit Service 50c9f2
        "DOCSET_CONTENTS=$(DOCSET_NAME)/Contents\n"
Packit Service 50c9f2
        "DOCSET_RESOURCES=$(DOCSET_CONTENTS)/Resources\n"
Packit Service 50c9f2
        "DOCSET_DOCUMENTS=$(DOCSET_RESOURCES)/Documents\n"
Packit Service 50c9f2
        "DESTDIR=~/Library/Developer/Shared/Documentation/DocSets\n"
Packit Service 50c9f2
        "XCODE_INSTALL=\"$(shell xcode-select -print-path)\"\n"
Packit Service 50c9f2
        "\n"
Packit Service 50c9f2
        "all: docset\n"
Packit Service 50c9f2
        "\n"
Packit Service 50c9f2
        "docset:\n"
Packit Service 50c9f2
        "\tmkdir -p $(DOCSET_DOCUMENTS)\n"
Packit Service 50c9f2
        "\tcp Nodes.xml $(DOCSET_RESOURCES)\n"
Packit Service 50c9f2
        "\tcp Tokens.xml $(DOCSET_RESOURCES)\n"
Packit Service 50c9f2
        "\tcp Info.plist $(DOCSET_CONTENTS)\n"
Packit Service 50c9f2
        "\ttar --exclude $(DOCSET_NAME) \\\n"
Packit Service 50c9f2
        "\t    --exclude Nodes.xml \\\n"
Packit Service 50c9f2
        "\t    --exclude Tokens.xml \\\n"
Packit Service 50c9f2
        "\t    --exclude Info.plist \\\n"
Packit Service 50c9f2
        "\t    --exclude Makefile -c -f - . \\\n"
Packit Service 50c9f2
        "\t    | (cd $(DOCSET_DOCUMENTS); tar xvf -)\n"
Packit Service 50c9f2
        "\t$(XCODE_INSTALL)/usr/bin/docsetutil index $(DOCSET_NAME)\n"
Packit Service 50c9f2
        "\trm -f $(DOCSET_DOCUMENTS)/Nodes.xml\n"
Packit Service 50c9f2
        "\trm -f $(DOCSET_DOCUMENTS)/Info.plist\n"
Packit Service 50c9f2
        "\trm -f $(DOCSET_DOCUMENTS)/Makefile\n"
Packit Service 50c9f2
        "\trm -f $(DOCSET_RESOURCES)/Nodes.xml\n"
Packit Service 50c9f2
        "\trm -f $(DOCSET_RESOURCES)/Tokens.xml\n"
Packit Service 50c9f2
        "\n"
Packit Service 50c9f2
        "clean:\n"
Packit Service 50c9f2
        "\trm -rf $(DOCSET_NAME)\n"
Packit Service 50c9f2
        "\n"
Packit Service 50c9f2
        "install: docset\n"
Packit Service 50c9f2
        "\tmkdir -p $(DESTDIR)\n"
Packit Service 50c9f2
        "\tcp -R $(DOCSET_NAME) $(DESTDIR)\n"
Packit Service 50c9f2
        "\n"
Packit Service 50c9f2
        "uninstall:\n"
Packit Service 50c9f2
        "\trm -rf $(DESTDIR)/$(DOCSET_NAME)\n"
Packit Service 50c9f2
        "\n"
Packit Service 50c9f2
        "always:\n";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // -- write Info.plist
Packit Service 50c9f2
  {
Packit Service 50c9f2
  QCString plName = Config_getString(HTML_OUTPUT) + "/Info.plist";
Packit Service 50c9f2
  QFile plist(plName);
Packit Service 50c9f2
  if (!plist.open(IO_WriteOnly))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("Could not open file %s for writing\n",plName.data());
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  FTextStream ts(&plist);
Packit Service 50c9f2
Packit Service 50c9f2
  ts << "\n" 
Packit Service 50c9f2
        "
Packit Service 50c9f2
        "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" 
Packit Service 50c9f2
        "<plist version=\"1.0\">\n" 
Packit Service 50c9f2
        "<dict>\n" 
Packit Service 50c9f2
        "     <key>CFBundleName</key>\n" 
Packit Service 50c9f2
        "     <string>" << projectName << "</string>\n" 
Packit Service 50c9f2
        "     <key>CFBundleIdentifier</key>\n"
Packit Service 50c9f2
        "     <string>" << bundleId << "</string>\n" 
Packit Service 50c9f2
        "     <key>CFBundleVersion</key>\n"
Packit Service 50c9f2
        "     <string>" << projectNumber << "</string>\n"
Packit Service 50c9f2
        "     <key>DocSetFeedName</key>\n" 
Packit Service 50c9f2
        "     <string>" << feedName << "</string>\n"
Packit Service 50c9f2
        "     <key>DocSetPublisherIdentifier</key>\n"
Packit Service 50c9f2
        "     <string>" << publisherId << "</string>\n"
Packit Service 50c9f2
        "     <key>DocSetPublisherName</key>\n"
Packit Service 50c9f2
        "     <string>" << publisherName << "</string>\n"
Packit Service 50c9f2
        // markers for Dash
Packit Service 50c9f2
        "     <key>DashDocSetFamily</key>\n" 
Packit Service 50c9f2
        "     <string>doxy</string>\n"
Packit Service 50c9f2
        "     <key>DocSetPlatformFamily</key>\n"
Packit Service 50c9f2
        "     <string>doxygen</string>\n"
Packit Service 50c9f2
        "</dict>\n"
Packit Service 50c9f2
        "</plist>\n";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // -- start Nodes.xml
Packit Service 50c9f2
  QCString notes = Config_getString(HTML_OUTPUT) + "/Nodes.xml";
Packit Service 50c9f2
  m_nf = new QFile(notes);
Packit Service 50c9f2
  if (!m_nf->open(IO_WriteOnly))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("Could not open file %s for writing\n",notes.data());
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  //QCString indexName=Config_getBool(GENERATE_TREEVIEW)?"main":"index";
Packit Service 50c9f2
  QCString indexName="index";
Packit Service 50c9f2
  m_nts.setDevice(m_nf);
Packit Service 50c9f2
  m_nts << "" << endl;
Packit Service 50c9f2
  m_nts << "<DocSetNodes version=\"1.0\">" << endl;
Packit Service 50c9f2
  m_nts << "  <TOC>" << endl;
Packit Service 50c9f2
  m_nts << "    <Node>" << endl;
Packit Service 50c9f2
  m_nts << "      <Name>Root</Name>" << endl;
Packit Service 50c9f2
  m_nts << "      <Path>" << indexName << Doxygen::htmlFileExtension << "</Path>" << endl;
Packit Service 50c9f2
  m_nts << "      <Subnodes>" << endl;
Packit Service 50c9f2
  m_dc = 1;
Packit Service 50c9f2
  m_firstNode.resize(m_dc);
Packit Service 50c9f2
  m_firstNode.at(0)=TRUE;
Packit Service 50c9f2
Packit Service 50c9f2
  QCString tokens = Config_getString(HTML_OUTPUT) + "/Tokens.xml";
Packit Service 50c9f2
  m_tf = new QFile(tokens);
Packit Service 50c9f2
  if (!m_tf->open(IO_WriteOnly))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("Could not open file %s for writing\n",tokens.data());
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  m_tts.setDevice(m_tf);
Packit Service 50c9f2
  m_tts << "" << endl;
Packit Service 50c9f2
  m_tts << "<Tokens version=\"1.0\">" << endl;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::finalize()
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!m_firstNode.at(m_dc-1))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_nts << indent() << " </Node>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  m_dc--;
Packit Service 50c9f2
  m_nts << "      </Subnodes>" << endl;
Packit Service 50c9f2
  m_nts << "    </Node>" << endl;
Packit Service 50c9f2
  m_nts << "  </TOC>" << endl;
Packit Service 50c9f2
  m_nts << "</DocSetNodes>" << endl;
Packit Service 50c9f2
  m_nf->close();
Packit Service 50c9f2
  delete m_nf;
Packit Service 50c9f2
  m_nf=0;
Packit Service 50c9f2
Packit Service 50c9f2
  m_tts << "</Tokens>" << endl;
Packit Service 50c9f2
  m_tf->close();
Packit Service 50c9f2
  delete m_tf;
Packit Service 50c9f2
  m_tf=0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString DocSets::indent()
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString result;
Packit Service 50c9f2
  result.fill(' ',(m_dc+2)*2);
Packit Service 50c9f2
  return result;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::incContentsDepth()
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("DocSets::incContentsDepth() m_dc=%d\n",m_dc);
Packit Service 50c9f2
  ++m_dc;
Packit Service 50c9f2
  m_nts << indent() << "<Subnodes>" << endl;
Packit Service 50c9f2
  m_firstNode.resize(m_dc);
Packit Service 50c9f2
  if (m_dc>0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_firstNode.at(m_dc-1)=TRUE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::decContentsDepth()
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!m_firstNode.at(m_dc-1))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_nts << indent() << " </Node>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  m_nts << indent() << "</Subnodes>" << endl;
Packit Service 50c9f2
  --m_dc;
Packit Service 50c9f2
  //printf("DocSets::decContentsDepth() m_dc=%d\n",m_dc);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::addContentsItem(bool isDir,
Packit Service 50c9f2
                              const char *name, 
Packit Service 50c9f2
                              const char *ref, 
Packit Service 50c9f2
                              const char *file,
Packit Service 50c9f2
                              const char *anchor,
Packit Service 50c9f2
                              bool /* separateIndex */,
Packit Service 50c9f2
                              bool /* addToNavIndex */,
Packit Service 50c9f2
                              Definition * /*def*/)
Packit Service 50c9f2
{
Packit Service 50c9f2
  (void)isDir;
Packit Service 50c9f2
  //printf("DocSets::addContentsItem(%s) m_dc=%d\n",name,m_dc);
Packit Service 50c9f2
  if (ref==0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (!m_firstNode.at(m_dc-1))
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_nts << indent() << " </Node>" << endl;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    m_firstNode.at(m_dc-1)=FALSE;
Packit Service 50c9f2
    m_nts << indent() << " <Node>" << endl;
Packit Service 50c9f2
    m_nts << indent() << "  <Name>" << convertToXML(name) << "</Name>" << endl;
Packit Service 50c9f2
    if (file && file[0]=='^') // URL marker
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_nts << indent() << "  <URL>" << convertToXML(&file[1]) 
Packit Service 50c9f2
            << "</URL>" << endl;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else // relative file
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_nts << indent() << "  <Path>";
Packit Service 50c9f2
      if (file && file[0]=='!') // user specified file
Packit Service 50c9f2
      {
Packit Service 50c9f2
        m_nts << convertToXML(&file[1]);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (file) // doxygen generated file
Packit Service 50c9f2
      {
Packit Service 50c9f2
        m_nts << file << Doxygen::htmlFileExtension;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      m_nts << "</Path>" << endl;
Packit Service 50c9f2
      if (file && anchor)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        m_nts << indent() << "  <Anchor>" << anchor << "</Anchor>" << endl;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::addIndexItem(Definition *context,MemberDef *md,
Packit Service 50c9f2
                           const char *,const char *)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (md==0 && context==0) return;
Packit Service 50c9f2
Packit Service 50c9f2
  FileDef *fd      = 0;
Packit Service 50c9f2
  ClassDef *cd     = 0;
Packit Service 50c9f2
  NamespaceDef *nd = 0;
Packit Service 50c9f2
Packit Service 50c9f2
  if (md)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    fd = md->getFileDef();
Packit Service 50c9f2
    cd = md->getClassDef();
Packit Service 50c9f2
    nd = md->getNamespaceDef();
Packit Service 50c9f2
    if (!md->isLinkable()) return; // internal symbol
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  QCString scope;
Packit Service 50c9f2
  QCString type;
Packit Service 50c9f2
  QCString decl;
Packit Service 50c9f2
Packit Service 50c9f2
  // determine language
Packit Service 50c9f2
  QCString lang;
Packit Service 50c9f2
  SrcLangExt langExt = SrcLangExt_Cpp;
Packit Service 50c9f2
  if (md) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    langExt = md->getLanguage();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (context) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    langExt = context->getLanguage();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  switch (langExt)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    case SrcLangExt_Cpp:
Packit Service 50c9f2
    case SrcLangExt_ObjC:
Packit Service 50c9f2
      {
Packit Service 50c9f2
        if (md && (md->isObjCMethod() || md->isObjCProperty()))
Packit Service 50c9f2
          lang="occ";  // Objective C/C++
Packit Service 50c9f2
        else if (fd && fd->name().right(2).lower()==".c") 
Packit Service 50c9f2
          lang="c";    // Plain C
Packit Service 50c9f2
        else if (cd==0 && nd==0)
Packit Service 50c9f2
          lang="c";    // Plain C symbol outside any class or namespace
Packit Service 50c9f2
        else
Packit Service 50c9f2
          lang="cpp";  // C++
Packit Service 50c9f2
      }
Packit Service 50c9f2
      break;
Packit Service 50c9f2
    case SrcLangExt_IDL:     lang="idl"; break;        // IDL
Packit Service 50c9f2
    case SrcLangExt_CSharp:  lang="csharp"; break;     // C#
Packit Service 50c9f2
    case SrcLangExt_PHP:     lang="php"; break;        // PHP4/5
Packit Service 50c9f2
    case SrcLangExt_D:       lang="d"; break;          // D
Packit Service 50c9f2
    case SrcLangExt_Java:    lang="java"; break;       // Java
Packit Service 50c9f2
    case SrcLangExt_JS:      lang="javascript"; break; // Javascript
Packit Service 50c9f2
    case SrcLangExt_Python:  lang="python"; break;     // Python
Packit Service 50c9f2
    case SrcLangExt_Fortran: lang="fortran"; break;    // Fortran
Packit Service 50c9f2
    case SrcLangExt_VHDL:    lang="vhdl"; break;       // VHDL
Packit Service 50c9f2
    case SrcLangExt_XML:     lang="xml"; break;        // DBUS XML
Packit Service 50c9f2
    case SrcLangExt_SQL:     lang="sql"; break;        // Sql
Packit Service 50c9f2
    case SrcLangExt_Tcl:     lang="tcl"; break;        // Tcl
Packit Service 50c9f2
    case SrcLangExt_Markdown:lang="markdown"; break;   // Markdown
Packit Service 50c9f2
    case SrcLangExt_Unknown: lang="unknown"; break;    // should not happen!
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  if (md)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (context==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (md->getGroupDef())
Packit Service 50c9f2
        context = md->getGroupDef();
Packit Service 50c9f2
      else if (md->getFileDef())
Packit Service 50c9f2
        context = md->getFileDef();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (context==0) return; // should not happen
Packit Service 50c9f2
Packit Service 50c9f2
    switch (md->memberType())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      case MemberType_Define:
Packit Service 50c9f2
        type="macro"; break;
Packit Service 50c9f2
      case MemberType_Function:
Packit Service 50c9f2
        if (cd && (cd->compoundType()==ClassDef::Interface ||
Packit Service 50c9f2
              cd->compoundType()==ClassDef::Class))
Packit Service 50c9f2
        {
Packit Service 50c9f2
          if (md->isStatic())
Packit Service 50c9f2
            type="clm";         // class member
Packit Service 50c9f2
          else
Packit Service 50c9f2
            type="instm";       // instance member
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else if (cd && cd->compoundType()==ClassDef::Protocol)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          if (md->isStatic())
Packit Service 50c9f2
            type="intfcm";     // interface class member
Packit Service 50c9f2
          else
Packit Service 50c9f2
            type="intfm";      // interface member
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else
Packit Service 50c9f2
          type="func";
Packit Service 50c9f2
        break;
Packit Service 50c9f2
      case MemberType_Variable:
Packit Service 50c9f2
        type="data"; break;
Packit Service 50c9f2
      case MemberType_Typedef:
Packit Service 50c9f2
        type="tdef"; break;
Packit Service 50c9f2
      case MemberType_Enumeration:
Packit Service 50c9f2
        type="enum"; break;
Packit Service 50c9f2
      case MemberType_EnumValue:
Packit Service 50c9f2
        type="econst"; break;
Packit Service 50c9f2
        //case MemberDef::Prototype:
Packit Service 50c9f2
        //  type="prototype"; break;
Packit Service 50c9f2
      case MemberType_Signal:
Packit Service 50c9f2
        type="signal"; break;
Packit Service 50c9f2
      case MemberType_Slot:
Packit Service 50c9f2
        type="slot"; break;
Packit Service 50c9f2
      case MemberType_Friend:
Packit Service 50c9f2
        type="ffunc"; break;
Packit Service 50c9f2
      case MemberType_DCOP:
Packit Service 50c9f2
        type="dcop"; break;
Packit Service 50c9f2
      case MemberType_Property:
Packit Service 50c9f2
        if (cd && cd->compoundType()==ClassDef::Protocol) 
Packit Service 50c9f2
          type="intfp";         // interface property
Packit Service 50c9f2
        else 
Packit Service 50c9f2
          type="instp";         // instance property
Packit Service 50c9f2
        break;
Packit Service 50c9f2
      case MemberType_Event:
Packit Service 50c9f2
        type="event"; break;
Packit Service 50c9f2
      case MemberType_Interface:
Packit Service 50c9f2
        type="ifc"; break;
Packit Service 50c9f2
      case MemberType_Service:
Packit Service 50c9f2
        type="svc"; break;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    cd = md->getClassDef();
Packit Service 50c9f2
    nd = md->getNamespaceDef();
Packit Service 50c9f2
    if (cd) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      scope = cd->qualifiedName();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (nd)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      scope = nd->name();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    MemberDef *declMd = md->memberDeclaration();
Packit Service 50c9f2
    if (declMd==0) declMd = md;
Packit Service 50c9f2
    {
Packit Service 50c9f2
      fd = md->getFileDef();
Packit Service 50c9f2
      if (fd)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        decl = fd->name();
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    writeToken(m_tts,md,type,lang,scope,md->anchor(),decl);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (context && context->isLinkable())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (fd==0 && context->definitionType()==Definition::TypeFile)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      fd = (FileDef*)context;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (cd==0 && context->definitionType()==Definition::TypeClass)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      cd = (ClassDef*)context;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (nd==0 && context->definitionType()==Definition::TypeNamespace)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      nd = (NamespaceDef*)context;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (fd)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      type="file";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (cd) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      scope = cd->qualifiedName();
Packit Service 50c9f2
      if (cd->isTemplate())
Packit Service 50c9f2
      {
Packit Service 50c9f2
        type="tmplt";
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (cd->compoundType()==ClassDef::Protocol) 
Packit Service 50c9f2
      {
Packit Service 50c9f2
        type="intf";
Packit Service 50c9f2
        if (scope.right(2)=="-p") scope=scope.left(scope.length()-2);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (cd->compoundType()==ClassDef::Interface)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        type="cl";
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (cd->compoundType()==ClassDef::Category)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        type="cat";
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else 
Packit Service 50c9f2
      {
Packit Service 50c9f2
        type = "cl";
Packit Service 50c9f2
      }
Packit Service 50c9f2
      IncludeInfo *ii = cd->includeInfo();
Packit Service 50c9f2
      if (ii)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        decl=ii->includeName;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (nd)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      scope = nd->name();
Packit Service 50c9f2
      type = "ns";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (m_scopes.find(context->getOutputFileBase())==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      writeToken(m_tts,context,type,lang,scope,0,decl);
Packit Service 50c9f2
      m_scopes.append(context->getOutputFileBase(),(void*)0x8);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::writeToken(FTextStream &t,
Packit Service 50c9f2
                         const Definition *d,
Packit Service 50c9f2
                         const QCString &type,
Packit Service 50c9f2
                         const QCString &lang,
Packit Service 50c9f2
                         const char *scope,
Packit Service 50c9f2
                         const char *anchor,
Packit Service 50c9f2
                         const char *decl)
Packit Service 50c9f2
{
Packit Service 50c9f2
  t << "  <Token>" << endl;
Packit Service 50c9f2
  t << "    <TokenIdentifier>" << endl;
Packit Service 50c9f2
  QCString name = d->name();
Packit Service 50c9f2
  if (name.right(2)=="-p")  name=name.left(name.length()-2);
Packit Service 50c9f2
  t << "      <Name>" << convertToXML(name) << "</Name>" << endl;
Packit Service 50c9f2
  if (!lang.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "      <APILanguage>" << lang << "</APILanguage>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (!type.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "      <Type>" << type << "</Type>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (scope)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "      <Scope>" << convertToXML(scope) << "</Scope>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << "    </TokenIdentifier>" << endl;
Packit Service 50c9f2
  t << "    <Path>" << d->getOutputFileBase() 
Packit Service 50c9f2
                    << Doxygen::htmlFileExtension << "</Path>" << endl;
Packit Service 50c9f2
  if (anchor)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "    <Anchor>" << anchor << "</Anchor>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  QCString tooltip = d->briefDescriptionAsTooltip();
Packit Service 50c9f2
  if (!tooltip.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "    <Abstract>" << convertToXML(tooltip) << "</Abstract>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (decl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "    <DeclaredIn>" << convertToXML(decl) << "</DeclaredIn>" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << "  </Token>" << endl;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DocSets::addIndexFile(const char *name)
Packit Service 50c9f2
{
Packit Service 50c9f2
  (void)name;
Packit Service 50c9f2
}
Packit Service 50c9f2