990 lines · 41.3 KB · C#
RawDownload
//******************************************************************************************************//  ClientHelper.cs - Gbtc////  Copyright © 2012, Grid Protection Alliance.  All Rights Reserved.////  Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See//  the NOTICE file distributed with this work for additional information regarding copyright ownership.//  The GPA licenses this file to you under the MIT License (MIT), the "License"; you may//  not use this file except in compliance with the License. You may obtain a copy of the License at:////      http://www.opensource.org/licenses/MIT////  Unless agreed to in writing, the subject software distributed under the License is distributed on an//  "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the//  License for the specific language governing permissions and limitations.////  Code Modification History://  ----------------------------------------------------------------------------------------------------//  08/29/2006 - Pinal C. Patel//       Original version of source code generated.//  11/30/2007 - Pinal C. Patel//       Modified the "design time" check in EndInit() method to use LicenseManager.UsageMode property//       instead of DesignMode property as the former is more accurate than the latter.//  09/30/2008 - J. Ritchie Carroll//       Convert to C#.//  07/15/2009 - Pinal C. Patel//       Added AuthenticationMethod, AuthenticationUsername and AuthenticationPassword properties to//       provision for the authentication process as part of security.//       Added ISupportLifecycle, ISupportInitialize and IPersistSettings interface implementations//       to support the persistence and retrieval of settings from the config file.//  07/17/2009 - Pinal C. Patel//       Added static PretendRequest() method that can be used to create pretend request for manually//       invoking request handlers registered with the ServiceHelper.//  07/21/2009 - Pinal C. Patel//       Replace AuthenticationUsername and AuthenticationPassword properties with AuthenticationInput//       to allow for input text to be specified for any AuthenticationMethod instead of just Ntml.//  07/23/2009 - Pinal C. Patel//       ReceivedServiceResponse is now raised only for custom service responses instead of all.//  09/14/2009 - Stephen C. Wills//       Added new header and license agreement.//  10/23/2009 - Pinal C. Patel//       Modified ReceivedServiceUpdate event to support the change in ServiceHelper.UpdateStatus().//  06/16/2010 - Pinal C. Patel//       Made changes necessary to implement role-based security.//  04/14/2011 - Pinal C. Patel//       Updated to use new deserialization methods in GSF.Serialization class.//  12/20/2012 - Starlynn Danyelle Gilliam//       Modified Header.////****************************************************************************************************** using GSF.Communication;using GSF.Configuration;using GSF.Console;using GSF.IO;using System;using System.ComponentModel;using System.Configuration;using System.Drawing;using System.IO;using System.Text;using System.Threading; namespace GSF.ServiceProcess{    /// <summary>    /// Component that provides client-side functionality to <see cref="ServiceHelper"/>.    /// </summary>    [ToolboxBitmap(typeof(ClientHelper))]    public class ClientHelper : Component, ISupportLifecycle, ISupportInitialize, IPersistSettings    {        #region [ Members ]         // Constants         /// <summary>        /// Specifies the default value for the <see cref="Username"/> property.        /// </summary>        public const string DefaultUsername = "";         /// <summary>        /// Specifies the default value for the <see cref="Password"/> property.        /// </summary>        public const string DefaultPassword = "";         /// <summary>        /// Specifies the default value for the <see cref="StatusMessageFilter"/> property.        /// </summary>        public const string DefaultStatusMessageFilter = "Filter -Remove 0";         /// <summary>        /// Specifies the default value for the <see cref="PersistSettings"/> property.        /// </summary>        public const bool DefaultPersistSettings = false;         /// <summary>        /// Specifies the default value for the <see cref="SettingsCategory"/> property.        /// </summary>        public const string DefaultSettingsCategory = "ClientHelper";         // Events         /// <summary>        /// Occurs when a status update is received from the <see cref="ServiceHelper"/>.        /// </summary>        [Category("Client"),        Description("Occurs when a status update is received from the ServiceHelper.")]        public event EventHandler<EventArgs<UpdateType, string>> ReceivedServiceUpdate;         /// <summary>        /// Occurs when a custom <see cref="ServiceResponse"/> is received from the <see cref="ServiceHelper"/>.        /// </summary>        [Category("Service"),        Description("Occurs when a ServiceResponse is received from the ServiceHelper.")]        public event EventHandler<EventArgs<ServiceResponse>> ReceivedServiceResponse;         /// <summary>        /// Occurs when the state of the <see cref="ServiceHelper"/> is changed.        /// </summary>        [Category("Service"),        Description("Occurs when the state of the ServiceHelper is changed.")]        public event EventHandler<EventArgs<ObjectState<ServiceState>>> ServiceStateChanged;         /// <summary>        /// Occurs when the state of a <see cref="ServiceProcess"/> is changed.        /// </summary>        [Category("Service"),        Description("Occurs when the state of a ServiceProcess is changed.")]        public event EventHandler<EventArgs<ObjectState<ServiceProcessState>>> ProcessStateChanged;         /// <summary>        /// Occurs when the <see cref="ServiceHelper"/> successfully authenticates the <see cref="ClientHelper"/>.        /// </summary>        [Category("Security"),        Description("Occurs when the ServiceHelper successfully authenticates the ClientHelper.")]        public event EventHandler AuthenticationSuccess;         /// <summary>        /// Occurs when the <see cref="ServiceHelper"/> fails to authenticate the <see cref="ClientHelper"/>.        /// </summary>        /// <remarks>        /// Set <see cref="CancelEventArgs.Cancel"/> to <b>true</b> to continue with connection attempts even after authentication fails.         /// This can be useful for re-authenticating the <see cref="ClientHelper"/> using different <see cref="Username"/> and <see cref="Password"/>.        /// </remarks>        [Category("Security"),        Description("Occurs when the ServiceHelper fails to authenticate the ClientHelper.")]        public event EventHandler<CancelEventArgs> AuthenticationFailure;         /// <summary>        /// Occurs when a telnet session has been established.        /// </summary>        [Category("Command"),        Description("Occurs when a telnet session has been established.")]        public event EventHandler TelnetSessionEstablished;         /// <summary>        /// Occurs when a telnet session has been terminated.        /// </summary>        [Category("Command"),        Description("Occurs when a telnet session has been terminated.")]        public event EventHandler TelnetSessionTerminated;         // Fields        private ClientBase m_remotingClient;        private string m_username;        private string m_password;        private string m_statusMessageFilter;        private SerializationFormat m_serializationFormat;        private bool m_persistSettings;        private string m_settingsCategory;        private bool m_attemptReconnection;        private bool m_authenticationComplete;        private bool m_disposed;        private bool m_initialized;         #endregion         #region [ Constructors ]         /// <summary>        /// Initializes a new instance of the <see cref="ClientHelper"/> class.        /// </summary>        public ClientHelper()        {            m_username = DefaultUsername;            m_password = DefaultPassword;            m_persistSettings = DefaultPersistSettings;            m_statusMessageFilter = DefaultStatusMessageFilter;            m_settingsCategory = DefaultSettingsCategory;            m_serializationFormat = ServiceHelper.DefaultSerializationFormat;        }         /// <summary>        /// Initializes a new instance of the <see cref="ClientHelper"/> class.        /// </summary>        /// <param name="container"><see cref="IContainer"/> object that contains the <see cref="ClientHelper"/>.</param>        public ClientHelper(IContainer container)            : this()        {            if ((object)container != null)                container.Add(this);        }         #endregion         #region [ Properties ]         /// <summary>        /// Gets or sets the <see cref="ClientBase"/> object used for communicating with the <see cref="ServiceHelper"/>.        /// </summary>        [Category("Components"),        Description("ClientBase object used for communicating with the ServiceHelper.")]        public ClientBase RemotingClient        {            get            {                return m_remotingClient;            }            set            {                if ((object)m_remotingClient != null)                {                    // Detach events from any existing instance                    m_remotingClient.ConnectionEstablished -= RemotingClient_ConnectionEstablished;                    m_remotingClient.ConnectionAttempt -= RemotingClient_ConnectionAttempt;                    m_remotingClient.ConnectionException -= RemotingClient_ConnectionException;                    m_remotingClient.ConnectionTerminated -= RemotingClient_ConnectionTerminated;                    m_remotingClient.ReceiveDataComplete -= RemotingClient_ReceiveDataComplete;                }                 m_remotingClient = value;                 if ((object)m_remotingClient != null)                {                    // Attach events to new instance                    m_remotingClient.ConnectionEstablished += RemotingClient_ConnectionEstablished;                    m_remotingClient.ConnectionAttempt += RemotingClient_ConnectionAttempt;                    m_remotingClient.ConnectionException += RemotingClient_ConnectionException;                    m_remotingClient.ConnectionTerminated += RemotingClient_ConnectionTerminated;                    m_remotingClient.ReceiveDataComplete += RemotingClient_ReceiveDataComplete;                }            }        }         /// <summary>        /// Gets or sets the username of the <see cref="ClientHelper"/>'s user to be used for authenticating with the <see cref="ServiceHelper"/>.        /// </summary>        /// <exception cref="ArgumentNullException">The value being specified is a null string.</exception>        [Category("Security"),        DefaultValue(DefaultUsername),        Description("Username of the ClientHelper's user to be used for authenticating with the ServiceHelper.")]        public string Username        {            get            {                return m_username;            }            set            {                if ((object)value == null)                    throw new ArgumentNullException("value");                 m_username = value;            }        }         /// <summary>        /// Gets or sets the password of the <see cref="ClientHelper"/>'s user to be used for authenticating with the <see cref="ServiceHelper"/>.        /// </summary>        /// <exception cref="ArgumentNullException">The value being specified is a null string.</exception>        [Category("Security"),        DefaultValue(DefaultPassword),        Description("Password of the ClientHelper's user to be used for authenticating with the ServiceHelper.")]        public string Password        {            get            {                return m_password;            }            set            {                if ((object)value == null)                    throw new ArgumentNullException("value");                 m_password = value;            }        }         /// <summary>        /// Gets or sets the command used to negotiate the status        /// message filter with the service when the client connects.        /// </summary>        [Category("Settings"),        DefaultValue(DefaultStatusMessageFilter),        Description("Command used to negotiate status message filter when client connects to the ServiceHelper.")]        public string StatusMessageFilter        {            get            {                return m_statusMessageFilter;            }            set            {                m_statusMessageFilter = value ?? DefaultStatusMessageFilter;            }        }         /// <summary>        /// Gets or sets a value that indicates the desired message <see cref="GSF.SerializationFormat"/> for interaction with <see cref="ServiceHelper"/>.        /// </summary>        [Category("Settings"),        DefaultValue(ServiceHelper.DefaultSerializationFormat),        Description("Indicates messaging serialization format for interactions with ServiceHelper.")]        public SerializationFormat SerializationFormat        {            get            {                return m_serializationFormat;            }            set            {                m_serializationFormat = value;            }        }         /// <summary>        /// Gets or sets a boolean value that indicates whether the settings of <see cref="ClientHelper"/> are to be saved to the config file.        /// </summary>        [Category("Persistence"),        DefaultValue(DefaultPersistSettings),        Description("Indicates whether the settings of ClientHelper are to be saved to the config file.")]        public bool PersistSettings        {            get            {                return m_persistSettings;            }            set            {                m_persistSettings = value;            }        }         /// <summary>        /// Gets or sets the category under which the settings of <see cref="ClientHelper"/> are to be saved to the config file if the <see cref="PersistSettings"/> property is set to true.        /// </summary>        /// <exception cref="ArgumentNullException">The value being assigned is a null or empty string.</exception>        [Category("Persistence"),        DefaultValue(DefaultSettingsCategory),        Description("Category under which the settings of ClientHelper are to be saved to the config file if the PersistSettings property is set to true.")]        public string SettingsCategory        {            get            {                return m_settingsCategory;            }            set            {                if (string.IsNullOrEmpty(value))                    throw new ArgumentNullException("value");                 m_settingsCategory = value;            }        }         /// <summary>        /// Gets or sets a boolean value that indicates whether the <see cref="ClientHelper"/> is currently enabled.        /// </summary>        /// <remarks>        /// <see cref="Enabled"/> property is not be set by user-code directly.        /// </remarks>        [Browsable(false),        EditorBrowsable(EditorBrowsableState.Never),        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]        public bool Enabled        {            get            {                if ((object)m_remotingClient == null)                    return false;                 return m_remotingClient.Enabled;            }            set            {                if ((object)m_remotingClient != null)                    m_remotingClient.Enabled = value;            }        }         /// <summary>        /// Gets a flag that indicates whether the object has been disposed.        /// </summary>        [Browsable(false),        EditorBrowsable(EditorBrowsableState.Never),        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]        public bool IsDisposed        {            get            {                return m_disposed;            }        }         #endregion         #region [ Methods ]         /// <summary>        /// Initializes the <see cref="ClientHelper"/>.        /// </summary>        /// <remarks>        /// <see cref="Initialize()"/> is to be called by user-code directly only if the <see cref="ClientHelper"/> is not consumed through the designer surface of the IDE.        /// </remarks>        public void Initialize()        {            if (!m_initialized)            {                LoadSettings();         // Load settings from the config file.                m_initialized = true;   // Initialize only once.            }        }         /// <summary>        /// Performs necessary operations before the <see cref="ClientHelper"/> properties are initialized.        /// </summary>        /// <remarks>        /// <see cref="BeginInit()"/> should never be called by user-code directly. This method exists solely for use         /// by the designer if the <see cref="ClientHelper"/> is consumed through the designer surface of the IDE.        /// </remarks>        [EditorBrowsable(EditorBrowsableState.Never)]        public void BeginInit()        {            if (!DesignMode)            {                try                {                    // Nothing needs to be done before component is initialized.                }                catch (Exception)                {                    // Prevent the IDE from crashing when component is in design mode.                }            }        }         /// <summary>        /// Performs necessary operations after the <see cref="ClientHelper"/> properties are initialized.        /// </summary>        /// <remarks>        /// <see cref="EndInit()"/> should never be called by user-code directly. This method exists solely for use         /// by the designer if the <see cref="ClientHelper"/> is consumed through the designer surface of the IDE.        /// </remarks>        [EditorBrowsable(EditorBrowsableState.Never)]        public void EndInit()        {            if (!DesignMode)            {                try                {                    Initialize();                }                catch (Exception)                {                    // Prevent the IDE from crashing when component is in design mode.                }            }        }         /// <summary>        /// Saves settings for the <see cref="ClientHelper"/> to the config file if the <see cref="PersistSettings"/> property is set to true.        /// </summary>        /// <exception cref="ConfigurationErrorsException"><see cref="SettingsCategory"/> has a value of null or empty string.</exception>        public void SaveSettings()        {            if (m_persistSettings)            {                // Ensure that settings category is specified.                if (string.IsNullOrEmpty(m_settingsCategory))                    throw new ConfigurationErrorsException("SettingsCategory property has not been set");                 // Save settings under the specified category.                ConfigurationFile config = ConfigurationFile.Current;                CategorizedSettingsElementCollection settings = config.Settings[m_settingsCategory];                 settings[nameof(Username), true].Update(m_username);                settings[nameof(Password), true].Update(m_password);                settings[nameof(SerializationFormat), true].Update(m_serializationFormat);                settings[nameof(StatusMessageFilter), true].Update(m_statusMessageFilter);                 settings[nameof(Username)].Scope = SettingScope.User;                settings[nameof(Password)].Scope = SettingScope.User;                settings[nameof(Password)].Encrypted = true;                 config.Save();            }        }         /// <summary>        /// Loads saved settings for the <see cref="ClientHelper"/> from the config file if the <see cref="PersistSettings"/> property is set to true.

Lines 1–500 of 990.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t