void Page::parse() { m_source = m_reply->readAll(); // Check redirection QUrl redir = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!redir.isEmpty()) { m_url = m_site->fixUrl(redir.toString(), m_url); load(); return; } // Reading reply and resetting vars qDeleteAll(m_images); m_images.clear(); m_tags.clear(); /*m_imagesCount = -1; m_pagesCount = -1;*/ if (m_source.isEmpty()) { if (m_reply->error() != QNetworkReply::OperationCanceledError) { log("Loading error: "+m_reply->errorString()); fallback(); } return; } int first = m_smart ? ((m_page - 1) * m_imagesPerPage) % m_blim : 0; // XML if (m_format == "xml") { // Initializations QDomDocument doc; QString errorMsg; int errorLine, errorColumn; if (!doc.setContent(m_source, false, &errorMsg, &errorLine, &errorColumn)) { log(tr("Erreur lors de l'analyse du fichier XML : %1 (%2 - %3).").arg(errorMsg, QString::number(errorLine), QString::number(errorColumn))); fallback(); return; } QDomElement docElem = doc.documentElement(); // Getting last page int count = docElem.attributes().namedItem("count").nodeValue().toFloat(); QString database = docElem.attributes().namedItem("type").nodeValue(); if (count == 0 && database == "array") { count = docElem.elementsByTagName("total-count").at(0).toElement().text().toInt(); } if (count > 0) { m_imagesCount = count; } // Reading posts QDomNodeList nodeList = docElem.elementsByTagName("post"); if (nodeList.count() > 0) { for (int id = 0; id < nodeList.count(); id++) { QMap<QString,QString> d; if (database == "array") { QStringList infos, assoc; infos << "created_at" << "status" << "source" << "has_comments" << "file_url" << "sample_url" << "change" << "sample_width" << "has_children" << "preview_url" << "width" << "md5" << "preview_width" << "sample_height" << "parent_id" << "height" << "has_notes" << "creator_id" << "file_size" << "id" << "preview_height" << "rating" << "tags" << "author" << "score" << "tags_artist" << "tags_character" << "tags_copyright" << "tags_general" << "ext"; assoc << "created-at" << "status" << "source" << "has_comments" << "file-url" << "large-file-url" << "change" << "sample_width" << "has-children" << "preview-file-url" << "image-width" << "md5" << "preview_width" << "sample_height" << "parent-id" << "image-height" << "has_notes" << "uploader-id" << "file_size" << "id" << "preview_height" << "rating" << "tag-string" << "uploader-name" << "score" << "tag-string-artist" << "tag-string-character" << "tag-string-copyright" << "tag-string-general" << "file-ext"; for (int i = 0; i < infos.count(); i++) { d[infos.at(i)] = nodeList.at(id + first).namedItem(assoc.at(i)).toElement().text(); } } else { QStringList infos; infos << "created_at" << "status" << "source" << "has_comments" << "file_url" << "sample_url" << "change" << "sample_width" << "has_children" << "preview_url" << "width" << "md5" << "preview_width" << "sample_height" << "parent_id" << "height" << "has_notes" << "creator_id" << "file_size" << "id" << "preview_height" << "rating" << "tags" << "author" << "score"; for (int i = 0; i < infos.count(); i++) { d[infos.at(i)] = nodeList.at(id + first).attributes().namedItem(infos.at(i)).nodeValue().trimmed(); } } this->parseImage(d, id + first); } } } // RSS else if (m_format == "rss") { // Initializations QDomDocument doc; QString errorMsg; int errorLine, errorColumn; if (!doc.setContent(m_source, false, &errorMsg, &errorLine, &errorColumn)) { log(tr("Erreur lors de l'analyse du fichier RSS : %1 (%2 - %3).").arg(errorMsg, QString::number(errorLine), QString::number(errorColumn))); fallback(); return; } QDomElement docElem = doc.documentElement(); // Reading posts QDomNodeList nodeList = docElem.elementsByTagName("item"); if (nodeList.count() > 0) { for (int id = 0; id < nodeList.count(); id++) { QDomNodeList children = nodeList.at(id + first).childNodes(); QMap<QString,QString> d, dat; for (int i = 0; i < children.size(); i++) { QString content = children.at(i).childNodes().at(0).nodeValue(); if (!content.isEmpty()) { dat.insert(children.at(i).nodeName(), content.trimmed()); } else { dat.insert(children.at(i).nodeName(), children.at(i).attributes().namedItem("url").nodeValue().trimmed()); } } // QDateTime::fromString(date, "ddd, dd MMM yyyy hh:mm:ss +0000"); // shimmie date format d.insert("page_url", dat["link"]); d.insert("tags", dat["media:keywords"]); d.insert("preview_url", dat["media:thumbnail"]); d.insert("sample_url", dat["media:content"]); d.insert("file_url", dat["media:content"]); if (!d.contains("id")) { QRegExp rx("/(\\d+)"); rx.indexIn(d["page_url"]); d.insert("id", rx.cap(1)); } this->parseImage(d, id + first); } } } // Regexes else if (m_format == "regex") { // Getting tags if (m_site->contains("Regex/Tags")) { QRegExp rxtags(m_site->value("Regex/Tags")); rxtags.setMinimal(true); QStringList tags = QStringList(); int p = 0; while (((p = rxtags.indexIn(m_source, p)) != -1)) { if (!tags.contains(rxtags.cap(2))) { m_tags.append(Tag(rxtags.cap(2), rxtags.cap(1), rxtags.cap(3).toInt())); tags.append(rxtags.cap(2)); } p += rxtags.matchedLength(); } } // Getting images QRegExp rx(m_site->value("Regex/Image")); QStringList order = m_site->value("Regex/Order").split('|'); rx.setMinimal(true); int pos = 0, id = 0; while ((pos = rx.indexIn(m_source, pos)) != -1) { pos += rx.matchedLength(); QMap<QString,QString> d; for (int i = 0; i < order.size(); i++) { d[order.at(i)] = rx.cap(i+1); } // JSON elements if (order.contains("json") && !d["json"].isEmpty()) { QVariant src = Json::parse(d["json"]); if (!src.isNull()) { QMap<QString,QVariant> map = src.toMap(); for (int i = 0; i < map.size(); i++) { d[map.keys().at(i)] = map.values().at(i).toString(); } } } this->parseImage(d, id + first); id++; } } // JSON else if (m_format == "json") { QVariant src = Json::parse(m_source); if (!src.isNull()) { QMap<QString, QVariant> sc; QList<QVariant> sourc = src.toList(); if (sourc.isEmpty()) { sourc = src.toMap().value("images").toList(); } for (int id = 0; id < sourc.count(); id++) { sc = sourc.at(id + first).toMap(); QMap<QString,QString> d; if (sc.contains("tag_string")) { QStringList infos, assoc; infos << "created_at" << "status" << "source" << "has_comments" << "file_url" << "sample_url" << "change" << "sample_width" << "has_children" << "preview_url" << "width" << "md5" << "preview_width" << "sample_height" << "parent_id" << "height" << "has_notes" << "creator_id" << "file_size" << "id" << "preview_height" << "rating" << "tags" << "author" << "score" << "tags_artist" << "tags_character" << "tags_copyright" << "tags_general"; assoc << "created_at" << "status" << "source" << "has_comments" << "file_url" << "large_file_url" << "change" << "sample_width" << "has_children" << "preview_file_url" << "image_width" << "md5" << "preview_width" << "sample_height" << "parent_id" << "image_height" << "has_notes" << "uploader_id" << "file_size" << "id" << "preview_height" << "rating" << "tag_string" << "uploader_name" << "score" << "tag_string_artist" << "tag_string_character" << "tag_string_copyright" << "tag_string_general"; for (int i = 0; i < infos.count(); i++) { d[infos.at(i)] = sc.value(assoc.at(i)).toString().trimmed(); } } else if (sc.contains("tag_ids")) { QStringList infos, assoc; infos << "created_at" << "source" << "file_url" << "preview_url" << "width" << "md5" << "height" << "id" << "tags" << "author" << "score"; assoc << "created_at" << "source_url" << "image" << "image" << "width" << "id" << "height" << "id_number" << "tags" << "uploader" << "score"; for (int i = 0; i < infos.count(); i++) { d[infos.at(i)] = sc.value(assoc.at(i)).toString().trimmed(); } } else { QStringList infos; infos << "created_at" << "status" << "source" << "has_comments" << "file_url" << "sample_url" << "change" << "sample_width" << "has_children" << "preview_url" << "width" << "md5" << "preview_width" << "sample_height" << "parent_id" << "height" << "has_notes" << "creator_id" << "file_size" << "id" << "preview_height" << "rating" << "tags" << "author" << "score"; for (int i = 0; i < infos.count(); i++) { d[infos.at(i)] = sc.value(infos.at(i)).toString().trimmed(); } } this->parseImage(d, id + first); } } else { fallback(); return; } } // If tags have not been retrieved yet if (m_tags.isEmpty()) { QStringList tagsGot; for (int i = 0; i < m_images.count(); i++) { QList<Tag> tags = m_images.at(i)->tags(); for (int t = 0; t < tags.count(); t++) { if (tagsGot.contains(tags[t].text())) { m_tags[tagsGot.indexOf(tags[t].text())].setCount(m_tags[tagsGot.indexOf(tags[t].text())].count()+1); } else { m_tags.append(tags[t]); tagsGot.append(tags[t].text()); } } } } // Getting last page if (m_site->contains("LastPage") && m_pagesCount < 1) { m_pagesCount = m_site->value("LastPage").toInt(); } if (m_site->contains("Regex/Count") && m_imagesCount < 1) { QRegExp rxlast(m_site->value("Regex/Count")); rxlast.indexIn(m_source, 0); m_imagesCount = rxlast.cap(1).remove(",").toInt(); } if (m_site->contains("Regex/LastPage") && m_pagesCount < 1) { QRegExp rxlast(m_site->value("Regex/LastPage")); rxlast.indexIn(m_source, 0); m_pagesCount = rxlast.cap(1).remove(",").toInt(); } // Guess images count if (m_site->contains("Urls/"+QString::number(m_currentSource)+"/Limit") && m_pagesCount > 0) { m_imagesCount = m_pagesCount * m_site->value("Urls/"+QString::number(m_currentSource)+"/Limit").toInt(); } // Remove first n images (according to site settings) int skip = m_site->setting("ignore/always", 0).toInt(); if (m_page == m_site->value("FirstPage").toInt()) skip = m_site->setting("ignore/1", 0).toInt(); if (m_images.size() > m_imagesPerPage && m_images.size() > skip) for (int i = 0; i < skip; ++i) m_images.removeFirst(); // Virtual paging int firstImage = 0; int lastImage = m_smart ? m_imagesPerPage : m_images.size(); if (!m_originalUrl.contains("{page}")) { firstImage = m_imagesPerPage * (m_page - 1); lastImage = m_imagesPerPage; } while (firstImage > 0) { m_images.removeFirst(); firstImage--; } while (m_images.size() > lastImage) { m_images.removeLast(); } m_reply->deleteLater(); m_replyExists = false; QString t = m_search.join(" "); if (m_site->contains("DefaultTag") && t.isEmpty()) { t = m_site->value("DefaultTag"); } if (!m_search.isEmpty() && !m_site->value("Urls/"+QString::number(m_currentSource)+"/"+(t.isEmpty() && !m_site->contains("Urls/"+QString::number(m_currentSource)+"/Home") ? "Home" : "Tags")).contains("{tags}")) { m_errors.append(tr("La recherche par tags est impossible avec la source choisie (%1).").arg(m_format)); } emit finishedLoading(this); }
QStringList meshTypeStringKeys() { return meshTypeList.values(); }
QStringList adaptivityStoppingCriterionTypeStringKeys() { return adaptivityStoppingCriterionTypeList.values(); }
QStringList analysisTypeStringKeys() { return analysisTypeList.values(); }
QStringList weakFormStringKeys() { return weakFormList.values(); }
QStringList butcherTableTypeStringKeys() { return butcherTableTypeList.values(); }
QStringList iterLinearSolverPreconditionerTypeStringKeys() { return iterLinearSolverPreconditionerTypeList.values(); }
QStringList dampingTypeStringKeys() { return dampingTypeList.values(); }
QStringList matrixSolverTypeStringKeys() { return matrixSolverTypeList.values(); }
QStringList solutionTypeStringKeys() { return solutionTypeList.values(); }
QStringList linearityTypeStringKeys() { return linearityTypeList.values(); }
void UIGInformationUpdateTaskStorage::run() { /* Acquire corresponding machine: */ CMachine machine = property("machine").value<CMachine>(); if (machine.isNull()) return; /* Prepare table: */ UITextTable table; /* Gather information: */ if (machine.GetAccessible()) { /* Iterate over all the machine controllers: */ bool fSomeInfo = false; foreach (const CStorageController &controller, machine.GetStorageControllers()) { /* Add controller information: */ QString strControllerName = QApplication::translate("UIMachineSettingsStorage", "Controller: %1"); table << UITextTableLine(strControllerName.arg(controller.GetName()), QString()); fSomeInfo = true; /* Populate map (its sorted!): */ QMap<StorageSlot, QString> attachmentsMap; foreach (const CMediumAttachment &attachment, machine.GetMediumAttachmentsOfController(controller.GetName())) { /* Prepare current storage slot: */ StorageSlot attachmentSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice()); AssertMsg(controller.isOk(), ("Unable to acquire controller data: %s\n", msgCenter().formatRC(controller.lastRC()).toAscii().constData())); if (!controller.isOk()) continue; /* Prepare attachment information: */ QString strAttachmentInfo = vboxGlobal().details(attachment.GetMedium(), false, false); /* That temporary hack makes sure 'Inaccessible' word is always bold: */ { // hack QString strInaccessibleString(VBoxGlobal::tr("Inaccessible", "medium")); QString strBoldInaccessibleString(QString("<b>%1</b>").arg(strInaccessibleString)); strAttachmentInfo.replace(strInaccessibleString, strBoldInaccessibleString); } // hack /* Append 'device slot name' with 'device type name' for optical devices only: */ KDeviceType deviceType = attachment.GetType(); QString strDeviceType = deviceType == KDeviceType_DVD ? QApplication::translate("UIGInformation", "[Optical Drive]", "details (storage)") : QString(); if (!strDeviceType.isNull()) strDeviceType.append(' '); /* Insert that attachment information into the map: */ if (!strAttachmentInfo.isNull()) { /* Configure hovering anchors: */ const QString strAnchorType = deviceType == KDeviceType_DVD || deviceType == KDeviceType_Floppy ? QString("mount") : deviceType == KDeviceType_HardDisk ? QString("attach") : QString(); const CMedium medium = attachment.GetMedium(); const QString strMediumLocation = medium.isNull() ? QString() : medium.GetLocation(); attachmentsMap.insert(attachmentSlot, QString("<a href=#%1,%2,%3,%4>%5</a>") .arg(strAnchorType, controller.GetName(), gpConverter->toString(attachmentSlot), strMediumLocation, strDeviceType + strAttachmentInfo)); } } /* Iterate over the sorted map: */ QList<StorageSlot> storageSlots = attachmentsMap.keys(); QList<QString> storageInfo = attachmentsMap.values(); for (int i = 0; i < storageSlots.size(); ++i) table << UITextTableLine(QString(" ") + gpConverter->toString(storageSlots[i]), storageInfo[i]); } if (!fSomeInfo) table << UITextTableLine(QApplication::translate("UIGInformation", "Not Attached", "details (storage)"), QString()); }
int User::loadNext() { if (queue.empty()) return 1; if (this->cancel) return 1; QMap<Anime *, bool> data = queue.front(); queue.pop(); Anime *anime = data.keys().first(); bool download_cover = data.values().first(); QString ID = anime->getID(); QUrl ID_URL = API::sharedAPI()->sharedAniListAPI()->API_ANIME(ID); QJsonObject result = API::sharedAPI()->sharedAniListAPI()->get(ID_URL).object(); anime->setCoverURL(QUrl(result.value("image_url_lge").toString())); if (download_cover) { QEventLoop evt; connect(anime, SIGNAL(new_image()), &evt, SLOT(quit())); anime->downloadCover(); evt.exec(); } QString description = result.value("description").toString(); anime->setDuration(result.value("duration").toInt()); anime->setSynopsis(description); anime->setRomajiTitle(result.value("title_romaji").toString()); anime->setJapaneseTitle(result.value("title_japanese").toString()); anime->setEnglishTitle(result.value("title_english").toString()); anime->setType(result.value("type").toString()); anime->setAiringStatus(result.value("airing_status").toString()); anime->setEpisodeCount(result.value("total_episodes").toInt()); anime->setAverageScore(result.value("average_score").toString()); anime->setTitle(result.value(title_language).toString()); if (anime->getAiringStatus() == "currently airing") { QJsonObject airing = result.value("airing").toObject(); anime->setNextEpisode(airing.value("next_episode").toInt()); anime->setCountdown(airing.value("countdown").toInt()); if (anime->getCountdown() > 0) { anime->setAiringSchedule(true); } else { anime->setAiringSchedule(false); } } QJsonArray synonyms = result.value("synonyms").toArray(); for (int j = 0; j < synonyms.count(); j++) { anime->addSynonym(synonyms.at(j).toString()); } anime->finishReload(); qDebug() << "Loaded extra data for anime" << anime->getTitle(); db->saveAnime(anime); if (!queue.empty()) { async_registry.append(QtConcurrent::run([&, this]() { // NOLINT loadNext(); return 1; })); } return 1; }
/* Return[0]: totalFile Return[1]: totalSize Return[2]: currentFile */ QList<quint64> TransferModel::synchronizeItems(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions) { loop_size=returnActions.size(); index_for_loop=0; quint64 totalFile=0,totalSize=0,currentFile=0; totalFile=0; totalSize=0; currentFile=0; emit layoutAboutToBeChanged(); const QModelIndexList oldIndexes = persistentIndexList(); QModelIndexList newIndexes = oldIndexes; QMap<int, quint64> oldMapping; // model index row in model before update, item id QMap<quint64, int> newMapping; // item id, model index row in model after update for ( int i = 0; i < oldIndexes.count(); i++ ) { const QModelIndex& index = oldIndexes[ i ]; oldMapping[ index.row() ] = index.data( Qt::UserRole ).value<quint64>(); } while(index_for_loop<loop_size) { const Ultracopier::ReturnActionOnCopyList& action=returnActions.at(index_for_loop); switch(action.type) { case Ultracopier::AddingItem: { TransfertItem newItem; newItem.id=action.addAction.id; newItem.source=action.addAction.sourceFullPath; newItem.size=facilityEngine->sizeToString(action.addAction.size); newItem.destination=action.addAction.destinationFullPath; transfertItemList<<newItem; totalFile++; totalSize+=action.addAction.size; } break; case Ultracopier::MoveItem: { //bool current_entry= if(action.userAction.position<0) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QString("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position)); break; } if(action.userAction.position>(transfertItemList.size()-1)) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QString("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position)); break; } if(action.userAction.moveAt<0) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QString("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position)); break; } if(action.userAction.moveAt>(transfertItemList.size()-1)) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QString("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position)); break; } if(action.userAction.position==action.userAction.moveAt) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QString("id: %1, move at same position: %2").arg(action.addAction.id).arg(action.userAction.position)); break; } transfertItemList.move(action.userAction.position,action.userAction.moveAt); //newIndexes.move(action.userAction.position,action.userAction.moveAt); } break; case Ultracopier::RemoveItem: { if(currentIndexSearch>0 && action.userAction.position<=currentIndexSearch) currentIndexSearch--; if(action.userAction.position<0) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QString("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position)); break; } if(action.userAction.position>(transfertItemList.size()-1)) { ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QString("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position)); break; } transfertItemList.removeAt(action.userAction.position); currentFile++; startId.remove(action.addAction.id); stopId.remove(action.addAction.id); internalRunningOperation.remove(action.addAction.id); //newIndexes.remove(action.userAction.moveAt); } break; case Ultracopier::PreOperation: { ItemOfCopyListWithMoreInformations tempItem; tempItem.currentReadProgression=0; tempItem.currentWriteProgression=0; tempItem.generalData=action.addAction; tempItem.actionType=action.type; internalRunningOperation[action.addAction.id]=tempItem; } break; case Ultracopier::Transfer: { if(!startId.contains(action.addAction.id)) startId << action.addAction.id; stopId.remove(action.addAction.id); if(internalRunningOperation.contains(action.addAction.id)) internalRunningOperation[action.addAction.id].actionType=action.type; else ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QString("unable to found entry for file %1: actionType: Transfer").arg(action.addAction.id)); } break; case Ultracopier::PostOperation: { if(!stopId.contains(action.addAction.id)) stopId << action.addAction.id; startId.remove(action.addAction.id); } break; case Ultracopier::CustomOperation: { bool custom_with_progression=(action.addAction.size==1); //without progression if(custom_with_progression) { if(startId.remove(action.addAction.id)) if(!stopId.contains(action.addAction.id)) stopId << action.addAction.id; } //with progression else { stopId.remove(action.addAction.id); if(!startId.contains(action.addAction.id)) startId << action.addAction.id; } if(internalRunningOperation.contains(action.addAction.id)) { ItemOfCopyListWithMoreInformations &item=internalRunningOperation[action.addAction.id]; item.actionType=action.type; item.custom_with_progression=custom_with_progression; item.currentReadProgression=0; item.currentWriteProgression=0; } } break; default: //unknow code, ignore it break; } index_for_loop++; } if(!oldIndexes.isEmpty()) { const QSet<quint64> ids = oldMapping.values().toSet(); for ( int i = 0; i < transfertItemList.count(); i++ ) { const TransferModel::TransfertItem& item = transfertItemList[ i ]; if ( ids.contains( item.id ) ) { newMapping[ item.id ] = i; } } for ( int i = 0; i < oldIndexes.count(); i++ ) { const QModelIndex& index = oldIndexes[ i ]; const int newRow = newMapping.value( oldMapping[ index.row() ], -1 ); newIndexes[ i ] = newRow == -1 ? QModelIndex() : QAbstractTableModel::index( newRow, index.column(), index.parent() ); } } changePersistentIndexList( oldIndexes, newIndexes ); emit layoutChanged(); return QList<quint64>() << totalFile << totalSize << currentFile; }
QStringList dataTableTypeStringKeys() { return dataTableTypeList.values(); }
QStringList dumpFormatStringKeys() { return dumpFormatList.values(); }
QStringList specialFunctionTypeStringKeys() { return specialFunctionTypeList.values(); }
QStringList spaceTypeStringKeys() { return spaceTypeList.values(); }
QStringList iterLinearSolverMethodStringKeys() { return iterLinearSolverMethodList.values(); }
QStringList sceneViewPost3DModeStringKeys() { return sceneViewPost3DModeList.values(); }
QStringList coordinateTypeStringKeys() { return coordinateTypeList.values(); }
QStringList paletteQualityStringKeys() { return paletteQualityList.values(); }
QStringList couplingTypeStringKeys() { return couplingTypeList.values(); }
QStringList paletteOrderTypeStringKeys() { return paletteOrderTypeList.values(); }
QStringList weakFormVariantStringKeys() { return weakFormVariantList.values(); }
QStringList vectorTypeStringKeys() { return vectorTypeList.values(); }
QStringList physicFieldVariableCompTypeStringKeys() { return physicFieldVariableCompList.values(); }
QStringList vectorCenterStringKeys() { return vectorCenterList.values(); }
QStringList adaptivityNormTypeStringKeys() { return adaptivityNormTypeList.values(); }
void ClassesWidget::import_ocad_iofxml() { qfLogFuncFrame(); QString fn = qfd::FileDialog::getOpenFileName(this, tr("Open file"), QString(), "XML files (*.xml);; All files (*)"); if(fn.isEmpty()) return; try { QFile f(fn); if(f.open(QFile::ReadOnly)) { QDomDocument xdoc; QString err_str; int err_line; if(!xdoc.setContent(&f, &err_str, &err_line)) QF_EXCEPTION(QString("Error parsing xml file '%1' at line: %2").arg(err_str).arg(err_line)); QDomNodeList xml_courses = xdoc.elementsByTagName(QStringLiteral("Course")); QList<CourseDef> defined_courses_list; for (int i = 0; i < xml_courses.count(); ++i) { QDomElement el_course = xml_courses.at(i).toElement(); if(el_course.isNull()) QF_EXCEPTION(QString("Xml file format error: bad element '%1'").arg("Course")); CourseDef coursedef; QString course_name = element_text(el_course, QStringLiteral("CourseName")); course_name.replace(' ', QString()); course_name.replace(';', '-'); course_name.replace(',', '-'); course_name.replace(':', '-'); course_name.replace('+', '-'); coursedef.setName(course_name); QStringList class_names; QDomNodeList xml_classes = el_course.elementsByTagName(QStringLiteral("ClassShortName")); for (int j = 0; j < xml_classes.count(); ++j) { QString class_name = xml_classes.at(j).toElement().text().trimmed(); class_names << class_name; } coursedef.setClasses(class_names); QDomElement el_course_variantion = el_course.firstChildElement(QStringLiteral("CourseVariation")); if(el_course_variantion.isNull()) QF_EXCEPTION(QString("Xml file format error: missing element '%1'").arg("CourseVariation")); coursedef.setLenght(element_text(el_course_variantion, QStringLiteral("CourseLength")).trimmed().toInt()); coursedef.setClimb(element_text(el_course_variantion, QStringLiteral("CourseClimb")).trimmed().toInt()); QMap<int, QVariant> codes; QDomNodeList xml_controls = el_course.elementsByTagName(QStringLiteral("CourseControl")); for (int j = 0; j < xml_controls.count(); ++j) { QDomElement el_control = xml_controls.at(j).toElement(); int no = element_text(el_control, QStringLiteral("Sequence")).trimmed().toInt(); if(no <= 0) QF_EXCEPTION(QString("Xml file format error: bad sequence number %1 in %2").arg(no).arg(dump_element(el_control))); int code = element_text(el_control, QStringLiteral("ControlCode")).trimmed().toInt(); if(code <= 0) QF_EXCEPTION(QString("Xml file format error: bad control code %1 in %2").arg(code).arg(dump_element(el_control))); codes[no] = code; } coursedef.setCodes(codes.values()); defined_courses_list << coursedef; } importCourses(defined_courses_list); } } catch (const qf::core::Exception &e) { qf::qmlwidgets::framework::MainWindow *fwk = qf::qmlwidgets::framework::MainWindow::frameWork(); qf::qmlwidgets::dialogs::MessageBox::showException(fwk, e); } }