/** * @RDE_HEADER@ * Klasse fuer das Importieren von SAAB-Dateien * $Id$ * $HeadURL$ * $Author$ */ #pragma once #include #include "saab_logging.h" #include "saab_types.h" #include "zwmssaab_export.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "saab_xml_strings.h" class QXmlStreamReader; namespace LtsSession { class LtsSession; } class Ui_SAABImport; namespace saab { class ImportSaabShow; class ZWMSSAAB_EXPORT ImportSaab : public NGLDialog, protected ParticipantManagement::Interface::Ftc::ModifyTypeReplyHandler { Q_OBJECT public: ImportSaab(ParticipantManagement::ParticipantEditModel *pModel, const QModelIndex &index, QWidget *parent, LtsSession::LtsSession *pSession); virtual ~ImportSaab(); private slots: void slotOpenImportDialog(); void slotOpenConfigDialog(); void slotStartImport(); private: // methods void onModifyTypeReply(const Core::FunctionReplyObject &replyObject) override { m_requestHelper->requestReply(replyObject); } ParticipantManagement::ParticipantData createParticipant(SaabPlayer *player); void insertParticipant(SaabPlayer *player, const QModelIndex &index); void insertParty(SaabUnit *party); void createNode(const ParticipantManagement::ParticipantData &participant, const QModelIndex &index, SaabPlayer *parent); SaabPerson saabPersonByGUID(const QString &guid) const; SaabVehicle saabVehicleByGUID(const QString &guid) const; void importOrbat(); void importConfig(); QVector flattenedPlayersWithoutRootUnits() const; QVector inferiors(SaabPlayer *player) const; SaabPlayer *readUnit(QXmlStreamReader *reader) const; SaabPlayer *readOcPlayer(QXmlStreamReader *reader) const; SaabPlayer *readPersonPlayer(QXmlStreamReader *reader) const; SaabPlayer *readVehiclePlayer(QXmlStreamReader *reader) const; SaabSymbol readSymbol(QXmlStreamReader *reader) const; SaabEchelon readEchelon(QXmlStreamReader *reader) const; static int playerIndexByGuid(const QString &guid, const QVector &vec); void importExerciseScenario(); QVector resolveImportMapping(const QVector &playerVec); QVector showMappingDialog(const QMap > &mapConflictMap, bool typeClassIsUnit); void buildImportTreeView(const QVector &vecUnitsWithValidDISTypes); bool isValidSaabOrbatFile() const; bool isValidConfigFile() const; bool hasValidType(SaabPlayer *player) const; // import vehicles and persons template void importRefData(QVector &vec, const QString &parentTag, const QString &childTag, const QString &firstDataTag, const QString &secondDataTag) // TODO: better naming { vec.clear(); if (!m_xmlFile) { ERROR_LOG(m_logger) << "Not possible to import " << parentTag << ": No file selected"; return; } if (!m_xmlFile->open(QIODevice::ReadOnly)) { ERROR_LOG(m_logger) << "Not possible to import " << parentTag << ": Could not open file \"" << m_xmlFile->fileName() << "\" for reading."; return; } QXmlStreamReader reader(m_xmlFile); while (!reader.atEnd()) { if (reader.readNextStartElement() && reader.name() == parentTag) { QXmlStreamReader::TokenType currentToken; do { currentToken = reader.readNext(); if (reader.name() == childTag && currentToken == QXmlStreamReader::StartElement) { QString guid = reader.attributes().value(XmlStrings::SAAB_ID()).toString(); do { if (!reader.readNextStartElement()) break; } while (reader.name().toString() != firstDataTag); QString value = reader.readElementText(); do { if (!reader.readNextStartElement()) break; } while (reader.name().toString() != secondDataTag); vec.append({ guid, value, reader.readElementText() }); } } while (currentToken != QXmlStreamReader::EndElement || reader.name() != parentTag); break; } } if (m_logger.isDebugEnabled()) { for (const T ¤t : qAsConst(vec)) DEBUG_LOG(m_logger) << childTag << ": " << current.toString(); } m_xmlFile->close(); } template T *readPlayerBaseData(QXmlStreamReader *reader, const QString &mainTag, const QString &refTag) const { T *result = new T; using namespace XmlStrings; result->guid = reader->attributes().value(SAAB_ID()).toString(); while (!(reader->readNext() == QXmlStreamReader::EndElement && reader->name() == mainTag)) { if (reader->tokenType() != QXmlStreamReader::StartElement) continue; if (reader->name() == SAAB_DESIGNATION()) result->designation = reader->readElementText(); else if (reader->name() == SAAB_FORCE()) result->force = reader->readElementText(); else if (reader->name() == SAAB_SYMBOL()) result->symbol = reader->readElementText(); else if (reader->name() == SAAB_TRASHCAN()) result->trashcan = reader->readElementText() == SAAB_TRUE(); else if (reader->name() == refTag) result->refId = reader->readElementText(); else if (reader->name() == SAAB_CHANGE_INFO()) result->isDeletedByDefault = reader->attributes().value(SAAB_CHANGE_TYPE()).toString() == SAAB_DELETE(); else if (reader->name() == SAAB_SIMULATOR_ID()) result->simulatorId = reader->readElementText().toInt(); else if (reader->name() == SAAB_EXTERNAL_PLAYER()) result->isExternalPlayer = reader->readElementText() == SAAB_TRUE(); } return result; } template T *readPersonOcPlayer(QXmlStreamReader *reader, const QString &mainTag) const { T *result = readPlayerBaseData(reader, mainTag, XmlStrings::SAAB_PERSON_REF_ID()); if (!result->refId.isEmpty()) { SaabPerson person = saabPersonByGUID(result->refId); if (person.guid.isEmpty()) WARNING_LOG(m_logger) << XmlStrings::SAAB_PERSON_REF_ID() << " set, but GUID " << result->refId << " could not be found."; else { result->personalID = person.personalID; result->name = person.name; } } return result; } private: // attributes std::shared_ptr m_ppmDtc; std::shared_ptr m_ppmFtc; QVector m_saabPersons; QVector m_saabVehicles; QVector m_rootUnits; QFile *m_xmlFile; QFile *m_configFile; QMap m_mapSaabSymbolToType; // QMap > m_unknownTypes; // QMap m_mapTypes; // E.g. participant id "47" to type id QMap m_mapSymbols; QMap m_mapEchelons; QMap m_parentIndexCache; // Used to create the treeview with the imported participants QModelIndex m_indexRoot; // Used to append parties/forces to the tree ParticipantManagement::ParticipantEditModel *m_pModel; LtsUtils::RequestHelper *m_requestHelper; Ui_SAABImport *m_pUi; saab::LOGGER_T m_logger; }; }