class ApplicationDelegate
attr_accessor :runButton, :continueButton, :stepButton, :quitButton
attr_accessor :debugText
def awakeFromNib
@debugText.setString("")
end
def applicationDidFinishLaunching(notification)
#Initialize envionment variable references
defaultEnvironment = NSProcessInfo.processInfo.environment
environment = NSMutableDictionary.alloc.initWithDictionary(@defaultEnvironment)
#Path to the executatble
launchPath = "/Applications/Adobe\ Flash\ Builder\ Beta/sdks/3.4.0/bin/fdb"
#Create a reference to the notification center for listening on notifications
@center = NSNotificationCenter.defaultCenter
#Create Task
@fdb = NSTask.new
#Add an observer for the NSTaskDidTerminateNotification
@center.addObserver(self,selector:"taskDead:",name:"NSTaskDidTerminateNotification",object:@fdb)
@fdb.setLaunchPath(launchPath)
#Set up the environment
environment.setObject("YES",forKey:"NSUnbufferedIO")
@fdb.setEnvironment(environment)
#Create output pipe
@outputPipe = NSPipe.new
@outputHandle = @outputPipe.fileHandleForReading
@center.addObserver(self,selector:"taskDataAvailable:",name:"NSFileHandleReadCompletionNotification",object:@outputHandle)
@fdb.setStandardOutput(@outputPipe)
#Create error pipe
@errorPipe = NSPipe.new
@errorHandle = @errorPipe.fileHandleForReading
@center.addObserver(self,selector:"errorDataAvailable:",name:"NSFileHandleReadCompletionNotification",object:@errorHandle)
@fdb.setStandardError(@errorPipe)
#Create input pipe
@inputPipe = NSPipe.new
@inputHandle = @inputPipe.fileHandleForWriting
@fdb.setStandardInput(@inputPipe)
#Launch that puppy
@fdb.launch
#Set the outputs to read in the background and notify asynchronously
@outputHandle.readInBackgroundAndNotify
@errorHandle.readInBackgroundAndNotify
#Release the memory allocations for discarded objects
@environment.release
end
def taskDataAvailable(notification)
data = notification.userInfo.valueForKey(NSFileHandleNotificationDataItem)
if !data.nil?
string = NSString.alloc.initWithData(data,encoding:NSASCIIStringEncoding)
self.parseDataString(string)
@outputHandle.readInBackgroundAndNotify
end
end
def errorDataAvailable(notification)
data = notification.userInfo.valueForKey(NSFileHandleNotificationDataItem)
if !data.nil?
string = "ERROR: "
string += NSString.alloc.initWithData(data,encoding:NSASCIIStringEncoding)
self.parseDataString(string)
@errorHandle.readInBackgroundAndNotify
end
end
def parseDataString(dataString)
@debugText.textStorage.mutableString.appendString(dataString)
@debugText.setTextColor(NSColor.whiteColor)
end
def run(sender)
puts "RUN"
@inputHandle.writeData("r\n",dataUsingEncoding:NSString.defaultCStringEncoding)
end
def contiune(sender)
puts "CONTINUE"
@inputHandle.writeData("c\n",dataUsingEncoding:NSString.defaultCStringEncoding)
end
def step(sender)
@inputHandle.writeData("s\n",dataUsingEncoding:NSString.defaultCStringEncoding)
end
def exit(sender)
@inputHandle.writeData("quit\n",dataUsingEncoding:NSString.defaultCStringEncoding)
self.killTask
end
def applicationShouldTerminateAfterLastWindowClosed(application)
return true
end
def killTask
if @fdb.isRunning
@fdb.terminate
end
end
def taskDead(notification)
exitCode = notification.object.terminationStatus
if exitCode != 0
puts "Task exited with code " + exitCode.to_s + " probably not a good thing."
end
@center.removeObserver(self)
puts "Task died dude."
end
end