Bundle Bundle::fromPath(const QString &path) { Bundle bundle; QFileInfo bundlePath(path); if (!bundlePath.isReadable()) { qCWarning(l) << "bundle" << bundlePath.absolutePath() << "is not readable"; return Bundle(); } bundle.b->path = path; QScopedPointer<QIODevice> manifestJSON(bundle.openFile(Bundle::MANIFEST, QIODevice::Text)); if (!manifestJSON) { qCWarning(l) << "cannot find" << path << "manifest json"; return Bundle(); } QJsonParseError parseError; QJsonDocument doc = QJsonDocument::fromJson(manifestJSON->readAll(), &parseError); if (parseError.error != QJsonParseError::NoError) { qCWarning(l) << "cannot parse" << path << "manifest json" << parseError.errorString(); return Bundle(); } manifestJSON->close(); bundle.b->manifest = doc.object(); bundle.b->isValid = true; return bundle; }