/* * Copyright 2018 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef RTC_BASE_FAKE_MDNS_RESPONDER_H_ #define RTC_BASE_FAKE_MDNS_RESPONDER_H_ #include #include #include #include "rtc_base/ip_address.h" #include "rtc_base/location.h" #include "rtc_base/mdns_responder_interface.h" #include "rtc_base/task_utils/to_queued_task.h" #include "rtc_base/thread.h" namespace webrtc { // This class posts tasks on the given `thread` to invoke callbacks. It's the // callback's responsibility to be aware of potential destruction of state it // depends on, e.g., using WeakPtrFactory or PendingTaskSafetyFlag. class FakeMdnsResponder : public MdnsResponderInterface { public: explicit FakeMdnsResponder(rtc::Thread* thread) : thread_(thread) {} ~FakeMdnsResponder() = default; void CreateNameForAddress(const rtc::IPAddress& addr, NameCreatedCallback callback) override { std::string name; if (addr_name_map_.find(addr) != addr_name_map_.end()) { name = addr_name_map_[addr]; } else { name = std::to_string(next_available_id_++) + ".local"; addr_name_map_[addr] = name; } thread_->PostTask( ToQueuedTask([callback, addr, name]() { callback(addr, name); })); } void RemoveNameForAddress(const rtc::IPAddress& addr, NameRemovedCallback callback) override { auto it = addr_name_map_.find(addr); if (it != addr_name_map_.end()) { addr_name_map_.erase(it); } bool result = it != addr_name_map_.end(); thread_->PostTask(ToQueuedTask([callback, result]() { callback(result); })); } rtc::IPAddress GetMappedAddressForName(const std::string& name) const { for (const auto& addr_name_pair : addr_name_map_) { if (addr_name_pair.second == name) { return addr_name_pair.first; } } return rtc::IPAddress(); } private: uint32_t next_available_id_ = 0; std::map addr_name_map_; rtc::Thread* const thread_; }; } // namespace webrtc #endif // RTC_BASE_FAKE_MDNS_RESPONDER_H_