📄 xmlfilereader.cpp
字号:
/********************************************************************** Audacity: A Digital Audio Editor XMLFileReader.cpp Dominic Mazzoni**********************************************************************/#include <wx/defs.h>#include <wx/ffile.h>#include <wx/intl.h>#include <string.h>#include "../Internat.h"#include "XMLFileReader.h"XMLFileReader::XMLFileReader(){ mParser = XML_ParserCreate(NULL); XML_SetUserData(mParser, (void *)this); XML_SetElementHandler(mParser, startElement, endElement); mBaseHandler = NULL; mMaxDepth = 128; mHandler = new XMLTagHandler*[mMaxDepth]; mDepth = -1; mErrorStr = wxT("");}XMLFileReader::~XMLFileReader(){ delete[] mHandler; XML_ParserFree(mParser);}bool XMLFileReader::Parse(XMLTagHandler *baseHandler, const wxString &fname){ wxFFile theXMLFile(FILENAME(fname).c_str(), wxT("rb")); if (!theXMLFile.IsOpened()) { wxString errStr; mErrorStr.Printf(_("Could not open file: \"%s\""), fname.c_str()); return false; } mBaseHandler = baseHandler; mHandler[0] = NULL; const size_t bufferSize = 16384; char buffer[16384]; int done = 0; do { size_t len = fread(buffer, 1, bufferSize, theXMLFile.fp()); done = (len < bufferSize); if (!XML_Parse(mParser, buffer, len, done)) { mErrorStr.Printf(_("Error: %hs at line %d"), XML_ErrorString(XML_GetErrorCode(mParser)), XML_GetCurrentLineNumber(mParser)); theXMLFile.Close(); return false; } } while (!done); theXMLFile.Close(); // Even though there were no parse errors, we only succeed if // the first-level handler actually got called, and didn't // return false. if (mHandler[0]) return true; else { mErrorStr.Printf(_("Unable to open project file.")); return false; }}wxString XMLFileReader::GetErrorStr(){ return mErrorStr;}// staticvoid XMLFileReader::startElement(void *userData, const char *name, const char **atts){ XMLFileReader *This = (XMLFileReader *)userData; This->mDepth++; if (This->mDepth >= This->mMaxDepth) { XMLTagHandler **newHandler = new XMLTagHandler*[This->mMaxDepth*2]; for(int i=0; i<This->mMaxDepth; i++) newHandler[i] = This->mHandler[i]; This->mMaxDepth *= 2; } if (This->mDepth==0) This->mHandler[This->mDepth] = This->mBaseHandler; else { if (This->mHandler[This->mDepth-1]) This->mHandler[This->mDepth] = This->mHandler[This->mDepth-1]->ReadXMLChild(name); else This->mHandler[This->mDepth] = NULL; } if (This->mHandler[This->mDepth]) { if (!This->mHandler[This->mDepth]->ReadXMLTag(name, atts)) This->mHandler[This->mDepth] = 0; }}// staticvoid XMLFileReader::endElement(void *userData, const char *name){ XMLFileReader *This = (XMLFileReader *)userData; if (This->mHandler[This->mDepth]) This->mHandler[This->mDepth]->ReadXMLEndTag(name); This->mDepth--;}// Indentation settings for Vim and Emacs and unique identifier for Arch, a// version control system. Please do not modify past this point.//// Local Variables:// c-basic-offset: 3// indent-tabs-mode: nil// End://// vim: et sts=3 sw=3// arch-tag: 0a51946d-5a9f-46c9-92d9-ee09698a9bc3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -