1 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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
/* emacs buffer mode hint -*- objc -*- */
#import <Foundation/Foundation.h>
#import "AgendaStore.h"
#import "StoreManager.h"
#import "ConfigManager.h"
#import "defines.h"
#import "LocalStore.h"
#import "iCalStore.h"
static NSMutableDictionary *backends = nil;
@implementation StoreManager
#define PERSONAL_AGENDA @"Personal Agenda"
+ (void)initialize
{
NSArray *classes = GSObjCAllSubclassesOfClass([MemoryStore class]);
NSEnumerator *enumerator = [classes objectEnumerator];
Class backendClass;
if (backends == nil) {
backends = [[NSMutableDictionary alloc] initWithCapacity:[classes count]];
while ((backendClass = [enumerator nextObject])) {
if ([backendClass conformsToProtocol:@protocol(AgendaStore)])
[backends setObject:backendClass forKey:[backendClass storeTypeName]];
else
NSLog(@"Can't register %@ as a store backend", [backendClass description]);
}
}
}
+ (NSArray *)backends
{
return [backends allValues];
}
+ (Class)backendForName:(NSString *)name
{
return [backends valueForKey:name];
}
- (NSDictionary *)defaults
{
NSDictionary *local = [NSDictionary
dictionaryWithObjects:[NSArray arrayWithObjects:@"LocalStore", @"Personal", nil]
forKeys:[NSArray arrayWithObjects:ST_CLASS, ST_FILE, nil]];
NSDictionary *dict = [NSDictionary
dictionaryWithObjects:[NSArray arrayWithObjects: [NSArray arrayWithObject:PERSONAL_AGENDA], local, PERSONAL_AGENDA, nil]
forKeys:[NSArray arrayWithObjects: STORES, PERSONAL_AGENDA, ST_DEFAULT, nil]];
return dict;
}
- (id)init
{
NSArray *storeArray;
NSString *defaultStore;
NSEnumerator *enumerator;
NSString *stname;
ConfigManager *config = [ConfigManager globalConfig];
self = [super init];
if (self) {
[config registerDefaults:[self defaults]];
storeArray = [config objectForKey:STORES];
defaultStore = [config objectForKey:ST_DEFAULT];
_stores = [[NSMutableDictionary alloc] initWithCapacity:1];
enumerator = [storeArray objectEnumerator];
while ((stname = [enumerator nextObject]))
[self addStoreNamed:stname];
[self setDefaultStore:defaultStore];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(dataChanged:)
name:SADataChangedInStore
object:nil];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
RELEASE(_defaultStore);
[_stores release];
[super dealloc];
}
- (void)dataChanged:(NSNotification *)not
{
[[NSNotificationCenter defaultCenter] postNotificationName:SADataChanged object:self];
}
- (void)addStoreNamed:(NSString *)name
{
Class storeClass;
id <AgendaStore> store;
NSDictionary *dict;
dict = [[ConfigManager globalConfig] objectForKey:name];
if (dict) {
storeClass = NSClassFromString([dict objectForKey:ST_CLASS]);
store = [storeClass storeNamed:name];
if (store) {
[_stores setObject:store forKey:name];
NSLog(@"Added %@ to StoreManager", name);
[self dataChanged:nil];
} else
NSLog(@"Unable to initialize store %@", name);
}
}
- (void)removeStoreNamed:(NSString *)name
{
[_stores removeObjectForKey:name];
NSLog(@"Removed %@ from StoreManager", name);
[self dataChanged:nil];
}
- (id <AgendaStore>)storeForName:(NSString *)name
{
return [_stores objectForKey:name];
}
- (void)setDefaultStore:(NSString *)name
{
id st = [self storeForName:name];
if (st != nil) {
ASSIGN(_defaultStore, st);
[[ConfigManager globalConfig] setObject:name forKey:ST_DEFAULT];
}
}
- (id <AgendaStore>)defaultStore
{
return _defaultStore;
}
- (NSEnumerator *)storeEnumerator
{
return [_stores objectEnumerator];
}
- (void)synchronise
{
NSEnumerator *enumerator = [_stores objectEnumerator];
id <AgendaStore> store;
while ((store = [enumerator nextObject]))
[store write];
}
- (void)refresh
{
NSEnumerator *enumerator = [_stores objectEnumerator];
id <AgendaStore> store;
while ((store = [enumerator nextObject]))
[store read];
}
- (id <AgendaStore>)storeContainingElement:(Element *)elt
{
NSEnumerator *enumerator = [_stores objectEnumerator];
id <AgendaStore> store;
while ((store = [enumerator nextObject]))
if ([store contains:elt])
return store;
return nil;
}
- (NSArray *)allEvents
{
NSMutableArray *all = [NSMutableArray arrayWithCapacity:128];
NSEnumerator *enumerator = [_stores objectEnumerator];
id <AgendaStore> store;
while ((store = [enumerator nextObject]))
[all addObjectsFromArray:[store events]];
return all;
}
- (NSArray *)allTasks;
{
NSMutableArray *all = [NSMutableArray arrayWithCapacity:128];
NSEnumerator *enumerator = [_stores objectEnumerator];
id <AgendaStore> store;
while ((store = [enumerator nextObject]))
[all addObjectsFromArray:[store tasks]];
return all;
}
@end
|