winamp/Src/Wasabi/api/xml/xmlreader.h

76 lines
2.1 KiB
C++

#ifndef _XMLREADER_H
#define _XMLREADER_H
#include <bfc/ptrlist.h>
#include <bfc/string/bfcstring.h>
#include <bfc/stack.h>
#include <bfc/dispatch.h>
#include <api/xml/xmlparams.h>
#include "../xml/ifc_xmlreadercallbackI.h"
#include <api/xml/XMLAutoInclude.h>
class svc_xmlProvider;
typedef enum {
TYPE_CLASS_CALLBACK = 1,
TYPE_STATIC_CALLBACK,
} xmlreader_callbackType;
class XmlReaderCallbackI
{
public:
XmlReaderCallbackI() : handle(NULL) {}
virtual void xmlReaderOnStartElementCallback(const wchar_t *xmltag, skin_xmlreaderparams *params) { }
virtual void xmlReaderOnEndElementCallback(const wchar_t *xmltag) { }
private:
void *handle;
};
class xmlreader_cb_struct
{
public:
xmlreader_cb_struct(const wchar_t *m, xmlreader_callbackType t, XmlReaderCallbackI *cb) : matchstr(m), type(t), callback(cb)
{
matchstr.toupper();
}
StringW matchstr;
xmlreader_callbackType type;
XmlReaderCallbackI * callback;
};
class XmlReader : public ifc_xmlreadercallbackI
{
public:
// matchstr is a regexp string such as "WinampAbstractionLayer/Layer[a-z]"
// or "Winamp*Layer/*/Layout"
void registerCallback(const wchar_t *matchstr, XmlReaderCallbackI *callback);
void registerCallback(const wchar_t *matchstr, void (*static_callback)(int start, const wchar_t *xmltag, skin_xmlreaderparams *params));
void unregisterCallback(void *callback);
// if only_this_class param is specified, only this class will be called back
// returns 1 on success, 0 on error
int loadFile(const wchar_t *filename, const wchar_t *incpath = NULL, int isinclude = 0);
const wchar_t *getIncludePath();
int getNumCallbacks() { return callback_list.getNumItems(); }
private:
void xmlReaderOnStartElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params);
void xmlReaderOnEndElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag);
void xmlReaderOnError(int linenum, int errcode, const wchar_t *errstr);
// int doLoadFile(FILE *fp, svc_xmlProvider *svc, const wchar_t *filename, const wchar_t *incpath);
PtrList<xmlreader_cb_struct> callback_list;
StringW includePath;
XMLAutoInclude *includer;
};
extern XmlReader skinXML;
#endif