home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Multimedia / MPlay / Source / Controller.m < prev    next >
Encoding:
Text File  |  1995-12-12  |  2.4 KB  |  135 lines

  1.  
  2. #import "Controller.h"
  3. #import "Process.h"
  4.  
  5. static id movieList;
  6.  
  7. void fromPlayer(int fd, void *data)
  8. {
  9.     char buf[1024];
  10.     int size;
  11.     
  12.     size = read(fd,buf, sizeof(buf) -1);
  13.     if(size <=0) {/* process dead or done */
  14.         [[movieList removeObject:(id)data] free];
  15.         return;
  16.     }
  17.     
  18.     buf[size] = '\000';
  19.     return;
  20.     
  21. }
  22.  
  23. @implementation Controller
  24.  
  25. - open:sender
  26. {
  27.     const char *const *files;
  28.     id openPanel;  
  29.     char fullName[MAXPATHLEN+1];
  30.  
  31.     char *fileTypes[5] = {"mpeg", "MPEG", "mpg", "MPG", 0};
  32.  
  33.     openPanel = 
  34.       [[[OpenPanel new] allowMultipleFiles:YES] setTitle:"Open MPEG stream"];
  35.  
  36.     /* run the open panel */
  37.     if ([openPanel runModalForTypes:fileTypes]){
  38.         for (files = [openPanel filenames]; files && *files; files++) {    
  39.               sprintf(fullName,"%s/%s",[openPanel directory],*files);
  40.             if (![self  launchMovie:fullName]) {
  41.                 NXRunAlertPanel("Open","Can't open %s",
  42.                  "Okay", NULL, NULL, *files);
  43.             }
  44.         }
  45.     }
  46.     return self;
  47. }
  48.  
  49.  
  50. - (BOOL) launchMovie:(const char *)fullName
  51. {
  52.     char *argv[3] = {0,0,0};
  53.     id proc;
  54.     
  55.     argv[0] = malloc(strlen(playProgram)+1);    
  56.     strcpy(argv[0], playProgram);
  57.     
  58.     argv[1] = malloc(strlen(fullName)+1);
  59.     strcpy(argv[1], fullName);
  60.     
  61.     proc = [ [Process alloc] initFromCommand:argv];
  62.     
  63.     if(!proc) return NO;
  64.  
  65.     [movies addObject:proc];
  66.  
  67.     [proc dpsWatchFD:fromPlayer data:proc priority:NX_BASETHRESHOLD];
  68.         
  69.     free(argv[0]);
  70.     free(argv[1]);
  71.     
  72.     return YES;
  73. }
  74.  
  75.  
  76.  
  77. @end
  78.  
  79. @implementation Controller(ApplicationDelegate)
  80.  
  81. - (int)app:sender openFile:(const char *)path type:(const char *)type
  82. {
  83.     /* user opens a document from the Workspace Manager. */
  84.  
  85.     char *fileTypes[4] = {"mpeg", "MPEG", "mpg", "MPG"};
  86.     int i;
  87.  
  88.     for(i=0;i<4;i++) {    
  89.         if(strcmp(type,fileTypes[i]) == 0) break;
  90.         if(i == 3) return NO;
  91.     }
  92.  
  93.     if (![self launchMovie:path]) {
  94.         NXRunAlertPanel("Open","Can't open %s", "Okay", NULL, NULL, path);
  95.         return NO;        
  96.     }
  97.     
  98.     return YES;
  99. }
  100.  
  101. - (BOOL)appAcceptsAnotherFile:sender
  102. /*
  103.  * Inform the workspace that we can open multiple files.
  104.  */
  105. {
  106.   return YES;
  107. }
  108.  
  109. -appWillInit:sender
  110. {
  111.      strcpy(playProgram, [[NXBundle mainBundle] directory]);
  112.      strcat(playProgram, "/mpeg_play");
  113.      
  114.      if(access(playProgram,X_OK)){
  115.         NXRunAlertPanel("MPlay.app","Can't open mpeg_play",
  116.             "Okay", NULL, NULL, NULL);
  117.  
  118.         return [sender free];
  119.      }
  120.  
  121.     movies = [[List alloc] init];
  122.     movieList = movies;
  123.     return self;
  124. }
  125.  
  126. - appWillTerminate:sender
  127. {
  128.     if(movies) [movies freeObjects];
  129.     
  130.     return self;
  131. }
  132.  
  133.  
  134. @end
  135.