This is Main.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "Main.h" #import "Protos.h" #import "Server.h" #import <appkit/Application.h> #import <appkit/Listener.h> #import <appkit/Speaker.h> #import <appkit/Panel.h> #import <objc/List.h> #import <stdio.h> #import <libc.h> #import <appkit/defaults.h> // Temporary files for updating services. #define SERVICE_FILE "/tmp/NewFileService" #define EXEC_FILE "/tmp/NewFileExec" @implementation Main // The application's folder. - (char *)appdir { return appdir; } // Translate a prototype's name into an absolute pathname stored in fullname. // Returns fullname. - (char *)fullprotoname:(char *)fullname:(char *)name { sprintf(fullname, "%s/blanks/%s", [self appdir], name); return fullname; } // Copy a file/directory. - (int)copyfile:(char *)to:(char *)from { int reply; char command[3*MAXPATHLEN]; sprintf(command,"/bin/cp -rp '%s' '%s'", from, to); reply = system(command); return reply;; } - appDidInit:sender { //Find the application's folder. strcpy(appdir, NXArgv[0]); *rindex(appdir, '/') = '\0'; listener = [NXApp appListener]; speaker = [NXApp appSpeaker]; [listener setServicesDelegate:server]; // Read in list of types. [self loadstate]; // Tell the servier to initialize itself. [server inittypes:[protos protoslist]]; return self; } /* Intercept termination to write text and defaults.*/ - appWillTerminate:sender { [self savestate]; return self; } // Initialization proper. - loadstate { char rc[MAXPATHLEN]; FILE *fp; // First, check for rc file in the user's home directory. sprintf(rc, "%s/.NewFilerc", getenv("HOME")); fp = fopen(rc, "r"); if (fp) { [protos readprotos:fp]; fclose(fp); } else { // No rc file in home directory, so use the one in the app's folder, sprintf(rc, "%s/NewFilerc", [self appdir]); fp = fopen(rc, "r"); if (fp) { [protos readprotos:fp]; fclose(fp); } else // Should never get to here. fprintf(stderr, "NewFile: can't open rc file: your version of NewFile is incomplete.\n"); } return self; } // Store the defaults. - savestate; { char rc[MAXPATHLEN]; FILE *fp; sprintf(rc, "%s/.NewFilerc", getenv("HOME")); fp = fopen(rc, "w"); if (fp) { [protos writeprotos:fp]; fclose(fp); } else fprintf(stderr, "NewFile: can't open rc file\n"); return self; } // Open a file by messaging the Workspace Manager. - openinws:(char *)file { int msgDelivered, fileOpened; port_t wsport; wsport = NXPortFromName(NX_WORKSPACEREQUEST, NULL); if (wsport == PORT_NULL) fprintf(stderr, "NewFile: Can't get Workspace port\n"); [speaker setSendPort:wsport]; msgDelivered = [speaker openFile:file ok:&fileOpened]; if ((msgDelivered!=0) || (fileOpened==NO)) fprintf(stderr, "NewFile: Couldn't open %s\n", file); return self; } // Open a file by messaging an application. - openineditor:(char *)file:(char *)app { int msgDelivered, fileOpened; port_t port; port = NXPortFromName(app, NULL); if (port!=PORT_NULL) { [speaker setSendPort:port]; msgDelivered = [speaker openFile:file ok:&fileOpened]; if ((msgDelivered!=0) || (fileOpened==NO)) fprintf(stderr, "NewFile: Couldn't open %s\n", file); } else { fprintf(stderr, "NewFile: Couldn't get port for %s. Opening in Workspace\n", app); [self openinws:file]; } return self; } // I'd rather discuss this. - updateservices:sender { char cmd[MAXPATHLEN]; FILE *serviceFile; int i, count; id list; char *typename; if (NXRunAlertPanel("Update services?", "This action will alter the executable file and exit NewFile.", "Go ahead", "Cancel", NULL) == NX_ALERTDEFAULT) { [self savestate]; if ((serviceFile = fopen(SERVICE_FILE, "w")) == NULL) { NXRunAlertPanel(NULL, "Could not open temporary file %s", NULL, NULL, NULL, SERVICE_FILE); exit(1); } list = [protos protoslist]; count = [list count]; for (i=0;i<count;i++) { typename = [[list objectAt:i] typename]; fprintf(serviceFile, "Message: createNew\nPort: NewFile\nMenu Item: New File/%s\nUser Data: %s\nSend Type: NXFilenamePboardType\nDeactivate Requestor: YES\n\n", typename, typename); } fclose(serviceFile); /* * OK, now we have a new service file, so insert it in the executable. */ sprintf(cmd, "/bin/segedit %s -r __ICON __services %s -o %s", NXArgv[0], SERVICE_FILE, EXEC_FILE); if (system(cmd) != 0) { NXRunAlertPanel(NULL, "Command %s failed!\nYou should copy NewFile.app into ~/Apps. See Help.", NULL, NULL, NULL, cmd); exit(1); } sprintf(cmd, "/bin/rm -f %s ; /bin/mv %s %s ; chmod a+x %s", NXArgv[0], EXEC_FILE, NXArgv[0], NXArgv[0]); if (system(cmd) != 0) { NXRunAlertPanel(NULL, "Command %s failed!\nYou should copy NewFile.app into ~/Apps. See Help.", NULL, NULL, NULL, cmd); exit(1); } if (system("make_services") != 0) { NXRunAlertPanel(NULL, "Command make_services failed!", NULL, NULL, NULL); exit(1); } NXRunAlertPanel(NULL, "Update of services complete. Applications launched from now on should show new services.", NULL, NULL, NULL); exit(0); } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.