#ifndef _XML_Tokenizer_h_
#define _XML_Tokenizer_h_
#include <qxml.h>
#include <qptrlist.h>
#include <qobject.h>
#include "misc/loader_client.h"
#if APPLE_CHANGES
#include "KWQSignal.h"
#endif
class KHTMLView;
namespace khtml {
class CachedObject;
class CachedScript;
};
namespace DOM {
class DocumentImpl;
class NodeImpl;
class HTMLScriptElementImpl;
class DocumentPtr;
class HTMLScriptElementImpl;
};
class XMLHandler : public QXmlDefaultHandler
{
public:
XMLHandler(DOM::DocumentPtr *_doc, KHTMLView *_view);
virtual ~XMLHandler();
QString errorProtocol();
bool startDocument();
bool startElement(const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts);
bool endElement(const QString& namespaceURI, const QString& localName, const QString& qName);
bool startCDATA();
bool endCDATA();
bool characters(const QString& ch);
bool comment(const QString & ch);
bool processingInstruction(const QString &target, const QString &data);
bool attributeDecl(const QString &eName, const QString &aName, const QString &type, const QString &valueDefault, const QString &value);
bool externalEntityDecl(const QString &name, const QString &publicId, const QString &systemId);
bool internalEntityDecl(const QString &name, const QString &value);
bool notationDecl(const QString &name, const QString &publicId, const QString &systemId);
bool unparsedEntityDecl(const QString &name, const QString &publicId, const QString &systemId, const QString ¬ationName);
bool enterText();
void exitText();
QString errorString();
bool fatalError( const QXmlParseException& exception );
unsigned long errorLine;
unsigned long errorCol;
private:
QString errorProt;
DOM::DocumentPtr *m_doc;
KHTMLView *m_view;
DOM::NodeImpl *m_currentNode;
DOM::NodeImpl *m_rootNode;
enum State {
StateInit,
StateDocument,
StateQuote,
StateLine,
StateHeading,
StateP
};
State state;
};
class Tokenizer : public QObject
{
Q_OBJECT
public:
virtual void begin() = 0;
virtual void write( const QString &str, bool appendData) = 0;
virtual void end() = 0;
virtual void finish() = 0;
virtual void setOnHold(bool ) {}
virtual bool isWaitingForScripts() = 0;
signals:
void finishedParsing();
#if APPLE_CHANGES
public:
Tokenizer();
private:
KWQSignal m_finishedParsing;
#endif
};
class XMLTokenizer : public Tokenizer, public khtml::CachedObjectClient
{
public:
XMLTokenizer(DOM::DocumentPtr *, KHTMLView * = 0);
virtual ~XMLTokenizer();
virtual void begin();
virtual void write( const QString &str, bool );
virtual void end();
virtual void finish();
void notifyFinished(khtml::CachedObject *finishedObj);
virtual bool isWaitingForScripts();
protected:
DOM::DocumentPtr *m_doc;
KHTMLView *m_view;
void executeScripts();
void addScripts(DOM::NodeImpl *n);
QString m_xmlCode;
QPtrList<DOM::HTMLScriptElementImpl> m_scripts;
QPtrListIterator<DOM::HTMLScriptElementImpl> *m_scriptsIt;
khtml::CachedScript *m_cachedScript;
};
#endif