DisplayMagician/HeliosDisplayManagement.ShellExtension/HeliosSteamUrlMenuExtension.cs

89 lines
3.9 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using HeliosDisplayManagement.Shared;
using HeliosDisplayManagement.ShellExtension.Resources;
using SharpShell.Attributes;
using SharpShell.SharpContextMenu;
namespace HeliosDisplayManagement.ShellExtension
{
[ComVisible(true)]
[COMServerAssociation(AssociationType.ClassOfExtension, @".url")]
internal class HeliosSteamUrlMenuExtension : SharpContextMenu
{
protected override bool CanShowMenu()
{
return Shared.Helios.IsInstalled &&
(SelectedItemPaths.Count() == 1) &&
Profile.GetAllProfiles().Any() &&
(ParseSteamAppId() > 0);
}
protected override ContextMenuStrip CreateMenu()
{
var explorerMenu = new ContextMenuStrip();
var extensionMenu = new ToolStripMenuItem(Language.Open_under_Display_Profile,
Properties.Resources.Icon_x16);
foreach (var profile in Profile.GetAllProfiles())
extensionMenu.DropDownItems.Add(CreateProfileMenu(profile));
extensionMenu.DropDownItems.Add(new ToolStripSeparator());
extensionMenu.DropDownItems.Add(new ToolStripMenuItem(Language.Manage_Profiles,
Properties.Resources.Icon_x16,
(sender, args) => { HeliosDisplayManagement.Open(); }));
explorerMenu.Items.Add(extensionMenu);
explorerMenu.Items.Add(new ToolStripSeparator());
return explorerMenu;
}
private ToolStripMenuItem CreateProfileMenu(Profile profile)
{
var appId = ParseSteamAppId();
var profileMenu = new ToolStripMenuItem(profile.Name, new ProfileIcon(profile).ToBitmap(16, 16));
profileMenu.DropDownItems.Add(new ToolStripMenuItem(Language.Run, Properties.Resources.Run_x16,
(sender, args) =>
HeliosDisplayManagement.OpenSteamGame(HeliosStartupAction.SwitchProfile, profile,
appId)));
profileMenu.DropDownItems.Add(new ToolStripSeparator());
profileMenu.DropDownItems.Add(new ToolStripMenuItem(Language.Create_Shortcut, Properties.Resources.Shortcut_x16,
(sender, args) =>
HeliosDisplayManagement.OpenSteamGame(HeliosStartupAction.CreateShortcut, profile,
appId)));
return profileMenu;
}
private uint ParseSteamAppId()
{
try
{
var fileAddress = SelectedItemPaths.FirstOrDefault();
if (!string.IsNullOrWhiteSpace(fileAddress) && File.Exists(fileAddress) && new FileInfo(fileAddress).Length < 1024)
{
var fileContent = File.ReadAllText(fileAddress);
if (!fileContent.Contains(@"[InternetShortcut]"))
return 0;
var steamUrlPattern = @"steam://rungameid/";
var urlIndex = fileContent.IndexOf(steamUrlPattern, StringComparison.InvariantCultureIgnoreCase);
if (urlIndex < 0)
return 0;
var nextLine = fileContent.IndexOf(@"\r", urlIndex + steamUrlPattern.Length,
StringComparison.InvariantCultureIgnoreCase);
if (nextLine < 0)
nextLine = fileContent.Length - 1;
var appIdString = fileContent.Substring(urlIndex + steamUrlPattern.Length,
nextLine - urlIndex - steamUrlPattern.Length);
uint appId;
if (uint.TryParse(appIdString, out appId))
return appId;
}
}
catch
{
// ignored
}
return 0;
}
}
}