diff --git a/tools/chatgui/src/accountlist.cpp b/tools/chatgui/src/accountlist.cpp index ce2d8dbf..cba74a09 100644 --- a/tools/chatgui/src/accountlist.cpp +++ b/tools/chatgui/src/accountlist.cpp @@ -1,5 +1,6 @@ #include #include "accountlist.h" +#include "addressprofiletext.h" #include "accountdelegate.h" #include "memberlistmodel.h" #include "avatars/avatargallery.h" @@ -34,19 +35,6 @@ static void memberDetailCb(const uint8_t* data, int len) { g_detailTarget->onMemberDetailData(nodeId, data, len); } -static QString addrRoleStr(int t) { - switch (t) { - case 0: return "local"; - case 1: return "public"; - case 2: return "nat_eim"; - case 3: return "nat_dependent"; - case 4: return "NAT?"; - case 5: return "contact_required"; - case 6: return "EIM?"; - default: return QString("?%1").arg(t); - } -} - QString AccountList::addrStr(const void* addr, int family) { if (family == 4) { const uint8_t* a = (const uint8_t*)addr; @@ -269,7 +257,8 @@ void AccountList::showMemberDetail(quint64 nodeId) { sqlite3_stmt* na = nullptr; sqlite3_prepare_v2(d, - "SELECT family, protocol, address, port, socket_id, addr_type FROM node_addresses WHERE node_id=?", + "SELECT family, protocol, address, port, socket_id, addr_type, nat_mapping, nat_inbound, nat_source" + " FROM node_addresses WHERE node_id=?", -1, &na, nullptr); if (na) { sqlite3_bind_int64(na, 1, (sqlite3_int64)nodeId); @@ -283,6 +272,9 @@ void AccountList::showMemberDetail(quint64 nodeId) { a.port = sqlite3_column_int(na, 3); a.socket_id = sqlite3_column_int(na, 4); a.addr_type = sqlite3_column_int(na, 5); + a.nat_mapping = sqlite3_column_int(na, 6); + a.nat_inbound = sqlite3_column_int(na, 7); + a.nat_source = sqlite3_column_int(na, 8); if (!a.addr.isEmpty()) m_detailAddrs.append(a); } sqlite3_finalize(na); @@ -414,7 +406,7 @@ void AccountList::updateDetailDisplay() { .arg(a.ifname) .arg(addrStr(a.addr.constData(), a.family)) .arg(a.port) - .arg(addrRoleStr(a.addr_type))); + .arg(addressProfileText(a.nat_mapping, a.nat_inbound, a.nat_source))); } } diff --git a/tools/chatgui/src/accountlist.h b/tools/chatgui/src/accountlist.h index 0173785e..c94c72d5 100644 --- a/tools/chatgui/src/accountlist.h +++ b/tools/chatgui/src/accountlist.h @@ -22,6 +22,9 @@ struct DetailAddress { int port; int socket_id; int addr_type; + int nat_mapping; + int nat_inbound; + int nat_source; QString ifname; }; diff --git a/tools/chatgui/src/addressprofiletext.h b/tools/chatgui/src/addressprofiletext.h new file mode 100644 index 00000000..225a2f7e --- /dev/null +++ b/tools/chatgui/src/addressprofiletext.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include "../../../src/routing_layer/address_profile.h" + +// Показывает результат измерения отдельно от происхождения адреса (интерфейс или NAT). +inline QString addressProfileText(int mapping, int inbound, int source) { + if (source == ADDRESS_SOURCE_NONE) return QCoreApplication::translate("ChatGui", "NAT not determined"); + QString text; + switch (mapping) { + case ADDRESS_MAP_UNCHANGED: text = QCoreApplication::translate("ChatGui", "No NAT"); break; + case ADDRESS_MAP_EIM: text = inbound == ADDRESS_IN_UNKNOWN ? "EIM?" : "EIM"; break; + case ADDRESS_MAP_DEPENDENT: return "DEPENDENT"; + default: return "NAT?"; + } + if (inbound == ADDRESS_IN_OPEN) text += QCoreApplication::translate("ChatGui", "; inbound open"); + else if (inbound == ADDRESS_IN_CONTACT) text += QCoreApplication::translate("ChatGui", "; inbound filtered"); + else if (mapping == ADDRESS_MAP_UNCHANGED) text += QCoreApplication::translate("ChatGui", "; inbound untested"); + if (source == ADDRESS_SOURCE_STUN) text += " (STUN)"; + return text; +}