2 * Copyright (C) 2017 Christian Browet
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #include "network/ZeroconfBrowser.h"
12 #include "threads/Event.h"
14 #include "platform/android/activity/JNIXBMCNsdManagerDiscoveryListener.h"
15 #include "platform/android/activity/JNIXBMCNsdManagerResolveListener.h"
17 #include <androidjni/NsdManager.h>
18 #include <androidjni/NsdServiceInfo.h>
20 class CZeroconfBrowserAndroid
;
22 class CZeroconfBrowserAndroidDiscover
: public jni::CJNIXBMCNsdManagerDiscoveryListener
25 explicit CZeroconfBrowserAndroidDiscover(CZeroconfBrowserAndroid
* browser
);
26 bool IsActive() { return m_isActive
; }
28 // CJNINsdManagerDiscoveryListener interface
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
;
38 CZeroconfBrowserAndroid
* m_browser
;
39 bool m_isActive
= false;
42 class CZeroconfBrowserAndroidResolve
: public jni::CJNIXBMCNsdManagerResolveListener
45 CZeroconfBrowserAndroidResolve();
47 // CJNINsdManagerResolveListener interface
49 void onResolveFailed(const jni::CJNINsdServiceInfo
& serviceInfo
, int errorCode
) override
;
50 void onServiceResolved(const jni::CJNINsdServiceInfo
& serviceInfo
) override
;
52 CEvent m_resolutionDone
;
54 jni::CJNINsdServiceInfo m_retServiceInfo
;
57 class CZeroconfBrowserAndroid
: public CZeroconfBrowser
59 friend class CZeroconfBrowserAndroidDiscover
;
62 CZeroconfBrowserAndroid();
63 ~CZeroconfBrowserAndroid() override
;
65 // CZeroconfBrowser interface
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
;
72 void addDiscoveredService(CZeroconfBrowserAndroidDiscover
* browser
, const CZeroconfBrowser::ZeroconfService
& fcr_service
);
73 void removeDiscoveredService(CZeroconfBrowserAndroidDiscover
* browser
, const CZeroconfBrowser::ZeroconfService
& fcr_service
);
76 jni::CJNINsdManager m_manager
;
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
;