Connection* ConfigHelper::configJsonToConnection(const QString &file) { QFile JSONFile(file); JSONFile.open(QIODevice::ReadOnly | QIODevice::Text); if (!JSONFile.isOpen()) { qCritical() << "Error: cannot open " << file; } if(!JSONFile.isReadable()) { qCritical() << "Error: cannot read " << file; } QJsonParseError pe; QJsonDocument JSONDoc = QJsonDocument::fromJson(JSONFile.readAll(), &pe); JSONFile.close(); if (pe.error != QJsonParseError::NoError) { qCritical() << pe.errorString(); } if (JSONDoc.isEmpty()) { qCritical() << "JSON Document" << file << "is empty!"; return nullptr; } QJsonObject configObj = JSONDoc.object(); SQProfile p; p.serverAddress = configObj["server"].toString(); p.serverPort = configObj["server_port"].toInt(); p.localAddress = configObj["local_address"].toString(); p.localPort = configObj["local_port"].toInt(); p.method = configObj["method"].toString(); p.password = configObj["password"].toString(); p.timeout = configObj["timeout"].toInt(); Connection *con = new Connection(p, this); return con; }
void Configuration::save() { QJsonArray newConfArray; for (QList<SSProfile>::iterator it = profileList.begin(); it != profileList.end(); ++it) { QJsonObject json; json["backend"] = QJsonValue(it->backend); json["type"] = QJsonValue(it->type); json["profile"] = QJsonValue(it->profileName); json["server"] = QJsonValue(it->server); json["server_port"] = QJsonValue(it->server_port); json["password"] = QJsonValue(it->password); json["local_address"] = QJsonValue(it->local_addr); json["local_port"] = QJsonValue(it->local_port); json["method"] = QJsonValue(it->method.isEmpty() ? QString("table") : it->method.toLower());//lower-case in config json["timeout"] = QJsonValue(it->timeout); if (tfo_available) { json["fast_open"] = QJsonValue(it->fast_open); } newConfArray.append(QJsonValue(json)); } QJsonObject JSONObj; JSONObj["index"] = QJsonValue(m_index); JSONObj["debug"] = QJsonValue(debugLog); JSONObj["autoHide"] = QJsonValue(autoHide); JSONObj["autoStart"] = QJsonValue(autoStart); JSONObj["translucent"] = QJsonValue(translucent); JSONObj["configs"] = QJsonValue(newConfArray); QJsonDocument JSONDoc(JSONObj); QFile JSONFile(m_file); JSONFile.open(QIODevice::WriteOnly | QIODevice::Text); if (JSONFile.isWritable()) { JSONFile.write(JSONDoc.toJson()); } else { qWarning() << "Warning: file is not writable!"; } JSONFile.close(); }
void ConfigHelper::exportGuiConfigJson(const QString &file) { QJsonArray confArray; int size = model->rowCount(); for (int i = 0; i < size; ++i) { Connection *con = model->getItem(i)->getConnection(); QJsonObject json; json["remarks"] = QJsonValue(con->profile.name); json["method"] = QJsonValue(con->profile.method.toLower()); json["password"] = QJsonValue(con->profile.password); json["server_port"] = QJsonValue(con->profile.serverPort); json["server"] = QJsonValue(con->profile.serverAddress); confArray.append(QJsonValue(json)); } QJsonObject JSONObj; JSONObj["configs"] = QJsonValue(confArray); JSONObj["localPort"] = QJsonValue(1080); JSONObj["shareOverLan"] = QJsonValue(false); QJsonDocument JSONDoc(JSONObj); QFile JSONFile(file); JSONFile.open(QIODevice::WriteOnly | QIODevice::Text); if (!JSONFile.isOpen()) { qCritical() << "Error: cannot open " << file; return; } if(!JSONFile.isWritable()) { qCritical() << "Error: cannot write into " << file; return; } JSONFile.write(JSONDoc.toJson()); JSONFile.close(); }
void ConfigHelper::importGuiConfigJson(const QString &file) { QFile JSONFile(file); JSONFile.open(QIODevice::ReadOnly | QIODevice::Text); if (!JSONFile.isOpen()) { qCritical() << "Error: cannot open " << file; return; } if(!JSONFile.isReadable()) { qCritical() << "Error: cannot read " << file; return; } QJsonParseError pe; QJsonDocument JSONDoc = QJsonDocument::fromJson(JSONFile.readAll(), &pe); JSONFile.close(); if (pe.error != QJsonParseError::NoError) { qCritical() << pe.errorString(); } if (JSONDoc.isEmpty()) { qCritical() << "JSON Document" << file << "is empty!"; return; } QJsonObject JSONObj = JSONDoc.object(); QJsonArray CONFArray = JSONObj["configs"].toArray(); if (CONFArray.isEmpty()) { qWarning() << "configs in " << file << " is empty."; return; } for (QJsonArray::iterator it = CONFArray.begin(); it != CONFArray.end(); ++it) { QJsonObject json = (*it).toObject(); SQProfile p; /* * shadowsocks-csharp uses remarks to store profile name, which is different from * old shadowsocks-qt5's implementation. It also uses int to store ports directly * and it doesn't have some certain keys. */ if (json.contains("remarks")) { p.name = json["remarks"].toString(); p.serverPort = json["server_port"].toInt(); //shadowsocks-csharp has only global local port (all profiles use the same port) p.localPort = JSONObj["localPort"].toInt(); if (JSONObj["shareOverLan"].toBool()) { /* * it can only configure share over LAN or not (also a global value) * which is basically 0.0.0.0 or 127.0.0.1 (which is the default) */ p.localAddress = QString("0.0.0.0"); } } else { p.name = json["profile"].toString(); p.serverPort = json["server_port"].toString().toUShort(); p.localAddress = json["local_address"].toString(); p.localPort = json["local_port"].toString().toUShort(); p.timeout = json["timeout"].toString().toInt(); } p.serverAddress = json["server"].toString(); p.method = json["method"].toString(); p.password = json["password"].toString(); Connection *con = new Connection(p, this); model->appendConnection(con); } }
void Configuration::setJSONFile(const QString &file) { m_file = QDir::toNativeSeparators(file); QFile JSONFile(m_file); if (!JSONFile.exists()) { qWarning() << "Warning: gui-config.json does not exist!"; m_index = -1; debugLog = false; autoStart = false; autoHide = false; translucent = true; return; } JSONFile.open(QIODevice::ReadOnly | QIODevice::Text); if (!JSONFile.isOpen()) { qWarning() << "Critical Error: cannot open gui-config.json!"; } if(!JSONFile.isReadable()) { qWarning() << "Critical Error: cannot read gui-config.json!"; } QJsonParseError pe; QJsonDocument JSONDoc = QJsonDocument::fromJson(JSONFile.readAll(), &pe); if (pe.error != QJsonParseError::NoError) { qWarning() << pe.errorString(); } if (JSONDoc.isEmpty()) { qWarning() << "Warning: JSON Document" << m_file << "is empty!"; } QJsonObject JSONObj = JSONDoc.object(); QJsonArray CONFArray = JSONObj["configs"].toArray(); profileList.clear();//clear list before if (CONFArray.isEmpty()) { qWarning() << "configs is empty. Please check your gui-config.json"; m_index = -1;//apparently m_index is invalid. } else { for (QJsonArray::iterator it = CONFArray.begin(); it != CONFArray.end(); ++it) { QJsonObject json = (*it).toObject(); SSProfile p; p.backend = json["backend"].toString(); p.type = json["type"].toString(); p.profileName = json["profile"].toString(); p.server = json["server"].toString(); p.password = json["password"].toString(); p.server_port = json["server_port"].toString(); p.local_addr = json["local_address"].toString(); p.local_port = json["local_port"].toString(); p.method = json["method"].toString().toUpper();//using Upper-case in GUI p.timeout = json["timeout"].toString(); if (tfo_available) { p.fast_open = json["fast_open"].toBool(); } profileList << p; } m_index = JSONObj["index"].toInt(); } debugLog = JSONObj["debug"].toBool(); autoHide = JSONObj["autoHide"].toBool(); autoStart = JSONObj["autoStart"].toBool(); translucent = JSONObj["translucent"].toBool(); JSONFile.close(); }