1 /* -*- Mode: C; tab-width: 4 -*-
3 * Copyright (c) 2009 Apple Computer, Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 Change History (most recent first):
19 $Log: DNSSDService.cpp,v $
20 Revision 1.1 2009/05/26 04:43:54 herscher
21 <rdar://problem/3948252> COM component that can be used with any .NET language and VB.
26 #pragma warning(disable:4995)
30 #include "DNSSDService.h"
31 #include "DNSSDEventManager.h"
32 #include "DNSSDRecord.h"
33 #include "TXTRecord.h"
34 #include "StringServices.h"
35 #include <DebugServices.h>
38 #define WM_SOCKET (WM_APP + 100)
43 BOOL
CDNSSDService::m_registeredWindowClass
= FALSE
;
44 HWND
CDNSSDService::m_hiddenWindow
= NULL
;
45 CDNSSDService::SocketMap
CDNSSDService::m_socketMap
;
48 HRESULT
CDNSSDService::FinalConstruct()
50 DNSServiceErrorType err
= 0;
54 err
= DNSServiceCreateConnection( &m_primary
);
55 require_action( !err
, exit
, hr
= E_FAIL
);
57 if ( !m_hiddenWindow
)
59 TCHAR windowClassName
[ 256 ];
61 StringCchPrintf( windowClassName
, sizeof( windowClassName
) / sizeof( TCHAR
), TEXT( "Bonjour Hidden Window %d" ), GetProcessId( NULL
) );
63 if ( !m_registeredWindowClass
)
69 wc
.lpfnWndProc
= WndProc
;
75 wc
.hbrBackground
= NULL
;
76 wc
.lpszMenuName
= NULL
;
77 wc
.lpszClassName
= windowClassName
;
79 atom
= RegisterClass(&wc
);
80 require_action( atom
!= NULL
, exit
, hr
= E_FAIL
);
82 m_registeredWindowClass
= TRUE
;
85 m_hiddenWindow
= CreateWindow( windowClassName
, windowClassName
, WS_OVERLAPPED
, 0, 0, 0, 0, NULL
, NULL
, GetModuleHandle( NULL
), NULL
);
86 require_action( m_hiddenWindow
!= NULL
, exit
, hr
= E_FAIL
);
89 err
= WSAAsyncSelect( DNSServiceRefSockFD( m_primary
), m_hiddenWindow
, WM_SOCKET
, FD_READ
);
90 require_action( !err
, exit
, hr
= E_FAIL
);
92 m_socketMap
[ DNSServiceRefSockFD( m_primary
) ] = this;
100 void CDNSSDService::FinalRelease()
102 dlog( kDebugLevelTrace
, "FinalRelease()\n" );
107 STDMETHODIMP
CDNSSDService::EnumerateDomains(DNSSDFlags flags
, ULONG ifIndex
, IDNSSDEventManager
*eventManager
, IDNSSDService
**service
)
109 CComObject
<CDNSSDService
> * object
= NULL
;
110 DNSServiceRef subord
= NULL
;
111 DNSServiceErrorType err
= 0;
121 object
= new CComObject
<CDNSSDService
>();
128 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
132 err
= DNSServiceEnumerateDomains( &subord
, flags
| kDNSServiceFlagsShareConnection
, ifIndex
, ( DNSServiceDomainEnumReply
) &DomainEnumReply
, object
);
133 require_noerr( err
, exit
);
135 object
->SetPrimaryRef( m_primary
);
136 object
->SetSubordRef( subord
);
137 object
->SetEventManager( eventManager
);
152 STDMETHODIMP
CDNSSDService::Browse(DNSSDFlags flags
, ULONG ifIndex
, BSTR regtype
, BSTR domain
, IDNSSDEventManager
* eventManager
, IDNSSDService
** service
)
154 CComObject
<CDNSSDService
> * object
= NULL
;
155 std::string regtypeUTF8
;
156 std::string domainUTF8
;
157 DNSServiceRef subord
= NULL
;
158 DNSServiceErrorType err
= 0;
167 // Convert BSTR params to utf8
168 ok
= BSTRToUTF8( regtype
, regtypeUTF8
);
169 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
170 ok
= BSTRToUTF8( domain
, domainUTF8
);
171 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
175 object
= new CComObject
<CDNSSDService
>();
182 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
186 err
= DNSServiceBrowse( &subord
, flags
| kDNSServiceFlagsShareConnection
, ifIndex
, regtypeUTF8
.c_str(), ( domainUTF8
.size() > 0 ) ? domainUTF8
.c_str() : NULL
, ( DNSServiceBrowseReply
) &BrowseReply
, object
);
187 require_noerr( err
, exit
);
189 object
->SetPrimaryRef( m_primary
);
190 object
->SetSubordRef( subord
);
191 object
->SetEventManager( eventManager
);
206 STDMETHODIMP
CDNSSDService::Resolve(DNSSDFlags flags
, ULONG ifIndex
, BSTR serviceName
, BSTR regType
, BSTR domain
, IDNSSDEventManager
* eventManager
, IDNSSDService
** service
)
208 CComObject
<CDNSSDService
> * object
= NULL
;
209 std::string serviceNameUTF8
;
210 std::string regTypeUTF8
;
211 std::string domainUTF8
;
212 DNSServiceRef subord
= NULL
;
213 DNSServiceErrorType err
= 0;
222 // Convert BSTR params to utf8
223 ok
= BSTRToUTF8( serviceName
, serviceNameUTF8
);
224 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
225 ok
= BSTRToUTF8( regType
, regTypeUTF8
);
226 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
227 ok
= BSTRToUTF8( domain
, domainUTF8
);
228 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
232 object
= new CComObject
<CDNSSDService
>();
239 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
243 err
= DNSServiceResolve( &subord
, flags
| kDNSServiceFlagsShareConnection
, ifIndex
, serviceNameUTF8
.c_str(), regTypeUTF8
.c_str(), domainUTF8
.c_str(), ( DNSServiceResolveReply
) &ResolveReply
, object
);
244 require_noerr( err
, exit
);
246 object
->SetPrimaryRef( m_primary
);
247 object
->SetSubordRef( subord
);
248 object
->SetEventManager( eventManager
);
263 STDMETHODIMP
CDNSSDService::Register(DNSSDFlags flags
, ULONG ifIndex
, BSTR serviceName
, BSTR regType
, BSTR domain
, BSTR host
, USHORT port
, ITXTRecord
*record
, IDNSSDEventManager
*eventManager
, IDNSSDService
**service
)
265 CComObject
<CDNSSDService
> * object
= NULL
;
266 std::string serviceNameUTF8
;
267 std::string regTypeUTF8
;
268 std::string domainUTF8
;
269 std::string hostUTF8
;
270 const void * txtRecord
= NULL
;
272 DNSServiceRef subord
= NULL
;
273 DNSServiceErrorType err
= 0;
282 // Convert BSTR params to utf8
283 ok
= BSTRToUTF8( serviceName
, serviceNameUTF8
);
284 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
285 ok
= BSTRToUTF8( regType
, regTypeUTF8
);
286 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
287 ok
= BSTRToUTF8( domain
, domainUTF8
);
288 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
289 ok
= BSTRToUTF8( host
, hostUTF8
);
290 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
294 object
= new CComObject
<CDNSSDService
>();
301 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
306 CComObject
< CTXTRecord
> * realTXTRecord
;
308 realTXTRecord
= ( CComObject
< CTXTRecord
>* ) record
;
310 txtRecord
= realTXTRecord
->GetBytes();
311 txtLen
= realTXTRecord
->GetLen();
315 err
= DNSServiceRegister( &subord
, flags
| kDNSServiceFlagsShareConnection
, ifIndex
, serviceNameUTF8
.c_str(), regTypeUTF8
.c_str(), ( domainUTF8
.size() > 0 ) ? domainUTF8
.c_str() : NULL
, hostUTF8
.c_str(), htons( port
), txtLen
, txtRecord
, ( DNSServiceRegisterReply
) &RegisterReply
, object
);
316 require_noerr( err
, exit
);
318 object
->SetPrimaryRef( m_primary
);
319 object
->SetSubordRef( subord
);
320 object
->SetEventManager( eventManager
);
335 STDMETHODIMP
CDNSSDService::QueryRecord(DNSSDFlags flags
, ULONG ifIndex
, BSTR fullname
, DNSSDRRType rrtype
, DNSSDRRClass rrclass
, IDNSSDEventManager
*eventManager
, IDNSSDService
**service
)
337 CComObject
<CDNSSDService
> * object
= NULL
;
338 DNSServiceRef subord
= NULL
;
339 std::string fullNameUTF8
;
340 DNSServiceErrorType err
= 0;
349 // Convert BSTR params to utf8
350 ok
= BSTRToUTF8( fullname
, fullNameUTF8
);
351 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
355 object
= new CComObject
<CDNSSDService
>();
362 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
366 err
= DNSServiceQueryRecord( &subord
, flags
| kDNSServiceFlagsShareConnection
, ifIndex
, fullNameUTF8
.c_str(), ( uint16_t ) rrtype
, ( uint16_t ) rrclass
, ( DNSServiceQueryRecordReply
) &QueryRecordReply
, object
);
367 require_noerr( err
, exit
);
369 object
->SetPrimaryRef( m_primary
);
370 object
->SetSubordRef( subord
);
371 object
->SetEventManager( eventManager
);
386 STDMETHODIMP
CDNSSDService::RegisterRecord(DNSSDFlags flags
, ULONG ifIndex
, BSTR fullName
, DNSSDRRType rrtype
, DNSSDRRClass rrclass
, VARIANT rdata
, ULONG ttl
, IDNSSDEventManager
* eventManager
, IDNSSDRecord
** record
)
388 CComObject
<CDNSSDRecord
> * object
= NULL
;
389 DNSRecordRef rref
= NULL
;
390 std::string fullNameUTF8
;
391 std::vector
< BYTE
> byteArray
;
392 const void * byteArrayPtr
= NULL
;
393 DNSServiceErrorType err
= 0;
402 // Convert BSTR params to utf8
403 ok
= BSTRToUTF8( fullName
, fullNameUTF8
);
404 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
406 // Convert the VARIANT
407 ok
= VariantToByteArray( &rdata
, byteArray
);
408 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
412 object
= new CComObject
<CDNSSDRecord
>();
419 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
422 err
= DNSServiceRegisterRecord( m_primary
, &rref
, flags
, ifIndex
, fullNameUTF8
.c_str(), rrtype
, rrclass
, ( uint16_t ) byteArray
.size(), byteArray
.size() > 0 ? &byteArray
[ 0 ] : NULL
, ttl
, &RegisterRecordReply
, object
);
423 require_noerr( err
, exit
);
425 object
->SetServiceObject( this );
426 object
->SetRecordRef( rref
);
427 this->SetEventManager( eventManager
);
442 STDMETHODIMP
CDNSSDService::AddRecord(DNSSDFlags flags
, DNSSDRRType rrtype
, VARIANT rdata
, ULONG ttl
, IDNSSDRecord
** record
)
444 CComObject
<CDNSSDRecord
> * object
= NULL
;
445 DNSRecordRef rref
= NULL
;
446 std::vector
< BYTE
> byteArray
;
447 const void * byteArrayPtr
= NULL
;
448 DNSServiceErrorType err
= 0;
457 // Convert the VARIANT
458 ok
= VariantToByteArray( &rdata
, byteArray
);
459 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
463 object
= new CComObject
<CDNSSDRecord
>();
470 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
473 err
= DNSServiceAddRecord( m_primary
, &rref
, flags
, rrtype
, ( uint16_t ) byteArray
.size(), byteArray
.size() > 0 ? &byteArray
[ 0 ] : NULL
, ttl
);
474 require_noerr( err
, exit
);
476 object
->SetServiceObject( this );
477 object
->SetRecordRef( rref
);
491 STDMETHODIMP
CDNSSDService::ReconfirmRecord(DNSSDFlags flags
, ULONG ifIndex
, BSTR fullName
, DNSSDRRType rrtype
, DNSSDRRClass rrclass
, VARIANT rdata
)
493 std::string fullNameUTF8
;
494 std::vector
< BYTE
> byteArray
;
495 const void * byteArrayPtr
= NULL
;
496 DNSServiceErrorType err
= 0;
500 // Convert BSTR params to utf8
501 ok
= BSTRToUTF8( fullName
, fullNameUTF8
);
502 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
504 // Convert the VARIANT
505 ok
= VariantToByteArray( &rdata
, byteArray
);
506 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
508 err
= DNSServiceReconfirmRecord( flags
, ifIndex
, fullNameUTF8
.c_str(), rrtype
, rrclass
, ( uint16_t ) byteArray
.size(), byteArray
.size() > 0 ? &byteArray
[ 0 ] : NULL
);
509 require_noerr( err
, exit
);
517 STDMETHODIMP
CDNSSDService::GetProperty(BSTR prop
, VARIANT
* value
)
519 std::string propUTF8
;
520 std::vector
< BYTE
> byteArray
;
521 SAFEARRAY
* psa
= NULL
;
524 DNSServiceErrorType err
= 0;
527 // Convert BSTR params to utf8
528 ok
= BSTRToUTF8( prop
, propUTF8
);
529 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
531 // Setup the byte array
532 require_action( V_VT( value
) == ( VT_ARRAY
|VT_UI1
), exit
, err
= kDNSServiceErr_Unknown
);
533 psa
= V_ARRAY( value
);
534 require_action( psa
, exit
, err
= kDNSServiceErr_Unknown
);
535 require_action( SafeArrayGetDim( psa
) == 1, exit
, err
= kDNSServiceErr_Unknown
);
536 byteArray
.reserve( psa
->rgsabound
[0].cElements
);
537 byteArray
.assign( byteArray
.capacity(), 0 );
538 elems
= ( uint32_t ) byteArray
.capacity();
540 // Call the function and package the return value in the Variant
541 err
= DNSServiceGetProperty( propUTF8
.c_str(), &byteArray
[ 0 ], &elems
);
542 require_noerr( err
, exit
);
543 ok
= ByteArrayToVariant( &byteArray
[ 0 ], elems
, value
);
544 require_action( ok
, exit
, err
= kDNSSDError_Unknown
);
550 SafeArrayUnaccessData( psa
);
557 STDMETHODIMP
CDNSSDService::GetAddrInfo(DNSSDFlags flags
, ULONG ifIndex
, DNSSDAddressFamily addressFamily
, BSTR hostName
, IDNSSDEventManager
*eventManager
, IDNSSDService
**service
)
559 CComObject
<CDNSSDService
> * object
= NULL
;
560 DNSServiceRef subord
= NULL
;
561 std::string hostNameUTF8
;
562 DNSServiceErrorType err
= 0;
571 // Convert BSTR params to utf8
572 ok
= BSTRToUTF8( hostName
, hostNameUTF8
);
573 require_action( ok
, exit
, err
= kDNSServiceErr_BadParam
);
577 object
= new CComObject
<CDNSSDService
>();
584 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
588 err
= DNSServiceGetAddrInfo( &subord
, flags
| kDNSServiceFlagsShareConnection
, ifIndex
, addressFamily
, hostNameUTF8
.c_str(), ( DNSServiceGetAddrInfoReply
) &GetAddrInfoReply
, object
);
589 require_noerr( err
, exit
);
591 object
->SetPrimaryRef( m_primary
);
592 object
->SetSubordRef( subord
);
593 object
->SetEventManager( eventManager
);
608 STDMETHODIMP
CDNSSDService::NATPortMappingCreate(DNSSDFlags flags
, ULONG ifIndex
, DNSSDAddressFamily addressFamily
, DNSSDProtocol protocol
, USHORT internalPort
, USHORT externalPort
, ULONG ttl
, IDNSSDEventManager
*eventManager
, IDNSSDService
**service
)
610 CComObject
<CDNSSDService
> * object
= NULL
;
611 DNSServiceRef subord
= NULL
;
612 DNSServiceProtocol prot
= 0;
613 DNSServiceErrorType err
= 0;
623 object
= new CComObject
<CDNSSDService
>();
630 require_action( object
!= NULL
, exit
, err
= kDNSServiceErr_NoMemory
);
633 prot
= ( addressFamily
| protocol
);
636 err
= DNSServiceNATPortMappingCreate( &subord
, flags
| kDNSServiceFlagsShareConnection
, ifIndex
, prot
, htons( internalPort
), htons( externalPort
), ttl
, ( DNSServiceNATPortMappingReply
) &NATPortMappingReply
, object
);
637 require_noerr( err
, exit
);
639 object
->SetPrimaryRef( m_primary
);
640 object
->SetSubordRef( subord
);
641 object
->SetEventManager( eventManager
);
656 STDMETHODIMP
CDNSSDService::Stop(void)
662 dlog( kDebugLevelTrace
, "Stop()\n" );
664 if ( m_isPrimary
&& m_primary
)
666 SocketMap::iterator it
;
668 if ( m_hiddenWindow
)
670 WSAAsyncSelect( DNSServiceRefSockFD( m_primary
), m_hiddenWindow
, 0, 0 );
673 it
= m_socketMap
.find( DNSServiceRefSockFD( m_primary
) );
675 if ( it
!= m_socketMap
.end() )
677 m_socketMap
.erase( it
);
680 DNSServiceRefDeallocate( m_primary
);
685 DNSServiceRefDeallocate( m_subord
);
689 if ( m_eventManager
!= NULL
)
691 m_eventManager
->Release();
692 m_eventManager
= NULL
;
701 CDNSSDService::DomainEnumReply
704 DNSServiceFlags flags
,
706 DNSServiceErrorType errorCode
,
707 const char *replyDomainUTF8
,
711 CComObject
<CDNSSDService
> * service
= NULL
;
712 CDNSSDEventManager
* eventManager
= NULL
;
715 service
= ( CComObject
< CDNSSDService
>* ) context
;
716 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
718 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
720 CComBSTR replyDomain
;
723 ok
= UTF8ToBSTR( replyDomainUTF8
, replyDomain
);
724 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
726 if ( flags
& kDNSServiceFlagsAdd
)
728 eventManager
->Fire_DomainFound( service
, ( DNSSDFlags
) flags
, ifIndex
, replyDomain
);
732 eventManager
->Fire_DomainLost( service
, ( DNSSDFlags
) flags
, ifIndex
, replyDomain
);
743 CDNSSDService::BrowseReply
746 DNSServiceFlags flags
,
748 DNSServiceErrorType errorCode
,
749 const char *serviceNameUTF8
,
750 const char *regTypeUTF8
,
751 const char *replyDomainUTF8
,
755 CComObject
<CDNSSDService
> * service
= NULL
;
756 CDNSSDEventManager
* eventManager
= NULL
;
759 service
= ( CComObject
< CDNSSDService
>* ) context
;
760 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
762 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
764 CComBSTR serviceName
;
766 CComBSTR replyDomain
;
768 UTF8ToBSTR( serviceNameUTF8
, serviceName
);
769 UTF8ToBSTR( regTypeUTF8
, regType
);
770 UTF8ToBSTR( replyDomainUTF8
, replyDomain
);
772 if ( flags
& kDNSServiceFlagsAdd
)
774 eventManager
->Fire_ServiceFound( service
, ( DNSSDFlags
) flags
, ifIndex
, serviceName
, regType
, replyDomain
);
778 eventManager
->Fire_ServiceLost( service
, ( DNSSDFlags
) flags
, ifIndex
, serviceName
, regType
, replyDomain
);
789 CDNSSDService::ResolveReply
792 DNSServiceFlags flags
,
794 DNSServiceErrorType errorCode
,
795 const char *fullNameUTF8
,
796 const char *hostNameUTF8
,
799 const unsigned char *txtRecord
,
803 CComObject
<CDNSSDService
> * service
= NULL
;
804 CDNSSDEventManager
* eventManager
= NULL
;
807 service
= ( CComObject
< CDNSSDService
>* ) context
;
808 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
810 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
815 CComBSTR replyDomain
;
816 CComObject
< CTXTRecord
>* record
;
819 ok
= UTF8ToBSTR( fullNameUTF8
, fullName
);
820 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
821 ok
= UTF8ToBSTR( hostNameUTF8
, hostName
);
822 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
826 record
= new CComObject
<CTXTRecord
>();
833 require_action( record
, exit
, err
= kDNSServiceErr_NoMemory
);
838 record
->SetBytes( txtRecord
, txtLen
);
841 eventManager
->Fire_ServiceResolved( service
, ( DNSSDFlags
) flags
, ifIndex
, fullName
, hostName
, ntohs( port
), record
);
851 CDNSSDService::RegisterReply
854 DNSServiceFlags flags
,
855 DNSServiceErrorType errorCode
,
856 const char *serviceNameUTF8
,
857 const char *regTypeUTF8
,
858 const char *domainUTF8
,
862 CComObject
<CDNSSDService
> * service
= NULL
;
863 CDNSSDEventManager
* eventManager
= NULL
;
866 service
= ( CComObject
< CDNSSDService
>* ) context
;
867 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
869 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
871 CComBSTR serviceName
;
876 ok
= UTF8ToBSTR( serviceNameUTF8
, serviceName
);
877 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
878 ok
= UTF8ToBSTR( regTypeUTF8
, regType
);
879 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
880 ok
= UTF8ToBSTR( domainUTF8
, domain
);
881 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
883 eventManager
->Fire_ServiceRegistered( service
, ( DNSSDFlags
) flags
, serviceName
, regType
, domain
);
893 CDNSSDService::QueryRecordReply
896 DNSServiceFlags flags
,
898 DNSServiceErrorType errorCode
,
899 const char *fullNameUTF8
,
908 CComObject
<CDNSSDService
> * service
= NULL
;
909 CDNSSDEventManager
* eventManager
= NULL
;
912 service
= ( CComObject
< CDNSSDService
>* ) context
;
913 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
915 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
921 ok
= UTF8ToBSTR( fullNameUTF8
, fullName
);
922 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
923 ok
= ByteArrayToVariant( rdata
, rdlen
, &var
);
924 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
926 eventManager
->Fire_QueryRecordAnswered( service
, ( DNSSDFlags
) flags
, ifIndex
, fullName
, ( DNSSDRRType
) rrtype
, ( DNSSDRRClass
) rrclass
, var
, ttl
);
936 CDNSSDService::GetAddrInfoReply
939 DNSServiceFlags flags
,
941 DNSServiceErrorType errorCode
,
942 const char *hostNameUTF8
,
943 const struct sockaddr
*rawAddress
,
948 CComObject
<CDNSSDService
> * service
= NULL
;
949 CDNSSDEventManager
* eventManager
= NULL
;
952 service
= ( CComObject
< CDNSSDService
>* ) context
;
953 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
955 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
959 DNSSDAddressFamily addressFamily
;
960 char addressUTF8
[INET6_ADDRSTRLEN
];
961 DWORD addressLen
= sizeof( addressUTF8
);
965 ok
= UTF8ToBSTR( hostNameUTF8
, hostName
);
966 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
968 switch ( rawAddress
->sa_family
)
972 addressFamily
= kDNSSDAddressFamily_IPv4
;
973 sockaddrLen
= sizeof( sockaddr_in
);
979 addressFamily
= kDNSSDAddressFamily_IPv6
;
980 sockaddrLen
= sizeof( sockaddr_in6
);
985 err
= WSAAddressToStringA( ( LPSOCKADDR
) rawAddress
, sockaddrLen
, NULL
, addressUTF8
, &addressLen
);
986 require_noerr( err
, exit
);
987 ok
= UTF8ToBSTR( addressUTF8
, address
);
988 require_action( ok
, exit
, err
= kDNSServiceErr_Unknown
);
990 eventManager
->Fire_AddressFound( service
, ( DNSSDFlags
) flags
, ifIndex
, hostName
, addressFamily
, address
, ttl
);
1000 CDNSSDService::NATPortMappingReply
1002 DNSServiceRef sdRef
,
1003 DNSServiceFlags flags
,
1005 DNSServiceErrorType errorCode
,
1006 uint32_t externalAddress
, /* four byte IPv4 address in network byte order */
1007 DNSServiceProtocol protocol
,
1008 uint16_t internalPort
,
1009 uint16_t externalPort
, /* may be different than the requested port */
1010 uint32_t ttl
, /* may be different than the requested ttl */
1014 CComObject
<CDNSSDService
> * service
= NULL
;
1015 CDNSSDEventManager
* eventManager
= NULL
;
1018 service
= ( CComObject
< CDNSSDService
>* ) context
;
1019 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
1021 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
1023 eventManager
->Fire_MappingCreated( service
, ( DNSSDFlags
) flags
, ifIndex
, externalAddress
, ( DNSSDAddressFamily
) ( protocol
& 0x8 ), ( DNSSDProtocol
) ( protocol
& 0x80 ), ntohs( internalPort
), ntohs( externalPort
), ttl
);
1033 CDNSSDService::RegisterRecordReply
1035 DNSServiceRef sdRef
,
1036 DNSRecordRef RecordRef
,
1037 DNSServiceFlags flags
,
1038 DNSServiceErrorType errorCode
,
1042 CComObject
<CDNSSDRecord
> * record
= NULL
;
1043 CDNSSDService
* service
= NULL
;
1044 CDNSSDEventManager
* eventManager
= NULL
;
1047 record
= ( CComObject
< CDNSSDRecord
>* ) context
;
1048 require_action( record
, exit
, err
= kDNSServiceErr_Unknown
);
1049 service
= record
->GetServiceObject();
1050 require_action( service
, exit
, err
= kDNSServiceErr_Unknown
);
1052 if ( service
->ShouldHandleReply( errorCode
, eventManager
) )
1054 eventManager
->Fire_RecordRegistered( record
, ( DNSSDFlags
) flags
);
1064 CDNSSDService::ShouldHandleReply( DNSServiceErrorType errorCode
, CDNSSDEventManager
*& eventManager
)
1068 if ( !this->Stopped() )
1070 eventManager
= this->GetEventManager();
1071 require_action( eventManager
, exit
, ok
= FALSE
);
1079 eventManager
->Fire_OperationFailed( this, ( DNSSDError
) errorCode
);
1090 CDNSSDService::WndProc( HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
1092 if ( msg
== WM_SOCKET
)
1094 SocketMap::iterator it
;
1096 it
= m_socketMap
.find( ( SOCKET
) wParam
);
1097 check( it
!= m_socketMap
.end() );
1099 if ( it
!= m_socketMap
.end() )
1101 DNSServiceProcessResult( it
->second
->m_primary
);
1105 return DefWindowProc(hWnd
, msg
, wParam
, lParam
);;