This is NetTalkThinker.BundleLoading.m in view mode; [Download] [Up]
#import "NetTalkThinker.h" #import <appkit/appkit.h> #import <sys/dir.h> #define NTK_RTFD "RTFDChat" #define EXTENSION "nettalk" @implementation NetTalkThinker(BundleLoading) - (List *)getBundlesForDirectory:(const char *)dirname { DIR *dir = NULL; struct direct *dr; const char *ext; char path[1025]; List *bundles; dir = opendir(dirname); if(!dir) return nil; bundles = [[List allocFromZone:[self zone]] init]; while((dr = readdir(dir))!=0) { ext = strrchr(dr->d_name, '.'); if (ext) if (strcmp(ext+1, EXTENSION) == 0) { sprintf(path, "%s/%s", dirname, dr->d_name); fprintf(stderr, "[NetTalk: Loading %s]\n", path); [bundles addObjectIfAbsent: [[NXBundle alloc] initForDirectory:(const char *)path]]; } } closedir(dir); return bundles; } - processBundlesInList:(List *)list { char path[1024]; const char *bundlename; char helpname[1024]; NXBundle *aBundle; int i; for (i = 0; i < [list count]; i++) { aBundle = [list objectAt:i]; [bundleList addObject:aBundle]; currentControllerClass = [aBundle principalClass]; bundlename = [currentControllerClass name]; sprintf(helpname, "%s%s", bundlename, "Help"); [aBundle getPath:path forResource:helpname ofType:""]; *strrchr(path, '/') = 0; [[NXHelpPanel new] addSupplement:helpname inPath:path]; } return self; } /*****************************************************************/ /* - initializeBundles:sender (->self) */ /* */ /* Inititalizes the bundleList by loading bundles from */ /* .../NetTalk.app, ~/Library/NetTalk, */ /* and /LocalLibrary/NetTalk. */ /* Sets the currentControllerClass to the first bundle's class. */ /*****************************************************************/ - initializeBundles:sender { List *list; char appPath[1025]; char userPath[1025]; bundleList = [[List alloc] initCount:1]; strcpy(appPath, NXArgv[0]); *strrchr(appPath, '/') = 0; list = [self getBundlesForDirectory:appPath]; [self processBundlesInList:list]; [list free]; sprintf(userPath, "%s/Library/NetTalk", NXHomeDirectory()); list = [self getBundlesForDirectory:userPath]; [self processBundlesInList:list]; [list free]; list = [self getBundlesForDirectory:"/LocalLibrary/NetTalk"]; [self processBundlesInList:list]; [list free]; currentControllerClass = [[bundleList objectAt:0] principalClass]; return self; } - (Class)controllerClassFor:(const char *)className { int i = 0; Class controllerClass = nil; while (!controllerClass && (i < [bundleList count])) { if ([[bundleList objectAt:i] classNamed:className]) controllerClass = [[bundleList objectAt:i] principalClass]; i++; } return controllerClass; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.