void DNSSD_API CDNSSD::BrowseReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *serviceNameUTF8, const char *regTypeUTF8, const char *replyDomainUTF8, void *context ) { CComObject<CDNSSDService> * service; int err; service = ( CComObject< CDNSSDService>* ) context; require_action( service, exit, err = kDNSServiceErr_Unknown ); if ( !service->Stopped() ) { IBrowseListener * listener; listener = ( IBrowseListener* ) service->GetListener(); require_action( listener, exit, err = kDNSServiceErr_Unknown ); if ( !errorCode ) { CComBSTR serviceName; CComBSTR regType; CComBSTR replyDomain; UTF8ToBSTR( serviceNameUTF8, serviceName ); UTF8ToBSTR( regTypeUTF8, regType ); UTF8ToBSTR( replyDomainUTF8, replyDomain ); if ( flags & kDNSServiceFlagsAdd ) { listener->ServiceFound( service, ( DNSSDFlags ) flags, ifIndex, serviceName, regType, replyDomain ); } else { listener->ServiceLost( service, ( DNSSDFlags ) flags, ifIndex, serviceName, regType, replyDomain ); } } else { listener->BrowseFailed( service, ( DNSSDError ) errorCode ); } } exit: return; }
void DNSSD_API CDNSSD::RegisterReply ( DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *serviceNameUTF8, const char *regTypeUTF8, const char *domainUTF8, void *context ) { CComObject<CDNSSDService> * service; int err; service = ( CComObject< CDNSSDService>* ) context; require_action( service, exit, err = kDNSServiceErr_Unknown ); if ( !service->Stopped() ) { IRegisterListener * listener; listener = ( IRegisterListener* ) service->GetListener(); require_action( listener, exit, err = kDNSServiceErr_Unknown ); if ( !errorCode ) { CComBSTR serviceName; CComBSTR regType; CComBSTR domain; BOOL ok; ok = UTF8ToBSTR( serviceNameUTF8, serviceName ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); ok = UTF8ToBSTR( regTypeUTF8, regType ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); ok = UTF8ToBSTR( domainUTF8, domain ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); listener->ServiceRegistered( service, ( DNSSDFlags ) flags, serviceName, regType, domain ); } else { listener->ServiceRegisterFailed( service, ( DNSSDError ) errorCode ); } } exit: return; }
void DNSSD_API CDNSSD::QueryRecordReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *fullNameUTF8, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context ) { CComObject<CDNSSDService> * service; int err; service = ( CComObject< CDNSSDService>* ) context; require_action( service, exit, err = kDNSServiceErr_Unknown ); if ( !service->Stopped() ) { IQueryRecordListener * listener; listener = ( IQueryRecordListener* ) service->GetListener(); require_action( listener, exit, err = kDNSServiceErr_Unknown ); if ( !errorCode ) { CComBSTR fullName; VARIANT var; BOOL ok; ok = UTF8ToBSTR( fullNameUTF8, fullName ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); ok = ByteArrayToVariant( rdata, rdlen, &var ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); listener->QueryRecordAnswered( service, ( DNSSDFlags ) flags, ifIndex, fullName, ( DNSSDRRType ) rrtype, ( DNSSDRRClass ) rrclass, var, ttl ); } else { listener->QueryRecordFailed( service, ( DNSSDError ) errorCode ); } } exit: return; }
STDMETHODIMP CTXTRecord::GetKeyAtIndex(ULONG index, BSTR* retval) { char keyBuf[ 64 ]; uint8_t rawValueLen; const void * rawValue; CComBSTR temp; DNSServiceErrorType err; BOOL ok; HRESULT hr = S_OK; err = TXTRecordGetItemAtIndex( ( uint16_t ) m_byteArray.size(), &m_byteArray[ 0 ], ( uint16_t ) index, sizeof( keyBuf ), keyBuf, &rawValueLen, &rawValue ); require_action( !err, exit, hr = S_FALSE ); ok = UTF8ToBSTR( keyBuf, temp ); require_action( ok, exit, hr = S_FALSE ); *retval = temp; exit: return hr; }
void DNSSD_API CDNSSD::GetAddrInfoReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *hostNameUTF8, const struct sockaddr *rawAddress, uint32_t ttl, void *context ) { CComObject<CDNSSDService> * service; int err; service = ( CComObject< CDNSSDService>* ) context; require_action( service, exit, err = kDNSServiceErr_Unknown ); if ( !service->Stopped() ) { IGetAddrInfoListener * listener; listener = ( IGetAddrInfoListener* ) service->GetListener(); require_action( listener, exit, err = kDNSServiceErr_Unknown ); if ( !errorCode ) { CComBSTR hostName; DWORD sockaddrLen; DNSSDAddressFamily addressFamily; char addressUTF8[INET6_ADDRSTRLEN]; DWORD addressLen = sizeof( addressUTF8 ); CComBSTR address; BOOL ok; ok = UTF8ToBSTR( hostNameUTF8, hostName ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); switch ( rawAddress->sa_family ) { case AF_INET: { addressFamily = kDNSSDAddressFamily_IPv4; sockaddrLen = sizeof( sockaddr_in ); } break; case AF_INET6: { addressFamily = kDNSSDAddressFamily_IPv6; sockaddrLen = sizeof( sockaddr_in6 ); } break; } err = WSAAddressToStringA( ( LPSOCKADDR ) rawAddress, sockaddrLen, NULL, addressUTF8, &addressLen ); require_noerr( err, exit ); ok = UTF8ToBSTR( addressUTF8, address ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); listener->GetAddrInfoReply( service, ( DNSSDFlags ) flags, ifIndex, hostName, addressFamily, address, ttl ); } else { listener->GetAddrInfoFailed( service, ( DNSSDError ) errorCode ); } } exit: return; }
void DNSSD_API CDNSSD::ResolveReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *fullNameUTF8, const char *hostNameUTF8, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context ) { CComObject<CDNSSDService> * service; int err; service = ( CComObject< CDNSSDService>* ) context; require_action( service, exit, err = kDNSServiceErr_Unknown ); if ( !service->Stopped() ) { IResolveListener * listener; listener = ( IResolveListener* ) service->GetListener(); require_action( listener, exit, err = kDNSServiceErr_Unknown ); if ( !errorCode ) { CComBSTR fullName; CComBSTR hostName; CComBSTR regType; CComBSTR replyDomain; CComObject< CTXTRecord >* record; BOOL ok; ok = UTF8ToBSTR( fullNameUTF8, fullName ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); ok = UTF8ToBSTR( hostNameUTF8, hostName ); require_action( ok, exit, err = kDNSServiceErr_Unknown ); try { record = new CComObject<CTXTRecord>(); } catch ( ... ) { record = NULL; } require_action( record, exit, err = kDNSServiceErr_NoMemory ); record->AddRef(); char buf[ 64 ]; sprintf( buf, "txtLen = %d", txtLen ); OutputDebugStringA( buf ); if ( txtLen > 0 ) { record->SetBytes( txtRecord, txtLen ); } listener->ServiceResolved( service, ( DNSSDFlags ) flags, ifIndex, fullName, hostName, port, record ); } else { listener->ResolveFailed( service, ( DNSSDError ) errorCode ); } } exit: return; }