| 213 | } |
| 214 | |
| 215 | void HttpMetaCache::Load() |
| 216 | { |
| 217 | if (m_index_file.isNull()) |
| 218 | return; |
| 219 | |
| 220 | QFile index(m_index_file); |
| 221 | if (!index.open(QIODevice::ReadOnly)) |
| 222 | return; |
| 223 | |
| 224 | QJsonParseError parseError; |
| 225 | QJsonDocument json = QJsonDocument::fromJson(index.readAll(), &parseError); |
| 226 | |
| 227 | // Fail if the JSON is invalid. |
| 228 | if (parseError.error != QJsonParseError::NoError) { |
| 229 | qCritical() << QString("Failed to parse HttpMetaCache file: %1 at offset %2") |
| 230 | .arg(parseError.errorString(), QString::number(parseError.offset)) |
| 231 | .toUtf8(); |
| 232 | return; |
| 233 | } |
| 234 | |
| 235 | // Make sure the root is an object. |
| 236 | if (!json.isObject()) { |
| 237 | qCritical() << "HttpMetaCache root should be an object."; |
| 238 | return; |
| 239 | } |
| 240 | |
| 241 | auto root = json.object(); |
| 242 | |
| 243 | // check file version first |
| 244 | auto version_val = Json::ensureString(root, "version"); |
| 245 | if (version_val != "1") |
| 246 | return; |
| 247 | |
| 248 | // read the entry array |
| 249 | auto array = Json::ensureArray(root, "entries"); |
| 250 | for (auto element : array) { |
| 251 | auto element_obj = Json::ensureObject(element); |
| 252 | auto base = Json::ensureString(element_obj, "base"); |
| 253 | if (!m_entries.contains(base)) |
| 254 | continue; |
| 255 | |
| 256 | auto& entrymap = m_entries[base]; |
| 257 | |
| 258 | auto foo = new MetaEntry(); |
| 259 | foo->m_baseId = base; |
| 260 | foo->m_relativePath = Json::ensureString(element_obj, "path"); |
| 261 | foo->m_md5sum = Json::ensureString(element_obj, "md5sum"); |
| 262 | foo->m_etag = Json::ensureString(element_obj, "etag"); |
| 263 | foo->m_local_changed_timestamp = Json::ensureDouble(element_obj, "last_changed_timestamp"); |
| 264 | foo->m_remote_changed_timestamp = Json::ensureString(element_obj, "remote_changed_timestamp"); |
| 265 | |
| 266 | foo->makeEternal(Json::ensureBoolean(element_obj, (const QString)QStringLiteral("eternal"), false)); |
| 267 | if (!foo->isEternal()) { |
| 268 | foo->m_current_age = Json::ensureDouble(element_obj, "current_age"); |
| 269 | foo->m_max_age = Json::ensureDouble(element_obj, "max_age"); |
| 270 | } |
| 271 | |
| 272 | // presumed innocent until closer examination |
no test coverage detected