You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.0 KiB
91 lines
3.0 KiB
// Copyright 2018 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.
|
|
|
|
#ifndef OSP_IMPL_INTERNAL_SERVICES_H_
|
|
#define OSP_IMPL_INTERNAL_SERVICES_H_
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "osp/impl/mdns_platform_service.h"
|
|
#include "osp/impl/mdns_responder_service.h"
|
|
#include "osp/impl/quic/quic_connection_factory.h"
|
|
#include "osp/impl/service_listener_impl.h"
|
|
#include "osp/impl/service_publisher_impl.h"
|
|
#include "osp/public/mdns_service_listener_factory.h"
|
|
#include "osp/public/mdns_service_publisher_factory.h"
|
|
#include "osp/public/protocol_connection_client.h"
|
|
#include "osp/public/protocol_connection_server.h"
|
|
#include "platform/api/network_interface.h"
|
|
#include "platform/api/time.h"
|
|
#include "platform/api/udp_socket.h"
|
|
#include "platform/base/ip_address.h"
|
|
#include "platform/base/macros.h"
|
|
|
|
namespace openscreen {
|
|
|
|
class TaskRunner;
|
|
|
|
namespace osp {
|
|
|
|
// Factory for ServiceListener and ServicePublisher instances; owns internal
|
|
// objects needed to instantiate them such as MdnsResponderService and runs an
|
|
// event loop.
|
|
// TODO(btolsch): This may be renamed and/or split up once QUIC code lands and
|
|
// this use case is more concrete.
|
|
class InternalServices : UdpSocket::Client {
|
|
public:
|
|
static std::unique_ptr<ServiceListener> CreateListener(
|
|
const MdnsServiceListenerConfig& config,
|
|
ServiceListener::Observer* observer,
|
|
TaskRunner* task_runner);
|
|
static std::unique_ptr<ServicePublisher> CreatePublisher(
|
|
const ServicePublisher::Config& config,
|
|
ServicePublisher::Observer* observer,
|
|
TaskRunner* task_runner);
|
|
|
|
// UdpSocket::Client overrides.
|
|
void OnError(UdpSocket* socket, Error error) override;
|
|
void OnSendError(UdpSocket* socket, Error error) override;
|
|
void OnRead(UdpSocket* socket, ErrorOr<UdpPacket> packet) override;
|
|
|
|
private:
|
|
class InternalPlatformLinkage final : public MdnsPlatformService {
|
|
public:
|
|
explicit InternalPlatformLinkage(InternalServices* parent);
|
|
~InternalPlatformLinkage() override;
|
|
|
|
std::vector<BoundInterface> RegisterInterfaces(
|
|
const std::vector<NetworkInterfaceIndex>& allowlist) override;
|
|
void DeregisterInterfaces(
|
|
const std::vector<BoundInterface>& registered_interfaces) override;
|
|
|
|
private:
|
|
InternalServices* const parent_;
|
|
std::vector<std::unique_ptr<UdpSocket>> open_sockets_;
|
|
};
|
|
|
|
// The TaskRunner provided here should live for the duration of this
|
|
// InternalService object's lifetime.
|
|
InternalServices(ClockNowFunctionPtr now_function, TaskRunner* task_runner);
|
|
~InternalServices() override;
|
|
|
|
void RegisterMdnsSocket(UdpSocket* socket);
|
|
void DeregisterMdnsSocket(UdpSocket* socket);
|
|
|
|
static InternalServices* ReferenceSingleton(TaskRunner* task_runner);
|
|
static void DereferenceSingleton(void* instance);
|
|
|
|
MdnsResponderService mdns_service_;
|
|
|
|
TaskRunner* const task_runner_;
|
|
|
|
OSP_DISALLOW_COPY_AND_ASSIGN(InternalServices);
|
|
};
|
|
|
|
} // namespace osp
|
|
} // namespace openscreen
|
|
|
|
#endif // OSP_IMPL_INTERNAL_SERVICES_H_
|