Skip to content

Commit d48a893

Browse files
authored
Added Install button on toolbar when selecting INF files (#7860)
1 parent 7575ff0 commit d48a893

10 files changed

+91
-3
lines changed

src/Files.Launcher/MessageHandlers/InstallOperationsHandler.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ private async Task ParseInstallOperationAsync(PipeStream connection, Dictionary<
2828
{
2929
switch (message.Get("installop", ""))
3030
{
31+
case "InstallInf":
32+
{
33+
var filePath = (string)message["filepath"];
34+
var fileExtension = (string)message["extension"];
35+
var isInf = new[] { ".inf" }.Contains(fileExtension, StringComparer.OrdinalIgnoreCase);
36+
37+
if (isInf)
38+
{
39+
Win32API.InfDefaultInstall(filePath);
40+
}
41+
break;
42+
}
3143
case "InstallFont":
3244
{
3345
var filePath = (string)message["filepath"];

src/Files.Launcher/Win32API.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,5 +640,29 @@ public static void OpenFolderInExistingShellWindow(string folderPath)
640640
[DllImport(Lib.Shell32, SetLastError = false, CharSet = CharSet.Auto)]
641641
public static extern int SHQueryRecycleBin(string pszRootPath,
642642
ref SHQUERYRBINFO pSHQueryRBInfo);
643+
644+
public static bool InfDefaultInstall(string filePath)
645+
{
646+
try
647+
{
648+
using Process process = new Process();
649+
process.StartInfo.FileName = "InfDefaultInstall.exe";
650+
process.StartInfo.Verb = "runas";
651+
process.StartInfo.UseShellExecute = true;
652+
process.StartInfo.CreateNoWindow = true;
653+
process.StartInfo.Arguments = $"{filePath}";
654+
process.Start();
655+
if (process.WaitForExit(30 * 1000))
656+
{
657+
return process.ExitCode == 0;
658+
}
659+
return false;
660+
}
661+
catch (Win32Exception)
662+
{
663+
// If user cancels UAC
664+
return false;
665+
}
666+
}
643667
}
644-
}
668+
}

src/Files/Helpers/FileExtensionHelpers.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ public static bool IsZipFile(string fileExtensionToCheck)
5757
fileExtensionToCheck.Equals(".msixbundle", StringComparison.OrdinalIgnoreCase);
5858
}
5959

60+
public static bool IsInfFile(string fileExtensionToCheck)
61+
{
62+
if (string.IsNullOrEmpty(fileExtensionToCheck))
63+
{
64+
return false;
65+
}
66+
67+
return fileExtensionToCheck.Equals(".inf", StringComparison.OrdinalIgnoreCase);
68+
}
69+
6070
/// <summary>
6171
/// Check if the file extension is a font file.
6272
/// </summary>
@@ -71,7 +81,7 @@ public static bool IsFontFile(string fileExtensionToCheck)
7181
return false;
7282
}
7383

74-
return fileExtensionToCheck.Equals(".fon", StringComparison.OrdinalIgnoreCase) ||
84+
return fileExtensionToCheck.Equals(".fon", StringComparison.OrdinalIgnoreCase) ||
7585
fileExtensionToCheck.Equals(".otf", StringComparison.OrdinalIgnoreCase) ||
7686
fileExtensionToCheck.Equals(".ttc", StringComparison.OrdinalIgnoreCase) ||
7787
fileExtensionToCheck.Equals(".ttf", StringComparison.OrdinalIgnoreCase);

src/Files/Interacts/BaseLayoutCommandImplementationModel.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,25 @@ public async void DecompressArchiveToChildFolder()
787787
}
788788
}
789789

790+
public async Task InstallInfDriver()
791+
{
792+
var connection = await AppServiceConnectionHelper.Instance;
793+
if (connection != null)
794+
{
795+
foreach (ListedItem selectedItem in SlimContentPage.SelectedItems)
796+
{
797+
var value = new ValueSet
798+
{
799+
{ "Arguments", "InstallOperation" },
800+
{ "installop", "InstallInf" },
801+
{ "filepath", selectedItem.ItemPath },
802+
{ "extension", selectedItem.FileExtension },
803+
};
804+
await connection.SendMessageAsync(value);
805+
}
806+
}
807+
}
808+
790809
public async void RotateImageLeft()
791810
{
792811
await BitmapHelper.Rotate(PathNormalization.NormalizePath(SlimContentPage?.SelectedItems.First().ItemPath), BitmapRotation.Clockwise270Degrees);

src/Files/Interacts/BaseLayoutCommandsViewModel.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ private void InitializeCommands()
7272
DecompressArchiveCommand = new RelayCommand(CommandsModel.DecompressArchive);
7373
DecompressArchiveHereCommand = new RelayCommand(CommandsModel.DecompressArchiveHere);
7474
DecompressArchiveToChildFolderCommand = new RelayCommand(CommandsModel.DecompressArchiveToChildFolder);
75+
InstallInfDriver = new AsyncRelayCommand(CommandsModel.InstallInfDriver);
7576
RotateImageLeftCommand = new RelayCommand(CommandsModel.RotateImageLeft);
7677
RotateImageRightCommand = new RelayCommand(CommandsModel.RotateImageRight);
7778
InstallFontCommand = new RelayCommand(CommandsModel.InstallFont);
@@ -171,6 +172,8 @@ private void InitializeCommands()
171172

172173
public ICommand DecompressArchiveToChildFolderCommand { get; private set; }
173174

175+
public ICommand InstallInfDriver { get; set; }
176+
174177
public ICommand RotateImageLeftCommand { get; private set; }
175178

176179
public ICommand RotateImageRightCommand { get; private set; }

src/Files/Interacts/IBaseLayoutCommandImplementationModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ public interface IBaseLayoutCommandImplementationModel : IDisposable
9898

9999
void DecompressArchiveToChildFolder();
100100

101+
Task InstallInfDriver();
102+
101103
void RotateImageLeft();
102104

103105
void RotateImageRight();

src/Files/UserControls/InnerNavigationToolbar.xaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,18 @@
288288
<FontIcon Glyph="&#xE91B;" />
289289
</AppBarButton.Icon>
290290
</AppBarButton>
291+
<AppBarButton
292+
x:Name="InstallInfButton"
293+
x:Load="{x:Bind ViewModel.IsInfFile, Mode=OneWay, FallbackValue=False}"
294+
AutomationProperties.Name="InstallInf"
295+
Command="{x:Bind ViewModel.InstallInfCommand, Mode=OneWay}"
296+
Label="{helpers:ResourceString Name=Install}"
297+
LabelPosition="Default"
298+
ToolTipService.ToolTip="{helpers:ResourceString Name=Install}">
299+
<AppBarButton.Icon>
300+
<FontIcon Glyph="&#xE9F5;" />
301+
</AppBarButton.Icon>
302+
</AppBarButton>
291303
<AppBarButton
292304
x:Name="RotateImageLeftButton"
293305
x:Load="{x:Bind ViewModel.IsImage, Mode=OneWay, FallbackValue=False}"

src/Files/ViewModels/NavToolbarViewModel.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,8 @@ public void SearchRegion_LostFocus(object sender, RoutedEventArgs e)
808808

809809
public ICommand SetAsBackgroundCommand { get; set; }
810810

811+
public ICommand InstallInfCommand { get; set; }
812+
811813
public ICommand RotateImageLeftCommand { get; set; }
812814

813815
public ICommand RotateImageRightCommand { get; set; }
@@ -1132,6 +1134,7 @@ public List<ListedItem> SelectedItems
11321134
OnPropertyChanged(nameof(CanViewProperties));
11331135
OnPropertyChanged(nameof(CanExtract));
11341136
OnPropertyChanged(nameof(ExtractToText));
1137+
OnPropertyChanged(nameof(IsInfFile));
11351138
OnPropertyChanged(nameof(IsPowerShellScript));
11361139
OnPropertyChanged(nameof(IsImage));
11371140
OnPropertyChanged(nameof(IsFont));
@@ -1140,7 +1143,7 @@ public List<ListedItem> SelectedItems
11401143
}
11411144
}
11421145

1143-
public bool HasAdditionalAction => InstanceViewModel.IsPageTypeRecycleBin || IsPowerShellScript || CanExtract || IsImage || IsFont;
1146+
public bool HasAdditionalAction => InstanceViewModel.IsPageTypeRecycleBin || IsPowerShellScript || CanExtract || IsImage || IsFont || IsInfFile;
11441147

11451148
public bool CanCopy => SelectedItems is not null && SelectedItems.Any();
11461149
public bool CanShare => SelectedItems is not null && SelectedItems.Any() && DataTransferManager.IsSupported() && !SelectedItems.Any(x => (x.IsShortcutItem && !x.IsLinkItem) || x.IsHiddenItem || (x.PrimaryItemAttribute == StorageItemTypes.Folder && !x.IsZipItem));
@@ -1151,6 +1154,7 @@ public List<ListedItem> SelectedItems
11511154
public string ExtractToText => SelectedItems is not null && SelectedItems.Count == 1 ? string.Format("ExtractToChildFolder".GetLocalized() + "\\", Path.GetFileNameWithoutExtension(selectedItems.First().ItemName)) : "ExtractToChildFolder".GetLocalized();
11521155
public bool IsPowerShellScript => SelectedItems is not null && SelectedItems.Count == 1 && FileExtensionHelpers.IsPowerShellFile(SelectedItems.First().FileExtension);
11531156
public bool IsImage => SelectedItems is not null && SelectedItems.Count == 1 && FileExtensionHelpers.IsImageFile(SelectedItems.First().FileExtension);
1157+
public bool IsInfFile => SelectedItems is not null && SelectedItems.Count == 1 && FileExtensionHelpers.IsInfFile(SelectedItems.First().FileExtension);
11541158
public bool IsFont => SelectedItems is not null && SelectedItems.Any() && SelectedItems.All(x => FileExtensionHelpers.IsFontFile(x.FileExtension));
11551159

11561160
public void Dispose()

src/Files/Views/ColumnShellPage.xaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ private void InitToolbarCommands()
225225
NavToolbarViewModel.ExtractCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.DecompressArchiveCommand.Execute(null));
226226
NavToolbarViewModel.ExtractHereCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.DecompressArchiveHereCommand.Execute(null));
227227
NavToolbarViewModel.ExtractToCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.DecompressArchiveToChildFolderCommand.Execute(null));
228+
NavToolbarViewModel.InstallInfCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.InstallInfDriver.Execute(null));
228229
NavToolbarViewModel.RotateImageLeftCommand = new RelayCommand(async () => SlimContentPage?.CommandsViewModel.RotateImageLeftCommand.Execute(null));
229230
NavToolbarViewModel.RotateImageRightCommand = new RelayCommand(async () => SlimContentPage?.CommandsViewModel.RotateImageRightCommand.Execute(null));
230231
NavToolbarViewModel.InstallFontCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.InstallFontCommand.Execute(null));

src/Files/Views/ModernShellPage.xaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ private void InitToolbarCommands()
209209
NavToolbarViewModel.ExtractCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.DecompressArchiveCommand.Execute(null));
210210
NavToolbarViewModel.ExtractHereCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.DecompressArchiveHereCommand.Execute(null));
211211
NavToolbarViewModel.ExtractToCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.DecompressArchiveToChildFolderCommand.Execute(null));
212+
NavToolbarViewModel.InstallInfCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.InstallInfDriver.Execute(null));
212213
NavToolbarViewModel.RotateImageLeftCommand = new RelayCommand(async () => SlimContentPage?.CommandsViewModel.RotateImageLeftCommand.Execute(null));
213214
NavToolbarViewModel.RotateImageRightCommand = new RelayCommand(async () => SlimContentPage?.CommandsViewModel.RotateImageRightCommand.Execute(null));
214215
NavToolbarViewModel.InstallFontCommand = new RelayCommand(() => SlimContentPage?.CommandsViewModel.InstallFontCommand.Execute(null));

0 commit comments

Comments
 (0)