File: Configuration\RegistryExceptionHelper.cs
Project: ndp\cdf\src\WCF\Tools\WsatConfig\WsatConfig.csproj (WsatConfig)
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------
 
namespace Microsoft.Tools.ServiceModel.WsatConfig
{
    using Microsoft.Win32;
    using System;
 
    class RegistryExceptionHelper
    {
        string registryKey;
 
        public RegistryExceptionHelper(string registryKey)
        {
            this.registryKey = registryKey;
            EnsureEndsWithSlash(ref this.registryKey);
        }
 
        public RegistryExceptionHelper(string machineName, RegistryHive registryHive, string registryKeyRelativeToHive)
            : this(RegistryExceptionHelper.GetRegistryKeyBase(machineName, registryHive) + registryKeyRelativeToHive)
        {
        }
 
        public static void EnsureEndsWithSlash(ref string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                if (!str.EndsWith("\\", StringComparison.OrdinalIgnoreCase))
                {
                    str += '\\';
                }
            }
        }
 
        static string GetRegistryKeyBase(string machineName, RegistryHive registryHive)
        {
            string registryBase = Utilities.IsLocalMachineName(machineName) ? string.Empty : SR.GetString(SR.RemoteRegistryFormat, machineName);
            switch (registryHive)
            {
                case RegistryHive.ClassesRoot:
                    registryBase += Registry.ClassesRoot.Name;
                    break;
                case RegistryHive.CurrentUser:
                    registryBase += Registry.CurrentUser.Name;
                    break;
                case RegistryHive.LocalMachine:
                    registryBase += Registry.LocalMachine.Name;
                    break;
                default:
                    // We do not support other values here
                    System.Diagnostics.Debug.Assert(false, "registryHive is not supported");
                    break;
            }
            RegistryExceptionHelper.EnsureEndsWithSlash(ref registryBase);
            return registryBase;
        }
 
        public WsatAdminException CreateRegistryAccessException(int errorCode)
        {
            return CreateRegistryAccessException(unchecked((uint)errorCode));
        }
 
        public WsatAdminException CreateRegistryAccessException(uint errorCode)
        {
            return new WsatAdminException(WsatAdminErrorCode.REGISTRY_ACCESS, SR.GetString(SR.ErrorRegistryAccess, registryKey, errorCode));
        }
 
        public WsatAdminException CreateRegistryAccessException(Exception innerException)
        {
            return DoCreateRegistryAccessException(registryKey, innerException);
        }
 
        public WsatAdminException CreateRegistryAccessException(string subRegistryKey, Exception innerException)
        {
            return DoCreateRegistryAccessException(registryKey + subRegistryKey, innerException);
        }
 
        static WsatAdminException DoCreateRegistryAccessException(string regKey, Exception innerException)
        {
            if (innerException == null)
            {
                return new WsatAdminException(WsatAdminErrorCode.REGISTRY_ACCESS, SR.GetString(SR.ErrorRegistryAccessNoErrorCode, regKey));
            }
            return new WsatAdminException(WsatAdminErrorCode.REGISTRY_ACCESS, SR.GetString(SR.ErrorRegistryAccessNoErrorCode, regKey), innerException);
        }
 
        public WsatAdminException CreateRegistryWriteException(Exception innerException)
        {
            return DoCreateRegistryWriteException(registryKey, innerException);
        }
 
        public WsatAdminException CreateRegistryWriteException(string subRegistryKey, Exception innerException)
        {
            return DoCreateRegistryWriteException(registryKey + subRegistryKey, innerException);
        }
 
        static WsatAdminException DoCreateRegistryWriteException(string regKey, Exception innerException)
        {
            if (innerException == null)
            {
                return new WsatAdminException(WsatAdminErrorCode.REGISTRY_WRITE, SR.GetString(SR.ErrorRegistryWrite, regKey));
            }
            return new WsatAdminException(WsatAdminErrorCode.REGISTRY_WRITE, SR.GetString(SR.ErrorRegistryWrite, regKey), innerException);
        }
    }
}