This is Controller.m in view mode; [Download] [Up]
#import "Controller.h" #import <appkit/appkit.h> #import <sys/file.h> @implementation Controller - init { id returnval=[super init]; journaler=[[NXJournaler alloc] init]; [journaler setDelegate:self]; [NXApp setDelegate:self]; return returnval; } - (int) status { return status; } - play:sender { char const*filetype[2]={0,0}; id op=[OpenPanel new]; const char* fi; id result; if (status) { if (status==MAC_STATUS_PLAYING) [play_button setState:1]; if (status==MAC_STATUS_RECORDING) [play_button setState:0]; [op free]; return NULL; } [play_button setState:1]; status=MAC_STATUS_PLAYING; filetype[0]="mac"; [op allowMultipleFiles:NO]; [op setPrompt: "Macro to Play:"]; [op runModalForDirectory:NXHomeDirectory() file: "" types:filetype]; fi=[op filename]; result=[self playFile:fi]; [op free]; return result; } - playFile:(const char*) fi { if (fi==NULL) { status=MAC_STATUS_STOPPED; [play_button setState:0]; return NULL; } fd=open (fi,O_RDONLY,0666); // read, write by anyone if (fd==-1) { status=MAC_STATUS_STOPPED; [play_button setState:0]; return NULL; } current=NXOpenFile(fd,NX_READONLY); [journaler setEventStatus:NX_PLAYING soundStatus:NX_STOPPED eventStream:current soundfile:NULL]; return self; } - record:sender { char const*filetype[2]={0,0}; id sp=[SavePanel new]; const char* fi; int result; if (status) { if (status==MAC_STATUS_PLAYING) [record_button setState:0]; if (status==MAC_STATUS_RECORDING) [record_button setState:1]; [sp free]; return NULL; } [record_button setState:1]; status=MAC_STATUS_RECORDING; filetype[0]="mac"; [sp setRequiredFileType:"mac"]; [sp setPrompt: "Save Macro as:"]; result=[sp runModalForDirectory:NXHomeDirectory() file: ""]; fi=[sp filename]; if (fi==NULL) { status=MAC_STATUS_STOPPED; [record_button setState:0]; [sp free]; return NULL; } fd=open (fi,O_WRONLY|O_CREAT,0666); // read, write by anyone if (fd==-1) { status=MAC_STATUS_STOPPED; [record_button setState:0]; [sp free]; return NULL; } current=NXOpenFile(fd,NX_WRITEONLY); [journaler setEventStatus:NX_RECORDING soundStatus:NX_STOPPED eventStream:current soundfile:NULL]; [sp free]; return self; } - stop:sender { if (status==MAC_STATUS_STOPPED) { [stop_button setState:0]; return NULL; } [journaler setEventStatus:NX_STOPPED soundStatus:NX_STOPPED eventStream:current soundfile:NULL]; return self; } - journalerDidEnd:this_journaler { NXClose(current); close(fd); status=MAC_STATUS_STOPPED; [play_button setState:0]; [record_button setState:0]; [stop_button setState:0]; [functionLibrary journalerDidEnd:this_journaler]; return self; } - journalerDidUserAbort:journaler { return self; } - (BOOL) appAcceptsAnotherFile:sender { return (status==MAC_STATUS_STOPPED); // can only accept file in stopped state } - (int) app:sender openFile:(const char*) filename type:(const char*) aType { return ([self playFile:filename]!=NULL); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.