author Frank Dowsett <>
Fri, 18 Feb 2011 15:44:06 -0500
changeset 3670 add0c83648a5
parent 3650 50dc6de6048f
child 3679 f4294bb53b0f
permissions -rw-r--r--
Massive changes to dock icon drawing:
- Use NSDockTile for badging fixes #13439
- Remove flashing of the contact name* fixes #14452
- Use a constant size instead of the current screen's size fixes #13088

Fixes #616

*It's superfluous and may have been broken in 1.3 based on the reports from after 1.4 was released.
 * Adium is the legal property of its developers, whose names are listed in the copyright file included
 * with this source distribution.
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
 * General Public License as published by the Free Software Foundation; either version 2 of the License,
 * or (at your option) any later version.
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
 * Public License for more details.
 * You should have received a copy of the GNU General Public License along with this program; if not,
 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

 * @class AICoreComponentLoader
 * @brief Core - Component Loader
 * Loads integrated plugins.  Component classes to load are determined by CoreComponents.plist

#import "AICoreComponentLoader.h"

NSTimeInterval aggregateComponentLoadingTime = 0.0;

@interface AICoreComponentLoader ()
- (void)loadComponents;

@implementation AICoreComponentLoader

 * @brief Init
- (id)init
	if ((self = [super init])) {
		components = [[NSMutableDictionary alloc] init];
		[self loadComponents];

	return self;

 * @brief Deallocate
- (void)dealloc
	[components release];
	[super dealloc];

#pragma mark -

 * @brief Load integrated components
- (void)loadComponents
	//Fetch the list of components to load
	NSArray *componentClassNames = [NSArray arrayWithObjects: 
	//Load each component
	for (NSString *className in componentClassNames) {
		NSDate *start = [NSDate date];
		NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
		Class class;

		if (className && (class = NSClassFromString(className))) {
			id <AIPlugin>	object = [[class alloc] init];

			NSAssert1(object, @"Failed to load %@", className);

			[object installPlugin];

			[components setObject:object forKey:className];
			[object release];
		} else {
			NSAssert1(NO, @"Failed to load %@", className);
		[pool release];
		NSTimeInterval t = -[start timeIntervalSinceNow];
		aggregateComponentLoadingTime += t;
		AILog(@"Loaded component: %@ in %f seconds", className, t);
	AILog(@"Total time spent loading components: %f", aggregateComponentLoadingTime);

- (void)controllerDidLoad

 * @brief Close integreated components
- (void)controllerWillClose
	for (id <AIPlugin> plugin in [components objectEnumerator]) {
		[[NSNotificationCenter defaultCenter] removeObserver:plugin];
		[plugin uninstallPlugin];

#pragma mark -

 * @brief Retrieve a component plugin by its class name
- (id <AIPlugin>)pluginWithClassName:(NSString *)className {
	return [components objectForKey:className];