kodi
ZeroconfBrowserAndroid.h
1 /*
2  * Copyright (C) 2017 Christian Browet
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 "network/ZeroconfBrowser.h"
12 #include "threads/Event.h"
13 
14 #include "platform/android/activity/JNIXBMCNsdManagerDiscoveryListener.h"
15 #include "platform/android/activity/JNIXBMCNsdManagerResolveListener.h"
16 
17 #include <androidjni/NsdManager.h>
18 #include <androidjni/NsdServiceInfo.h>
19 
21 
23 {
24 public:
26  bool IsActive() { return m_isActive; }
27 
28  // CJNINsdManagerDiscoveryListener interface
29 public:
30  void onDiscoveryStarted(const std::string& serviceType) override;
31  void onDiscoveryStopped(const std::string& serviceType) override;
32  void onServiceFound(const jni::CJNINsdServiceInfo& serviceInfo) override;
33  void onServiceLost(const jni::CJNINsdServiceInfo& serviceInfo) override;
34  void onStartDiscoveryFailed(const std::string& serviceType, int errorCode) override;
35  void onStopDiscoveryFailed(const std::string& serviceType, int errorCode) override;
36 
37 protected:
38  CZeroconfBrowserAndroid* m_browser;
39  bool m_isActive = false;
40 };
41 
43 {
44 public:
46 
47  // CJNINsdManagerResolveListener interface
48 public:
49  void onResolveFailed(const jni::CJNINsdServiceInfo& serviceInfo, int errorCode) override;
50  void onServiceResolved(const jni::CJNINsdServiceInfo& serviceInfo) override;
51 
52  CEvent m_resolutionDone;
53  int m_errorCode;
54  jni::CJNINsdServiceInfo m_retServiceInfo;
55 };
56 
58 {
60 
61 public:
63  ~CZeroconfBrowserAndroid() override;
64 
65  // CZeroconfBrowser interface
66 protected:
67  bool doAddServiceType(const std::string& fcr_service_type) override;
68  bool doRemoveServiceType(const std::string& fcr_service_type) override;
69  std::vector<ZeroconfService> doGetFoundServices() override;
70  bool doResolveService(ZeroconfService& fr_service, double f_timeout) override;
71 
72  void addDiscoveredService(CZeroconfBrowserAndroidDiscover* browser, const CZeroconfBrowser::ZeroconfService& fcr_service);
73  void removeDiscoveredService(CZeroconfBrowserAndroidDiscover* browser, const CZeroconfBrowser::ZeroconfService& fcr_service);
74 
75 private:
76  jni::CJNINsdManager m_manager;
77 
78  //shared variables (with guard)
79  CCriticalSection m_data_guard;
80  typedef std::map<std::string, CZeroconfBrowserAndroidDiscover*> tBrowserMap;
81  // tBrowserMap maps service types the corresponding browser
82  tBrowserMap m_service_browsers;
83  //tDiscoveredServicesMap maps browsers to their discovered services + a ref-count for each service
84  //ref-count is needed, because a service might pop up more than once, if there's more than one network-iface
85  typedef std::map<CZeroconfBrowserAndroidDiscover*, std::vector<std::pair<ZeroconfService, unsigned int> > > tDiscoveredServicesMap;
86  tDiscoveredServicesMap m_discovered_services;
87 };
This is an Event class built from a ConditionVariable.
Definition: Event.h:35
Definition: JNIXBMCNsdManagerDiscoveryListener.h:17
Definition: ZeroconfBrowserAndroid.h:22
Definition: JNIXBMCNsdManagerResolveListener.h:17
Definition: ZeroconfBrowserAndroid.h:57
Definition: ZeroconfBrowser.h:27
Definition: ZeroconfBrowserAndroid.h:42
this class provides support for zeroconf browsing
Definition: ZeroconfBrowser.h:24