43 #include <libxml/parser.h> 
   44 #include <libxml/parserInternals.h> 
   47 class TSAXParserCallback {
 
   49    static void StartDocument(
void *fParser);
 
   50    static void EndDocument(
void *fParser);
 
   51    static void StartElement(
void *fParser, 
const xmlChar *name, 
const xmlChar **p);
 
   52    static void EndElement(
void *fParser, 
const xmlChar *name);
 
   53    static void Characters(
void *fParser, 
const xmlChar *ch, Int_t len);
 
   54    static void Comment(
void *fParser, 
const xmlChar *value);
 
   55    static void CdataBlock(
void *fParser, 
const xmlChar *value, Int_t len);
 
   56    static void Warning(
void *fParser, 
const char *fmt, ...);
 
   57    static void Error(
void *fParser, 
const char *fmt, ...);
 
   58    static void FatalError(
void *fParser, 
const char *fmt, ...);
 
   67 TSAXParser::TSAXParser()
 
   69    fSAXHandler = 
new xmlSAXHandler;
 
   70    memset(fSAXHandler, 0, 
sizeof(xmlSAXHandler));
 
   72    fSAXHandler->startDocument =
 
   73                    (startDocumentSAXFunc)TSAXParserCallback::StartDocument;
 
   74    fSAXHandler->endDocument   =
 
   75                    (endDocumentSAXFunc)TSAXParserCallback::EndDocument;
 
   76    fSAXHandler->startElement  =
 
   77                    (startElementSAXFunc)TSAXParserCallback::StartElement;
 
   78    fSAXHandler->endElement    =
 
   79                    (endElementSAXFunc)TSAXParserCallback::EndElement;
 
   80    fSAXHandler->characters    =
 
   81                    (charactersSAXFunc)TSAXParserCallback::Characters;
 
   82    fSAXHandler->comment       =
 
   83                    (commentSAXFunc)TSAXParserCallback::Comment;
 
   84    fSAXHandler->cdataBlock    =
 
   85                    (cdataBlockSAXFunc)TSAXParserCallback::CdataBlock;
 
   86    fSAXHandler->warning       =
 
   87                    (warningSAXFunc)TSAXParserCallback::Warning;
 
   89                    (errorSAXFunc)TSAXParserCallback::Error;
 
   90    fSAXHandler->fatalError    =
 
   91                    (fatalErrorSAXFunc)TSAXParserCallback::FatalError;
 
   97 TSAXParser::~TSAXParser()
 
  107 void TSAXParser::OnStartDocument()
 
  109    Emit(
"OnStartDocument()");
 
  115 void TSAXParser::OnEndDocument()
 
  117    Emit(
"OnEndDocument()");
 
  126 void TSAXParser::OnStartElement(
const char *name, 
const TList *attributes)
 
  129    args[0] = (Long_t)name;
 
  130    args[1] = (Long_t)attributes;
 
  132    Emit(
"OnStartElement(const char *, const TList *)", args);
 
  138 void TSAXParser::OnEndElement(
const char *name)
 
  140    Emit(
"OnEndElement(const char *)", name);
 
  147 void TSAXParser::OnCharacters(
const char *characters)
 
  149    Emit(
"OnCharacters(const char *)", characters);
 
  155 void TSAXParser::OnComment(
const char *text)
 
  157    Emit(
"OnComment(const char *)", text);
 
  163 void TSAXParser::OnWarning(
const char *text)
 
  165    Emit(
"OnWarning(const char *)", text);
 
  172 Int_t TSAXParser::OnError(
const char *text)
 
  174    Emit(
"OnError(const char *)", text);
 
  182 Int_t TSAXParser::OnFatalError(
const char *text)
 
  184    Emit(
"OnFatalError(const char *)", text);
 
  191 void TSAXParser::OnCdataBlock(
const char *text, Int_t len)
 
  194    args[0] = (Long_t)text;
 
  197    Emit(
"OnCdataBlock(const char *, Int_t)", args);
 
  206 Int_t TSAXParser::Parse()
 
  212    xmlSAXHandlerPtr oldSAX = fContext->sax;
 
  213    fContext->sax = fSAXHandler;
 
  214    fContext->userData = 
this;
 
  218    xmlParseDocument(fContext);
 
  220    fContext->sax = oldSAX;
 
  222    if (!fContext->wellFormed && fParseCode == 0) {
 
  236 Int_t TSAXParser::ParseFile(
const char *filename)
 
  243    fContext = xmlCreateFileParserCtxt(filename);
 
  253 Int_t TSAXParser::ParseBuffer(
const char *contents, Int_t len)
 
  260    fContext = xmlCreateMemoryParserCtxt(contents, len);
 
  270 void TSAXParserCallback::StartDocument(
void *fParser)
 
  272    TSAXParser *parser = (TSAXParser*)fParser;
 
  273    parser->OnStartDocument();
 
  279 void TSAXParserCallback::EndDocument(
void *fParser)
 
  281    TSAXParser *parser = (TSAXParser*)fParser;
 
  282    parser->OnEndDocument();
 
  289 void TSAXParserCallback::StartElement(
void *fParser, 
const xmlChar *name,
 
  292    TSAXParser *parser = (TSAXParser*)fParser;
 
  293    TList *attributes = 
new TList;
 
  296       for (
const xmlChar **cur = p; cur && *cur; cur += 2) {
 
  297          attributes->Add(
new TXMLAttr((
const char*)*cur,
 
  298                                       (
const char*)*(cur + 1)));
 
  302    parser->OnStartElement((
const char*) name, attributes);
 
  304    attributes->Delete();
 
  311 void TSAXParserCallback::EndElement(
void *fParser, 
const xmlChar *name)
 
  313    TSAXParser *parser = (TSAXParser*)fParser;
 
  314    parser->OnEndElement((
const char*) name);
 
  322 void TSAXParserCallback::Characters(
void *fParser, 
const xmlChar *ch,
 
  325    TSAXParser *parser = (TSAXParser*)fParser;
 
  327    char *str = 
new char[len+1];
 
  328    strlcpy(str, (
const char*) ch, len+1);
 
  331    parser->OnCharacters(str);
 
  340 void TSAXParserCallback::Comment(
void *fParser, 
const xmlChar *value)
 
  342    TSAXParser *parser = (TSAXParser*)fParser;
 
  343    parser->OnComment((
const char*) value);
 
  350 void TSAXParserCallback::Warning(
void * fParser, 
const char *va_(fmt), ...)
 
  352    TSAXParser *parser = (TSAXParser*)fParser;
 
  357    va_start(arg, va_(fmt));
 
  358    vsnprintf(buffer, 2048, va_(fmt), arg);
 
  361    TString buff(buffer);
 
  363    parser->OnWarning(buff.Data());
 
  370 void TSAXParserCallback::Error(
void *fParser, 
const char *va_(fmt), ...)
 
  373    TSAXParser *parser = (TSAXParser*)fParser;
 
  378    va_start(arg, va_(fmt));
 
  379    vsnprintf(buffer, 2048, va_(fmt), arg);
 
  382    TString buff(buffer);
 
  384    errorcode = parser->OnError(buff.Data());
 
  386       parser->SetParseCode(errorcode);
 
  389    if (errorcode < 0 && parser->GetStopOnError()) {
 
  391       parser->StopParser();
 
  399 void TSAXParserCallback::FatalError(
void *fParser, 
const char *va_(fmt), ...)
 
  402    TSAXParser *parser = (TSAXParser*)fParser;
 
  407    va_start(arg, va_(fmt));
 
  408    vsnprintf(buffer, 2048, va_(fmt), arg);
 
  411    TString buff(buffer);
 
  413    errorcode = parser->OnFatalError(buff);
 
  415       parser->SetParseCode(errorcode);
 
  416       parser->StopParser();
 
  423 void TSAXParserCallback::CdataBlock(
void *fParser, 
const xmlChar *value,
 
  426    TSAXParser *parser = (TSAXParser*)fParser;
 
  427    parser->OnCdataBlock((
const char*)value, len);
 
  441 void TSAXParser::ConnectToHandler(
const char *handlerName, 
void *handler)
 
  443    const TString kFunctionsName [] = {
 
  446       "OnStartElement(const char *, const TList *)",
 
  447       "OnEndElement(const char *)",
 
  448       "OnCharacters(const char *)",
 
  449       "OnComment(const char *)",
 
  450       "OnWarning(const char *)",
 
  451       "OnError(const char *)",
 
  452       "OnFatalError(const char *)",
 
  453       "OnCdataBlock(const char *, Int_t)" 
  456    TClass *cl = TClass::GetClass(handlerName);
 
  458    for (Int_t i = 0; i < 10; i++) {
 
  459       if (CheckConnectArgs(
this, this->IsA(), kFunctionsName[i],
 
  460                            cl, kFunctionsName[i]) != -1)
 
  461          Connect(kFunctionsName[i], handlerName, handler, kFunctionsName[i]);