/* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * wrote this file. As long as you retain this notice you * can do whatever you want with this stuff. If we meet some day, and you think * this stuff is worth it, you can buy me a beer in return., Gregorio Litenstein. * ---------------------------------------------------------------------------- */ import Foundation import SwiftCLI class SetCommand: OptionCommand { var failOnUnrecognizedOptions = true let name = "setHandler" let signature = "" let shortDescription = "Sets as the default handler for a given / combination." private var kind: String = "" private var contentType: String? = nil private var inApplication: String = "None" private var bundleID: String? = nil private var statusCode: OSStatus = kLSUnknownErr private var roles: Dictionary = ["editor":LSRolesMask.editor,"viewer":LSRolesMask.viewer,"shell":LSRolesMask.shell,"all":LSRolesMask.all] private var role: LSRolesMask = LSRolesMask.all func setupOptions(options: OptionRegistry) { options.addGroup(name:"type", required:true, conflicting:true) options.addGroup(name:"application", required:true, conflicting:true) options.add(keys: ["--UTI"], usage: "Change the default application for ", valueSignature: "subtype", group:"type") { [unowned self] (value) in self.contentType = value self.kind = "UTI" } options.add(keys: ["--URL"], usage: "Change the default application for ", valueSignature: "subtype", group:"type") { [unowned self] (value) in self.contentType = value self.kind = "URL" } options.add(flags: ["--internet", "--browser", "--web"], usage: "Changes the default web browser.", group:"type") { self.contentType = nil self.kind = "http" } options.add(flags: ["--mail", "--email", "--e-mail"], usage: "Changes the default e-mail client.", group:"type") { self.contentType = nil self.kind = "mailto" } options.add(flags: ["--ftp"], usage: "Changes the default FTP client.", group:"type") { self.contentType = nil self.kind = "ftp" } options.add(flags: ["--rss"], usage: "Changes the default RSS client.", group:"type") { self.contentType = nil self.kind = "RSS" } options.add(flags: ["--news"], usage: "Changes the default news client.", group:"type") { self.contentType = nil self.kind = "news" } options.add(keys: ["--app", "--application"], usage: "The to register as default handler. Specifying \"None\" will remove the currently registered handler.", valueSignature: "application", group:"application") { [unowned self] (value) in self.inApplication = value } options.add(keys: ["--role"], usage: "--role , specifies the role with which to register the handler. Default is All.", valueSignature: "role") { [unowned self] (value) in if let temp = self.roles[value.lowercased()] { self.role = temp } else { self.role = LSRolesMask.all } } } func execute(arguments: CommandArguments) throws { statusCode = LSWrappers.getBundleID(self.inApplication, outBundleID: &bundleID) guard (statusCode == 0) else { throw CLIError.error(LSWrappers.LSErrors.init(value: statusCode).print(argument: (app: inApplication, content: self.contentType ?? self.kind))) } switch(kind) { case "UTI","URL": if let contentString = self.contentType { statusCode = ((kind == "URL") ? LSWrappers.Schemes.setDefaultHandler(contentString, bundleID!) : LSWrappers.UTType.setDefaultHandler(contentString, bundleID!, self.role)) } break case "http","mailto","ftp","rss","news": statusCode = LSWrappers.Schemes.setDefaultHandler(kind, bundleID!) break default: statusCode = kLSUnknownErr break } do { try displayAlert(error: statusCode, arg1: (bundleID != nil ? bundleID : inApplication), arg2: self.contentType ?? self.kind) } catch { print(error) } } }