mirror of
https://github.com/chylex/Backup-Essentials.git
synced 2025-06-02 06:34:08 +02:00
109 lines
4.2 KiB
C#
109 lines
4.2 KiB
C#
using BackupEssentials.Utils;
|
|
using Microsoft.Win32;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
namespace BackupEssentials.Backup{
|
|
static class ExplorerIntegration{
|
|
/*
|
|
HKCR\*\shell\<appname>
|
|
- MUIVerb = root command name
|
|
- SubCommands = semicolon separated list of commands
|
|
|
|
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\<command>
|
|
- (Default) = command name
|
|
> command
|
|
- (Default) = exe link
|
|
*/
|
|
|
|
private static readonly ScheduledUpdate RefreshTimer = ScheduledUpdate.Forever(10,() => {
|
|
Refresh(true);
|
|
});
|
|
|
|
public static void InitializeRefreshTimer(){
|
|
RefreshTimer.Start();
|
|
}
|
|
|
|
public static void Load(){ // TODO add into settings or something
|
|
DataStorage.BackupLocationList.Clear();
|
|
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell");
|
|
int cmd = 0;
|
|
|
|
while(true){
|
|
string name = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\BackupEssentials"+cmd,null,null) as string;
|
|
if (name == null)break;
|
|
|
|
string fullpath = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\BackupEssentials"+cmd+@"\command",null,"") as string;
|
|
int end = fullpath.IndexOf(".EXE",StringComparison.OrdinalIgnoreCase)+6; // <...>.EXE "<path>" "%1"
|
|
|
|
string path = fullpath.Substring(end,fullpath.IndexOf('"',end)-end);
|
|
DataStorage.BackupLocationList.Add(new BackupLocation(){ Name = name, Directory = path });
|
|
|
|
++cmd;
|
|
}
|
|
}
|
|
|
|
public static void Refresh(){
|
|
Refresh(false);
|
|
}
|
|
|
|
public static bool Refresh(bool force){
|
|
if (!force){
|
|
RefreshTimer.NeedsUpdate = true;
|
|
return true;
|
|
}
|
|
|
|
IEnumerable<BackupLocation> valid = DataStorage.BackupLocationList.Where(loc => loc.ShouldRegister());
|
|
if (valid.Count() == 0)return true;
|
|
|
|
try{
|
|
List<string> commandNames = new List<string>();
|
|
for(int a = 0; a < DataStorage.BackupLocationList.Count; a++)commandNames.Add("BackupEssentials"+a);
|
|
string commands = String.Join(";",commandNames);
|
|
|
|
foreach(string target in new string[]{ "*", "Directory" }){
|
|
Registry.SetValue(@"HKEY_CLASSES_ROOT\"+target+@"\shell\BackupEssentials","MUIVerb","Backup Essentials");
|
|
Registry.SetValue(@"HKEY_CLASSES_ROOT\"+target+@"\shell\BackupEssentials","SubCommands",commands);
|
|
}
|
|
|
|
string path = Assembly.GetExecutingAssembly().GetName().CodeBase.Substring(8).Replace('/','\\'); // remove file:///
|
|
int cmd = 0;
|
|
|
|
foreach(BackupLocation loc in valid){
|
|
string key = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\BackupEssentials"+cmd;
|
|
Registry.SetValue(key,null,loc.Name);
|
|
Registry.SetValue(key+@"\command",null,path+" -runshell -locid "+cmd+" -src \"%1\"");
|
|
++cmd;
|
|
}
|
|
|
|
return true;
|
|
}catch(Exception e){
|
|
Debug.WriteLine(e.ToString());
|
|
Remove();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static void Remove(){
|
|
try{
|
|
Registry.ClassesRoot.DeleteSubKey(@"*\shell\BackupEssentials",false);
|
|
Registry.ClassesRoot.DeleteSubKey(@"Directory\shell\BackupEssentials",false);
|
|
}catch{}
|
|
|
|
int cmd = 0;
|
|
|
|
while(true){
|
|
try{
|
|
Registry.LocalMachine.DeleteSubKeyTree(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\BackupEssentials"+cmd);
|
|
++cmd;
|
|
}catch{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|