bool CZeroconfBrowserOSX::doRemoveServiceType(const std::string &fcr_service_type) { //search for this browser and remove it from the map CFNetServiceBrowserRef browser = 0; { CSingleLock lock(m_data_guard); tBrowserMap::iterator it = m_service_browsers.find(fcr_service_type); if (it == m_service_browsers.end()) return false; browser = it->second; m_service_browsers.erase(it); } assert(browser); //now kill the browser CFStreamError streamerror; CFNetServiceBrowserStopSearch(browser, &streamerror); CFNetServiceBrowserUnscheduleFromRunLoop(browser, m_runloop, kCFRunLoopCommonModes); CFNetServiceBrowserInvalidate(browser); //remove the services of this browser { CSingleLock lock(m_data_guard); tDiscoveredServicesMap::iterator it = m_discovered_services.find(browser); if (it != m_discovered_services.end()) m_discovered_services.erase(it); } CFRelease(browser); return true; }
/* extern */ void _CFTypeInvalidate(CFTypeRef obj) { CFTypeID t = CFGetTypeID(obj); /* Invalidate according to type of object. */ if (t == CFRunLoopSourceGetTypeID()) { CFRunLoopSourceInvalidate((CFRunLoopSourceRef)obj); } else if (t == CFMachPortGetTypeID()) { CFMachPortInvalidate((CFMachPortRef)obj); } else if (t == CFSocketGetTypeID()) { CFSocketInvalidate((CFSocketRef)obj); } /* For scheduled types of objects, it is invalidated by setting the client to NULL. */ else if (t == CFReadStreamGetTypeID()) { CFReadStreamSetClient((CFReadStreamRef)obj, kCFStreamEventNone, NULL, NULL); } else if (t == CFWriteStreamGetTypeID()) { CFWriteStreamSetClient((CFWriteStreamRef)obj, kCFStreamEventNone, NULL, NULL); } else if (t == CFHostGetTypeID()) { CFHostSetClient((CFHostRef)obj, NULL, NULL); } else if (t == SCNetworkReachabilityGetTypeID()) { SCNetworkReachabilitySetCallback((SCNetworkReachabilityRef)obj, NULL, NULL); } else if (t == CFRunLoopTimerGetTypeID()) { CFRunLoopTimerInvalidate((CFRunLoopTimerRef)obj); } else if (t == CFNetServiceGetTypeID()) { CFNetServiceSetClient((CFNetServiceRef)obj, NULL, NULL); } else if (t == CFNetServiceBrowserGetTypeID()) { CFNetServiceBrowserInvalidate((CFNetServiceBrowserRef)obj); } else if (t == CFNetServiceMonitorGetTypeID()) { CFNetServiceMonitorInvalidate((CFNetServiceMonitorRef)obj); } else if (t == SCNetworkReachabilityGetTypeID()) { SCNetworkConnectionStop((SCNetworkConnectionRef)obj, FALSE); } }
void ofxBonjourIp::stopDiscoverService(){ if(netServiceBrowser) { CFNetServiceBrowserInvalidate(netServiceBrowser); CFNetServiceBrowserUnscheduleFromRunLoop(netServiceBrowser, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); CFRelease(netServiceBrowser); //CFNetService(netServiceBrowser); //CFNetServiceSetClient(netService, NULL, NULL); netServiceBrowser = NULL;// /*CFNetServiceUnscheduleFromRunLoop(netService, CFRunLoopGetCurrent(),kCFRunLoopCommonModes); CFNetServiceSetClient(netService, NULL, NULL); CFRelease(netService); netService = NULL;*/ } }