This is GopherDispatcher.m in view mode; [Download] [Up]
//////////////////////////////////////////////////////////////// // This is the object that runs the app. #import "GopherDispatcher.h" #import <stdio.h> int shouldUseSound = 0; @implementation GopherDispatcher // These are the global variables used to hold the // hostname and port of the next Gopher to be opened. char defaultHost[256]; int defaultPort; int defaultApp; ////////////////////////////////////////////////////////////// // Create a new Gopher window. - newGopher:sender { id newWindow; strncpy(defaultHost, NXGetDefaultValue("Gopher", "GopherHost"), 256); [GopherHostTextItem setStringValue:defaultHost]; defaultPort = atoi(NXGetDefaultValue("Gopher", "GopherPort")); [GopherPortTextItem setIntValue:defaultPort]; defaultApp = atoi(NXGetDefaultValue("Gopher", "TermApp")); newWindow = [[GopherClient new] setDispatcher:self]; [self newFrontWindow:newWindow]; return self; } ////////////////////////////////////////////////////////////// // Open the Open window - openWindow:sender { [OpenHostTextItem setStringValue:defaultHost]; [OpenPortTextItem setIntValue:defaultPort]; [OpenWindow makeKeyAndOrderFront:self]; return self; } ////////////////////////////////////////////////////////////// // Open a new Gopher. - openGopher:sender { id newWindow; [OpenWindow performClose:self]; strncpy(defaultHost, [OpenHostTextItem stringValue], 250); defaultPort = [OpenPortTextItem intValue]; newWindow = [[GopherClient new] setDispatcher:self]; [self newFrontWindow:newWindow]; return self; } ////////////////////////////////////////////////////////////// // Close the current Gopher. - closeGopher:sender { [self oldFrontWindow:currentWindow]; [currentWindow close]; return self; } ////////////////////////////////////////////////////////////// // Print the contents of the current window. // Since the Print... menu item should be disabled when necessary, // the current window should always be a Gopher window when this // comes up. - print:sender { [currentWindow print]; return self; } ////////////////////////////////////////////////////////////// // Save the contents of the current window. - save:sender { id mySavePanel; mySavePanel = [SavePanel new]; [mySavePanel setTitle:"Save Gopher text"]; [mySavePanel setPrompt:"Save text into :"]; if ([mySavePanel runModalForDirectory:"." file:[currentWindow currentCellName]]) [currentWindow saveAs:(char *)[mySavePanel filename]]; return self; } /////////////////////////////////////////////////////////////// // Find the next text string if possible - findText:sender { [currentWindow highlightNextWord]; return self; } ////////////////////////////////////////////////////////////// // Show current item info. - itemInfo:sender { [currentWindow showItemInfo]; return self; } ////////////////////////////////////////////////////////////// // Stop currently playing sound (if any). - stopSound:sender { if (mutex_try_lock(soundIsPlaying) != 0) { // No sound playing mutex_unlock(soundIsPlaying); return self; } if (mutex_try_lock(soundShouldStop) != 0) { soundShouldStopFlag = 1; mutex_unlock(soundShouldStop); } return self; } ////////////////////////////////////////////////////////////// // This is called every time a Gopher window becomes active. // The sender is NOT the window itself, but the GopherClient // responsible for it (which is its delegate). - newFrontWindow:sender { [PrintMenuCell setEnabled:YES]; [SaveMenuCell setEnabled:YES]; [CloseMenuCell setEnabled:YES]; currentWindow = sender; return self; } ////////////////////////////////////////////////////////////// // This is called every time a Gopher window becomes inactive. // The sender is NOT the window itself, but the GopherClient // responsible for it (which is its delegate). - oldFrontWindow:sender { if (currentWindow == sender) { // Only if this was the current window [PrintMenuCell setEnabled:NO]; [SaveMenuCell setEnabled:NO]; [CloseMenuCell setEnabled:NO]; currentWindow = NIL; } return self; } ////////////////////////////////////////////////////////////// // - savePreferences:sender { NXWriteDefault("Gopher", "GopherHost", [GopherHostTextItem stringValue]); NXWriteDefault("Gopher", "GopherPort", [GopherPortTextItem stringValue]); defaultApp = [teminalApp selectedRow]; if ( defaultApp == 1 ) NXWriteDefault("Gopher", "TermApp", "1"); else NXWriteDefault("Gopher", "TermApp", "0"); [PreferenceWindow performClose:self]; return self; } /////////////////////////////////////////////////////////////////////////////// // Delegate methods ////////////////////////////////////////////////////////////// // Is called after the application has opened. - appDidInit:sender { static NXDefaultsVector GopherDefaults = { {"GopherHost", DEFAULT_SERVER}, {"GopherPort", DEFAULT_PORT}, {"TermApp", "0"}, {NULL} }; struct stat myStat; if (NXRegisterDefaults("Gopher", GopherDefaults) == 0) /*error*/; strncpy(defaultHost, NXGetDefaultValue("Gopher", "GopherHost"), 256); [GopherHostTextItem setStringValue:defaultHost]; defaultPort = atoi(NXGetDefaultValue("Gopher", "GopherPort")); [GopherPortTextItem setIntValue:defaultPort]; defaultApp = atoi(NXGetDefaultValue("Gopher", "TermApp")); [teminalApp selectCellAt:defaultApp:0]; soundIsPlaying = mutex_alloc(); soundShouldStop = mutex_alloc(); if (stat(PlayCommand, &myStat) == 0) if (myStat.st_mode & 0000001) shouldUseSound = 1; [[GopherClient new] setDispatcher:self]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.