using System.Collections.Generic; using System.ComponentModel; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.Http; using mRemoteNG.Connection.Protocol.ICA; using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Connection.Protocol.VNC; using mRemoteNG.Tools; using mRemoteNG.Tools.Attributes; namespace mRemoteNG.Connection { public abstract class AbstractConnectionRecord : INotifyPropertyChanged { #region Fields private string _name; private string _description; private string _icon; private string _panel; private string _hostname; private string _username = ""; private string _password = ""; private string _domain = ""; private string _vmId = ""; private bool _useEnhancedMode; private string _sshTunnelConnectionName = ""; private ProtocolType _protocol; private RdpVersion _rdpProtocolVersion; private string _extApp; private int _port; private string _sshOptions = ""; private string _puttySession; private IcaProtocol.EncryptionStrength _icaEncryption; private bool _useConsoleSession; private AuthenticationLevel _rdpAuthenticationLevel; private int _rdpMinutesToIdleTimeout; private bool _rdpAlertIdleTimeout; private string _loadBalanceInfo; private HTTPBase.RenderingEngine _renderingEngine; private bool _useCredSsp; private bool _useVmId; private RDGatewayUsageMethod _rdGatewayUsageMethod; private string _rdGatewayHostname; private RDGatewayUseConnectionCredentials _rdGatewayUseConnectionCredentials; private string _rdGatewayUsername; private string _rdGatewayPassword; private string _rdGatewayDomain; private RDPResolutions _resolution; private bool _automaticResize; private RDPColors _colors; private bool _cacheBitmaps; private bool _displayWallpaper; private bool _displayThemes; private bool _enableFontSmoothing; private bool _enableDesktopComposition; private bool _disableFullWindowDrag; private bool _disableMenuAnimations; private bool _disableCursorShadow; private bool _disableCursorBlinking; private bool _redirectKeys; private bool _redirectDiskDrives; private bool _redirectPrinters; private bool _redirectClipboard; private bool _redirectPorts; private bool _redirectSmartCards; private RDPSounds _redirectSound; private RDPSoundQuality _soundQuality; private bool _redirectAudioCapture; private string _preExtApp; private string _postExtApp; private string _macAddress; private string _userField; private bool _favorite; private ProtocolVNC.Compression _vncCompression; private ProtocolVNC.Encoding _vncEncoding; private ProtocolVNC.AuthMode _vncAuthMode; private ProtocolVNC.ProxyType _vncProxyType; private string _vncProxyIp; private int _vncProxyPort; private string _vncProxyUsername; private string _vncProxyPassword; private ProtocolVNC.Colors _vncColors; private ProtocolVNC.SmartSizeMode _vncSmartSizeMode; private bool _vncViewOnly; #endregion #region Properties #region Display [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryDisplay)), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameName)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionName))] public virtual string Name { get => _name; set => SetField(ref _name, value, "Name"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryDisplay)), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameDescription)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDescription))] public virtual string Description { get => GetPropertyValue("Description", _description); set => SetField(ref _description, value, "Description"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryDisplay)), TypeConverter(typeof(ConnectionIcon)), LocalizedAttributes.LocalizedDisplayName(nameof(Language.Icon)), LocalizedAttributes.LocalizedDescription(nameof(Language.Icon))] public virtual string Icon { get => GetPropertyValue("Icon", _icon); set => SetField(ref _icon, value, "Icon"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryDisplay)), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNamePanel)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionPanel))] public virtual string Panel { get => GetPropertyValue("Panel", _panel); set => SetField(ref _panel, value, "Panel"); } #endregion #region Connection [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.HostnameIp)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionAddress)), UsedInAllProtocolsExcept()] public virtual string Hostname { get => _hostname.Trim(); set => SetField(ref _hostname, value?.Trim(), "Hostname"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.Port)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionPort)), UsedInAllProtocolsExcept(ProtocolType.ICA)] public virtual int Port { get => GetPropertyValue("Port", _port); set => SetField(ref _port, value, "Port"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.Username)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUsername)), UsedInAllProtocolsExcept(ProtocolType.VNC, ProtocolType.Telnet, ProtocolType.Rlogin, ProtocolType.RAW)] public virtual string Username { get => GetPropertyValue("Username", _username); set => SetField(ref _username, Settings.Default.DoNotTrimUsername ? value : value?.Trim(), "Username"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.Password)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionPassword)), PasswordPropertyText(true), UsedInAllProtocolsExcept(ProtocolType.Telnet, ProtocolType.Rlogin, ProtocolType.RAW)] public virtual string Password { get => GetPropertyValue("Password", _password); set => SetField(ref _password, value, "Password"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.Domain)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDomain)), UsedInProtocol(ProtocolType.RDP, ProtocolType.ICA, ProtocolType.IntApp, ProtocolType.PowerShell)] public string Domain { get => GetPropertyValue("Domain", _domain).Trim(); set => SetField(ref _domain, value?.Trim(), "Domain"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameVmId)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVmId)), UsedInProtocol(ProtocolType.RDP)] public string VmId { get => GetPropertyValue("VmId", _vmId).Trim(); set => SetField(ref _vmId, value?.Trim(), "VmId"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameSSHTunnelConnection)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionSSHTunnelConnection)), TypeConverter(typeof(SshTunnelTypeConverter)), UsedInAllProtocolsExcept()] public string SSHTunnelConnectionName { get => GetPropertyValue("SSHTunnelConnectionName", _sshTunnelConnectionName).Trim(); set => SetField(ref _sshTunnelConnectionName, value?.Trim(), "SSHTunnelConnectionName"); } #endregion #region Protocol [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.Protocol)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionProtocol)), TypeConverter(typeof(MiscTools.EnumTypeConverter))] public virtual ProtocolType Protocol { get => GetPropertyValue("Protocol", _protocol); set => SetField(ref _protocol, value, "Protocol"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRdpVersion)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRdpVersion)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public virtual RdpVersion RdpVersion { get => GetPropertyValue("RdpVersion", _rdpProtocolVersion); set => SetField(ref _rdpProtocolVersion, value, nameof(RdpVersion)); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameExternalTool)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionExternalTool)), TypeConverter(typeof(ExternalToolsTypeConverter)), UsedInProtocol(ProtocolType.IntApp)] public string ExtApp { get => GetPropertyValue("ExtApp", _extApp); set => SetField(ref _extApp, value, "ExtApp"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNamePuttySession)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionPuttySession)), TypeConverter(typeof(Config.Putty.PuttySessionsManager.SessionList)), UsedInProtocol(ProtocolType.SSH1, ProtocolType.SSH2, ProtocolType.Telnet, ProtocolType.RAW, ProtocolType.Rlogin)] public virtual string PuttySession { get => GetPropertyValue("PuttySession", _puttySession); set => SetField(ref _puttySession, value, "PuttySession"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameSSHOptions)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionSSHOptions)), UsedInProtocol(ProtocolType.SSH1, ProtocolType.SSH2)] public virtual string SSHOptions { get => GetPropertyValue("SSHOptions", _sshOptions); set => SetField(ref _sshOptions, value, "SSHOptions"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameEncryptionStrength)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionEncryptionStrength)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.ICA)] public IcaProtocol.EncryptionStrength ICAEncryptionStrength { get => GetPropertyValue("ICAEncryptionStrength", _icaEncryption); set => SetField(ref _icaEncryption, value, "ICAEncryptionStrength"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameUseConsoleSession)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUseConsoleSession)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool UseConsoleSession { get => GetPropertyValue("UseConsoleSession", _useConsoleSession); set => SetField(ref _useConsoleSession, value, "UseConsoleSession"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameAuthenticationLevel)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionAuthenticationLevel)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public AuthenticationLevel RDPAuthenticationLevel { get => GetPropertyValue("RDPAuthenticationLevel", _rdpAuthenticationLevel); set => SetField(ref _rdpAuthenticationLevel, value, "RDPAuthenticationLevel"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDPMinutesToIdleTimeout)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDPMinutesToIdleTimeout)), UsedInProtocol(ProtocolType.RDP)] public virtual int RDPMinutesToIdleTimeout { get => GetPropertyValue("RDPMinutesToIdleTimeout", _rdpMinutesToIdleTimeout); set { if (value < 0) value = 0; else if (value > 240) value = 240; SetField(ref _rdpMinutesToIdleTimeout, value, "RDPMinutesToIdleTimeout"); } } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDPAlertIdleTimeout)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDPAlertIdleTimeout)), UsedInProtocol(ProtocolType.RDP)] public bool RDPAlertIdleTimeout { get => GetPropertyValue("RDPAlertIdleTimeout", _rdpAlertIdleTimeout); set => SetField(ref _rdpAlertIdleTimeout, value, "RDPAlertIdleTimeout"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameLoadBalanceInfo)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionLoadBalanceInfo)), UsedInProtocol(ProtocolType.RDP)] public string LoadBalanceInfo { get => GetPropertyValue("LoadBalanceInfo", _loadBalanceInfo).Trim(); set => SetField(ref _loadBalanceInfo, value?.Trim(), "LoadBalanceInfo"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRenderingEngine)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRenderingEngine)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.HTTP, ProtocolType.HTTPS)] public HTTPBase.RenderingEngine RenderingEngine { get => GetPropertyValue("RenderingEngine", _renderingEngine); set => SetField(ref _renderingEngine, value, "RenderingEngine"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameUseCredSsp)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUseCredSsp)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool UseCredSsp { get => GetPropertyValue("UseCredSsp", _useCredSsp); set => SetField(ref _useCredSsp, value, "UseCredSsp"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameUseVmId)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUseVmId)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool UseVmId { get => GetPropertyValue("UseVmId", _useVmId); set => SetField(ref _useVmId, value, "UseVmId"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameUseEnhancedMode)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUseEnhancedMode)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool UseEnhancedMode { get => GetPropertyValue("UseEnhancedMode", _useEnhancedMode); set => SetField(ref _useEnhancedMode, value, "UseEnhancedMode"); } #endregion #region RD Gateway [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryGateway), 4), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDGatewayUsageMethod)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDGatewayUsageMethod)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public RDGatewayUsageMethod RDGatewayUsageMethod { get => GetPropertyValue("RDGatewayUsageMethod", _rdGatewayUsageMethod); set => SetField(ref _rdGatewayUsageMethod, value, "RDGatewayUsageMethod"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryGateway), 4), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDGatewayHostname)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDGatewayHostname)), UsedInProtocol(ProtocolType.RDP)] public string RDGatewayHostname { get => GetPropertyValue("RDGatewayHostname", _rdGatewayHostname).Trim(); set => SetField(ref _rdGatewayHostname, value?.Trim(), "RDGatewayHostname"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryGateway), 4), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDGatewayUseConnectionCredentials)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDGatewayUseConnectionCredentials)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public RDGatewayUseConnectionCredentials RDGatewayUseConnectionCredentials { get => GetPropertyValue("RDGatewayUseConnectionCredentials", _rdGatewayUseConnectionCredentials); set => SetField(ref _rdGatewayUseConnectionCredentials, value, "RDGatewayUseConnectionCredentials"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryGateway), 4), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDGatewayUsername)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDGatewayUsername)), UsedInProtocol(ProtocolType.RDP)] public string RDGatewayUsername { get => GetPropertyValue("RDGatewayUsername", _rdGatewayUsername).Trim(); set => SetField(ref _rdGatewayUsername, value?.Trim(), "RDGatewayUsername"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryGateway), 4), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDGatewayPassword)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyNameRDGatewayPassword)), PasswordPropertyText(true), UsedInProtocol(ProtocolType.RDP)] public string RDGatewayPassword { get => GetPropertyValue("RDGatewayPassword", _rdGatewayPassword); set => SetField(ref _rdGatewayPassword, value, "RDGatewayPassword"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryGateway), 4), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRDGatewayDomain)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDGatewayDomain)), UsedInProtocol(ProtocolType.RDP)] public string RDGatewayDomain { get => GetPropertyValue("RDGatewayDomain", _rdGatewayDomain).Trim(); set => SetField(ref _rdGatewayDomain, value?.Trim(), "RDGatewayDomain"); } #endregion #region Appearance [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameResolution)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionResolution)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP, ProtocolType.ICA)] public RDPResolutions Resolution { get => GetPropertyValue("Resolution", _resolution); set => SetField(ref _resolution, value, "Resolution"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameAutomaticResize)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionAutomaticResize)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool AutomaticResize { get => GetPropertyValue("AutomaticResize", _automaticResize); set => SetField(ref _automaticResize, value, "AutomaticResize"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameColors)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionColors)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP, ProtocolType.ICA)] public RDPColors Colors { get => GetPropertyValue("Colors", _colors); set => SetField(ref _colors, value, "Colors"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameCacheBitmaps)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionCacheBitmaps)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP, ProtocolType.ICA)] public bool CacheBitmaps { get => GetPropertyValue("CacheBitmaps", _cacheBitmaps); set => SetField(ref _cacheBitmaps, value, "CacheBitmaps"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameDisplayWallpaper)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDisplayWallpaper)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool DisplayWallpaper { get => GetPropertyValue("DisplayWallpaper", _displayWallpaper); set => SetField(ref _displayWallpaper, value, "DisplayWallpaper"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameDisplayThemes)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDisplayThemes)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool DisplayThemes { get => GetPropertyValue("DisplayThemes", _displayThemes); set => SetField(ref _displayThemes, value, "DisplayThemes"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameEnableFontSmoothing)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionEnableFontSmoothing)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool EnableFontSmoothing { get => GetPropertyValue("EnableFontSmoothing", _enableFontSmoothing); set => SetField(ref _enableFontSmoothing, value, "EnableFontSmoothing"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameEnableDesktopComposition)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionEnableDesktopComposition)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool EnableDesktopComposition { get => GetPropertyValue("EnableDesktopComposition", _enableDesktopComposition); set => SetField(ref _enableDesktopComposition, value, "EnableDesktopComposition"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameDisableFullWindowDrag)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDisableFullWindowDrag)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool DisableFullWindowDrag { get => GetPropertyValue("DisableFullWindowDrag", _disableFullWindowDrag); set => SetField(ref _disableFullWindowDrag, value, "DisableFullWindowDrag"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameDisableMenuAnimations)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDisableMenuAnimations)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool DisableMenuAnimations { get => GetPropertyValue("DisableMenuAnimations", _disableMenuAnimations); set => SetField(ref _disableMenuAnimations, value, "DisableMenuAnimations"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameDisableCursorShadow)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDisableCursorShadow)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool DisableCursorShadow { get => GetPropertyValue("DisableCursorShadow", _disableCursorShadow); set => SetField(ref _disableCursorShadow, value, "DisableCursorShadow"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameDisableCursorShadow)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDisableCursorShadow)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool DisableCursorBlinking { get => GetPropertyValue("DisableCursorBlinking", _disableCursorBlinking); set => SetField(ref _disableCursorBlinking, value, "DisableCursorBlinking"); } #endregion #region Redirect [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectKeys)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectKeys)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool RedirectKeys { get => GetPropertyValue("RedirectKeys", _redirectKeys); set => SetField(ref _redirectKeys, value, "RedirectKeys"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectDrives)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectDrives)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool RedirectDiskDrives { get => GetPropertyValue("RedirectDiskDrives", _redirectDiskDrives); set => SetField(ref _redirectDiskDrives, value, "RedirectDiskDrives"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectPrinters)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectPrinters)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool RedirectPrinters { get => GetPropertyValue("RedirectPrinters", _redirectPrinters); set => SetField(ref _redirectPrinters, value, "RedirectPrinters"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectClipboard)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectClipboard)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool RedirectClipboard { get { return GetPropertyValue("RedirectClipboard", _redirectClipboard); } set { SetField(ref _redirectClipboard, value, "RedirectClipboard"); } } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectPorts)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectPorts)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool RedirectPorts { get => GetPropertyValue("RedirectPorts", _redirectPorts); set => SetField(ref _redirectPorts, value, "RedirectPorts"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectSmartCards)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectSmartCards)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool RedirectSmartCards { get => GetPropertyValue("RedirectSmartCards", _redirectSmartCards); set => SetField(ref _redirectSmartCards, value, "RedirectSmartCards"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectSounds)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectSounds)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public RDPSounds RedirectSound { get => GetPropertyValue("RedirectSound", _redirectSound); set => SetField(ref _redirectSound, value, "RedirectSound"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameSoundQuality)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionSoundQuality)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public RDPSoundQuality SoundQuality { get => GetPropertyValue("SoundQuality", _soundQuality); set => SetField(ref _soundQuality, value, "SoundQuality"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryRedirect), 6), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameRedirectAudioCapture)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRedirectAudioCapture)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.RDP)] public bool RedirectAudioCapture { get => GetPropertyValue("RedirectAudioCapture", _redirectAudioCapture); set => SetField(ref _redirectAudioCapture, value, nameof(RedirectAudioCapture)); } #endregion #region Misc [Browsable(false)] public string ConstantID { get; } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryMiscellaneous), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameExternalToolBefore)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionExternalToolBefore)), TypeConverter(typeof(ExternalToolsTypeConverter))] public virtual string PreExtApp { get => GetPropertyValue("PreExtApp", _preExtApp); set => SetField(ref _preExtApp, value, "PreExtApp"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryMiscellaneous), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameExternalToolAfter)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionExternalToolAfter)), TypeConverter(typeof(ExternalToolsTypeConverter))] public virtual string PostExtApp { get => GetPropertyValue("PostExtApp", _postExtApp); set => SetField(ref _postExtApp, value, "PostExtApp"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryMiscellaneous), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameMACAddress)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionMACAddress))] public virtual string MacAddress { get => GetPropertyValue("MacAddress", _macAddress); set => SetField(ref _macAddress, value, "MacAddress"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryMiscellaneous), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameUser1)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUser1))] public virtual string UserField { get => GetPropertyValue("UserField", _userField); set => SetField(ref _userField, value, "UserField"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryMiscellaneous), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameFavorite)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionFavorite)), TypeConverter(typeof(MiscTools.YesNoTypeConverter))] public virtual bool Favorite { get => GetPropertyValue("Favorite", _favorite); set => SetField(ref _favorite, value, "Favorite"); } #endregion #region VNC // TODO: it seems all these VNC properties were added and serialized but // never hooked up to the VNC protocol or shown to the user [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameCompression)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionCompression)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public ProtocolVNC.Compression VNCCompression { get => GetPropertyValue("VNCCompression", _vncCompression); set => SetField(ref _vncCompression, value, "VNCCompression"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameEncoding)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionEncoding)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public ProtocolVNC.Encoding VNCEncoding { get => GetPropertyValue("VNCEncoding", _vncEncoding); set => SetField(ref _vncEncoding, value, "VNCEncoding"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameAuthenticationMode)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionAuthenticationMode)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public ProtocolVNC.AuthMode VNCAuthMode { get => GetPropertyValue("VNCAuthMode", _vncAuthMode); set => SetField(ref _vncAuthMode, value, "VNCAuthMode"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryProxy), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameVNCProxyType)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyType)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public ProtocolVNC.ProxyType VNCProxyType { get => GetPropertyValue("VNCProxyType", _vncProxyType); set => SetField(ref _vncProxyType, value, "VNCProxyType"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryProxy), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameVNCProxyAddress)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyAddress)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public string VNCProxyIP { get => GetPropertyValue("VNCProxyIP", _vncProxyIp); set => SetField(ref _vncProxyIp, value, "VNCProxyIP"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryProxy), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameVNCProxyPort)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyPort)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public int VNCProxyPort { get => GetPropertyValue("VNCProxyPort", _vncProxyPort); set => SetField(ref _vncProxyPort, value, "VNCProxyPort"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryProxy), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameVNCProxyUsername)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyUsername)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public string VNCProxyUsername { get => GetPropertyValue("VNCProxyUsername", _vncProxyUsername); set => SetField(ref _vncProxyUsername, value, "VNCProxyUsername"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.CategoryProxy), 7), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameVNCProxyPassword)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyPassword)), PasswordPropertyText(true), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public string VNCProxyPassword { get => GetPropertyValue("VNCProxyPassword", _vncProxyPassword); set => SetField(ref _vncProxyPassword, value, "VNCProxyPassword"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameColors)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionColors)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.VNC), Browsable(false)] public ProtocolVNC.Colors VNCColors { get => GetPropertyValue("VNCColors", _vncColors); set => SetField(ref _vncColors, value, "VNCColors"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.PropertyNameSmartSizeMode)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionSmartSizeMode)), TypeConverter(typeof(MiscTools.EnumTypeConverter)), UsedInProtocol(ProtocolType.VNC)] public ProtocolVNC.SmartSizeMode VNCSmartSizeMode { get => GetPropertyValue("VNCSmartSizeMode", _vncSmartSizeMode); set => SetField(ref _vncSmartSizeMode, value, "VNCSmartSizeMode"); } [LocalizedAttributes.LocalizedCategory(nameof(Language.Appearance), 5), LocalizedAttributes.LocalizedDisplayName(nameof(Language.ViewOnly)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionViewOnly)), TypeConverter(typeof(MiscTools.YesNoTypeConverter)), UsedInProtocol(ProtocolType.VNC)] public bool VNCViewOnly { get => GetPropertyValue("VNCViewOnly", _vncViewOnly); set => SetField(ref _vncViewOnly, value, "VNCViewOnly"); } #endregion #endregion protected AbstractConnectionRecord(string uniqueId) { ConstantID = uniqueId.ThrowIfNullOrEmpty(nameof(uniqueId)); } protected virtual TPropertyType GetPropertyValue(string propertyName, TPropertyType value) { return (TPropertyType)GetType().GetProperty(propertyName)?.GetValue(this, null); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void RaisePropertyChangedEvent(object sender, PropertyChangedEventArgs args) { PropertyChanged?.Invoke(sender, new PropertyChangedEventArgs(args.PropertyName)); } protected void SetField(ref T field, T value, string propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return; field = value; RaisePropertyChangedEvent(this, new PropertyChangedEventArgs(propertyName)); } } }