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; }
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); }