This is AlexandraApp.m in view mode; [Download] [Up]
#import "AlexandraApp.h"
#import "AMGErrorHandling.subproj/AMGErrorHandling.h"
#import <misckit/misckit.h>
#import <libc.h>
#import "emccodes.h"
//-----------------------------------------------------------
// Category of MiscInfoController
//-----------------------------------------------------------
@interface MiscInfoController(GetStringTable)
- strings;
@end
@implementation MiscInfoController(GetStringTable)
- strings;
{
return strings;
}
@end
@implementation AlexandraApp
//-----------------------------------------------------------
// initialise
//-----------------------------------------------------------
- appDidInit:sender;
{
[EMErrorManager new];
[self makeScratchDirectory];
return self;
}
- terminate:sender;
{
if ([super terminate:sender] == nil)
{
[self removeScratchDirectory];
return nil;
}
return self;
}
//-----------------------------------------------------------
// global attributes
//-----------------------------------------------------------
- (const char *)appVersion;
{
return [[(MiscInfoController *)infoController strings] valueForKey:"Version"];
}
//-----------------------------------------------------------
// scratch directory
//-----------------------------------------------------------
- (void)_removeDirectory:(const char *)pathName;
{
DIR *dirp;
struct direct *dp;
if(chdir(pathName) < 0)
EM_ERROR(EGENScratchDirInaccessible, pathName, NULL);
if((dirp = opendir(".")) == NULL)
EM_ERROR(EGENScratchDirInaccessible, pathName, NULL);
for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
{
if((strcmp(dp->d_name, ".") == 0) || (strcmp(dp->d_name, "..") == 0))
continue;
if(unlink(dp->d_name) < 0)
EM_ERROR(EGENScratchDirInaccessible, pathName, NULL);
}
closedir(dirp);
chdir("/tmp");
if(rmdir(pathName) < 0)
EM_ERROR(EGENScratchDirInaccessible, pathName, NULL);
}
- (void)_makeDirectory:(const char *)pathName;
{
int ret;
if((ret = mkdir(pathName, 0700)) < 0)
{
if(ret == EEXIST)
{
[self _removeDirectory:pathName];
if((ret = mkdir(pathName, 0700)) < 0)
EM_ERROR(EGENTempDirInaccessible, strerror(errno), NULL);
}
else
{
EM_ERROR(EGENTempDirInaccessible, strerror(errno), NULL);
}
}
}
- (const char *)scratchDirectoryName;
{
static char buffer[100];
struct stat _stat;
sprintf(buffer, "/tmp/Alexandra%06d", getpid());
if ((stat(buffer, &_stat)) == -1)
{
NXLogError("making scratch directory `%s'\n", buffer);
[self _makeDirectory:buffer];
}
return buffer;
}
- makeScratchDirectory;
{
const char *sdir;
sdir = [self scratchDirectoryName];
NXLogError("making scratch directory `%s'\n", sdir);
[self _makeDirectory:sdir];
return self;
}
- removeScratchDirectory;
{
const char *sdir;
NXLogError("removing scratch directory `%s'\n", sdir);
sdir = [self scratchDirectoryName];
[self _removeDirectory:sdir];
return self;
}
//-----------------------------------------------------------
// AUTORELEASE POOL MANAGEMENT
//-----------------------------------------------------------
#if 1
- (void)_setupAutoreleasePool
{
autoreleasePool = [[NSAutoreleasePool alloc] init];
disableCount = 0;
}
/*
* Release the current pool, and create a new one.
*/
- (void)_releasePool
{
if(disableCount<= 0) {
[autoreleasePool release];
autoreleasePool = [[NSAutoreleasePool alloc] init];
}
}
+ new
{
id poolApplication;
poolApplication = [super new];
[poolApplication _setupAutoreleasePool];
return poolApplication;
}
/*
* Release the current pool before and after every event.
*/
- sendEvent:(NXEvent *)event
{
[self _releasePool];
disableCount += 1;
[super sendEvent:event];
disableCount -= 1;
[self _releasePool];
return self;
}
/*
* Need to disable the autorelease pool during modal loops otherwise
* objects that are involved in the modal loop will be freed prematurely.
* We need to have a "disable count" rather than a boolean flag because
* we can have nested modal sessions.
*/
- (int)runModalSession:(NXModalSession *)session
{
int retVal;
disableCount++;
retVal = [super runModalSession:session];
disableCount--;
return retVal;
}
- (int)runModalFor:theWindow
{
int retVal;
disableCount++;
retVal = [super runModalFor:theWindow];
disableCount--;
return retVal;
}
- (NXEvent *)getNextEvent:(int)mask
{
NXEvent *event;
// fprintf(stderr, "[Application getNextEvent:] in\n");
event = [super getNextEvent:mask];
// fprintf(stderr, "[Application getNextEvent:] out\n");
return event;
}
#endif
//-----------------------------------------------------------
// THAT'S IT
//-----------------------------------------------------------
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.