diff --git a/InstructorsAndTrainees/tasks/module.cpp b/InstructorsAndTrainees/tasks/module.cpp index 1883121..7beb7f8 100644 --- a/InstructorsAndTrainees/tasks/module.cpp +++ b/InstructorsAndTrainees/tasks/module.cpp @@ -56,7 +56,7 @@ void Module::setModeList(ModeList modeList) { this->modeList = modeList; - if(modeList.demo || modeList.train || modeList.exam || modeList.autoM) + if(modeList.demo || modeList.train || modeList.exam /*|| modeList.autoM*/) setIsActiveTrue(); } diff --git a/InstructorsAndTrainees/tasks/module.h b/InstructorsAndTrainees/tasks/module.h index 77455e1..0e28ada 100644 --- a/InstructorsAndTrainees/tasks/module.h +++ b/InstructorsAndTrainees/tasks/module.h @@ -31,10 +31,10 @@ public: bool getIsActive(); - void setModeList(ModeList modeList);; - ModeList getModeList(){return modeList;}; + void setModeList(ModeList modeList); + ModeList getModeList(){return modeList;} -protected: +private: void setIsActiveTrue(); protected: diff --git a/ServerLMS/Systems/docsupdater.cpp b/ServerLMS/Systems/docsupdater.cpp index 7e240df..1481f48 100644 --- a/ServerLMS/Systems/docsupdater.cpp +++ b/ServerLMS/Systems/docsupdater.cpp @@ -16,17 +16,28 @@ DocsUpdater::~DocsUpdater() } -void DocsUpdater::lockAccessToDocs() +//PUBLIC +void DocsUpdater::lockAccessToDocsXML() { mtxAccess.lock(); } -void DocsUpdater::unLockAccessToDocs() +void DocsUpdater::unLockAccessToDocsXML() { mtxAccess.unlock(); } -bool DocsUpdater::slot_update() +QList DocsUpdater::getListSubProcForDMcode(QString dmCode) +{ + QMutexLocker locker(&mtxAccess); + + if(!listSubProcMap.contains(dmCode)) + return QList(); + + return listSubProcMap.value(dmCode); +} + +bool DocsUpdater::updateDocsXML() { QMutexLocker locker(&mtxAccess); @@ -43,17 +54,41 @@ bool DocsUpdater::slot_update() deleteAllModulsAMM(); listTasksAMM.clear(); - subProcMap.clear(); + + listSubProcMap.clear(); + DMmodulesMap.clear(); domElementParserAMM(manifestElement, nullptr); if(! Tools::saveDOMtoXML(pathDocsFile, &docTasksDOM)) - return false; + { + deleteAllModulsAMM(); + listTasksAMM.clear(); + + listSubProcMap.clear(); + DMmodulesMap.clear(); + + return false; + } + + for(QList listSP : listSubProcMap) + { + for(SubProc sp : listSP) + { + QString dmCode = sp.dmCode; + DM* module = getDMmoduleByDMcode(dmCode); + if(module) + { + sp.modeList = module->getModeList(); + } + } + } - //emit signal_DocsChanged(); return true; } + +//PRIVATE void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent) { QString name; @@ -69,7 +104,7 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent) do { - name = childElement.nodeName(); + name = childElement.nodeName(); QDomNamedNodeMap nodeMap = childElement.attributes(); @@ -119,6 +154,8 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent) PM* PMmodulParent = static_cast(moduleParent); PMmodulParent->addChildModule(module); } + + DMmodulesMap.insert(DMmodul->dmCode(), DMmodul); } else if(name == "rus" || name == "eng") { @@ -145,20 +182,6 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent) nodeMap.namedItem("bookmark").nodeValue(), nodeMap.namedItem("xml").nodeValue()); - //Активность - //QString canplay = nodeMap.namedItem("canplay").nodeValue(); - - - //Обновление Активности и построение списка подпроцедур 1го уровня - /* - QString dmCode = DMmodulParent->dmCode(); - - QString canplay = defineCanplayByScenXML(dmCode); - - DMmodulParent->setModeList(parseCanplay(canplay)); - nodeMap.namedItem("canplay").setNodeValue(canplay); - */ - QString dmCode = DMmodulParent->dmCode(); QString canplay = ""; QList listSubProc; @@ -167,7 +190,7 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent) DMmodulParent->setModeList(parseCanplay(canplay)); nodeMap.namedItem("canplay").setNodeValue(canplay); - subProcMap.insert(dmCode, listSubProc); + listSubProcMap.insert(dmCode, listSubProc); } else { @@ -262,6 +285,7 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis { listSubProc.clear(); + ModeList modeList; canplay = ""; QString signDemo = "-"; QString signTrain = "-"; @@ -286,7 +310,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis { //canplay if(demoElement.toElement().attribute("canplay") == "True") + { signDemo = "+"; + modeList.demo = true; + } //subProc selectSubProc(demoElement, listSubProc); @@ -297,7 +324,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis { //canplay if(trainElement.toElement().attribute("canplay") == "True") + { signTrain = "+"; + modeList.train = true; + } //subProc selectSubProc(trainElement, listSubProc); @@ -308,7 +338,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis { //canplay if(examElement.toElement().attribute("canplay") == "True") + { signExam = "+"; + modeList.exam = true; + } //subProc selectSubProc(examElement, listSubProc); @@ -319,7 +352,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis { //canplay if(autoElement.toElement().attribute("canplay") == "True") + { signAuto = "+"; + modeList.autoM = true; + } //subProc //Из этого режима не берем! @@ -350,3 +386,11 @@ void DocsUpdater::selectSubProc(QDomElement &modeElement, QList &listSu } } } + +DM *DocsUpdater::getDMmoduleByDMcode(QString dmCode) +{ + if(!DMmodulesMap.contains(dmCode)) + return nullptr; + + return DMmodulesMap.value(dmCode); +} diff --git a/ServerLMS/Systems/docsupdater.h b/ServerLMS/Systems/docsupdater.h index da8a253..724a0aa 100644 --- a/ServerLMS/Systems/docsupdater.h +++ b/ServerLMS/Systems/docsupdater.h @@ -9,6 +9,8 @@ struct SubProc { QString dmCode; QString title; + + ModeList modeList; }; @@ -20,30 +22,33 @@ public: DocsUpdater(UpdateController* updateController, QObject *parent = nullptr); ~DocsUpdater(); public: - void lockAccessToDocs(); - void unLockAccessToDocs(); + void lockAccessToDocsXML(); + void unLockAccessToDocsXML(); -public slots: - bool slot_update(); + QList getListSubProcForDMcode(QString dmCode); + + bool updateDocsXML(); private: void domElementParserAMM(QDomElement element, Module* moduleParent); void deleteAllModulsAMM(); ModeList parseCanplay(QString canplay); - bool processingScenXML(const QString dmCode, QString& canplay, QList& listSubProc); - void selectSubProc(QDomElement& modeElement, QList& listSubProc); - + DM* getDMmoduleByDMcode(QString dmCode); private: UpdateController* updateController; + QMutex mtxAccess; + bool flagStop; QList listAllModulesAMM; //? QList listTasksAMM; //? - QMap> subProcMap; + QMap DMmodulesMap; //общий (линейный) словарь всех DM-модулей + + QMap> listSubProcMap; //словарь подпроцедур для всех DM-модулей }; #endif // DOCSUPDATER_H diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index bf61d1c..be56a68 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -516,10 +516,10 @@ void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, Clie { nameFile = tasksAMMfileName; pathFile = updateController->getPathAdditionalFile(nameFile); - docsUpdater->lockAccessToDocs(); + docsUpdater->lockAccessToDocsXML(); client->sendFileBlock(pathFile); client->sendPacketType(PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM); - docsUpdater->unLockAccessToDocs(); + docsUpdater->unLockAccessToDocsXML(); } } diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index feaa523..a30f91f 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -118,8 +118,10 @@ void ServerLMSWidget::slot_ErrorPostgreSQL(QString text) void ServerLMSWidget::slot_UpdateDocs() { QApplication::setOverrideCursor(Qt::WaitCursor); - emit signal_DocsUpdaterUpdate(); - emit signal_DocsChanged(); + + if(docsUpdater->updateDocsXML()) + emit signal_DocsChanged(); + QApplication::restoreOverrideCursor(); } @@ -302,7 +304,6 @@ void ServerLMSWidget::startInitialization() updateController->moveToThread(updateThread); docsUpdater = new DocsUpdater(updateController, this); - connect(this, &ServerLMSWidget::signal_DocsUpdaterUpdate, docsUpdater, &DocsUpdater::slot_update,Qt::DirectConnection); processingSystem = new ProcessingSystem(providerDBLMS, updateController, docsUpdater); diff --git a/ServerLMS/serverlmswidget.h b/ServerLMS/serverlmswidget.h index a04492b..20e09af 100644 --- a/ServerLMS/serverlmswidget.h +++ b/ServerLMS/serverlmswidget.h @@ -78,8 +78,6 @@ signals: void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager); QTcpSocket* sigGetSocket(); - void signal_DocsUpdaterUpdate(); - void signal_DocsChanged(); public slots: