Browse Source

invite+clipboard+conn_mgr: sock_meta for alien nodes, clipboard fix, bg_ping fix

- chat_core_connect_from_invite: add TOPO_SOCKMETA4 (id=0, UNKNOWN, UNKNOWN)
  so cm_has_direct_ip/cm_start_phase_direct can match socket_id=0 addr
- conn_mgr: cm_bg_ping_timer_cb reads real addr from nq->node->v4_addrs
  instead of NULL; added cm_bg_ping_noop_cb per required etcp_send_ping_to_socket
- invitedialog: set both QClipboard::Clipboard and Selection on Linux/X11
chatgui
Evgeny 3 months ago
parent
commit
89b1a01448
  1. 19
      src/conn_mgr.c
  2. 5
      tools/chatgui/src/invitedialog.cpp
  3. 5
      tools/chatgui/transport/chat_core.c

19
src/conn_mgr.c

@ -914,6 +914,11 @@ static void cm_handle_disconnect(struct CONN_MGR* mgr, uint64_t node_id) {
DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "conn_mgr: remote disconnect from 0x%016llx", (unsigned long long)node_id);
}
static void cm_bg_ping_noop_cb(int success, uint16_t rtt, void* arg, uint64_t nonce,
const uint8_t* resp_data, size_t resp_data_len) {
(void)success; (void)rtt; (void)arg; (void)nonce; (void)resp_data; (void)resp_data_len;
}
static void cm_bg_ping_timer_cb(void* arg) {
struct CONN_MGR* mgr = (struct CONN_MGR*)arg;
struct TOPO_GROUP* group = topo_groups_get_default(mgr->instance->topo_groups);
@ -952,8 +957,18 @@ static void cm_bg_ping_timer_cb(void* arg) {
while (l) { if (l->initialized && l->link_status) { has_active = 1; break; } l = l->next; }
}
if (!has_active) {
etcp_send_ping(mgr->instance, nq->node->public_key, NULL, CONN_PROBE_TIMEOUT_MS,
NULL, NULL, NULL, 0);
for (const struct TOPO_ADDR4* a = nq->node->v4_addrs; a; a = a->next) {
if (a->type != TOPO_ADDR_REAL && a->type != TOPO_ADDR_NAT) continue;
struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET;
memcpy(&sin.sin_addr.s_addr, a->addr, 4); sin.sin_port = htons(a->port);
struct sockaddr_storage sa; memcpy(&sa, &sin, sizeof(sin));
struct ETCP_SOCKET* s = mgr->instance->etcp_sockets;
while (s) { if (s->local_addr.ss_family == AF_INET) break; s = s->next; }
if (!s) break;
etcp_send_ping_to_socket(mgr->instance, s, nq->node->public_key, &sa,
CONN_PROBE_TIMEOUT_MS, cm_bg_ping_noop_cb, NULL, NULL, 0);
break;
}
}
}
mgr->bg_ping_cursor++;

5
tools/chatgui/src/invitedialog.cpp

@ -26,7 +26,10 @@ InviteDialog::InviteDialog(const QString& link, QWidget* parent)
auto *btnLayout = new QHBoxLayout();
auto *copyBtn = new QPushButton("Скопировать", this);
connect(copyBtn, &QPushButton::clicked, this, [this, linkEdit]() {
QApplication::clipboard()->setText(m_link);
QClipboard* cb = QApplication::clipboard();
cb->setText(m_link, QClipboard::Clipboard);
if (cb->supportsSelection())
cb->setText(m_link, QClipboard::Selection);
linkEdit->setFocus();
});
btnLayout->addWidget(copyBtn);

5
tools/chatgui/transport/chat_core.c

@ -16,6 +16,7 @@
#include "../../../src/topo_group.h"
#include "../../../src/topo_node.h"
#include "../../../src/conn_mgr.h"
#include "../../../src/etcp_connections.h"
#include "../../../src/secure_channel.h"
#include "../../../lib/u_async.h"
#include "../../../lib/ll_queue.h"
@ -641,6 +642,10 @@ void chat_core_connect_from_invite(struct chat_invite* inv) {
}
ni->v4_addrs = addrs_head;
/* alien-узел: sock_meta с неизвестной конфигурацией цели */
struct TOPO_SOCKMETA4* sm = memory_pool_alloc(group->instance->topo_groups->v4_sock_meta_pool);
if (sm) { sm->id = 0; sm->config_type = CFG_SERVER_TYPE_UNKNOWN; sm->nat_type = NAT_TYPE_UNKNOWN; sm->next = NULL; ni->v4_sock_meta = sm; }
nq->node = ni; topo_node_ref(ni);
nq->hash_node_id = node_id; nq->alien = 0;
nq->dirty = 0; nq->last_ver = 0;

Loading…
Cancel
Save