bool FvUpdater::xmlParseFeed() { QString currentTag, currentQualifiedTag; QString xmlTitle, xmlLink, xmlReleaseNotesLink, xmlPubDate, xmlEnclosureUrl, xmlEnclosureVersion, xmlEnclosurePlatform, xmlEnclosureType, xmlReleaseNotesHtml; unsigned long xmlEnclosureLength = 0; // Parse while (! m_xml.atEnd()) { m_xml.readNext(); if (m_xml.isStartElement()) { currentTag = m_xml.name().toString(); currentQualifiedTag = m_xml.qualifiedName().toString(); if (m_xml.name() == "item") { xmlTitle.clear(); xmlLink.clear(); xmlReleaseNotesLink.clear(); xmlReleaseNotesHtml.clear(); xmlPubDate.clear(); xmlEnclosureUrl.clear(); xmlEnclosureVersion.clear(); xmlEnclosurePlatform.clear(); xmlEnclosureLength = 0; xmlEnclosureType.clear(); } else if (m_xml.name() == "enclosure") { QXmlStreamAttributes attribs = m_xml.attributes(); if (attribs.hasAttribute("fervor:platform")) { if (FvPlatform::CurrentlyRunningOnPlatform(attribs.value("fervor:platform").toString().trimmed())) { xmlEnclosurePlatform = attribs.value("fervor:platform").toString().trimmed(); if (attribs.hasAttribute("url")) { xmlEnclosureUrl = attribs.value("url").toString().trimmed(); } else { xmlEnclosureUrl = ""; } // First check for Sparkle's version, then overwrite with Fervor's version (if any) if (attribs.hasAttribute("sparkle:version")) { QString candidateVersion = attribs.value("sparkle:version").toString().trimmed(); if (! candidateVersion.isEmpty()) { xmlEnclosureVersion = candidateVersion; } } if (attribs.hasAttribute("fervor:version")) { QString candidateVersion = attribs.value("fervor:version").toString().trimmed(); if (! candidateVersion.isEmpty()) { xmlEnclosureVersion = candidateVersion; } } if (attribs.hasAttribute("length")) { xmlEnclosureLength = attribs.value("length").toString().toLong(); } else { xmlEnclosureLength = 0; } if (attribs.hasAttribute("type")) { xmlEnclosureType = attribs.value("type").toString().trimmed(); } else { xmlEnclosureType = ""; } } } } } else if (m_xml.isEndElement()) { if (m_xml.name() == "item") { // That's it - we have analyzed a single <item> and we'll stop // here (because the topmost is the most recent one, and thus // the newest version. return searchDownloadedFeedForUpdates(xmlTitle, xmlLink, xmlReleaseNotesLink, xmlReleaseNotesHtml, xmlPubDate, xmlEnclosureUrl, xmlEnclosureVersion, xmlEnclosurePlatform, xmlEnclosureLength, xmlEnclosureType); } } else if (m_xml.isCharacters() && ! m_xml.isWhitespace()) { if (currentTag == "title") { xmlTitle += m_xml.text().toString().trimmed(); } else if (currentTag == "link") { xmlLink += m_xml.text().toString().trimmed(); } else if (currentQualifiedTag == "sparkle:releaseNotesLink") { xmlReleaseNotesLink += m_xml.text().toString().trimmed(); } else if (currentTag == "pubDate") { xmlPubDate += m_xml.text().toString().trimmed(); } else if (currentTag == "description") { xmlReleaseNotesHtml += m_xml.text().toString().trimmed(); } } if (m_xml.error() && m_xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) { showErrorDialog(tr("Feed parsing failed: %1 %2.").arg(QString::number(m_xml.lineNumber()), m_xml.errorString()), NO_UPDATE_MESSAGE); return false; } } // No updates were found if we're at this point // (not a single <item> element found) showInformationDialog(tr("No updates were found."), false); return false; }
bool FvUpdater::searchDownloadedFeedForUpdates(QString xmlTitle, QString xmlLink, QString xmlReleaseNotesLink, QString xmlPubDate, QString xmlEnclosureUrl, QString xmlEnclosureVersion, QString xmlEnclosurePlatform, unsigned long xmlEnclosureLength, QString xmlEnclosureType) { qDebug() << "Title:" << xmlTitle; qDebug() << "Link:" << xmlLink; qDebug() << "Release notes link:" << xmlReleaseNotesLink; qDebug() << "Pub. date:" << xmlPubDate; qDebug() << "Enclosure URL:" << xmlEnclosureUrl; qDebug() << "Enclosure version:" << xmlEnclosureVersion; qDebug() << "Enclosure platform:" << xmlEnclosurePlatform; qDebug() << "Enclosure length:" << xmlEnclosureLength; qDebug() << "Enclosure type:" << xmlEnclosureType; // Validate if (xmlReleaseNotesLink.isEmpty()) { if (xmlLink.isEmpty()) { showErrorDialog(tr("Feed error: \"release notes\" link is empty"), false); return false; } else { xmlReleaseNotesLink = xmlLink; } } else { xmlLink = xmlReleaseNotesLink; } if (! (xmlLink.startsWith("http://") || xmlLink.startsWith("https://"))) { showErrorDialog(tr("Feed error: invalid \"release notes\" link"), false); return false; } if (xmlEnclosureUrl.isEmpty() || xmlEnclosureVersion.isEmpty() || xmlEnclosurePlatform.isEmpty()) { showErrorDialog(tr("Feed error: invalid \"enclosure\" with the download link"), false); return false; } // Relevant version? if (FVIgnoredVersions::VersionIsIgnored(xmlEnclosureVersion)) { qDebug() << "Version '" << xmlEnclosureVersion << "' is ignored, too old or something like that."; showInformationDialog(tr("No updates were found."), false); return true; // Things have succeeded when you think of it. } // // Success! At this point, we have found an update that can be proposed // to the user. // if (m_proposedUpdate) { delete m_proposedUpdate; m_proposedUpdate = 0; } m_proposedUpdate = new FvAvailableUpdate(); m_proposedUpdate->SetTitle(xmlTitle); m_proposedUpdate->SetReleaseNotesLink(xmlReleaseNotesLink); m_proposedUpdate->SetPubDate(xmlPubDate); m_proposedUpdate->SetEnclosureUrl(xmlEnclosureUrl); m_proposedUpdate->SetEnclosureVersion(xmlEnclosureVersion); m_proposedUpdate->SetEnclosurePlatform(xmlEnclosurePlatform); m_proposedUpdate->SetEnclosureLength(xmlEnclosureLength); m_proposedUpdate->SetEnclosureType(xmlEnclosureType); // Show "look, there's an update" window showUpdaterWindowUpdatedWithCurrentUpdateProposal(); return true; }
bool FvUpdater::searchDownloadedFeedForUpdates(QString xmlTitle, QString xmlLink, QString xmlReleaseNotesLink, QString xmlReleaseNotesHtml, QString xmlPubDate, QString xmlEnclosureUrl, QString xmlEnclosureVersion, QString xmlEnclosurePlatform, unsigned long xmlEnclosureLength, QString xmlEnclosureType) { // qDebug() << "Title:" << xmlTitle; // qDebug() << "Link:" << xmlLink; // qDebug() << "Release notes link:" << xmlReleaseNotesLink; // qDebug() << "Pub. date:" << xmlPubDate; // qDebug() << "Enclosure URL:" << xmlEnclosureUrl; // qDebug() << "Enclosure version:" << xmlEnclosureVersion; // qDebug() << "Enclosure platform:" << xmlEnclosurePlatform; // qDebug() << "Enclosure length:" << xmlEnclosureLength; // qDebug() << "Enclosure type:" << xmlEnclosureType; // Validate Release notes if (xmlReleaseNotesHtml.isEmpty()) { if (xmlReleaseNotesLink.isEmpty()) { if (xmlLink.isEmpty()) { showErrorDialog(tr("Feed error: \"release notes\" link is empty"), NO_UPDATE_MESSAGE); return false; } else { xmlReleaseNotesLink = xmlLink; } } else { xmlLink = xmlReleaseNotesLink; } if (! (xmlLink.startsWith("http://") || xmlLink.startsWith("https://"))) { showErrorDialog(tr("Feed error: invalid \"release notes\" link"), NO_UPDATE_MESSAGE); return false; } } // Validate if (xmlEnclosureUrl.isEmpty() || xmlEnclosureVersion.isEmpty() || xmlEnclosurePlatform.isEmpty()) { showErrorDialog(tr("Feed error: invalid \"enclosure\" with the download link"), NO_UPDATE_MESSAGE); return false; } xmlEnclosureUrl = QUrl::fromPercentEncoding(xmlEnclosureUrl.toLatin1()); // qDebug() << " decoded URL:" << xmlEnclosureUrl; // Append dynamic url content - if supported in EnclosureUrl if(xmlEnclosureUrl.contains('%')) xmlEnclosureUrl = xmlEnclosureUrl.arg(m_dynamicUrl); // qDebug() << "Download URL:" << xmlEnclosureUrl; // Relevant version? // If not silent, check also ignored version if (FVIgnoredVersions::VersionIsIgnored(xmlEnclosureVersion, !m_silentAsMuchAsItCouldGet)) { qDebug() << "Version '" << xmlEnclosureVersion << "' is ignored, too old or something like that."; showInformationDialog(tr("No updates were found."), false); return true; // Things have succeeded when you think of it. } // // Success! At this point, we have found an update that can be proposed // to the user. // if (m_proposedUpdate) { delete m_proposedUpdate; m_proposedUpdate = 0; } m_proposedUpdate = new FvAvailableUpdate(); m_proposedUpdate->SetTitle(xmlTitle); m_proposedUpdate->SetReleaseNotesLink(xmlReleaseNotesLink); m_proposedUpdate->SetReleaseNotesHtml(xmlReleaseNotesHtml); m_proposedUpdate->SetPubDate(xmlPubDate); m_proposedUpdate->SetEnclosureUrl(xmlEnclosureUrl); m_proposedUpdate->SetEnclosureVersion(xmlEnclosureVersion); m_proposedUpdate->SetEnclosurePlatform(xmlEnclosurePlatform); m_proposedUpdate->SetEnclosureLength(xmlEnclosureLength); m_proposedUpdate->SetEnclosureType(xmlEnclosureType); // Show "look, there's an update" window showUpdaterWindowUpdatedWithCurrentUpdateProposal(); return true; }