Source/AICoreComponentLoader.m
author Frank Dowsett <wixardy@adium.im>
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"

//#define COMPONENT_LOAD_TIMING
#ifdef COMPONENT_LOAD_TIMING
NSTimeInterval aggregateComponentLoadingTime = 0.0;
#endif

@interface AICoreComponentLoader ()
- (void)loadComponents;
@end

@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: 
		@"AIAccountListPreferencesPlugin",
		@"AIAccountMenuAccessPlugin",
		@"AIAliasSupportPlugin",
		@"AIAppearancePreferencesPlugin",
		@"AIAutoLinkingPlugin",
		@"AIAutoReplyPlugin",
		@"AIChatConsolidationPlugin",
		@"AIChatCyclingPlugin",
		@"AIContactAwayPlugin",
		@"AIContactIdlePlugin",
		@"AIContactInfoWindowPlugin",
		@"AIContactListEditorPlugin",
		@"AIContactOnlineSincePlugin",
		@"AIContactSortSelectionPlugin",
		@"AIContactStatusColoringPlugin",
		@"AIDockNameOverlay",
		@"AIContactStatusEventsPlugin",
		@"AIDockAccountStatusPlugin",
		@"AIDockBehaviorPlugin",
		@"AIDualWindowInterfacePlugin",
		@"AIEventSoundsPlugin",
		@"AIExtendedStatusPlugin",
		@"AILoggerPlugin",
		@"AIMessageAliasPlugin",
		@"AINewMessagePanelPlugin",
		@"AINudgeBuzzHandlerPlugin",
		@"AIContactVisibilityControlPlugin",
		@"AISCLViewPlugin",
		@"AIStandardToolbarItemsPlugin",
		@"AIStateMenuPlugin",
		@"AIStatusChangedMessagesPlugin",
		@"AITabStatusIconsPlugin",
		@"BGContactNotesPlugin",
		@"BGEmoticonMenuPlugin",
		@"CBActionSupportPlugin",
		@"CBContactCountingDisplayPlugin",
		@"CBContactLastSeenPlugin",
		@"CBStatusMenuItemPlugin",
		@"DCInviteToChatPlugin",
		@"DCJoinChatPanelPlugin",
		@"DCMessageContextDisplayPlugin",
		@"AIAddBookmarkPlugin",
		@"ESAccountEvents",
		@"ESAccountNetworkConnectivityPlugin",
		@"ESAnnouncerPlugin",
		@"ESApplescriptContactAlertPlugin",
		@"ESBlockingPlugin",
		@"ESContactClientPlugin",
		@"ESContactServersideDisplayName",
		@"ESFileTransferMessagesPlugin",
		@"AIListObjectContentsPlugin",
		@"ESOpenMessageWindowContactAlertPlugin",
		@"ESSafariLinkToolbarItemPlugin",
		@"ESSendMessageContactAlertPlugin",
		@"ESUserIconHandlingPlugin",
		@"ErrorMessageHandlerPlugin",
		@"GBApplescriptFiltersPlugin",
		@"SAContactOnlineForPlugin",
		@"SHLinkManagementPlugin",
		@"ESGlobalEventsPreferencesPlugin",
		@"ESGeneralPreferencesPlugin",
		@"NEHGrowlPlugin",
		@"ESSecureMessagingPlugin",
		@"ESStatusPreferencesPlugin",
		@"AIAutomaticStatus",
		@"ESAwayStatusWindowPlugin",
		@"RAFBlockEditorPlugin",
		@"SMContactListShowBehaviorPlugin",
		@"ESiTunesPlugin",
		@"ESPersonalPreferencesPlugin",
		@"AIXtrasManager",
		@"OWSpellingPerContactPlugin",
		@"GBQuestionHandlerPlugin",
		@"AINulRemovalPlugin",
		@"AIDefaultFontRemovalPlugin",
		@"AIAdvancedPreferencesPlugin",
		@"GBImportPlugin",
		@"AIMentionEventPlugin",
		@"AITwitterIMPlugin",
		@"AITwitterPlugin",
		@"AILaconicaPlugin",
		@"AITwitterURLHandler",
		@"AITwitterActionsHTMLFilter",
		@"AIURLShortenerPlugin",
		@"AIGroupChatStatusTooltipPlugin",
		@"AIRealNameTooltip",
		@"AIUserHostTooltip",
		@"AIUnreadMessagesTooltip",
		@"AIIRCChannelLinker",
		@"AIURLHandlerPlugin",
		@"AIJumpControlPlugin",
		@"AIWebKitMessageViewPlugin",
		@"AWBonjourPlugin",
		@"CBPurpleServicePlugin",
		@"AIImageUploaderPlugin",
		@"AITwitterStatusFollowup",
		@"AIDoNothingContactAlertPlugin",
		nil
	];
	//Load each component
	for (NSString *className in componentClassNames) {
			
#ifdef COMPONENT_LOAD_TIMING
		NSDate *start = [NSDate date];
#endif
		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];
#ifdef COMPONENT_LOAD_TIMING
		NSTimeInterval t = -[start timeIntervalSinceNow];
		aggregateComponentLoadingTime += t;
		AILog(@"Loaded component: %@ in %f seconds", className, t);
#endif
	}
#ifdef COMPONENT_LOAD_TIMING
	AILog(@"Total time spent loading components: %f", aggregateComponentLoadingTime);
#endif
}

- (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];
}

@end