QStringList MainWindow::checkLayout(QDomDocument doc) { QStringList errors; QDomElement layout = doc.namedItem("layout").toElement(); bool intHandler; if (layout.isNull()) { errors << "Layout element does not exist"; return errors; } else { if (!layout.hasAttribute("width")) errors << "Layout has no width value"; if (!layout.hasAttribute("height")) errors << "Layout has no height value"; if (layout.hasAttribute("width") && (layout.attribute("width").toInt(&intHandler,10) < 0 || intHandler == false)) errors << "Layout width is not a positive integer"; if (layout.hasAttribute("width") && (layout.attribute("height").toInt(&intHandler,10) < 0 || intHandler == false)) errors << "Layout height is not a positive integer"; QStringList layouterrors ; if(layout.attribute("tabbed") == "1"){ layouterrors << checkTabLayout(layout); } else { layouterrors << checkElements(layout); } errors.append(layouterrors); } return errors; }
QStringList MainWindow::checkTabLayout(QDomElement element) { QDomNode child = element.firstChild(); QStringList errors; while (!child.isNull()) { QString tagName = child.toElement().tagName(); if(tagName == "tab") { if (!child.toElement().hasAttribute("name")) errors << "Tab has no name"; errors << checkElements(child.toElement()); } else if (tagName == "cli" || tagName == "toolBar") { //ignore these } else { errors << "Invalid item " + tagName + " in tabSet"; } child = child.nextSibling(); } return errors; }
// element들을 순서대로 check해야 된다. 앞에꺼가 완결되어야 뒤에꺼를 체크한다. GQuestElement::ResultType GQuestStatus::checkElementsSEQ(GQuestInfo::ElementType type) { GQuestMission* pCurrentMission = m_MissionMap[m_ElementAdvance[type]]; if (pCurrentMission != NULL) { GQuestElement::ResultType result = (*m_ElementAdvance[type])->checkMission(pCurrentMission); if (result == GQuestElement::FAIL ) pCurrentMission->m_Status = MissionInfo::FAIL; if (result != GQuestElement::OK ) return result; pCurrentMission->m_Status = MissionInfo::SUCCESS; (*m_ElementAdvance[type])->whenMissionEnd(m_pOwner, pCurrentMission); ++m_ElementAdvance[type]; } for (; m_ElementAdvance[type] != m_pGQuestInfo->getElements(type).end(); ++m_ElementAdvance[type]) { GQuestElement::ResultType result = (*(m_ElementAdvance[type]))->checkCondition(m_pOwner); if (result == GQuestElement::WAIT) { GQuestMission* pNewMission = (*(m_ElementAdvance[type]))->makeInitMission(m_pOwner); if (pNewMission == NULL ) return GQuestElement::FAIL; pNewMission->m_Condition = type; pNewMission->m_Index = (*(m_ElementAdvance[type]))->getIndex(); pNewMission->m_Status = MissionInfo::CURRENT; pNewMission->m_Position = m_ElementAdvance[type]; pNewMission->m_pParent = this; m_Missions.push_back(pNewMission); m_MissionMap[m_ElementAdvance[type]] = pNewMission; (*(m_ElementAdvance[type]))->whenMissionStart(m_pOwner, pNewMission); // recursive call return checkElements(type); } else if (result == GQuestElement::FAIL ) return result; } return GQuestElement::OK; }
BYTE GQuestStatus::checkMissions() { BYTE ret = GCGQuestStatusModify::NO_MODIFY; if (m_Status == DOING) { GQuestElement::ResultType resultComplete = checkElements(GQuestInfo::COMPLETE); switch (resultComplete) { case GQuestElement::OK: { m_Status = SUCCESS; ret = GCGQuestStatusModify::SUCCESS; cleanUpMissions(); break; } case GQuestElement::FAIL: { m_Status = FAIL; save(); ret = GCGQuestStatusModify::FAIL; cleanUpMissions(); break; } case GQuestElement::WAIT: default: break; } GQuestElement::ResultType resultFail = checkElements(GQuestInfo::FAIL); switch (resultFail ) { case GQuestElement::OK: { m_Status = FAIL; save(); ret = GCGQuestStatusModify::FAIL; cleanUpMissions(); break; } case GQuestElement::FAIL: case GQuestElement::WAIT: default: break; } } if (m_Status == SUCCESS ) { GQuestElement::ResultType resultReward = checkElements(GQuestInfo::REWARD); switch (resultReward ) { case GQuestElement::OK: { m_Status = COMPLETE; save(); m_pOwner->getGQuestManager()->refreshQuest(); if (m_QuestID == 1001 ) { EffectEventQuestReset* pEffect = new EffectEventQuestReset(m_pOwner, 1); int lastSec = 0; pEffect->setDeadline((EVENT_QUEST_TIME_LIMIT-lastSec)*10); pEffect->setNextTime(((EVENT_QUEST_TIME_LIMIT-lastSec)%BROADCASTING_DELAY) * 10); m_pOwner->addEffect(pEffect); } break; } case GQuestElement::FAIL: { m_Status = FAIL; save(); break; } case GQuestElement::WAIT: default: break; } } if (m_Status == FAIL ) { m_Status = CAN_REPLAY; save(); } return ret; }
static void testBitSet( int times, int nofElements) { std::cerr << "execute testBitSet<" << NN << ">( " << times << ", " << nofElements << ")" << std::endl; if (nofElements >= NN) throw std::runtime_error("potential endless loop in test"); for (int ti=0; ti<times; ++ti) { #ifdef STRUS_LOWLEVEL_DEBUG std::cerr << "start [" << ti << "]" << std::endl; #endif strus::bitset<NN> testset; std::set<int> eset; for (int ei=0; ei<nofElements; ++ei) { int elem = g_random.get( 0, NN); switch (g_random.get( 0, 5)) { case 0: #ifdef STRUS_LOWLEVEL_DEBUG std::cerr << "op insert " << elem << std::endl; #endif set_insert( eset, elem, NN); if (!testset.insert( elem, true)) throw std::runtime_error("insert failed in bitset"); break; case 1: #ifdef STRUS_LOWLEVEL_DEBUG std::cerr << "op remove " << elem << std::endl; #endif set_remove( eset, elem); if (!testset.remove( elem)) throw std::runtime_error("remove failed in bitset"); break; default: #ifdef STRUS_LOWLEVEL_DEBUG std::cerr << "op set " << elem << std::endl; #endif eset.insert( elem); testset.set( elem, true); break; } checkElements( testset, eset); } std::set<int>::const_iterator si = eset.begin(), se = eset.end(); for (; si != se; ++si) { if (!testset.test( *si)) { std::cerr << "element " << *si << " inserted not found in fixed size test bitset" << std::endl; if (++g_nof_errors >= g_max_nof_errors) throw std::runtime_error( "fixed size bitset test failed"); } } for (int ei=0; ei<nofElements; ++ei) { int elem = g_random.get( 0, NN); if (eset.find( elem) != eset.end()) { --ei; continue; } if (testset.test( elem)) { std::cerr << "element " << elem << " not inserted but found in fixed size test bitset" << std::endl; if (++g_nof_errors >= g_max_nof_errors) throw std::runtime_error( "fixed size bitset test failed"); } } checkElements( testset, eset); } }