mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-26 12:08:37 +08:00
Change XmingProvider to include sessions from the registry.
This commit is contained in:
@@ -1,21 +0,0 @@
|
||||
Imports mRemoteNG.Connection.PuttySession
|
||||
|
||||
Namespace Config.Putty
|
||||
Public Class DefaultSettingsProvider
|
||||
Inherits Provider
|
||||
|
||||
Public Overrides Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
|
||||
Dim sessionNames(0) As String
|
||||
If raw Then
|
||||
sessionNames(0) = "Default%20Settings"
|
||||
Else
|
||||
sessionNames(0) = "Default Settings"
|
||||
End If
|
||||
Return sessionNames
|
||||
End Function
|
||||
|
||||
Public Overrides Function GetSession(ByVal sessionName As String) As Info
|
||||
Return Nothing
|
||||
End Function
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
Namespace Config.Putty
|
||||
Public MustInherit Class Provider
|
||||
#Region "Public Methods"
|
||||
Private _rootTreeNode As TreeNode
|
||||
Public ReadOnly Property RootTreeNode As TreeNode
|
||||
Get
|
||||
@@ -10,26 +11,6 @@ Namespace Config.Putty
|
||||
End Get
|
||||
End Property
|
||||
|
||||
Private Delegate Function CreateRootTreeNodeDelegate() As TreeNode
|
||||
Protected Overridable Function CreateRootTreeNode() As TreeNode
|
||||
Dim treeView As TreeView = Tree.Node.TreeView
|
||||
If treeView Is Nothing Then Return Nothing
|
||||
If treeView.InvokeRequired Then
|
||||
Return treeView.Invoke(New CreateRootTreeNodeDelegate(AddressOf CreateRootTreeNode))
|
||||
End If
|
||||
|
||||
Dim newTreeNode As New TreeNode
|
||||
RootInfo.TreeNode = newTreeNode
|
||||
|
||||
newTreeNode.Name = _rootInfo.Name
|
||||
newTreeNode.Text = _rootInfo.Name
|
||||
newTreeNode.Tag = _rootInfo
|
||||
newTreeNode.ImageIndex = Images.Enums.TreeImage.PuttySessions
|
||||
newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.PuttySessions
|
||||
|
||||
Return newTreeNode
|
||||
End Function
|
||||
|
||||
Private _rootInfo As Root.PuttySessions.Info
|
||||
Public ReadOnly Property RootInfo() As Root.PuttySessions.Info
|
||||
Get
|
||||
@@ -38,24 +19,6 @@ Namespace Config.Putty
|
||||
End Get
|
||||
End Property
|
||||
|
||||
Protected Overridable Function CreateRootInfo() As Root.PuttySessions.Info
|
||||
Dim newRootInfo As New Root.PuttySessions.Info
|
||||
|
||||
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsName) Then
|
||||
newRootInfo.Name = Language.strPuttySavedSessionsRootName
|
||||
Else
|
||||
newRootInfo.Name = My.Settings.PuttySavedSessionsName
|
||||
End If
|
||||
|
||||
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsPanel) Then
|
||||
newRootInfo.Panel = Language.strGeneral
|
||||
Else
|
||||
newRootInfo.Panel = My.Settings.PuttySavedSessionsPanel
|
||||
End If
|
||||
|
||||
Return newRootInfo
|
||||
End Function
|
||||
|
||||
Public MustOverride Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
|
||||
Public MustOverride Function GetSession(ByVal sessionName As String) As Connection.PuttySession.Info
|
||||
|
||||
@@ -77,15 +40,60 @@ Namespace Config.Putty
|
||||
Public Overridable Sub StopWatcher()
|
||||
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Public Events"
|
||||
Public Event SessionChanged(ByVal sender As Object, ByVal e As SessionChangedEventArgs)
|
||||
#End Region
|
||||
|
||||
#Region "Public Classes"
|
||||
Public Class SessionChangedEventArgs
|
||||
Inherits EventArgs
|
||||
End Class
|
||||
#End Region
|
||||
|
||||
#Region "Protected Methods"
|
||||
Private Delegate Function CreateRootTreeNodeDelegate() As TreeNode
|
||||
Protected Overridable Function CreateRootTreeNode() As TreeNode
|
||||
Dim treeView As TreeView = Tree.Node.TreeView
|
||||
If treeView Is Nothing Then Return Nothing
|
||||
If treeView.InvokeRequired Then
|
||||
Return treeView.Invoke(New CreateRootTreeNodeDelegate(AddressOf CreateRootTreeNode))
|
||||
End If
|
||||
|
||||
Dim newTreeNode As New TreeNode
|
||||
RootInfo.TreeNode = newTreeNode
|
||||
|
||||
newTreeNode.Name = _rootInfo.Name
|
||||
newTreeNode.Text = _rootInfo.Name
|
||||
newTreeNode.Tag = _rootInfo
|
||||
newTreeNode.ImageIndex = Images.Enums.TreeImage.PuttySessions
|
||||
newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.PuttySessions
|
||||
|
||||
Return newTreeNode
|
||||
End Function
|
||||
|
||||
Protected Overridable Function CreateRootInfo() As Root.PuttySessions.Info
|
||||
Dim newRootInfo As New Root.PuttySessions.Info
|
||||
|
||||
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsName) Then
|
||||
newRootInfo.Name = Language.strPuttySavedSessionsRootName
|
||||
Else
|
||||
newRootInfo.Name = My.Settings.PuttySavedSessionsName
|
||||
End If
|
||||
|
||||
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsPanel) Then
|
||||
newRootInfo.Panel = Language.strGeneral
|
||||
Else
|
||||
newRootInfo.Panel = My.Settings.PuttySavedSessionsPanel
|
||||
End If
|
||||
|
||||
Return newRootInfo
|
||||
End Function
|
||||
|
||||
Protected Overridable Sub OnSessionChanged(ByVal e As SessionChangedEventArgs)
|
||||
RaiseEvent SessionChanged(Me, New SessionChangedEventArgs())
|
||||
End Sub
|
||||
|
||||
Public Class SessionChangedEventArgs
|
||||
Inherits EventArgs
|
||||
End Class
|
||||
#End Region
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
@@ -9,9 +9,7 @@ Namespace Config.Putty
|
||||
Public Class RegistryProvider
|
||||
Inherits Provider
|
||||
|
||||
Private Const PuttySessionsKey As String = "Software\SimonTatham\PuTTY\Sessions"
|
||||
Private Shared _eventWatcher As ManagementEventWatcher
|
||||
|
||||
#Region "Public Methods"
|
||||
Public Overrides Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
|
||||
Dim sessionsKey As RegistryKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey)
|
||||
If sessionsKey Is Nothing Then Return New String() {}
|
||||
@@ -25,11 +23,14 @@ Namespace Config.Putty
|
||||
End If
|
||||
Next
|
||||
|
||||
If sessionNames.Contains("Default%20Settings") Then ' Do not localize
|
||||
sessionNames.Remove("Default%20Settings")
|
||||
End If
|
||||
If sessionNames.Contains("Default Settings") Then
|
||||
sessionNames.Remove("Default Settings")
|
||||
If raw Then
|
||||
If Not sessionNames.Contains("Default%20Settings") Then ' Do not localize
|
||||
sessionNames.Insert(0, "Default%20Settings")
|
||||
End If
|
||||
Else
|
||||
If Not sessionNames.Contains("Default Settings") Then
|
||||
sessionNames.Insert(0, "Default Settings")
|
||||
End If
|
||||
End If
|
||||
|
||||
Return sessionNames.ToArray()
|
||||
@@ -103,10 +104,18 @@ Namespace Config.Putty
|
||||
_eventWatcher.Dispose()
|
||||
_eventWatcher = Nothing
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Private Fields"
|
||||
Private Const PuttySessionsKey As String = "Software\SimonTatham\PuTTY\Sessions"
|
||||
Private Shared _eventWatcher As ManagementEventWatcher
|
||||
#End Region
|
||||
|
||||
#Region "Private Methods"
|
||||
Private Sub OnManagementEventArrived(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
|
||||
OnSessionChanged(New SessionChangedEventArgs())
|
||||
End Sub
|
||||
#End Region
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
|
||||
@@ -3,21 +3,7 @@ Imports mRemoteNG.Tools
|
||||
|
||||
Namespace Config.Putty
|
||||
Public Class Sessions
|
||||
Private Shared _providers As List(Of Provider)
|
||||
Private Shared ReadOnly Property Providers() As List(Of Provider)
|
||||
Get
|
||||
If _providers Is Nothing OrElse _providers.Count = 0 Then AddProviders()
|
||||
Return _providers
|
||||
End Get
|
||||
End Property
|
||||
|
||||
Private Shared Sub AddProviders()
|
||||
_providers = New List(Of Provider)()
|
||||
_providers.Add(New DefaultSettingsProvider())
|
||||
_providers.Add(New RegistryProvider())
|
||||
_providers.Add(New XmingProvider())
|
||||
End Sub
|
||||
|
||||
#Region "Public Methods"
|
||||
Private Delegate Sub AddSessionsToTreeDelegate()
|
||||
Public Shared Sub AddSessionsToTree()
|
||||
Dim treeView As TreeView = Tree.Node.TreeView
|
||||
@@ -27,22 +13,12 @@ Namespace Config.Putty
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim puttyType As PuttyTypeDetector.PuttyType = PuttyTypeDetector.GetPuttyType()
|
||||
|
||||
For Each provider As Provider In Providers
|
||||
Dim enabled As Boolean = True
|
||||
Select Case puttyType
|
||||
Case PuttyTypeDetector.PuttyType.Xming
|
||||
If TypeOf (provider) Is RegistryProvider Then enabled = False
|
||||
Case Else
|
||||
If TypeOf (provider) Is XmingProvider Then enabled = False
|
||||
End Select
|
||||
|
||||
Dim rootTreeNode As TreeNode = provider.RootTreeNode
|
||||
Dim inUpdate As Boolean = False
|
||||
|
||||
Dim savedSessions As New List(Of Connection.Info)(provider.GetSessions())
|
||||
If Not enabled Or savedSessions Is Nothing OrElse savedSessions.Count = 0 Then
|
||||
If Not IsProviderEnabled(provider) Or savedSessions Is Nothing OrElse savedSessions.Count = 0 Then
|
||||
If rootTreeNode IsNot Nothing AndAlso treeView.Nodes.Contains(rootTreeNode) Then
|
||||
treeView.BeginUpdate()
|
||||
treeView.Nodes.Remove(rootTreeNode)
|
||||
@@ -110,14 +86,6 @@ Namespace Config.Putty
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Protected Shared Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
|
||||
Dim sessionNames As New List(Of String)
|
||||
For Each provider As Provider In Providers
|
||||
sessionNames.AddRange(provider.GetSessionNames())
|
||||
Next
|
||||
Return sessionNames.ToArray()
|
||||
End Function
|
||||
|
||||
Public Shared Sub StartWatcher()
|
||||
For Each provider As Provider In Providers
|
||||
provider.StartWatcher()
|
||||
@@ -135,7 +103,45 @@ Namespace Config.Putty
|
||||
Public Shared Sub SessionChanged(ByVal sender As Object, ByVal e As Provider.SessionChangedEventArgs)
|
||||
AddSessionsToTree()
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Private Methods"
|
||||
Private Shared _providers As List(Of Provider)
|
||||
Private Shared ReadOnly Property Providers() As List(Of Provider)
|
||||
Get
|
||||
If _providers Is Nothing OrElse _providers.Count = 0 Then AddProviders()
|
||||
Return _providers
|
||||
End Get
|
||||
End Property
|
||||
|
||||
Private Shared Sub AddProviders()
|
||||
_providers = New List(Of Provider)()
|
||||
_providers.Add(New RegistryProvider())
|
||||
_providers.Add(New XmingProvider())
|
||||
End Sub
|
||||
|
||||
Private Shared Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
|
||||
Dim sessionNames As New List(Of String)
|
||||
For Each provider As Provider In Providers
|
||||
If Not IsProviderEnabled(provider) Then Continue For
|
||||
sessionNames.AddRange(provider.GetSessionNames(raw))
|
||||
Next
|
||||
Return sessionNames.ToArray()
|
||||
End Function
|
||||
|
||||
Private Shared Function IsProviderEnabled(ByVal provider As Provider) As Boolean
|
||||
Dim enabled As Boolean = True
|
||||
Select Case PuttyTypeDetector.GetPuttyType()
|
||||
Case PuttyTypeDetector.PuttyType.Xming
|
||||
If TypeOf (provider) Is RegistryProvider Then enabled = False
|
||||
Case Else
|
||||
If TypeOf (provider) Is XmingProvider Then enabled = False
|
||||
End Select
|
||||
Return enabled
|
||||
End Function
|
||||
#End Region
|
||||
|
||||
#Region "Public Classes"
|
||||
Public Class SessionList
|
||||
Inherits StringConverter
|
||||
|
||||
@@ -157,5 +163,6 @@ Namespace Config.Putty
|
||||
Return True
|
||||
End Function
|
||||
End Class
|
||||
#End Region
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
@@ -2,30 +2,13 @@
|
||||
Imports mRemoteNG.App
|
||||
Imports mRemoteNG.Messages
|
||||
Imports mRemoteNG.Connection.Protocol
|
||||
Imports System.Text.RegularExpressions
|
||||
|
||||
Namespace Config.Putty
|
||||
Public Class XmingProvider
|
||||
Inherits Provider
|
||||
|
||||
Private Shared _eventWatcher As FileSystemWatcher
|
||||
|
||||
Private Shared Function GetPuttyConfPath() As String
|
||||
Dim puttyPath As String
|
||||
If My.Settings.UseCustomPuttyPath Then
|
||||
puttyPath = My.Settings.CustomPuttyPath
|
||||
Else
|
||||
puttyPath = Info.General.PuttyPath
|
||||
End If
|
||||
Return Path.Combine(Path.GetDirectoryName(puttyPath), "putty.conf")
|
||||
End Function
|
||||
|
||||
Private Shared Function GetSessionsFolderPath() As String
|
||||
Dim puttyConfPath As String = GetPuttyConfPath()
|
||||
Dim sessionFileReader As New PuttyConfFileReader(puttyConfPath)
|
||||
Dim basePath As String = Environment.ExpandEnvironmentVariables(sessionFileReader.GetValue("sshk&sess"))
|
||||
Return Path.Combine(basePath, "sessions")
|
||||
End Function
|
||||
|
||||
#Region "Public Methods"
|
||||
Public Overrides Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
|
||||
Dim sessionsFolderPath As String = GetSessionsFolderPath()
|
||||
If Not Directory.Exists(sessionsFolderPath) Then Return New String() {}
|
||||
@@ -40,17 +23,33 @@ Namespace Config.Putty
|
||||
End If
|
||||
Next
|
||||
|
||||
If sessionNames.Contains("Default%20Settings") Then ' Do not localize
|
||||
sessionNames.Remove("Default%20Settings")
|
||||
End If
|
||||
If sessionNames.Contains("Default Settings") Then
|
||||
sessionNames.Remove("Default Settings")
|
||||
If raw Then
|
||||
If Not sessionNames.Contains("Default%20Settings") Then ' Do not localize
|
||||
sessionNames.Insert(0, "Default%20Settings")
|
||||
End If
|
||||
Else
|
||||
If Not sessionNames.Contains("Default Settings") Then
|
||||
sessionNames.Insert(0, "Default Settings")
|
||||
End If
|
||||
End If
|
||||
|
||||
Dim registrySessionNames As New List(Of String)
|
||||
For Each sessionName As String In RegistryProvider.GetSessionNames(raw)
|
||||
registrySessionNames.Add(String.Format(RegistrySessionNameFormat, sessionName))
|
||||
Next
|
||||
|
||||
sessionNames.AddRange(registrySessionNames)
|
||||
sessionNames.Sort()
|
||||
|
||||
Return sessionNames.ToArray()
|
||||
End Function
|
||||
|
||||
Public Overrides Function GetSession(ByVal sessionName As String) As Connection.PuttySession.Info
|
||||
Dim registrySessionName As String = GetRegistrySessionName(sessionName)
|
||||
If Not String.IsNullOrEmpty(registrySessionName) Then
|
||||
Return ModifyRegistrySessionInfo(RegistryProvider.GetSession(registrySessionName))
|
||||
End If
|
||||
|
||||
Dim sessionsFolderPath As String = GetSessionsFolderPath()
|
||||
If Not Directory.Exists(sessionsFolderPath) Then Return Nothing
|
||||
|
||||
@@ -99,6 +98,9 @@ Namespace Config.Putty
|
||||
End Function
|
||||
|
||||
Public Overrides Sub StartWatcher()
|
||||
RegistryProvider.StartWatcher()
|
||||
AddHandler RegistryProvider.SessionChanged, AddressOf OnRegistrySessionChanged
|
||||
|
||||
If _eventWatcher IsNot Nothing Then Return
|
||||
|
||||
Try
|
||||
@@ -115,16 +117,70 @@ Namespace Config.Putty
|
||||
End Sub
|
||||
|
||||
Public Overrides Sub StopWatcher()
|
||||
RegistryProvider.StopWatcher()
|
||||
RemoveHandler RegistryProvider.SessionChanged, AddressOf OnRegistrySessionChanged
|
||||
|
||||
If _eventWatcher Is Nothing Then Return
|
||||
_eventWatcher.EnableRaisingEvents = False
|
||||
_eventWatcher.Dispose()
|
||||
_eventWatcher = Nothing
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Private Fields"
|
||||
Private Const RegistrySessionNameFormat As String = "{0} [registry]"
|
||||
Private Const RegistrySessionNamePattern As String = "(.*)\ \[registry\]"
|
||||
|
||||
Private Shared ReadOnly RegistryProvider As New RegistryProvider
|
||||
Private Shared _eventWatcher As FileSystemWatcher
|
||||
#End Region
|
||||
|
||||
#Region "Private Methods"
|
||||
Private Shared Function GetPuttyConfPath() As String
|
||||
Dim puttyPath As String
|
||||
If My.Settings.UseCustomPuttyPath Then
|
||||
puttyPath = My.Settings.CustomPuttyPath
|
||||
Else
|
||||
puttyPath = Info.General.PuttyPath
|
||||
End If
|
||||
Return Path.Combine(Path.GetDirectoryName(puttyPath), "putty.conf")
|
||||
End Function
|
||||
|
||||
Private Shared Function GetSessionsFolderPath() As String
|
||||
Dim puttyConfPath As String = GetPuttyConfPath()
|
||||
Dim sessionFileReader As New PuttyConfFileReader(puttyConfPath)
|
||||
Dim basePath As String = Environment.ExpandEnvironmentVariables(sessionFileReader.GetValue("sshk&sess"))
|
||||
Return Path.Combine(basePath, "sessions")
|
||||
End Function
|
||||
|
||||
Private Shared Function GetRegistrySessionName(ByVal sessionName As String) As String
|
||||
Dim regex As New Regex(RegistrySessionNamePattern)
|
||||
|
||||
Dim matches As MatchCollection = regex.Matches(sessionName)
|
||||
If matches.Count < 1 Then Return String.Empty
|
||||
|
||||
Dim groups As GroupCollection = matches(0).Groups
|
||||
If groups.Count < 1 Then Return String.Empty ' This should always include at least one item, but check anyway
|
||||
|
||||
Return groups(1).Value
|
||||
End Function
|
||||
|
||||
Private Shared Function ModifyRegistrySessionInfo(ByVal sessionInfo As Connection.PuttySession.Info) As Connection.PuttySession.Info
|
||||
sessionInfo.Name = String.Format(RegistrySessionNameFormat, sessionInfo.Name)
|
||||
sessionInfo.PuttySession = String.Format(RegistrySessionNameFormat, sessionInfo.PuttySession)
|
||||
Return sessionInfo
|
||||
End Function
|
||||
|
||||
Private Sub OnFileSystemEventArrived(ByVal sender As Object, ByVal e As FileSystemEventArgs)
|
||||
OnSessionChanged(New SessionChangedEventArgs())
|
||||
End Sub
|
||||
|
||||
Private Sub OnRegistrySessionChanged(ByVal sender As Object, ByVal e As SessionChangedEventArgs)
|
||||
OnSessionChanged(New SessionChangedEventArgs())
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Private Classes"
|
||||
Private Class PuttyConfFileReader
|
||||
Public Sub New(ByVal puttyConfFile As String)
|
||||
_puttyConfFile = puttyConfFile
|
||||
@@ -198,5 +254,6 @@ Namespace Config.Putty
|
||||
Return _sessionInfo(setting)
|
||||
End Function
|
||||
End Class
|
||||
#End Region
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
@@ -186,7 +186,6 @@
|
||||
<Compile Include="Config\Config.Settings.Providers.vb" />
|
||||
<Compile Include="Config\Config.Settings.Save.vb" />
|
||||
<Compile Include="Config\ConfirmClose.vb" />
|
||||
<Compile Include="Config\Putty\DefaultSettingsProvider.vb" />
|
||||
<Compile Include="Config\Putty\RegistryProvider.vb" />
|
||||
<Compile Include="Config\Putty\XmingProvider.vb" />
|
||||
<Compile Include="Config\Putty\Sessions.vb" />
|
||||
|
||||
Reference in New Issue
Block a user