diff options
Diffstat (limited to 'bindings/objc/src/SwordInstallSourceController.mm')
-rw-r--r-- | bindings/objc/src/SwordInstallSourceController.mm | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/bindings/objc/src/SwordInstallSourceController.mm b/bindings/objc/src/SwordInstallSourceController.mm new file mode 100644 index 0000000..452c005 --- /dev/null +++ b/bindings/objc/src/SwordInstallSourceController.mm @@ -0,0 +1,333 @@ +// +// SwordInstallManager.mm +// Eloquent +// +// Created by Manfred Bergmann on 13.08.07. +// Copyright 2007 __MyCompanyName__. All rights reserved. +// + +#import "SwordInstallSourceController.h" +#import "SwordInstallSource.h" +#import "SwordManager.h" +#import "SwordModule.h" + +#include "installmgr.h" +//#include "MyInstallMgr.h" + +#ifdef __cplusplus +typedef std::map<sword::SWBuf, sword::InstallSource *> InstallSourceMap; +typedef sword::multimapwithdefault<sword::SWBuf, sword::SWBuf, std::less <sword::SWBuf> > ConfigEntMap; +#endif + +#define INSTALLSOURCE_SECTION_TYPE_FTP "FTPSource" +#define INSTALLSOURCE_SECTION_TYPE_HTTP "HTTPSource" + +@implementation SwordInstallSourceController + +@dynamic configPath; +@synthesize configFilePath; +@synthesize installSources; +@synthesize installSourceList; + +// ------------------- getter / setter ------------------- +- (NSString *)configPath { + return configPath; +} + +- (void)setConfigPath:(NSString *)value { + DLog(@""); + + if(configPath != value) { + [configPath release]; + configPath = [value copy]; + + if(value != nil) { + // check for existence + NSFileManager *fm = [NSFileManager defaultManager]; + BOOL isDir; + if(([fm fileExistsAtPath:configPath] == NO) && createPath == YES) { + // create path + [fm createDirectoryAtPath:configPath attributes:nil]; + } + + if(([fm fileExistsAtPath:configPath isDirectory:&isDir] == YES) && (isDir)) { + // set configFilePath + [self setConfigFilePath:[configPath stringByAppendingPathComponent:@"InstallMgr.conf"]]; + + // check config + if([fm fileExistsAtPath:configFilePath] == NO) { + // create config entry + sword::SWConfig config([configFilePath cStringUsingEncoding:NSUTF8StringEncoding]); + config["General"]["PassiveFTP"] = "true"; + config.Save(); + + // create default Install source + SwordInstallSource *is = [[[SwordInstallSource alloc] initWithType:INSTALLSOURCE_TYPE_FTP] autorelease]; + [is setCaption:@"CrossWire"]; + [is setSource:@"ftp.crosswire.org"]; + [is setDirectory:@"/pub/sword/raw"]; + + // addInstallSource will reinitialize + [self addInstallSource:is]; + + } else { + // init installMgr + [self reinitialize]; + } + + // sync with master install source list + //[self refreshMasterRemoteInstallSourceList]; + + } else { + ALog(@"Config path does not exist: %@", configPath); + } + } + } +} + +// -------------------- methods -------------------- + +// initialization ++ (SwordInstallSourceController *)defaultController { + static SwordInstallSourceController *singleton; + if(singleton == nil) { + singleton = [[SwordInstallSourceController alloc] init]; + } + + return singleton; +} + +/** +base path of the module installation + */ +- (id)init { + self = [super init]; + if(self) { + createPath = NO; + [self setConfigPath:nil]; + [self setConfigFilePath:nil]; + [self setInstallSources:[NSMutableDictionary dictionary]]; + [self setInstallSourceList:[NSMutableArray array]]; + } + + return self; +} + +/** + initialize with given path + */ +- (id)initWithPath:(NSString *)aPath createPath:(BOOL)create { + self = [self init]; + if(self) { + createPath = create; + [self setConfigPath:aPath]; + } + + return self; +} + +/** re-init after adding or removing new modules */ +- (void)reinitialize { + sword::SWConfig config([configFilePath UTF8String]); + config.Load(); + + // init installMgr + BOOL disclaimerConfirmed = NO; + if(swInstallMgr != nil) { + disclaimerConfirmed = [self userDisclaimerConfirmed]; + } + swInstallMgr = new sword::InstallMgr([configPath UTF8String]); + if(swInstallMgr == nil) { + ALog(@"Could not initialize InstallMgr!"); + } else { + [self setUserDisclainerConfirmed:disclaimerConfirmed]; + + // empty all lists + [installSources removeAllObjects]; + [installSourceList removeAllObjects]; + + // init install sources + for(InstallSourceMap::iterator it = swInstallMgr->sources.begin(); it != swInstallMgr->sources.end(); it++) { + sword::InstallSource *sis = it->second; + SwordInstallSource *is = [[SwordInstallSource alloc] initWithSource:(id)sis]; + + [installSources setObject:is forKey:[is caption]]; + // also add to list + [installSourceList addObject:is]; + } + } +} + +- (void)finalize { + if(swInstallMgr != nil) { + delete swInstallMgr; + } + + [super finalize]; +} + +- (void)dealloc { + if(swInstallMgr != nil) { + delete swInstallMgr; + } + + [self setConfigPath:nil]; + [self setInstallSources:nil]; + [self setInstallSourceList:nil]; + [self setConfigFilePath:nil]; + + [super dealloc]; +} + +- (void)addInstallSource:(SwordInstallSource *)is { + [self addInstallSource:is withReinitialize:YES]; +} + +// add/remove install sources +- (void)addInstallSource:(SwordInstallSource *)is withReinitialize:(BOOL)reinit { + + // save at once + sword::SWConfig config([configFilePath cStringUsingEncoding:NSUTF8StringEncoding]); + if([[is type] isEqualToString:INSTALLSOURCE_TYPE_FTP]) { + config["Sources"].insert(ConfigEntMap::value_type(INSTALLSOURCE_SECTION_TYPE_FTP, [[is configEntry] UTF8String])); + } else { + config["Sources"].insert(ConfigEntMap::value_type(INSTALLSOURCE_SECTION_TYPE_HTTP, [[is configEntry] UTF8String])); + } + config.Save(); + + if(reinit) + [self reinitialize]; +} + +- (void)removeInstallSource:(SwordInstallSource *)is { + [self removeInstallSource:is withReinitialize:NO]; +} + +- (void)removeInstallSource:(SwordInstallSource *)is withReinitialize:(BOOL)reinit { + + // remove source + [installSources removeObjectForKey:[is caption]]; + [installSourceList removeObject:is]; + + // save at once + sword::SWConfig config([configFilePath cStringUsingEncoding:NSUTF8StringEncoding]); + config["Sources"].erase(INSTALLSOURCE_SECTION_TYPE_HTTP); + config["Sources"].erase(INSTALLSOURCE_SECTION_TYPE_FTP); + + // build up new + NSEnumerator *iter = [installSources objectEnumerator]; + SwordInstallSource *sis = nil; + while((sis = [iter nextObject])) { + if([[sis type] isEqualToString:INSTALLSOURCE_TYPE_FTP]) { + config["Sources"].insert(ConfigEntMap::value_type(INSTALLSOURCE_SECTION_TYPE_FTP, [[sis configEntry] UTF8String])); + } else { + config["Sources"].insert(ConfigEntMap::value_type(INSTALLSOURCE_SECTION_TYPE_HTTP, [[sis configEntry] UTF8String])); + } + } + config.Save(); + + if(reinit) + [self reinitialize]; +} + +- (void)updateInstallSource:(SwordInstallSource *)is { + // first remove, then add again + [self removeInstallSource:is withReinitialize:NO]; + [self addInstallSource:is]; +} + +// installation/uninstallation +- (int)installModule:(SwordModule *)aModule fromSource:(SwordInstallSource *)is withManager:(SwordManager *)manager { + + int stat = -1; + if([[is source] isEqualToString:@"localhost"]) { + stat = swInstallMgr->installModule([manager swManager], [[is directory] UTF8String], [[aModule name] UTF8String]); + } else { + stat = swInstallMgr->installModule([manager swManager], 0, [[aModule name] UTF8String], [is installSource]); + } + + return stat; +} + +- (int)refreshMasterRemoteInstallSourceList { + int stat = swInstallMgr->refreshRemoteSourceConfiguration(); + if(stat) { + ALog(@"Unable to refresh with master install source!"); + } + + return stat; +} + +/** + uninstalls a module from a SwordManager + */ +- (int)uninstallModule:(SwordModule *)aModule fromManager:(SwordManager *)swManager { + int stat = swInstallMgr->removeModule([swManager swManager], [[aModule name] UTF8String]); + + return stat; +} + +// list modules in sources +- (NSArray *)listModulesForSource:(SwordInstallSource *)is { + return [is listModules]; +} + +/** refresh modules of this source + refreshing the install source is necessary before installation of + */ +- (int)refreshInstallSource:(SwordInstallSource *)is { + int ret = 1; + + if(is == nil) { + ALog(@"Install source is nil"); + } else { + if([[is source] isEqualToString:@"localhost"] == NO) { + ret = swInstallMgr->refreshRemoteSource([is installSource]); + } + } + + return ret; +} + +/** + returns an array of Modules with status set, nil on error + */ +- (NSArray *)moduleStatusInInstallSource:(SwordInstallSource *)is baseManager:(SwordManager *)baseMgr { + + NSArray *ret = nil; + + // get modules map + NSMutableArray *ar = [NSMutableArray array]; + std::map<sword::SWModule *, int> modStats = swInstallMgr->getModuleStatus(*[baseMgr swManager], *[[is swordManager] swManager]); + sword::SWModule *module; + int status; + for(std::map<sword::SWModule *, int>::iterator it = modStats.begin(); it != modStats.end(); it++) { + module = it->first; + status = it->second; + + SwordModule *mod = [[SwordModule alloc] initWithSWModule:module]; + [mod setStatus:status]; + [ar addObject:mod]; + } + + if(ar) { + ret = [NSArray arrayWithArray:ar]; + } + + return ret; +} + +- (BOOL)userDisclaimerConfirmed { + return swInstallMgr->isUserDisclaimerConfirmed(); +} + +- (void)setUserDisclainerConfirmed:(BOOL)flag { + swInstallMgr->setUserDisclaimerConfirmed(flag); +} + +/** low level access */ +- (sword::InstallMgr *)installMgr { + return swInstallMgr; +} + +@end |