diff --git a/androidprojectmodifier.cpp b/androidprojectmodifier.cpp index 60da22f..f53951f 100644 --- a/androidprojectmodifier.cpp +++ b/androidprojectmodifier.cpp @@ -123,8 +123,7 @@ QString AndroidProjectModifier::randomString(int length) const auto possibleCharacters = QStringLiteral("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); QString randomString; - for(int i = 0; i < length; ++i) - { + for(int i = 0; i < length; ++i) { int index = qrand() % possibleCharacters.length(); QChar nextChar = possibleCharacters.at(index); randomString.append(nextChar); @@ -147,7 +146,7 @@ QString AndroidProjectModifier::resizeImage(const QHash imageD convert.waitForFinished(); if (convert.exitCode() != 0) { - throw QString("Warning: could not resize the image. Do you have the 'convert' utility installed?"); + throw QString("Error: could not resize the image. Do you have the 'convert' utility installed?"); } return tmpFile.fileName(); diff --git a/main.cpp b/main.cpp index 953a3ef..572bd71 100644 --- a/main.cpp +++ b/main.cpp @@ -1,4 +1,5 @@ #include +#include #include "inputoutput.h" #include "githelper.h" @@ -15,21 +16,31 @@ int main(int argc, char *argv[]) if (app.arguments().count() < 4 || app.arguments().contains("--help")) { const auto binaryName = app.arguments().at(0); - io.writeError("Usage: " + binaryName + " androidPackageName pwaUrl outputPath [--manifest path-to-manifest]"); + io.writeError("Usage: " + binaryName + " androidPackageName pwaUrl outputPath [--manifest path-to-manifest] [--local-manifest path-to-manifest]"); io.writeError("Example: " + binaryName + " com.vendor.pwa https://pwa.vendor.com ./my-cool-pwa"); io.writeError("Example: " + binaryName + " com.vendor.pwa https://pwa.vendor.com ./my-cool-pwa --manifest relative/path/to/manifest"); + io.writeError("Example: " + binaryName + " com.vendor.pwa https://pwa.vendor.com ./my-cool-pwa --local-manifest ./manifest.json"); return app.arguments().contains("--help") ? 0 : 1; } QString manifestPath; + QFile *localManifestFile = nullptr; if (app.arguments().contains("--manifest")) { auto index = app.arguments().indexOf("--manifest") + 1; if (app.arguments().count() <= index) { - qCritical() << "You must set a value for --manifest"; - return 1; + throw QString("You must set a value for --manifest"); } manifestPath = app.arguments().at(index); + } else if (app.arguments().contains("--local-manifest")) { + auto index = app.arguments().indexOf("--local-manifest") + 1; + if (app.arguments().count() <= index) { + throw QString("You must set a value for --local-manifest"); + } + localManifestFile = new QFile(app.arguments().at(index), &app); + if (!localManifestFile->exists()) { + throw QString("The specified local manifest file does not exist"); + } } auto url = app.arguments().at(2); @@ -42,11 +53,15 @@ int main(int argc, char *argv[]) gitHelper.checkout(outputDirectory); gitHelper.reinitGitDirectory(outputDirectory); - WebsiteParser parser(url, manifestPath); + QScopedPointer parser( + localManifestFile == nullptr + ? new WebsiteParser(url, manifestPath) + : new WebsiteParser(url, *localManifestFile) + ); - auto basicData = parser.getData(); + auto basicData = parser->getData(); basicData.insert("package", packageName); - auto icons = parser.getImages(); + auto icons = parser->getImages(); AndroidProjectModifier androidProject(outputDirectory); androidProject.addSupportLibrary(); diff --git a/websiteparser.cpp b/websiteparser.cpp index cb9fec9..4f8cd16 100644 --- a/websiteparser.cpp +++ b/websiteparser.cpp @@ -6,6 +6,19 @@ WebsiteParser::WebsiteParser(QString url, QString manifestPath) m_manifestPath = manifestPath; } +WebsiteParser::WebsiteParser(QString url, QFile &manifestFile) +{ + m_url.setUrl(url); + m_manifestFile = &manifestFile; +} + +WebsiteParser::~WebsiteParser() +{ + if (m_manifestFile != nullptr) { + delete m_manifestFile; + } +} + const QString WebsiteParser::getWebsiteContent() { if(!m_websiteContent.isNull() && !m_websiteContent.isEmpty()) { @@ -60,27 +73,47 @@ const QString WebsiteParser::getManifestUrl() const QJsonDocument WebsiteParser::getManifestContent() { - if(m_manifestContent.isNull() || m_manifestContent.isEmpty()) { - QUrl manifestUrl = getManifestUrl(); + if (m_manifestContent.isNull() || m_manifestContent.isEmpty()) { + if (m_manifestFile == nullptr) { + m_manifestContent = getDownloadedManifestContent(); + } else { + m_manifestContent = getLocalManifestContent(); + } + } - QNetworkAccessManager networkManager; - QNetworkRequest request(manifestUrl); - QEventLoop loop; + return QJsonDocument::fromJson(m_manifestContent.toUtf8()); +} - QObject::connect(&networkManager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit); +const QString WebsiteParser::getDownloadedManifestContent() +{ + QUrl manifestUrl = getManifestUrl(); - auto reply = networkManager.get(request); + QNetworkAccessManager networkManager; + QNetworkRequest request(manifestUrl); + QEventLoop loop; - loop.exec(); + QObject::connect(&networkManager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit); - QString response = reply->readAll(); + auto reply = networkManager.get(request); - delete reply; + loop.exec(); - m_manifestContent = response; + QString response = reply->readAll(); + + delete reply; + + return response.toUtf8(); +} + +const QString WebsiteParser::getLocalManifestContent() +{ + if (!m_manifestFile->open(QIODevice::ReadOnly)) { + throw QString("Could not open local manifest file for writing"); } + auto result = m_manifestFile->readAll(); + m_manifestFile->close(); - return QJsonDocument::fromJson(m_manifestContent.toUtf8()); + return result; } const QHash WebsiteParser::getData() diff --git a/websiteparser.h b/websiteparser.h index af2c8a0..6524899 100644 --- a/websiteparser.h +++ b/websiteparser.h @@ -2,6 +2,7 @@ #define WEBSITEPARSER_H #include +#include #include #include #include @@ -17,6 +18,8 @@ class WebsiteParser { public: WebsiteParser(QString url, QString manifestPath); + WebsiteParser(QString url, QFile &manifestFile); + ~WebsiteParser(); const QHash getData(); const QList> getImages(); @@ -26,11 +29,14 @@ class WebsiteParser const QString getWebsiteContent(); const QString getManifestUrl(); const QJsonDocument getManifestContent(); + const QString getDownloadedManifestContent(); + const QString getLocalManifestContent(); QString m_websiteContent; QString m_manifestContent; QString m_manifestPath; QUrl m_url; + QFile *m_manifestFile = nullptr; }; #endif // WEBSITEPARSER_H