Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}