doxmlintf.h 30 KB
Newer Older
1 2 3 4 5
/******************************************************************************
 *
 * $Id$
 *
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
6
 * Copyright (C) 1997-2005 by Dimitri van Heesch.
7 8 9 10 11 12 13 14 15
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
 */

Dimitri van Heesch's avatar
Dimitri van Heesch committed
16 17 18
#ifndef _DOXMLINTF_H
#define _DOXMLINTF_H

19 20 21 22
/*! \file
 *  \brief The interface to the object model provided by the XML parser 
 *         library.
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
23
 *  To start using this library one calls createObjectModel() and then
24 25 26 27 28
 *  uses the returned IDoxygen interface to read doxygen generated
 *  XML output and navigate through the information contained in it.
 *
 *  @see createObjectModel()
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
29 30 31

class IMember;
class IDocIterator;
32 33
class ICompound;
class ISection;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
34
class INode;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
35
class IDocInternal;
36
class IDocRoot;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
37

38 39
/*! \brief Read only interface to a string. 
 */
40 41 42
class IString
{
  public:
43
    /*! Returns a latin1 character representation of the string. */
44
    virtual const char *latin1() const = 0;
45 46 47
    /*! Returns a 16-bit unicode character representation of the character at 
     *  position \a index in the string. The first character is at index 0.
     */
48
    virtual unsigned short unicodeCharAt(int index) const = 0;
49
    /*! Returns true if this string is empty or false otherwise */
50
    virtual bool isEmpty() const = 0;
51
    /*! Returns the number of characters in the string. */
52 53 54
    virtual int length() const = 0;
};

55 56 57 58 59
/*! \brief Base interface for hyperlinked text
 *
 *  Depending on the result of kind() the interface is extended by
 *  ILT_Text or ILT_Ref.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
60 61 62 63 64 65 66
class ILinkedText
{
  public:
    enum Kind { Kind_Text, Kind_Ref };
    virtual Kind kind() const = 0;
};

67 68
/*! \brief Plain text fragment.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
69 70 71
class ILT_Text : public ILinkedText
{
  public:
72
    virtual const IString *text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
73 74
};

75 76
/*! \brief Reference to an object.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
77 78 79
class ILT_Ref : public ILinkedText
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
80
    enum TargetKind { Member, Compound };
81
    virtual const IString *id() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
82
    virtual TargetKind targetKind() const = 0;
83 84
    virtual const IString *external() const = 0;
    virtual const IString *text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
85 86
};

87 88
/*! \brief Iterates over a list of ILinkedText fragments.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
89 90 91 92 93 94 95 96 97 98 99
class ILinkedTextIterator 
{
  public:
    virtual ILinkedText *toFirst() = 0;
    virtual ILinkedText *toLast() = 0;
    virtual ILinkedText *toNext() = 0;
    virtual ILinkedText *toPrev() = 0;
    virtual ILinkedText *current() const = 0;
    virtual void release() = 0;
};

100
/*! \brief Representation of a parameter of a function. */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
101 102 103 104
class IParam 
{
  public:
    virtual ILinkedTextIterator *type() const = 0;
105 106 107 108
    virtual const IString * declarationName() const = 0;
    virtual const IString * definitionName() const = 0;
    virtual const IString * attrib() const = 0;
    virtual const IString * arraySpecifier() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
109
    virtual ILinkedTextIterator *defaultValue() const = 0;
110
    virtual IDocRoot *briefDescription() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
};

class IParamIterator
{
  public:
    virtual IParam *toFirst() = 0;
    virtual IParam *toLast() = 0;
    virtual IParam *toNext() = 0;
    virtual IParam *toPrev() = 0;
    virtual IParam *current() const = 0;
    virtual void release() = 0;
};

class IMemberReference 
{
  public:
    virtual IMember *member() const = 0;
128 129 130 131 132
    virtual const IString * name() const = 0;
    virtual const IString * scope() const = 0;
    virtual const IString * protection() const = 0;
    virtual const IString * virtualness() const = 0;
    virtual const IString * ambiguityScope() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
};

class IMemberReferenceIterator 
{
  public:
    virtual IMemberReference *toFirst() = 0;
    virtual IMemberReference *toLast() = 0;
    virtual IMemberReference *toNext() = 0;
    virtual IMemberReference *toPrev() = 0;
    virtual IMemberReference *current() const = 0;
    virtual void release() = 0;
};

class IDoc
{
  public:
    enum Kind 
    { 
151
      Invalid = 0,        //  0
152 153
      Para,               //  1 -> IDocPara
      Text,               //  2 -> IDocText
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
      MarkupModifier,     //  3 -> IDocMarkupModifier
      ItemizedList,       //  4 -> IDocItemizedList
      OrderedList,        //  5 -> IDocOrderedList
      ListItem,           //  6 -> IDocListItem
      ParameterList,      //  7 -> IDocParameterList
      Parameter,          //  8 -> IDocParameter
      SimpleSect,         //  9 -> IDocSimpleSect
      Title,              // 10 -> IDocTitle
      Ref,                // 11 -> IDocRef
      VariableList,       // 12 -> IDocVariableList
      VariableListEntry,  // 13 -> IDocVariableListEntry
      HRuler,             // 14 -> IDocHRuler
      LineBreak,          // 15 -> IDocLineBreak
      ULink,              // 16 -> IDocULink
      EMail,              // 17 -> IDocEMail
      Link,               // 18 -> IDocLink
      ProgramListing,     // 19 -> IDocProgramListing
      CodeLine,           // 20 -> IDocCodeLine
      Highlight,          // 21 -> IDocHighlight
Dimitri van Heesch's avatar
Dimitri van Heesch committed
173 174 175 176 177 178 179 180
      Formula,            // 22 -> IDocFormula
      Image,              // 23 -> IDocImage
      DotFile,            // 24 -> IDocDotFile
      IndexEntry,         // 25 -> IDocIndexEntry
      Table,              // 26 -> IDocTable
      Row,                // 27 -> IDocRow
      Entry,              // 28 -> IDocEntry
      Section,            // 29 -> IDocSection
181 182 183 184 185 186
      Verbatim,           // 30 -> IDocVerbatim
      Copy,               // 31 -> IDocCopy
      TocList,            // 32 -> IDocTocList
      TocItem,            // 33 -> IDocTocItem
      Anchor,             // 34 -> IDocAnchor
      Symbol,             // 35 -> IDocSymbol
Dimitri van Heesch's avatar
Dimitri van Heesch committed
187
      Internal,           // 36 -> IDocInternal
188 189
      Root,               // 37 -> IDocRoot
      ParameterItem       // 38 -> IDocParameterItem
Dimitri van Heesch's avatar
Dimitri van Heesch committed
190 191 192 193 194 195 196 197 198
    };
    virtual Kind kind() const = 0;
};

class IDocMarkup : public IDoc
{
  public:
    enum Markup 
    { 
199 200 201 202 203 204 205 206 207 208
      Normal         = 0x000,
      Bold           = 0x001,
      Emphasis       = 0x002,
      ComputerOutput = 0x004,
      Subscript      = 0x008,
      Superscript    = 0x010,
      SmallFont      = 0x020,
      Center         = 0x040,
      Preformatted   = 0x080,
      Heading        = 0x100
Dimitri van Heesch's avatar
Dimitri van Heesch committed
209 210 211 212 213 214 215 216 217 218 219 220
    };
};

class IDocPara : public IDoc
{
  public:
    virtual IDocIterator *contents() const = 0; 
};

class IDocText : public IDocMarkup
{
  public:
221
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
222
    virtual int markup() const = 0;
223
    virtual int headingLevel() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
224 225 226 227
};

class IDocMarkupModifier : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
228 229 230
  public:
    virtual bool enabled() const = 0;
    virtual int markup() const = 0;
231
    virtual int headingLevel() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
232 233 234 235 236 237
};

class IDocItemizedList : public IDoc
{
  public:
    virtual IDocIterator *elements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
238 239
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
240
class IDocOrderedList : public IDoc
Dimitri van Heesch's avatar
Dimitri van Heesch committed
241
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
242 243
  public:
    virtual IDocIterator *elements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
244 245 246 247
};

class IDocListItem : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
248 249
  public:
    virtual IDocIterator *contents() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
250 251 252 253
};

class IDocParameterList : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
254 255
  public:
    enum Types { Param, RetVal, Exception };
256
    virtual Types sectType() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
257
    virtual IDocIterator *params() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
258 259
};

260 261 262 263 264 265 266
class IDocParameterItem : public IDoc
{
  public:
    virtual IDocIterator *paramNames() const = 0;
    virtual IDocPara *description() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
267 268
class IDocParameter : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
269
  public:
270
    virtual const IString * name() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
271 272
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
273
class IDocTitle : public IDoc
Dimitri van Heesch's avatar
Dimitri van Heesch committed
274
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
275 276
  public:
    virtual IDocIterator *title() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
277 278
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
279
class IDocSimpleSect : public IDoc
Dimitri van Heesch's avatar
Dimitri van Heesch committed
280 281
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
282 283 284 285 286 287 288 289
    enum Types { Invalid = 0,
                 See, Return, Author, Version, 
                 Since, Date, Bug, Note,
                 Warning, Par, Deprecated, Pre, 
                 Post, Invar, Remark, Attention,
                 Todo, Test, RCS, EnumValues, 
                 Examples
    };
Dimitri van Heesch's avatar
Dimitri van Heesch committed
290
    virtual Types type() const = 0;
291
    virtual const IString * typeString() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
292 293
    virtual IDocTitle *title() const = 0;
    virtual IDocPara *description() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
294 295 296 297
};

class IDocRef : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
298 299
  public:
    enum TargetKind { Member, Compound };
300
    virtual const IString * refId() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
301
    virtual TargetKind targetKind() const = 0;
302 303
    virtual const IString * external() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
304 305 306 307
};

class IDocVariableList : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
308 309
  public:
    virtual IDocIterator *entries() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
310 311 312 313
};

class IDocVariableListEntry : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
314
  public:
315
    virtual ILinkedTextIterator * term() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
316
    virtual IDocPara *description() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
317 318 319 320 321 322 323 324 325 326 327 328
};

class IDocHRuler : public IDoc
{
};

class IDocLineBreak : public IDoc
{
};

class IDocULink : public IDoc
{
329
  public:
330 331
    virtual const IString * url() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
332 333 334 335
};

class IDocEMail : public IDoc
{
336
  public:
337
    virtual const IString * address() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
338 339 340 341
};

class IDocLink : public IDoc
{
342
  public:
343 344
    virtual const IString * refId() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
345 346 347 348
};

class IDocProgramListing : public IDoc
{
349
  public:
350
    virtual IDocIterator *codeLines() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
351 352 353 354
};

class IDocCodeLine : public IDoc
{
355
  public:
356
    virtual int lineNumber() const = 0;
357
    virtual const IString * refId() const = 0;
358
    virtual IDocIterator *codeElements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
359 360 361 362
};

class IDocHighlight : public IDoc
{
363 364 365 366 367 368 369
  public:
    enum HighlightKind 
    { Invalid=0,
      Comment, Keyword, 
      KeywordType, KeywordFlow, CharLiteral, 
      StringLiteral, Preprocessor
    };
370 371
    virtual HighlightKind highlightKind() const = 0;
    virtual IDocIterator *codeElements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
372 373 374 375
};

class IDocFormula : public IDoc
{
376
  public:
377 378
    virtual const IString * id() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
379 380 381 382
};

class IDocImage : public IDoc
{
383
  public:
384 385
    virtual const IString * name() const = 0;
    virtual const IString * caption() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
386 387 388 389
};

class IDocDotFile : public IDoc
{
390
  public:
391 392
    virtual const IString * name() const = 0;
    virtual const IString * caption() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
393 394 395 396
};

class IDocIndexEntry : public IDoc
{
397
  public:
398 399
    virtual const IString * primary() const = 0;
    virtual const IString * secondary() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
400 401 402 403
};

class IDocTable : public IDoc
{
404
  public:
405 406
    virtual IDocIterator *rows() const = 0;
    virtual int numColumns() const = 0;
407
    virtual const IString * caption() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
408 409 410 411
};

class IDocRow : public IDoc
{
412
  public:
413
    virtual IDocIterator *entries() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
414 415 416 417
};

class IDocEntry : public IDoc
{
418
  public:
419
    virtual IDocIterator *contents() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
420 421 422 423 424
};

class IDocSection : public IDoc
{
  public:
425
    virtual const IString * id() const = 0; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
426
    virtual int level() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
427 428 429 430 431 432 433 434 435 436 437
    virtual IDocTitle *title() const = 0;
    virtual IDocIterator *paragraphs() const = 0;
    virtual IDocIterator *subSections() const = 0;
    virtual IDocInternal *internal() const = 0;
};

class IDocInternal : public IDoc
{
  public:
    virtual IDocIterator *paragraphs() const = 0;
    virtual IDocIterator *subSections() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
438 439
};

440 441 442 443 444 445 446 447 448 449 450 451 452 453
class IDocTocList : public IDoc
{
  public:
    virtual IDocIterator *elements() const = 0;
};

class IDocTocItem : public IDoc
{
  public:
    virtual const IString *id() const = 0; 
    virtual const IString *title() const = 0;
};

class IDocCopy : public IDoc
454 455 456 457 458
{
  public:
    virtual IDocIterator *contents() const = 0; 
};

459 460 461
class IDocVerbatim : public IDoc
{
  public:
462
    enum Types { Invalid = 0, HtmlOnly, LatexOnly, Verbatim };
463
    virtual const IString *text() const = 0; 
464 465 466 467 468 469 470
    virtual Types type() const = 0;
};

class IDocAnchor : public IDoc
{
  public:
    virtual const IString *id() const = 0; 
471 472
};

473 474 475 476 477 478 479 480 481 482 483 484
class IDocSymbol : public IDoc
{
  public:
    enum Types 
    { Invalid = 0,
      Umlaut, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Copy
    };
    virtual Types type() const = 0;
    virtual const IString * typeString() const = 0;
    virtual char letter() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
485 486 487 488
class IDocRoot : public IDoc
{
  public:
    virtual IDocIterator *contents() const = 0; 
489
    virtual IDocInternal *internal() const = 0; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
490 491 492 493 494 495 496 497 498 499 500 501 502
};

class IDocIterator 
{
  public:
    virtual IDoc *toFirst() = 0;
    virtual IDoc *toLast() = 0;
    virtual IDoc *toNext() = 0;
    virtual IDoc *toPrev() = 0;
    virtual IDoc *current() const = 0;
    virtual void release() = 0;
};

503 504 505
class IEdgeLabel
{
  public:
506
    virtual const IString * label() const = 0;
507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
};

class IEdgeLabelIterator 
{
  public:
    virtual IEdgeLabel *toFirst() = 0;
    virtual IEdgeLabel *toLast() = 0;
    virtual IEdgeLabel *toNext() = 0;
    virtual IEdgeLabel *toPrev() = 0;
    virtual IEdgeLabel *current() const = 0;
    virtual void release() = 0;
};

class IChildNode
{
  public:
    enum NodeRelation { PublicInheritance, ProtectedInheritance,
524
                        PrivateInheritance, Usage, TemplateInstance
525
                      };
Dimitri van Heesch's avatar
Dimitri van Heesch committed
526
    virtual INode * node() const = 0;
527
    virtual NodeRelation relation() const = 0;
528
    virtual const IString * relationString() const = 0;
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
    virtual IEdgeLabelIterator *edgeLabels() const = 0;
};

class IChildNodeIterator 
{
  public:
    virtual IChildNode *toFirst() = 0;
    virtual IChildNode *toLast() = 0;
    virtual IChildNode *toNext() = 0;
    virtual IChildNode *toPrev() = 0;
    virtual IChildNode *current() const = 0;
    virtual void release() = 0;
};

class INode
{
  public:
546 547 548
    virtual const IString * id() const = 0;
    virtual const IString * label() const = 0;
    virtual const IString * linkId() const = 0;
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
    virtual IChildNodeIterator *children() const = 0;
};

class INodeIterator 
{
  public:
    virtual INode *toFirst() = 0;
    virtual INode *toLast() = 0;
    virtual INode *toNext() = 0;
    virtual INode *toPrev() = 0;
    virtual INode *current() const = 0;
    virtual void release() = 0;
};

class IGraph
{
  public:
    virtual INodeIterator *nodes() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
569 570 571
class IMember 
{
  public:
572 573
    enum MemberKind { Invalid=0,
                      Define, Property, Variable, Typedef, Enum,
574 575
                      Function, Signal, Prototype, Friend, DCOP, Slot, 
                      EnumValue
576 577 578 579
                    };
    virtual ICompound *compound() const = 0;
    virtual ISection *section() const = 0;
    virtual MemberKind kind() const = 0;
580 581 582 583
    virtual const IString * kindString() const = 0;
    virtual const IString * id() const = 0;
    virtual const IString * protection() const = 0;
    virtual const IString * virtualness() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
584
    virtual ILinkedTextIterator *type() const = 0;
585 586
    virtual const IString * typeString() const = 0;
    virtual const IString * name() const = 0;
587 588 589 590
    virtual const IString * readAccessor() const = 0;
    virtual const IString * writeAccessor() const = 0;
    virtual const IString * definition() const = 0;
    virtual const IString * argsstring() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
591 592
    virtual bool isConst() const = 0;
    virtual bool isVolatile() const = 0;
593 594 595 596 597 598
    virtual bool isStatic() const = 0;
    virtual bool isExplicit() const = 0;
    virtual bool isInline() const = 0;
    virtual bool isMutable() const = 0;
    virtual bool isReadable() const = 0;
    virtual bool isWritable() const = 0;
599 600
    virtual IParamIterator *parameters() const = 0;
    virtual IParamIterator *templateParameters() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
601 602 603 604
    virtual ILinkedTextIterator *initializer() const = 0;
    virtual ILinkedTextIterator *exceptions() const = 0;
    virtual IMemberReferenceIterator *references() const = 0; 
    virtual IMemberReferenceIterator *referencedBy() const = 0;
605
    virtual const IString *bodyFile() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
606 607
    virtual int bodyStart() const = 0;
    virtual int bodyEnd() const = 0;
608
    virtual const IString * definitionFile() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
609 610 611 612 613
    virtual int definitionLine() const = 0;
    virtual IMemberReference *reimplements() const = 0;
    virtual IMemberReferenceIterator *reimplementedBy() const = 0;
    virtual IDocRoot *briefDescription() const = 0;
    virtual IDocRoot *detailedDescription() const = 0;
614
    virtual IDocRoot *inbodyDescription() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
615 616
};

617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
class IDefine : public IMember
{
  public:
};

class IProperty : public IMember
{
  public:
};

class IVariable : public IMember
{
  public:
};

class ITypedef : public IMember
{
  public:
};

class IFunction : public IMember
{
  public:
};

class ISignal : public IMember
{
  public:
};

class IPrototype : public IMember
{
  public:
};

class IFriend : public IMember
{
  public:
};

class IDCOP : public IMember
{
  public:
};

class ISlot : public IMember
{
  public:
};

class IEnumValue : public IMember
{
  public:
    virtual const IString * name() const = 0;
};

673 674 675
/*! \brief Include relation
 */
class IInclude 
676 677
{
  public:
678 679 680
    virtual const IString * name() const = 0;
    virtual const IString * refId() const = 0;
    virtual bool isLocal() const = 0;
681 682
};

683 684 685 686 687 688 689 690 691 692
class IIncludeIterator
{
  public:
    virtual IInclude *toFirst() = 0;
    virtual IInclude *toLast() = 0;
    virtual IInclude *toNext() = 0;
    virtual IInclude *toPrev() = 0;
    virtual IInclude *current() const = 0;
    virtual void release() = 0;
};
693

Dimitri van Heesch's avatar
Dimitri van Heesch committed
694 695 696 697 698 699 700 701 702 703 704
class IMemberIterator 
{
  public:
    virtual IMember *toFirst() = 0;
    virtual IMember *toLast() = 0;
    virtual IMember *toNext() = 0;
    virtual IMember *toPrev() = 0;
    virtual IMember *current() const = 0;
    virtual void release() = 0;
};

705 706 707 708 709 710
class IEnum : public IMember
{
  public:
    virtual IMemberIterator *enumValues() const = 0;
};

711 712 713 714 715 716 717 718 719 720
/*! \brief The interface to a section in the object model. 
 *
 *  A compound can have a number of sections, where each
 *  section contains a set of members with the properties implied by
 *  the section kind. The kind() method returns the kind of the section.
 *  The members of the section can be accessed via members(). Apart
 *  from using kind(), some of the individual properties of the section can 
 *  also be inspected via isStatic(), isPublic(), isProtected() and 
 *  isPrivate().
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
721 722 723
class ISection 
{
  public:
724 725 726 727 728 729 730 731 732 733 734
    /*! Possible section types */
    enum SectionKind 
    { Invalid=0,
      UserDefined,         //!< A user defined member group 
      PubTypes,            //!< Public member typedefs
      PubFuncs,            //!< Public member functions
      PubAttribs,          //!< Public member attributes 
      PubSlots,            //!< Public Qt Slots
      Signals,             //!< Qt Signals
      DCOPFuncs,           //!< KDE-DCOP interface functions
      Properties,          //!< IDL properties
735
      Events,              //!< C# events
736 737 738 739 740 741 742 743
      PubStatFuncs,        //!< Public static member functions
      PubStatAttribs,      //!< Public static attributes
      ProTypes,            //!< Protected member typedefs
      ProFuncs,            //!< Protected member functions
      ProAttribs,          //!< Protected member attributes
      ProSlots,            //!< Protected slots
      ProStatFuncs,        //!< Protected static member functions
      ProStatAttribs,      //!< Protected static member attributes
744 745 746 747 748
      PacTypes,            //!< Package member typedefs
      PacFuncs,            //!< Package member functions
      PacAttribs,          //!< Package member attributes
      PacStatFuncs,        //!< Package static member functions
      PacStatAttribs,      //!< Package static member attributes
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765
      PriTypes,            //!< Private member typedefs
      PriFuncs,            //!< Private member functions
      PriAttribs,          //!< Private member attributes
      PriSlots,            //!< Private Qt slots
      PriStatFuncs,        //!< Private static member functions
      PriStatAttribs,      //!< Private static member attributes
      Friend,              //!< Friends
      Related,             //!< Function marked as related
      Defines,             //!< Preprocessor defines
      Prototypes,          //!< Global function prototypes
      Typedefs,            //!< Global typedefs
      Enums,               //!< Enumerations
      Functions,           //!< Global functions
      Variables            //!< Global variables
    };
    
    /*! Returns a string representation of the value returned by kind() */
766
    virtual const IString * kindString() const = 0;
767 768
    
    /*! Returns what kind of section this is */
769
    virtual SectionKind kind() const = 0;
770 771 772 773 774

    /*! Returns the description attached to this section (for user defined
     *  sections, also known as member groups).
     */
    virtual IDocRoot *description() const = 0;
775 776
    
    /*! Returns an iterator for the members of this section */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
777
    virtual IMemberIterator *members() const = 0;
778 779
    
    /*! Returns \c true if this section contains statics */
780
    virtual bool isStatic() const = 0;
781 782 783 784
    
    /*! Returns \c true if this section belongs to a 
     *  public section of a class 
     */
785
    virtual bool isPublic() const = 0;
786 787 788 789
    
    /*! Returns \c true if this section belongs to a 
     *  private section of a class 
     */
790
    virtual bool isPrivate() const = 0;
791 792 793 794
    
    /*! Returns \c true if this section belongs to a 
     *  protected section of a class 
     * */
795
    virtual bool isProtected() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
796 797
};

798 799 800 801 802 803
class IUserDefined : public ISection
{
  public:
    virtual const IString * header() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
804 805 806 807 808 809 810 811 812 813 814
class ISectionIterator 
{
  public:
    virtual ISection *toFirst() = 0;
    virtual ISection *toLast() = 0;
    virtual ISection *toNext() = 0;
    virtual ISection *toPrev() = 0;
    virtual ISection *current() const = 0;
    virtual void release() = 0;
};

815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
/*! \brief The interface to a compound in the object model. 
 *
 *  A compound has a name which can be obtained via the name() method 
 *  and a unique id, which is return via the id() method.
 *  A compound consists zero or more members which are grouped into sections. 
 *  The sections() method can be used to access the individual sections. 
 *  Alternatively, members can be obtained by name or id. There are 
 *  different types of compounds. The kind() method returns what kind of 
 *  compound this is. Depending on the return value one can dynamically 
 *  cast an interface pointer to an more specialised interface that provides 
 *  additional methods.
 *  Example:
 *  \code
 *  ICompound *comp=...;
 *  if (comp->kind()==ICompound::Class)
 *  {
 *    IClass *cls = dynamic_cast<IClass*>(comp);
 *    // use methods of IClass
 *  }
 *  \endcode
 *  The documentation that is provided by a compound is available via
 *  the briefDescription() and detailedDescription() methods.
 *  To avoid excessive memory usage, release() should be called (once) on each 
 *  compound interface pointer that is no longer needed.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
840 841 842
class ICompound 
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
843
    /*! Represents the kind of compounds recognised by doxygen. */
844
    enum CompoundKind { Invalid=0,
845 846
                        Class, Struct, Union, Interface, Protocol, Category,
                        Exception, File, Namespace, Group, Page, Example, Dir
847
                      };
848

Dimitri van Heesch's avatar
Dimitri van Heesch committed
849
    /*! Returns the name of this compound */
850
    virtual const IString * name() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
851 852 853 854

    /*! Returns the id of this compound. The id is a
     *  unique string representing a specific compound object.
     */
855
    virtual const IString * id()   const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
856 857 858 859

    /*! Returns the kind of compound. See #CompoundKind for possible
     *  values.
     */
860
    virtual CompoundKind kind() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
861 862 863 864

    /*! Returns a string representation of the compound kind.
     *  @see kind()
     */
865
    virtual const IString * kindString() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
866 867 868 869

    /*! Returns an iterator for the different member sections in this
     *  compound.
     */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
870
    virtual ISectionIterator *sections() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
871 872 873 874

    /*! Returns a tree-structured representation of the brief
     *  description that is attached to this compound.
     */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
875
    virtual IDocRoot *briefDescription() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
876 877 878 879

    /*! Returns a tree-structured representation of the detailed
     *  description that is attached to this compound.
     */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
880
    virtual IDocRoot *detailedDescription() const = 0;
881 882 883 884

    /*! Returns an interface to a member given its id. 
     *  @param id The member id.
     */
885
    virtual IMember *memberById(const char * id) const = 0;
886 887

    /*! Returns a list of all members within the compound having a certain 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
888 889
     *  name. Member overloading is the reason why there can be more than 
     *  one member. 
890 891
     *  @param name The name of the member.
     */
892
    virtual IMemberIterator *memberByName(const char * name) const = 0;
893 894 895 896 897

    /*! Decreases the reference counter for this compound. If it reaches
     *  zero, the memory for the compound will be released.
     */
    virtual void release() = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918
};

class ICompoundIterator 
{
  public:
    virtual void toFirst() = 0;
    virtual void toLast() = 0;
    virtual void toNext() = 0;
    virtual void toPrev() = 0;
    virtual ICompound *current() const = 0;
    virtual void release() = 0;
};

class IRelatedCompound
{
  public:
    enum Protection { Public, Protected, Private };
    enum Kind { Normal, Virtual };
    virtual ICompound *compound() const = 0;
    virtual Protection protection() const = 0;
    virtual Kind kind() const = 0;
919
    virtual const IString *name() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
920 921 922 923 924 925 926 927 928 929 930 931 932 933

};

class IRelatedCompoundIterator 
{
  public:
    virtual IRelatedCompound *toFirst() = 0;
    virtual IRelatedCompound *toLast() = 0;
    virtual IRelatedCompound *toNext() = 0;
    virtual IRelatedCompound *toPrev() = 0;
    virtual IRelatedCompound *current() const = 0;
    virtual void release() = 0;
};

934 935
/*! \brief The interface to a class in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
936 937 938 939 940
class IClass : public ICompound
{
  public:
    virtual IGraph *inheritanceGraph() const = 0;
    virtual IGraph *collaborationGraph() const = 0;
941 942 943
    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
    virtual ICompoundIterator *nestedCompounds() const = 0;
944 945 946
    virtual IParamIterator *templateParameters() const = 0;
    virtual const IString *locationFile() const = 0;
    virtual int locationLine() const = 0;
947
    virtual const IString *locationBodyFile() const = 0;
948 949
    virtual int locationBodyStartLine() const = 0;
    virtual int locationBodyEndLine() const = 0;
950 951 952 953

    // TODO:
    // class:
    //  listOfAllMembers()
954 955
    //  protection()
    //  isAbstract()
Dimitri van Heesch's avatar
Dimitri van Heesch committed
956 957
};

958 959
/*! \brief The interface to a struct in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
960 961
class IStruct : public ICompound
{
962 963 964 965
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
966 967 968 969
    virtual const IString *locationFile() const = 0;
    virtual int locationLine() const = 0;
    virtual int locationBodyStartLine() const = 0;
    virtual int locationBodyEndLine() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
970 971
};

972 973
/*! \brief The interface to a union in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
974 975
class IUnion : public ICompound
{
976 977
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
978 979
};

980 981
/*! \brief The interface to a Java/IDL interface in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
982 983
class IInterface : public ICompound
{
984 985 986
  public:
    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
987 988
};

989

990 991
/*! \brief The interface to a Java/IDL exception in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
992 993 994 995
class IException : public ICompound
{
};

996 997
/*! \brief The interface to a namespace in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
998 999
class INamespace : public ICompound
{
1000 1001
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1002 1003
};

1004 1005
/*! \brief The interface to a file in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1006 1007
class IFile : public ICompound
{
1008 1009 1010
  public:
    virtual IGraph *includeDependencyGraph() const = 0;
    virtual IGraph *includedByDependencyGraph() const = 0;
1011
    virtual IDocProgramListing *source() const = 0;
1012
    virtual ICompoundIterator *nestedCompounds() const = 0;
1013

1014 1015 1016
    virtual IIncludeIterator *includes() const = 0;
    virtual IIncludeIterator *includedBy() const = 0;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1017 1018 1019 1020
    //  ICompound *innerNamespaces()
    //  ICompoundIterator *innerClasses()
};

1021 1022
/*! \brief The interface to a group in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1023 1024
class IGroup : public ICompound
{
1025 1026
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
1027 1028 1029 1030
    // group:
    //  Title()
    //  innerFile()
    //  innerPage()
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1031 1032
};

1033 1034
/*! \brief The interface to a page in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1035
class IPage : public ICompound
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1036
{
1037 1038
  public:
    virtual const IDocTitle *title() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1039 1040 1041 1042 1043 1044
};

/*! Root node of the object model. */
class IDoxygen 
{
  public:
1045

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1046 1047 1048 1049 1050 1051 1052 1053 1054
    /*! Returns an iterator that can be used to iterate over the list
     *  of compounds found in the project.
     */
    virtual ICompoundIterator *compounds() const = 0;

    /*! Returns a compound given its unique \a id. If you have a
     *  compound id this function is much more efficient than iterating
     *  over the compound list. Returns 0 if the id is not valid.
     */
1055
    virtual ICompound *compoundById(const char * id) const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1056 1057 1058 1059

    /*! Returns a compound given its name (including the scope). 
     *  Returns 0 if the name is not found in the project.
     */
1060
    virtual ICompound *compoundByName(const char * name) const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1061

1062 1063 1064
    /*! Returns an interface to a compound containing a member given it the
     *  member's id. Given the ICompound interface one can use the same id
     *  to obtain the IMember interface.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1065 1066
     *  @param id The member id.
     */
1067
    virtual ICompound *memberById(const char * id) const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1068

1069 1070 1071
    /*! Returns a list of all compounds containing at least one members 
     *  with a certain name. Each compound can be asked to return the
     *  list of members with that name.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1072 1073
     *  @param name The name of the member.
     */
1074
    virtual ICompoundIterator *memberByName(const char * name) const = 0;
1075

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1076 1077 1078 1079 1080
    /*! Releases the memory for the object hierarchy obtained by 
     *  createdObjecModelFromXML(). First release all iterators before calling
     *  this function.
     */
    virtual void release() = 0;
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092

    /*! Sets the debug level.
     *  - 0 all debugging messages are disabled (the default).
     *  - 1 display important messages only
     *  - 2 display any messages.
     */
    virtual void setDebugLevel(int level) = 0;

    /*! Reads an XML directory produced by doxygen and builds up a data 
     *  structure representing the contents of the XML files in the directory. 
     */
    virtual bool readXMLDir(const char *xmlDirName) = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1093 1094
};

1095 1096 1097
/*! Factory method that creates an empty object model for a doxygen generated XML file.
 *  Use the readXMLDir() method to build the model from an XML output 
 *  directory containing doxygen output.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1098
 */
1099
IDoxygen *createObjectModel();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1100 1101

#endif