Feature/source plugins #1
No files matched your search
@@ -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;
|
||||||
|
|||||||
@@ -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_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in new issue
Block a user