📄 component.cpp
字号:
cerr << "\n[debug-info] : Parameter\n";
container.findChild("Parameter")->drawTree(&cerr);
container.addChild("Debug");
DebugMessage::setStream(&cerr);
DebugMessage::setVerbose(true);
}
//尵岅宯偼僄儔乕儊僢僙乕僕偵塭嬁偡傞偺偱堦斣嵟弶偵張棟偡傞
if(findOption(container,"lj","japanese"))
Message::selectLanguage(Message::JAPANESE);
if(findOption(container,"le","english"))
Message::selectLanguage(Message::ENGLISH);
if(findOption(container,"v","verbose"))
VerboseMessage::setVerbose(true);
if(!findOption(container, "nl","nologo") && VerboseMessage::getVerbose())
cerr << bootBanner() << '\n';
if(findOption(container,"h","help"))
cerr << '\n' << Message(
"Global option\n"
" -lj, --japanese : Use Japanese as display language\n"
" -le, --english : Use English as display language(default)\n"
" -v, --verbose : Display verbose messages\n"
" -ext, --extension : Enable extensions\n"
" -no-ext, --no-extension : Restrict use of extensions (Override -ext)\n"
" -is, --initialsettings = [filename]\n"
" : Load the initial settings form the file specified\n"
" -nis, --no-initialsettings\n"
" : Never load and store the initial seetings\n\n",
"慡懱偺僆僾僔儑儞\n"
" -lj, --japanese : 擔杮岅偱昞帵偟傑偡\n"
" -le, --english : 塸岅偱昞帵偟傑偡\n"
" -v, --verbose : 搑拞宱夁側偳傪昞帵偟傑偡\n"
" -ext, --extension : 奼挘婡擻傪桳岠偵偟傑偡\n"
" -no-ext, --no-extension : 奼挘婡擻傪柍岠偵偟傑偡\n"
" -is, --initialsettings : 弶婜愝掕傪巊梡偟傑偡 [僼傽僀儖柤偑巜掕壜擻]\n");
if(findOption(container,"is","initialsettings"))
loadPersistentContainer(container);
if(findOption(container,"ext","extension"))
enable(EXTENSION);
if(findOption(container,"no-ext","no-extension"))
disable(EXTENSION);
/* 偦偺懠僌儘乕僶儖側僆僾僔儑儞 */
checkOption(container,"D","dump");
checkOption(container,"Dx","dump-xml");
}
/* 奜晹偐傜塱懕揑側抣傪愝掕偡傞 (Hidden option) */
Directory * node;
if( (node = getOption(container,"set","settings"))->getFirstChild() != NULL)
{
node = node->getFirstChild();
while(node != NULL)
{
work = node->toString();
node = node->getNext();
setPersistentString(work, node->toString());
node = node->getNext();
}
}else
{
//僐儞億乕僱儞僩偵傛傞僷儔儊乕僞張棟
scope = componentList().begin();
while(scope != componentList().end())
{
DebugMessage("Component [%] parseOption starts\n") << typeid(*scope->second).name();
scope->second->parseOption(container);
DebugMessage("Component [%] parseOption end\n") << typeid(*scope->second).name();
++ scope;
}
}
/* 偡傋偰偺僆僾僔儑儞偑偪傖傫偲張棟偝傟偨偐偳偆偐傪僠僃僢僋 */
{
work.erase();
parameter = parameter->getFirstChild();
while(parameter != NULL)
{
if(*parameter == Directory::UNKNOWN)
if(parameter->getKey().at(0) != '#') //愭摢偑#偱巒傑傞僆僾僔儑儞偼僠僃僢僋偟側偄
work += string(", -") + parameter->getKey();
parameter = parameter->getNext();
}
/* 張棟偝傟偰偄側偄僆僾僔儑儞偑偁傞 */
if(!work.empty())
{
/* 愭摢偵偮偄偰偄傞", "傪嶍彍偟偰丄僄儔乕昞帵 */
work = work.substr(2);
ExceptionMessage("Unknown option [%] specified","張棟偝傟側偐偭偨僷儔儊乕僞 [%]") << work << throwException;
}
}
}
catch(Exception & e)
{
//onFatalExit屇弌偺懳徾偲側傞僐儞億乕僱儞僩偺傒傪巆偟偰嶍彍
componentList().erase(scope,componentList().end());
ExceptionMessage(ExceptionMessage::FATAL, "%\nFatal error occured during command line parsing.","%\n僐儅儞僪儔僀儞僆僾僔儑儞偺夝愅拞偵抳柦揑側僄儔乕偑尒偮偐傝傑偟偨") << e.getDetails() << throwException;
}
/* 惓忢偵廔椆偟偨偲偒偺塱懕僐儞僥僫傾僢僾僨乕僩張棟 */
if(findOption(container, "is", "initialsettings") && !findOption(container,"np","no-persistents"))
storePersistentContainer(container);
}
//僨僶僢僌梡僐儞僥僫僟儞僾儖乕僠儞
void Component::dumpContainerSnapshot(Directory & container, bool forcedly)
{
string dump;
if(forcedly || findOption(container, "D", "dump", &dump) || findOption(container,"debug","debug"))
{
if(dump.empty())
dump.assign("container.txt");
fstream f(dump.c_str(), ios::out);
if(f.is_open())
{
f << "Last configuration was finished successfully\n\n";
container.drawTree(&f);
f.close();
}
}
if(forcedly || findOption(container, "Dx", "dump-xml", &dump) || findOption(container,"debug","debug"))
{
if(dump.empty())
dump.assign("container.xml");
fstream f("container.xml",ios::out);
if(f.is_open())
{
container.drawTree_byXML(&f);
f.close();
}
}
}
//婲摦梫媮偑弌偰偄傞僐儞億乕僱儞僩偺婲摦
void Component::executeComponents(Directory & container)
{
Component * cmp;
while(!activatedComponentList().empty())
{
cmp = *activatedComponentList().begin();
activatedComponentList().pop_front();
try{
DebugMessage("Component [%] body starts\n") << typeid(*cmp).name();
cmp->body(container);
DebugMessage("Component [%] body finished\n") << typeid(*cmp).name();
}
catch(Exception & e)
{
dumpContainerSnapshot(container);
if(e.getCode() == ExceptionMessage::FATAL)
throw;
cerr << e.getDetails() << Message("(continue...)\n","(懕峴偟傑偡...)\n");
}
}
dumpContainerSnapshot(container);
}
//椺奜敪惗捠抦
void Component::fire_onFatalExit(Directory & container)
{
multimap<int, Component *>::iterator scope;
dumpContainerSnapshot(container);
scope = componentList().begin();
while(scope != componentList().end())
{
try{
DebugMessage("Component [%] onFatalExit starts\n") << typeid(*scope->second).name();
scope->second->onFatalExit(container);
DebugMessage("Component [%] onFatalExit finished\n") << typeid(*scope->second).name();
}
catch(Exception & e)
{
cerr << Message("[Internal error] : A function derived from Component::onFatalExit reports occurence of exception\n","[撪晹僄儔乕] : 僐儞億乕僱儞僩偺onFatalExit儊僜僢僪偑椺奜傪婲偙偟傑偟偨\n");
cerr << " " << e.getDetails() << Message("(continue...)\n","(懕峴偟傑偡...)\n");
}
++ scope;
}
/* 惓忢偵廔椆偟側偐偭偨偲偒偺塱懕僐儞僥僫傾僢僾僨乕僩張棟 */
if(!findOption(container,"nis","no-initialsettings"))
storePersistentContainer(container);
}
void Component::loadPersistentContainer(Directory & container)
{
fstream file;
string filename;
findOption(container,"is","initialsettings",&filename);
if(filename.empty())
filename.assign(FILENAME_PERSISTENTCONTAINER);
file.open(filename.c_str(),ios::in|ios::binary);
if(!file.is_open())
{
file.clear();
/* 僇儗儞僩 or 巜掕偝傟偨応強偐傜奐偗側偐偭偨傜丄exe偲摨偠応強偱帋偡 */
filename = container["/Parameter/#execdir"].toString() + filename;
file.open(filename.c_str(),ios::in|ios::binary);
}
if(file.is_open())
persistentContainer.Load(&file);
persistentContainer["#filename"] = filename;
DebugMessage("Load the persistent variables from \"%\"\n") << filename;
}
void Component::storePersistentContainer(Directory & container)
{
fstream file;
string filename;
filename = persistentContainer["#filename"].toString(FILENAME_PERSISTENTCONTAINER);
if(!filename.empty())
{
file.open(filename.c_str(),ios::out|ios::binary);
if(!file.is_open())
{
file.clear();
/* 僇儗儞僩 or 巜掕偝傟偨応強偐傜奐偗側偐偭偨傜丄exe偲摨偠応強偱帋偡 */
filename = container["/Parameter/#execdir"].toString() + filename;
file.open(filename.c_str(),ios::out|ios::binary);
if(!file.is_open())
ExceptionMessage("Failed to open the initial settings file \"%\".","弶婜愝掕傪僼傽僀儖[%]偵曐懚偱偒傑偣傫") << filename << throwException;
}
DebugMessage("Store the persistent variables from \"%\"\n") << filename;
persistentContainer.Store(&file);
file.close();
}
/* 僨僶僢僌梡僟儞僾張棟 */
if(findOption(container,"D","dump"))
{
fstream txt;
filename.erase(filename.find_last_of('.'));
filename += ".txt";
txt.open(filename.c_str(),ios::out);
persistentContainer.drawTree(&txt);
txt.close();
}
/* 僨僶僢僌梡僟儞僾張棟 (XML) */
if(findOption(container,"Dx","dump-xml"))
{
fstream xml;
filename.erase(filename.find_last_of('.'));
filename += ".xml";
xml.open(filename.c_str(),ios::out);
if(xml.is_open())
persistentContainer.drawTree_byXML(&xml);
xml.close();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -