diff --git a/launchers/macosx/I2PLauncher/SwiftMainDelegate.swift b/launchers/macosx/I2PLauncher/SwiftMainDelegate.swift index ed5ef7857c..719e0ed012 100644 --- a/launchers/macosx/I2PLauncher/SwiftMainDelegate.swift +++ b/launchers/macosx/I2PLauncher/SwiftMainDelegate.swift @@ -93,7 +93,8 @@ class Logger { } @objc static func openLink(url: String) { - SBridge.sharedInstance().openUrl(url) + NSLog("Trying to open \(url)") + NSWorkspace.shared().open(NSURL(string: url)! as URL) } @objc func applicationWillTerminate() { diff --git a/launchers/macosx/I2PLauncher/Utils/FolderContentMonitor.swift b/launchers/macosx/I2PLauncher/Utils/FolderContentMonitor.swift new file mode 100644 index 0000000000..168989344a --- /dev/null +++ b/launchers/macosx/I2PLauncher/Utils/FolderContentMonitor.swift @@ -0,0 +1,111 @@ +// +// FolderContentMonitor.swift +// I2PLauncher +// +// Created by Mikal Villa on 28/09/2018. +// Copyright © 2018 The I2P Project. All rights reserved. +// + +import Foundation + +/* + infix operator ~> + + private let queue = DispatchQueue(label: "background") + + func ~> ( + backgroundClosure: @escaping () -> R, + mainClosure: @escaping (_ result: R) -> ()) + { + queue.async { + let result = backgroundClosure() + DispatchQueue.main.async(execute: { + mainClosure(result) + }) + } + } + */ + +public struct Event: CustomStringConvertible { + + public let eventId: FSEventStreamEventId + public let eventPath: String + public let eventFlags: FSEventStreamEventFlags + + public var description: String { + return "\(eventId) - \(eventFlags) - \(eventPath)" + } +} + +public class FolderContentMonitor { + + let callback: (Event) -> Void + + public init(pathsToWatch: [String], sinceWhen: FSEventStreamEventId = FSEventStreamEventId(kFSEventStreamEventIdSinceNow), callback: @escaping (Event) -> Void) { + + self.lastEventId = sinceWhen + self.pathsToWatch = pathsToWatch + self.callback = callback + } + + deinit { + stop() + } + + // MARK: - Private Properties + private let eventCallback: FSEventStreamCallback = { + (stream: ConstFSEventStreamRef, + contextInfo: UnsafeMutableRawPointer?, + numEvents: Int, + eventPaths: UnsafeMutableRawPointer, + eventFlags: UnsafePointer, + eventIds: UnsafePointer) in + + let fileSystemWatcher: FolderContentMonitor = unsafeBitCast(contextInfo, to: FolderContentMonitor.self) + + guard let paths = unsafeBitCast(eventPaths, to: NSArray.self) as? [String] else { return } + + for index in 0.. () = {}) { + let agentStatus = LaunchAgentManager.shared.status(RouterRunner.launchAgent!) + DispatchQueue(label: "background_block").async { + do { + switch agentStatus { + case .running: + // For now we need to use unload to stop it. + try LaunchAgentManager.shared.unload(RouterRunner.launchAgent!, { (proc) in + // Called when stop is actually executed + proc.waitUntilExit() + DispatchQueue.main.async { + RouterManager.shared().eventManager.trigger(eventName: "router_stop", information: "ok") + callback() + } + }) + try LaunchAgentManager.shared.load(RouterRunner.launchAgent!) + break + case .unloaded: + // Seems it sometimes get unloaded on stop, we load it again. + try! LaunchAgentManager.shared.load(RouterRunner.launchAgent!) + return + default: break + } + } catch { + NSLog("Error \(error)") + } } }