20 #include <avahi-common/error.h>
21 #include <avahi-common/alternative.h>
22 #include <avahi-common/malloc.h>
31 : client(0), group(0), current_name(), registered_port(-1) {
32 client = ga_client_new(GaClientFlags(0));
34 if (!ga_client_start(client, &error)) {
38 group = ga_entry_group_new();
39 g_signal_connect(group,
"state-changed", G_CALLBACK(state_changed),
this);
41 ga_entry_group_attach(group, client, &error);
46 g_object_unref(client);
49 g_object_unref(group);
54 void AvahiService::state_changed(GaEntryGroup *group, GaEntryGroupState state,
void *data) {
57 case AVAHI_ENTRY_GROUP_UNCOMMITED:
break;
58 case AVAHI_ENTRY_GROUP_REGISTERING:
break;
59 case AVAHI_ENTRY_GROUP_ESTABLISHED:
62 case AVAHI_ENTRY_GROUP_COLLISION: {
64 char *n = avahi_alternative_service_name(
self.current_name.c_str());
67 self.register_service(name,
self.registered_port);
70 case AVAHI_ENTRY_GROUP_FAILURE:
80 for (
int i = 0; i < 10; ++i) {
82 ga_entry_group_add_service(group, name.c_str(),
"_guitarix._tcp", port, &error, 0);
86 if (error->code != AVAHI_ERR_COLLISION) {
90 char *n = avahi_alternative_service_name(name.c_str());
94 ga_entry_group_commit(group, 0);
96 registered_port = port;