Imports WeifenLuo.WinFormsUI.Docking Imports System.IO Imports Crownwood Imports System.Threading Namespace App Public Class Runtime #Region "Public Declarations" Public Shared sL As Config.Settings.Load Public Shared sS As Config.Settings.Save Public Shared cL As Connection.List Public Shared prevCL As Connection.List Public Shared ctL As Container.List Public Shared prevCTL As Container.List Public Shared crL As Credential.List Public Shared prevCRL As Credential.List Public Shared wL As UI.Window.List Public Shared mC As Messages.Collector Public Shared SysTrayIcon As Tools.Controls.SysTrayIcon Public Shared SysMenu As Tools.SystemMenu Public Shared log As log4net.ILog Public Shared IsUpdateAvailable As Boolean Public Shared IsAnnouncementAvailable As Boolean Public Shared ConnectionsFileLoaded As Boolean Public Shared WithEvents tmrSqlWatcher As Timers.Timer Public Shared LastSQLUpdate As Date Public Shared LastSelected As String Public Shared DefaultConnection As mRemote.Connection.Info Public Shared DefaultInheritance As mRemote.Connection.Info.Inheritance Public Shared ExtApps As New ArrayList() #End Region Public Class Windows Public Shared treeForm As UI.Window.Tree Public Shared treePanel As New DockContent Public Shared configForm As UI.Window.Config Public Shared configPanel As New DockContent Public Shared errorsForm As UI.Window.ErrorsAndInfos Public Shared errorsPanel As New DockContent Public Shared sessionsForm As UI.Window.Sessions Public Shared sessionsPanel As New DockContent Public Shared screenshotForm As UI.Window.ScreenshotManager Public Shared screenshotPanel As New DockContent Public Shared quickyForm As UI.Window.QuickConnect Public Shared quickyPanel As New DockContent Public Shared optionsForm As UI.Window.Options Public Shared optionsPanel As New DockContent Public Shared saveasForm As UI.Window.SaveAs Public Shared saveasPanel As New DockContent Public Shared aboutForm As UI.Window.About Public Shared aboutPanel As New DockContent Public Shared updateForm As UI.Window.Update Public Shared updatePanel As New DockContent Public Shared sshtransferForm As UI.Window.SSHTransfer Public Shared sshtransferPanel As New DockContent Public Shared adimportForm As UI.Window.ADImport Public Shared adimportPanel As New DockContent Public Shared helpForm As UI.Window.Help Public Shared helpPanel As New DockContent Public Shared externalappsForm As UI.Window.ExternalApps Public Shared externalappsPanel As New DockContent Public Shared portscanForm As UI.Window.PortScan Public Shared portscanPanel As New DockContent Public Shared ultravncscForm As UI.Window.UltraVNCSC Public Shared ultravncscPanel As New DockContent Public Shared componentscheckForm As UI.Window.ComponentsCheck Public Shared componentscheckPanel As New DockContent Public Shared AnnouncementForm As UI.Window.Announcement Public Shared AnnouncementPanel As New DockContent Public Shared Sub Show(ByVal WindowType As UI.Window.Type, Optional ByVal PortScanMode As Tools.PortScan.PortScanMode = Tools.PortScan.PortScanMode.Normal) Try Select Case WindowType Case UI.Window.Type.About Windows.aboutForm = New UI.Window.About(Windows.aboutPanel) Windows.aboutPanel = Windows.aboutForm Windows.aboutForm.Show(frmMain.pnlDock) Case UI.Window.Type.ADImport Windows.adimportForm = New UI.Window.ADImport(Windows.adimportPanel) Windows.adimportPanel = Windows.adimportForm Windows.adimportPanel.Show(frmMain.pnlDock) Case UI.Window.Type.Options Windows.optionsForm = New UI.Window.Options(Windows.optionsPanel) Windows.optionsPanel = Windows.optionsForm Windows.optionsForm.Show(frmMain.pnlDock) Case UI.Window.Type.SaveAs Windows.saveasForm = New UI.Window.SaveAs(Windows.saveasPanel) Windows.saveasPanel = Windows.saveasForm Windows.saveasForm.Show(frmMain.pnlDock) Case UI.Window.Type.SSHTransfer Windows.sshtransferForm = New UI.Window.SSHTransfer(Windows.sshtransferPanel) Windows.sshtransferPanel = Windows.sshtransferForm Windows.sshtransferForm.Show(frmMain.pnlDock) Case UI.Window.Type.Update Windows.updateForm = New UI.Window.Update(Windows.updatePanel) Windows.updatePanel = Windows.updateForm Windows.updateForm.Show(frmMain.pnlDock) Case UI.Window.Type.Help Windows.helpForm = New UI.Window.Help(Windows.helpPanel) Windows.helpPanel = Windows.helpForm Windows.helpForm.Show(frmMain.pnlDock) Case UI.Window.Type.ExternalApps Windows.externalappsForm = New UI.Window.ExternalApps(Windows.externalappsPanel) Windows.externalappsPanel = Windows.externalappsForm Windows.externalappsForm.Show(frmMain.pnlDock) Case UI.Window.Type.PortScan Windows.portscanForm = New UI.Window.PortScan(Windows.portscanPanel, PortScanMode) Windows.portscanPanel = Windows.portscanForm Windows.portscanForm.Show(frmMain.pnlDock) Case UI.Window.Type.UltraVNCSC Windows.ultravncscForm = New UI.Window.UltraVNCSC(Windows.ultravncscPanel) Windows.ultravncscPanel = Windows.ultravncscForm Windows.ultravncscForm.Show(frmMain.pnlDock) Case UI.Window.Type.ComponentsCheck Windows.componentscheckForm = New UI.Window.ComponentsCheck(Windows.componentscheckPanel) Windows.componentscheckPanel = Windows.componentscheckForm Windows.componentscheckForm.Show(frmMain.pnlDock) Case UI.Window.Type.Announcement Windows.AnnouncementForm = New UI.Window.Announcement(AnnouncementPanel) Windows.AnnouncementPanel = Windows.AnnouncementForm Windows.AnnouncementForm.Show(frmMain.pnlDock) End Select Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Show (App.Runtime.Windows) failed" & vbNewLine & ex.Message, True) End Try End Sub End Class Public Class Screens Public Shared Sub SendFormToScreen(ByVal Screen As Screen) Dim wasMax As Boolean If frmMain.WindowState = FormWindowState.Maximized Then wasMax = True frmMain.WindowState = FormWindowState.Normal End If frmMain.Location = Screen.Bounds.Location If wasMax Then frmMain.WindowState = FormWindowState.Maximized End If End Sub Public Shared Sub SendPanelToScreen(ByVal Panel As DockContent, ByVal Screen As Screen) Panel.DockState = DockState.Float Panel.ParentForm.Left = Screen.Bounds.Location.X Panel.ParentForm.Top = Screen.Bounds.Location.Y End Sub End Class Public Class Startup Public Shared Sub CreatePanels() Windows.configForm = New UI.Window.Config(Windows.configPanel) Windows.configPanel = Windows.configForm Windows.treeForm = New UI.Window.Tree(Windows.treePanel) Windows.treePanel = Windows.treeForm Tree.Node.TreeView = Windows.treeForm.tvConnections Windows.errorsForm = New UI.Window.ErrorsAndInfos(Windows.errorsPanel) Windows.errorsPanel = Windows.errorsForm Windows.sessionsForm = New UI.Window.Sessions(Windows.sessionsPanel) Windows.sessionsPanel = Windows.sessionsForm Windows.screenshotForm = New UI.Window.ScreenshotManager(Windows.screenshotPanel) Windows.screenshotPanel = Windows.screenshotForm Windows.quickyForm = New UI.Window.QuickConnect(Windows.quickyPanel) Windows.quickyPanel = Windows.quickyForm Windows.updateForm = New UI.Window.Update(Windows.updatePanel) Windows.updatePanel = Windows.updateForm Windows.AnnouncementForm = New UI.Window.Announcement(Windows.AnnouncementPanel) Windows.AnnouncementPanel = Windows.AnnouncementForm End Sub Public Shared Sub SetDefaultLayout() frmMain.pnlDock.Visible = False Windows.configPanel.Show(frmMain.pnlDock, DockState.DockLeft) Windows.treePanel.Show(frmMain.pnlDock, DockState.DockLeft) For Each pane As DockPane In frmMain.pnlDock.Panes If pane.DockState = DockState.DockLeft Then Windows.treePanel.DockTo(pane, DockStyle.Top, 0) Exit For End If Next Windows.errorsPanel.Show(frmMain.pnlDock, DockState.DockBottomAutoHide) Windows.sessionsPanel.Show(frmMain.pnlDock, DockState.DockBottomAutoHide) Windows.screenshotPanel.Show(frmMain.pnlDock, DockState.DockBottomAutoHide) Windows.screenshotForm.Hide() Windows.quickyPanel.Show(frmMain.pnlDock, DockState.DockBottomAutoHide) Windows.quickyForm.Hide() frmMain.pnlDock.Visible = True End Sub Public Shared Sub GetConnectionIcons() Dim iPath As String = My.Application.Info.DirectoryPath & "\Icons\" If Directory.Exists(iPath) = False Then Exit Sub End If For Each f As String In Directory.GetFiles(iPath, "*.ico", SearchOption.AllDirectories) Dim fInfo As New FileInfo(f) Array.Resize(Connection.Icon.Icons, Connection.Icon.Icons.Length + 1) Connection.Icon.Icons.SetValue(fInfo.Name.Replace(".ico", ""), Connection.Icon.Icons.Length - 1) Next End Sub Public Shared Sub GetPuttySessions() Connection.PuttySession.PuttySessions = Connection.Protocol.PuttyBase.GetSessions() End Sub Public Shared Sub CreateLogger() log4net.Config.XmlConfigurator.Configure(New FileInfo("mRemote.exe.config")) log = log4net.LogManager.GetLogger("mRemoteNG.Log") End Sub Public Shared Sub UpdateCheck() If My.Settings.CheckForUpdatesAsked And My.Settings.CheckForUpdatesOnStartup Then If My.Settings.UpdatePending Or My.Settings.CheckForUpdatesLastCheck < Date.Now.Subtract(TimeSpan.FromDays(My.Settings.CheckForUpdatesFrequencyDays)) Then frmMain.tmrShowUpdate.Enabled = True Windows.updateForm.CheckForUpdate() AddHandler Windows.updateForm.UpdateCheckCompleted, AddressOf UpdateCheckComplete End If End If End Sub Private Shared Sub UpdateCheckComplete(ByVal UpdateAvailable As Boolean) My.Settings.CheckForUpdatesLastCheck = Date.Now My.Settings.UpdatePending = UpdateAvailable IsUpdateAvailable = UpdateAvailable End Sub Public Shared Sub AnnouncementCheck() If My.Settings.CheckForUpdatesAsked And My.Settings.CheckForUpdatesOnStartup And App.Editions.Spanlink.Enabled = False Then If My.Settings.CheckForUpdatesLastCheck < Date.Now.Subtract(TimeSpan.FromDays(My.Settings.CheckForUpdatesFrequencyDays)) Then frmMain.tmrShowUpdate.Enabled = True Windows.AnnouncementForm.CheckForAnnouncement() AddHandler Windows.AnnouncementForm.AnnouncementCheckCompleted, AddressOf AnnouncementCheckComplete End If End If End Sub Private Shared Sub AnnouncementCheckComplete(ByVal AnnouncementAvailable As Boolean) My.Settings.CheckForUpdatesLastCheck = Date.Now IsAnnouncementAvailable = AnnouncementAvailable End Sub Public Shared Sub ParseCommandLineArgs() Try Dim cmd As New Tools.Misc.CMDArguments(Environment.GetCommandLineArgs) Dim ConsParam As String = "" If cmd("cons") IsNot Nothing Then ConsParam = "cons" End If If cmd("c") IsNot Nothing Then ConsParam = "c" End If Dim ResetPosParam As String = "" If cmd("resetpos") IsNot Nothing Then ResetPosParam = "resetpos" End If If cmd("rp") IsNot Nothing Then ResetPosParam = "rp" End If Dim ResetPanelsParam As String = "" If cmd("resetpanels") IsNot Nothing Then ResetPanelsParam = "resetpanels" End If If cmd("rpnl") IsNot Nothing Then ResetPanelsParam = "rpnl" End If Dim ResetToolbarsParam As String = "" If cmd("resettoolbar") IsNot Nothing Then ResetToolbarsParam = "resettoolbar" End If If cmd("rtbr") IsNot Nothing Then ResetToolbarsParam = "rtbr" End If If cmd("reset") IsNot Nothing Then ResetPosParam = "rp" ResetPanelsParam = "rpnl" ResetToolbarsParam = "rtbr" End If Dim NoReconnectParam As String = "" If cmd("noreconnect") IsNot Nothing Then NoReconnectParam = "noreconnect" End If If cmd("norc") IsNot Nothing Then NoReconnectParam = "norc" End If If ConsParam <> "" Then If File.Exists(cmd(ConsParam)) = False Then If File.Exists(My.Application.Info.DirectoryPath & "\" & cmd(ConsParam)) Then My.Settings.LoadConsFromCustomLocation = True My.Settings.CustomConsPath = My.Application.Info.DirectoryPath & "\" & cmd(ConsParam) Exit Sub ElseIf File.Exists(App.Info.Connections.DefaultConnectionsPath & "\" & cmd(ConsParam)) Then My.Settings.LoadConsFromCustomLocation = True My.Settings.CustomConsPath = App.Info.Connections.DefaultConnectionsPath & "\" & cmd(ConsParam) Exit Sub End If Else My.Settings.LoadConsFromCustomLocation = True My.Settings.CustomConsPath = cmd(ConsParam) Exit Sub End If End If If ResetPosParam <> "" Then My.Settings.MainFormKiosk = False My.Settings.MainFormLocation = New Point(999, 999) My.Settings.MainFormSize = New Size(900, 600) My.Settings.MainFormState = FormWindowState.Normal End If If ResetPanelsParam <> "" Then My.Settings.ResetPanels = True End If If NoReconnectParam <> "" Then My.Settings.NoReconnect = True End If If ResetToolbarsParam <> "" Then My.Settings.ResetToolbars = True End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't parse command line args" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub CreateSQLUpdateHandlerAndStartTimer() If My.Settings.UseSQLServer = True Then AddHandler Tools.Misc.SQLUpdateCheckFinished, AddressOf SQLUpdateCheckFinished tmrSqlWatcher = New Timers.Timer(3000) tmrSqlWatcher.Start() End If End Sub Public Shared Sub DestroySQLUpdateHandlerAndStopTimer() Try LastSQLUpdate = Nothing RemoveHandler Tools.Misc.SQLUpdateCheckFinished, AddressOf SQLUpdateCheckFinished tmrSqlWatcher.Stop() tmrSqlWatcher.Close() Catch ex As Exception End Try End Sub End Class Public Class Shutdown Public Shared Sub Quit() frmMain.Close() End Sub Public Shared Sub BeforeQuit() Try If App.Runtime.SysTrayIcon IsNot Nothing Then If App.Runtime.SysTrayIcon.Disposed = False Then App.Runtime.SysTrayIcon.Dispose() End If End If If My.Settings.SaveConsOnExit Then SaveConnections() End If If Editions.Spanlink.Enabled Then If SaveReport() Then File.Delete(My.Application.Info.DirectoryPath & "\Report.log") End If End If sS.Save() Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't save settings or dispose SysTray Icon" & vbNewLine & ex.Message, True) End Try End Sub End Class #Region "Default Connection" Public Shared Function DefaultConnectionFromSettings() As mRemote.Connection.Info DefaultConnection = New mRemote.Connection.Info DefaultConnection.IsDefault = True Return DefaultConnection End Function Public Shared Sub DefaultConnectionToSettings() With DefaultConnection My.Settings.ConDefaultDescription = .Description My.Settings.ConDefaultIcon = .Icon My.Settings.ConDefaultPanel = .Panel My.Settings.ConDefaultUsername = .Username My.Settings.ConDefaultPassword = .Password My.Settings.ConDefaultDomain = .Domain My.Settings.ConDefaultProtocol = .Protocol.ToString My.Settings.ConDefaultPuttySession = .PuttySession My.Settings.ConDefaultICAEncryptionStrength = .ICAEncryption.ToString My.Settings.ConDefaultRDPAuthenticationLevel = .RDPAuthenticationLevel.ToString My.Settings.ConDefaultUseConsoleSession = .UseConsoleSession My.Settings.ConDefaultRenderingEngine = .RenderingEngine.ToString My.Settings.ConDefaultResolution = .Resolution.ToString My.Settings.ConDefaultColors = .Colors.ToString My.Settings.ConDefaultCacheBitmaps = .CacheBitmaps My.Settings.ConDefaultDisplayWallpaper = .DisplayWallpaper My.Settings.ConDefaultDisplayThemes = .DisplayThemes My.Settings.ConDefaultRedirectKeys = .RedirectKeys My.Settings.ConDefaultRedirectDiskDrives = .RedirectDiskDrives My.Settings.ConDefaultRedirectPrinters = .RedirectPrinters My.Settings.ConDefaultRedirectPorts = .RedirectPorts My.Settings.ConDefaultRedirectSmartCards = .RedirectSmartCards My.Settings.ConDefaultRedirectSound = .RedirectSound.ToString My.Settings.ConDefaultPreExtApp = .PreExtApp My.Settings.ConDefaultPostExtApp = .PostExtApp My.Settings.ConDefaultMacAddress = .MacAddress My.Settings.ConDefaultUserField = .UserField My.Settings.ConDefaultVNCAuthMode = .VNCAuthMode.ToString My.Settings.ConDefaultVNCColors = .VNCColors.ToString My.Settings.ConDefaultVNCCompression = .VNCCompression.ToString My.Settings.ConDefaultVNCEncoding = .VNCEncoding.ToString My.Settings.ConDefaultVNCProxyIP = .VNCProxyIP My.Settings.ConDefaultVNCProxyPassword = .VNCProxyPassword My.Settings.ConDefaultVNCProxyPort = .VNCProxyPort My.Settings.ConDefaultVNCProxyType = .VNCProxyType.ToString My.Settings.ConDefaultVNCProxyUsername = .VNCProxyUsername My.Settings.ConDefaultVNCSmartSizeMode = .VNCSmartSizeMode.ToString My.Settings.ConDefaultVNCViewOnly = .VNCViewOnly My.Settings.ConDefaultExtApp = .ExtApp End With End Sub #End Region #Region "Default Inheritance" Public Shared Function DefaultInheritanceFromSettings() As mRemote.Connection.Info.Inheritance DefaultInheritance = New mRemote.Connection.Info.Inheritance(Nothing) DefaultInheritance.IsDefault = True Return DefaultInheritance End Function Public Shared Sub DefaultInheritanceToSettings() With DefaultInheritance My.Settings.InhDefaultDescription = .Description My.Settings.InhDefaultIcon = .Icon My.Settings.InhDefaultPanel = .Panel My.Settings.InhDefaultUsername = .Username My.Settings.InhDefaultPassword = .Password My.Settings.InhDefaultDomain = .Domain My.Settings.InhDefaultProtocol = .Protocol My.Settings.InhDefaultPort = .Port My.Settings.InhDefaultPuttySession = .PuttySession My.Settings.InhDefaultUseConsoleSession = .UseConsoleSession My.Settings.InhDefaultRenderingEngine = .RenderingEngine My.Settings.InhDefaultICAEncryptionStrength = .ICAEncryption My.Settings.InhDefaultRDPAuthenticationLevel = .RDPAuthenticationLevel My.Settings.InhDefaultResolution = .Resolution My.Settings.InhDefaultColors = .Colors My.Settings.InhDefaultCacheBitmaps = .CacheBitmaps My.Settings.InhDefaultDisplayWallpaper = .DisplayWallpaper My.Settings.InhDefaultDisplayThemes = .DisplayThemes My.Settings.InhDefaultRedirectKeys = .RedirectKeys My.Settings.InhDefaultRedirectDiskDrives = .RedirectDiskDrives My.Settings.InhDefaultRedirectPrinters = .RedirectPrinters My.Settings.InhDefaultRedirectPorts = .RedirectPorts My.Settings.InhDefaultRedirectSmartCards = .RedirectSmartCards My.Settings.InhDefaultRedirectSound = .RedirectSound My.Settings.InhDefaultPreExtApp = .PreExtApp My.Settings.InhDefaultPostExtApp = .PostExtApp My.Settings.InhDefaultMacAddress = .MacAddress My.Settings.InhDefaultUserField = .UserField My.Settings.InhDefaultVNCAuthMode = .VNCAuthMode My.Settings.InhDefaultVNCColors = .VNCColors My.Settings.InhDefaultVNCCompression = .VNCCompression My.Settings.InhDefaultVNCEncoding = .VNCEncoding My.Settings.InhDefaultVNCProxyIP = .VNCProxyIP My.Settings.InhDefaultVNCProxyPassword = .VNCProxyPassword My.Settings.InhDefaultVNCProxyPort = .VNCProxyPort My.Settings.InhDefaultVNCProxyType = .VNCProxyType My.Settings.InhDefaultVNCProxyUsername = .VNCProxyUsername My.Settings.InhDefaultVNCSmartSizeMode = .VNCSmartSizeMode My.Settings.InhDefaultVNCViewOnly = .VNCViewOnly My.Settings.InhDefaultExtApp = .ExtApp End With End Sub #End Region #Region "Panels" Public Shared Function AddPanel(Optional ByVal Title As String = Language.Base.NewPanel, Optional ByVal NoTabber As Boolean = False) As Form Try Dim pnlcForm As New DockContent Dim cForm As New UI.Window.Connection(pnlcForm) pnlcForm = cForm 'create context menu Dim cMen As New ContextMenuStrip 'create rename item Dim cMenRen As New ToolStripMenuItem cMenRen.Text = Language.Base.Rename cMenRen.Image = My.Resources.Rename cMenRen.Tag = pnlcForm AddHandler cMenRen.Click, AddressOf cMenConnectionPanelRename_Click Dim cMenScreens As New ToolStripMenuItem cMenScreens.Text = Language.Base.SendTo cMenScreens.Image = My.Resources.Monitor cMenScreens.Tag = pnlcForm cMenScreens.DropDownItems.Add("Dummy") AddHandler cMenScreens.DropDownOpening, AddressOf cMenConnectionPanelScreens_DropDownOpening cMen.Items.AddRange(New ToolStripMenuItem() {cMenRen, cMenScreens}) pnlcForm.TabPageContextMenuStrip = cMen TryCast(cForm, UI.Window.Connection).SetFormText(Title.Replace("&", "&&")) pnlcForm.Show(frmMain.pnlDock, DockState.Document) If NoTabber = True Then TryCast(cForm, UI.Window.Connection).TabController.Dispose() End If If NoTabber = False Then wL.Add(cForm) End If Return cForm Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't add panel" & vbNewLine & ex.Message) Return Nothing End Try End Function Private Shared Sub cMenConnectionPanelRename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Try Dim conW As UI.Window.Connection conW = sender.Tag Dim nTitle As String = InputBox(Language.Base.NewTitle & ":", , sender.Tag.Text.Replace("&&", "&")) If nTitle <> "" Then conW.SetFormText(nTitle.Replace("&", "&&")) End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't rename panel" & vbNewLine & ex.Message) End Try End Sub Private Shared Sub cMenConnectionPanelScreens_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Try Dim cMenScreens As ToolStripMenuItem = sender cMenScreens.DropDownItems.Clear() For i As Integer = 0 To Screen.AllScreens.Length - 1 Dim cMenScreen As New ToolStripMenuItem(Language.Base.Screen & " " & i + 1) cMenScreen.Tag = New ArrayList cMenScreen.Image = My.Resources.Monitor_GoTo TryCast(cMenScreen.Tag, ArrayList).Add(Screen.AllScreens(i)) TryCast(cMenScreen.Tag, ArrayList).Add(cMenScreens.Tag) AddHandler cMenScreen.Click, AddressOf cMenConnectionPanelScreen_Click cMenScreens.DropDownItems.Add(cMenScreen) Next Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't enumerate screens" & vbNewLine & ex.Message) End Try End Sub Private Shared Sub cMenConnectionPanelScreen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Try Dim screen As Screen = TryCast(sender, ToolStripMenuItem).Tag(0) Dim panel As DockContent = TryCast(sender, ToolStripMenuItem).Tag(1) Screens.SendPanelToScreen(panel, screen) Catch ex As Exception End Try End Sub #End Region #Region "Credential Loading/Saving" Public Shared Sub LoadCredentials() End Sub #End Region #Region "Connections Loading/Saving" Public Shared Sub NewConnections() Try cL = New Connection.List ctL = New Container.List Dim conL As New Config.Connections.Load If File.Exists(App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile) = False Then If Directory.Exists(App.Info.Connections.DefaultConnectionsPath) = False Then Directory.CreateDirectory(App.Info.Connections.DefaultConnectionsPath) End If File.Copy(My.Application.Info.DirectoryPath & "\" & App.Info.Connections.DefaultConnectionsFileNew, App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile) conL.ConnectionFileName = App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile My.Settings.LoadConsFromCustomLocation = False Else Dim lD As SaveFileDialog = Tools.Controls.ConnectionsSaveAsDialog If lD.ShowDialog = System.Windows.Forms.DialogResult.OK Then File.Copy(My.Application.Info.DirectoryPath & "\" & App.Info.Connections.DefaultConnectionsFileNew, lD.FileName, True) conL.ConnectionFileName = lD.FileName If conL.ConnectionFileName = App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile Then My.Settings.LoadConsFromCustomLocation = False Else My.Settings.LoadConsFromCustomLocation = True My.Settings.CustomConsPath = conL.ConnectionFileName End If Else Exit Sub End If End If conL.ConnectionList = cL conL.ContainerList = ctL conL.Import = False Tree.Node.ResetTree() conL.RootTreeNode = Windows.treeForm.tvConnections.Nodes(0) conL.Load() Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't create new connections file" & vbNewLine & ex.Message) End Try End Sub Private Shared Sub LoadConnectionsBG(Optional ByVal WithDialog As Boolean = False, Optional ByVal Update As Boolean = False) _WithDialog = False _LoadUpdate = True Dim t As New Thread(AddressOf LoadConnectionsBGd) t.Start() End Sub Private Shared _WithDialog As Boolean = False Private Shared _LoadUpdate As Boolean = False Private Shared Sub LoadConnectionsBGd() LoadConnections(_WithDialog, _LoadUpdate) End Sub Public Shared Sub LoadConnections(Optional ByVal WithDialog As Boolean = False, Optional ByVal Update As Boolean = False) Try Dim tmrWasEnabled As Boolean If tmrSqlWatcher IsNot Nothing Then tmrWasEnabled = tmrSqlWatcher.Enabled If tmrSqlWatcher.Enabled = True Then tmrSqlWatcher.Stop() End If End If If cL IsNot Nothing And ctL IsNot Nothing Then prevCL = cL.Copy prevCTL = ctL.Copy End If cL = New Connection.List ctL = New Container.List Dim conL As New Config.Connections.Load If My.Settings.UseSQLServer = False Then If WithDialog Then Dim lD As OpenFileDialog = Tools.Controls.ConnectionsLoadDialog If lD.ShowDialog = System.Windows.Forms.DialogResult.OK Then conL.ConnectionFileName = lD.FileName If conL.ConnectionFileName = App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile Then My.Settings.LoadConsFromCustomLocation = False Else My.Settings.LoadConsFromCustomLocation = True My.Settings.CustomConsPath = conL.ConnectionFileName End If Else Exit Sub End If Else If My.Settings.LoadConsFromCustomLocation = False Then conL.ConnectionFileName = App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile Else conL.ConnectionFileName = My.Settings.CustomConsPath End If End If If File.Exists(conL.ConnectionFileName) = False Then If WithDialog Then mC.AddMessage(Messages.MessageClass.WarningMsg, "Connections file could not be loaded!" & vbNewLine & "Location was: " & conL.ConnectionFileName) Else mC.AddMessage(Messages.MessageClass.InformationMsg, "Connections file could not be loaded!" & vbNewLine & "Location was: " & conL.ConnectionFileName & vbNewLine & "Starting with new connections file.") App.Runtime.NewConnections() End If Exit Sub End If Try If App.Editions.Spanlink.Enabled = False Then File.Copy(conL.ConnectionFileName, conL.ConnectionFileName & "_BAK", True) End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.WarningMsg, "Couldn't create backup of connections file" & vbNewLine & vbNewLine & ex.Message) End Try End If conL.ConnectionList = cL conL.ContainerList = ctL If prevCL IsNot Nothing And prevCTL IsNot Nothing Then conL.PreviousConnectionList = prevCL conL.PreviousContainerList = prevCTL End If If Update = True Then conL.PreviousSelected = LastSelected End If conL.Import = False Tree.Node.ResetTree() conL.RootTreeNode = Windows.treeForm.tvConnections.Nodes(0) conL.UseSQL = My.Settings.UseSQLServer conL.SQLHost = My.Settings.SQLHost conL.SQLUsername = My.Settings.SQLUser conL.SQLPassword = Security.Crypt.Decrypt(My.Settings.SQLPass, App.Info.General.EncryptionKey) conL.SQLUpdate = Update conL.Load() If My.Settings.UseSQLServer = True Then LastSQLUpdate = Now End If If tmrWasEnabled And tmrSqlWatcher IsNot Nothing Then tmrSqlWatcher.Start() End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't load connections file" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub ImportConnections() Try Dim lD As OpenFileDialog = Tools.Controls.ConnectionsLoadDialog lD.Multiselect = True If lD.ShowDialog = DialogResult.OK Then Dim nNode As TreeNode = Nothing For i As Integer = 0 To lD.FileNames.Length - 1 nNode = Tree.Node.AddNode(Tree.Node.Type.Container, "Import #" & i) Dim nContI As New mRemote.Container.Info() nContI.TreeNode = nNode nContI.ConnectionInfo = New mRemote.Connection.Info(nContI) If Tree.Node.SelectedNode IsNot Nothing Then If Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Container Then nContI.Parent = Tree.Node.SelectedNode.Tag End If End If nNode.Tag = nContI ctL.Add(nContI) Dim conL As New Config.Connections.Load conL.ConnectionFileName = lD.FileNames(i) conL.RootTreeNode = nNode conL.Import = True conL.ConnectionList = App.Runtime.cL conL.ContainerList = App.Runtime.ctL conL.Load() Windows.treeForm.tvConnections.SelectedNode.Nodes.Add(nNode) Next End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't import connections file" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub ImportConnectionsFromRDPFiles() Try Dim lD As OpenFileDialog = Tools.Controls.ConnectionsRDPImportDialog lD.Multiselect = True If lD.ShowDialog = DialogResult.OK Then For i As Integer = 0 To lD.FileNames.Length - 1 Dim lines As String() = File.ReadAllLines(lD.FileNames(i)) Dim nNode As TreeNode = Tree.Node.AddNode(Tree.Node.Type.Connection, Path.GetFileNameWithoutExtension(lD.FileNames(i))) Dim nConI As New mRemote.Connection.Info() nConI.Inherit = New Connection.Info.Inheritance(nConI) nConI.Name = nNode.Text For Each l As String In lines Dim pName As String = l.Substring(0, l.IndexOf(":")) Dim pValue As String = l.Substring(l.LastIndexOf(":") + 1) Select Case LCase(pName) Case "full address" nConI.Hostname = pValue Case "server port" nConI.Port = pValue Case "username" nConI.Username = pValue Case "domain" nConI.Domain = pValue Case "session bpp" Select Case pValue Case 8 nConI.Colors = Connection.Protocol.RDP.RDPColors.Colors256 Case 16 nConI.Colors = Connection.Protocol.RDP.RDPColors.Colors16Bit Case 24 nConI.Colors = Connection.Protocol.RDP.RDPColors.Colors24Bit Case 32 nConI.Colors = Connection.Protocol.RDP.RDPColors.Colors32Bit End Select Case "bitmapcachepersistenable" If pValue = 1 Then nConI.CacheBitmaps = True Else nConI.CacheBitmaps = False End If Case "screen mode id" If pValue = 2 Then nConI.Resolution = Connection.Protocol.RDP.RDPResolutions.Fullscreen Else nConI.Resolution = Connection.Protocol.RDP.RDPResolutions.FitToWindow End If Case "connect to console" If pValue = 1 Then nConI.UseConsoleSession = True End If Case "disable wallpaper" If pValue = 1 Then nConI.DisplayWallpaper = True Else nConI.DisplayWallpaper = False End If Case "disable themes" If pValue = 1 Then nConI.DisplayThemes = True Else nConI.DisplayThemes = False End If Case "redirectsmartcards" If pValue = 1 Then nConI.RedirectSmartCards = True Else nConI.RedirectSmartCards = False End If Case "redirectdrives" If pValue = 1 Then nConI.RedirectDiskDrives = True Else nConI.RedirectDiskDrives = False End If Case "redirectcomports" If pValue = 1 Then nConI.RedirectPorts = True Else nConI.RedirectPorts = False End If Case "redirectprinters" If pValue = 1 Then nConI.RedirectPrinters = True Else nConI.RedirectPrinters = False End If Case "audiomode" Select Case pValue Case 0 nConI.RedirectSound = Connection.Protocol.RDP.RDPSounds.BringToThisComputer Case 1 nConI.RedirectSound = Connection.Protocol.RDP.RDPSounds.LeaveAtRemoteComputer Case 2 nConI.RedirectSound = Connection.Protocol.RDP.RDPSounds.DoNotPlay End Select End Select Next nNode.Tag = nConI Windows.treeForm.tvConnections.SelectedNode.Nodes.Add(nNode) If Tree.Node.GetNodeType(nNode.Parent) = Tree.Node.Type.Container Then nConI.Parent = nNode.Parent.Tag End If cL.Add(nConI) Next End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't import rdp file" & vbNewLine & vbNewLine & ex.Message) End Try End Sub Public Shared Sub ImportConnectionsFromPortScan(ByVal Hosts As ArrayList, ByVal Protocol As mRemote.Connection.Protocol.Protocols) For Each Host As Tools.PortScan.ScanHost In Hosts Dim finalProt As mRemote.Connection.Protocol.Protocols Dim protOK As Boolean = False Dim nNode As TreeNode = Tree.Node.AddNode(Tree.Node.Type.Connection, Host.HostNameWithoutDomain) Dim nConI As New mRemote.Connection.Info() nConI.Inherit = New Connection.Info.Inheritance(nConI) nConI.Name = Host.HostNameWithoutDomain nConI.Hostname = Host.HostName Select Case Protocol Case Connection.Protocol.Protocols.SSH2 If Host.SSH Then finalProt = Connection.Protocol.Protocols.SSH2 protOK = True End If Case Connection.Protocol.Protocols.Telnet If Host.Telnet Then finalProt = Connection.Protocol.Protocols.Telnet protOK = True End If Case Connection.Protocol.Protocols.HTTP If Host.HTTP Then finalProt = Connection.Protocol.Protocols.HTTP protOK = True End If Case Connection.Protocol.Protocols.HTTPS If Host.HTTPS Then finalProt = Connection.Protocol.Protocols.HTTPS protOK = True End If Case Connection.Protocol.Protocols.Rlogin If Host.Rlogin Then finalProt = Connection.Protocol.Protocols.Rlogin protOK = True End If Case Connection.Protocol.Protocols.RDP If Host.RDP Then finalProt = Connection.Protocol.Protocols.RDP protOK = True End If Case Connection.Protocol.Protocols.VNC If Host.VNC Then finalProt = Connection.Protocol.Protocols.VNC protOK = True End If End Select If protOK = False Then nConI = Nothing Else nConI.Protocol = finalProt nConI.SetDefaultPort() nNode.Tag = nConI Windows.treeForm.tvConnections.SelectedNode.Nodes.Add(nNode) If Tree.Node.GetNodeType(nNode.Parent) = Tree.Node.Type.Container Then nConI.Parent = nNode.Parent.Tag End If cL.Add(nConI) End If Next End Sub Public Shared Sub ImportConnectionsFromCSV() End Sub Public Shared Sub SaveConnectionsBG() _SaveUpdate = True Dim t As New Thread(AddressOf SaveConnectionsBGd) t.Start() End Sub Private Shared _SaveUpdate As Boolean = False Private Shared _SaveLock As Object = New Object Private Shared Sub SaveConnectionsBGd() Monitor.Enter(_SaveLock) SaveConnections(_SaveUpdate) Monitor.Exit(_SaveLock) End Sub Public Shared Sub SaveConnections(Optional ByVal Update As Boolean = False) Try If Update = True And My.Settings.UseSQLServer = False Then Exit Sub End If Dim tmrWasEnabled As Boolean If tmrSqlWatcher IsNot Nothing Then tmrWasEnabled = tmrSqlWatcher.Enabled If tmrSqlWatcher.Enabled = True Then tmrSqlWatcher.Stop() End If End If Dim conS As New Config.Connections.Save If My.Settings.UseSQLServer = False Then If My.Settings.LoadConsFromCustomLocation = False Then conS.ConnectionFileName = App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile Else conS.ConnectionFileName = My.Settings.CustomConsPath End If End If conS.ConnectionList = cL conS.ContainerList = ctL conS.Export = False conS.SaveSecurity = New Security.Save(False) conS.RootTreeNode = Windows.treeForm.tvConnections.Nodes(0) If My.Settings.UseSQLServer = True Then conS.SaveFormat = Config.Connections.Save.Format.SQL conS.SQLHost = My.Settings.SQLHost conS.SQLUsername = My.Settings.SQLUser conS.SQLPassword = Security.Crypt.Decrypt(My.Settings.SQLPass, App.Info.General.EncryptionKey) End If conS.Save() If My.Settings.UseSQLServer = True Then LastSQLUpdate = Now End If If tmrWasEnabled Then tmrSqlWatcher.Start() End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't save connections file" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub SaveConnectionsAs(ByVal SaveSecurity As Security.Save, ByVal RootNode As TreeNode) Try Dim tmrWasEnabled As Boolean If tmrSqlWatcher IsNot Nothing Then tmrWasEnabled = tmrSqlWatcher.Enabled If tmrSqlWatcher.Enabled = True Then tmrSqlWatcher.Stop() End If End If Dim conS As New Config.Connections.Save Dim sD As SaveFileDialog = Tools.Controls.ConnectionsSaveAsDialog If sD.ShowDialog = System.Windows.Forms.DialogResult.OK Then conS.ConnectionFileName = sD.FileName Else Exit Sub End If Select Case sD.FilterIndex Case 1 conS.SaveFormat = Config.Connections.Save.Format.mRXML Case 2 conS.SaveFormat = Config.Connections.Save.Format.mRCSV Case 3 conS.SaveFormat = Config.Connections.Save.Format.vRDCSV End Select If RootNode Is Windows.treeForm.tvConnections.Nodes(0) Then If conS.SaveFormat <> Config.Connections.Save.Format.mRXML And conS.SaveFormat <> Config.Connections.Save.Format.None Then Else If conS.ConnectionFileName = App.Info.Connections.DefaultConnectionsPath & "\" & App.Info.Connections.DefaultConnectionsFile Then My.Settings.LoadConsFromCustomLocation = False Else My.Settings.LoadConsFromCustomLocation = True My.Settings.CustomConsPath = conS.ConnectionFileName End If End If End If conS.ConnectionList = cL conS.ContainerList = ctL If RootNode IsNot Windows.treeForm.tvConnections.Nodes(0) Then conS.Export = True End If conS.SaveSecurity = SaveSecurity conS.RootTreeNode = RootNode conS.Save() Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't save connections file as" & vbNewLine & ex.Message) End Try End Sub #End Region #Region "Opening Connection" Private Shared nProt As Connection.Protocol.Base Private Shared nCi As Connection.Info Public Shared Function CreateQuicky(ByVal ConString As String, Optional ByVal Protocol As Connection.Protocol.Protocols = Connection.Protocol.Protocols.NONE) As Connection.Info Try nCi = New Connection.Info If Protocol <> Connection.Protocol.Protocols.NONE Then nCi.Protocol = Protocol End If Dim qConS() As String = Split(ConString, ":") Dim qHost As String = "" Dim qPort As Integer = 0 For i As Integer = 0 To qConS.Length - 1 If i = 0 Then qHost = qConS(i) End If If i = 1 Then Try qPort = Int(qConS(i)) Catch ex As Exception qHost += ":" & qConS(i) End Try End If If i = 2 Then Try qPort = Int(qConS(i)) Catch ex As Exception End Try End If Next If qHost <> "" Then nCi.Name = "Quick: " & qHost nCi.Hostname = qHost nCi.Port = qPort nCi.IsQuicky = True Windows.quickyForm.ConnectionInfo = nCi If Protocol = Connection.Protocol.Protocols.NONE Then Windows.quickyPanel.Show(frmMain.pnlDock, DockState.DockBottomAutoHide) Else End If Return nCi Else '-------- End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Creating quick connect failed" & vbNewLine & ex.Message) End Try Return Nothing End Function Public Shared Sub OpenConnection() Try OpenConnection(Connection.Info.Force.None) Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Opening connection failed" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub OpenConnection(ByVal Force As mRemote.Connection.Info.Force) Try If Windows.treeForm.tvConnections.SelectedNode.Tag Is Nothing Then Exit Sub End If If Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Connection Then OpenConnection(Windows.treeForm.tvConnections.SelectedNode.Tag, Force) ElseIf Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Container Then For Each tNode As TreeNode In Tree.Node.SelectedNode.Nodes If Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Connection Then If tNode.Tag IsNot Nothing Then OpenConnection(tNode.Tag, Force) End If End If Next End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Opening connection failed" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub OpenConnection(ByVal ConnectionInfo As mRemote.Connection.Info) Try OpenConnection(ConnectionInfo, Connection.Info.Force.None) Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Opening connection failed" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub OpenConnection(ByVal ConnectionInfo As mRemote.Connection.Info, ByVal ConnectionForm As Form) Try OpenConnectionFinal(ConnectionInfo, Connection.Info.Force.None, ConnectionForm) Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Opening connection failed" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub OpenConnection(ByVal ConnectionInfo As mRemote.Connection.Info, ByVal ConnectionForm As Form, ByVal Force As Connection.Info.Force) Try OpenConnectionFinal(ConnectionInfo, Force, ConnectionForm) Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Opening connection failed" & vbNewLine & ex.Message) End Try End Sub Public Shared Sub OpenConnection(ByVal ConnectionInfo As mRemote.Connection.Info, ByVal Force As mRemote.Connection.Info.Force) Try OpenConnectionFinal(ConnectionInfo, Force, Nothing) Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Opening connection failed" & vbNewLine & ex.Message) End Try End Sub Private Shared Sub OpenConnectionFinal(ByVal nCi As mRemote.Connection.Info, ByVal Force As mRemote.Connection.Info.Force, ByVal ConForm As Form) Try If nCi.Hostname = "" And nCi.Protocol <> Connection.Protocol.Protocols.IntApp Then mC.AddMessage(Messages.MessageClass.WarningMsg, "Cannot open connection: No hostname specified") Exit Sub End If If nCi.PreExtApp <> "" Then Dim extA As Tools.ExternalApp = App.Runtime.GetExtAppByName(nCi.PreExtApp) If extA IsNot Nothing Then extA.Start(nCi) End If End If If (Force And Connection.Info.Force.DoNotJump) <> Connection.Info.Force.DoNotJump Then If SwitchToOpenConnection(nCi) Then Exit Sub End If End If Select Case nCi.Protocol Case Connection.Protocol.Protocols.RDP nProt = New Connection.Protocol.RDP Case Connection.Protocol.Protocols.VNC nProt = New Connection.Protocol.VNC Case Connection.Protocol.Protocols.SSH1 nProt = New Connection.Protocol.SSH1 Case Connection.Protocol.Protocols.SSH2 nProt = New Connection.Protocol.SSH2 Case Connection.Protocol.Protocols.Telnet nProt = New Connection.Protocol.Telnet Case Connection.Protocol.Protocols.Rlogin nProt = New Connection.Protocol.Rlogin Case Connection.Protocol.Protocols.RAW nProt = New Connection.Protocol.RAW Case Connection.Protocol.Protocols.HTTP nProt = New Connection.Protocol.HTTP(nCi.RenderingEngine) Case Connection.Protocol.Protocols.HTTPS nProt = New Connection.Protocol.HTTPS(nCi.RenderingEngine) Case Connection.Protocol.Protocols.ICA nProt = New Connection.Protocol.ICA Case Connection.Protocol.Protocols.IntApp nProt = New Connection.Protocol.IntApp If nCi.ExtApp = "" Then Throw New Exception("No Ext. App specified.") End If Case Else Exit Sub End Select Dim cContainer As Control Dim cForm As Form Dim cPnl As String If nCi.Panel = "" Or (Force And Connection.Info.Force.OverridePanel) = Connection.Info.Force.OverridePanel Or My.Settings.AlwaysShowPanelSelectionDlg Then Dim frmPnl As New frmChoosePanel If frmPnl.ShowDialog = DialogResult.OK Then cPnl = frmPnl.Panel Else Exit Sub End If Else cPnl = nCi.Panel End If If ConForm Is Nothing Then cForm = wL.FromString(cPnl) Else cForm = ConForm End If If cForm Is Nothing Then cForm = AddPanel(cPnl) cForm.Focus() Else TryCast(cForm, UI.Window.Connection).Show(frmMain.pnlDock) TryCast(cForm, UI.Window.Connection).Focus() End If cContainer = TryCast(cForm, UI.Window.Connection).AddConnectionTab(nCi) If nCi.Protocol = Connection.Protocol.Protocols.IntApp Then If App.Runtime.GetExtAppByName(nCi.ExtApp).Icon IsNot Nothing Then TryCast(cContainer, Magic.Controls.TabPage).Icon = App.Runtime.GetExtAppByName(nCi.ExtApp).Icon End If End If AddHandler nProt.Closed, AddressOf TryCast(cForm, UI.Window.Connection).Prot_Event_Closed AddHandler nProt.Disconnected, AddressOf Prot_Event_Disconnected AddHandler nProt.Connected, AddressOf Prot_Event_Connected AddHandler nProt.Closed, AddressOf Prot_Event_Closed AddHandler nProt.ErrorOccured, AddressOf Prot_Event_ErrorOccured nProt.InterfaceControl = New Connection.InterfaceControl(cContainer, nProt, nCi) nProt.Force = Force If nProt.SetProps() = False Then nProt.Close() Exit Sub End If If nProt.Connect() = False Then nProt.Close() Exit Sub End If nCi.OpenConnections.Add(nProt) If nCi.IsQuicky = False Then If nCi.Protocol <> Connection.Protocol.Protocols.IntApp Then Tree.Node.SetNodeImage(nCi.TreeNode, Images.Enums.TreeImage.ConnectionOpen) Else Dim extApp As Tools.ExternalApp = GetExtAppByName(nCi.ExtApp) If extApp IsNot Nothing Then If extApp.TryIntegrate Then If nCi.TreeNode IsNot Nothing Then Tree.Node.SetNodeImage(nCi.TreeNode, Images.Enums.TreeImage.ConnectionOpen) End If End If End If End If End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Opening connection failed" & vbNewLine & ex.Message) End Try End Sub Public Shared Function SwitchToOpenConnection(ByVal nCi As Connection.Info) As Boolean Dim IC As mRemote.Connection.InterfaceControl = FindConnectionContainer(nCi) If IC IsNot Nothing Then TryCast(IC.FindForm, UI.Window.Connection).Focus() TryCast(IC.FindForm, UI.Window.Connection).Show(frmMain.pnlDock) Dim t As Magic.Controls.TabPage = IC.Parent t.Selected = True Return True End If Return False End Function #End Region #Region "Event Handlers" Public Shared Sub Prot_Event_Disconnected(ByVal sender As Object, ByVal DisconnectedMessage As String) Try mC.AddMessage(Messages.MessageClass.InformationMsg, "Protocol Event Disconnected" & vbNewLine & "Message: " & DisconnectedMessage, True) Dim Prot As Connection.Protocol.Base = sender If Prot.InterfaceControl.Info.Protocol = Connection.Protocol.Protocols.RDP Then Dim Reason As String() = DisconnectedMessage.Split(vbCrLf) Dim ReasonCode As String = Reason(0) Dim ReasonDescription As String = Reason(1) If ReasonCode > 3 Then If ReasonDescription <> "" Then mC.AddMessage(Messages.MessageClass.WarningMsg, "RDP Disconnected!" & vbNewLine & ReasonDescription & vbNewLine & "Error code " & ReasonCode & ".") Else mC.AddMessage(Messages.MessageClass.WarningMsg, "RDP Disconnected!" & vbNewLine & "Error code " & ReasonCode & ".") End If End If End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Protocol Event Disconnected failed" & vbNewLine & ex.Message, True) End Try End Sub Public Shared Sub Prot_Event_Closed(ByVal sender As Object) Try Dim Prot As Connection.Protocol.Base = sender mC.AddMessage(Messages.MessageClass.InformationMsg, "Protocol Event Closed", True) If App.Editions.Spanlink.Enabled Then mC.AddMessage(Messages.MessageClass.ReportMsg, "Connection to " & Prot.InterfaceControl.Info.Hostname & " via " & Prot.InterfaceControl.Info.Protocol.ToString & " closed by user " & My.User.Name & " (Description: " & Prot.InterfaceControl.Info.Description & "; User Field: " & Prot.InterfaceControl.Info.UserField & ")") Else mC.AddMessage(Messages.MessageClass.ReportMsg, "Connection to " & Prot.InterfaceControl.Info.Hostname & " via " & Prot.InterfaceControl.Info.Protocol.ToString & " closed by user " & My.User.Name) End If Prot.InterfaceControl.Info.OpenConnections.Remove(Prot) If Prot.InterfaceControl.Info.OpenConnections.Count < 1 And Prot.InterfaceControl.Info.IsQuicky = False Then Tree.Node.SetNodeImage(Prot.InterfaceControl.Info.TreeNode, Images.Enums.TreeImage.ConnectionClosed) End If If Prot.InterfaceControl.Info.PostExtApp <> "" Then Dim extA As Tools.ExternalApp = App.Runtime.GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp) If extA IsNot Nothing Then extA.Start(Prot.InterfaceControl.Info) End If End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Protocol Event Closed failed" & vbNewLine & ex.Message, True) End Try End Sub Public Shared Sub Prot_Event_Connected(ByVal sender As Object) Dim prot As mRemote.Connection.Protocol.Base = sender mC.AddMessage(Messages.MessageClass.InformationMsg, "Protocol Event Connected", True) mC.AddMessage(Messages.MessageClass.ReportMsg, "Connection to " & prot.InterfaceControl.Info.Hostname & " via " & prot.InterfaceControl.Info.Protocol.ToString & " established by user " & My.User.Name & " (Description: " & prot.InterfaceControl.Info.Description & "; User Field: " & prot.InterfaceControl.Info.UserField & ")") End Sub Public Shared Sub Prot_Event_ErrorOccured(ByVal sender As Object, ByVal ErrorMessage As String) Try mC.AddMessage(Messages.MessageClass.InformationMsg, "Protocol Event ErrorOccured", True) Dim Prot As Connection.Protocol.Base = sender If Prot.InterfaceControl.Info.Protocol = Connection.Protocol.Protocols.RDP Then If ErrorMessage > -1 Then mC.AddMessage(Messages.MessageClass.WarningMsg, "RDP Error!" & vbNewLine & "Error Code: " & ErrorMessage & vbNewLine & "Error Description: " & Connection.Protocol.RDP.FatalErrors.GetError(ErrorMessage)) End If End If Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Protocol Event ErrorOccured failed" & vbNewLine & ex.Message, True) End Try End Sub #End Region #Region "External Apps" Public Shared Sub GetExtApps() Array.Clear(Tools.ExternalAppsTypeConverter.ExternalApps, 0, Tools.ExternalAppsTypeConverter.ExternalApps.Length) Array.Resize(Tools.ExternalAppsTypeConverter.ExternalApps, ExtApps.Count + 1) Dim i As Integer = 0 For Each extA As Tools.ExternalApp In ExtApps Tools.ExternalAppsTypeConverter.ExternalApps(i) = extA.DisplayName i += 1 Next Tools.ExternalAppsTypeConverter.ExternalApps(i) = "" End Sub Public Shared Function GetExtAppByName(ByVal Name As String) As Tools.ExternalApp For Each extA As Tools.ExternalApp In ExtApps If extA.DisplayName = Name Then Return extA End If Next Return Nothing End Function #End Region #Region "Misc" Public Shared Sub GoToURL(ByVal URL As String) Dim cI As New mRemote.Connection.Info cI.Name = "Website" cI.Hostname = URL If URL.StartsWith("https:") Then cI.Protocol = Connection.Protocol.Protocols.HTTPS Else cI.Protocol = Connection.Protocol.Protocols.HTTP End If cI.SetDefaultPort() cI.IsQuicky = True App.Runtime.OpenConnection(cI, mRemote.Connection.Info.Force.DoNotJump) End Sub Public Shared Sub GoToWebsite() GoToURL(App.Info.General.URLHome) End Sub Public Shared Sub GoToDonate() GoToURL(App.Info.General.URLDonate) End Sub Public Shared Sub GoToForum() GoToURL(App.Info.General.URLForum) End Sub Public Shared Sub GoToBugs() GoToURL(App.Info.General.URLBugs) End Sub Public Shared Sub Report(ByVal Text As String) Try Dim sWr As New StreamWriter(My.Application.Info.DirectoryPath & "\Report.log", True) sWr.WriteLine(Text) sWr.Close() Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Writing to report file failed!") End Try End Sub Public Shared Function SaveReport() As Boolean Try Dim sRd As New StreamReader(My.Application.Info.DirectoryPath & "\Report.log") Dim Text As String = sRd.ReadToEnd sRd.Close() Dim sWr As New StreamWriter(App.Info.General.ReportingFilePath, True) sWr.Write(Text) sWr.Close() Return True Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't save report to final location. (App.Runtime.SaveReport)" & vbNewLine & ex.Message, True) Return False End Try End Function Public Shared Sub SetMainFormText(Optional ByVal ConnectionFileName As String = "") Try Dim txt As String = "mRemoteNG" If App.Editions.Spanlink.Enabled Then txt &= " | Spanlink Communications" Else If ConnectionFileName <> "" And ConnectionsFileLoaded = True Then If My.Settings.ShowCompleteConsPathInTitle Then txt &= " - " & ConnectionFileName Else txt &= " - " & ConnectionFileName.Substring(ConnectionFileName.LastIndexOf("\") + 1) End If End If End If ChangeMainFormText(txt) Catch ex As Exception mC.AddMessage(Messages.MessageClass.ErrorMsg, "Setting main form text failed" & vbNewLine & ex.Message, True) End Try End Sub Private Delegate Sub ChangeMainFormTextCB(ByVal Text As String) Private Shared Sub ChangeMainFormText(ByVal Text As String) If frmMain.InvokeRequired = True Then Dim d As New ChangeMainFormTextCB(AddressOf ChangeMainFormText) frmMain.Invoke(d, New Object() {Text}) Else frmMain.Text = Text End If End Sub Public Shared Function FindConnectionContainer(ByVal ConI As Connection.Info) As Connection.InterfaceControl If ConI.OpenConnections.Count > 0 Then For i As Integer = 0 To wL.Count - 1 If TypeOf wL.Items(i) Is UI.Window.Connection Then Dim conW As UI.Window.Connection = wL.Items(i) If conW.TabController IsNot Nothing Then For Each t As Magic.Controls.TabPage In conW.TabController.TabPages If t.Controls(0) IsNot Nothing Then If TypeOf t.Controls(0) Is Connection.InterfaceControl Then Dim IC As Connection.InterfaceControl = t.Controls(0) If IC.Info Is ConI Then Return IC End If End If End If Next End If End If Next End If Return Nothing End Function ' Override the font of all controls in a container with the default font based on the OS version Public Shared Sub FontOverride(ByRef ctlParent As Control) Dim ctlChild As Control For Each ctlChild In ctlParent.Controls ctlChild.Font = New System.Drawing.Font(SystemFonts.MessageBoxFont.Name, ctlChild.Font.Size, ctlChild.Font.Style, ctlChild.Font.Unit, ctlChild.Font.GdiCharSet) If ctlChild.Controls.Count > 0 Then FontOverride(ctlChild) End If Next End Sub #End Region #Region "SQL Watcher" Private Shared Sub tmrSqlWatcher_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmrSqlWatcher.Elapsed Tools.Misc.IsSQLUpdateAvailableBG() End Sub Private Shared Sub SQLUpdateCheckFinished(ByVal UpdateAvailable As Boolean) If UpdateAvailable = True Then mC.AddMessage(Messages.MessageClass.InformationMsg, "SQL Update check finished and there is an update available! Going to refresh connections.", True) LoadConnectionsBG() End If End Sub #End Region End Class End Namespace