Skip to content

Commit

Permalink
main.rs: Make native messenger create necessary registry keys
Browse files Browse the repository at this point in the history
  • Loading branch information
glacambre committed May 23, 2019
1 parent 2b9f72a commit fa1c6f4
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 8 deletions.
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ directories = "*"
serde = "*"
serde_derive = "*"
serde_json = "*"

[target.'cfg(windows)'.dependencies]
winreg = "0.6.0"
55 changes: 47 additions & 8 deletions native_src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ extern crate serde_json;
#[macro_use]
extern crate serde_derive;

#[cfg(target_os = "windows")]
extern crate winreg;
#[cfg(target_os = "windows")]
use winreg::RegKey;
#[cfg(target_os = "windows")]
use winreg::enums::*;

use std::env;
use std::fs;
use std::io::{self, Read, Write};
Expand Down Expand Up @@ -107,7 +114,15 @@ fn install_native_messenger() -> std::result::Result<(), ()> {
if !data_dir_path.exists() && fs::create_dir_all(data_dir_path).is_err() {
eprintln!("Error: failed to create {}", data_dir_str);
}
let binary_path = format!("{}{}{}", data_dir_str, path::MAIN_SEPARATOR, "firenvim");

#[cfg(target_os = "linux")]
let binary_name = "firenvim";
#[cfg(target_os = "macos")]
let binary_name = "firenvim";
#[cfg(target_os = "windows")]
let binary_name = "firenvim.exe";

let mut binary_path = format!("{}{}{}", data_dir_str, path::MAIN_SEPARATOR, binary_name);
let current_binary = env::args().nth(0).unwrap();
if current_binary != binary_path
&& fs::copy(current_binary.clone(), binary_path.clone()).is_err()
Expand All @@ -116,18 +131,27 @@ fn install_native_messenger() -> std::result::Result<(), ()> {
return Err(());
}

let manifest_path;

#[cfg(target_os = "macos")]
let manifest_path = format!(
"{}{}",
home_dir_str, "/Library/Apllication Support/Mozilla/NativeMessagingHosts/firenvim.json"
);
{
manifest_path = format!(
"{}{}",
home_dir_str, "/Library/Apllication Support/Mozilla/NativeMessagingHosts/firenvim.json"
);
}
#[cfg(target_os = "linux")]
let manifest_path = format!(
{
manifest_path = format!(
"{}{}",
home_dir_str, "/.mozilla/native-messaging-hosts/firenvim.json"
);
);
}
#[cfg(target_os = "windows")]
let manifest_path = format!("{}{}", data_dir_str, "\\firenvim.json");
{
manifest_path = format!("{}{}", data_dir_str, "\\firenvim.json");
binary_path = binary_path.replace("\\", "\\\\");
}

if fs::write(
manifest_path.clone(),
Expand All @@ -141,6 +165,21 @@ fn install_native_messenger() -> std::result::Result<(), ()> {
eprintln!("Failed to write native manifest to {}.", manifest_path);
return Err(());
}

#[cfg(target_os = "windows")]
{
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_manifests#Windows
println!("Writing firenvim registry key.");
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let path = path::Path::new("SOFTWARE")
.join("Mozilla")
.join("NativeMessagingHosts")
.join("firenvim");
let (key, disp) = hkcu.create_subkey(&path).unwrap();

key.set_value("", &manifest_path).unwrap();
println!("Registry key successfully written.");
}
} else {
eprintln!("Error: failed to detect install directories.");
return Err(());
Expand Down

0 comments on commit fa1c6f4

Please sign in to comment.