lib/avahi/Client: add method IsConnected()
Publish only if the client is really connected.
This commit is contained in:
		
				
					committed by
					
						
						Max Kellermann
					
				
			
			
				
	
			
			
			
						parent
						
							6b43338e06
						
					
				
				
					commit
					d28cb93835
				
			@@ -30,11 +30,15 @@ void
 | 
				
			|||||||
Client::Close() noexcept
 | 
					Client::Close() noexcept
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (client != nullptr) {
 | 
						if (client != nullptr) {
 | 
				
			||||||
 | 
							connected = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto *l : listeners)
 | 
							for (auto *l : listeners)
 | 
				
			||||||
			l->OnAvahiDisconnect();
 | 
								l->OnAvahiDisconnect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		avahi_client_free(client);
 | 
							avahi_client_free(client);
 | 
				
			||||||
		client = nullptr;
 | 
							client = nullptr;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							assert(!connected);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reconnect_timer.Cancel();
 | 
						reconnect_timer.Cancel();
 | 
				
			||||||
@@ -45,6 +49,8 @@ Client::ClientCallback(AvahiClient *c, AvahiClientState state) noexcept
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	switch (state) {
 | 
						switch (state) {
 | 
				
			||||||
	case AVAHI_CLIENT_S_RUNNING:
 | 
						case AVAHI_CLIENT_S_RUNNING:
 | 
				
			||||||
 | 
							connected = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto *l : listeners)
 | 
							for (auto *l : listeners)
 | 
				
			||||||
			l->OnAvahiConnect(c);
 | 
								l->OnAvahiConnect(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -73,12 +79,15 @@ Client::ClientCallback(AvahiClient *c, AvahiClientState state) noexcept
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	case AVAHI_CLIENT_S_COLLISION:
 | 
						case AVAHI_CLIENT_S_COLLISION:
 | 
				
			||||||
	case AVAHI_CLIENT_S_REGISTERING:
 | 
						case AVAHI_CLIENT_S_REGISTERING:
 | 
				
			||||||
 | 
							assert(!connected);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto *l : listeners)
 | 
							for (auto *l : listeners)
 | 
				
			||||||
			l->OnAvahiChanged();
 | 
								l->OnAvahiChanged();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case AVAHI_CLIENT_CONNECTING:
 | 
						case AVAHI_CLIENT_CONNECTING:
 | 
				
			||||||
 | 
							assert(!connected);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -95,6 +104,7 @@ void
 | 
				
			|||||||
Client::OnReconnectTimer() noexcept
 | 
					Client::OnReconnectTimer() noexcept
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert(client == nullptr);
 | 
						assert(client == nullptr);
 | 
				
			||||||
 | 
						assert(!connected);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int error;
 | 
						int error;
 | 
				
			||||||
	client = avahi_client_new(&poll, AVAHI_CLIENT_NO_FAIL,
 | 
						client = avahi_client_new(&poll, AVAHI_CLIENT_NO_FAIL,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,8 @@ class Client final {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	std::forward_list<ConnectionListener *> listeners;
 | 
						std::forward_list<ConnectionListener *> listeners;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool connected = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	Client(EventLoop &event_loop, ErrorHandler &_error_handler) noexcept;
 | 
						Client(EventLoop &event_loop, ErrorHandler &_error_handler) noexcept;
 | 
				
			||||||
	~Client() noexcept;
 | 
						~Client() noexcept;
 | 
				
			||||||
@@ -42,6 +44,10 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	void Close() noexcept;
 | 
						void Close() noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool IsConnected() const noexcept {
 | 
				
			||||||
 | 
							return connected;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AvahiClient *GetClient() noexcept {
 | 
						AvahiClient *GetClient() noexcept {
 | 
				
			||||||
		return client;
 | 
							return client;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,9 +48,8 @@ Publisher::Publisher(Client &_client, const char *_name,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	client.AddListener(*this);
 | 
						client.AddListener(*this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto *c = client.GetClient();
 | 
						if (client.IsConnected())
 | 
				
			||||||
	if (c != nullptr)
 | 
							RegisterServices(client.GetClient());
 | 
				
			||||||
		RegisterServices(c);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Publisher::~Publisher() noexcept
 | 
					Publisher::~Publisher() noexcept
 | 
				
			||||||
@@ -168,9 +167,8 @@ Publisher::ShowServices() noexcept
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	visible = true;
 | 
						visible = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto *c = client.GetClient();
 | 
						if (client.IsConnected())
 | 
				
			||||||
	if (c != nullptr)
 | 
							RegisterServices(client.GetClient());
 | 
				
			||||||
		RegisterServices(c);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user