Skip to content

Commit

Permalink
[Android] Add Service Type Protocol setting in dnssd (#23711)
Browse files Browse the repository at this point in the history
* Add to set Android dnssd service type protocol

* Fix restyle

* Seperate serviceName API

* Restyle

* Add exception case, add null terminator

* Modify from review

* Check restyle
  • Loading branch information
joonhaengHeo authored and pull[bot] committed Oct 20, 2023
1 parent d899774 commit 066d282
Showing 1 changed file with 33 additions and 2 deletions.
35 changes: 33 additions & 2 deletions src/platform/android/DnssdImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,33 @@ CHIP_ERROR ChipDnssdStopBrowse(intptr_t browseIdentifier)
return CHIP_ERROR_NOT_IMPLEMENTED;
}

template <size_t N>
CHIP_ERROR extractProtocol(const char * serviceType, char (&outServiceName)[N], DnssdServiceProtocol & outProtocol)
{
const char * dotPos = strrchr(serviceType, '.');
ReturnErrorCodeIf(dotPos == nullptr, CHIP_ERROR_INVALID_ARGUMENT);

size_t lengthWithoutProtocol = static_cast<size_t>(dotPos - serviceType);
ReturnErrorCodeIf(lengthWithoutProtocol + 1 > N, CHIP_ERROR_INVALID_ARGUMENT);

memcpy(outServiceName, serviceType, lengthWithoutProtocol);
outServiceName[lengthWithoutProtocol] = '\0'; // Set a null terminator

outProtocol = DnssdServiceProtocol::kDnssdProtocolUnknown;
if (strcmp("._tcp", dotPos) == 0)
{
outProtocol = DnssdServiceProtocol::kDnssdProtocolTcp;
}
else if (strcmp("._udp", dotPos) == 0)
{
outProtocol = DnssdServiceProtocol::kDnssdProtocolUdp;
}

ReturnErrorCodeIf(outProtocol == DnssdServiceProtocol::kDnssdProtocolUnknown, CHIP_ERROR_INVALID_ARGUMENT);

return CHIP_NO_ERROR;
}

CHIP_ERROR ChipDnssdResolve(DnssdService * service, Inet::InterfaceId interface, DnssdResolveCallback callback, void * context)
{
VerifyOrReturnError(service != nullptr && callback != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
Expand Down Expand Up @@ -316,7 +343,10 @@ void HandleResolve(jstring instanceName, jstring serviceType, jstring hostName,
DnssdService service = {};
CopyString(service.mName, jniInstanceName.c_str());
CopyString(service.mHostName, jnihostName.c_str());
CopyString(service.mType, jniServiceType.c_str());

VerifyOrReturn(extractProtocol(jniServiceType.c_str(), service.mType, service.mProtocol) == CHIP_NO_ERROR,
dispatch(CHIP_ERROR_INVALID_ARGUMENT));

service.mPort = static_cast<uint16_t>(port);
service.mInterface = iface;
service.mTextEntrySize = 0;
Expand Down Expand Up @@ -412,7 +442,8 @@ void HandleBrowse(jobjectArray instanceName, jstring serviceType, jlong callback
dispatch(CHIP_ERROR_INVALID_ARGUMENT));

CopyString(service[i].mName, jniInstanceName.c_str());
CopyString(service[i].mType, jniServiceType.c_str());
VerifyOrReturn(extractProtocol(jniServiceType.c_str(), service[i].mType, service[i].mProtocol) == CHIP_NO_ERROR,
dispatch(CHIP_ERROR_INVALID_ARGUMENT));
}

dispatch(CHIP_NO_ERROR, service, size);
Expand Down

0 comments on commit 066d282

Please sign in to comment.