diff options
Diffstat (limited to 'libmultimc/src/instancelist.cpp')
-rw-r--r-- | libmultimc/src/instancelist.cpp | 240 |
1 files changed, 120 insertions, 120 deletions
diff --git a/libmultimc/src/instancelist.cpp b/libmultimc/src/instancelist.cpp index 6f5a9f99..1a7dc10d 100644 --- a/libmultimc/src/instancelist.cpp +++ b/libmultimc/src/instancelist.cpp @@ -37,152 +37,152 @@ InstanceList::InstanceList(const QString &instDir, QObject *parent) : } -InstanceList::InstListError InstanceList::loadList() +void InstanceList::loadGroupList(QMap<QString, QString> & groupMap) { - QDir dir(m_instDir); - QDirIterator iter(dir); - QString groupFileName = m_instDir + "/instgroups.json"; - // temporary map from instance ID to group name - QMap<QString, QString> groupMap; - // HACK: this is really an if. breaks after one iteration. - while (QFileInfo(groupFileName).exists()) + // if there's no group file, fail + if(!QFileInfo(groupFileName).exists()) + return; + + QFile groupFile(groupFileName); + + // if you can't open the file, fail + if (!groupFile.open(QIODevice::ReadOnly)) { - QFile groupFile(groupFileName); - - if (!groupFile.open(QIODevice::ReadOnly)) - { - // An error occurred. Ignore it. - qDebug("Failed to read instance group file."); - break; - } - - QTextStream in(&groupFile); - QString jsonStr = in.readAll(); - groupFile.close(); + // An error occurred. Ignore it. + qDebug("Failed to read instance group file."); + return; + } + + QTextStream in(&groupFile); + QString jsonStr = in.readAll(); + groupFile.close(); + + QJsonParseError error; + QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error); + + // if the json was bad, fail + if (error.error != QJsonParseError::NoError) + { + qWarning(QString("Failed to parse instance group file: %1 at offset %2"). + arg(error.errorString(), QString::number(error.offset)).toUtf8()); + return; + } + + // if the root of the json wasn't an object, fail + if (!jsonDoc.isObject()) + { + qWarning("Invalid group file. Root entry should be an object."); + return; + } + + QJsonObject rootObj = jsonDoc.object(); + + // Make sure the format version matches, otherwise fail. + if (rootObj.value("formatVersion").toVariant().toInt() != GROUP_FILE_FORMAT_VERSION) + return; + + // Get the groups. if it's not an object, fail + if (!rootObj.value("groups").isObject()) + { + qWarning("Invalid group list JSON: 'groups' should be an object."); + return; + } - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error); + // Iterate through all the groups. + QJsonObject groupMapping = rootObj.value("groups").toObject(); + for (QJsonObject::iterator iter = groupMapping.begin(); iter != groupMapping.end(); iter++) + { + QString groupName = iter.key(); - if (error.error != QJsonParseError::NoError) + // If not an object, complain and skip to the next one. + if (!iter.value().isObject()) { - qWarning(QString("Failed to parse instance group file: %1 at offset %2"). - arg(error.errorString(), QString::number(error.offset)).toUtf8()); - break; + qWarning(QString("Group '%1' in the group list should " + "be an object.").arg(groupName).toUtf8()); + continue; } - if (!jsonDoc.isObject()) + QJsonObject groupObj = iter.value().toObject(); + if (!groupObj.value("instances").isArray()) { - qWarning("Invalid group file. Root entry should be an object."); - break; + qWarning(QString("Group '%1' in the group list is invalid. " + "It should contain an array " + "called 'instances'.").arg(groupName).toUtf8()); + continue; } - QJsonObject rootObj = jsonDoc.object(); + // Iterate through the list of instances in the group. + QJsonArray instancesArray = groupObj.value("instances").toArray(); - // Make sure the format version matches. - if (rootObj.value("formatVersion").toVariant().toInt() == GROUP_FILE_FORMAT_VERSION) + for (QJsonArray::iterator iter2 = instancesArray.begin(); + iter2 != instancesArray.end(); iter2++) { - // Get the group list. - if (!rootObj.value("groups").isObject()) - { - qWarning("Invalid group list JSON: 'groups' should be an object."); - break; - } - - // Iterate through the list. - QJsonObject groupList = rootObj.value("groups").toObject(); - - for (QJsonObject::iterator iter = groupList.begin(); - iter != groupList.end(); iter++) - { - QString groupName = iter.key(); - - // If not an object, complain and skip to the next one. - if (!iter.value().isObject()) - { - qWarning(QString("Group '%1' in the group list should " - "be an object.").arg(groupName).toUtf8()); - continue; - } - - QJsonObject groupObj = iter.value().toObject(); - /* - // Create the group object. - InstanceGroup *group = new InstanceGroup(groupName, this); - groups.push_back(group); - - // If 'hidden' isn't a bool value, just assume it's false. - if (groupObj.value("hidden").isBool() && groupObj.value("hidden").toBool()) - { - group->setHidden(groupObj.value("hidden").toBool()); - } - */ - - if (!groupObj.value("instances").isArray()) - { - qWarning(QString("Group '%1' in the group list is invalid. " - "It should contain an array " - "called 'instances'.").arg(groupName).toUtf8()); - continue; - } - - // Iterate through the list of instances in the group. - QJsonArray instancesArray = groupObj.value("instances").toArray(); - - for (QJsonArray::iterator iter2 = instancesArray.begin(); - iter2 != instancesArray.end(); iter2++) - { - groupMap[(*iter2).toString()] = groupName; - } - } + groupMap[(*iter2).toString()] = groupName; } - break; } +} + +InstanceList::InstListError InstanceList::loadList() +{ + // load the instance groups + QMap<QString, QString> groupMap; + loadGroupList(groupMap); + m_instances.clear(); + QDir dir(m_instDir); + QDirIterator iter(dir); while (iter.hasNext()) { QString subDir = iter.next(); - if (QFileInfo(PathCombine(subDir, "instance.cfg")).exists()) + if (!QFileInfo(PathCombine(subDir, "instance.cfg")).exists()) + continue; + + Instance *instPtr = NULL; + auto &loader = InstanceLoader::get(); + auto error = loader.loadInstance(instPtr, subDir); + + switch(error) { - Instance *instPtr = NULL; - - InstanceLoader::InstLoaderError error = InstanceLoader::get(). - loadInstance(instPtr, subDir); + case InstanceLoader::NoLoadError: + break; + case InstanceLoader::NotAnInstance: + break; + } + + if (error != InstanceLoader::NoLoadError && + error != InstanceLoader::NotAnInstance) + { + QString errorMsg = QString("Failed to load instance %1: "). + arg(QFileInfo(subDir).baseName()).toUtf8(); - if (error != InstanceLoader::NoError && - error != InstanceLoader::NotAnInstance) + switch (error) { - QString errorMsg = QString("Failed to load instance %1: "). - arg(QFileInfo(subDir).baseName()).toUtf8(); - - switch (error) - { - default: - errorMsg += QString("Unknown instance loader error %1"). - arg(error); - break; - } - qDebug(errorMsg.toUtf8()); - } - else if (!instPtr) - { - qDebug(QString("Error loading instance %1. Instance loader returned null."). - arg(QFileInfo(subDir).baseName()).toUtf8()); + default: + errorMsg += QString("Unknown instance loader error %1"). + arg(error); + break; } - else + qDebug(errorMsg.toUtf8()); + } + else if (!instPtr) + { + qDebug(QString("Error loading instance %1. Instance loader returned null."). + arg(QFileInfo(subDir).baseName()).toUtf8()); + } + else + { + QSharedPointer<Instance> inst(instPtr); + auto iter = groupMap.find(inst->id()); + if(iter != groupMap.end()) { - QSharedPointer<Instance> inst(instPtr); - auto iter = groupMap.find(inst->id()); - if(iter != groupMap.end()) - { - inst->setGroup((*iter)); - } - qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); - inst->setParent(this); - m_instances.append(inst); - connect(instPtr, SIGNAL(propertiesChanged(Instance*)),this, SLOT(propertiesChanged(Instance*))); + inst->setGroup((*iter)); } + qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); + inst->setParent(this); + m_instances.append(inst); + connect(instPtr, SIGNAL(propertiesChanged(Instance*)),this, SLOT(propertiesChanged(Instance*))); } } emit invalidated(); |