blob: e3c3251383366acd95e32b6ed6ba2f79c51e5aaf [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cast/common/mdns/mdns_receiver.h"
#include "cast/common/mdns/mdns_reader.h"
namespace cast {
namespace mdns {
MdnsReceiver::MdnsReceiver(UdpSocket* socket,
NetworkRunner* network_runner,
Delegate* delegate)
: socket_(socket), network_runner_(network_runner), delegate_(delegate) {
OSP_DCHECK(socket_);
OSP_DCHECK(network_runner_);
OSP_DCHECK(delegate_);
}
MdnsReceiver::~MdnsReceiver() {
if (state_ == State::kRunning) {
Stop();
}
}
Error MdnsReceiver::Start() {
if (state_ == State::kRunning) {
return Error::Code::kNone;
}
Error result = network_runner_->ReadRepeatedly(socket_, this);
if (result.ok()) {
state_ = State::kRunning;
}
return result;
}
Error MdnsReceiver::Stop() {
if (state_ == State::kStopped) {
return Error::Code::kNone;
}
Error result = network_runner_->CancelRead(socket_);
if (result.ok()) {
state_ = State::kStopped;
}
return result;
}
void MdnsReceiver::OnRead(UdpPacket packet, NetworkRunner* network_runner) {
MdnsReader reader(packet.data(), packet.size());
MdnsMessage message;
if (!reader.Read(&message)) {
return;
}
if (message.type() == MessageType::Response) {
delegate_->OnResponseReceived(message, packet.source());
} else {
delegate_->OnQueryReceived(message, packet.source());
}
}
} // namespace mdns
} // namespace cast