1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MAC_H_
#define CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MAC_H_
#import <Foundation/Foundation.h>
#import <Network/Network.h>
#include <memory>
#include <string>
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "chrome/browser/local_discovery/service_discovery_shared_client.h"
namespace base {
class Thread;
}
@class NetServiceBrowser;
@class NetServiceResolver;
namespace local_discovery {
// Implementation of ServiceDiscoveryClient that uses the Bonjour SDK.
// https://developer.apple.com/library/mac/documentation/Networking/Conceptual/
// NSNetServiceProgGuide/Articles/BrowsingForServices.html
class ServiceDiscoveryClientMac : public ServiceDiscoverySharedClient {
public:
ServiceDiscoveryClientMac();
ServiceDiscoveryClientMac(const ServiceDiscoveryClientMac&) = delete;
ServiceDiscoveryClientMac& operator=(const ServiceDiscoveryClientMac&) =
delete;
private:
friend class ServiceDiscoveryClientMacTest;
~ServiceDiscoveryClientMac() override;
// ServiceDiscoveryClient implementation.
std::unique_ptr<ServiceWatcher> CreateServiceWatcher(
const std::string& service_type,
ServiceWatcher::UpdatedCallback callback) override;
std::unique_ptr<ServiceResolver> CreateServiceResolver(
const std::string& service_name,
ServiceResolver::ResolveCompleteCallback callback) override;
std::unique_ptr<LocalDomainResolver> CreateLocalDomainResolver(
const std::string& domain,
net::AddressFamily address_family,
LocalDomainResolver::IPAddressCallback callback) override;
void StartThreadIfNotStarted();
std::unique_ptr<base::Thread> service_discovery_thread_;
};
class ServiceWatcherImplMac : public ServiceWatcher {
public:
ServiceWatcherImplMac(
const std::string& service_type,
ServiceWatcher::UpdatedCallback callback,
scoped_refptr<base::SingleThreadTaskRunner> service_discovery_runner);
ServiceWatcherImplMac(const ServiceWatcherImplMac&) = delete;
ServiceWatcherImplMac& operator=(const ServiceWatcherImplMac&) = delete;
~ServiceWatcherImplMac() override;
void OnServicesUpdate(ServiceWatcher::UpdateType update,
const std::string& service);
void RecordPermissionState(bool permission_granted);
private:
void Start() override;
void DiscoverNewServices() override;
void SetActivelyRefreshServices(bool actively_refresh_services) override;
std::string GetServiceType() const override;
// These members should only be accessed on the object creator's sequence.
const std::string service_type_;
ServiceWatcher::UpdatedCallback callback_;
bool started_ = false;
// TODO(crbug.com/376743512): Remove this workaround once the issue is fixed.
bool force_enable_legacy_discovery_ = false;
scoped_refptr<base::SingleThreadTaskRunner> service_discovery_runner_;
// TODO(crbug.com/354231463): Remove usage of NetServiceBrowser once the
// feature media_router::kUseNetworkFrameworkForLocalDiscovery is enabled by
// default. `nw_browser_` and `browser_` lives on the
// `service_discovery_runner_`, though they are initialized on the object
// creator's sequence. They are cleaned up in `StopServiceBrowser()`.
nw_browser_t __strong nw_browser_;
NetServiceBrowser* __strong browser_;
base::WeakPtrFactory<ServiceWatcherImplMac> weak_factory_{this};
};
class ServiceResolverImplMac : public ServiceResolver {
public:
ServiceResolverImplMac(
const std::string& service_name,
ServiceResolver::ResolveCompleteCallback callback,
scoped_refptr<base::SingleThreadTaskRunner> service_discovery_runner);
ServiceResolverImplMac(const ServiceResolverImplMac&) = delete;
ServiceResolverImplMac& operator=(const ServiceResolverImplMac&) = delete;
~ServiceResolverImplMac() override;
private:
void StartResolving() override;
std::string GetName() const override;
void OnResolveComplete(RequestStatus status,
const ServiceDescription& description);
void StopResolving();
// These members should only be accessed on the object creator's sequence.
const std::string service_name_;
ServiceResolver::ResolveCompleteCallback callback_;
bool has_resolved_ = false;
scoped_refptr<base::SingleThreadTaskRunner> service_discovery_runner_;
// |resolver_| lives on the |service_discovery_runner_|, though it is
// initialized on the object creator's sequence. It is released in
// StopResolving().
NetServiceResolver* __strong resolver_;
base::WeakPtrFactory<ServiceResolverImplMac> weak_factory_{this};
};
// Parses the data out of the |service|, updating the |description| with the
// results.
void ParseNetService(NSNetService* service, ServiceDescription& description);
} // namespace local_discovery
#endif // CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MAC_H_
|