/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "License"); you may not use this file except in
 * compliance with the License.  You may obtain a copy of the License at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See
 * the License for the specific language governing rights and limitations
 * under the License.
 *
 * The Original Code is Mozilla Communicator client code.
 *
 * The Initial Developer of the Original Code is Netscape Communications
 * Corporation.  Portions created by Netscape are Copyright (C) 1998
 * Netscape Communications Corporation.  All Rights Reserved.
 */
#ifndef nsIXMLContentSink_h___
#define nsIXMLContentSink_h___

#include "nsIContentSink.h"
#include "nsIParserNode.h"
#include "nsISupports.h"

class nsIDocument;
class nsIURL;
class nsIWebShell;

#define NS_IXMLCONTENT_SINK_IID \
 { 0xa6cf90c9, 0x15b3, 0x11d2, \
 { 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } }

/**
 * This interface represents a content sink for generic XML files.
 * The goal of this sink is to deal with XML documents that do not
 * have pre-built semantics, though it may also be implemented for
 * cases in which semantics are hard-wired.
 *
 * The expectation is that the parser has already performed
 * well-formedness and validity checking.
 *
 * XXX The expectation is that entity expansion will be done by the sink
 * itself. This would require, however, that the sink has the ability
 * to query the parser for entity replacement text.
 *
 * XXX This interface does not contain a mechanism for the sink to
 * get specific schema/DTD information from the parser. This information
 * may be necessary for entity expansion. It is also necessary for 
 * building the DOM portions that relate to the schema.
 *
 * XXX This interface does not deal with the presence of an external
 * subset. It seems possible that this could be dealt with completely
 * at the parser level.
 */

class nsIXMLContentSink : public nsIContentSink {
public:
  /**
   * This method is called by the parser when it encounters
   * the XML declaration for a document.
   *
   * @param  nsIParserNode reference to parser node interface
   */
  NS_IMETHOD AddXMLDecl(const nsIParserNode& aNode)=0;

  /**
   * This method is called by the parser when it encounters
   * a document type declaration.
   *
   * XXX Should the parser also part the internal subset?
   *
   * @param  nsIParserNode reference to parser node interface
   */
  NS_IMETHOD AddDocTypeDecl(const nsIParserNode& aNode)=0;

  /**
   * This method is called by the parser when it encounters
   * character data - either regular CDATA or a marked CDATA
   * section.
   *
   * XXX Could be removed in favor of nsIContentSink::AddLeaf
   *
   * @param  nsIParserNode reference to parser node interface
   */
  NS_IMETHOD AddCharacterData(const nsIParserNode& aNode)=0;

  /**
   * This method is called by the parser when it encounters
   * an unparsed entity (i.e. NDATA)
   *
   * @param  nsIParserNode reference to parser node interface
   */
  NS_IMETHOD AddUnparsedEntity(const nsIParserNode& aNode)=0;

  /**
   * This method is called by the parser when it encounters
   * a notation.
   *
   * @param  nsIParserNode reference to parser node interface
   */
  NS_IMETHOD AddNotation(const nsIParserNode& aNode)=0;

  /**
   * This method is called by the parser when it encounters
   * an entity reference. Note that the expectation is that
   * the content sink itself will expand the entity reference
   * in the content model.
   *
   * @param  nsIParserNode reference to parser node interface
   */
  NS_IMETHOD AddEntityReference(const nsIParserNode& aNode)=0;


};

extern nsresult NS_NewXMLContentSink(nsIXMLContentSink** aInstancePtrResult,
                                     nsIDocument* aDoc,
                                     nsIURL* aURL,
                                     nsIWebShell* aWebShell);

#endif // nsIXMLContentSink_h___
