") %
93 | tr("There is a new update available for the launcher.") %
94 | QStringLiteral("
") %
95 | tr("It is recomended that you update.") %
96 | QStringLiteral("
") %
97 | tr("Installed Version: ") %
98 | QStringLiteral(APP_VERSION) %
99 | QStringLiteral("
") %
100 | tr("Latest Version: ") %
101 | ver %
102 | QStringLiteral("
") % 105 | tr("Download Page") % 106 | QStringLiteral("
")); 107 | msg.setMinimumWidth(1000); 108 | msg.exec(); 109 | } 110 | } 111 | } 112 | 113 | void Updater::receivedAPI() { 114 | if (api->error() != QNetworkReply::NoError) { 115 | if (api->error() != QNetworkReply::OperationCanceledError) { 116 | emit error(api->errorString()); 117 | api->deleteLater(); 118 | api = nullptr; 119 | } 120 | return; 121 | } 122 | 123 | QByteArray data = api->readAll(); 124 | api->close(); 125 | api->deleteLater(); 126 | api = nullptr; 127 | 128 | QJsonDocument response = QJsonDocument::fromJson(data); 129 | QJsonObject robj = response.object(); 130 | if (robj[QStringLiteral("error")].toInt() != 0) { 131 | emit error(robj[QStringLiteral("errorMessage")].toString()); 132 | return; 133 | } 134 | 135 | QString flavor = settings.value(QStringLiteral("downloadFlavour")).toString(); 136 | QString have = settings.value(QStringLiteral("downloadId")).toString(); 137 | version = robj[QStringLiteral("downloadId")].toString(); 138 | 139 | if (flavor == OPENRCT2_FLAVOR && have == version && OPENRCT2_HOMEDIR.cd(QStringLiteral(OPENRCT2_BIN))) { 140 | emit installed(); 141 | } else { 142 | size = robj[QStringLiteral("fileSize")].toInt(); 143 | hash = QByteArray::fromHex(robj[QStringLiteral("fileHash")].toString().toLatin1()); 144 | githash = QByteArray::fromHex(robj[QStringLiteral("gitHash")].toString().toLatin1()); 145 | 146 | QNetworkRequest request(robj[QStringLiteral("url")].toString()); 147 | request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); 148 | bundle = net.get(request); 149 | connect(bundle, &QNetworkReply::finished, this, &Updater::receivedBundle); 150 | connect(bundle, &QNetworkReply::downloadProgress, this, &Updater::downloadProgress); 151 | } 152 | } 153 | 154 | void Updater::receivedBundle() { 155 | if (bundle->error() != QNetworkReply::NoError) { 156 | if (bundle->error() != QNetworkReply::OperationCanceledError) { 157 | emit error(bundle->errorString()); 158 | bundle->deleteLater(); 159 | bundle = nullptr; 160 | } 161 | return; 162 | } 163 | 164 | QByteArray data = bundle->readAll(); 165 | bundle->close(); 166 | bundle->deleteLater(); 167 | bundle = nullptr; 168 | 169 | if (size > 0 && data.size() != size) { 170 | emit error(tr("Invalid Download Size")); 171 | return; 172 | } 173 | 174 | if (hash.size() > 0) { 175 | QByteArray fhash = QCryptographicHash::hash(data, QCryptographicHash::Algorithm::Sha256); 176 | if (fhash != hash) { 177 | emit error(tr("Invalid Download Hash")); 178 | return; 179 | } 180 | } 181 | 182 | QDir bin = OPENRCT2_HOMEDIR; 183 | if (bin.cd(QStringLiteral(OPENRCT2_BIN))) { 184 | bin.removeRecursively(); 185 | if (!bin.mkpath(QStringLiteral("."))) { 186 | emit error(tr("bin dir not created")); 187 | return; 188 | } 189 | } else { 190 | bin.mkpath(QStringLiteral(OPENRCT2_BIN)); 191 | if (!bin.cd(QStringLiteral(OPENRCT2_BIN))) { 192 | emit error(tr("bin dir not created")); 193 | return; 194 | } 195 | } 196 | 197 | if (extract(data, bin)) { 198 | emit installed(); 199 | 200 | settings.setValue(QStringLiteral("downloadFlavour"), OPENRCT2_FLAVOR); 201 | settings.setValue(QStringLiteral("downloadId"), version); 202 | settings.setValue(QStringLiteral("gitHash"), githash); 203 | settings.sync(); 204 | } else { 205 | emit error(tr("Error extracting archive")); 206 | } 207 | } 208 | 209 | bool Updater::extract(QByteArray &data, QDir &bin) { 210 | QBuffer buffer(&data); 211 | #ifdef Q_OS_LINUX 212 | GZipReadFilter gzip(&buffer); 213 | return extractTar(&gzip, bin); 214 | #else 215 | return extractZip(&buffer, bin); 216 | #endif 217 | } 218 | -------------------------------------------------------------------------------- /src/configuration.ui: -------------------------------------------------------------------------------- 1 | 2 |