Feature/source plugins #1

Merged
martino merged 130 commits from feature/source-plugins into main 2026-11-04 07:35:21 +01:00
3 changed files with 16 additions and 13 deletions
Showing only changes of commit f74df49d33 - Show all commits

No files matched your search

+7 -7
View File
@@ -233,22 +233,22 @@ void hook_entry(GtkWidget* w, const FormPtr& f) {
constexpr int kScanMs = 1500; ///< how long a scan listens constexpr int kScanMs = 1500; ///< how long a scan listens
constexpr int kTickMs = 50; ///< how often it drains the sockets constexpr int kTickMs = 50; ///< how often it drains the sockets
/// A result row's two ways to name the board, with the form they fill. /// A result row's two ways to name the board: what each fills into the form (the other is cleared).
struct Pick { struct Pick {
FormPtr form; FormPtr form;
std::string ip, mac; std::string value;
}; };
void free_pick(gpointer d, GClosure*) { delete static_cast<Pick*>(d); } void free_pick(gpointer d, GClosure*) { delete static_cast<Pick*>(d); }
void on_pick_address(AdwActionRow*, gpointer user) { void on_pick_address(AdwActionRow*, gpointer user) {
Pick& p = *static_cast<Pick*>(user); Pick& p = *static_cast<Pick*>(user);
p.form->fill(p.ip, ""); p.form->fill(p.value, "");
} }
void on_pick_mac(GtkButton*, gpointer user) { void on_pick_mac(GtkButton*, gpointer user) {
Pick& p = *static_cast<Pick*>(user); Pick& p = *static_cast<Pick*>(user);
p.form->fill("", p.mac); p.form->fill("", p.value);
} }
void add_result(const FormPtr& f, const DeviceInfo& d) { void add_result(const FormPtr& f, const DeviceInfo& d) {
@@ -263,8 +263,8 @@ void add_result(const FormPtr& f, const DeviceInfo& d) {
gtk_widget_set_valign(use_mac, GTK_ALIGN_CENTER); gtk_widget_set_valign(use_mac, GTK_ALIGN_CENTER);
adw_action_row_add_suffix(ADW_ACTION_ROW(row), use_mac); adw_action_row_add_suffix(ADW_ACTION_ROW(row), use_mac);
g_signal_connect_data(row, "activated", G_CALLBACK(on_pick_address), g_signal_connect_data(row, "activated", G_CALLBACK(on_pick_address),
new Pick{f, d.ip, mac}, free_pick, static_cast<GConnectFlags>(0)); new Pick{f, d.ip}, free_pick, static_cast<GConnectFlags>(0));
g_signal_connect_data(use_mac, "clicked", G_CALLBACK(on_pick_mac), new Pick{f, d.ip, mac}, g_signal_connect_data(use_mac, "clicked", G_CALLBACK(on_pick_mac), new Pick{f, mac},
free_pick, static_cast<GConnectFlags>(0)); free_pick, static_cast<GConnectFlags>(0));
adw_expander_row_add_row(ADW_EXPANDER_ROW(f->scan_row), row); adw_expander_row_add_row(ADW_EXPANDER_ROW(f->scan_row), row);
adw_expander_row_set_expanded(ADW_EXPANDER_ROW(f->scan_row), TRUE); adw_expander_row_set_expanded(ADW_EXPANDER_ROW(f->scan_row), TRUE);
@@ -284,7 +284,7 @@ gboolean on_scan_tick(gpointer user) {
f.timer = 0; f.timer = 0;
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
const std::vector<DeviceInfo> found = f.scan->poll(); const auto& found = f.scan->poll(); // valid until f.scan.reset() below, after its last use
while (f.results.size() < found.size()) add_result(fp, found[f.results.size()]); while (f.results.size() < found.size()) add_result(fp, found[f.results.size()]);
f.scan_ms += kTickMs; f.scan_ms += kTickMs;
if (f.scan_ms < kScanMs) return G_SOURCE_CONTINUE; if (f.scan_ms < kScanMs) return G_SOURCE_CONTINUE;
+4 -1
View File
@@ -291,7 +291,10 @@ const std::vector<DeviceInfo>& Scan::poll() {
socklen_t flen = sizeof from; socklen_t flen = sizeof from;
const ssize_t n = ::recvfrom(s.get(), buf, sizeof buf, MSG_DONTWAIT, const ssize_t n = ::recvfrom(s.get(), buf, sizeof buf, MSG_DONTWAIT,
reinterpret_cast<sockaddr*>(&from), &flen); reinterpret_cast<sockaddr*>(&from), &flen);
if (n < 0) break; // nothing more on this socket for now if (n < 0) {
if (errno == EINTR) continue;
break; // nothing more on this socket for now
}
take_reply(buf, n, from, found_); take_reply(buf, n, from, found_);
} }
} }
+5 -5
View File
@@ -272,15 +272,15 @@ void E1608Source::connect_and_start() {
Mac want{}; Mac want{};
const bool have_mac = !cfg_.mac_text.empty() && parse_mac(cfg_.mac_text, want); const bool have_mac = !cfg_.mac_text.empty() && parse_mac(cfg_.mac_text, want);
if (host.empty() || have_mac) { if (host.empty() || have_mac) {
const std::vector<std::string> targets =
host.empty() ? sweep_targets(cfg_.subnet) : std::vector<std::string>{host};
const int wait_ms = std::min(cfg_.timeout_ms, 1500); const int wait_ms = std::min(cfg_.timeout_ms, 1500);
// No address and no subnet: the limited broadcast, sent on every interface rather than only // No address and no subnet: the limited broadcast, sent on every interface rather than only
// the default route's. // the default route's.
const bool broadcast = const bool broadcast = host.empty() && cfg_.subnet.empty();
host.empty() && targets.size() == 1 && targets[0] == "255.255.255.255";
const std::vector<DeviceInfo> found = const std::vector<DeviceInfo> found =
broadcast ? discover_broadcast(cfg_.port, wait_ms) : discover(targets, cfg_.port, wait_ms); broadcast ? discover_broadcast(cfg_.port, wait_ms)
: discover(host.empty() ? sweep_targets(cfg_.subnet)
: std::vector<std::string>{host},
cfg_.port, wait_ms);
if (host.empty()) { if (host.empty()) {
for (const DeviceInfo& d : found) { for (const DeviceInfo& d : found) {
if (d.mac == want) host = d.ip; if (d.mac == want) host = d.ip;