//******************************************************************************************************
// ConnectionStringBuilder.xaml.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:
// ----------------------------------------------------------------------------------------------------
// 06/10/2011 - Mehulbhai P Thakkar
// Generated original version of source code.
//
//******************************************************************************************************
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Forms;
using GSF.TimeSeries.UI;
namespace GSF.PhasorProtocols.UI.Modal
{
///
/// Interaction logic for ConnectionStringBuilder.xaml
///
public partial class ConnectionStringBuilder : Window
{
#region [ Enumerations ]
///
/// Type of transport protocol enumeration.
///
public enum TransportProtocol
{
///
/// Defines TCP tranasport protocol.
///
///
/// Use this to create connection string for TCP connection.
///
tcp,
///
/// Defines UDP tranasport protocol.
///
///
/// Use this to create connection string for UDP connection.
///
udp,
///
/// Defines Serial tranasport protocol.
///
///
/// Use this to create connection string for Serial connection.
///
serial,
///
/// Defines file based connection.
///
///
/// Use this to create connection string for File based connection.
///
file,
///
/// Defines UDP Server connection.
///
///
/// Use this to create connection string for TCP Server connection.
///
udpserver
}
///
/// Type of connection enumeration.
///
public enum ConnectionType
{
///
/// Defines connection to a device.
///
///
/// Use this to connect to a device.
///
DeviceConnection,
///
/// Defines data channel for communication.
///
///
/// Use this to generate string to setup data channel.
///
DataChannel,
///
/// Defines command channel for communication.
///
///
/// Use this to generate string to setup command channel.
///
CommandChannel,
///
/// Defines alternate command channel.
///
///
/// Use this to generate string to setup alternate command channel.
///
AlternateCommandChannel
}
#endregion
#region [ Members ]
private readonly ConnectionType m_connectionType;
private string m_connectionString;
private Dictionary m_keyvaluepairs;
private bool m_pgConnection;
#endregion
#region [ Properties ]
///
/// Gets or sets a flag indicating if the connection is to Phasor Gateway.
///
public bool PgConnection
{
get
{
return m_pgConnection;
}
set
{
m_pgConnection = value;
}
}
///
/// Gets or sets connection string from the parameters defined on the UI.
///
public string ConnectionString
{
get
{
return m_connectionString;
}
set
{
m_connectionString = value;
}
}
#endregion
#region [ Constructor]
///
/// Creates a new instance of class.
///
public ConnectionStringBuilder(ConnectionType connectionType)
{
InitializeComponent();
m_connectionType = connectionType;
this.Loaded += ConnectionStringBuilder_Loaded;
}
#endregion
#region [ Methods ]
///
/// Handles loaded event of the window.
///
/// Source of the event.
/// Event arguments.
private void ConnectionStringBuilder_Loaded(object sender, RoutedEventArgs e)
{
if (m_connectionType == ConnectionType.CommandChannel)
{
TabItemTCP.Visibility = Visibility.Visible;
TabItemUDP.Visibility = Visibility.Collapsed;
TabItemSerial.Visibility = Visibility.Collapsed;
TabItemFile.Visibility = Visibility.Collapsed;
TabItemUdpServer.Visibility = Visibility.Collapsed;
TextBoxHostIP.Visibility = Visibility.Collapsed;
CheckboxEstablishServer.Visibility = Visibility.Collapsed;
}
else if (m_connectionType == ConnectionType.AlternateCommandChannel)
{
TabItemTCP.Visibility = Visibility.Visible;
TabItemUDP.Visibility = Visibility.Collapsed;
if (PgConnection)
TabItemSerial.Visibility = Visibility.Collapsed;
else
TabItemSerial.Visibility = Visibility.Visible;
TabItemFile.Visibility = Visibility.Collapsed;
TabItemUdpServer.Visibility = Visibility.Collapsed;
}
else if (m_connectionType == ConnectionType.DataChannel)
{
TabControlOptions.SelectedIndex = 4;
TabItemTCP.Visibility = Visibility.Collapsed;
TabItemUDP.Visibility = Visibility.Collapsed;
TabItemSerial.Visibility = Visibility.Collapsed;
TabItemFile.Visibility = Visibility.Collapsed;
TabItemUdpServer.Visibility = Visibility.Visible;
}
else
{
TabItemTCP.Visibility = Visibility.Visible;
TabItemUDP.Visibility = Visibility.Visible;
TabItemSerial.Visibility = Visibility.Visible;
TabItemFile.Visibility = Visibility.Visible;
TabItemUdpServer.Visibility = Visibility.Collapsed;
}
m_keyvaluepairs = new Dictionary(StringComparer.OrdinalIgnoreCase);
ComboboxParity.ItemsSource = CommonFunctions.GetParities();
ComboboxStopBits.ItemsSource = CommonFunctions.GetStopBits();
if (ComboboxParity.Items.Count > 0)
ComboboxParity.SelectedIndex = 0;
if (ComboboxStopBits.Items.Count > 1)
ComboboxStopBits.SelectedIndex = 1;
else
ComboboxStopBits.SelectedIndex = 0;
ComboboxPort.Items.Add("COM1");
ComboboxPort.Items.Add("COM2");
ComboboxPort.Items.Add("COM3");
ComboboxPort.Items.Add("COM4");
ComboboxPort.Items.Add("COM5");
ComboboxPort.Items.Add("COM6");
ComboboxPort.Items.Add("COM7");
ComboboxPort.Items.Add("COM8");
ComboboxPort.Items.Add("COM9");
ComboboxPort.Items.Add("COM10");
ComboboxPort.SelectedIndex = 0;
// Populate Baud Rate Dropdown in Serial Tab
ComboboxBaudRate.Items.Add(115200);
ComboboxBaudRate.Items.Add(57600);
ComboboxBaudRate.Items.Add(38400);
ComboboxBaudRate.Items.Add(19200);
ComboboxBaudRate.Items.Add(9600);
ComboboxBaudRate.Items.Add(4800);
ComboboxBaudRate.Items.Add(2400);
ComboboxBaudRate.Items.Add(1200);
ComboboxBaudRate.SelectedIndex = 0;
CheckboxForceIPv4.IsChecked = IsolatedStorageManager.ReadFromIsolatedStorage("ForceIPv4") == null ? true : Convert.ToBoolean(IsolatedStorageManager.ReadFromIsolatedStorage("ForceIPv4"));
// populate connection info if already provided from the parent window
ParseConnectionString();
}
///
/// Hanldes click event of the save button on UdpServer tab.
///
/// Source of the event.
/// Event arguments.
private void ButtonSaveUdpServer_Click(object sender, RoutedEventArgs e)
{
m_keyvaluepairs["port"] = "-1";
string clients = string.Empty;
if (!string.IsNullOrEmpty(TextBoxHostIP1.Text))
clients += FormatIP(TextBoxHostIP1.Text) + ":" + (string.IsNullOrEmpty(TextBoxHostPort1.Text) ? "4712" : TextBoxHostPort1.Text) + ",";
if (!string.IsNullOrEmpty(TextBoxHostIP2.Text))
clients += FormatIP(TextBoxHostIP2.Text) + ":" + (string.IsNullOrEmpty(TextBoxHostPort2.Text) ? "4712" : TextBoxHostPort2.Text) + ",";
if (!string.IsNullOrEmpty(TextBoxHostIP3.Text))
clients += FormatIP(TextBoxHostIP3.Text) + ":" + (string.IsNullOrEmpty(TextBoxHostPort3.Text) ? "4712" : TextBoxHostPort3.Text) + ",";
while (clients.EndsWith(","))
clients = clients.Substring(0, clients.LastIndexOf(','));
m_keyvaluepairs["clients"] = clients;
SetConnectionString(TransportProtocol.udpserver);
this.DialogResult = true;
}
///
/// Hanldes click event of the save button on File tab.
///
/// Source of the event.
/// Event arguments.
private void ButtonSaveFile_Click(object sender, RoutedEventArgs e)
{
CheckboxForceIPv4.IsChecked = false; //as IPv4 doesn't matter for file protocol
m_keyvaluepairs["file"] = TextBoxFile.Text;
m_keyvaluepairs["definedframerate"] = String.IsNullOrEmpty(TextBoxFrameRate.Text) ? "30" : TextBoxFrameRate.Text;
m_keyvaluepairs["simulatetimestamp"] = CheckboxSimulateTimeStamp.IsChecked.ToString().ToLower();
m_keyvaluepairs["autorepeatfile"] = CheckboxAutoRepeat.IsChecked.ToString().ToLower();
SetConnectionString(TransportProtocol.file);
this.DialogResult = true;
}
///
/// Hanldes click event of the browse button on File tab.
///
/// Source of the event.
/// Event arguments.
private void ButtonBrowseFile_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false;
openFileDialog.Filter = "PMU Capture File (*.PmuCapture)|*.PmuCapture|All Files (*.*)|*.*";
if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
TextBoxFile.Text = openFileDialog.FileName;
}
///
/// Hanldes click event of the save button on Serial tab.
///
/// Source of the event.
/// Event arguments.
private void ButtonSaveSerial_Click(object sender, RoutedEventArgs e)
{
m_keyvaluepairs["port"] = ComboboxPort.SelectedItem.ToString();
m_keyvaluepairs["baudrate"] = ComboboxBaudRate.SelectedItem.ToString();
m_keyvaluepairs["parity"] = ComboboxParity.SelectedItem.ToString();
m_keyvaluepairs["stopbits"] = ComboboxStopBits.SelectedItem.ToString();
m_keyvaluepairs["databits"] = String.IsNullOrEmpty(TextBoxDataBits.Text) ? "8" : TextBoxDataBits.Text;
m_keyvaluepairs["dtrenable"] = CheckboxDTR.IsChecked.ToString().ToLower();
m_keyvaluepairs["rtsenable"] = CheckboxRTS.IsChecked.ToString().ToLower();
SetConnectionString(TransportProtocol.serial);
this.DialogResult = true;
}
///
/// Hanldes click event of the save button on UDP tab.
///
/// Source of the event.
/// Event arguments.
private void ButtonSaveUDP_Click(object sender, RoutedEventArgs e)
{
m_keyvaluepairs["localport"] = String.IsNullOrEmpty(TextBoxLocalPort.Text) ? "4712" : TextBoxLocalPort.Text;
if ((bool)CheckboxEnableMulticast.IsChecked)
{
m_keyvaluepairs["server"] = FormatIP(TextBoxHostIPUdp.Text);
m_keyvaluepairs["remoteport"] = TextBoxRemotePort.Text;
}
else
{
if (m_keyvaluepairs.ContainsKey("server"))
m_keyvaluepairs.Remove("server");
if (m_keyvaluepairs.ContainsKey("remoteport"))
m_keyvaluepairs.Remove("remoteport");
}
SetConnectionString(TransportProtocol.udp);
this.DialogResult = true;
}
///
/// Hanldes click event of the save button on TCP tab.
///
/// Source of the event.
/// Event arguments.
private void ButtonSaveTCP_Click(object sender, RoutedEventArgs e)
{
m_keyvaluepairs["port"] = String.IsNullOrEmpty(TextBoxPort.Text) ? "4712" : TextBoxPort.Text;
m_keyvaluepairs["maxSendQueueSize"] = String.IsNullOrEmpty(TextBoxMaxSendQueueSize.Text) ? "-1" : TextBoxMaxSendQueueSize.Text;
if (m_connectionType != ConnectionType.CommandChannel)
{
string hostIP = String.IsNullOrEmpty(TextBoxHostIP.Text) ? "127.0.0.1" : TextBoxHostIP.Text;
m_keyvaluepairs["server"] = FormatIP(hostIP);
m_keyvaluepairs["islistener"] = CheckboxEstablishServer.IsChecked.ToString().ToLower();
if (PgConnection)
{
m_keyvaluepairs["server"] = m_keyvaluepairs["server"] + ":" + m_keyvaluepairs["port"];
m_keyvaluepairs.Remove("port");
}
}
SetConnectionString(TransportProtocol.tcp);
this.DialogResult = true;
}
///
/// Parses and creates type collection.
///
void ParseConnectionString()
{
if (!string.IsNullOrEmpty(this.ConnectionString))
{
//string[] keyvalues = this.ConnectionString.Replace("[", "").Replace("]", "").Split(new char[] { ';' }, System.StringSplitOptions.RemoveEmptyEntries);
//foreach (string keyvalue in keyvalues)
//{
// string[] keyvaluepair = keyvalue.Split('=');
// if (keyvaluepair.GetLength(0) == 2)
// {
// m_keyvaluepairs.Add(keyvaluepair[0].Trim(), keyvaluepair[1].Trim());
// }
//}
m_keyvaluepairs = ConnectionString.Replace("[", "").Replace("]", "").ParseKeyValuePairs();
if (m_connectionType == ConnectionType.CommandChannel) //command channel is TCP
{
if (!m_keyvaluepairs.ContainsKey("transportprotocol") && !m_keyvaluepairs.ContainsKey("protocol"))
m_keyvaluepairs.Add("transportprotocol", "tcp");
else if (m_keyvaluepairs.ContainsKey("transportprotocol"))
m_keyvaluepairs["transportprotocol"] = "tcp";
else if (m_keyvaluepairs.ContainsKey("protocol"))
m_keyvaluepairs["protocol"] = "tcp";
}
if (m_connectionType == ConnectionType.DataChannel) //then it is UDP server.
{
TabControlOptions.SelectedIndex = 4;
if (m_keyvaluepairs.ContainsKey("clients"))
{
string[] clients = m_keyvaluepairs["clients"].Split(',');
int count = 0;
foreach (string client in clients)
{
string port = "4712";
string hostIp = string.Empty;
if (client.Contains(":"))
{
hostIp = client.Substring(0, client.LastIndexOf(':'));
port = client.Substring(client.LastIndexOf(':') + 1);
}
else
hostIp = client;
if (count == 0)
{
TextBoxHostIP1.Text = hostIp;
TextBoxHostPort1.Text = port;
}
else if (count == 1)
{
TextBoxHostIP2.Text = hostIp;
TextBoxHostPort2.Text = port;
}
else if (count == 2)
{
TextBoxHostIP3.Text = hostIp;
TextBoxHostPort3.Text = port;
}
count += 1;
}
}
}
else if ((m_keyvaluepairs.ContainsKey("transportprotocol") && m_keyvaluepairs["transportprotocol"].ToLower() == "tcp") || (m_keyvaluepairs.ContainsKey("protocol") && m_keyvaluepairs["protocol"].ToLower() == "tcp"))
{
TabControlOptions.SelectedIndex = 0;
if (m_keyvaluepairs.ContainsKey("server"))
{
if (m_keyvaluepairs["server"].Contains(":") && PgConnection)
{
m_keyvaluepairs["port"] = m_keyvaluepairs["server"].Substring(m_keyvaluepairs["server"].LastIndexOf(":") + 1);
m_keyvaluepairs["server"] = m_keyvaluepairs["server"].Substring(0, m_keyvaluepairs["server"].LastIndexOf(":"));
}
TextBoxHostIP.Text = m_keyvaluepairs["server"];
}
if (m_keyvaluepairs.ContainsKey("port"))
TextBoxPort.Text = m_keyvaluepairs["port"];
if (m_keyvaluepairs.ContainsKey("maxSendQueueSize"))
TextBoxMaxSendQueueSize.Text = m_keyvaluepairs["maxSendQueueSize"];
if (m_keyvaluepairs.ContainsKey("islistener") && m_keyvaluepairs["islistener"].ToLower() == "true")
CheckboxEstablishServer.IsChecked = true;
else
CheckboxEstablishServer.IsChecked = false;
}
else if ((m_keyvaluepairs.ContainsKey("transportprotocol") && m_keyvaluepairs["transportprotocol"].ToLower() == "udp") ||
(m_keyvaluepairs.ContainsKey("protocol") && m_keyvaluepairs["protocol"].ToLower() == "udp"))
{
TabControlOptions.SelectedIndex = 1;
if (m_keyvaluepairs.ContainsKey("localport"))
TextBoxLocalPort.Text = m_keyvaluepairs["localport"];
if (m_keyvaluepairs.ContainsKey("server"))
{
CheckboxEnableMulticast.IsChecked = true;
TextBoxHostIPUdp.Text = m_keyvaluepairs["server"];
if (m_keyvaluepairs.ContainsKey("remoteport"))
TextBoxRemotePort.Text = m_keyvaluepairs["remoteport"];
}
else
{
CheckboxEnableMulticast.IsChecked = false;
TextBoxHostIPUdp.Text = string.Empty;
TextBoxRemotePort.Text = string.Empty;
}
}
else if ((m_keyvaluepairs.ContainsKey("transportprotocol") && m_keyvaluepairs["transportprotocol"].ToLower() == "serial") || (m_keyvaluepairs.ContainsKey("protocol") && m_keyvaluepairs["protocol"].ToLower() == "serial"))
{
TabControlOptions.SelectedIndex = 2;
if (m_keyvaluepairs.ContainsKey("port"))
{
foreach (object item in ComboboxPort.Items)
{
if (item.ToString().ToLower() == m_keyvaluepairs["port"].ToLower())
{
ComboboxPort.SelectedItem = item;
break;
}
}
}
if (m_keyvaluepairs.ContainsKey("baudrate"))
{
foreach (object item in ComboboxBaudRate.Items)
{
if (item.ToString().ToLower() == m_keyvaluepairs["baudrate"].ToLower())
{
ComboboxBaudRate.SelectedItem = item;
break;
}
}
}
if (m_keyvaluepairs.ContainsKey("parity"))
{
foreach (object item in ComboboxParity.Items)
{
if (item.ToString().ToLower() == m_keyvaluepairs["parity"].ToLower())
{
ComboboxParity.SelectedItem = item;
break;
}
}
}
if (m_keyvaluepairs.ContainsKey("stopbits"))
{
foreach (object item in ComboboxStopBits.Items)
{
if (item.ToString().ToLower() == m_keyvaluepairs["stopbits"].ToLower())
{
ComboboxStopBits.SelectedItem = item;
break;
}
}
}
if (m_keyvaluepairs.ContainsKey("databits"))
TextBoxDataBits.Text = m_keyvaluepairs["databits"];
if (m_keyvaluepairs.ContainsKey("dtrenable") && m_keyvaluepairs["dtrenable"].ToLower() == "true")
CheckboxDTR.IsChecked = true;
else
CheckboxDTR.IsChecked = false;
if (m_keyvaluepairs.ContainsKey("rtsenable") && m_keyvaluepairs["rtsenable"].ToLower() == "true")
CheckboxRTS.IsChecked = true;
else
CheckboxRTS.IsChecked = false;
}
else if ((m_keyvaluepairs.ContainsKey("transportprotocol") && m_keyvaluepairs["transportprotocol"].ToLower() == "file") || (m_keyvaluepairs.ContainsKey("protocol") && m_keyvaluepairs["protocol"].ToLower() == "file"))
{
TabControlOptions.SelectedIndex = 3;
if (m_keyvaluepairs.ContainsKey("file"))
TextBoxFile.Text = m_keyvaluepairs["file"];
if (m_keyvaluepairs.ContainsKey("definedframerate"))
TextBoxFrameRate.Text = m_keyvaluepairs["definedframerate"];
if (m_keyvaluepairs.ContainsKey("simulatetimestamp") && m_keyvaluepairs["simulatetimestamp"].ToLower() == "false")
CheckboxSimulateTimeStamp.IsChecked = false; //by default it is true
if (m_keyvaluepairs.ContainsKey("autorepeatfile") && m_keyvaluepairs["autorepeatfile"].ToLower() == "false")
CheckboxAutoRepeat.IsChecked = false;
}
else
TabControlOptions.SelectedIndex = 0;
if (m_keyvaluepairs.ContainsKey("interface"))
CheckboxForceIPv4.IsChecked = true;
else
CheckboxForceIPv4.IsChecked = false;
}
}
///
/// Creates connection string by merging keyvaluepairs defined in .
///
/// to format connection string.
void SetConnectionString(TransportProtocol transportProtocol)
{
if (m_connectionType == ConnectionType.DataChannel || m_connectionType == ConnectionType.CommandChannel) // don't need transport protocol if it is a data channel or command channel.
{
if (m_keyvaluepairs.ContainsKey("transportprotocol"))
m_keyvaluepairs.Remove("transportprotocol");
if (m_keyvaluepairs.ContainsKey("protocol"))
m_keyvaluepairs.Remove("protocol");
}
else
{
if (!m_keyvaluepairs.ContainsKey("transportprotocol") && !m_keyvaluepairs.ContainsKey("protocol"))
m_keyvaluepairs.Add("transportprotocol", transportProtocol.ToString());
else if (m_keyvaluepairs.ContainsKey("transportprotocol"))
m_keyvaluepairs["transportprotocol"] = transportProtocol.ToString();
else if (m_keyvaluepairs.ContainsKey("protocol"))
m_keyvaluepairs["protocol"] = transportProtocol.ToString();
}
if ((bool)CheckboxForceIPv4.IsChecked)
m_keyvaluepairs["interface"] = "0.0.0.0";
else
m_keyvaluepairs.Remove("interface");
m_connectionString = m_keyvaluepairs.JoinKeyValuePairs();
//m_connectionString = string.Empty;
//foreach (KeyValuePair keyvalue in m_keyvaluepairs)
//{
// m_connectionString += keyvalue.Key + "=" + keyvalue.Value + "; ";
//}
}
///
/// Formats IPv6 address.
///
/// IP address to be formatted.
/// string, formatted IP address.
private string FormatIP(string ipAddress)
{
if (ipAddress.Contains(":"))
ipAddress = "[" + ipAddress + "]";
return ipAddress;
}
#endregion
}
}