diff --git a/esphome/components/mdns/mdns_component.h b/esphome/components/mdns/mdns_component.h index d0659abdbf..f696cfff1c 100644 --- a/esphome/components/mdns/mdns_component.h +++ b/esphome/components/mdns/mdns_component.h @@ -69,17 +69,32 @@ class MDNSComponent : public Component { #endif protected: - /// Common setup logic called by all platform-specific setup() implementations - void on_setup_(char *mac_address_buf) { + /// Helper to set up services and MAC buffers, then call platform-specific registration + using PlatformRegisterFn = void (*)(MDNSComponent *, StaticVector &); + + void setup_buffers_and_register_(PlatformRegisterFn platform_register) { #ifdef USE_MDNS_STORE_SERVICES -#ifdef USE_API - // Copy to member buffer for storage - std::memcpy(this->mac_address_, mac_address_buf, MAC_ADDRESS_BUFFER_SIZE); - this->compile_records_(this->services_, this->mac_address_); + auto &services = this->services_; #else - this->compile_records_(this->services_, mac_address_buf); + StaticVector services_storage; + auto &services = services_storage; #endif + +#ifdef USE_API +#ifdef USE_MDNS_STORE_SERVICES + get_mac_address_into_buffer(this->mac_address_); + char *mac_ptr = this->mac_address_; +#else + char mac_address[MAC_ADDRESS_BUFFER_SIZE]; + get_mac_address_into_buffer(mac_address); + char *mac_ptr = mac_address; #endif +#else + char *mac_ptr = nullptr; +#endif + + this->compile_records_(services, mac_ptr); + platform_register(this, services); } #ifdef USE_MDNS_DYNAMIC_TXT diff --git a/esphome/components/mdns/mdns_esp32.cpp b/esphome/components/mdns/mdns_esp32.cpp index 4dfb416249..e6b43e59cb 100644 --- a/esphome/components/mdns/mdns_esp32.cpp +++ b/esphome/components/mdns/mdns_esp32.cpp @@ -11,27 +11,11 @@ namespace esphome::mdns { static const char *const TAG = "mdns"; -void MDNSComponent::setup() { -#ifdef USE_API - char mac_address[MAC_ADDRESS_BUFFER_SIZE]; - get_mac_address_into_buffer(std::span(mac_address)); -#else - char *mac_address = nullptr; -#endif - - this->on_setup_(mac_address); - -#ifdef USE_MDNS_STORE_SERVICES - const auto &services = this->services_; -#else - StaticVector services; - this->compile_records_(services, mac_address); -#endif - +static void register_esp32(MDNSComponent *comp, StaticVector &services) { esp_err_t err = mdns_init(); if (err != ESP_OK) { ESP_LOGW(TAG, "Init failed: %s", esp_err_to_name(err)); - this->mark_failed(); + comp->mark_failed(); return; } @@ -58,6 +42,8 @@ void MDNSComponent::setup() { } } +void MDNSComponent::setup() { this->setup_buffers_and_register_(register_esp32); } + void MDNSComponent::on_shutdown() { mdns_free(); delay(40); // Allow the mdns packets announcing service removal to be sent diff --git a/esphome/components/mdns/mdns_esp8266.cpp b/esphome/components/mdns/mdns_esp8266.cpp index e70028d075..dcbe5ebd52 100644 --- a/esphome/components/mdns/mdns_esp8266.cpp +++ b/esphome/components/mdns/mdns_esp8266.cpp @@ -11,23 +11,7 @@ namespace esphome::mdns { -void MDNSComponent::setup() { -#ifdef USE_API - char mac_address[MAC_ADDRESS_BUFFER_SIZE]; - get_mac_address_into_buffer(std::span(mac_address)); -#else - char *mac_address = nullptr; -#endif - - this->on_setup_(mac_address); - -#ifdef USE_MDNS_STORE_SERVICES - const auto &services = this->services_; -#else - StaticVector services; - this->compile_records_(services, mac_address); -#endif - +static void register_esp8266(MDNSComponent *, StaticVector &services) { MDNS.begin(App.get_name().c_str()); for (const auto &service : services) { @@ -52,6 +36,8 @@ void MDNSComponent::setup() { } } +void MDNSComponent::setup() { this->setup_buffers_and_register_(register_esp8266); } + void MDNSComponent::loop() { MDNS.update(); } void MDNSComponent::on_shutdown() { diff --git a/esphome/components/mdns/mdns_host.cpp b/esphome/components/mdns/mdns_host.cpp index 1be0b721c5..4d902319b8 100644 --- a/esphome/components/mdns/mdns_host.cpp +++ b/esphome/components/mdns/mdns_host.cpp @@ -9,14 +9,15 @@ namespace esphome::mdns { void MDNSComponent::setup() { +#ifdef USE_MDNS_STORE_SERVICES #ifdef USE_API - char mac_address[MAC_ADDRESS_BUFFER_SIZE]; - get_mac_address_into_buffer(std::span(mac_address)); + get_mac_address_into_buffer(this->mac_address_); + char *mac_ptr = this->mac_address_; #else - char *mac_address = nullptr; + char *mac_ptr = nullptr; +#endif + this->compile_records_(this->services_, mac_ptr); #endif - - this->on_setup_(mac_address); // Host platform doesn't have actual mDNS implementation } diff --git a/esphome/components/mdns/mdns_libretiny.cpp b/esphome/components/mdns/mdns_libretiny.cpp index 04c6f8f89d..986099fa1f 100644 --- a/esphome/components/mdns/mdns_libretiny.cpp +++ b/esphome/components/mdns/mdns_libretiny.cpp @@ -11,23 +11,7 @@ namespace esphome::mdns { -void MDNSComponent::setup() { -#ifdef USE_API - char mac_address[MAC_ADDRESS_BUFFER_SIZE]; - get_mac_address_into_buffer(std::span(mac_address)); -#else - char *mac_address = nullptr; -#endif - - this->on_setup_(mac_address); - -#ifdef USE_MDNS_STORE_SERVICES - const auto &services = this->services_; -#else - StaticVector services; - this->compile_records_(services, mac_address); -#endif - +static void register_libretiny(MDNSComponent *, StaticVector &services) { MDNS.begin(App.get_name().c_str()); for (const auto &service : services) { @@ -51,6 +35,8 @@ void MDNSComponent::setup() { } } +void MDNSComponent::setup() { this->setup_buffers_and_register_(register_libretiny); } + void MDNSComponent::on_shutdown() {} } // namespace esphome::mdns diff --git a/esphome/components/mdns/mdns_rp2040.cpp b/esphome/components/mdns/mdns_rp2040.cpp index 10677b49ed..e4a9b60cdb 100644 --- a/esphome/components/mdns/mdns_rp2040.cpp +++ b/esphome/components/mdns/mdns_rp2040.cpp @@ -11,23 +11,7 @@ namespace esphome::mdns { -void MDNSComponent::setup() { -#ifdef USE_API - char mac_address[MAC_ADDRESS_BUFFER_SIZE]; - get_mac_address_into_buffer(std::span(mac_address)); -#else - char *mac_address = nullptr; -#endif - - this->on_setup_(mac_address); - -#ifdef USE_MDNS_STORE_SERVICES - const auto &services = this->services_; -#else - StaticVector services; - this->compile_records_(services, mac_address); -#endif - +static void register_rp2040(MDNSComponent *, StaticVector &services) { MDNS.begin(App.get_name().c_str()); for (const auto &service : services) { @@ -51,6 +35,8 @@ void MDNSComponent::setup() { } } +void MDNSComponent::setup() { this->setup_buffers_and_register_(register_rp2040); } + void MDNSComponent::loop() { MDNS.update(); } void MDNSComponent::on_shutdown() {