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 again1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | /*
* 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.
*/
#import <Adium/AIAccountControllerProtocol.h>
#import "AdiumServices.h"
#import <Adium/AIService.h>
#import <Adium/AIAccount.h>
@implementation AdiumServices
/*!
* @brief Init
*/
- (id)init
{
if ((self = [super init])) {
services = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void)dealloc
{
[services release]; services = nil;
[super dealloc];
}
/*!
* @brief Register an AIService instance
*
* All services should be registered before they are used
*/
- (void)registerService:(AIService *)inService
{
[services setObject:inService forKey:inService.serviceCodeUniqueID];
}
/*!
* @brief Returns an array of all available services
*
* @return NSArray of AIService instances
*/
- (NSArray *)services
{
return [services allValues];
}
/*!
* @brief Returns an array of all active services
*
* "Active" services are those for which the user has an enabled account.
* @param includeCompatible Include services which are compatible with an enabled account but not specifically active.
* For example, if an AIM account is enabled, the ICQ service will be included if this is YES.
* @return NSArray of AIService instances
*/
- (NSSet *)activeServicesIncludingCompatibleServices:(BOOL)includeCompatible
{
NSMutableSet *activeServices = [NSMutableSet set];
if (includeCompatible) {
//Scan our user's accounts and build a list of service classes that they cover
NSMutableSet *serviceClasses = [NSMutableSet set];
for (AIAccount *account in adium.accountController.accounts) {
if (account.enabled) {
[serviceClasses addObject:account.service.serviceClass];
}
}
//Gather and return all services compatible with these service classes
for (AIService *service in [services objectEnumerator]) {
if ([serviceClasses containsObject:service.serviceClass]) {
[activeServices addObject:service];
}
}
} else {
for (AIAccount *account in adium.accountController.accounts) {
if (account.enabled) {
[activeServices addObject:account.service];
}
}
}
return activeServices;
}
/*!
* @brief Retrieves a service by its unique ID
*
* Unique IDs are returned by -AIService.serviceCodeUniqueID. An example is @"libpurple-oscar-AIM".
* @param uniqueID The serviceCodeUniqueID of the desired service
* @return AIService if found, nil if not found
*/
- (AIService *)serviceWithUniqueID:(NSString *)uniqueID
{
return [services objectForKey:uniqueID];
}
/*!
* @brief Retrieves a service by service ID.
*
* Service IDs may be shared by multiple services if the same service is provided by two different plugins.
* -[AIService serviceID] returns serviceIDs. An example is @"AIM".
* @return The first service with the matching service ID, or nil if none is found.
*/
- (AIService *)firstServiceWithServiceID:(NSString *)serviceID
{
for (AIService *service in [services objectEnumerator]) {
if ([service.serviceID isEqualToString:serviceID])
return service;
}
return nil;
}
@end
|