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.
9 #include "ZeroconfAndroid.h"
11 #include "utils/log.h"
15 #include <androidjni/Context.h>
17 CZeroconfAndroid::CZeroconfAndroid()
18 : m_manager(CJNIContext::getSystemService(CJNIContext::NSD_SERVICE
))
22 CZeroconfAndroid::~CZeroconfAndroid()
27 bool CZeroconfAndroid::doPublishService(const std::string
& fcr_identifier
, const std::string
& fcr_type
, const std::string
& fcr_name
, unsigned int f_port
, const std::vector
<std::pair
<std::string
, std::string
> >& txt
)
29 CLog::Log(LOGDEBUG
, "ZeroconfAndroid: identifier: {} type: {} name:{} port:{}", fcr_identifier
,
30 fcr_type
, fcr_name
, f_port
);
32 struct tServiceRef newService
;
34 newService
.serviceInfo
.setServiceName(fcr_name
);
35 newService
.serviceInfo
.setServiceType(fcr_type
);
36 newService
.serviceInfo
.setHost(CJNIInetAddress::getLocalHost());
37 newService
.serviceInfo
.setPort(f_port
);
39 for (const auto& it
: txt
)
41 // CLog::Log(LOGDEBUG, "ZeroconfAndroid: key:{}, value:{}", it.first,it.second);
42 newService
.serviceInfo
.setAttribute(it
.first
, it
.second
);
45 m_manager
.registerService(newService
.serviceInfo
, 1 /* PROTOCOL_DNS_SD */, newService
.registrationListener
);
47 std::unique_lock
<CCriticalSection
> lock(m_data_guard
);
48 newService
.updateNumber
= 0;
49 m_services
.insert(make_pair(fcr_identifier
, newService
));
54 bool CZeroconfAndroid::doForceReAnnounceService(const std::string
& fcr_identifier
)
57 std::unique_lock
<CCriticalSection
> lock(m_data_guard
);
58 tServiceMap::iterator it
= m_services
.find(fcr_identifier
);
59 if(it
!= m_services
.end())
61 // for force announcing a service with mdns we need
62 // to change a txt record - so we diddle between
63 // even and odd dummy records here
64 if ( (it
->second
.updateNumber
% 2) == 0)
65 it
->second
.serviceInfo
.setAttribute("xbmcdummy", "evendummy");
67 it
->second
.serviceInfo
.setAttribute("xbmcdummy", "odddummy");
68 it
->second
.updateNumber
++;
70 m_manager
.unregisterService(it
->second
.registrationListener
);
71 it
->second
.registrationListener
= jni::CJNIXBMCNsdManagerRegistrationListener();
72 m_manager
.registerService(it
->second
.serviceInfo
, 1 /* PROTOCOL_DNS_SD */, it
->second
.registrationListener
);
77 bool CZeroconfAndroid::doRemoveService(const std::string
& fcr_ident
)
79 std::unique_lock
<CCriticalSection
> lock(m_data_guard
);
80 tServiceMap::iterator it
= m_services
.find(fcr_ident
);
81 if(it
!= m_services
.end())
83 m_manager
.unregisterService(it
->second
.registrationListener
);
85 CLog::Log(LOGDEBUG
, "CZeroconfAndroid: Removed service {}", fcr_ident
);
92 void CZeroconfAndroid::doStop()
95 std::unique_lock
<CCriticalSection
> lock(m_data_guard
);
96 CLog::Log(LOGDEBUG
, "ZeroconfAndroid: Shutdown services");
97 for (const auto& it
: m_services
)
99 m_manager
.unregisterService(it
.second
.registrationListener
);
100 CLog::Log(LOGDEBUG
, "CZeroconfAndroid: Removed service {}", it
.first
);