Files
i2p.i2p/launchers/macosx/I2PLauncher/userinterface/LogViewController.swift

63 lines
1.9 KiB
Swift

//
// LogViewController.swift
// I2PLauncher
//
// Created by Mikal Villa on 18/09/2018.
// Copyright © 2018 The I2P Project. All rights reserved.
//
import Foundation
import AppKit
class LogViewerViewController : NSTabViewItem {
@IBOutlet var scrollView: NSScrollView?
@IBOutlet var textFieldView: NSTextView?
private var outputPipe : Pipe?
override init(identifier: Any?) {
super.init(identifier: identifier)
self.captureStandardOutputAndRouteToTextView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.captureStandardOutputAndRouteToTextView()
}
func captureStandardOutputAndRouteToTextView() {
outputPipe = RouterManager.shared().getRouterTask()?.processPipe
outputPipe?.fileHandleForReading.waitForDataInBackgroundAndNotify()
NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable, object: outputPipe?.fileHandleForReading , queue: nil) {
notification in
let output = self.outputPipe?.fileHandleForReading.availableData
let outputString = String(data: output!, encoding: String.Encoding.utf8) ?? ""
let workTask = DispatchWorkItem {
let previousOutput = self.textFieldView?.string ?? ""
let nextOutput = previousOutput + "\n" + outputString
self.textFieldView?.string = nextOutput
let range = NSRange(location:nextOutput.count,length:0)
self.textFieldView?.scrollRangeToVisible(range)
}
DispatchQueue.main.async(execute: workTask)
// When router stop, stop the stream as well. If not it will go wild and create high cpu load
RouterManager.shared().eventManager.listenTo(eventName: "router_stop", action: {
NSLog("Time to cancel stream!")
workTask.cancel()
})
self.outputPipe?.fileHandleForReading.waitForDataInBackgroundAndNotify()
}
}
}