Example #1
0
void ofxBonjourIp::discoverService( string type, string domain ){
    
    connectedToService = false;
    
    // client will need to know own address
    deviceIp = ofxBonjourIp::GetMyIPAddress();//ofxNSStringToString( [self getIPAddress] );
    
    
    CFStringRef serviceType = CFStringCreateWithCString(kCFAllocatorDefault, type.c_str(), kCFStringEncodingUTF8);
    CFStringRef serviceDomain = CFStringCreateWithCString(kCFAllocatorDefault, domain.c_str(), kCFStringEncodingUTF8);
    
    //
    CFNetServiceClientContext clientContext = { 0, this, NULL, NULL, NULL };
    
    // start browsing service- async
    netServiceBrowser = CFNetServiceBrowserCreate(kCFAllocatorDefault, ofxBonjourIp::NetServiceBrowserCallBack, &clientContext);
    CFNetServiceBrowserScheduleWithRunLoop(netServiceBrowser, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    
    if(!CFNetServiceBrowserSearchForServices(netServiceBrowser, serviceDomain, serviceType, NULL)) {
        ofLog() << "Error browsing for service: " << type << ", " << domain;
        stopDiscoverService();
    }
    
    CFRelease(serviceType);
    CFRelease(serviceDomain);
}
Example #2
0
bool CZeroconfBrowserOSX::doAddServiceType(const std::string& fcr_service_type)
{
  CFNetServiceClientContext clientContext = { 0, this, NULL, NULL, NULL };
  CFStringRef domain = CFSTR("");
  CFNetServiceBrowserRef p_browser = CFNetServiceBrowserCreate(kCFAllocatorDefault,
    CZeroconfBrowserOSX::BrowserCallback, &clientContext);
  assert(p_browser != NULL);

  //schedule the browser
  CFNetServiceBrowserScheduleWithRunLoop(p_browser, m_runloop, kCFRunLoopCommonModes);
  CFStreamError error;
  CFStringRef type = CFStringCreateWithCString(NULL, fcr_service_type.c_str(), kCFStringEncodingUTF8);

  assert(type != NULL);
  Boolean result = CFNetServiceBrowserSearchForServices(p_browser, domain, type, &error);
  CFRelease(type);
  if (result == false)
  {
    // Something went wrong so lets clean up.
    CFNetServiceBrowserUnscheduleFromRunLoop(p_browser, m_runloop, kCFRunLoopCommonModes);         
    CFRelease(p_browser);
    p_browser = NULL;
    CLog::Log(LOGERROR, "CFNetServiceBrowserSearchForServices returned"
      "(domain = %d, error = %" PRId64")", (int)error.domain, (int64_t)error.error);
  }
  else
  {
    //store the browser
    CSingleLock lock(m_data_guard);
    m_service_browsers.insert(std::make_pair(fcr_service_type, p_browser));
  }

  return result;
}
Example #3
0
/* static */ Boolean
_BrowserBlockUntilComplete(__CFNetServiceBrowser* browser) {

	// Assume success by default
	Boolean result = TRUE;
	CFRunLoopRef rl = CFRunLoopGetCurrent();

	// Schedule in the blocking mode.
	CFNetServiceBrowserScheduleWithRunLoop((CFNetServiceBrowserRef)browser, rl, _kCFNetServiceBrowserBlockingMode);

	// Lock in order to check for trigger
	__CFSpinLock(&(browser->_lock));

	// Check that search exists.
	while (browser->_trigger) {

		// Unlock again so the browser can continue to be processed.
		__CFSpinUnlock(&(browser->_lock));

		// Run the loop in a private mode with it returning whenever a source
		// has been handled.
		CFRunLoopRunInMode(_kCFNetServiceBrowserBlockingMode, DBL_MAX, TRUE);

		// Lock again in preparation for trigger check
		__CFSpinLock(&(browser->_lock));
	}

	// Fail if there was an error.
	if (browser->_error.error)
		result = FALSE;

	// Unlock the browser again.
	__CFSpinUnlock(&(browser->_lock));

	// Unschedule from the blocking mode
	CFNetServiceBrowserUnscheduleFromRunLoop((CFNetServiceBrowserRef)browser, rl, _kCFNetServiceBrowserBlockingMode);

	return result;
}