kodi
ZeroconfBrowserDarwin.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include <memory>
12 #include <map>
13 #include <string>
14 #include <vector>
15 
16 #include "network/ZeroconfBrowser.h"
17 #include "threads/Thread.h"
18 #include "threads/CriticalSection.h"
19 
20 #include <CoreFoundation/CoreFoundation.h>
21 #if defined(TARGET_DARWIN_OSX)
22  #include <CoreServices/CoreServices.h>
23 #else
24  #include <CFNetwork/CFNetServices.h>
25 #endif
26 
27 //platform specific implementation of zeroconfbrowser interface using native os x APIs
29 {
30 public:
32  ~CZeroconfBrowserDarwin() override;
33 
34 private:
37  bool doAddServiceType(const std::string& fcr_service_type) override;
38  bool doRemoveServiceType(const std::string& fcr_service_type) override;
39 
40  std::vector<CZeroconfBrowser::ZeroconfService> doGetFoundServices() override;
41  bool doResolveService(CZeroconfBrowser::ZeroconfService& fr_service, double f_timeout) override;
43 
45  static void BrowserCallback(CFNetServiceBrowserRef browser, CFOptionFlags flags, CFTypeRef domainOrService, CFStreamError *error, void *info);
47  static void ResolveCallback(CFNetServiceRef theService, CFStreamError *error, void *info);
48 
50  void addDiscoveredService(CFNetServiceBrowserRef browser, CFOptionFlags flags, ZeroconfService const &fcr_service);
52  void removeDiscoveredService(CFNetServiceBrowserRef browser, CFOptionFlags flags, ZeroconfService const &fcr_service);
53 
54  //CF runloop ref; we're using main-threads runloop
55  CFRunLoopRef m_runloop = nullptr;
56 
57  //shared variables (with guard)
59  CCriticalSection m_data_guard;
60  // tBrowserMap maps service types the corresponding browser
61  typedef std::map<std::string, CFNetServiceBrowserRef> tBrowserMap;
62  tBrowserMap m_service_browsers;
63  //tDiscoveredServicesMap maps browsers to their discovered services + a ref-count for each service
64  //ref-count is needed, because a service might pop up more than once, if there's more than one network-iface
65  typedef std::map<CFNetServiceBrowserRef, std::vector<std::pair<ZeroconfService, unsigned int> > > tDiscoveredServicesMap;
66  tDiscoveredServicesMap m_discovered_services;
67 };
Definition: ZeroconfBrowserDarwin.h:28
Definition: ZeroconfBrowser.h:27
this class provides support for zeroconf browsing
Definition: ZeroconfBrowser.h:24