// DO NOT INCLUDE THIS #include #include #include #include #include // inline QString software_name = "NekoRay"; inline QString software_core_name = "V2Ray"; // Main Functions inline std::function MF_release_runguard; // MainWindow functions class QWidget; inline QWidget *mainwindow; inline std::function MW_show_log; inline std::function MW_show_log_ext; inline std::function MW_show_log_ext_vt100; inline std::function MW_dialog_message; // String #define Int2String(num) QString::number(num) inline QString SubStrBefore(QString str, const QString &sub) { if (!str.contains(sub)) return str; return str.left(str.indexOf(sub)); } inline QString SubStrAfter(QString str, const QString &sub) { if (!str.contains(sub)) return str; return str.right(str.length() - str.indexOf(sub) - sub.length()); } QString QStringList2Command(const QStringList &list); QStringList SplitLines(const QString &_string); // Base64 QString DecodeB64IfValid(const QString &input, QByteArray::Base64Options options = QByteArray::Base64Option::Base64Encoding); // URL class QUrlQuery; #define GetQuery(url) QUrlQuery((url).query(QUrl::ComponentFormattingOption::FullyDecoded)); QString GetQueryValue(const QUrlQuery &q, const QString &key, const QString &def = ""); QString GetRandomString(int randomStringLength); quint64 GetRandomUint64(); // JSON class QJsonObject; class QJsonArray; QJsonObject QString2QJsonObject(const QString &jsonString); QString QJsonObject2QString(const QJsonObject &jsonObject, bool compact); template QJsonArray QList2QJsonArray(const QList &list); QList QJsonArray2QListInt(const QJsonArray &arr); #define QJSONARRAY_ADD(arr, add) \ for (const auto &a: (add)) { \ (arr) += a; \ } #define QJSONOBJECT_COPY(src, dst, key) \ if (src.contains(key)) dst[key] = src[key]; #define QJSONOBJECT_COPY2(src, dst, src_key, dst_key) \ if (src.contains(src_key)) dst[dst_key] = src[src_key]; QList QJsonArray2QListString(const QJsonArray &arr); // Files QByteArray ReadFile(const QString &path); QString ReadFileText(const QString &path); // Validators bool IsIpAddress(const QString &str); bool IsIpAddressV4(const QString &str); bool IsIpAddressV6(const QString &str); // [2001:4860:4860::8888] -> 2001:4860:4860::8888 inline QString UnwrapIPV6Host(QString &str) { return str.replace("[", "").replace("]", ""); } // [2001:4860:4860::8888] or 2001:4860:4860::8888 -> [2001:4860:4860::8888] inline QString WrapIPV6Host(QString &str) { if (!IsIpAddressV6(str)) return str; return "[" + UnwrapIPV6Host(str) + "]"; } inline QString DisplayAddress(QString serverAddress, int serverPort) { if (serverAddress.isEmpty() && serverPort == 0) return {}; return WrapIPV6Host(serverAddress) + ":" + Int2String(serverPort); }; // Format & Misc int MkPort(); QString DisplayTime(long long time, int formatType = 0); inline QString ReadableSize(const qint64 &size) { double sizeAsDouble = size; static QStringList measures; if (measures.isEmpty()) measures << "B" << "KiB" << "MiB" << "GiB" << "TiB" << "PiB" << "EiB" << "ZiB" << "YiB"; QStringListIterator it(measures); QString measure(it.next()); while (sizeAsDouble >= 1024.0 && it.hasNext()) { measure = it.next(); sizeAsDouble /= 1024.0; } return QString::fromLatin1("%1 %2").arg(sizeAsDouble, 0, 'f', 2).arg(measure); } inline bool InRange(unsigned x, unsigned low, unsigned high) { return (low <= x && x <= high); } // UI QWidget *GetMessageBoxParent(); int MessageBoxWarning(const QString &title, const QString &text); int MessageBoxInfo(const QString &title, const QString &text); void runOnUiThread(const std::function &callback, QObject *parent = nullptr); void runOnNewThread(const std::function &callback); template inline void connectOnce(EMITTER *emitter, SIGNAL signal, RECEIVER *receiver, ReceiverFunc f, Qt::ConnectionType connectionType = Qt::AutoConnection) { auto connection = std::make_shared(); auto onTriggered = [connection, f](auto... arguments) { std::invoke(f, arguments...); QObject::disconnect(*connection); }; *connection = QObject::connect(emitter, signal, receiver, onTriggered, connectionType); } void setTimeout(const std::function &callback, QObject *obj, int timeout = 0);