//******************************************************************************************************
// ConsoleHostBase.cs - Gbtc
//
// Copyright © 2010, 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/14/2014 - J. Ritchie Carroll
// Generated original version of source code.
//
//******************************************************************************************************
using System;
using System.Security.Principal;
using System.Text;
using System.Threading;
using GSF.Identity;
using GSF.Reflection;
namespace GSF.TimeSeries
{
///
/// Console application operations used to host the time-series framework service.
///
public class ConsoleHost
{
#region [ Members ]
// Fields
private readonly ServiceHostBase m_serviceHost;
private readonly ConsoleColor m_originalForegroundColor;
private readonly IPrincipal m_consoleHostPrincipal;
private readonly Guid m_clientID;
private readonly object m_displayLock;
#endregion
#region [ Constructors ]
///
/// Creates new .
///
/// Service host instance.
public ConsoleHost(ServiceHostBase serviceHost)
{
m_serviceHost = serviceHost;
m_originalForegroundColor = System.Console.ForegroundColor;
m_consoleHostPrincipal = new GenericPrincipal(new GenericIdentity("ConsoleHost"), new[] { "Administrator" });
m_clientID = Guid.NewGuid();
m_displayLock = new object();
}
#endregion
#region [ Methods ]
///
/// Runs the console host.
///
public void Run()
{
if ((object)m_serviceHost == null)
throw new NullReferenceException("Service host reference is null");
string userInput = "";
try
{
m_serviceHost.UpdatedStatus += m_serviceHost_UpdatedStatus;
m_serviceHost.StartHostedService();
m_serviceHost.SendRequest(m_consoleHostPrincipal, m_clientID, "Filter -Remove 0");
while (!string.Equals(userInput, "Exit", StringComparison.OrdinalIgnoreCase))
{
// Wait for a command from the user.
userInput = System.Console.ReadLine();
// Write a blank line to the console.
WriteLine();
if (!string.IsNullOrWhiteSpace(userInput))
{
// The user typed in a command and didn't just hit .
switch (userInput.ToUpper())
{
case "CLS":
// User wants to clear the console window.
System.Console.Clear();
break;
case "EXIT":
// User wants to exit hosted session.
break;
default:
// User wants to send a request to the service.
m_serviceHost.SendRequest(m_consoleHostPrincipal, m_clientID, userInput);
if (string.Compare(userInput, "Help", StringComparison.OrdinalIgnoreCase) == 0)
DisplayHelp();
break;
}
}
}
}
finally
{
m_serviceHost.StopHostedService();
m_serviceHost.UpdatedStatus -= m_serviceHost_UpdatedStatus;
}
}
private void m_serviceHost_UpdatedStatus(object sender, EventArgs e)
{
if (e.Argument1 != m_clientID)
return;
lock (m_displayLock)
{
// Output status updates from the service to the console window.
switch (e.Argument3)
{
case UpdateType.Alarm:
System.Console.ForegroundColor = ConsoleColor.Red;
break;
case UpdateType.Warning:
System.Console.ForegroundColor = ConsoleColor.Yellow;
break;
}
Write(e.Argument2);
System.Console.ForegroundColor = m_originalForegroundColor;
}
}
private void DisplayHelp()
{
StringBuilder help = new StringBuilder();
help.AppendFormat("Commands supported by {0}:", AssemblyInfo.EntryAssembly.Name);
help.AppendLine();
help.AppendLine();
help.Append("Command".PadRight(20));
help.Append(" ");
help.Append("Description".PadRight(55));
help.AppendLine();
help.Append(new string('-', 20));
help.Append(" ");
help.Append(new string('-', 55));
help.AppendLine();
help.Append("Cls".PadRight(20));
help.Append(" ");
help.Append("Clears this console screen".PadRight(55));
help.AppendLine();
help.Append("Exit".PadRight(20));
help.Append(" ");
help.Append("Exits this console screen".PadRight(55));
help.AppendLine();
help.AppendLine();
help.AppendLine();
Write(help.ToString());
}
private void Write(string format, params object[] args)
{
lock (m_displayLock)
{
if (args.Length == 0)
System.Console.Write(format);
else
System.Console.Write(format, args);
}
}
private void WriteLine()
{
lock (m_displayLock)
{
System.Console.WriteLine();
}
}
private void WriteLine(string format, params object[] args)
{
lock (m_displayLock)
{
if (args.Length == 0)
System.Console.WriteLine(format);
else
System.Console.WriteLine(format, args);
}
}
#endregion
}
}