Search code examples
objective-cnstask

AMShellWrapper sending data to a running task


I'm in the process of converting AMShellWrapper to my own application that runs an SH file that has userinput. Therefore, I need to send data to a running task.

Any ideas?

Elijah


Solution

  • You need a somewhat different approach along the lines of PseudoTTY.app!

    /*
    code added to PseudoTTY/PtyView.m
    
    sources:
    - PseudoTTY.app, http://amath.colorado.edu/pub/mac/programs/PseudoTTY.zip
    - charliebot/server.sh, http://sourceforge.net/projects/charliebot/
      (note: modify server.sh to accept complete paths; see: 
       http://stackoverflow.com/questions/3540269/noclassdeffounderror-when-running-shell-script)
    */
    
    @interface PtyView (PtyPrivate)
    -(int)count: (NSString *) str;
    ...
    @end
    
    @implementation PtyView (PtyPrivate)
    
    -(int)count: (NSString *) str {
       static int counter = 0;
       if (   
         ([str rangeOfString:@"Charlie>"].location != NSNotFound ) || \
         ([str rangeOfString:@"[Charlie] user>"].location != NSNotFound )
       )
      {
         counter++;
      }
      return counter;
    }
    
    -(void)startTask
    {
       NSString * cmd = @"/path/to/charliebot/server.sh";
       //NSString * cmd = @"/bin/sh";
       ...
       [self insertText: @"\n\n"];
    }
    
    -(void) didRead: (NSNotification *)noty
    {
       NSData * data = [[noty userInfo] objectForKey:NSFileHandleNotificationDataItem];
    
       if ([data length] == 0)
          return; // end of file
    
       NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
       int printvar = [self count: str];
    
       if   (printvar < 1 )
       {
          [self insertText: @"."];
          [str release];
          [[noty object] readInBackgroundAndNotify];
       }else if (printvar == 1) {
          [self insertText: @"\n\n"];
          [self insertText: str];
          [str release];
          [[noty object] readInBackgroundAndNotify];
       }else {
          [self insertText: str];
          [str release];
          [[noty object] readInBackgroundAndNotify];
       }
    }
    
    @end