/// <summary> /// Adds an AutoPlay handler registration to the current system. /// </summary> /// <param name="target">The application being integrated.</param> /// <param name="autoPlay">The AutoPlay handler information to be applied.</param> /// <param name="machineWide">Register the handler machine-wide instead of just for the current user.</param> /// <param name="handler">A callback object used when the the user is to be informed about the progress of long-running operations such as downloads.</param> /// <param name="accessPoint">Indicates that the handler should become the default handler for all <see cref="Store.Model.Capabilities.AutoPlay.Events"/>.</param> /// <exception cref="OperationCanceledException">The user canceled the task.</exception> /// <exception cref="IOException">A problem occurs while writing to the filesystem or registry.</exception> /// <exception cref="WebException">A problem occured while downloading additional data (such as icons).</exception> /// <exception cref="UnauthorizedAccessException">Write access to the filesystem or registry is not permitted.</exception> /// <exception cref="InvalidDataException">The data in <paramref name="autoPlay"/> is invalid.</exception> public static void Register(FeedTarget target, [NotNull] Store.Model.Capabilities.AutoPlay autoPlay, bool machineWide, [NotNull] ITaskHandler handler, bool accessPoint = false) { #region Sanity checks if (autoPlay == null) { throw new ArgumentNullException("autoPlay"); } if (handler == null) { throw new ArgumentNullException("handler"); } #endregion if (string.IsNullOrEmpty(autoPlay.ID)) { throw new InvalidDataException("Missing ID"); } if (autoPlay.Verb == null) { throw new InvalidDataException("Missing verb"); } if (string.IsNullOrEmpty(autoPlay.Verb.Name)) { throw new InvalidDataException("Missing verb name"); } if (string.IsNullOrEmpty(autoPlay.Provider)) { throw new InvalidDataException("Missing provider"); } var hive = machineWide ? Registry.LocalMachine : Registry.CurrentUser; using (var commandKey = hive.CreateSubKeyChecked(FileType.RegKeyClasses + @"\" + FileType.RegKeyPrefix + ".AutoPlay" + autoPlay.ID + @"\shell\" + autoPlay.Verb.Name + @"\command")) commandKey.SetValue("", FileType.GetLaunchCommandLine(target, autoPlay.Verb, machineWide, handler)); using (var handlerKey = hive.CreateSubKeyChecked(RegKeyHandlers + @"\" + FileType.RegKeyPrefix + autoPlay.ID)) { // Add flag to remember whether created for capability or access point handlerKey.SetValue(accessPoint ? FileType.PurposeFlagAccessPoint : FileType.PurposeFlagCapability, ""); handlerKey.SetValue(RegValueProgID, FileType.RegKeyPrefix + ".AutoPlay" + autoPlay.ID); handlerKey.SetValue(RegValueVerb, autoPlay.Verb.Name); handlerKey.SetValue(RegValueProvider, autoPlay.Provider); handlerKey.SetValue(RegValueDescription, autoPlay.Descriptions.GetBestLanguage(CultureInfo.CurrentUICulture) ?? autoPlay.Verb.Name); var icon = autoPlay.GetIcon(Icon.MimeTypeIco) ?? target.Feed.GetIcon(Icon.MimeTypeIco, autoPlay.Verb.Command); if (icon != null) { handlerKey.SetValue(RegValueIcon, IconProvider.GetIconPath(icon, handler, machineWide) + ",0"); } } foreach (var autoPlayEvent in autoPlay.Events.Except(x => string.IsNullOrEmpty(x.Name))) { using (var eventKey = hive.CreateSubKeyChecked(RegKeyAssocs + @"\" + autoPlayEvent.Name)) eventKey.SetValue(FileType.RegKeyPrefix + autoPlay.ID, ""); if (accessPoint) { using (var chosenEventKey = hive.CreateSubKeyChecked(RegKeyChosenAssocs + @"\" + autoPlayEvent.Name)) chosenEventKey.SetValue("", FileType.RegKeyPrefix + autoPlay.ID); } } }
/// <summary> /// Applies application registration to the current system. /// </summary> /// <param name="target">The application being integrated.</param> /// <param name="appRegistration">The registration information to be applied.</param> /// <param name="verbCapabilities">The capabilities that the application is to be registered with.</param> /// <param name="machineWide">Apply the registration machine-wide instead of just for the current user.</param> /// <param name="handler">A callback object used when the the user is to be informed about the progress of long-running operations such as downloads.</param> /// <exception cref="OperationCanceledException">The user canceled the task.</exception> /// <exception cref="IOException">A problem occurs while writing to the filesystem or registry.</exception> /// <exception cref="WebException">A problem occured while downloading additional data (such as icons).</exception> /// <exception cref="UnauthorizedAccessException">Write access to the filesystem or registry is not permitted.</exception> /// <exception cref="InvalidDataException">The data in <paramref name="appRegistration"/> or <paramref name="verbCapabilities"/> is invalid.</exception> public static void Register(FeedTarget target, [NotNull] Store.Model.Capabilities.AppRegistration appRegistration, IEnumerable <VerbCapability> verbCapabilities, bool machineWide, [NotNull] ITaskHandler handler) { #region Sanity checks if (appRegistration == null) { throw new ArgumentNullException("appRegistration"); } if (verbCapabilities == null) { throw new ArgumentNullException("verbCapabilities"); } if (handler == null) { throw new ArgumentNullException("handler"); } #endregion if (string.IsNullOrEmpty(appRegistration.ID)) { throw new InvalidDataException("Missing ID"); } if (string.IsNullOrEmpty(appRegistration.CapabilityRegPath)) { throw new InvalidDataException("Invalid CapabilityRegPath"); } var hive = machineWide ? Registry.LocalMachine : Registry.CurrentUser; // TODO: Handle appRegistration.X64 using (var capabilitiesKey = hive.CreateSubKeyChecked(/*CapabilityPrefix +*/ appRegistration.CapabilityRegPath)) { capabilitiesKey.SetValue(RegValueAppName, target.Feed.Name ?? ""); capabilitiesKey.SetValue(RegValueAppDescription, target.Feed.Descriptions.GetBestLanguage(CultureInfo.CurrentUICulture) ?? ""); // Set icon if available var icon = target.Feed.GetIcon(Icon.MimeTypeIco); if (icon != null) { capabilitiesKey.SetValue(RegValueAppIcon, IconProvider.GetIconPath(icon, handler, machineWide) + ",0"); } using (var fileAssocsKey = capabilitiesKey.CreateSubKeyChecked(RegSubKeyFileAssocs)) { foreach (var fileType in verbCapabilities.OfType <Store.Model.Capabilities.FileType>().Except(x => string.IsNullOrEmpty(x.ID))) { foreach (var extension in fileType.Extensions.Except(x => string.IsNullOrEmpty(x.Value))) { fileAssocsKey.SetValue(extension.Value, FileType.RegKeyPrefix + fileType.ID); } } } using (var urlAssocsKey = capabilitiesKey.CreateSubKeyChecked(RegSubKeyUrlAssocs)) { foreach (var urlProtocol in verbCapabilities.OfType <Store.Model.Capabilities.UrlProtocol>()) { foreach (var prefix in urlProtocol.KnownPrefixes) { urlAssocsKey.SetValue(prefix.Value, FileType.RegKeyPrefix + urlProtocol.ID); } } } using (var startMenuKey = capabilitiesKey.CreateSubKeyChecked(RegSubKeyStartMenu)) { foreach (var defaultProgram in verbCapabilities.OfType <Store.Model.Capabilities.DefaultProgram>().Except(x => string.IsNullOrEmpty(x.ID) || string.IsNullOrEmpty(x.Service))) { startMenuKey.SetValue(defaultProgram.Service, defaultProgram.ID); } } } using (var regAppsKey = hive.CreateSubKeyChecked(RegKeyMachineRegisteredApplications)) regAppsKey.SetValue(appRegistration.ID, /*CapabilityPrefix +*/ appRegistration.CapabilityRegPath); }