Added a better config upgrade algo,

changed translations,
changed ConnectionEdit Window functions,
changed a config key

Signed-off-by: Leroy.H.Y <lhy20010403@hotmail.com>

Former-commit-id: 171fb9d2b0
This commit is contained in:
Leroy.H.Y 2019-09-11 14:40:51 +08:00
parent 1545d4890d
commit 22167522ee
17 changed files with 563 additions and 448 deletions

View File

@ -7,7 +7,7 @@
#define QV2RAY_VERSION_STRING "v" QV_MAJOR_VERSION ".0.0"
#define QV2RAY_CONFIG_VERSION 2
#define QV2RAY_CONFIG_VERSION 3
#define QV2RAY_CONFIG_DIR_PATH (Qv2ray::Utils::GetConfigDirPath() + "/")
#define QV2RAY_CONFIG_FILE_PATH (QV2RAY_CONFIG_DIR_PATH + "Qv2ray.conf")
@ -85,7 +85,7 @@ namespace Qv2ray
string ignoredVersion;
//
bool proxyDefault;
bool proxyCN;
bool bypassCN;
bool withLocalDNS;
list<string> dnsList;
//
@ -97,7 +97,7 @@ namespace Qv2ray
#endif
map<string, string> subscribes;
MuxObject mux;
Qv2rayConfig(): config_version(QV2RAY_CONFIG_VERSION), runAsRoot(false), logLevel(), proxyDefault(), proxyCN(), withLocalDNS(), inBoundSettings(), configs(), subscribes(), mux() { }
Qv2rayConfig(): config_version(QV2RAY_CONFIG_VERSION), runAsRoot(false), logLevel(), proxyDefault(), bypassCN(), withLocalDNS(), inBoundSettings(), configs(), subscribes(), mux() { }
Qv2rayConfig(string lang, string exePath, string assetsPath, int log, Qv2rayBasicInboundsConfig _inBoundSettings): Qv2rayConfig()
{
// These settings below are defaults.
@ -113,11 +113,11 @@ namespace Qv2ray
dnsList.push_back("8.8.8.8");
dnsList.push_back("1.1.1.1");
dnsList.push_back("4.4.4.4");
proxyCN = false;
bypassCN = true;
proxyDefault = true;
withLocalDNS = true;
}
XTOSTRUCT(O(config_version, runAsRoot, logLevel, language, autoStartConfig, ignoredVersion, v2CorePath, v2AssetsPath, proxyDefault, proxyCN, withLocalDNS, dnsList, inBoundSettings, mux, configs, subscribes))
XTOSTRUCT(O(config_version, runAsRoot, logLevel, language, autoStartConfig, ignoredVersion, v2CorePath, v2AssetsPath, proxyDefault, bypassCN, withLocalDNS, dnsList, inBoundSettings, mux, configs, subscribes))
};
QJsonObject UpgradeConfig(int fromVersion, int toVersion, QJsonObject root);

View File

@ -5,7 +5,6 @@
#include "Qv2rayBase.h"
#define UPGRADELOG(item, old, _new) LOG(MODULE_CONFIG, "Upgrading " item " from old value " + old + " to " + _new);
#define XConfLog(oldVersion, newVersion) LOG(MODULE_CONFIG, "Migrating config from version " + oldVersion + " to " + newVersion);
namespace Qv2ray
@ -16,17 +15,28 @@ namespace Qv2ray
QJsonObject UpgradeConfig_Inc(int fromVersion, QJsonObject root)
{
XConfLog(to_string(fromVersion), to_string(fromVersion + 1))
//
auto v1_oldConfigVersion = root["config_version"].toString();
auto v2_oldProxyCN = root["proxyCN"].toBool();
//
switch (fromVersion) {
case 1:
// From 1 to 2, we changed the config_version from 'string' to 'int'
auto old_config_version = root["config_version"].toString();
root.remove("config_version");
root["config_version"] = 2;
UPGRADELOG("config_version", old_config_version.toStdString(), "2")
LOG(MODULE_CONFIG, ("Upgrading config_version from old value " + v1_oldConfigVersion.toStdString() + " to 2"))
break;
case 2:
// From 2 to 3, we changed the "proxyCN" to "bypassCN" as it's easier to understand....
root.remove("proxyCN");
root.insert("bypassCN", !v2_oldProxyCN);
LOG(MODULE_CONFIG, ("Upgrading proxyCN to bypassCN and changed the value to " + to_string(!v2_oldProxyCN)))
break;
}
root.insert("config_version", fromVersion + 1);
return root;
}

View File

@ -62,6 +62,7 @@ namespace Qv2ray
QMap<QString, QJsonObject> GetConnections(list<string> connections);
// Startup Prepares
int StartPreparation(QJsonObject fullConfig);
int FindIndexByTag(QJsonArray list, QString *tag);
}
}

View File

@ -110,5 +110,17 @@ namespace Qv2ray
StringToFile(json, new QFile(QV2RAY_GENERATED_FILE_PATH));
return 0;
}
int FindIndexByTag(QJsonArray list, QString *tag)
{
for (int i = 0; i < list.count(); i++) {
auto value = list[i].toObject();
if (value.contains("tag") && value["tag"].toString() == *tag)
return i;
}
return -1;
}
}
}

View File

@ -172,7 +172,7 @@ namespace Qv2ray
// We don't add extra routings.
// We don't use QV2RAY_CONFIG_TYPE_FILE checking scheme because not all connections have this part.
if (!root.contains("routing")) {
auto routeObject = GenerateRoutes(gConf.proxyDefault, gConf.proxyCN);
auto routeObject = GenerateRoutes(gConf.proxyDefault, gConf.bypassCN);
root.insert("routing", routeObject);
}

View File

@ -81,14 +81,19 @@ bool initQv()
auto confVersion = conf["config_version"].toVariant().toString();
auto newVersion = QSTRING(to_string(QV2RAY_CONFIG_VERSION));
if (QString::compare(confVersion, newVersion) != 0) {
conf = UpgradeConfig(stoi(conf["config_version"].toString().toStdString()), QV2RAY_CONFIG_VERSION, conf);
if (confVersion != newVersion) {
conf = UpgradeConfig(stoi(conf["config_version"].toVariant().toString().toStdString()), QV2RAY_CONFIG_VERSION, conf);
}
try {
auto confObject = StructFromJsonString<Qv2rayConfig>(JsonToString(conf));
SetGlobalConfig(confObject);
SaveGlobalConfig();
LOG(MODULE_INIT, "Loaded config file.")
} catch (...) {
LOG(MODULE_INIT, "FAILED TO LOAD config file. This is an error and should be reported, Qv2ray will now exit.")
return false;
}
}
return true;
@ -113,9 +118,12 @@ int main(int argc, char *argv[])
#endif
//
QApplication _qApp(argc, argv);
//
// Qv2ray Initialize
initQv();
if (!initQv())
return -1;
//
#ifdef _WIN32
// Set special font in Windows

View File

@ -8,7 +8,7 @@
ConnectionEditWindow::ConnectionEditWindow(QWidget *parent)
: QDialog(parent),
_alias(),
Alias(),
ui(new Ui::ConnectionEditWindow),
stream(),
vmess(),
@ -27,29 +27,27 @@ ConnectionEditWindow::ConnectionEditWindow(QWidget *parent)
ReLoad_GUI_JSON_ModelContent();
}
ConnectionEditWindow::ConnectionEditWindow(QJsonObject editRootObject, QString alias, QWidget *parent)
ConnectionEditWindow::ConnectionEditWindow(QJsonObject outboundEntry, QString *alias, QWidget *parent)
: ConnectionEditWindow(parent)
{
_alias = alias;
originalRoot = editRootObject;
auto outBoundRoot = originalRoot["outbounds"].toArray().first().toObject();
OutboundType = outBoundRoot["protocol"].toString();
Alias = alias == nullptr ? "" : *alias;
OutboundType = outboundEntry["protocol"].toString();
if (OutboundType == "vmess") {
vmess = StructFromJsonString<VMessServerObject>(JsonToString(outBoundRoot["settings"].toObject()["vnext"].toArray().first().toObject()));
stream = StructFromJsonString<StreamSettingsObject>(JsonToString(outBoundRoot["streamSettings"].toObject()));
vmess = StructFromJsonString<VMessServerObject>(JsonToString(outboundEntry["settings"].toObject()["vnext"].toArray().first().toObject()));
stream = StructFromJsonString<StreamSettingsObject>(JsonToString(outboundEntry["streamSettings"].toObject()));
shadowsocks.port = vmess.port;
shadowsocks.address = vmess.address;
socks.address = vmess.address;
socks.port = vmess.port;
} else if (OutboundType == "shadowsocks") {
shadowsocks = StructFromJsonString<ShadowSocksServer>(JsonToString(outBoundRoot["settings"].toObject()["servers"].toArray().first().toObject()));
shadowsocks = StructFromJsonString<ShadowSocksServer>(JsonToString(outboundEntry["settings"].toObject()["servers"].toArray().first().toObject()));
vmess.address = shadowsocks.address;
vmess.port = shadowsocks.port;
socks.address = shadowsocks.address;
socks.port = shadowsocks.port;
} else if (OutboundType == "socks") {
socks = StructFromJsonString<SocksServerObject>(JsonToString(outBoundRoot["settings"].toObject()["servers"].toArray().first().toObject()));
socks = StructFromJsonString<SocksServerObject>(JsonToString(outboundEntry["settings"].toObject()["servers"].toArray().first().toObject()));
vmess.address = socks.address;
vmess.port = socks.port;
shadowsocks.address = socks.address;
@ -139,30 +137,30 @@ void ConnectionEditWindow::ReLoad_GUI_JSON_ModelContent()
void ConnectionEditWindow::on_buttonBox_accepted()
{
bool is_new_config = _alias == "";
auto alias = is_new_config ? (ui->ipLineEdit->text() + "_" + ui->portLineEdit->text()) : _alias;
// TODO : NAMING THE CONNECTION
auto alias = Alias == "" ? (ui->ipLineEdit->text() + "_" + ui->portLineEdit->text()) : Alias;
//
auto outbound = GenerateConnectionJson();
QJsonArray outbounds;
outbounds.append(outbound);
// We want to replace because it's connection edit window.
if (originalRoot.contains("outbounds")) {
originalRoot.remove("outbounds");
}
originalRoot.insert("outbounds", outbounds);
originalRoot.insert(QV2RAY_CONFIG_TYPE_JSON_KEY, QV2RAY_CONFIG_TYPE_MANUAL);
SaveConnectionConfig(originalRoot, &alias);
auto globalConf = GetGlobalConfig();
if (is_new_config) {
// New config...
globalConf.configs.push_back(alias.toStdString());
}
SetGlobalConfig(globalConf);
emit s_reload_config(!is_new_config);
Result = GenerateConnectionJson();
//QJsonArray outbounds;
//outbounds.append(outbound);
//
/// We want to replace because it's connection edit window.
//if (originalRoot.contains("outbounds")) {
// originalRoot.remove("outbounds");
//}
//
//originalRoot.insert("outbounds", outbounds);
//originalRoot.insert(QV2RAY_CONFIG_TYPE_JSON_KEY, QV2RAY_CONFIG_TYPE_MANUAL);
//SaveConnectionConfig(originalRoot, &alias);
//auto globalConf = GetGlobalConfig();
//
//if (is_new_config) {
// // New config...
// globalConf.configs.push_back(alias.toStdString());
//}
//
//SetGlobalConfig(globalConf);
//emit s_reload_config(!is_new_config);
}
void ConnectionEditWindow::on_ipLineEdit_textEdited(const QString &arg1)

View File

@ -17,7 +17,9 @@ class ConnectionEditWindow : public QDialog
public:
explicit ConnectionEditWindow(QWidget *parent = nullptr);
explicit ConnectionEditWindow(QJsonObject editRootObject, QString alias, QWidget *parent = nullptr);
explicit ConnectionEditWindow(QJsonObject editRootObject, QString *alias, QWidget *parent = nullptr);
QJsonObject Result;
QString Alias;
~ConnectionEditWindow();
signals:
void s_reload_config(bool need_restart);
@ -114,10 +116,8 @@ class ConnectionEditWindow : public QDialog
private:
int rootJsonCursorPos;
QString _alias;
void ReLoad_GUI_JSON_ModelContent();
QJsonObject GenerateConnectionJson();
QJsonObject originalRoot;
Ui::ConnectionEditWindow *ui;
//
// Connection Configs

View File

@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>#EditConnectionSettings</string>
<string>EditConnectionSettings</string>
</property>
<property name="modal">
<bool>true</bool>
@ -32,40 +32,82 @@
<item>
<layout class="QFormLayout" name="formLayout_5">
<item row="0" column="0">
<widget class="QLabel" name="ipLabel">
<widget class="QLabel" name="portLabel_3">
<property name="text">
<string>#Host</string>
<string>Identifier</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="ipLineEdit"/>
<layout class="QHBoxLayout" name="horizontalLayout_5" stretch="1,4,1,4">
<item>
<widget class="QLabel" name="ipLabel_2">
<property name="text">
<string>Alias</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item>
<widget class="QLabel" name="ipLabel_3">
<property name="text">
<string>Tag</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_2"/>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="portLabel">
<widget class="QLabel" name="label_32">
<property name="text">
<string>#Port</string>
<string>Server</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="1,4,1,4">
<item>
<widget class="QLabel" name="ipLabel">
<property name="text">
<string>Host</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="ipLineEdit"/>
</item>
<item>
<widget class="QLabel" name="portLabel">
<property name="text">
<string>Port</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="portLineEdit">
<property name="maxLength">
<number>5</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_25">
<property name="text">
<string>#Outbound</string>
<string>Type</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="outBoundTypeCombo">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -92,7 +134,7 @@
<item>
<widget class="QGroupBox" name="outboundSettingWrapper">
<property name="title">
<string>#OutBoundSettings</string>
<string>OutBoundSettings</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
@ -113,7 +155,7 @@
<item row="0" column="0">
<widget class="QLabel" name="idLabel">
<property name="text">
<string>#UUID</string>
<string>UUID</string>
</property>
</widget>
</item>
@ -130,7 +172,7 @@
<item row="1" column="0">
<widget class="QLabel" name="alterLabel">
<property name="text">
<string>#AlterID</string>
<string>Alter ID</string>
</property>
</widget>
</item>
@ -144,7 +186,7 @@
<item row="2" column="0">
<widget class="QLabel" name="securityLabel">
<property name="text">
<string>#Security</string>
<string>Security</string>
</property>
</widget>
</item>
@ -181,21 +223,21 @@
<item row="3" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>#UseTLS</string>
<string>Use TLS</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="tlsCB">
<property name="text">
<string>#Enabled</string>
<string>Enabled</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="transportLabel">
<property name="text">
<string>#Transport</string>
<string>Transport</string>
</property>
</widget>
</item>
@ -238,7 +280,7 @@
<item>
<widget class="QGroupBox" name="transportGroupbox">
<property name="title">
<string>#TransportSettings</string>
<string>TransportSettings</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
@ -257,28 +299,28 @@
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>#Request</string>
<string>Request</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="tcpRequestPrettifyBtn">
<property name="text">
<string>#Prettify</string>
<string>Prettify</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>#Response</string>
<string>Response</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="tcpRespPrettifyBtn">
<property name="text">
<string>#Prettify</string>
<string>Prettify</string>
</property>
</widget>
</item>
@ -320,14 +362,14 @@
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="tcpRequestDefBtn">
<property name="text">
<string>#InsertDefaultContent</string>
<string>Default Value</string>
</property>
</widget>
</item>
<item row="3" column="2" colspan="2">
<widget class="QPushButton" name="tcpRespDefBtn">
<property name="text">
<string>#InsertDefaultContent</string>
<string>Default Value</string>
</property>
</widget>
</item>
@ -336,7 +378,7 @@
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>#Type</string>
<string>Type</string>
</property>
</widget>
</item>
@ -363,7 +405,7 @@
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>#Path</string>
<string>Path</string>
</property>
</widget>
</item>
@ -373,7 +415,7 @@
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>#Host</string>
<string>Host</string>
</property>
</widget>
</item>
@ -389,7 +431,7 @@
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>#Path</string>
<string>Path</string>
</property>
</widget>
</item>
@ -405,14 +447,14 @@
<item row="1" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
<string>#Headers</string>
<string>Headers</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>#key|value format</string>
<string>Format: Key|Value</string>
</property>
</widget>
</item>
@ -426,7 +468,7 @@
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>#MTU</string>
<string>MTU</string>
</property>
</widget>
</item>
@ -452,7 +494,7 @@
<item row="1" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>#TTI (ms)</string>
<string>TTI (ms)</string>
</property>
</widget>
</item>
@ -478,7 +520,7 @@
<item row="2" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>#UplinkCapacity (MB/s)</string>
<string>Uplink Capacity (MB/s)</string>
</property>
</widget>
</item>
@ -501,21 +543,21 @@
<item row="3" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>#Congestion</string>
<string>Congestion</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="kcpCongestionCB">
<property name="text">
<string>#Enabled</string>
<string>Enabled</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>#DownlinkCapacity (MB/s)</string>
<string>Downlink Capacity (MB/s)</string>
</property>
</widget>
</item>
@ -538,7 +580,7 @@
<item row="5" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>#ReadBufferSize (MB)</string>
<string>Read Buffer Size (MB)</string>
</property>
</widget>
</item>
@ -561,7 +603,7 @@
<item row="6" column="0">
<widget class="QLabel" name="labelx">
<property name="text">
<string>#WriteBufferSize (MB)</string>
<string>Write Buffer Size (MB)</string>
</property>
</widget>
</item>
@ -584,7 +626,7 @@
<item row="7" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>#Type</string>
<string>Type</string>
</property>
</widget>
</item>
@ -637,7 +679,7 @@
<item row="0" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>#Path</string>
<string>Path</string>
</property>
</widget>
</item>
@ -657,7 +699,7 @@
<item row="0" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>#Security</string>
<string>Security</string>
</property>
</widget>
</item>
@ -689,7 +731,7 @@
<item row="2" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>#Key</string>
<string>Key</string>
</property>
</widget>
</item>
@ -703,7 +745,7 @@
<item row="3" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>#Headers</string>
<string>Headers</string>
</property>
</widget>
</item>
@ -754,7 +796,7 @@
<item row="0" column="0">
<widget class="QLabel" name="label_28">
<property name="text">
<string>#Mark</string>
<string>Mark</string>
</property>
</widget>
</item>
@ -764,21 +806,21 @@
<item row="1" column="0">
<widget class="QLabel" name="label_29">
<property name="text">
<string>#TCPFastOpen</string>
<string>TCP Fast Open</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="tcpFastOpenCB">
<property name="text">
<string>#Enabled</string>
<string>Enabled</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_27">
<property name="text">
<string>#TProxy</string>
<string>TProxy</string>
</property>
</widget>
</item>
@ -815,21 +857,21 @@
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>#Email</string>
<string>Email</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>#Password</string>
<string>Password</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>#EncryptionMethod</string>
<string>Encryption Method</string>
</property>
</widget>
</item>
@ -881,7 +923,7 @@
<item row="3" column="0">
<widget class="QLabel" name="label_24">
<property name="text">
<string>#Level</string>
<string>Level</string>
</property>
</widget>
</item>
@ -891,14 +933,14 @@
<item row="4" column="0">
<widget class="QLabel" name="label_30">
<property name="text">
<string>#OTA</string>
<string>OTA</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="ss_otaCheckBox">
<property name="text">
<string>#Enabled</string>
<string>Enabled</string>
</property>
</widget>
</item>
@ -918,7 +960,7 @@
<item row="2" column="0">
<widget class="QLabel" name="label_31">
<property name="text">
<string>#Password</string>
<string>Password</string>
</property>
</widget>
</item>
@ -928,7 +970,7 @@
<item row="1" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>#Username</string>
<string>Username</string>
</property>
</widget>
</item>
@ -951,10 +993,6 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>ipLineEdit</tabstop>
<tabstop>portLineEdit</tabstop>
</tabstops>
<resources/>
<connections>
<connection>

View File

@ -484,8 +484,12 @@ void MainWindow::on_addConfigButton_clicked()
ConnectionEditWindow *w = new ConnectionEditWindow(this);
connect(w, &ConnectionEditWindow::s_reload_config, this, &MainWindow::save_reload_globalconfig);
w->exec();
LOG(MODULE_UI, "WARNING:")
LOG(MODULE_UI, "THIS FEATURE IS NOT IMPLEMENTED YET!")
auto outboundEntry = w->Result;
auto alias = w->Alias;
delete w;
}
void MainWindow::on_editConfigButton_clicked()
{
// Check if we have a connection selected...
@ -496,11 +500,16 @@ void MainWindow::on_editConfigButton_clicked()
return;
}
ConnectionEditWindow *w = new ConnectionEditWindow(connections[ui->connectionListWidget->currentItem()->text()], ui->connectionListWidget->currentItem()->text(), this);
connect(w, &ConnectionEditWindow::s_reload_config, this, &MainWindow::save_reload_globalconfig);
auto alias = ui->connectionListWidget->currentItem()->text();
auto outBoundRoot = connections[ui->connectionListWidget->currentItem()->text()]["outbounds"].toArray().first().toObject();
ConnectionEditWindow *w = new ConnectionEditWindow(outBoundRoot, &alias, this);
//connect(w, &ConnectionEditWindow::s_reload_config, this, &MainWindow::save_reload_globalconfig);
w->exec();
auto outboundEntry = w->Result;
LOG(MODULE_UI, "WARNING:")
LOG(MODULE_UI, "THIS FEATURE IS NOT IMPLEMENTED YET!")
delete w;
}
void MainWindow::on_editConfigAdvButton_clicked()
{
// Check if we have a connection selected...
@ -511,6 +520,7 @@ void MainWindow::on_editConfigAdvButton_clicked()
return;
}
RouteEditor *w = new RouteEditor(connections[ui->connectionListWidget->currentItem()->text()], ui->connectionListWidget->currentItem()->text(), this);
auto alias = ui->connectionListWidget->currentItem()->text();
RouteEditor *w = new RouteEditor(connections[ui->connectionListWidget->currentItem()->text()], alias, this);
w->exec();
}

View File

@ -59,7 +59,7 @@ PrefrencesWindow::PrefrencesWindow(QWidget *parent) : QDialog(parent),
ui->muxEnabledCB->setChecked(CurrentConfig.mux.enabled);
ui->muxConcurrencyTxt->setValue(CurrentConfig.mux.concurrency);
//
ui->proxyCNCb->setChecked(CurrentConfig.proxyCN);
ui->bypassCNCb->setChecked(CurrentConfig.bypassCN);
ui->proxyDefaultCb->setChecked(CurrentConfig.proxyDefault);
ui->localDNSCb->setChecked(CurrentConfig.withLocalDNS);
//
@ -265,12 +265,6 @@ void PrefrencesWindow::on_socksAuthPasswordTxt_textEdited(const QString &arg1)
CurrentConfig.inBoundSettings.socksAccount.pass = arg1.toStdString();
}
void PrefrencesWindow::on_proxyCNCb_stateChanged(int arg1)
{
NEEDRESTART
CurrentConfig.proxyCN = arg1 == Qt::Checked;
}
void PrefrencesWindow::on_proxyDefaultCb_stateChanged(int arg1)
{
NEEDRESTART
@ -339,3 +333,9 @@ void PrefrencesWindow::on_cancelIgnoreVersionBtn_clicked()
CurrentConfig.ignoredVersion.clear();
ui->cancelIgnoreVersionBtn->setEnabled(false);
}
void PrefrencesWindow::on_bypassCNCb_stateChanged(int arg1)
{
NEEDRESTART
CurrentConfig.bypassCN = arg1 == Qt::Checked;
}

View File

@ -56,8 +56,6 @@ class PrefrencesWindow : public QDialog
void on_socksAuthPasswordTxt_textEdited(const QString &arg1);
void on_proxyCNCb_stateChanged(int arg1);
void on_proxyDefaultCb_stateChanged(int arg1);
void on_localDNSCb_stateChanged(int arg1);
@ -74,6 +72,8 @@ class PrefrencesWindow : public QDialog
void on_cancelIgnoreVersionBtn_clicked();
void on_bypassCNCb_stateChanged(int arg1);
private:
bool IsConnectionPropertyChanged = false;
bool finishedLoading = false;

View File

@ -29,7 +29,7 @@
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>0</number>
<number>3</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
@ -425,7 +425,7 @@
<item row="1" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Chinese Addresses</string>
<string>Bypass Chinese Mainland</string>
</property>
</widget>
</item>
@ -437,7 +437,7 @@
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="proxyCNCb">
<widget class="QCheckBox" name="bypassCNCb">
<property name="text">
<string>Enabled</string>
</property>

View File

@ -1,5 +1,7 @@
#include "w_RouteEditor.h"
#include "QvCoreConfigOperations.h"
#include "ui_w_RouteEditor.h"
#include "w_ConnectionEditWindow.h"
RouteEditor::RouteEditor(QJsonObject connection, const QString alias, QWidget *parent) :
QDialog(parent),
@ -15,25 +17,22 @@ RouteEditor::RouteEditor(QJsonObject connection, const QString alias, QWidget *p
foreach (auto out, outbounds) {
bool hasTag = out.toObject().contains("tag");
if (hasTag) {
ui->outboundsList->addItem(out.toObject()["tag"].toString());
} else {
ui->outboundsList->addItem(out.toObject()["protocol"].toString());
}
//
auto protocol = out.toObject()["protocol"].toString();
auto tag = hasTag ? out.toObject()["tag"].toString() : tr("NoTag");
//
ui->outboundsList->addItem(tag + " (" + protocol + ")");
}
foreach (auto in, inbounds) {
bool hasTag = in.toObject().contains("tag");
auto inItem = new QListWidgetItem();
//
auto tag = hasTag ? in.toObject()["tag"].toString() : tr("NoTag");
auto protocol = in.toObject()["protocol"].toString();
auto port = in.toObject()["port"].toVariant().toString();
//
auto inItem = new QListWidgetItem(tag + " (" + protocol + ": " + port + ")");
inItem->setCheckState(Qt::Unchecked);
if (hasTag) {
inItem->setText(in.toObject()["tag"].toString());
} else {
inItem->setText(in.toObject()["protocol"].toString());
}
ui->inboundsList->addItem(inItem);
}
@ -65,25 +64,32 @@ void RouteEditor::on_outboundsList_currentRowChanged(int currentRow)
{
LOG(MODULE_UI, "Outbound selected: " + to_string(currentRow))
auto outBoundRoot = outbounds[currentRow].toObject();
ui->outboundTagLabel->setText(outBoundRoot.contains("tag") ? outBoundRoot["tag"].toString() : tr("#NoTag"));
//
auto outboundType = outBoundRoot["protocol"].toString();
ui->outboundTagLabel->setText(outBoundRoot.contains("tag") ? outBoundRoot["tag"].toString() : tr("NoTag"));
//
ui->outboundTypeLabel->setText(outboundType);
string serverAddress = "N/A";
string serverPort = "N/A";
if (outboundType == "vmess") {
auto x = StructFromJsonString<VMessServerObject>(JsonToString(outBoundRoot["settings"].toObject()["vnext"].toArray().first().toObject()));
ui->outboundAddressLabel->setText(QSTRING(x.address));
ui->outboundPortLabel->setText(QSTRING(to_string(x.port)));
serverAddress = x.address;
serverPort = to_string(x.port);
} else if (outboundType == "shadowsocks") {
auto x = JsonToString(outBoundRoot["settings"].toObject()["servers"].toArray().first().toObject());
auto Server = StructFromJsonString<ShadowSocksServer>(x);
ui->outboundAddressLabel->setText(QSTRING(Server.address));
ui->outboundPortLabel->setText(QSTRING(to_string(Server.port)));
serverAddress = Server.address;
serverPort = to_string(Server.port);
} else if (outboundType == "socks") {
auto x = JsonToString(outBoundRoot["settings"].toObject()["servers"].toArray().first().toObject());
auto Server = StructFromJsonString<SocksServerObject>(x);
ui->outboundAddressLabel->setText(QSTRING(Server.address));
ui->outboundPortLabel->setText(QSTRING(to_string(Server.port)));
serverAddress = Server.address;
serverPort = to_string(Server.port);
}
ui->outboundAddressLabel->setText(QSTRING(serverAddress));
ui->outboundPortLabel->setText(QSTRING(serverPort));
}
void RouteEditor::on_inboundsList_currentRowChanged(int currentRow)
@ -104,7 +110,8 @@ void RouteEditor::on_routesTable_cellClicked(int row, int column)
Q_UNUSED(column)
auto outboundTag = ui->routesTable->item(row, 2)->text();
ui->outboundsList->setCurrentItem(ui->outboundsList->findItems(outboundTag, Qt::MatchExactly).first());
int index = FindIndexByTag(outbounds, &outboundTag);
ui->outboundsList->setCurrentRow(index);
//
auto inboundTagList = ui->routesTable->item(row, 0)->text();
bool isAnyInbounds = inboundTagList == "Any";
@ -117,7 +124,19 @@ void RouteEditor::on_routesTable_cellClicked(int row, int column)
auto rulesList = QList<RuleObject>::fromStdList(routes.rules);
foreach (auto inboundTag, rulesList[row].inboundTag) {
ui->inboundsList->findItems(QSTRING(inboundTag), Qt::MatchExactly).first()->setCheckState(Qt::Checked);
auto inTag = QSTRING(inboundTag);
int index = FindIndexByTag(inbounds, &inTag);
ui->inboundsList->item(index)->setCheckState(Qt::Checked);
}
}
}
void RouteEditor::on_editOutboundBtn_clicked()
{
auto currentOutbound = outbounds[ui->outboundsList->currentRow()].toObject();
ConnectionEditWindow *w = new ConnectionEditWindow(currentOutbound, nullptr, this);
w->exec();
auto result = w->Result;
LOG(MODULE_UI, "NOT FINISHED YET")
delete w;
}

View File

@ -29,6 +29,8 @@ class RouteEditor : public QDialog
void on_routesTable_cellClicked(int row, int column);
void on_editOutboundBtn_clicked();
private:
QJsonArray inbounds;
QJsonArray outbounds;

View File

@ -13,13 +13,13 @@
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="1,2,1">
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1,0">
<item row="0" column="1">
<layout class="QVBoxLayout" name="routesLayout" stretch="0,1,0,1">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>#Routes</string>
<string>Routes List</string>
</property>
</widget>
</item>
@ -28,19 +28,25 @@
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<column>
<property name="text">
<string>#InBounds</string>
<string>InBounds</string>
</property>
</column>
<column>
<property name="text">
<string>#DomainOrIP</string>
<string>DomainOrIP</string>
</property>
</column>
<column>
<property name="text">
<string>#Outbound</string>
<string>Outbound</string>
</property>
</column>
</widget>
@ -85,7 +91,7 @@
<item>
<widget class="QPushButton" name="pushButton_5">
<property name="text">
<string>#ChangeIO</string>
<string>Change IO</string>
</property>
</widget>
</item>
@ -107,20 +113,20 @@
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>#RouteDetail</string>
<string>Route Information</string>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>#DomainList</string>
<string>Domains</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>#IPList</string>
<string>IPs</string>
</property>
</widget>
</item>
@ -134,7 +140,7 @@
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>#Inbounds</string>
<string>Inbound List</string>
</property>
</widget>
</item>
@ -168,7 +174,7 @@
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>#FromGlobalConfig</string>
<string>Add Default</string>
</property>
</widget>
</item>
@ -177,13 +183,13 @@
<item>
<widget class="QGroupBox" name="outboundDetailGroup_2">
<property name="title">
<string>#InboundDetail</string>
<string>Inbound Information</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>#Tag</string>
<string>Tag</string>
</property>
</widget>
</item>
@ -197,7 +203,7 @@
<item row="1" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>#Type</string>
<string>Type</string>
</property>
</widget>
</item>
@ -211,14 +217,14 @@
<item row="2" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>#Address</string>
<string>Address</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>#Port</string>
<string>Port</string>
</property>
</widget>
</item>
@ -246,7 +252,7 @@
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>#Outbounds</string>
<string>Outbound List</string>
</property>
</widget>
</item>
@ -284,7 +290,7 @@
<item>
<widget class="QPushButton" name="pushButton_4">
<property name="text">
<string>#AddDirect</string>
<string>Insert &quot;Direct&quot;</string>
</property>
</widget>
</item>
@ -293,13 +299,13 @@
<item>
<widget class="QGroupBox" name="outboundDetailGroup">
<property name="title">
<string>#OutboundDetail</string>
<string>Outbound Information</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>#Tag</string>
<string>Tag</string>
</property>
</widget>
</item>
@ -326,9 +332,9 @@
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<widget class="QPushButton" name="editOutboundBtn">
<property name="text">
<string>#EditCurrentOutbound</string>
<string>Edit</string>
</property>
</widget>
</item>
@ -350,21 +356,21 @@
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>#Type</string>
<string>Type</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>#Address</string>
<string>Address</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>#Port</string>
<string>Port</string>
</property>
</widget>
</item>
@ -407,7 +413,7 @@
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="statusLabel">
<property name="text">
<string>#Status</string>
<string>Status</string>
</property>
</widget>
</item>

View File

@ -5,12 +5,12 @@
<name>ConnectionEditWindow</name>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="26"/>
<source>#EditConnectionSettings</source>
<source>EditConnectionSettings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="37"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="358"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="376"/>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
@ -21,7 +21,7 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="61"/>
<source>Outbound Type</source>
<source>Outbound</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -31,185 +31,180 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="95"/>
<source>#OutBoundSettings</source>
<source>OutBoundSettings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="116"/>
<source>Use TLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="123"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="495"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="764"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="891"/>
<source>#Enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="130"/>
<source>UUID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="147"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="133"/>
<source>Alter ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="161"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="650"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="147"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="660"/>
<source>Security</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="192"/>
<source>Transport Method</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="184"/>
<source>Use TLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="191"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="511"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="774"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="901"/>
<source>Enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="198"/>
<source>Transport</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="241"/>
<source>#TransportSettings</source>
<source>TransportSettings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="270"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="575"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="279"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="260"/>
<source>Request</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="286"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="300"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="267"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="281"/>
<source>Prettify</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="293"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="274"/>
<source>Response</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="323"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="330"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="337"/>
<source>Default</source>
<source>Default Value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="348"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="374"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="630"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="339"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="587"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="366"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="392"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="640"/>
<source>Path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="390"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="696"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="408"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="706"/>
<source>Headers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="397"/>
<source>Format: key|value</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="415"/>
<source>Format: Key|Value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="413"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="429"/>
<source>MTU</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="439"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="455"/>
<source>TTI (ms)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="465"/>
<source>Uplink (MB/s)</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="481"/>
<source>Uplink Capacity (MB/s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="488"/>
<source>Congestion Control</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="504"/>
<source>Congestion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="506"/>
<source>Downlink (MB/s)</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="518"/>
<source>Downlink Capacity (MB/s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="529"/>
<source>Read Buffer (MB)</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="541"/>
<source>Read Buffer Size (MB)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="552"/>
<source>Write Buffer (MB)</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="564"/>
<source>Write Buffer Size (MB)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="682"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="692"/>
<source>Key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="747"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="757"/>
<source>Mark</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="757"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="767"/>
<source>TCP Fast Open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="771"/>
<source>tProxy</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="781"/>
<source>TProxy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="808"/>
<source>EMail</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="818"/>
<source>Email</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="815"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="911"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="825"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="921"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="822"/>
<source>Encryption</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="874"/>
<source>User Level</source>
<location filename="../src/w_ConnectionEditWindow.ui" line="832"/>
<source>Encryption Method</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="884"/>
<source>Level</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="894"/>
<source>OTA</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="921"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="931"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="941"/>
<source>Json Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.cpp" line="372"/>
<location filename="../src/w_ConnectionEditWindow.cpp" line="382"/>
@ -332,11 +327,13 @@
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="47"/>
<location filename="../src/w_MainWindow.cpp" line="40"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="57"/>
<location filename="../src/w_MainWindow.cpp" line="42"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
</message>
@ -397,7 +394,7 @@
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="256"/>
<location filename="../src/w_MainWindow.ui" line="346"/>
<location filename="../src/w_MainWindow.ui" line="353"/>
<source>#ImportConnection</source>
<translation type="unfinished"></translation>
</message>
@ -408,7 +405,6 @@
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="276"/>
<location filename="../src/w_MainWindow.cpp" line="454"/>
<source>#RemoveConnection</source>
<translation type="unfinished"></translation>
</message>
@ -428,7 +424,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="319"/>
<location filename="../src/w_MainWindow.ui" line="304"/>
<source>#</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="326"/>
<source>Log</source>
<translation type="unfinished"></translation>
</message>
@ -443,158 +444,163 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="356"/>
<location filename="../src/w_MainWindow.ui" line="363"/>
<source>#Preferences</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="361"/>
<location filename="../src/w_MainWindow.ui" line="368"/>
<source>#Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="366"/>
<location filename="../src/w_MainWindow.ui" line="373"/>
<source>#Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="371"/>
<location filename="../src/w_MainWindow.ui" line="378"/>
<source>#Restart</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="37"/>
<location filename="../src/w_MainWindow.cpp" line="282"/>
<source>#Hide</source>
<location filename="../src/w_MainWindow.cpp" line="38"/>
<location filename="../src/w_MainWindow.cpp" line="283"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="39"/>
<source>#Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="39"/>
<source>#Connect</source>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="41"/>
<source>#Reconnect</source>
<source>Reconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="41"/>
<source>#Disconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="43"/>
<source>#Rename</source>
<location filename="../src/w_MainWindow.cpp" line="44"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="45"/>
<source>#ConnectSelected</source>
<source>ConnectSelected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="91"/>
<location filename="../src/w_MainWindow.cpp" line="237"/>
<location filename="../src/w_MainWindow.cpp" line="285"/>
<source>#Show</source>
<location filename="../src/w_MainWindow.cpp" line="92"/>
<location filename="../src/w_MainWindow.cpp" line="238"/>
<location filename="../src/w_MainWindow.cpp" line="286"/>
<source>Show</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="120"/>
<location filename="../src/w_MainWindow.cpp" line="121"/>
<source>#NewReleaseVersionFound</source>
<source>NewReleaseVersionFound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="127"/>
<source>#ReleaseDownloadLink</source>
<source>ReleaseDownloadLink</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="187"/>
<location filename="../src/w_MainWindow.cpp" line="494"/>
<location filename="../src/w_MainWindow.cpp" line="188"/>
<location filename="../src/w_MainWindow.cpp" line="495"/>
<source>NoConfigSelected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="188"/>
<location filename="../src/w_MainWindow.cpp" line="495"/>
<source>PleaseSelectAConfig</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="199"/>
<location filename="../src/w_MainWindow.cpp" line="200"/>
<source>ConnectedToServer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="201"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="218"/>
<source>Disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="324"/>
<source>UUID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="326"/>
<source>AlterID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="328"/>
<source>Transport</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="335"/>
<source>Email</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="337"/>
<source>Encryption</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="344"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="419"/>
<location filename="../src/w_MainWindow.cpp" line="428"/>
<source>RenameConnection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="419"/>
<source>CannotUseEmptyName</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="428"/>
<source>DuplicatedConnectionName</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="455"/>
<source>RemoveConnection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="455"/>
<source>RemoveConnectionConfirm</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="510"/>
<source>#NoConfigSelected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="187"/>
<location filename="../src/w_MainWindow.cpp" line="494"/>
<location filename="../src/w_MainWindow.cpp" line="510"/>
<source>#PleaseSelectAConfig</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="198"/>
<location filename="../src/w_MainWindow.cpp" line="199"/>
<source>#ConnectedToServer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="200"/>
<source>#Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="217"/>
<source>#Disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="323"/>
<source>#UUID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="325"/>
<source>#AlterID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="327"/>
<source>#Transport</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="334"/>
<source>#Email</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="336"/>
<source>#Encryption</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="343"/>
<source>#Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="418"/>
<location filename="../src/w_MainWindow.cpp" line="427"/>
<source>#RenameConnection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="418"/>
<source>#CannotUseEmptyName</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="427"/>
<source>#DuplicatedConnectionName</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="454"/>
<source>#RemoveConnectionConfirm</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PrefrencesWindow</name>
@ -872,17 +878,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="153"/>
<location filename="../src/main.cpp" line="154"/>
<source>DependencyMissing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="153"/>
<location filename="../src/main.cpp" line="154"/>
<source>osslDependMissing,PleaseReDownload</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="162"/>
<location filename="../src/main.cpp" line="163"/>
<source>#AnotherInstanceRunning</source>
<translation type="unfinished"></translation>
</message>
@ -896,28 +902,106 @@
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="22"/>
<source>#Routes</source>
<source>Routes List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="33"/>
<source>InBounds</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="38"/>
<source>DomainOrIP</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="43"/>
<source>Outbound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="88"/>
<source>Change IO</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="110"/>
<source>Route Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="116"/>
<source>Domains</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="123"/>
<source>IPs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="137"/>
<source>Inbound List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="171"/>
<source>Add Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="180"/>
<source>Inbound Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="186"/>
<location filename="../src/w_RouteEditor.ui" line="302"/>
<source>Tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="200"/>
<location filename="../src/w_RouteEditor.ui" line="353"/>
<source>#Type</source>
<translation type="unfinished">Type</translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="43"/>
<source>#Outbound</source>
<translation type="unfinished">Outbound Type</translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="33"/>
<source>#InBounds</source>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="38"/>
<source>#DomainOrIP</source>
<location filename="../src/w_RouteEditor.ui" line="214"/>
<location filename="../src/w_RouteEditor.ui" line="360"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="221"/>
<location filename="../src/w_RouteEditor.ui" line="367"/>
<source>Port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="249"/>
<source>Outbound List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="287"/>
<source>Insert &quot;Direct&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="296"/>
<source>Outbound Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="331"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="410"/>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -930,79 +1014,6 @@
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="88"/>
<source>#ChangeIO</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="110"/>
<source>#RouteDetail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="116"/>
<source>#DomainList</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="123"/>
<source>#IPList</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="137"/>
<source>#Inbounds</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="171"/>
<source>#FromGlobalConfig</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="180"/>
<source>#InboundDetail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="186"/>
<location filename="../src/w_RouteEditor.ui" line="302"/>
<source>#Tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="89"/>
<source>#Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="296"/>
<source>#OutboundDetail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="331"/>
<source>#EditCurrentOutbound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="214"/>
<location filename="../src/w_RouteEditor.ui" line="360"/>
<source>#Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="221"/>
<location filename="../src/w_RouteEditor.ui" line="367"/>
<source>#Port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.ui" line="410"/>
<source>#Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/w_RouteEditor.cpp" line="68"/>
<location filename="../src/w_RouteEditor.cpp" line="93"/>