Files
mRemoteNG/mRemoteV1/UI/UI.Window.SSHTransfer.vb
Andreas Rehm e08c88db5f Refactoring and even more translations
* removed unneeded Imports
* renamed namespace to mRemoteNG
* changed Logfile path to %USERPROFILE%\AppData\Local\mRemoteNG\mRemoteNG.log
* fixed mRemoteNG.exe.config
* added more ignores to .gitignore
2010-05-16 19:30:27 +02:00

544 lines
26 KiB
VB.net

Imports WeifenLuo.WinFormsUI.Docking
Imports Tamir.SharpSsh
Imports System.IO
Imports System.Threading
Imports mRemoteNG.App.Runtime
Namespace UI
Namespace Window
Public Class SSHTransfer
Inherits UI.Window.Base
#Region "Form Init"
Friend WithEvents pbStatus As System.Windows.Forms.ProgressBar
Friend WithEvents btnTransfer As System.Windows.Forms.Button
Friend WithEvents txtUser As System.Windows.Forms.TextBox
Friend WithEvents txtPassword As System.Windows.Forms.TextBox
Friend WithEvents txtHost As System.Windows.Forms.TextBox
Friend WithEvents txtPort As System.Windows.Forms.TextBox
Friend WithEvents lblHost As System.Windows.Forms.Label
Friend WithEvents lblPort As System.Windows.Forms.Label
Friend WithEvents lblUser As System.Windows.Forms.Label
Friend WithEvents lblPassword As System.Windows.Forms.Label
Friend WithEvents lblProtocol As System.Windows.Forms.Label
Friend WithEvents radProtSCP As System.Windows.Forms.RadioButton
Friend WithEvents radProtSFTP As System.Windows.Forms.RadioButton
Friend WithEvents grpConnection As System.Windows.Forms.GroupBox
Friend WithEvents btnBrowse As System.Windows.Forms.Button
Friend WithEvents lblRemoteFile As System.Windows.Forms.Label
Friend WithEvents txtRemoteFile As System.Windows.Forms.TextBox
Friend WithEvents txtLocalFile As System.Windows.Forms.TextBox
Friend WithEvents lblLocalFile As System.Windows.Forms.Label
Friend WithEvents grpFiles As System.Windows.Forms.GroupBox
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(SSHTransfer))
Me.grpFiles = New System.Windows.Forms.GroupBox
Me.lblLocalFile = New System.Windows.Forms.Label
Me.txtLocalFile = New System.Windows.Forms.TextBox
Me.txtRemoteFile = New System.Windows.Forms.TextBox
Me.lblRemoteFile = New System.Windows.Forms.Label
Me.btnBrowse = New System.Windows.Forms.Button
Me.grpConnection = New System.Windows.Forms.GroupBox
Me.radProtSFTP = New System.Windows.Forms.RadioButton
Me.radProtSCP = New System.Windows.Forms.RadioButton
Me.lblProtocol = New System.Windows.Forms.Label
Me.lblPassword = New System.Windows.Forms.Label
Me.lblUser = New System.Windows.Forms.Label
Me.lblPort = New System.Windows.Forms.Label
Me.lblHost = New System.Windows.Forms.Label
Me.txtPort = New System.Windows.Forms.TextBox
Me.txtHost = New System.Windows.Forms.TextBox
Me.txtPassword = New System.Windows.Forms.TextBox
Me.txtUser = New System.Windows.Forms.TextBox
Me.btnTransfer = New System.Windows.Forms.Button
Me.pbStatus = New System.Windows.Forms.ProgressBar
Me.grpFiles.SuspendLayout()
Me.grpConnection.SuspendLayout()
Me.SuspendLayout()
'
'grpFiles
'
Me.grpFiles.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.grpFiles.Controls.Add(Me.lblLocalFile)
Me.grpFiles.Controls.Add(Me.txtLocalFile)
Me.grpFiles.Controls.Add(Me.txtRemoteFile)
Me.grpFiles.Controls.Add(Me.lblRemoteFile)
Me.grpFiles.Controls.Add(Me.btnBrowse)
Me.grpFiles.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.grpFiles.Location = New System.Drawing.Point(12, 153)
Me.grpFiles.Name = "grpFiles"
Me.grpFiles.Size = New System.Drawing.Size(668, 194)
Me.grpFiles.TabIndex = 2000
Me.grpFiles.TabStop = False
Me.grpFiles.Text = "Files"
'
'lblLocalFile
'
Me.lblLocalFile.AutoSize = True
Me.lblLocalFile.Location = New System.Drawing.Point(20, 25)
Me.lblLocalFile.Name = "lblLocalFile"
Me.lblLocalFile.Size = New System.Drawing.Size(52, 13)
Me.lblLocalFile.TabIndex = 10
Me.lblLocalFile.Text = "Local file:"
'
'txtLocalFile
'
Me.txtLocalFile.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtLocalFile.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtLocalFile.Location = New System.Drawing.Point(105, 23)
Me.txtLocalFile.Name = "txtLocalFile"
Me.txtLocalFile.Size = New System.Drawing.Size(455, 20)
Me.txtLocalFile.TabIndex = 20
'
'txtRemoteFile
'
Me.txtRemoteFile.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtRemoteFile.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtRemoteFile.Location = New System.Drawing.Point(105, 49)
Me.txtRemoteFile.Name = "txtRemoteFile"
Me.txtRemoteFile.Size = New System.Drawing.Size(542, 20)
Me.txtRemoteFile.TabIndex = 50
'
'lblRemoteFile
'
Me.lblRemoteFile.AutoSize = True
Me.lblRemoteFile.Location = New System.Drawing.Point(20, 51)
Me.lblRemoteFile.Name = "lblRemoteFile"
Me.lblRemoteFile.Size = New System.Drawing.Size(63, 13)
Me.lblRemoteFile.TabIndex = 40
Me.lblRemoteFile.Text = "Remote file:"
'
'btnBrowse
'
Me.btnBrowse.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.btnBrowse.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.btnBrowse.Location = New System.Drawing.Point(566, 21)
Me.btnBrowse.Name = "btnBrowse"
Me.btnBrowse.Size = New System.Drawing.Size(81, 23)
Me.btnBrowse.TabIndex = 30
Me.btnBrowse.Text = Global.mRemoteNG.My.Resources.Resources.strButtonBrowse
Me.btnBrowse.UseVisualStyleBackColor = True
'
'grpConnection
'
Me.grpConnection.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.grpConnection.Controls.Add(Me.radProtSFTP)
Me.grpConnection.Controls.Add(Me.radProtSCP)
Me.grpConnection.Controls.Add(Me.lblProtocol)
Me.grpConnection.Controls.Add(Me.lblPassword)
Me.grpConnection.Controls.Add(Me.lblUser)
Me.grpConnection.Controls.Add(Me.lblPort)
Me.grpConnection.Controls.Add(Me.lblHost)
Me.grpConnection.Controls.Add(Me.txtPort)
Me.grpConnection.Controls.Add(Me.txtHost)
Me.grpConnection.Controls.Add(Me.txtPassword)
Me.grpConnection.Controls.Add(Me.txtUser)
Me.grpConnection.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.grpConnection.Location = New System.Drawing.Point(12, 12)
Me.grpConnection.Name = "grpConnection"
Me.grpConnection.Size = New System.Drawing.Size(668, 135)
Me.grpConnection.TabIndex = 1000
Me.grpConnection.TabStop = False
Me.grpConnection.Text = "Connection"
'
'radProtSFTP
'
Me.radProtSFTP.AutoSize = True
Me.radProtSFTP.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.radProtSFTP.Location = New System.Drawing.Point(153, 103)
Me.radProtSFTP.Name = "radProtSFTP"
Me.radProtSFTP.Size = New System.Drawing.Size(51, 17)
Me.radProtSFTP.TabIndex = 110
Me.radProtSFTP.Text = "SFTP"
Me.radProtSFTP.UseVisualStyleBackColor = True
'
'radProtSCP
'
Me.radProtSCP.AutoSize = True
Me.radProtSCP.Checked = True
Me.radProtSCP.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.radProtSCP.Location = New System.Drawing.Point(92, 103)
Me.radProtSCP.Name = "radProtSCP"
Me.radProtSCP.Size = New System.Drawing.Size(45, 17)
Me.radProtSCP.TabIndex = 100
Me.radProtSCP.TabStop = True
Me.radProtSCP.Text = "SCP"
Me.radProtSCP.UseVisualStyleBackColor = True
'
'lblProtocol
'
Me.lblProtocol.AutoSize = True
Me.lblProtocol.Location = New System.Drawing.Point(20, 105)
Me.lblProtocol.Name = "lblProtocol"
Me.lblProtocol.Size = New System.Drawing.Size(49, 13)
Me.lblProtocol.TabIndex = 90
Me.lblProtocol.Text = "Protocol:"
'
'lblPassword
'
Me.lblPassword.AutoSize = True
Me.lblPassword.Location = New System.Drawing.Point(20, 79)
Me.lblPassword.Name = "lblPassword"
Me.lblPassword.Size = New System.Drawing.Size(56, 13)
Me.lblPassword.TabIndex = 70
Me.lblPassword.Text = "Password:"
'
'lblUser
'
Me.lblUser.AutoSize = True
Me.lblUser.Location = New System.Drawing.Point(20, 53)
Me.lblUser.Name = "lblUser"
Me.lblUser.Size = New System.Drawing.Size(32, 13)
Me.lblUser.TabIndex = 50
Me.lblUser.Text = "User:"
'
'lblPort
'
Me.lblPort.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lblPort.AutoSize = True
Me.lblPort.Location = New System.Drawing.Point(582, 27)
Me.lblPort.Name = "lblPort"
Me.lblPort.Size = New System.Drawing.Size(29, 13)
Me.lblPort.TabIndex = 30
Me.lblPort.Text = "Port:"
'
'lblHost
'
Me.lblHost.AutoSize = True
Me.lblHost.Location = New System.Drawing.Point(20, 27)
Me.lblHost.Name = "lblHost"
Me.lblHost.Size = New System.Drawing.Size(32, 13)
Me.lblHost.TabIndex = 10
Me.lblHost.Text = "Host:"
'
'txtPort
'
Me.txtPort.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtPort.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtPort.Location = New System.Drawing.Point(617, 25)
Me.txtPort.Name = "txtPort"
Me.txtPort.Size = New System.Drawing.Size(30, 20)
Me.txtPort.TabIndex = 40
'
'txtHost
'
Me.txtHost.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtHost.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtHost.Location = New System.Drawing.Point(105, 25)
Me.txtHost.Name = "txtHost"
Me.txtHost.Size = New System.Drawing.Size(471, 20)
Me.txtHost.TabIndex = 20
'
'txtPassword
'
Me.txtPassword.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtPassword.Location = New System.Drawing.Point(105, 77)
Me.txtPassword.Name = "txtPassword"
Me.txtPassword.PasswordChar = Global.Microsoft.VisualBasic.ChrW(42)
Me.txtPassword.Size = New System.Drawing.Size(471, 20)
Me.txtPassword.TabIndex = 80
'
'txtUser
'
Me.txtUser.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtUser.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtUser.Location = New System.Drawing.Point(105, 51)
Me.txtUser.Name = "txtUser"
Me.txtUser.Size = New System.Drawing.Size(471, 20)
Me.txtUser.TabIndex = 60
'
'btnTransfer
'
Me.btnTransfer.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.btnTransfer.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.btnTransfer.Image = Global.mRemoteNG.My.Resources.Resources.SSHTransfer
Me.btnTransfer.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft
Me.btnTransfer.Location = New System.Drawing.Point(597, 382)
Me.btnTransfer.Name = "btnTransfer"
Me.btnTransfer.Size = New System.Drawing.Size(83, 29)
Me.btnTransfer.TabIndex = 10000
Me.btnTransfer.Text = "Transfer"
Me.btnTransfer.TextAlign = System.Drawing.ContentAlignment.MiddleRight
Me.btnTransfer.UseVisualStyleBackColor = True
'
'pbStatus
'
Me.pbStatus.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.pbStatus.Location = New System.Drawing.Point(12, 353)
Me.pbStatus.Name = "pbStatus"
Me.pbStatus.Size = New System.Drawing.Size(668, 23)
Me.pbStatus.TabIndex = 3000
'
'SSHTransfer
'
Me.ClientSize = New System.Drawing.Size(692, 423)
Me.Controls.Add(Me.grpFiles)
Me.Controls.Add(Me.grpConnection)
Me.Controls.Add(Me.btnTransfer)
Me.Controls.Add(Me.pbStatus)
Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.Name = "SSHTransfer"
Me.TabText = Global.mRemoteNG.My.Resources.Resources.strMenuSSHFileTransfer
Me.Text = "SSH File Transfer"
Me.grpFiles.ResumeLayout(False)
Me.grpFiles.PerformLayout()
Me.grpConnection.ResumeLayout(False)
Me.grpConnection.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
#Region "Private Properties"
Private sshT As SshTransferProtocolBase
Private oDlg As OpenFileDialog
#End Region
#Region "Public Properties"
Public Property Hostname() As String
Get
Return Me.txtHost.Text
End Get
Set(ByVal value As String)
Me.txtHost.Text = value
End Set
End Property
Public Property Port() As String
Get
Return Me.txtPort.Text
End Get
Set(ByVal value As String)
Me.txtPort.Text = value
End Set
End Property
Public Property Username() As String
Get
Return Me.txtUser.Text
End Get
Set(ByVal value As String)
Me.txtUser.Text = value
End Set
End Property
Public Property Password() As String
Get
Return Me.txtPassword.Text
End Get
Set(ByVal value As String)
Me.txtPassword.Text = value
End Set
End Property
#End Region
#Region "Form Stuff"
Private Sub SSHTransfer_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ApplyLanguage()
End Sub
Private Sub ApplyLanguage()
grpFiles.Text = My.Resources.strGroupboxFiles
lblLocalFile.Text = My.Resources.strLocalFile & ":"
lblRemoteFile.Text = My.Resources.strRemoteFile & ":"
btnBrowse.Text = My.Resources.strButtonBrowse
grpConnection.Text = My.Resources.strGroupboxConnection
lblProtocol.Text = My.Resources.strLabelProtocol
lblPassword.Text = My.Resources.strLabelPassword
lblUser.Text = My.Resources.strUser & ":"
lblPort.Text = My.Resources.strLabelPort
lblHost.Text = My.Resources.strHost & ":"
btnTransfer.Text = My.Resources.strTransfer
TabText = My.Resources.strMenuSSHFileTransfer
Text = My.Resources.strMenuSSHFileTransfer
End Sub
#End Region
#Region "Private Methods"
Private Sub StartTransfer(ByVal Protocol As SSHTransferProtocol)
If AllFieldsSet() = False Then
mC.AddMessage(Messages.MessageClass.ErrorMsg, My.Resources.strPleaseFillAllFields)
Exit Sub
End If
If File.Exists(Me.txtLocalFile.Text) = False Then
mC.AddMessage(Messages.MessageClass.WarningMsg, My.Resources.strLocalFileDoesNotExist)
Exit Sub
End If
Try
If Protocol = SSHTransferProtocol.SCP Then
Me.sshT = New Scp(txtHost.Text, txtUser.Text, txtPassword.Text)
ElseIf Protocol = SSHTransferProtocol.SFTP Then
Me.sshT = New Sftp(txtHost.Text, txtUser.Text, txtPassword.Text)
End If
AddHandler sshT.OnTransferStart, AddressOf SshTransfer_Start
AddHandler sshT.OnTransferProgress, AddressOf SshTransfer_Progress
AddHandler sshT.OnTransferEnd, AddressOf SshTransfer_End
Me.sshT.Connect(Me.txtPort.Text)
LocalFile = Me.txtLocalFile.Text
RemoteFile = Me.txtRemoteFile.Text
Dim t As New Thread(AddressOf StartTransferBG)
t.IsBackground = True
t.SetApartmentState(ApartmentState.STA)
t.Start()
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, My.Resources.strSSHTransferFailed & vbNewLine & ex.Message)
Me.sshT.Close()
End Try
End Sub
Private LocalFile As String
Private RemoteFile As String
Private Sub StartTransferBG()
Try
DisableButtons()
Me.sshT.Put(LocalFile, RemoteFile)
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, My.Resources.strSSHStartTransferBG & vbNewLine & ex.Message, True)
End Try
End Sub
Private Function AllFieldsSet() As Boolean
If Me.txtHost.Text <> "" And Me.txtPort.Text <> "" And Me.txtUser.Text <> "" And Me.txtLocalFile.Text <> "" And Me.txtRemoteFile.Text <> "" Then
If Me.txtPassword.Text = "" Then
If MsgBox(My.Resources.strEmptyPasswordContinue, MsgBoxStyle.Question Or MsgBoxStyle.YesNo) = MsgBoxResult.No Then
Return False
End If
End If
If Me.txtRemoteFile.Text.EndsWith("/") Or Me.txtRemoteFile.Text.EndsWith("\") Then
Me.txtRemoteFile.Text += Me.txtLocalFile.Text.Substring(Me.txtLocalFile.Text.LastIndexOf("\") + 1)
End If
Return True
Else
Return False
End If
End Function
Private maxVal As Long
Private curVal As Long
Delegate Sub SetStatusCB()
Private Sub SetStatus()
If pbStatus.InvokeRequired Then
Dim d As New SetStatusCB(AddressOf SetStatus)
Me.pbStatus.Invoke(d)
Else
pbStatus.Maximum = maxVal
pbStatus.Value = curVal
End If
End Sub
Delegate Sub EnableButtonsCB()
Private Sub EnableButtons()
If btnTransfer.InvokeRequired Then
Dim d As New EnableButtonsCB(AddressOf EnableButtons)
Me.btnTransfer.Invoke(d)
Else
btnTransfer.Enabled = True
End If
End Sub
Delegate Sub DisableButtonsCB()
Private Sub DisableButtons()
If btnTransfer.InvokeRequired Then
Dim d As New DisableButtonsCB(AddressOf DisableButtons)
Me.btnTransfer.Invoke(d)
Else
btnTransfer.Enabled = False
End If
End Sub
Private Sub SshTransfer_Start(ByVal src As String, ByVal dst As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String)
maxVal = totalBytes
curVal = transferredBytes
SetStatus()
End Sub
Private Sub SshTransfer_Progress(ByVal src As String, ByVal dst As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String)
maxVal = totalBytes
curVal = transferredBytes
SetStatus()
End Sub
Private Sub SshTransfer_End(ByVal src As String, ByVal dst As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String)
Try
maxVal = totalBytes
curVal = transferredBytes
EnableButtons()
SetStatus()
mC.AddMessage(Messages.MessageClass.InformationMsg, My.Resources.strSSHTransferFailed)
If Me.sshT IsNot Nothing Then
Me.sshT.Close()
ElseIf Me.sshT IsNot Nothing Then
Me.sshT.Close()
End If
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, My.Resources.strSSHTransferEndFailed & vbNewLine & ex.Message, True)
End Try
End Sub
#End Region
#Region "Public Methods"
Public Sub New(ByVal Panel As DockContent)
Me.WindowType = Type.SSHTransfer
Me.DockPnl = Panel
Me.InitializeComponent()
Me.oDlg = New OpenFileDialog
Me.oDlg.Filter = "All Files (*.*)|*.*"
Me.oDlg.CheckFileExists = True
End Sub
#End Region
#Region "Form Stuff"
Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click
If Me.oDlg.ShowDialog = System.Windows.Forms.DialogResult.OK Then
If Me.oDlg.FileName <> "" Then
Me.txtLocalFile.Text = Me.oDlg.FileName
End If
End If
End Sub
Private Sub btnTransfer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTransfer.Click
If Me.radProtSCP.Checked Then
Me.StartTransfer(SSHTransferProtocol.SCP)
ElseIf Me.radProtSFTP.Checked Then
Me.StartTransfer(SSHTransferProtocol.SFTP)
End If
End Sub
#End Region
Private Enum SSHTransferProtocol
SCP = 0
SFTP = 1
End Enum
End Class
End Namespace
End Namespace