Skip to content

Commit 28de37b

Browse files
committed
Fix the code that gets the domain name returned from browse and pass it into the resolve
1 parent bc4dd91 commit 28de37b

File tree

3 files changed

+31
-33
lines changed

3 files changed

+31
-33
lines changed

src/platform/Darwin/DnssdContexts.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ void RegisterContext::DispatchSuccess()
336336
}
337337

338338
BrowseContext * BrowseContext::sContextDispatchingSuccess = nullptr;
339+
std::vector<DnssdService> * BrowseContext::sDispatchedServices = nullptr;
339340

340341
BrowseContext::BrowseContext(void * cbContext, DnssdBrowseCallback cb, DnssdServiceProtocol cbContextProtocol)
341342
{
@@ -367,7 +368,9 @@ void BrowseContext::DispatchPartialSuccess()
367368
{
368369
dnsServices.push_back(std::move(iter.first));
369370
}
371+
sDispatchedServices = &dnsServices;
370372
callback(context, dnsServices.data(), dnsServices.size(), false, CHIP_NO_ERROR);
373+
sDispatchedServices = nullptr;
371374
sContextDispatchingSuccess = nullptr;
372375
services.clear();
373376
}

src/platform/Darwin/DnssdImpl.cpp

+27-33
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,6 @@ std::shared_ptr<uint32_t> GetCounterHolder(const char * name)
131131
return std::make_shared<uint32_t>(0);
132132
}
133133

134-
bool ServicesAreEqual(DnssdService service, DnssdService other)
135-
{
136-
return strcmp(service.mName, other.mName) == 0 && GetFullType(&service) == GetFullType(&other) &&
137-
service.mInterface == other.mInterface;
138-
}
139-
140134
bool IsSRPType(const char * domain)
141135
{
142136
return strcmp(kSRPDot, domain) == 0;
@@ -233,23 +227,26 @@ static void OnBrowse(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interf
233227
sdCtx->OnBrowse(flags, name, type, domain, interfaceId);
234228
}
235229

230+
CHIP_ERROR BrowseOnDomain(BrowseHandler * sdCtx, uint32_t interfaceId, const char * type, const char * domain)
231+
{
232+
auto sdRef = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
233+
234+
auto err = DNSServiceBrowse(&sdRef, kBrowseFlags, interfaceId, type, domain, OnBrowse, sdCtx);
235+
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
236+
return CHIP_NO_ERROR;
237+
}
238+
236239
CHIP_ERROR Browse(BrowseHandler * sdCtx, uint32_t interfaceId, const char * type)
237240
{
238241
auto err = DNSServiceCreateConnection(&sdCtx->serviceRef);
239242
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
240243

241244
// We will browse on both the local domain and the SRP domain.
242245
ChipLogProgress(Discovery, "Browsing for: %s on local domain", StringOrNullMarker(type));
243-
244-
auto sdRefLocal = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
245-
err = DNSServiceBrowse(&sdRefLocal, kBrowseFlags, interfaceId, type, kLocalDot, OnBrowse, sdCtx);
246-
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
246+
ReturnErrorOnFailure(BrowseOnDomain(sdCtx, interfaceId, type, kLocalDot));
247247

248248
ChipLogProgress(Discovery, "Browsing for: %s on %s domain", StringOrNullMarker(type), kSRPDot);
249-
250-
auto sdRefSRP = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
251-
err = DNSServiceBrowse(&sdRefSRP, kBrowseFlags, interfaceId, type, kSRPDot, OnBrowse, sdCtx);
252-
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
249+
ReturnErrorOnFailure(BrowseOnDomain(sdCtx, interfaceId, type, kSRPDot));
253250

254251
return MdnsContexts::GetInstance().Add(sdCtx, sdCtx->serviceRef);
255252
}
@@ -377,6 +374,15 @@ static void OnResolve(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t inter
377374
}
378375
}
379376

377+
static CHIP_ERROR ResolveWithContext(ResolveContext * sdCtx, uint32_t interfaceId, const char * type, const char * name, const char * domain, ResolveContextWithType * contextWithType)
378+
{
379+
auto sdRef = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
380+
381+
auto err = DNSServiceResolve(&sdRef, kResolveFlags, interfaceId, name, type, domain, OnResolve, contextWithType);
382+
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
383+
return CHIP_NO_ERROR;
384+
}
385+
380386
static CHIP_ERROR Resolve(ResolveContext * sdCtx, uint32_t interfaceId, chip::Inet::IPAddressType addressType, const char * type,
381387
const char * name, const char * domain)
382388
{
@@ -390,25 +396,14 @@ static CHIP_ERROR Resolve(ResolveContext * sdCtx, uint32_t interfaceId, chip::In
390396
// Otherwise we will try to resolve using both the local domain and the SRP domain.
391397
if (domain != nullptr)
392398
{
393-
auto sdRef = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
394-
395-
ResolveContextWithType * contextWithType =
396-
IsSRPType(domain) ? &sdCtx->resolveContextWithSRPType : &sdCtx->resolveContextWithNonSRPType;
397-
err = DNSServiceResolve(&sdRef, kResolveFlags, interfaceId, name, type, domain, OnResolve, contextWithType);
398-
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
399+
ReturnErrorOnFailure(ResolveWithContext(sdCtx, interfaceId, type, name, domain, IsSRPType(domain) ? &sdCtx->resolveContextWithSRPType : &sdCtx->resolveContextWithNonSRPType));
399400
sdCtx->shoulStartSRPTimerForResolve = false;
400401
}
401402
else
402403
{
403-
auto sdRefLocal = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
404-
err = DNSServiceResolve(&sdRefLocal, kResolveFlags, interfaceId, name, type, kLocalDot, OnResolve,
405-
&sdCtx->resolveContextWithNonSRPType);
406-
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
404+
ReturnErrorOnFailure(ResolveWithContext(sdCtx, interfaceId, type, name, kLocalDot, &sdCtx->resolveContextWithNonSRPType));
407405

408-
auto sdRefSRP = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
409-
err = DNSServiceResolve(&sdRefSRP, kResolveFlags, interfaceId, name, type, kSRPDot, OnResolve,
410-
&sdCtx->resolveContextWithSRPType);
411-
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
406+
ReturnErrorOnFailure(ResolveWithContext(sdCtx, interfaceId, type, name, kSRPDot, &sdCtx->resolveContextWithNonSRPType));
412407
}
413408

414409
auto retval = MdnsContexts::GetInstance().Add(sdCtx, sdCtx->serviceRef);
@@ -579,11 +574,10 @@ CHIP_ERROR ChipDnssdResolve(DnssdService * service, chip::Inet::InterfaceId inte
579574

580575
if (BrowseContext::sContextDispatchingSuccess != nullptr)
581576
{
582-
for (auto iter : BrowseContext::sContextDispatchingSuccess->services)
583-
{
584-
if (ServicesAreEqual(*service, iter.first))
585-
{
586-
domain = iter.second.c_str();
577+
for (size_t i = 0; i < BrowseContext::sDispatchedServices->size(); ++i) {
578+
if (service == &BrowseContext::sDispatchedServices->at(i)) {
579+
domain = BrowseContext::sContextDispatchingSuccess->services[i].second.c_str();
580+
break;
587581
}
588582
}
589583
}

src/platform/Darwin/DnssdImpl.h

+1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ struct BrowseContext : public BrowseHandler
196196
// TODO: Consider fixing the higher-level APIs to make it possible to pass
197197
// in multiple IPs for a successful browse result.
198198
static BrowseContext * sContextDispatchingSuccess;
199+
static std::vector<DnssdService> * sDispatchedServices;
199200
};
200201

201202
struct BrowseWithDelegateContext : public BrowseHandler

0 commit comments

Comments
 (0)