diff --git a/ZuneModCore/Mods/FeaturesOverrideMod.cs b/ZuneModCore/Mods/FeaturesOverrideMod.cs index 4e60fe1..0fbdfe5 100644 --- a/ZuneModCore/Mods/FeaturesOverrideMod.cs +++ b/ZuneModCore/Mods/FeaturesOverrideMod.cs @@ -57,20 +57,42 @@ namespace ZuneModCore.Mods public override Task Init() { foreach (AbstractUIElement uiElem in OptionsUI.Items) + { if (uiElem is AbstractBooleanUIElement boolElem) - boolElem.ChangeState(GetFeatureOverride(boolElem.Id)); + { + bool? featureOverride = GetFeatureOverride(boolElem.Id); + boolElem.ChangeState(featureOverride ?? false); + } + } return Task.CompletedTask; } - public override Task Apply() + public override async Task Apply() { // TODO: Use user choices from AbstractUI foreach (AbstractUIElement uiElem in OptionsUI.Items) + { if (uiElem is AbstractBooleanUIElement boolElem)// && boolElem.State) - SetFeatureOverride(boolElem.Id, true); + { + bool isSuccess = SetFeatureOverride(boolElem.Id, true); + if (!isSuccess) + { + string? resetStatus = await Reset(); + if (resetStatus != null) + { + // The reset failed as well, return both errors + return "Failed to set registry keys. Unable to clean up partial overrides:\r\n" + resetStatus; + } + else + { + return "Failed to set registry keys. Automatically cleaned up partial changes."; + } + } + } + } - return Task.FromResult(null); + return null; } public override Task Reset() @@ -82,10 +104,10 @@ namespace ZuneModCore.Mods return Task.FromResult(null); } - public static void SetFeatureOverride(string feature, bool value) => + public static bool SetFeatureOverride(string feature, bool value) => RegEdit.CurrentUserSetBoolValue(ZUNE_FEATURESOVERRIDE_REGKEY, feature, value); - public static bool GetFeatureOverride(string feature) => + public static bool? GetFeatureOverride(string feature) => RegEdit.CurrentUserGetBoolValue(ZUNE_FEATURESOVERRIDE_REGKEY, feature); public static void ResetFeatureOverride(string feature) => diff --git a/ZuneModCore/Mods/WebservicesMod.cs b/ZuneModCore/Mods/WebservicesMod.cs index e44c43b..c0cbf93 100644 --- a/ZuneModCore/Mods/WebservicesMod.cs +++ b/ZuneModCore/Mods/WebservicesMod.cs @@ -66,15 +66,20 @@ namespace ZuneModCore.Mods // Enable all feature overrides affected by new servers - SetFeatureOverride("Apps", true); - SetFeatureOverride("Channels", true); - SetFeatureOverride("Games", true); - SetFeatureOverride("Marketplace", true); - SetFeatureOverride("Music", true); - SetFeatureOverride("MusicVideos", true); - SetFeatureOverride("Podcasts", true); - SetFeatureOverride("Social", true); - SetFeatureOverride("Videos", true); + bool setOverrideSuccess = true; + setOverrideSuccess &= SetFeatureOverride("Apps", true); + setOverrideSuccess &= SetFeatureOverride("Channels", true); + setOverrideSuccess &= SetFeatureOverride("Games", true); + setOverrideSuccess &= SetFeatureOverride("Marketplace", true); + setOverrideSuccess &= SetFeatureOverride("Music", true); + setOverrideSuccess &= SetFeatureOverride("MusicVideos", true); + setOverrideSuccess &= SetFeatureOverride("Podcasts", true); + setOverrideSuccess &= SetFeatureOverride("Social", true); + setOverrideSuccess &= SetFeatureOverride("Videos", true); + if (setOverrideSuccess != true) + { + return Task.FromResult("Unable to set feature overrides. The mod was successful, but you may not be able to see it in the Zune Software."); + } return Task.FromResult(null); } @@ -97,15 +102,20 @@ namespace ZuneModCore.Mods File.Copy(Path.Combine(StorageDirectory, "ZuneService.original.dll"), zsDllPath, true); // Disable all feature overrides affected by new servers - SetFeatureOverride("Apps", false); - SetFeatureOverride("Channels", false); - SetFeatureOverride("Games", false); - SetFeatureOverride("Marketplace", false); - SetFeatureOverride("Music", false); - SetFeatureOverride("MusicVideos", false); - SetFeatureOverride("Podcasts", false); - SetFeatureOverride("Social", false); - SetFeatureOverride("Videos", false); + bool setOverrideSuccess = true; + setOverrideSuccess &= SetFeatureOverride("Apps", false); + setOverrideSuccess &= SetFeatureOverride("Channels", false); + setOverrideSuccess &= SetFeatureOverride("Games", false); + setOverrideSuccess &= SetFeatureOverride("Marketplace", false); + setOverrideSuccess &= SetFeatureOverride("Music", false); + setOverrideSuccess &= SetFeatureOverride("MusicVideos", false); + setOverrideSuccess &= SetFeatureOverride("Podcasts", false); + setOverrideSuccess &= SetFeatureOverride("Social", false); + setOverrideSuccess &= SetFeatureOverride("Videos", false); + if (setOverrideSuccess != true) + { + return Task.FromResult("Unable to reset feature overrides. The mod was successfully removed, but you may still be able to see it in the Zune Software."); + } return Task.FromResult(null); } diff --git a/ZuneModCore/RegEdit.cs b/ZuneModCore/RegEdit.cs index 11b9677..8337124 100644 --- a/ZuneModCore/RegEdit.cs +++ b/ZuneModCore/RegEdit.cs @@ -9,7 +9,7 @@ namespace ZuneModCore { public const string ZUNE_REG_PATH = @"SOFTWARE\Microsoft\Zune\"; - public static void CurrentUserSetBoolValue(string key, string name, bool value) + public static bool CurrentUserSetBoolValue(string key, string name, bool value) { RegistryKey? regKey = Registry.CurrentUser.OpenSubKey(key, true); if (regKey == null) @@ -18,16 +18,24 @@ namespace ZuneModCore regKey.SetValue(name, value, RegistryValueKind.DWord); regKey.Close(); regKey.Dispose(); + + // Read the key to make sure it was set properly + if (CurrentUserGetBoolValue(key, name) == null) + return false; + return true; } - public static bool CurrentUserGetBoolValue(string key, string name) + public static bool? CurrentUserGetBoolValue(string key, string name) { using RegistryKey? regKey = Registry.CurrentUser.OpenSubKey(key, true); if (regKey == null) return false; + // Return null if a boolean value couldn't be read from the key int? value = regKey.GetValue(name, false) as int?; - return value.HasValue && value != 0; + if (!value.HasValue) + return null; + return value != 0; } public static void CurrentUserDeleteKey(string key)