Mailspring/src/launch-services.coffee
2015-10-05 03:49:52 -07:00

129 lines
4.5 KiB
CoffeeScript

exec = require('child_process').exec
fs = require('fs')
bundleIdentifier = 'com.nylas.nylas-mail'
class LaunchServicesUnavailable
available: ->
false
isRegisteredForURLScheme: (scheme, callback) ->
throw new Error "isRegisteredForURLScheme is not available"
resetURLScheme: (scheme, callback) ->
throw new Error "resetURLScheme is not available"
registerForURLScheme: (scheme, callback) ->
throw new Error "registerForURLScheme is not available"
class LaunchServicesLinux
available: ->
true
isRegisteredForURLScheme: (scheme, callback) ->
throw new Error "isRegisteredForURLScheme is async, provide a callback" unless callback
exec "xdg-mime query default x-scheme-handler/#{scheme}", (err, stdout, stderr) ->
return callback(err) if callback and err
callback(stdout.trim() is 'nylas.desktop')
resetURLScheme: (scheme, callback) ->
exec "xdg-mime default thunderbird.desktop x-scheme-handler/#{scheme}", (err, stdout, stderr) ->
return callback(err) if callback and err
callback(null, null)
registerForURLScheme: (scheme, callback) ->
exec "xdg-mime default nylas.desktop x-scheme-handler/#{scheme}", (err, stdout, stderr) ->
return callback(err) if callback and err
callback(null, null)
class LaunchServicesMac
constructor: ->
@secure = false
available: ->
true
getLaunchServicesPlistPath: (callback) ->
secure = "#{process.env.HOME}/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"
insecure = "#{process.env.HOME}/Library/Preferences/com.apple.LaunchServices.plist"
fs.exists secure, (exists) ->
if exists
callback(secure)
else
callback(insecure)
readDefaults: (callback) ->
@getLaunchServicesPlistPath (plistPath) ->
tmpPath = "#{plistPath}.#{Math.random()}"
exec "plutil -convert json \"#{plistPath}\" -o \"#{tmpPath}\"", (err, stdout, stderr) ->
return callback(err) if callback and err
fs.readFile tmpPath, (err, data) ->
return callback(err) if callback and err
try
data = JSON.parse(data)
callback(data['LSHandlers'], data)
fs.unlink(tmpPath)
catch e
callback(e) if callback and err
writeDefaults: (defaults, callback) ->
@getLaunchServicesPlistPath (plistPath) ->
tmpPath = "#{plistPath}.#{Math.random()}"
exec "plutil -convert json \"#{plistPath}\" -o \"#{tmpPath}\"", (err, stdout, stderr) ->
return callback(err) if callback and err
try
data = fs.readFileSync(tmpPath)
data = JSON.parse(data)
data['LSHandlers'] = defaults
data = JSON.stringify(data)
fs.writeFileSync(tmpPath, data)
catch error
return callback(error) if callback and error
exec "plutil -convert binary1 \"#{tmpPath}\" -o \"#{plistPath}\"", ->
fs.unlink(tmpPath)
exec "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user", (err, stdout, stderr) ->
callback(err) if callback
isRegisteredForURLScheme: (scheme, callback) ->
throw new Error "isRegisteredForURLScheme is async, provide a callback" unless callback
@readDefaults (defaults) ->
for def in defaults
if def.LSHandlerURLScheme is scheme
return callback(def.LSHandlerRoleAll is bundleIdentifier)
callback(false)
resetURLScheme: (scheme, callback) ->
@readDefaults (defaults) =>
# Remove anything already registered for the scheme
for ii in [defaults.length-1..0] by -1
if defaults[ii].LSHandlerURLScheme is scheme
defaults.splice(ii, 1)
@writeDefaults(defaults, callback)
registerForURLScheme: (scheme, callback) ->
@readDefaults (defaults) =>
# Remove anything already registered for the scheme
for ii in [defaults.length-1..0] by -1
if defaults[ii].LSHandlerURLScheme is scheme
defaults.splice(ii, 1)
# Add our scheme default
defaults.push
LSHandlerURLScheme: scheme
LSHandlerRoleAll: bundleIdentifier
@writeDefaults(defaults, callback)
module.exports = LaunchServicesUnavailable
if process.platform is 'darwin'
module.exports = LaunchServicesMac
else if process.platform is 'linux'
module.exports = LaunchServicesLinux
module.exports.LaunchServicesMac = LaunchServicesMac
module.exports.LaunchServicesLinux = LaunchServicesLinux
module.exports.LaunchServicesUnavailable = LaunchServicesUnavailable