10#include <config_dbus.h>
17#include <avahi-client/client.h>
18#include <avahi-client/publish.h>
20#include <avahi-common/alternative.h>
21#include <avahi-common/error.h>
22#include <avahi-common/thread-watch.h>
38static AvahiEntryGroup *
group =
nullptr;
43static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED
void *userdata) {
50 case AVAHI_ENTRY_GROUP_ESTABLISHED :
55 case AVAHI_ENTRY_GROUP_COLLISION : {
70 case AVAHI_ENTRY_GROUP_FAILURE :
72 SAL_WARN(
"sdremote.wifi",
"Entry group failure: " << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))));
78 case AVAHI_ENTRY_GROUP_UNCOMMITED:
79 case AVAHI_ENTRY_GROUP_REGISTERING:
94 SAL_WARN(
"sdremote.wifi",
"avahi_entry_group_new() failed: " << avahi_strerror(avahi_client_errno(c)));
102 if (avahi_entry_group_is_empty(
group)) {
106 snprintf(r,
sizeof(r),
"random=%i", nRandom);
107 int ret = avahi_entry_group_add_service(
108 group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
static_cast<AvahiPublishFlags
>(0),
113 if (ret == AVAHI_ERR_COLLISION){
121 avahi_entry_group_reset(
group);
126 SAL_WARN(
"sdremote.wifi",
"Failed to add _impressremote._tcp service: " << avahi_strerror(ret));
132 if ((ret = avahi_entry_group_commit(
group)) < 0) {
133 SAL_WARN(
"sdremote.wifi",
"Failed to commit entry group: " << avahi_strerror(ret));
142static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED
void * userdata) {
148 case AVAHI_CLIENT_S_RUNNING:
151 case AVAHI_CLIENT_FAILURE:
152 SAL_WARN(
"sdremote.wifi",
"Client failure: " << avahi_strerror(avahi_client_errno(c)));
155 case AVAHI_CLIENT_S_COLLISION:
156 case AVAHI_CLIENT_S_REGISTERING:
158 avahi_entry_group_reset(
group);
160 case AVAHI_CLIENT_CONNECTING:
165void AvahiNetworkService::setup() {
174 if (!dbus_threads_init_default()) {
175 throw std::bad_alloc();
187 SAL_WARN(
"sdremote.wifi",
"avahi_client_new failed");
196 SAL_WARN(
"sdremote.wifi",
"avahi_threaded_poll_start failed");
206 avahi_client_free(
client);
static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void *userdata)
static AvahiEntryGroup * group
static AvahiNetworkService * avahiService
static bool create_services(AvahiClient *c)
static AvahiClient * client
static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata)
static AvahiThreadedPoll * threaded_poll
const std::string & getName() const
void setName(const char *n)
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
int uniform_int_distribution(int a, int b)