/* Copyright (C) 2004-2005 SKYRIX Software AG This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. OGo 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "SOGoProductLoader.h" #include "common.h" @implementation SOGoProductLoader + (int)sogoMajorVersion { return SOGO_MAJOR_VERSION; } + (int)sogoMinorVersion { return SOGO_MINOR_VERSION; } + (id)productLoader { return [[[self alloc] init] autorelease]; } - (id)init { if ((self = [super init])) { self->productDirectoryName = [[NSString alloc] initWithFormat:@"SOGo-%i.%i", [[self class] sogoMajorVersion], [[self class] sogoMinorVersion]]; } return self; } - (void)dealloc { [self->productDirectoryName release]; [self->searchPathes release]; [super dealloc]; } /* loading */ - (void)_addCocoaSearchPathesToArray:(NSMutableArray *)ma { id tmp; tmp = NSSearchPathForDirectoriesInDomains(NSAllLibrariesDirectory, NSAllDomainsMask, YES); if ([tmp count] > 0) { NSEnumerator *e; e = [tmp objectEnumerator]; while ((tmp = [e nextObject])) { tmp = [tmp stringByAppendingPathComponent:self->productDirectoryName]; if (![ma containsObject:tmp]) [ma addObject:tmp]; } } } - (void)_addGNUstepSearchPathesToArray:(NSMutableArray *)ma { NSDictionary *env; id tmp; env = [[NSProcessInfo processInfo] environment]; if ((tmp = [env objectForKey:@"GNUSTEP_PATHPREFIX_LIST"]) == nil) tmp = [env objectForKey:@"GNUSTEP_PATHLIST"]; tmp = [tmp componentsSeparatedByString:@":"]; if ([tmp count] > 0) { NSEnumerator *e; e = [tmp objectEnumerator]; while ((tmp = [e nextObject])) { tmp = [tmp stringByAppendingPathComponent:@"Library"]; tmp = [tmp stringByAppendingPathComponent:self->productDirectoryName]; if (![ma containsObject:tmp]) [ma addObject:tmp]; } } else { NSLog(@"%s: empty library search path !", __PRETTY_FUNCTION__); } } - (void)_addFHSPathesToArray:(NSMutableArray *)ma { NSString *s; s = @"sogod-0.9"; [ma addObject:[@"/usr/local/lib/" stringByAppendingString:s]]; [ma addObject:[@"/usr/lib/" stringByAppendingString:s]]; } - (NSArray *)productSearchPathes { NSMutableArray *ma; BOOL hasGNUstepEnv; if (self->searchPathes != nil) return self->searchPathes; hasGNUstepEnv = [[[[NSProcessInfo processInfo] environment] objectForKey:@"GNUSTEP_USER_ROOT"] length] > 0 ? YES : NO; ma = [NSMutableArray arrayWithCapacity:6]; if (hasGNUstepEnv) [self _addGNUstepSearchPathesToArray:ma]; #if COCOA_Foundation_LIBRARY else [self _addCocoaSearchPathesToArray:ma]; #endif [self _addFHSPathesToArray:ma]; self->searchPathes = [ma copy]; if ([self->searchPathes count] == 0) { [self logWithFormat:@"%s: no search pathes were found !", __PRETTY_FUNCTION__]; } return self->searchPathes; } - (void)loadProducts { SoProductRegistry *registry = nil; NSFileManager *fm; NSEnumerator *pathes; NSString *lpath; registry = [SoProductRegistry sharedProductRegistry]; fm = [NSFileManager defaultManager]; pathes = [[self productSearchPathes] objectEnumerator]; while ((lpath = [pathes nextObject]) != nil) { NSEnumerator *productNames; NSString *productName; [self logWithFormat:@"scanning SOGo products in: %@", lpath]; productNames = [[fm directoryContentsAtPath:lpath] objectEnumerator]; while ((productName = [productNames nextObject]) != nil) { NSString *bpath; if ([[productName pathExtension] length] == 0) /* filter out directories without extensions */ continue; bpath = [lpath stringByAppendingPathComponent:productName]; [self logWithFormat:@" register SOGo product: %@", [bpath lastPathComponent]]; [registry registerProductAtPath:bpath]; } } if (![registry loadAllProducts]) [self warnWithFormat:@"could not load all products !"]; } @end /* SOGoProductLoader */