#ifndef ARABICA_LOCATOR2_H
#define ARABICA_LOCATOR2_H

// Locator2.h
// $Id$

#include <SAX/ArabicaConfig.h>
#include <SAX/Locator.h>

namespace SAX 
{

/**
 * SAX2 extension to augment the entity information provided though a Locator.
 * <p>
 * If an implementation supports this extension, the Locator provided in 
 * ContentHandler.setDocumentLocator()  will implement this interface, 
 * and the http://xml.org/sax/features/use-locator2 feature flag will have 
 * the value true.
 * <p>
 * @since SAX 2.0
 * @author Jez Higgins, 
 *         <a href="mailto:jez@jezuk.co.uk">jez@jezuk.co.uk</a>
 * @version 2.0
 */
template<class string_type>
class basic_Locator2 : public basic_Locator<string_type>
{
public:
  typedef string_type stringT;

  virtual ~basic_Locator2() { }

  /**
   * Returns the version of XML used for the entity. This will normally 
   * be the identifier from the current entity's <?xml version='...' ...?> 
   * declaration, or be defaulted by the parser.
   * <p>
   * At this writing, only one version ("1.0") is defined, but it seems 
   * likely that a new version will be defined which has slightly different 
   * rules about which characters are legal in XML names.
   * <p>
   * @return Identifier for the XML version being used to interpret the entity's text.
   */
  virtual stringT getXMLVersion() const = 0;

  /**
   * Returns the name of the character encoding for the entity. If the encoding was 
   * declared externally (for example, in a MIME Content-Type header), that will be 
   * the name returned. Else if there was an <?xml ...encoding='...'?> declaration at 
   * the start of the document, that encoding name will be returned. Otherwise the 
   * encoding will been inferred (norally to be UTF-8, or some UTF-16 variant), and
   * that inferred name will be returned.
   * <p>
   * Note that some recent W3C specifications require that text in some encodings 
   * be normalized, using Unicode Normalization Form C, before processing. Such 
   * normalization must be performed by applications, and would normally be triggered
   * based on the value returned by this method.
   * <p>
   * Encoding names may be those used by the underlying implementation, and 
   * comparisons should be case-insensitive.
   * 
   * @return Name of the character encoding being used to interpret the entity's text.
   */
  virtual stringT getEncoding() const = 0;
}; // class basic_Locator2

typedef basic_Locator2<std::string> Locator2;
#ifndef ARABICA_NO_WCHAR_T
typedef basic_Locator2<std::wstring> wLocator2;
#endif 

}; // namespace SAX

#endif
// end of file