/***************************************************************************** * RemoveEventFromPlugin * - * This method is invoked when launchd wishes the plugin to setup a launch * event matching the parameters in the dictionary. *****************************************************************************/ void RemoveEventFromPlugin(BonjourUserEventsPlugin* plugin, CFNumberRef launchdToken) { NetBrowserInfo* browser = (NetBrowserInfo*)CFDictionaryGetValue(plugin->_tokenToBrowserMap, launchdToken); Boolean othersUsingBrowser = false; if (!browser) { long long value = 0; CFNumberGetValue(launchdToken, kCFNumberLongLongType, &value); fprintf(stderr, "%s, Launchd asked us to remove a token we did not register!\nToken:%lld\n", sPluginIdentifier, value); return; } CFMutableArrayRef onAddEvents = (CFMutableArrayRef)CFDictionaryGetValue(plugin->_onAddEvents, browser); CFMutableArrayRef onRemoveEvents = (CFMutableArrayRef)CFDictionaryGetValue(plugin->_onRemoveEvents, browser); if (onAddEvents) { RemoveEventFromArray(onAddEvents, launchdToken); // Is the array now empty, clean up if (CFArrayGetCount(onAddEvents) == 0) CFDictionaryRemoveValue(plugin->_onAddEvents, browser); } if (onRemoveEvents) { RemoveEventFromArray(onRemoveEvents, launchdToken); // Is the array now empty, clean up if (CFArrayGetCount(onRemoveEvents) == 0) CFDictionaryRemoveValue(plugin->_onRemoveEvents, browser); } // Remove ourselves from the token dictionary. CFDictionaryRemoveValue(plugin->_tokenToBrowserMap, launchdToken); // Check to see if anyone else is using this browser. CFIndex i; CFIndex count = CFDictionaryGetCount(plugin->_tokenToBrowserMap); NetBrowserInfo** browsers = malloc(count * sizeof(NetBrowserInfo*)); // Fetch the values of the token dictionary CFDictionaryGetKeysAndValues(plugin->_tokenToBrowserMap, NULL, (const void**)browsers); for (i = 0; i < count; ++i) { if (NetBrowserInfoEqual(browsers[i], browser)) { othersUsingBrowser = true; break; } } // If no one else is useing our browser, clean up! if (!othersUsingBrowser) { CFDictionaryRemoveValue(plugin->_tokenToBrowserMap, launchdToken); // This triggers release and dealloc of the browser } free(browsers); }
/***************************************************************************** * RemoveEventFromPlugin * - * This method is invoked when launchd wishes the plugin to setup a launch * event matching the parameters in the dictionary. *****************************************************************************/ void RemoveEventFromPlugin(BonjourUserEventsPlugin* plugin, CFNumberRef launchdToken) { NetBrowserInfo* browser = (NetBrowserInfo*)CFDictionaryGetValue(plugin->_tokenToBrowserMap, launchdToken); Boolean othersUsingBrowser = false; if (!browser) { long long value = 0; CFNumberGetValue(launchdToken, kCFNumberLongLongType, &value); fprintf(stderr, "%s:%s Launchd asked us to remove a token we did not register! ==Token:%lld== \n", sPluginIdentifier, __FUNCTION__, value); return; } CFMutableArrayRef onAddEvents = (CFMutableArrayRef)CFDictionaryGetValue(plugin->_onAddEvents, browser); CFMutableArrayRef onRemoveEvents = (CFMutableArrayRef)CFDictionaryGetValue(plugin->_onRemoveEvents, browser); if (onAddEvents) { asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s:%s: Calling RemoveEventFromArray for OnAddEvents", sPluginIdentifier, __FUNCTION__); RemoveEventFromArray(onAddEvents, launchdToken); // Is the array now empty, clean up if (CFArrayGetCount(onAddEvents) == 0) { asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s:%s: Removing the browser from AddEvents", sPluginIdentifier, __FUNCTION__); CFDictionaryRemoveValue(plugin->_onAddEvents, browser); } } if (onRemoveEvents) { asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s:%s: Calling RemoveEventFromArray for OnRemoveEvents", sPluginIdentifier, __FUNCTION__); RemoveEventFromArray(onRemoveEvents, launchdToken); // Is the array now empty, clean up if (CFArrayGetCount(onRemoveEvents) == 0) { asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s:%s: Removing the browser from RemoveEvents", sPluginIdentifier, __FUNCTION__); CFDictionaryRemoveValue(plugin->_onRemoveEvents, browser); } } // Remove ourselves from the token dictionary. CFDictionaryRemoveValue(plugin->_tokenToBrowserMap, launchdToken); // Check to see if anyone else is using this browser. CFIndex i; CFIndex count = CFDictionaryGetCount(plugin->_tokenToBrowserMap); NetBrowserInfo** browsers = malloc(count * sizeof(NetBrowserInfo*)); // Fetch the values of the token dictionary CFDictionaryGetKeysAndValues(plugin->_tokenToBrowserMap, NULL, (const void**)browsers); for (i = 0; i < count; ++i) { if (NetBrowserInfoEqual(browsers[i], browser)) { othersUsingBrowser = true; break; } } // If no one else is useing our browser, clean up! if (!othersUsingBrowser) { asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s:%s: Removing browser %p from _browsers", sPluginIdentifier, __FUNCTION__, browser); CFDictionaryRemoveValue(plugin->_browsers, browser); // This triggers release and dealloc of the browser } else { asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s:%s: Decrementing browsers %p count", sPluginIdentifier, __FUNCTION__, browser); // Decrement my reference count (it was incremented when it was added to _browsers in CreateBrowser) NetBrowserInfoRelease(NULL, browser); } free(browsers); }