This is Controller.m in view mode; [Download] [Up]
/* * Copyright 1994, Black Adder Research, Inc. This source code may be * redistributed and modified with one restriction - do not claim that * you wrote it. * * Black Adder Research, Inc. * 730 Norell Ave. North * Stillwater, MN 55082 * */ #import <appkit/appkit.h> #import <math.h> #import <strings.h> #import <defaults/defaults.h> #import "Controller.h" #import "AVIView.h" #import "MPEGView.h" #import <sys/param.h> #import <libc.h> /* File extensions for video files */ const char *aviType = "avi"; const char *mpgType = "mpg"; @implementation Controller : Object - openRequest:sender { id openReq; char srcName[256]; const char *const fileTypes[] = {aviType, mpgType, NULL}; openReq = [OpenPanel new]; if ([openReq runModalForTypes:fileTypes]) { strcpy(srcName, [openReq filename]); [self openFile: srcName]; } return self; } - (BOOL) openFile: (char *) srcName { id window, view=nil; NXRect rect; char *ext; BOOL retVal = NO; /* determine file type and allocate appropriate view type */ ext = rindex(srcName, '.'); ++ext; if(0 == strncmp(aviType, ext, 3)) { if([self getAVIFrameSize: &(rect.size) forFile: srcName]) { view = [[AVIView alloc] initSize: (const NXSize *) &(rect.size)]; } } else { if([self getMPEGFrameSize: &(rect.size) forFile: srcName]) { view = [[MPEGView alloc] initSize: (const NXSize *) &(rect.size)]; } } if (nil != view) { rect.origin.x = 0.0; rect.origin.y = 0.0; window = [[Window alloc] initContent:&rect style:NX_TITLEDSTYLE backing:NX_NONRETAINED buttonMask:NX_CLOSEBUTTONMASK defer:NO]; [window setDelegate:self]; [window setHideOnDeactivate: YES]; [[window setContentView:view] free]; [window center]; [window setTitleAsFilename:srcName]; [window makeKeyAndOrderFront:self]; [window display]; [view runFromFile: srcName]; retVal = YES; } return(retVal); } - getAVIFrameSize: (NXSize *) fSize forFile: (char *) aviFile { char command[256]; id retVal = nil; int iTemp; FILE *ifp; if (strcmp(aviFile, "") != 0) { sprintf(command, "%s/aviDecode %s", [[NXBundle mainBundle] directory], aviFile); if ((ifp = popen(command, "r")) != NULL) { /* width and height are first 8 bytes (2 ints) in stream */ fread(&iTemp, 1, sizeof(int), ifp); fSize->width = (float) iTemp; fread(&iTemp, 1, sizeof(int), ifp); fSize->height = (float) iTemp; pclose(ifp); retVal = self; } } return(retVal); } - getMPEGFrameSize: (NXSize *) fSize forFile: (char *) mpegFile { char command[256]; id retVal = nil; int iTemp; FILE *ifp; if (strcmp(mpegFile, "") != 0) { sprintf(command, "%s/mpegDecode %s", [[NXBundle mainBundle] directory], mpegFile); if ((ifp = popen(command, "r")) != NULL) { /* skip over frame number */ fread(&iTemp, 1, sizeof(int), ifp); /* now get width and height */ fread(&iTemp, 1, sizeof(int), ifp); fSize->width = (float) iTemp; fread(&iTemp, 1, sizeof(int), ifp); fSize->height = (float) iTemp; pclose(ifp); retVal = self; } } return(retVal); } - playAgain: sender { id theWindow = [NXApp mainWindow]; if([[theWindow contentView] respondsTo: @selector(runAgain)]) { [[theWindow contentView] runAgain]; } return(self); } /* We always want to accept files. */ - (BOOL)appAcceptsAnotherFile:sender { return (YES); } /* Open avi file from workspace. */ - (int) appOpenFile:(const char *)filename type:(const char *)aType { BOOL retVal = NO; if((!strcmp(aType, aviType)) || (!strcmp(aType, mpgType))) { retVal = [self openFile:(char *)filename]; } return (retVal); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.