William Bowling is sharing code with you

Bitbucket is a code hosting site. Unlimited public and private repositories. Free for small teams.

Don't show this again

wbowling / adium (fork of adium / adium)

Fork of Adium for patches/improvements

Clone this repository (size: 338.7 MB): HTTPS / SSH
hg clone https://bitbucket.org/wbowling/adium
hg clone ssh://hg@bitbucket.org/wbowling/adium

adium / Source / AICoreComponentLoader.m

/*
 * 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",
                @"AIContactStatusDockOverlaysPlugin",
                @"AIContactStatusEventsPlugin",
                @"AIDockAccountStatusPlugin",
                @"AIDockBehaviorPlugin",
                @"AIDockUnviewedContentPlugin",
                @"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",
                @"AIDockBadger",
                @"ESPersonalPreferencesPlugin",
                @"AIXtrasManager",
                @"OWSpellingPerContactPlugin",
                @"GBQuestionHandlerPlugin",
                @"AINulRemovalPlugin",
                @"AIDefaultFontRemovalPlugin",
                @"AIAdvancedPreferencesPlugin",
                @"GBImportPlugin",
                @"AIMentionEventPlugin",
                @"AITwitterIMPlugin",
                @"AITwitterPlugin",
                @"AILaconicaPlugin",
                @"AITwitterURLHandler",
                @"AITwitterActionsHTMLFilter",
                @"AIURLShortenerPlugin",
                @"AIGroupChatStatusTooltipPlugin",
                @"AIRealNameTooltip",
                @"AIUserHostTooltip",
                @"AIIRCChannelLinker",
                @"AIURLHandlerPlugin",
                @"AIJumpControlPlugin",
                @"AIWebKitMessageViewPlugin",
                @"AWBonjourPlugin",
                @"CBPurpleServicePlugin",
                @"AIImageUploaderPlugin",
                @"AITwitterStatusFollowup",
                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