#region License Information
/* HeuristicLab
* Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
// copied from http://www.codeproject.com/KB/edit/IPAddressTextBox.aspx
using System;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace HeuristicLab.Hive.Server.Console {
[
DefaultProperty("Text"),
DefaultEvent("TextChanged"),
]
///
/// IPAddressTextBox
/// Control to enter IP-Addresses manually
/// Supports Binary and Decimal Notation
/// Supports input of CIDR Notation (appending of Bitmask of Subnetmask devided by Slash)
/// Support input of IP-Address in IPv6 format
///
public class IPAddressTextBox : System.Windows.Forms.TextBox {
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
private IPNotation m_ipNotation = IPNotation.IPv4Decimal;
private IPNotation m_newIPNotation = IPNotation.IPv4Decimal;
private bool m_bOverwrite = true;
private bool m_bPreventLeave = true;
private System.Windows.Forms.ErrorProvider error;
private Regex m_regexValidNumbers = new Regex("[0-9]");
private ArrayList m_arlDelimeter = new ArrayList(new char[] { '.' });
public enum IPNotation {
IPv4Decimal, //192.168.000.001
IPv4Binary, //11000000.10101000.00000000.00000001
IPv4DecimalCIDR, //192.168.000.001/16
IPv4BinaryCIDR, //11000000.10101000.00000000.00000001/16
}
///
/// Constructor
///
public IPAddressTextBox()
: base() {
this.InitializeComponent();
this.ResetText();
}
private void InitializeComponent() {
this.error = new System.Windows.Forms.ErrorProvider();
}
///
/// Clean up any resources being used.
///
protected override void Dispose(bool disposing) {
if (disposing) {
if (components != null)
components.Dispose();
}
base.Dispose(disposing);
}
#region Properties
#region Not allowed Properties from BaseClass
///
/// Multiline is not allowed
///
[
Category("Behavior"),
Description("Multiline is not allowed"),
DefaultValue(false),
Browsable(false)
]
public override bool Multiline {
get {
return base.Multiline;
}
set {
//base.Multiline = value;
base.Multiline = false;
}
}
[
Category("Behavior"),
Description("AllowDrop is not allowed"),
DefaultValue(false),
Browsable(false)
]
public override bool AllowDrop {
get {
return base.AllowDrop;
}
set {
//base.AllowDrop = value;
base.AllowDrop = false;
}
}
[
Category("Behavior"),
Description("AcceptsReturn is not allowed"),
DefaultValue(false),
Browsable(false)
]
public new bool AcceptsReturn {
get {
return base.AcceptsReturn;
}
set {
//base.AcceptsReturn = value;
base.AcceptsReturn = false;
}
}
[
Category("Behavior"),
Description("AcceptsTab is not allowed"),
DefaultValue(false),
Browsable(false)
]
public new bool AcceptsTab {
get {
return base.AcceptsTab;
}
set {
//base.AcceptTab = value;
base.AcceptsTab = false;
}
}
[
Category("Behavior"),
Description("CharacterCasing is not allowed"),
DefaultValue(CharacterCasing.Normal),
Browsable(false)
]
public new CharacterCasing CharacterCasing {
get {
return base.CharacterCasing;
}
set {
//base.CharacterCasing = value;
base.CharacterCasing = CharacterCasing.Normal;
}
}
[
Category("Behavior"),
Description("WordWrap is not allowed"),
DefaultValue(true),
Browsable(false)
]
public new bool WordWrap {
get {
return base.WordWrap;
}
set {
//base.WordWrap = value;
base.WordWrap = true;
}
}
///
/// Maxlength must not be changed by user
///
[
Category("Behavior"),
Description("Specifies maximum length of a String. Change is not allowed"),
DefaultValue(15),
Browsable(false)
]
public override int MaxLength {
get {
return base.MaxLength;
}
set {
//base.MaxLength = value;
base.MaxLength = this.Text.Length;
}
}
#endregion // Not allowed Properties from BaseClass
///
/// Specifies if IP-Address
///
[
Category("Appearance"),
Description("Specifies the IP-Address"),
DefaultValue(" . . . ")
]
public override string Text {
get {
return base.Text;
}
set {
try {
if (IPAddressTextBox.ValidateIP(value, this.m_newIPNotation, this.m_arlDelimeter))
base.Text = IPAddressTextBox.MakeValidSpaces(value, this.m_newIPNotation, this.m_arlDelimeter);
}
catch {
}
}
}
///
/// Specifies if Numbers should be overwritten
///
[
Category("Behavior"),
Description("Specifies if Numbers should be overwritten"),
DefaultValue(true)
]
public bool OverWriteMode {
get {
return this.m_bOverwrite;
}
set {
if (value != this.m_bOverwrite) {
this.m_bOverwrite = value;
this.OnOverWriteChanged(value);
}
}
}
///
/// Prevents leaving of Control if there is an input-error
///
[
Category("Behavior"),
Description("Prevents leaving of Control if there is an input-error"),
DefaultValue(true)
]
public bool PreventLeaveAtError {
get {
return this.m_bPreventLeave;
}
set {
if (value != this.m_bPreventLeave) {
this.m_bPreventLeave = value;
this.OnPreventLeaveChanged(value);
}
}
}
///
/// Specifies if IP-Address Notation (IPv4, IPv6, Binary, Decimal, CIDR
///
[
Category("Appearance"),
Description("Specifies if IP-Address Notation (IPv4, IPv6, Binary, Decimal, CIDR"),
DefaultValue(IPNotation.IPv4Decimal)
]
public IPNotation Notation {
get {
return this.m_ipNotation;
}
set {
if (value != this.m_ipNotation) {
try {
this.m_newIPNotation = value;
this.ChangeNotation(this.m_ipNotation, this.m_newIPNotation);
this.m_ipNotation = this.m_newIPNotation;
this.OnNotationChanged(this.m_newIPNotation);
}
catch (Exception LastError) {
System.Diagnostics.Debug.WriteLine(LastError.Message);
throw LastError;
}
}
}
}
///
/// Specifies the Errorprovider that appears at invalid IPs
///
[
Category("Appearance"),
Description("Specifies the Errorprovider that appears at invalid IPs"),
DefaultValue(false)
]
public ErrorProvider IPError {
get {
return this.error;
}
}
#endregion //Properties
#region Eventhandling
///
/// Delegate for Notation-Events
///
public delegate void NotationChangedEventHandler(IPNotation arg_newValue);
///
/// Event called if AppearanceMode Notation is changed
///
public event NotationChangedEventHandler NotationChanged;
///
/// Delegate for Bool-Properties-Events
///
public delegate void BoolPropertyChangedEventHandler(bool arg_bNewValue);
///
/// Event called if BehaviorMode OverWriteMode is changed
///
public event BoolPropertyChangedEventHandler OverWriteModeChanged;
///
/// Event called if BehaviorMode PreventLeave is changed
///
public event BoolPropertyChangedEventHandler PreventLeaveChanged;
///
/// Occures when Appearance-Mode Notation was changed
///
/// Value, Input IP-Address notation
protected virtual void OnNotationChanged(IPNotation arg_Value) {
if (this.NotationChanged != null)
this.NotationChanged(arg_Value);
}
private void ChangeNotation(IPNotation arg_oldValue, IPNotation arg_newValue) {
string sTo = "";
ArrayList arlFrom = new ArrayList(this.Text.Replace(" ", "").Split((char[])this.m_arlDelimeter.ToArray(typeof(char))));
switch (arg_newValue) {
case IPNotation.IPv4Decimal:
this.m_regexValidNumbers = new Regex("[0-9]");
this.m_arlDelimeter = new ArrayList(new char[] { '.' });
break;
case IPNotation.IPv4DecimalCIDR:
this.m_regexValidNumbers = new Regex("[0-9]");
this.m_arlDelimeter = new ArrayList(new char[] { '.', '/' });
break;
case IPNotation.IPv4Binary:
this.m_regexValidNumbers = new Regex("[01]");
this.m_arlDelimeter = new ArrayList(new char[] { '.' });
break;
case IPNotation.IPv4BinaryCIDR:
this.m_regexValidNumbers = new Regex("[01]");
this.m_arlDelimeter = new ArrayList(new char[] { '.', '/' });
break;
default:
break;
}
switch (arg_oldValue) {
case IPNotation.IPv4Decimal:
switch (arg_newValue) {
case IPNotation.IPv4Decimal:
break;
case IPNotation.IPv4DecimalCIDR:
for (int i = 0; i < arlFrom.Count; i++) {
sTo += arlFrom[i].ToString() +
//Add Slash if its the last IPPart, els add a dot
(i == arlFrom.Count - 1 ? "/ " : ".");
}
break;
case IPNotation.IPv4Binary:
for (int i = 0; i < arlFrom.Count; i++) {
//Convert Decimal to Binary
sTo += this.Dec2Bin(arlFrom[i].ToString()) +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 1 ? "" : ".");
}
break;
case IPNotation.IPv4BinaryCIDR:
for (int i = 0; i < arlFrom.Count; i++) {
//Convert Decimal to Binary
sTo += this.Dec2Bin(arlFrom[i].ToString()) +
//Add Slash if its the last IPPart, else add a dot
(i == arlFrom.Count - 1 ? "/ " : ".");
}
break;
default:
break;
}
break;
case IPNotation.IPv4DecimalCIDR:
switch (arg_newValue) {
case IPNotation.IPv4Decimal:
//do not use the last Item, its the Subnetmask
for (int i = 0; i < arlFrom.Count - 1; i++) {
sTo += arlFrom[i].ToString() +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 2 ? "" : ".");
}
break;
case IPNotation.IPv4DecimalCIDR:
break;
case IPNotation.IPv4Binary:
//do not use the last Item, its the Subnetmask
for (int i = 0; i < arlFrom.Count - 1; i++) {
//Convert Decimal to Binary
sTo += this.Dec2Bin(arlFrom[i].ToString()) +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 2 ? "" : ".");
}
break;
case IPNotation.IPv4BinaryCIDR:
//do not use the last Item, its the Subnetmask
for (int i = 0; i < arlFrom.Count - 1; i++) {
//Convert Decimal to Binary
sTo += this.Dec2Bin(arlFrom[i].ToString()) +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 2 ? "" : ".");
}
//Add Subnetmask
sTo += "/" + arlFrom[arlFrom.Count - 1];
break;
default:
break;
}
break;
case IPNotation.IPv4Binary:
switch (arg_newValue) {
case IPNotation.IPv4Decimal:
for (int i = 0; i < arlFrom.Count; i++) {
//Convert Binary to Decimal
sTo += this.Bin2Dec(arlFrom[i].ToString()) +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 1 ? "" : ".");
}
break;
case IPNotation.IPv4DecimalCIDR:
for (int i = 0; i < arlFrom.Count; i++) {
//Convert Binary to Decimal
sTo += this.Bin2Dec(arlFrom[i].ToString()) +
//Add Slash if its the last IPPart, els add a dot
(i == arlFrom.Count - 1 ? "/ " : ".");
}
break;
case IPNotation.IPv4Binary:
break;
case IPNotation.IPv4BinaryCIDR:
for (int i = 0; i < arlFrom.Count; i++) {
sTo += arlFrom[i].ToString() +
//Add Slash if its the last IPPart, else add a dot
(i == arlFrom.Count - 1 ? "/ " : ".");
}
break;
default:
break;
}
break;
case IPNotation.IPv4BinaryCIDR:
switch (arg_newValue) {
case IPNotation.IPv4Decimal:
//do not use the last Item, its the Subnetmask
for (int i = 0; i < arlFrom.Count - 1; i++) {
sTo += this.Bin2Dec(arlFrom[i].ToString()) +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 2 ? "" : ".");
}
break;
case IPNotation.IPv4DecimalCIDR:
//do not use the last Item, its the Subnetmask
for (int i = 0; i < arlFrom.Count - 1; i++) {
sTo += this.Bin2Dec(arlFrom[i].ToString()) +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 2 ? "" : ".");
}
//Add Subnetmask
sTo += "/" + arlFrom[arlFrom.Count - 1];
break;
case IPNotation.IPv4Binary:
//do not use the last Item, its the Subnetmask
for (int i = 0; i < arlFrom.Count - 1; i++) {
sTo += arlFrom[i].ToString() +
//Add Dot if its not the last IPPart, else add nothing
(i == arlFrom.Count - 2 ? "" : ".");
}
break;
case IPNotation.IPv4BinaryCIDR:
break;
default:
break;
}
break;
default:
break;
}
this.Text = sTo;
this.MaxLength = this.TextLength;
}
///
/// Occures when Behaviour-Mode OverWriteMode was changed
///
/// Value, Overwrite Numbers in Editfield or not
protected virtual void OnOverWriteChanged(bool arg_bValue) {
if (this.OverWriteModeChanged != null)
this.OverWriteModeChanged(arg_bValue);
}
///
/// Occures when Behaviour-Mode PreventLeave was changed
///
/// Value, leave control if there is an error or not
protected virtual void OnPreventLeaveChanged(bool arg_bValue) {
if (this.PreventLeaveChanged != null)
this.PreventLeaveChanged(arg_bValue);
}
#endregion //events
#region Event-Overrides
///
/// Override standard KeyDownEventHandler
/// Catches Inputs of "." and "/" to jump to next positions
///
/// KeyEventArgument
protected override void OnKeyDown(KeyEventArgs e) {
//Zeichen an die richtige stelle schreiben
int iPos = this.SelectionStart;
char[] cText = this.Text.ToCharArray();
if (e.Modifiers == Keys.None) {
if ((char.IsLetterOrDigit(Convert.ToChar(e.KeyValue)) || e.KeyCode == Keys.NumPad0)//Numpad0=96 --> `
&& iPos < this.TextLength) {
if (this.m_arlDelimeter.Contains(cText[iPos]))
iPos += 1;
this.SelectionStart = iPos;
if (this.OverWriteMode) {
if (iPos < this.TextLength)
this.SelectionLength = 1;
} else {
if (iPos < this.TextLength)
if (cText[iPos] == ' ')
this.SelectionLength = 1;
}
}
}
base.OnKeyDown(e);
}
///
/// Override standard KeyUpEventHandler
/// Catches Inputs of "." and "/" to jump to next positions
///
/// KeyEventArgument
protected override void OnKeyUp(KeyEventArgs e) {
//Zeichen an die richtige stelle schreiben
int iPos = this.SelectionStart;
char[] cText = this.Text.ToCharArray();
//Cursor hintern Punkt setzen
if ((char.IsLetterOrDigit(Convert.ToChar(e.KeyValue)) || e.KeyCode == Keys.NumPad0)//Numpad0=96 --> `
&& iPos < this.TextLength) {
if (this.m_arlDelimeter.Contains(cText[iPos]))
iPos += 1;
this.SelectionStart = iPos;
}
base.OnKeyUp(e);
}
///
/// Override standard KeyPressEventHandler
/// Catches Inputs of "." and "/" to jump to next positions
///
/// KeyPressEventArgument
protected override void OnKeyPress(KeyPressEventArgs e) {
//valid input charachters
if (char.IsControl(e.KeyChar) ||
m_regexValidNumbers.IsMatch(e.KeyChar.ToString())) {
e.Handled = false;
} else {
switch (e.KeyChar) {
case '/':
this.JumpToSlash();
break;
case '.':
case ':':
this.JumpToNextDot();
break;
default:
break;
}
e.Handled = true;
}
base.OnKeyPress(e);
}
///
/// Override standard TextChangedEventHandler
/// Looks if inserted IP-Address is valid
///
/// EventArgument
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
if (this.Text.Length == 0)
this.ResetText();
try {
if (!this.ValidateIP())
this.error.SetError(this, "Invalid IP-address");
else
this.error.SetError(this, "");
}
catch (Exception LastError) {
this.error.SetError(this, LastError.Message);
}
}
///
/// Override standard ValidatingEventHandler
/// Validates inserted IP-Address, and cancels Textbox if valid or PreventLeave=false
///
/// CancelEventArgument
protected override void OnValidating(CancelEventArgs e) {
//e.Cancel = true;//suppress cancel-signal = not validated
e.Cancel = (!this.ValidateIP() && this.m_bPreventLeave);
base.OnValidating(e);
}
#endregion //Eventhandling
#region Methods
///
/// Override standard ResetText
/// Fills Textbox with Dots and Slashes dependend on Properties
///
public override void ResetText() {
base.ResetText();
switch (this.Notation) {
case IPNotation.IPv4Decimal:
this.Text = " . . . ";
break;
case IPNotation.IPv4DecimalCIDR:
this.Text = " . . . / ";
break;
case IPNotation.IPv4Binary:
this.Text = " . . . ";
break;
case IPNotation.IPv4BinaryCIDR:
this.Text = " . . . / ";
break;
default:
break;
}
this.MaxLength = this.TextLength;
}
///
/// Window-Message Constant
///
protected const int WM_KEYDOWN = 0x0100;
///
/// Override standard PreProcessMessge
/// Catches Inputs of Backspaces and Deletes to remove IP-Digits at the right position
///
/// Process Message
public override bool PreProcessMessage(ref Message msg) {
if (msg.Msg == WM_KEYDOWN) {
Keys keyData = ((Keys)(int)msg.WParam) | ModifierKeys;
Keys keyCode = ((Keys)(int)msg.WParam);
int iPos = this.SelectionStart;
char[] cText = this.Text.ToCharArray();
switch (keyCode) {
case Keys.Delete:
if (iPos < this.TextLength) {
while (cText[iPos] == '.' || cText[iPos] == ':' || cText[iPos] == '/') {
if ((iPos += 1) >= cText.Length)
break;
}
if (iPos < this.TextLength) {
base.Text = this.Text.Substring(0, iPos) + " " + this.Text.Substring(iPos + 1);
this.SelectionStart = iPos + 1;
} else
this.SelectionStart = this.TextLength - 1;
}
return true;
case Keys.Back:
if (iPos > 0) {
while (cText[iPos - 1] == '.' || cText[iPos - 1] == ':' || cText[iPos - 1] == '/') {
if ((iPos -= 1) <= 0)
break;
}
if (iPos > 0) {
base.Text = this.Text.Substring(0, iPos - 1) + " " + this.Text.Substring(iPos);
this.SelectionStart = iPos - 1;
} else
this.SelectionStart = 0;
}
return true;
default:
break;
}
}
return base.PreProcessMessage(ref msg);
}
///
/// Returns the formatted IP-Addresses without spaces and Zeroes
///
/// IP-Address without spaces and Zeroes
public string GetPureIPAddress() {
string s = "";
ArrayList arlIP = new ArrayList(this.Text.Replace(" ", "").Split((char[])this.m_arlDelimeter.ToArray(typeof(char))));
for (int i = 0; i < arlIP.Count; i++) {
while (arlIP[i].ToString().StartsWith("0"))
arlIP[i] = arlIP[i].ToString().Substring(1);
}
s = IPAddressTextBox.MakeIP((string[])arlIP.ToArray(typeof(string)), this.m_ipNotation);
return s;
}
#endregion //Methods
#region Helperfunctions
///
/// Sets Inputcursor to Subnet-Slash
///
private void JumpToSlash() {
int iSelStart = this.Text.LastIndexOf("/");
if (iSelStart >= 0) {
this.Select(iSelStart + 1, 0);
}
}
///
/// Sets input cursour to next Dot
///
private void JumpToNextDot() {
int iSelStart = this.Text.IndexOf('.', this.SelectionStart);
if (iSelStart >= 0) {
this.Select(iSelStart + 1, 0);
} else {
iSelStart = this.Text.IndexOf(':', this.SelectionStart);
if (iSelStart >= 0) {
this.Select(iSelStart + 1, 0);
}
}
}
///
/// Converts Decimal IP-Part to Binary (default IPv6 = false)
///
/// Decimal IP-Part
/// Binary for IPv6 (has 16 digits)
/// Binary IP-Part
private string Dec2Bin(string arg_sDec) {
return this.Dec2Bin(arg_sDec, false);
}
///
/// Converts Decimal IP-Part to Binary
///
/// Decimal IP-Part
/// Binary for IPv6 (has 16 digits)
/// Binary IP-Part
private string Dec2Bin(string arg_sDec, bool arg_bIPv6) {
string sBin = (arg_bIPv6 ? "0000000000000000" : "00000000"), sSubnet = "";
arg_sDec = arg_sDec.Trim();
while (arg_sDec.Length < 3)
arg_sDec = "0" + arg_sDec;
if (arg_sDec.IndexOf("/") >= 0) {
sSubnet = arg_sDec.Substring(arg_sDec.IndexOf("/"));
arg_sDec = arg_sDec.Substring(0, arg_sDec.IndexOf("/"));
}
int iDec = Convert.ToInt32(arg_sDec, 10);
sBin = Convert.ToString(iDec, 2);
while (sBin.Length < (arg_bIPv6 ? 16 : 8))
sBin = "0" + sBin;
return sBin + sSubnet;
}
///
/// Converts Binary IP-Part to Decimal
///
/// Binary IP-Part
/// Decimal IP-Part
private string Bin2Dec(string arg_sBin) {
string sDec = "000", sSubnet = "";
arg_sBin = arg_sBin.Trim();
while (arg_sBin.Length < 8)
arg_sBin = "0" + arg_sBin;
if (arg_sBin.IndexOf("/") >= 0) {
sSubnet = arg_sBin.Substring(arg_sBin.IndexOf("/"));
arg_sBin = arg_sBin.Substring(0, arg_sBin.IndexOf("/"));
}
int iBin = Convert.ToInt32(arg_sBin, 2);
if (iBin > 255)
throw new Exception(string.Format("Can't convert Binary to Decimal IP-Address\nbin:{0} is greater than 255", iBin));
sDec = Convert.ToString(iBin, 10);
while (sDec.Length < 3)
sDec = "0" + sDec;
return sDec + sSubnet;
}
///
/// Converts Binary IP-Part to Hexadecimal
///
/// Binary IP-Part
/// Hexadecimal IP-Part
private string Bin2Hex(string arg_sBin) {
string sHex = "0000", sSubnet = "";
arg_sBin = arg_sBin.Trim();
while (arg_sBin.Length < 8)
arg_sBin = "0" + arg_sBin;
if (arg_sBin.IndexOf("/") >= 0) {
sSubnet = arg_sBin.Substring(arg_sBin.IndexOf("/"));
arg_sBin = arg_sBin.Substring(0, arg_sBin.IndexOf("/"));
}
int iBin = Convert.ToInt32(arg_sBin, 2);
sHex = Convert.ToString(iBin, 16);
while (sHex.Length < 4)
sHex = "0" + sHex;
return sHex + sSubnet;
}
///
/// Converts Hexadecimal IP-Part to Binary (default IPv6=true)
///
/// Hexadecimal IP-Part
/// Binary IP-Part
private string Hex2Bin(string arg_sHex) {
return this.Hex2Bin(arg_sHex, true);
}
///
/// Converts Hexadecimal IP-Part to Binary
///
/// Hexadecimal IP-Part
/// Binary for IPv6 (16 digits)
/// Binary IP-Part
private string Hex2Bin(string arg_sHex, bool arg_bIPv6) {
string sBin = (arg_bIPv6 ? "0000000000000000" : "00000000"), sSubnet = "";
arg_sHex = arg_sHex.Trim();
while (arg_sHex.Length < 3)
arg_sHex = "0" + arg_sHex;
if (arg_sHex.IndexOf("/") >= 0) {
sSubnet = arg_sHex.Substring(arg_sHex.IndexOf("/"));
arg_sHex = arg_sHex.Substring(0, arg_sHex.IndexOf("/"));
}
int iHex = Convert.ToInt32(arg_sHex, 16);
if (iHex > 255 && !arg_bIPv6)
throw new Exception(string.Format("Can't convert Hexadecimal to Binary IP-Address\nhex:{0} is greater than 11111111", iHex));
sBin = Convert.ToString(iHex, 2);
while (sBin.Length < (arg_bIPv6 ? 16 : 8))
sBin = "0" + sBin;
return sBin + sSubnet;
}
///
/// Converts Decimal IP-Part to Hexadecimal
///
/// Decimal IP-Part
/// Hexadecimal IP-Part
private string Dec2Hex(string arg_sDec) {
string sHex = "0000", sSubnet = "";
arg_sDec = arg_sDec.Trim();
while (arg_sDec.Length < 8)
arg_sDec = "0" + arg_sDec;
if (arg_sDec.IndexOf("/") >= 0) {
sSubnet = arg_sDec.Substring(arg_sDec.IndexOf("/"));
arg_sDec = arg_sDec.Substring(0, arg_sDec.IndexOf("/"));
}
int iDec = Convert.ToInt32(arg_sDec, 10);
sHex = Convert.ToString(iDec, 16);
while (sHex.Length < 4)
sHex = "0" + sHex;
return sHex + sSubnet;
}
///
/// Converts Hexadecimal IP-Part to Decimal
///
/// Hexadecimal IP-Part
/// Decimal IP-Part
private string Hex2Dec(string arg_sHex) {
string sDec = "000", sSubnet = "";
arg_sHex = arg_sHex.Trim();
while (arg_sHex.Length < 8)
arg_sHex = "0" + arg_sHex;
if (arg_sHex.IndexOf("/") >= 0) {
sSubnet = arg_sHex.Substring(arg_sHex.IndexOf("/"));
arg_sHex = arg_sHex.Substring(0, arg_sHex.IndexOf("/"));
}
int iHex = Convert.ToInt32(arg_sHex, 16);
if (iHex > 255)
throw new Exception(string.Format("Can't convert Hexadecimal to Decimal IP-Address\nhex:{0} is greater than 255", iHex));
sDec = Convert.ToString(iHex, 10);
while (sDec.Length < 3)
sDec = "0" + sDec;
return sDec + sSubnet;
}
///
/// Checks if IP in Textfield is valid
///
/// true/false valid/not
private bool ValidateIP() {
if (IPAddressTextBox.ValidateIP(this.Text, this.m_newIPNotation, this.m_arlDelimeter))
return true;
else
//if Control is not visible or enabled, it doesn't matter if IP is valid
return this.Enabled || this.Visible ? false : true;
}
///
/// Checks if the given String is an valid ip-address
///
/// IP-String
/// IP-notation
/// Delimeter to parse IPString
/// true/false validated/not
protected static bool ValidateIP(string arg_sIP, IPNotation arg_ipNotation, ArrayList arg_arlDelimeter) {
bool bValidated = false;
ArrayList arlIP = new ArrayList(arg_sIP.Split((char[])arg_arlDelimeter.ToArray(typeof(char))));
try {
switch (arg_ipNotation) {
case IPNotation.IPv4Decimal:
case IPNotation.IPv4Binary:
bValidated = arlIP.Count == 4;
break;
case IPNotation.IPv4DecimalCIDR:
case IPNotation.IPv4BinaryCIDR:
bValidated = arlIP.Count == 5;
break;
default:
break;
}
if (!bValidated) {
throw new Exception("IP-Address has wrong element count");
}
//don't check the 1st 2 elemnt if its IPv4 in IPv6-notation
for (int i = (arg_ipNotation.ToString().IndexOf("IPv6IPv4") == 0 ? 2 : 0);
//don't check the subnet element
i < (arg_ipNotation.ToString().IndexOf("CIDR") > 0 ? arlIP.Count - 1 : arlIP.Count);
i++) {
string sIPPart = arlIP[i].ToString().Replace(" ", "");
int iIPPart = 0;
switch (arg_ipNotation) {
case IPNotation.IPv4Decimal:
case IPNotation.IPv4DecimalCIDR:
while (sIPPart.Length < 3)
sIPPart = "0" + sIPPart;
iIPPart = Convert.ToInt32(sIPPart, 10);
if (iIPPart < 256)
bValidated = true;
else
bValidated = false;
break;
case IPNotation.IPv4Binary:
case IPNotation.IPv4BinaryCIDR:
while (sIPPart.Length < 8)
sIPPart = "0" + sIPPart;
iIPPart = Convert.ToInt32(sIPPart, 2);
if (iIPPart < 256)
bValidated = true;
else
bValidated = false;
break;
default:
break;
}
if (!bValidated) {
throw new Exception(string.Format("IP-Address element {0}({1}) has wrong format", i, sIPPart));
}
}
}
catch (Exception LastError) {
System.Diagnostics.Debug.WriteLine(LastError.Message);
bValidated = false;
throw LastError;
}
return bValidated;
}
///
/// Adds Spaces to given IP-Address, so it fits in the textfield
///
/// IP-String
/// IP-notation
/// Delimeter to parse IPString
/// IP-Address with Spaces
protected static string MakeValidSpaces(string arg_sIP, IPNotation arg_ipNotation, ArrayList arg_arlDelimeter) {
ArrayList arlIP = new ArrayList(arg_sIP.Split((char[])arg_arlDelimeter.ToArray(typeof(char))));
//don't check the 1st 2 elemnt if its IPv4 in IPv6-notation
for (int i = (arg_ipNotation.ToString().IndexOf("IPv6IPv4") == 0 ? 2 : 0);
//don't check the subnet element
i < (arg_ipNotation.ToString().IndexOf("CIDR") > 0 ? arlIP.Count - 1 : arlIP.Count);
i++) {
switch (arg_ipNotation) {
case IPNotation.IPv4Decimal:
case IPNotation.IPv4DecimalCIDR:
while (arlIP[i].ToString().Length < 3)
arlIP[i] = arlIP[i].ToString() + " ";
break;
case IPNotation.IPv4Binary:
case IPNotation.IPv4BinaryCIDR:
while (arlIP[i].ToString().Length < 8)
arlIP[i] = arlIP[i].ToString() + " ";
break;
default:
break;
}
}
return IPAddressTextBox.MakeIP((string[])arlIP.ToArray(typeof(string)), arg_ipNotation);
}
///
/// Adds Zeroes to given IP-Address, so it fits in the textfield
///
/// IP-String
/// IP-notation
/// Delimeter to parse IPString
/// IP-Address with Spaces
protected static string MakeValidZeroes(string arg_sIP, IPNotation arg_ipNotation, ArrayList arg_arlDelimeter) {
ArrayList arlIP = new ArrayList(arg_sIP.Split((char[])arg_arlDelimeter.ToArray(typeof(char))));
//don't check the 1st 2 elemnt if its IPv4 in IPv6-notation
for (int i = (arg_ipNotation.ToString().IndexOf("IPv6IPv4") == 0 ? 2 : 0);
//don't check the subnet element
i < (arg_ipNotation.ToString().IndexOf("CIDR") > 0 ? arlIP.Count - 1 : arlIP.Count);
i++) {
switch (arg_ipNotation) {
case IPNotation.IPv4Decimal:
case IPNotation.IPv4DecimalCIDR:
while (arlIP[i].ToString().Length < 3)
arlIP[i] = "0" + arlIP[i].ToString();
break;
case IPNotation.IPv4Binary:
case IPNotation.IPv4BinaryCIDR:
while (arlIP[i].ToString().Length < 8)
arlIP[i] = "0" + arlIP[i].ToString();
break;
default:
break;
}
}
return IPAddressTextBox.MakeIP((string[])arlIP.ToArray(typeof(string)), arg_ipNotation);
}
///
/// Creates IP-Addresstring from given StrignArray and Notation
///
/// String-Array with elements for IP-Address
/// Notation of IP-Address
/// IPAddress-String
protected static string MakeIP(string[] arg_sIP, IPNotation arg_ipNotation) {
string s = "";
for (int i = 0; i < arg_sIP.Length; i++) {
switch (arg_ipNotation) {
case IPNotation.IPv4Decimal:
case IPNotation.IPv4Binary:
s += (arg_sIP[i].Length > 0 ? arg_sIP[i] : "0") + (i < (arg_sIP.Length - 1) ? "." : "");
break;
case IPNotation.IPv4DecimalCIDR:
case IPNotation.IPv4BinaryCIDR:
s += (arg_sIP[i].Length > 0 ? arg_sIP[i] : "0") + (i < (arg_sIP.Length - 2) ? "." : (i < arg_sIP.Length - 1) ? "/" : "");
break;
default:
break;
}
}
return s;
}
#endregion //Helperfunctions
}
}