zeroconf/avahi/Client: new class, replacing lots of code from ZeroconfAvahi.cxx
This commit is contained in:
parent
cfcafdf822
commit
978d2638d8
@ -18,7 +18,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ZeroconfAvahi.hxx"
|
#include "ZeroconfAvahi.hxx"
|
||||||
#include "avahi/Poll.hxx"
|
#include "avahi/Client.hxx"
|
||||||
|
#include "avahi/ConnectionListener.hxx"
|
||||||
|
#include "avahi/ErrorHandler.hxx"
|
||||||
#include "ZeroconfInternal.hxx"
|
#include "ZeroconfInternal.hxx"
|
||||||
#include "Listen.hxx"
|
#include "Listen.hxx"
|
||||||
#include "util/Domain.hxx"
|
#include "util/Domain.hxx"
|
||||||
@ -35,17 +37,34 @@
|
|||||||
|
|
||||||
static constexpr Domain avahi_domain("avahi");
|
static constexpr Domain avahi_domain("avahi");
|
||||||
|
|
||||||
class AvahiGlue final {
|
class AvahiGlue final : Avahi::ErrorHandler, Avahi::ConnectionListener {
|
||||||
public:
|
public:
|
||||||
Avahi::Poll poll;
|
Avahi::Client client;
|
||||||
|
|
||||||
explicit AvahiGlue(EventLoop &event_loop)
|
explicit AvahiGlue(EventLoop &event_loop)
|
||||||
:poll(event_loop) {}
|
:client(event_loop, *this)
|
||||||
|
{
|
||||||
|
client.AddListener(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
~AvahiGlue() noexcept {
|
||||||
|
client.RemoveListener(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* virtual methods from class AvahiConnectionListener */
|
||||||
|
void OnAvahiConnect(AvahiClient *client) noexcept override;
|
||||||
|
void OnAvahiDisconnect() noexcept override;
|
||||||
|
void OnAvahiChanged() noexcept override;
|
||||||
|
|
||||||
|
/* virtual methods from class Avahi::ErrorHandler */
|
||||||
|
bool OnAvahiError(std::exception_ptr e) noexcept override {
|
||||||
|
LogError(e);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *avahi_name;
|
static char *avahi_name;
|
||||||
static AvahiGlue *avahi_glue;
|
static AvahiGlue *avahi_glue;
|
||||||
static AvahiClient *avahi_client;
|
|
||||||
static AvahiEntryGroup *avahi_group;
|
static AvahiEntryGroup *avahi_group;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -154,91 +173,32 @@ AvahiRegisterService(AvahiClient *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback when avahi changes state */
|
void
|
||||||
static void
|
AvahiGlue::OnAvahiConnect(AvahiClient *c) noexcept
|
||||||
MyAvahiClientCallback(AvahiClient *c, AvahiClientState state,
|
|
||||||
[[maybe_unused]] void *userdata)
|
|
||||||
{
|
{
|
||||||
assert(c != nullptr);
|
if (avahi_group == nullptr)
|
||||||
|
AvahiRegisterService(c);
|
||||||
|
}
|
||||||
|
|
||||||
/* Called whenever the client or server state changes */
|
void
|
||||||
FormatDebug(avahi_domain, "Client changed to state %d", state);
|
AvahiGlue::OnAvahiDisconnect() noexcept
|
||||||
|
{
|
||||||
switch (state) {
|
if (avahi_group != nullptr) {
|
||||||
int reason;
|
avahi_entry_group_free(avahi_group);
|
||||||
|
avahi_group = nullptr;
|
||||||
case AVAHI_CLIENT_S_RUNNING:
|
|
||||||
LogDebug(avahi_domain, "Client is RUNNING");
|
|
||||||
|
|
||||||
/* The server has startup successfully and registered its host
|
|
||||||
* name on the network, so it's time to create our services */
|
|
||||||
if (avahi_group == nullptr)
|
|
||||||
AvahiRegisterService(c);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AVAHI_CLIENT_FAILURE:
|
|
||||||
reason = avahi_client_errno(c);
|
|
||||||
if (reason == AVAHI_ERR_DISCONNECTED) {
|
|
||||||
LogNotice(avahi_domain,
|
|
||||||
"Client Disconnected, will reconnect shortly");
|
|
||||||
if (avahi_group != nullptr) {
|
|
||||||
avahi_entry_group_free(avahi_group);
|
|
||||||
avahi_group = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avahi_client != nullptr)
|
|
||||||
avahi_client_free(avahi_client);
|
|
||||||
avahi_client =
|
|
||||||
avahi_client_new(&avahi_glue->poll,
|
|
||||||
AVAHI_CLIENT_NO_FAIL,
|
|
||||||
MyAvahiClientCallback, nullptr,
|
|
||||||
&reason);
|
|
||||||
if (avahi_client == nullptr)
|
|
||||||
FormatWarning(avahi_domain,
|
|
||||||
"Could not reconnect: %s",
|
|
||||||
avahi_strerror(reason));
|
|
||||||
} else {
|
|
||||||
FormatWarning(avahi_domain,
|
|
||||||
"Client failure: %s (terminal)",
|
|
||||||
avahi_strerror(reason));
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AVAHI_CLIENT_S_COLLISION:
|
|
||||||
LogDebug(avahi_domain, "Client is COLLISION");
|
|
||||||
|
|
||||||
/* Let's drop our registered services. When the server
|
|
||||||
is back in AVAHI_SERVER_RUNNING state we will
|
|
||||||
register them again with the new host name. */
|
|
||||||
if (avahi_group != nullptr) {
|
|
||||||
LogDebug(avahi_domain, "Resetting group");
|
|
||||||
avahi_entry_group_reset(avahi_group);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AVAHI_CLIENT_S_REGISTERING:
|
|
||||||
LogDebug(avahi_domain, "Client is REGISTERING");
|
|
||||||
|
|
||||||
/* The server records are now being established. This
|
|
||||||
* might be caused by a host name change. We need to wait
|
|
||||||
* for our own records to register until the host name is
|
|
||||||
* properly esatblished. */
|
|
||||||
|
|
||||||
if (avahi_group != nullptr) {
|
|
||||||
LogDebug(avahi_domain, "Resetting group");
|
|
||||||
avahi_entry_group_reset(avahi_group);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AVAHI_CLIENT_CONNECTING:
|
|
||||||
LogDebug(avahi_domain, "Client is CONNECTING");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
AvahiGlue::OnAvahiChanged() noexcept
|
||||||
|
{
|
||||||
|
if (avahi_group != nullptr) {
|
||||||
|
LogDebug(avahi_domain, "Resetting group");
|
||||||
|
avahi_entry_group_reset(avahi_group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
AvahiInit(EventLoop &loop, const char *serviceName)
|
AvahiInit(EventLoop &loop, const char *serviceName)
|
||||||
{
|
{
|
||||||
@ -250,16 +210,6 @@ AvahiInit(EventLoop &loop, const char *serviceName)
|
|||||||
avahi_name = avahi_strdup(serviceName);
|
avahi_name = avahi_strdup(serviceName);
|
||||||
|
|
||||||
avahi_glue = new AvahiGlue(loop);
|
avahi_glue = new AvahiGlue(loop);
|
||||||
|
|
||||||
int error;
|
|
||||||
avahi_client = avahi_client_new(&avahi_glue->poll, AVAHI_CLIENT_NO_FAIL,
|
|
||||||
MyAvahiClientCallback, nullptr,
|
|
||||||
&error);
|
|
||||||
if (avahi_client == nullptr) {
|
|
||||||
FormatError(avahi_domain, "Failed to create client: %s",
|
|
||||||
avahi_strerror(error));
|
|
||||||
AvahiDeinit();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -272,11 +222,6 @@ AvahiDeinit()
|
|||||||
avahi_group = nullptr;
|
avahi_group = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avahi_client != nullptr) {
|
|
||||||
avahi_client_free(avahi_client);
|
|
||||||
avahi_client = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete avahi_glue;
|
delete avahi_glue;
|
||||||
|
|
||||||
avahi_free(avahi_name);
|
avahi_free(avahi_name);
|
||||||
|
139
src/zeroconf/avahi/Client.cxx
Normal file
139
src/zeroconf/avahi/Client.cxx
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2021 CM4all GmbH
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Client.hxx"
|
||||||
|
#include "ConnectionListener.hxx"
|
||||||
|
#include "ErrorHandler.hxx"
|
||||||
|
#include "Error.hxx"
|
||||||
|
|
||||||
|
#include <avahi-common/error.h>
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
namespace Avahi {
|
||||||
|
|
||||||
|
Client::Client(EventLoop &event_loop, ErrorHandler &_error_handler) noexcept
|
||||||
|
:error_handler(_error_handler),
|
||||||
|
reconnect_timer(event_loop, BIND_THIS_METHOD(OnReconnectTimer)),
|
||||||
|
poll(event_loop)
|
||||||
|
{
|
||||||
|
reconnect_timer.Schedule({});
|
||||||
|
}
|
||||||
|
|
||||||
|
Client::~Client() noexcept
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Client::Close() noexcept
|
||||||
|
{
|
||||||
|
if (client != nullptr) {
|
||||||
|
for (auto *l : listeners)
|
||||||
|
l->OnAvahiDisconnect();
|
||||||
|
|
||||||
|
avahi_client_free(client);
|
||||||
|
client = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
reconnect_timer.Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Client::ClientCallback(AvahiClient *c, AvahiClientState state) noexcept
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case AVAHI_CLIENT_S_RUNNING:
|
||||||
|
for (auto *l : listeners)
|
||||||
|
l->OnAvahiConnect(c);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AVAHI_CLIENT_FAILURE:
|
||||||
|
error = avahi_client_errno(c);
|
||||||
|
if (error == AVAHI_ERR_DISCONNECTED) {
|
||||||
|
Close();
|
||||||
|
|
||||||
|
reconnect_timer.Schedule(std::chrono::seconds(10));
|
||||||
|
} else {
|
||||||
|
if (!error_handler.OnAvahiError(std::make_exception_ptr(MakeError(error,
|
||||||
|
"Avahi connection error"))))
|
||||||
|
return;
|
||||||
|
|
||||||
|
reconnect_timer.Schedule(std::chrono::minutes(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto *l : listeners)
|
||||||
|
l->OnAvahiDisconnect();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AVAHI_CLIENT_S_COLLISION:
|
||||||
|
case AVAHI_CLIENT_S_REGISTERING:
|
||||||
|
for (auto *l : listeners)
|
||||||
|
l->OnAvahiChanged();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AVAHI_CLIENT_CONNECTING:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Client::ClientCallback(AvahiClient *c, AvahiClientState state,
|
||||||
|
void *userdata) noexcept
|
||||||
|
{
|
||||||
|
auto &client = *(Client *)userdata;
|
||||||
|
client.ClientCallback(c, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Client::OnReconnectTimer() noexcept
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
client = avahi_client_new(&poll, AVAHI_CLIENT_NO_FAIL,
|
||||||
|
ClientCallback, this,
|
||||||
|
&error);
|
||||||
|
if (client == nullptr) {
|
||||||
|
if (!error_handler.OnAvahiError(std::make_exception_ptr(MakeError(error,
|
||||||
|
"Failed to create Avahi client"))))
|
||||||
|
return;
|
||||||
|
|
||||||
|
reconnect_timer.Schedule(std::chrono::minutes(1));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Avahi
|
93
src/zeroconf/avahi/Client.hxx
Normal file
93
src/zeroconf/avahi/Client.hxx
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2021 CM4all GmbH
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Poll.hxx"
|
||||||
|
#include "event/CoarseTimerEvent.hxx"
|
||||||
|
|
||||||
|
#include <avahi-client/client.h>
|
||||||
|
|
||||||
|
#include <forward_list>
|
||||||
|
|
||||||
|
class EventLoop;
|
||||||
|
|
||||||
|
namespace Avahi {
|
||||||
|
|
||||||
|
class ErrorHandler;
|
||||||
|
class ConnectionListener;
|
||||||
|
|
||||||
|
class Client final {
|
||||||
|
ErrorHandler &error_handler;
|
||||||
|
|
||||||
|
CoarseTimerEvent reconnect_timer;
|
||||||
|
|
||||||
|
Poll poll;
|
||||||
|
|
||||||
|
AvahiClient *client = nullptr;
|
||||||
|
|
||||||
|
std::forward_list<ConnectionListener *> listeners;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Client(EventLoop &event_loop, ErrorHandler &_error_handler) noexcept;
|
||||||
|
~Client() noexcept;
|
||||||
|
|
||||||
|
Client(const Client &) = delete;
|
||||||
|
Client &operator=(const Client &) = delete;
|
||||||
|
|
||||||
|
EventLoop &GetEventLoop() const noexcept {
|
||||||
|
return poll.GetEventLoop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Close() noexcept;
|
||||||
|
|
||||||
|
AvahiClient *GetClient() noexcept {
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddListener(ConnectionListener &listener) noexcept {
|
||||||
|
listeners.push_front(&listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveListener(ConnectionListener &listener) noexcept {
|
||||||
|
listeners.remove(&listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ClientCallback(AvahiClient *c, AvahiClientState state) noexcept;
|
||||||
|
static void ClientCallback(AvahiClient *c, AvahiClientState state,
|
||||||
|
void *userdata) noexcept;
|
||||||
|
|
||||||
|
void OnReconnectTimer() noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Avahi
|
61
src/zeroconf/avahi/ConnectionListener.hxx
Normal file
61
src/zeroconf/avahi/ConnectionListener.hxx
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2021 CM4all GmbH
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <avahi-client/client.h>
|
||||||
|
|
||||||
|
namespace Avahi {
|
||||||
|
|
||||||
|
class ConnectionListener {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* The connection to the Avahi daemon has been established.
|
||||||
|
*
|
||||||
|
* Note that this may be called again after a collision
|
||||||
|
* (AVAHI_CLIENT_S_COLLISION) or a host name change
|
||||||
|
* (AVAHI_CLIENT_S_REGISTERING).
|
||||||
|
*/
|
||||||
|
virtual void OnAvahiConnect(AvahiClient *client) noexcept = 0;
|
||||||
|
virtual void OnAvahiDisconnect() noexcept = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Something about the Avahi connection has changed, e.g. a
|
||||||
|
* collision (AVAHI_CLIENT_S_COLLISION) or a host name change
|
||||||
|
* (AVAHI_CLIENT_S_REGISTERING). Services shall be
|
||||||
|
* unpublished now, and will be re-published in the following
|
||||||
|
* OnAvahiConnect() call.
|
||||||
|
*/
|
||||||
|
virtual void OnAvahiChanged() noexcept {}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Avahi
|
56
src/zeroconf/avahi/Error.cxx
Normal file
56
src/zeroconf/avahi/Error.cxx
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2021 CM4all GmbH
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Error.hxx"
|
||||||
|
|
||||||
|
#include <avahi-client/client.h>
|
||||||
|
#include <avahi-common/error.h>
|
||||||
|
|
||||||
|
#include <system_error>
|
||||||
|
|
||||||
|
namespace Avahi {
|
||||||
|
|
||||||
|
ErrorCategory error_category;
|
||||||
|
|
||||||
|
std::string
|
||||||
|
ErrorCategory::message(int condition) const
|
||||||
|
{
|
||||||
|
return avahi_strerror(condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::system_error
|
||||||
|
MakeError(AvahiClient &client, const char *msg) noexcept
|
||||||
|
{
|
||||||
|
return MakeError(avahi_client_errno(&client), msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Avahi
|
61
src/zeroconf/avahi/Error.hxx
Normal file
61
src/zeroconf/avahi/Error.hxx
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2021 CM4all GmbH
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <system_error>
|
||||||
|
|
||||||
|
struct AvahiClient;
|
||||||
|
|
||||||
|
namespace Avahi {
|
||||||
|
|
||||||
|
class ErrorCategory final : public std::error_category {
|
||||||
|
public:
|
||||||
|
const char *name() const noexcept override {
|
||||||
|
return "avahi-client";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string message(int condition) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern ErrorCategory error_category;
|
||||||
|
|
||||||
|
inline std::system_error
|
||||||
|
MakeError(int error, const char *msg) noexcept
|
||||||
|
{
|
||||||
|
return std::system_error(error, error_category, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::system_error
|
||||||
|
MakeError(AvahiClient &client, const char *msg) noexcept;
|
||||||
|
|
||||||
|
} // namespace Avahi
|
50
src/zeroconf/avahi/ErrorHandler.hxx
Normal file
50
src/zeroconf/avahi/ErrorHandler.hxx
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2021 CM4all GmbH
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* author: Max Kellermann <mk@cm4all.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
struct AvahiClient;
|
||||||
|
|
||||||
|
namespace Avahi {
|
||||||
|
|
||||||
|
class ErrorHandler {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @return true to keep retrying, false if the failed object
|
||||||
|
* has been disposed
|
||||||
|
*/
|
||||||
|
virtual bool OnAvahiError(std::exception_ptr e) noexcept = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Avahi
|
@ -6,6 +6,8 @@ endif
|
|||||||
|
|
||||||
avahi = static_library(
|
avahi = static_library(
|
||||||
'avahi',
|
'avahi',
|
||||||
|
'Client.cxx',
|
||||||
|
'Error.cxx',
|
||||||
'Poll.cxx',
|
'Poll.cxx',
|
||||||
include_directories: inc,
|
include_directories: inc,
|
||||||
dependencies: [
|
dependencies: [
|
||||||
|
Loading…
Reference in New Issue
Block a user