#include "chrome/services/sharing/webrtc/mdns_responder_adapter.h"
#include <string>
#include "base/functional/bind.h"
#include "components/webrtc/net_address_utils.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "net/base/ip_address.h"
#include "third_party/webrtc/rtc_base/ip_address.h"
namespace sharing {
namespace {
void OnNameCreatedForAddress(
webrtc::MdnsResponderInterface::NameCreatedCallback callback,
const webrtc::IPAddress& addr,
const std::string& name,
bool announcement_scheduled) {
callback(addr, name);
}
void OnNameRemovedForAddress(
webrtc::MdnsResponderInterface::NameRemovedCallback callback,
bool removed,
bool goodbye_scheduled) {
callback(removed);
}
}
MdnsResponderAdapter::MdnsResponderAdapter(
mojo::Remote<network::mojom::MdnsResponder> mdns_responder)
: mdns_responder_(std::move(mdns_responder)) {
DCHECK(mdns_responder_.is_bound());
}
MdnsResponderAdapter::~MdnsResponderAdapter() = default;
void MdnsResponderAdapter::CreateNameForAddress(const webrtc::IPAddress& addr,
NameCreatedCallback callback) {
if (!mdns_responder_ || !mdns_responder_.is_connected()) {
LOG(ERROR) << "MdnsResponderAdapter::" << __func__ << ": mDNS responder"
<< " no longer available over mojo, returning empty name.";
callback(addr, std::string());
return;
}
mdns_responder_->CreateNameForAddress(
webrtc::RtcIPAddressToNetIPAddress(addr),
base::BindOnce(&OnNameCreatedForAddress, callback, addr));
}
void MdnsResponderAdapter::RemoveNameForAddress(const webrtc::IPAddress& addr,
NameRemovedCallback callback) {
if (!mdns_responder_ || !mdns_responder_.is_connected()) {
LOG(ERROR) << "MdnsResponderAdapter::" << __func__ << ": mDNS responder"
<< " no longer available over mojo, returning false.";
callback(false);
return;
}
mdns_responder_->RemoveNameForAddress(
webrtc::RtcIPAddressToNetIPAddress(addr),
base::BindOnce(&OnNameRemovedForAddress, callback));
}
}