/*
 *  Called when the combo opens
 *  Shows all entries found so far
 */
void
TZCBrowserCombo::OnCbnDropDown (void)
{
  TZCPublication *p;
  TCHAR szText[512]; /* rendezvous doesn't use unicode */
  TCHAR szIP[60];
  int iIndex;

  Clear ();

#ifdef _RENDEZVOUS
  /* Add Items */
  _zcbrowser.Lock ();
  for (p = _zcbrowser.m_pItems; p; p = p->next)
    {
      if (p->eventType == kDNSBrowserEventTypeResolved)
	{
	  DNSNetworkAddressToString (&p->address, szIP);
	  _stprintf (szText, _T("%s (%s)"), p->szName, szIP);
	  iIndex = AddString (szText);
	  if (Data (iIndex, p) != CB_ERR)
	    p->AddRef ();
	}
    }
  _zcbrowser.Unlock ();
#endif
}
LPCTSTR
TZCBrowserCombo::GetHost (void)
{
#ifdef _RENDEZVOUS
  if (m_pResolvedZC)
    {
      DNSNetworkAddressToString (&m_pResolvedZC->address, m_szText);
      return m_szText;
    }
#endif
  Text ();
  return _tcschr (m_szText, ':') ? m_szText : NULL;
}
static void
	BrowserCallBack( 
		void *					inContext, 
		DNSBrowserRef			inRef, 
		DNSStatus				inStatusCode,
		const DNSBrowserEvent *	inEvent )
{
	ChooserDialog *		dialog;
	UINT 				message;
	BOOL				posted;
	
	UNUSED_ALWAYS( inStatusCode );
	UNUSED_ALWAYS( inRef );
	
	// Check parameters.
	
	assert( inContext );
	dialog = reinterpret_cast <ChooserDialog *> ( inContext );
	
	try
	{
		switch( inEvent->type )
		{
			case kDNSBrowserEventTypeRelease:
				break;
			
			// Domains
			
			case kDNSBrowserEventTypeAddDomain:
			case kDNSBrowserEventTypeAddDefaultDomain:
			case kDNSBrowserEventTypeRemoveDomain:
			{
				DomainEventInfo *						domain;
				std::auto_ptr < DomainEventInfo >		domainAutoPtr;
				
				domain = new DomainEventInfo;
				domainAutoPtr.reset( domain );
				
				domain->eventType 	= inEvent->type;
				domain->domain 		= inEvent->data.addDomain.domain;
				domain->ifIP		= inEvent->data.addDomain.interfaceIP;
				
				message = ( inEvent->type == kDNSBrowserEventTypeRemoveDomain ) ? WM_USER_DOMAIN_REMOVE : WM_USER_DOMAIN_ADD;
				posted = ::PostMessage( dialog->GetSafeHwnd(), message, 0, (LPARAM) domain );
				assert( posted );
				if( posted )
				{
					domainAutoPtr.release();
				}
				break;
			}
			
			// Services
			
			case kDNSBrowserEventTypeAddService:
			case kDNSBrowserEventTypeRemoveService:
			{
				ServiceEventInfo *						service;
				std::auto_ptr < ServiceEventInfo >		serviceAutoPtr;
				
				service = new ServiceEventInfo;
				serviceAutoPtr.reset( service );
				
				service->eventType 	= inEvent->type;
				service->name 		= inEvent->data.addService.name;
				service->type 		= inEvent->data.addService.type;
				service->domain		= inEvent->data.addService.domain;
				service->ifIP		= inEvent->data.addService.interfaceIP;
				
				message = ( inEvent->type == kDNSBrowserEventTypeAddService ) ? WM_USER_SERVICE_ADD : WM_USER_SERVICE_REMOVE;
				posted = ::PostMessage( dialog->GetSafeHwnd(), message, 0, (LPARAM) service );
				assert( posted );
				if( posted )
				{
					serviceAutoPtr.release();
				}
				break;
			}
			
			// Resolves
			
			case kDNSBrowserEventTypeResolved:
				if( inEvent->data.resolved->address.addressType == kDNSNetworkAddressTypeIPv4  )
				{
					ServiceInstanceInfo *						serviceInstance;
					std::auto_ptr < ServiceInstanceInfo >		serviceInstanceAutoPtr;
					char										s[ 32 ];
					
					serviceInstance = new ServiceInstanceInfo;
					serviceInstanceAutoPtr.reset( serviceInstance );
					
					serviceInstance->name 		= inEvent->data.resolved->name;
					serviceInstance->type 		= inEvent->data.resolved->type;
					serviceInstance->domain		= inEvent->data.resolved->domain;
					serviceInstance->ip			= DNSNetworkAddressToString( &inEvent->data.resolved->address, s );
					serviceInstance->ifIP		= DNSNetworkAddressToString( &inEvent->data.resolved->interfaceIP, s );
					serviceInstance->text 		= inEvent->data.resolved->textRecord;
					serviceInstance->hostName	= inEvent->data.resolved->hostName;

					posted = ::PostMessage( dialog->GetSafeHwnd(), WM_USER_RESOLVE, 0, (LPARAM) serviceInstance );
					assert( posted );
					if( posted )
					{
						serviceInstanceAutoPtr.release();
					}
				}
				break;
			
			default:
				break;
		}
	}
	catch( ... )
	{
		// Don't let exceptions escape.
	}
}