Change XmingProvider to include sessions from the registry.

This commit is contained in:
Riley McArdle
2013-10-28 01:14:59 -05:00
parent f5cde10d62
commit e96199dc37
6 changed files with 189 additions and 130 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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" />