Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
87
Src/Wasabi/api/xml/XMLAutoInclude.cpp
Normal file
87
Src/Wasabi/api/xml/XMLAutoInclude.cpp
Normal file
|
@ -0,0 +1,87 @@
|
|||
#include <precomp.h>
|
||||
#include <bfc/wasabi_std.h>
|
||||
#include "XMLAutoInclude.h"
|
||||
#include <bfc/file/wildcharsenum.h>
|
||||
#include <api/util/varmgr.h>
|
||||
|
||||
void LoadXmlFile(obj_xml *parser, const wchar_t *filename);
|
||||
|
||||
XMLAutoInclude::XMLAutoInclude(obj_xml *_parser, const wchar_t *_path)
|
||||
{
|
||||
path=_path;
|
||||
parser = _parser;
|
||||
if (parser)
|
||||
{
|
||||
parser->xmlreader_registerCallback(L"*\finclude", this);
|
||||
}
|
||||
}
|
||||
|
||||
XMLAutoInclude::~XMLAutoInclude()
|
||||
{
|
||||
if (parser)
|
||||
{
|
||||
parser->xmlreader_unregisterCallback(this);
|
||||
}
|
||||
}
|
||||
static const wchar_t *varmgr_translate(const wchar_t *str)
|
||||
{
|
||||
static StringW ret;
|
||||
StringW *s = PublicVarManager::translate_nocontext(str);
|
||||
if (s)
|
||||
{
|
||||
ret.swap(s);
|
||||
delete s;
|
||||
return ret.getValueSafe();
|
||||
}
|
||||
return str;
|
||||
}
|
||||
void XMLAutoInclude::xmlReaderOnStartElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
|
||||
{
|
||||
const wchar_t *includeFile = params->getItemValue(L"file");
|
||||
const wchar_t *trans = /*WASABI_API_WNDMGR->*/varmgr_translate(includeFile);
|
||||
if (trans)
|
||||
{
|
||||
//const char *path = WASABI_API_SKIN->getSkinsPath();
|
||||
if (!Wasabi::Std::isRootPath(trans))
|
||||
includeFn=StringPathCombine(path, trans);
|
||||
else
|
||||
includeFn=trans;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void XMLAutoInclude::Include(const wchar_t *filename)
|
||||
{
|
||||
if (filename && *filename)
|
||||
{
|
||||
parser->xmlreader_interrupt();
|
||||
StringW oldPath = path;
|
||||
|
||||
const wchar_t *file = Wasabi::Std::filename(filename);
|
||||
int fnlen = wcslen(file);
|
||||
path = filename;
|
||||
path.trunc(-fnlen);
|
||||
LoadXmlFile(parser, filename);
|
||||
path = oldPath;
|
||||
parser->xmlreader_resume();
|
||||
}
|
||||
}
|
||||
|
||||
void XMLAutoInclude::xmlReaderOnEndElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag)
|
||||
{
|
||||
if (!includeFn.isempty())
|
||||
{
|
||||
WildcharsEnumerator e(includeFn);
|
||||
if (e.getNumFiles() > 0) // if we're including multiple files
|
||||
{
|
||||
for (int i = 0;i < e.getNumFiles();i++)
|
||||
{
|
||||
Include(e.enumFile(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
Include(includeFn);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue