From 7dfc0643d54216984fd035586be347aeb734a4ec Mon Sep 17 00:00:00 2001 From: "Sparer, David" Date: Fri, 4 Mar 2016 12:49:19 -0700 Subject: [PATCH] more syntax fixes --- ...gnTimeResolveAssemblyReferencesInput.cache | Bin 5879 -> 5883 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 8963 -> 9137 bytes TestProject/obj/Debug/mRemoteNG_Accessor.exe | Bin 1112064 -> 1112064 bytes TestProject/obj/Debug/mRemoteNG_Accessor.pdb | Bin 265728 -> 1414656 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 41209 -> 41943 bytes .../obj/Debug Portable/Interop.WFICALib.dll | Bin 135168 -> 135168 bytes ...Converted.csproj.ResolveComReference.cache | Bin 878 -> 878 bytes mRemoteV1.v12.suo | Bin 218112 -> 220672 bytes mRemoteV1/CS/App/App.Runtime.cs | 269 +- mRemoteV1/CS/App/App.Update.cs | 1046 +++-- mRemoteV1/CS/App/Export.cs | 163 +- mRemoteV1/CS/App/Import.cs | 18 +- .../CS/Config/Config.Connections.Load.cs | 14 +- .../CS/Config/Config.Connections.Save.cs | 2527 ++++++------ mRemoteV1/CS/Config/Config.Settings.Save.cs | 221 +- mRemoteV1/CS/Config/Import/ActiveDirectory.cs | 197 +- .../Config/Import/RemoteDesktopConnection.cs | 405 +- .../Import/RemoteDesktopConnectionManager.cs | 701 ++-- mRemoteV1/CS/Config/KeyboardShortcuts.cs | 99 +- mRemoteV1/CS/Connection/Connection.Icon.cs | 80 +- mRemoteV1/CS/Connection/Connection.Info.cs | 101 +- mRemoteV1/CS/Connection/Connection.List.cs | 24 +- .../CS/Connection/Connection.Protocol.Base.cs | 753 ++-- .../Connection.Protocol.HTTPBase.cs | 34 +- .../CS/Connection/Connection.Protocol.ICA.cs | 48 +- .../Connection.Protocol.IntegratedProgram.cs | 305 +- .../Connection.Protocol.PuttyBase.cs | 64 +- .../CS/Connection/Connection.Protocol.RDP.cs | 108 +- .../CS/Connection/Connection.Protocol.VNC.cs | 270 +- mRemoteV1/CS/Forms/OptionsForm.cs | 485 ++- mRemoteV1/CS/Forms/frmMain.cs | 4 +- mRemoteV1/CS/Security/Security.Crypt.cs | 191 +- .../CS/Security/Security.Impersonator.cs | 187 +- mRemoteV1/CS/Tools/ExternalTool.cs | 83 +- mRemoteV1/CS/Tools/IeBrowserEmulation.cs | 93 +- mRemoteV1/CS/Tools/Tools.Controls.cs | 529 ++- mRemoteV1/CS/Tools/Tools.Misc.cs | 883 ++-- mRemoteV1/CS/Tools/Tools.PortScan.cs | 632 ++- mRemoteV1/CS/Tree/Tree.Node.cs | 1268 +++--- mRemoteV1/CS/UI/UI.Window.About.cs | 674 ++- mRemoteV1/CS/UI/UI.Window.Announcement.cs | 169 +- mRemoteV1/CS/UI/UI.Window.Base.cs | 169 +- mRemoteV1/CS/UI/UI.Window.ComponentsCheck.cs | 1380 ++++--- mRemoteV1/CS/UI/UI.Window.Config.cs | 3623 ++++++++--------- mRemoteV1/CS/UI/UI.Window.Connection.cs | 2477 ++++++----- mRemoteV1/CS/UI/UI.Window.ErrorsAndInfos.cs | 910 +++-- mRemoteV1/CS/UI/UI.Window.ExternalTools.cs | 529 ++- mRemoteV1/CS/UI/UI.Window.PortScan.cs | 527 ++- mRemoteV1/CS/UI/UI.Window.SSHTransfer.cs | 1156 +++--- .../CS/UI/UI.Window.ScreenshotManager.cs | 749 ++-- mRemoteV1/CS/UI/UI.Window.Sessions.cs | 701 ++-- mRemoteV1/CS/UI/UI.Window.Tree.cs | 1899 +++++---- mRemoteV1/CS/UI/UI.Window.UltraVNCSC.cs | 291 +- mRemoteV1/CS/UI/UI.Window.Update.cs | 481 ++- mRemoteV1/CS/mRemoteV1.v12.suo | Bin 161280 -> 236032 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 37744 -> 38387 bytes .../obj/Debug Portable/Interop.WFICALib.dll | Bin 135168 -> 135168 bytes .../mRemoteV1.csproj.GenerateResource.Cache | Bin 11427 -> 11427 bytes ...mRemoteV1.csproj.ResolveComReference.cache | Bin 878 -> 878 bytes ...oteV1.csprojResolveAssemblyReference.cache | Bin 118943 -> 118933 bytes .../DesignTimeResolveAssemblyReferences.cache | Bin 188402 -> 188392 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 36635 -> 37363 bytes .../obj/Debug Portable/Interop.WFICALib.dll | Bin 135168 -> 135168 bytes ...mRemoteV1.vbproj.ResolveComReference.cache | Bin 878 -> 878 bytes 64 files changed, 13701 insertions(+), 13836 deletions(-) diff --git a/SharedLibraryNG/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/SharedLibraryNG/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 7588ac97682f976ddbcb903f64eb60529e25bc60..bbaa4fbc5c118256cddcbd2e91112230db772b13 100644 GIT binary patch delta 57 zcmeya`&)NIIk#YqvsFxJacWU1X-*+6s!}N@N z(^Olg{J>mOS~UgUcqZVTqjxZ5u~_&3PD>1z6nq_a3uPvWIVC}3l2^`A;Wm@}a(abj zCb{GCF!S__9ENSOC8A1P`G2^zU`A@X&WGTO z>m?22rB#^CblsF5MtYY?eIAh>L0VwZb#%=A!7U^nGnbwKBM+7-m}I&hF~aldN1EciP~@o-_nWzl~0! z!oH{1evu}S%FKR$_}%mz(gu?*9|)5v?4daJ_qE_tPzP0=#~76n(|>5v_GG}xjZCA< z?htrf5j1`Vr$sD%5xR%$xg_p}GV8idthnOPZ2yK48%q`JsP>28z-d1kKMN!{N>UIE z76KPg@NQhLH`;lneJ|5$8o9P=Z1NZ3MKDO_pc~AN&!dlXV^Qg3>biPOG1N^yjnef! ZI_m#AKJF5F{3(4WWGBwpGvQa2Tf7hE99yVcMW^D zdPmEa5zm z1GGxfWFJ5L+prqZ9o^F}(3_;gkASavWj0b_{vtBN-P3LBO|$XTGmhfSI(LckJx};C z7=E4FnO3;VVC#{Uy5;$s!x1Y_Iyh0POS$-RJ zs#*RTH20#5^g>OrNo1SHori68j_;p>a5Q8A5r-*U$5O`TGF7zba1L3x_}sF%E<`+L z ziwlK|426pgg^Lcgix2q(5Z7KU3=K6>Mz4rksiyjoW`~po54V&B5cuu`H=@~>kMs~3 a5I|TT2!4}rMWRIOMfmgM&bPSq5J&^inlo?! delta 120 zcmV-;0Ehp8@I!#`Ly(9ApV`=fi-n5;g^L1(ivxv=1ci$Qg^LD-iwA{^2!)FYg^LP> ziwlK|426pgg^Lcgix2q(5F*pFw>zXVMxlu#hAx15?1z*E54V&B5cuu`pV`=#kMs~3 a5b7wsmxr&UM6b4L$dmB)BDc8o5J&@Vsy43x diff --git a/TestProject/obj/Debug/mRemoteNG_Accessor.pdb b/TestProject/obj/Debug/mRemoteNG_Accessor.pdb index ee7a1d3a9c444ce7638b3809fe22452fdecd271f..42b9c48262fb86e68e0fd1b9d92dad730ece3bbf 100644 GIT binary patch literal 1414656 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%0Dyyr>xT?k67T@ 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�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 literal 265728 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 Vr#RM)dWC32MkE4}2)q~(cm{~|KEMC~ diff --git a/mRemoteV1.ConvertedToC#/obj/Debug Portable/DesignTimeResolveAssemblyReferencesInput.cache b/mRemoteV1.ConvertedToC#/obj/Debug Portable/DesignTimeResolveAssemblyReferencesInput.cache index a14dcf842954d6501019f90bff7abb579a2ce31c..a66e27a8c0ba328bf1f033404ca8a9022028c2e7 100644 GIT binary patch literal 41943 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 O~JABR2i{{IJvBrVba literal 41209 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 Ius=TV5iwB6(*OVf diff --git a/mRemoteV1.ConvertedToC#/obj/Debug Portable/Interop.WFICALib.dll b/mRemoteV1.ConvertedToC#/obj/Debug Portable/Interop.WFICALib.dll index 044857dfa4640ccec21589f65ca5bce1023ae242..86920568237be742bf4bfb5cfb1904f11a2e7403 100644 GIT binary patch literal 135168 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

Qj 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 Zu7T+qn68288knwu=^B`>f&aZ4_`enuzA*p* literal 135168 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 delta 4766 zcmeH~eN@xe8OMLmO^6`|M2Ub9FhT^iz+ws%@r3|_4BxHV%~1+Y+S)0kkkB56lDVGR zsqKMWk9SjxiVmIYS~RV(FKemR)wf!(&e_#DYw5Prdd{{Md>8h;F=^vV+jVDu_U3%@ zyZ5>G_vAj$eeQE_T(5<>c7!!qMk|35p(vwJSAo9%{(dPY5CaB*1m3KU+ht!vZnh-6 z-LXIARc9Cd5*;1$c|EJA9Nx?N8?Qs4*^Vz1C{(UPQ=n+jmUXE;$zPZ4Sk!eveIrnp z?~TOMNk}DbdU%IcE>>VBo}Oeq z?KTup7)jBDpf0+PJBQBH=RlMjBo6%x8mE9F<0;ls19`GV~3G4x0uot`xUIDLy*TC<= z>);L00p0}rz<%%+2&~!Ls2>D}6s1u)jLH#k6ubkDfp+IWAr3_b2xy2f4imOd0RnKR^TQts)g z(^D)V_83qBH3$J3U_|8D49)g@TRd6`U^p;=5g-vH0W%m0l0ga>1xAB0;4Y8~c)Q-v zXhr32kO4A57PtpwgK;1Sj0Y3IL@){D0vpH!`Jezy28EyqOaaB<`=A6&1=GNEFayj4 zv%qXZ=9z=ayMn!xWMMFiIm1)GWXbSg? z%D6&2u_pP>i(7QliequJ)d-0aVbW1H-dWo|&AZv@YR7O)9y23tTY*b26RUxPNV9qjPz zvd*MtyJ5G@r1qFn&7>ayl`0U3bnZx7(^|ybr9GNoLA zO6Hf#j_8M=BQmH{GX)Kco?m&Op7wBO`AmHh1Ty6XeuYgYexZDZIu^3Pu|_XRW7Xk7 zq7ZpL82RN9Q*iESxoupwx^Q~YT;4Elf~Onr8=RYXk74Floa!^elpMU58>BQuo>!;% z>eGeT7qw%QSc7Jd$bkJPxboA34?sVR(mGciwRx=w7 zt-`N7c7=wCUNbdPjBt*m)vfhxx81~WBiZ^DYFisva9V72#qgHx8s4`h!DC*3I)uCD zr+c68p$y^+?`shq(QLl3C#y7`(voeod-M4P!j!2p3H_(6hhjZ+Z7b0+{^qK!;><3x zcuM$jc595yC!7 zSXQ$ral}ZY(V8qy#FL<%;%q#v6sHf7Hnc*q-NJd|nIWto62j6ubqu&Z2|U+=kHC7c z0ep8G{T8>;f^TyG$|e8uHtJ7lG6c4>BvF<~dcJXkPPn3(%iGaOwy*mOa))HadxqlQ z&+V6^cW>mo;M+ch${t&2P_TBqSoF{{nU z5=6(3DN&rAPC8*J#)*BQHPu_*&NhdN<6+F`HRiBx=bl$siC)-B*+H&9{*-9HPNRfn z0W0Q~{dL@SV4wG}UUis6({g%Fl>Z3XdGkKDN?3lwY+p9H>z`(C={s!O!@|`<`C?<9 z$|^eD>`7tSMDx9~=Be7XqULdy>W!#oF)GpY0;>@=wJJumx3COx#;me<_qMVa63?Wl nRtVGI@iR>>_N2GHmd&Mg(^WcgxStxt-WZk5yJC`R`OyCW3(~Q( diff --git a/mRemoteV1/CS/App/App.Runtime.cs b/mRemoteV1/CS/App/App.Runtime.cs index aabd6fc86..389d0bdf6 100644 --- a/mRemoteV1/CS/App/App.Runtime.cs +++ b/mRemoteV1/CS/App/App.Runtime.cs @@ -43,7 +43,7 @@ namespace mRemoteNG.App public static frmMain MainForm {get; set;} private static Connection.List _connectionList; - public static List ConnectionList + public static Connection.List ConnectionList { get { @@ -56,7 +56,7 @@ namespace mRemoteNG.App } private static Connection.List _previousConnectionList; - public static List PreviousConnectionList + public static Connection.List PreviousConnectionList { get { @@ -320,104 +320,101 @@ namespace mRemoteNG.App { try { - switch (windowType) - { - case UI.Window.Type.About: - if (aboutForm == null || aboutForm.IsDisposed) - { - aboutForm = new UI.Window.About(aboutPanel); - aboutPanel = aboutForm; - } - - aboutForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.ActiveDirectoryImport: - if (adimportForm == null || adimportForm.IsDisposed) - { - adimportForm = new UI.Window.ActiveDirectoryImport(adimportPanel); - adimportPanel = adimportForm; - } - - adimportPanel.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.Options: - using (OptionsForm optionsForm = new OptionsForm()) - { - optionsForm.ShowDialog(frmMain); - } - - break; - case UI.Window.Type.SSHTransfer: - sshtransferForm = new UI.Window.SSHTransfer(sshtransferPanel); - sshtransferPanel = sshtransferForm; - - sshtransferForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.Update: - if (updateForm == null || updateForm.IsDisposed) - { - updateForm = new UI.Window.Update(updatePanel); - updatePanel = updateForm; - } - - updateForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.Help: - if (helpForm == null || helpForm.IsDisposed) - { - helpForm = new UI.Window.Help(helpPanel); - helpPanel = helpForm; - } - - helpForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.ExternalApps: - if (externalappsForm == null || externalappsForm.IsDisposed) - { - externalappsForm = new UI.Window.ExternalTools(externalappsPanel); - externalappsPanel = externalappsForm; - } - - externalappsForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.PortScan: - portscanForm = new UI.Window.PortScan(portscanPanel, portScanImport); - portscanPanel = portscanForm; - - portscanForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.UltraVNCSC: - if (ultravncscForm == null || ultravncscForm.IsDisposed) - { - ultravncscForm = new UI.Window.UltraVNCSC(ultravncscPanel); - ultravncscPanel = ultravncscForm; - } - - ultravncscForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.ComponentsCheck: - if (componentscheckForm == null || componentscheckForm.IsDisposed) - { - componentscheckForm = new UI.Window.ComponentsCheck(componentscheckPanel); - componentscheckPanel = componentscheckForm; - } - - componentscheckForm.Show(frmMain.Default.pnlDock); - break; - case UI.Window.Type.Announcement: - if (AnnouncementForm == null || AnnouncementForm.IsDisposed) - { - AnnouncementForm = new UI.Window.Announcement(AnnouncementPanel); - AnnouncementPanel = AnnouncementForm; - } - - AnnouncementForm.Show(frmMain.Default.pnlDock); - break; - } + if (windowType.Equals(UI.Window.Type.About)) + { + if (aboutForm == null || aboutForm.IsDisposed) + { + aboutForm = new UI.Window.About(aboutPanel); + aboutPanel = aboutForm; + } + aboutForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.ActiveDirectoryImport)) + { + if (adimportForm == null || adimportForm.IsDisposed) + { + adimportForm = new UI.Window.ActiveDirectoryImport(adimportPanel); + adimportPanel = adimportForm; + } + adimportPanel.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.Options)) + { + using (OptionsForm optionsForm = new OptionsForm()) + { + optionsForm.ShowDialog(frmMain); + } + } + else if (windowType.Equals(UI.Window.Type.SSHTransfer)) + { + sshtransferForm = new UI.Window.SSHTransfer(sshtransferPanel); + sshtransferPanel = sshtransferForm; + sshtransferForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.Update)) + { + if (updateForm == null || updateForm.IsDisposed) + { + updateForm = new UI.Window.Update(updatePanel); + updatePanel = updateForm; + } + updateForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.Help)) + { + if (helpForm == null || helpForm.IsDisposed) + { + helpForm = new UI.Window.Help(helpPanel); + helpPanel = helpForm; + } + helpForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.ExternalApps)) + { + if (externalappsForm == null || externalappsForm.IsDisposed) + { + externalappsForm = new UI.Window.ExternalTools(externalappsPanel); + externalappsPanel = externalappsForm; + } + externalappsForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.PortScan)) + { + portscanForm = new UI.Window.PortScan(portscanPanel, portScanImport); + portscanPanel = portscanForm; + portscanForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.UltraVNCSC)) + { + if (ultravncscForm == null || ultravncscForm.IsDisposed) + { + ultravncscForm = new UI.Window.UltraVNCSC(ultravncscPanel); + ultravncscPanel = ultravncscForm; + } + ultravncscForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.ComponentsCheck)) + { + if (componentscheckForm == null || componentscheckForm.IsDisposed) + { + componentscheckForm = new UI.Window.ComponentsCheck(componentscheckPanel); + componentscheckPanel = componentscheckForm; + } + componentscheckForm.Show(frmMain.Default.pnlDock); + } + else if (windowType.Equals(UI.Window.Type.Announcement)) + { + if (AnnouncementForm == null || AnnouncementForm.IsDisposed) + { + AnnouncementForm = new UI.Window.Announcement(AnnouncementPanel); + AnnouncementPanel = AnnouncementForm; + } + AnnouncementForm.Show(frmMain.Default.pnlDock); + } } catch (Exception ex) { - MessageCollector.AddMessage(MessageClass.ErrorMsg, "App.Runtime.Windows.Show() failed." + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "App.Runtime.Windows.Show() failed." + Constants.vbNewLine + ex.Message, true); } } @@ -715,7 +712,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage("GetUpdateInfoCompleted() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("GetUpdateInfoCompleted() failed.", ex, MessageClass.ErrorMsg, true); } } @@ -762,7 +759,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage("GetAnnouncementInfoCompleted() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("GetAnnouncementInfoCompleted() failed.", ex, MessageClass.ErrorMsg, true); } } @@ -879,7 +876,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strCommandLineArgsCouldNotBeParsed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strCommandLineArgsCouldNotBeParsed + Constants.vbNewLine + ex.Message); } } @@ -944,7 +941,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strSettingsCouldNotBeSavedOrTrayDispose + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strSettingsCouldNotBeSavedOrTrayDispose + Constants.vbNewLine + ex.Message, true); } } @@ -960,7 +957,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(MessageClass.ErrorMsg, "The update could not be started." + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "The update could not be started." + Constants.vbNewLine + ex.Message, true); } } @@ -1159,7 +1156,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t add panel" + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t add panel" + Constants.vbNewLine + ex.Message); return null; } } @@ -1180,7 +1177,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t rename panel" + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t rename panel" + Constants.vbNewLine + ex.Message); } } @@ -1205,7 +1202,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t enumerate screens" + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t enumerate screens" + Constants.vbNewLine + ex.Message); } } @@ -1292,7 +1289,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strCouldNotCreateNewConnectionsFile, ex, MessageClass.ErrorMsg); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strCouldNotCreateNewConnectionsFile, ex, MessageClass.ErrorMsg); } } @@ -1415,7 +1412,7 @@ namespace mRemoteNG.App { if (My.Settings.Default.UseSQLServer) { - MessageCollector.AddExceptionMessage(My.Language.strLoadFromSqlFailed, ex); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strLoadFromSqlFailed, ex); string commandButtons = string.Join("|", new[] {My.Language.strCommandTryAgain, My.Language.strCommandOpenConnectionFile, string.Format(My.Language.strCommandExitProgram, System.Windows.Forms.Application.ProductName)}); cTaskDialog.ShowCommandBox(System.Windows.Forms.Application.ProductName, My.Language.strLoadFromSqlFailed, My.Language.strLoadFromSqlFailedContent, Misc.GetExceptionMessageRecursive(ex), "", "", commandButtons, false, eSysIcons.Error, null); switch (cTaskDialog.CommandButtonResult) @@ -1436,12 +1433,12 @@ namespace mRemoteNG.App { if (ex is FileNotFoundException&& !withDialog) { - MessageCollector.AddExceptionMessage(string.Format(My.Language.strConnectionsFileCouldNotBeLoadedNew, connectionsLoad.ConnectionFileName), ex, MessageClass.InformationMsg); + Runtime.MessageCollector.AddExceptionMessage(string.Format(My.Language.strConnectionsFileCouldNotBeLoadedNew, connectionsLoad.ConnectionFileName), ex, MessageClass.InformationMsg); NewConnections(System.Convert.ToString(connectionsLoad.ConnectionFileName)); return ; } - MessageCollector.AddExceptionMessage(string.Format(My.Language.strConnectionsFileCouldNotBeLoaded, connectionsLoad.ConnectionFileName), ex); + Runtime.MessageCollector.AddExceptionMessage(string.Format(My.Language.strConnectionsFileCouldNotBeLoaded, connectionsLoad.ConnectionFileName), ex); if (!(connectionsLoad.ConnectionFileName == GetStartupConnectionFileName())) { LoadConnections(withDialog, update); @@ -1473,7 +1470,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strConnectionsFileBackupFailed, ex, MessageClass.WarningMsg); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strConnectionsFileBackupFailed, ex, MessageClass.WarningMsg); throw; } } @@ -1601,7 +1598,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionsFileCouldNotBeSaved + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionsFileCouldNotBeSaved + Constants.vbNewLine + ex.Message); } finally { @@ -1667,7 +1664,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage(string.Format(My.Language.strConnectionsFileCouldNotSaveAs, connectionsSave.ConnectionFileName), ex); + Runtime.MessageCollector.AddExceptionMessage(string.Format(My.Language.strConnectionsFileCouldNotSaveAs, connectionsSave.ConnectionFileName), ex); } finally { @@ -1718,7 +1715,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strQuickConnectFailed, ex, MessageClass.ErrorMsg); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strQuickConnectFailed, ex, MessageClass.ErrorMsg); return null; } } @@ -1731,7 +1728,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); } } @@ -1764,7 +1761,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); } } @@ -1776,7 +1773,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); } } @@ -1788,7 +1785,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); } } @@ -1800,7 +1797,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); } } @@ -1812,7 +1809,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); } } @@ -1822,7 +1819,7 @@ namespace mRemoteNG.App { if (newConnectionInfo.Hostname == "" && newConnectionInfo.Protocol != Connection.Protocol.Protocols.IntApp) { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strConnectionOpenFailedNoHostname); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strConnectionOpenFailedNoHostname); return; } @@ -1995,7 +1992,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionOpenFailed + Constants.vbNewLine + ex.Message); } } @@ -2021,7 +2018,7 @@ namespace mRemoteNG.App { try { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strProtocolEventDisconnected, DisconnectedMessage), true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strProtocolEventDisconnected, DisconnectedMessage), true); Connection.Protocol.Base Prot = sender; if (Prot.InterfaceControl.Info.Protocol == Connection.Protocol.Protocols.RDP) @@ -2033,18 +2030,18 @@ namespace mRemoteNG.App { if (!string.IsNullOrEmpty(ReasonDescription)) { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strRdpDisconnected + Constants.vbNewLine + ReasonDescription + Constants.vbNewLine + string.Format(My.Language.strErrorCode, ReasonCode)); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strRdpDisconnected + Constants.vbNewLine + ReasonDescription + Constants.vbNewLine + string.Format(My.Language.strErrorCode, ReasonCode)); } else { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strRdpDisconnected + Constants.vbNewLine + string.Format(My.Language.strErrorCode, ReasonCode)); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strRdpDisconnected + Constants.vbNewLine + string.Format(My.Language.strErrorCode, ReasonCode)); } } } } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strProtocolEventDisconnectFailed, ex.Message), true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strProtocolEventDisconnectFailed, ex.Message), true); } } @@ -2054,9 +2051,9 @@ namespace mRemoteNG.App { Connection.Protocol.Base Prot = sender; - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strConnenctionCloseEvent, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strConnenctionCloseEvent, true); - MessageCollector.AddMessage(Messages.MessageClass.ReportMsg, string.Format(My.Language.strConnenctionClosedByUser, Prot.InterfaceControl.Info.Hostname, Prot.InterfaceControl.Info.Protocol.ToString(), (new Microsoft.VisualBasic.ApplicationServices.User()).Name)); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ReportMsg, string.Format(My.Language.strConnenctionClosedByUser, Prot.InterfaceControl.Info.Hostname, Prot.InterfaceControl.Info.Protocol.ToString(), (new Microsoft.VisualBasic.ApplicationServices.User()).Name)); Prot.InterfaceControl.Info.OpenConnections.Remove(Prot); @@ -2076,7 +2073,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnenctionCloseEventFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnenctionCloseEventFailed + Constants.vbNewLine + ex.Message, true); } } @@ -2084,15 +2081,15 @@ namespace mRemoteNG.App { mRemoteNG.Connection.Protocol.Base prot = sender; - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strConnectionEventConnected, true); - MessageCollector.AddMessage(Messages.MessageClass.ReportMsg, string.Format(My.Language.strConnectionEventConnectedDetail, prot.InterfaceControl.Info.Hostname, prot.InterfaceControl.Info.Protocol.ToString(), (new Microsoft.VisualBasic.ApplicationServices.User()).Name, prot.InterfaceControl.Info.Description, prot.InterfaceControl.Info.UserField)); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strConnectionEventConnected, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ReportMsg, string.Format(My.Language.strConnectionEventConnectedDetail, prot.InterfaceControl.Info.Hostname, prot.InterfaceControl.Info.Protocol.ToString(), (new Microsoft.VisualBasic.ApplicationServices.User()).Name, prot.InterfaceControl.Info.Description, prot.InterfaceControl.Info.UserField)); } public static void Prot_Event_ErrorOccured(object sender, string ErrorMessage) { try { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strConnectionEventErrorOccured, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strConnectionEventErrorOccured, true); Connection.Protocol.Base Prot = sender; @@ -2100,13 +2097,13 @@ namespace mRemoteNG.App { if (ErrorMessage > -1) { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, string.Format(My.Language.strConnectionRdpErrorDetail, ErrorMessage, Connection.Protocol.RDP.FatalErrors.GetError(ErrorMessage))); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, string.Format(My.Language.strConnectionRdpErrorDetail, ErrorMessage, Connection.Protocol.RDP.FatalErrors.GetError(ErrorMessage))); } } } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionEventConnectionFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConnectionEventConnectionFailed + Constants.vbNewLine + ex.Message, true); } } #endregion @@ -2177,7 +2174,7 @@ namespace mRemoteNG.App } catch (Exception) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLogWriteToFileFailed); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLogWriteToFileFailed); } } @@ -2198,7 +2195,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLogWriteToFileFinalLocationFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLogWriteToFileFinalLocationFailed + Constants.vbNewLine + ex.Message, true); return false; } finally @@ -2276,7 +2273,7 @@ namespace mRemoteNG.App { if (UpdateAvailable == true) { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strSqlUpdateCheckUpdateAvailable, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strSqlUpdateCheckUpdateAvailable, true); LoadConnectionsBG(); } } diff --git a/mRemoteV1/CS/App/App.Update.cs b/mRemoteV1/CS/App/App.Update.cs index c3d07630a..fd7475379 100644 --- a/mRemoteV1/CS/App/App.Update.cs +++ b/mRemoteV1/CS/App/App.Update.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,8 +8,6 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.IO; using System.Net; using System.ComponentModel; @@ -22,614 +19,613 @@ using System.Reflection; namespace mRemoteNG.App { public class Update + { + #region Events + private AsyncCompletedEventHandler GetUpdateInfoCompletedEventEvent; + public event AsyncCompletedEventHandler GetUpdateInfoCompletedEvent { -#region Events - private AsyncCompletedEventHandler GetUpdateInfoCompletedEventEvent; - public event AsyncCompletedEventHandler GetUpdateInfoCompletedEvent + add { - add - { - GetUpdateInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(GetUpdateInfoCompletedEventEvent, value); - } - remove - { - GetUpdateInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(GetUpdateInfoCompletedEventEvent, value); - } + GetUpdateInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(GetUpdateInfoCompletedEventEvent, value); } - - private AsyncCompletedEventHandler GetChangeLogCompletedEventEvent; - public event AsyncCompletedEventHandler GetChangeLogCompletedEvent + remove { - add - { - GetChangeLogCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(GetChangeLogCompletedEventEvent, value); - } - remove - { - GetChangeLogCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(GetChangeLogCompletedEventEvent, value); - } + GetUpdateInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(GetUpdateInfoCompletedEventEvent, value); } + } - private AsyncCompletedEventHandler GetAnnouncementInfoCompletedEventEvent; - public event AsyncCompletedEventHandler GetAnnouncementInfoCompletedEvent + private AsyncCompletedEventHandler GetChangeLogCompletedEventEvent; + public event AsyncCompletedEventHandler GetChangeLogCompletedEvent + { + add { - add - { - GetAnnouncementInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(GetAnnouncementInfoCompletedEventEvent, value); - } - remove - { - GetAnnouncementInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(GetAnnouncementInfoCompletedEventEvent, value); - } + GetChangeLogCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(GetChangeLogCompletedEventEvent, value); } - - private DownloadProgressChangedEventHandler DownloadUpdateProgressChangedEventEvent; - public event DownloadProgressChangedEventHandler DownloadUpdateProgressChangedEvent + remove { - add - { - DownloadUpdateProgressChangedEventEvent = (DownloadProgressChangedEventHandler) System.Delegate.Combine(DownloadUpdateProgressChangedEventEvent, value); - } - remove - { - DownloadUpdateProgressChangedEventEvent = (DownloadProgressChangedEventHandler) System.Delegate.Remove(DownloadUpdateProgressChangedEventEvent, value); - } + GetChangeLogCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(GetChangeLogCompletedEventEvent, value); } + } - private AsyncCompletedEventHandler DownloadUpdateCompletedEventEvent; - public event AsyncCompletedEventHandler DownloadUpdateCompletedEvent + private AsyncCompletedEventHandler GetAnnouncementInfoCompletedEventEvent; + public event AsyncCompletedEventHandler GetAnnouncementInfoCompletedEvent + { + add { - add - { - DownloadUpdateCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(DownloadUpdateCompletedEventEvent, value); - } - remove - { - DownloadUpdateCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(DownloadUpdateCompletedEventEvent, value); - } + GetAnnouncementInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(GetAnnouncementInfoCompletedEventEvent, value); } - -#endregion - -#region Public Properties - private UpdateInfo _currentUpdateInfo; -public UpdateInfo CurrentUpdateInfo + remove { - get - { - return _currentUpdateInfo; - } + GetAnnouncementInfoCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(GetAnnouncementInfoCompletedEventEvent, value); } + } - private string _changeLog; -public string ChangeLog + private DownloadProgressChangedEventHandler DownloadUpdateProgressChangedEventEvent; + public event DownloadProgressChangedEventHandler DownloadUpdateProgressChangedEvent + { + add { - get - { - return _changeLog; - } + DownloadUpdateProgressChangedEventEvent = (DownloadProgressChangedEventHandler) System.Delegate.Combine(DownloadUpdateProgressChangedEventEvent, value); } - - private AnnouncementInfo _currentAnnouncementInfo; -public AnnouncementInfo CurrentAnnouncementInfo + remove { - get - { - return _currentAnnouncementInfo; - } + DownloadUpdateProgressChangedEventEvent = (DownloadProgressChangedEventHandler) System.Delegate.Remove(DownloadUpdateProgressChangedEventEvent, value); } + } -public bool IsGetUpdateInfoRunning + private AsyncCompletedEventHandler DownloadUpdateCompletedEventEvent; + public event AsyncCompletedEventHandler DownloadUpdateCompletedEvent + { + add { - get + DownloadUpdateCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Combine(DownloadUpdateCompletedEventEvent, value); + } + remove + { + DownloadUpdateCompletedEventEvent = (AsyncCompletedEventHandler) System.Delegate.Remove(DownloadUpdateCompletedEventEvent, value); + } + } + #endregion + + #region Public Properties + private UpdateInfo _currentUpdateInfo; + public UpdateInfo CurrentUpdateInfo + { + get + { + return _currentUpdateInfo; + } + } + + private string _changeLog; + public string ChangeLog + { + get + { + return _changeLog; + } + } + + private AnnouncementInfo _currentAnnouncementInfo; + public AnnouncementInfo CurrentAnnouncementInfo + { + get + { + return _currentAnnouncementInfo; + } + } + + public bool IsGetUpdateInfoRunning + { + get + { + if (_getUpdateInfoThread != null) { - if (_getUpdateInfoThread != null) + if (_getUpdateInfoThread.IsAlive) { - if (_getUpdateInfoThread.IsAlive) - { - return true; - } + return true; } - return false; } + return false; } + } -public bool IsGetChangeLogRunning + public bool IsGetChangeLogRunning + { + get { - get + if (_getChangeLogThread != null) { - if (_getChangeLogThread != null) + if (_getChangeLogThread.IsAlive) { - if (_getChangeLogThread.IsAlive) - { - return true; - } + return true; } - return false; } + return false; } + } -public bool IsGetAnnouncementInfoRunning + public bool IsGetAnnouncementInfoRunning + { + get { - get + if (_getAnnouncementInfoThread != null) { - if (_getAnnouncementInfoThread != null) + if (_getAnnouncementInfoThread.IsAlive) { - if (_getAnnouncementInfoThread.IsAlive) - { - return true; - } + return true; } - return false; } + return false; } + } -public bool IsDownloadUpdateRunning + public bool IsDownloadUpdateRunning + { + get { - get + return (_downloadUpdateWebClient != null); + } + } + #endregion + + #region Public Methods + public Update() + { + SetProxySettings(); + } + + public void SetProxySettings() + { + SetProxySettings(System.Convert.ToBoolean(My.Settings.Default.UpdateUseProxy), System.Convert.ToString(My.Settings.Default.UpdateProxyAddress), System.Convert.ToInt32(My.Settings.Default.UpdateProxyPort), System.Convert.ToBoolean(My.Settings.Default.UpdateProxyUseAuthentication), System.Convert.ToString(My.Settings.Default.UpdateProxyAuthUser), Security.Crypt.Decrypt(System.Convert.ToString(My.Settings.Default.UpdateProxyAuthPass), Info.General.EncryptionKey)); + } + + public void SetProxySettings(bool useProxy, string address, int port, bool useAuthentication, string username, string password) + { + if (useProxy && !string.IsNullOrEmpty(address)) + { + if (!(port == 0)) { - return (_downloadUpdateWebClient != null); - } - } -#endregion - -#region Public Methods - public Update() - { - SetProxySettings(); - } - - public void SetProxySettings() - { - SetProxySettings(System.Convert.ToBoolean(My.Settings.Default.UpdateUseProxy), System.Convert.ToString(My.Settings.Default.UpdateProxyAddress), System.Convert.ToInt32(My.Settings.Default.UpdateProxyPort), System.Convert.ToBoolean(My.Settings.Default.UpdateProxyUseAuthentication), System.Convert.ToString(My.Settings.Default.UpdateProxyAuthUser), Security.Crypt.Decrypt(System.Convert.ToString(My.Settings.Default.UpdateProxyAuthPass), Info.General.EncryptionKey)); - } - - public void SetProxySettings(bool useProxy, string address, int port, bool useAuthentication, string username, string password) - { - if (useProxy && !string.IsNullOrEmpty(address)) - { - if (!(port == 0)) - { - _webProxy = new WebProxy(address, port); - } - else - { - _webProxy = new WebProxy(address); - } - - if (useAuthentication) - { - _webProxy.Credentials = new NetworkCredential(username, password); - } - else - { - _webProxy.Credentials = null; - } + _webProxy = new WebProxy(address, port); } else { - _webProxy = null; + _webProxy = new WebProxy(address); + } + + if (useAuthentication) + { + _webProxy.Credentials = new NetworkCredential(username, password); + } + else + { + _webProxy.Credentials = null; } } - - public bool IsUpdateAvailable() + else { - if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid) - { - return false; - } - - return _currentUpdateInfo.Version > (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.Version; + _webProxy = null; } + } - public bool IsAnnouncementAvailable() + public bool IsUpdateAvailable() + { + if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid) { - if (_currentAnnouncementInfo == null || (!_currentAnnouncementInfo.IsValid || string.IsNullOrEmpty(_currentAnnouncementInfo.Name))) - { - return false; - } - - return !(_currentAnnouncementInfo.Name == My.Settings.Default.LastAnnouncement); + return false; } + + return _currentUpdateInfo.Version > (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.Version; + } - public void GetUpdateInfoAsync() + public bool IsAnnouncementAvailable() + { + if (_currentAnnouncementInfo == null || (!_currentAnnouncementInfo.IsValid || string.IsNullOrEmpty(_currentAnnouncementInfo.Name))) { - if (IsGetUpdateInfoRunning) - { - _getUpdateInfoThread.Abort(); - } - - _getUpdateInfoThread = new Thread(new System.Threading.ThreadStart(GetUpdateInfo)); - _getUpdateInfoThread.SetApartmentState(ApartmentState.STA); - _getUpdateInfoThread.IsBackground = true; - _getUpdateInfoThread.Start(); + return false; } + + return !(_currentAnnouncementInfo.Name == My.Settings.Default.LastAnnouncement); + } - public void GetChangeLogAsync() + public void GetUpdateInfoAsync() + { + if (IsGetUpdateInfoRunning) { - if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid) - { - throw (new InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling GetChangeLogAsync().")); - } - - if (IsGetChangeLogRunning) - { - _getChangeLogThread.Abort(); - } - - _getChangeLogThread = new Thread(new System.Threading.ThreadStart(GetChangeLog)); - _getChangeLogThread.SetApartmentState(ApartmentState.STA); - _getChangeLogThread.IsBackground = true; - _getChangeLogThread.Start(); + _getUpdateInfoThread.Abort(); } + + _getUpdateInfoThread = new Thread(new System.Threading.ThreadStart(GetUpdateInfo)); + _getUpdateInfoThread.SetApartmentState(ApartmentState.STA); + _getUpdateInfoThread.IsBackground = true; + _getUpdateInfoThread.Start(); + } - public void GetAnnouncementInfoAsync() + public void GetChangeLogAsync() + { + if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid) { - if (IsGetAnnouncementInfoRunning) - { - _getAnnouncementInfoThread.Abort(); - } - - _getAnnouncementInfoThread = new Thread(new System.Threading.ThreadStart(GetAnnouncementInfo)); - _getAnnouncementInfoThread.SetApartmentState(ApartmentState.STA); - _getAnnouncementInfoThread.IsBackground = true; - _getAnnouncementInfoThread.Start(); + throw (new InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling GetChangeLogAsync().")); } + + if (IsGetChangeLogRunning) + { + _getChangeLogThread.Abort(); + } + + _getChangeLogThread = new Thread(new System.Threading.ThreadStart(GetChangeLog)); + _getChangeLogThread.SetApartmentState(ApartmentState.STA); + _getChangeLogThread.IsBackground = true; + _getChangeLogThread.Start(); + } - public void DownloadUpdateAsync() + public void GetAnnouncementInfoAsync() + { + if (IsGetAnnouncementInfoRunning) + { + _getAnnouncementInfoThread.Abort(); + } + + _getAnnouncementInfoThread = new Thread(new System.Threading.ThreadStart(GetAnnouncementInfo)); + _getAnnouncementInfoThread.SetApartmentState(ApartmentState.STA); + _getAnnouncementInfoThread.IsBackground = true; + _getAnnouncementInfoThread.Start(); + } + + public void DownloadUpdateAsync() + { + if (_downloadUpdateWebClient != null) + { + throw (new InvalidOperationException("A previous call to DownloadUpdateAsync() is still in progress.")); + } + + if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid) + { + throw (new InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling DownloadUpdateAsync().")); + } + + _currentUpdateInfo.UpdateFilePath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), "exe")); + DownloadUpdateWebClient.DownloadFileAsync(CurrentUpdateInfo.DownloadAddress, _currentUpdateInfo.UpdateFilePath); + } + #endregion + + #region Private Properties + private WebClient _downloadUpdateWebClient; + private WebClient DownloadUpdateWebClient + { + get { if (_downloadUpdateWebClient != null) { - throw (new InvalidOperationException("A previous call to DownloadUpdateAsync() is still in progress.")); - } - - if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid) - { - throw (new InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling DownloadUpdateAsync().")); - } - - _currentUpdateInfo.UpdateFilePath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), "exe")); - DownloadUpdateWebClient.DownloadFileAsync(CurrentUpdateInfo.DownloadAddress, _currentUpdateInfo.UpdateFilePath); - } -#endregion - -#region Private Properties - private WebClient _downloadUpdateWebClient; -private WebClient DownloadUpdateWebClient - { - get - { - if (_downloadUpdateWebClient != null) - { - return _downloadUpdateWebClient; - } - - _downloadUpdateWebClient = CreateWebClient(); - - _downloadUpdateWebClient.DownloadProgressChanged += DownloadUpdateProgressChanged; - _downloadUpdateWebClient.DownloadFileCompleted += DownloadUpdateCompleted; - return _downloadUpdateWebClient; } + + _downloadUpdateWebClient = CreateWebClient(); + + _downloadUpdateWebClient.DownloadProgressChanged += DownloadUpdateProgressChanged; + _downloadUpdateWebClient.DownloadFileCompleted += DownloadUpdateCompleted; + + return _downloadUpdateWebClient; } -#endregion + } + #endregion -#region Private Fields - private WebProxy _webProxy; - private Thread _getUpdateInfoThread; - private Thread _getChangeLogThread; - private Thread _getAnnouncementInfoThread; -#endregion + #region Private Fields + private WebProxy _webProxy; + private Thread _getUpdateInfoThread; + private Thread _getChangeLogThread; + private Thread _getAnnouncementInfoThread; + #endregion -#region Private Methods - private WebClient CreateWebClient() - { - WebClient webClient = new WebClient(); - webClient.Headers.Add("user-agent", Info.General.UserAgent); - webClient.Proxy = _webProxy; - return webClient; - } + #region Private Methods + private WebClient CreateWebClient() + { + WebClient webClient = new WebClient(); + webClient.Headers.Add("user-agent", Info.General.UserAgent); + webClient.Proxy = _webProxy; + return webClient; + } - private static DownloadStringCompletedEventArgs NewDownloadStringCompletedEventArgs(string result, Exception exception, bool cancelled, object userToken) - { - Type type = typeof(DownloadStringCompletedEventArgs); - const BindingFlags bindingFlags = bindingFlags.NonPublic | bindingFlags.Instance; - Type[] argumentTypes = new Type[] {typeof(string), typeof(Exception), typeof(bool), typeof(object)}; - ConstructorInfo constructor = type.GetConstructor(bindingFlags, null, argumentTypes, null); - object[] arguments = new object[] {result, exception, cancelled, userToken}; + private static DownloadStringCompletedEventArgs NewDownloadStringCompletedEventArgs(string result, Exception exception, bool cancelled, object userToken) + { + Type type = typeof(DownloadStringCompletedEventArgs); + const BindingFlags bindingFlags = bindingFlags.NonPublic | bindingFlags.Instance; + Type[] argumentTypes = new Type[] {typeof(string), typeof(Exception), typeof(bool), typeof(object)}; + ConstructorInfo constructor = type.GetConstructor(bindingFlags, null, argumentTypes, null); + object[] arguments = new object[] {result, exception, cancelled, userToken}; - return constructor.Invoke(arguments); - } + return constructor.Invoke(arguments); + } - private DownloadStringCompletedEventArgs DownloadString(Uri address) - { - WebClient webClient = CreateWebClient(); - string result = string.Empty; - Exception exception = null; - bool cancelled = false; + private DownloadStringCompletedEventArgs DownloadString(Uri address) + { + WebClient webClient = CreateWebClient(); + string result = string.Empty; + Exception exception = null; + bool cancelled = false; + try + { + result = webClient.DownloadString(address); + } + catch (ThreadAbortException) + { + cancelled = true; + } + catch (Exception ex) + { + exception = ex; + } + + return NewDownloadStringCompletedEventArgs(result, exception, cancelled, null); + } + + private void GetUpdateInfo() + { + Uri updateFileUri = new Uri(new Uri(System.Convert.ToString(My.Settings.Default.UpdateAddress)), new Uri(Info.Update.FileName, UriKind.Relative)); + DownloadStringCompletedEventArgs e = DownloadString(updateFileUri); + + if (!e.Cancelled && e.Error == null) + { + _currentUpdateInfo = UpdateInfo.FromString(e.Result); + + My.Settings.Default.CheckForUpdatesLastCheck = DateTime.UtcNow; + if (!My.Settings.Default.UpdatePending) + { + My.Settings.Default.UpdatePending = IsUpdateAvailable(); + } + } + + if (GetUpdateInfoCompletedEventEvent != null) + GetUpdateInfoCompletedEventEvent(this, e); + } + + private void GetChangeLog() + { + DownloadStringCompletedEventArgs e = DownloadString(_currentUpdateInfo.ChangeLogAddress); + + if (!e.Cancelled && e.Error == null) + { + _changeLog = e.Result; + } + + if (GetChangeLogCompletedEventEvent != null) + GetChangeLogCompletedEventEvent(this, e); + } + + private void GetAnnouncementInfo() + { + Uri announcementFileUri = new Uri(System.Convert.ToString(My.Settings.Default.AnnouncementAddress)); + DownloadStringCompletedEventArgs e = DownloadString(announcementFileUri); + + if (!e.Cancelled && e.Error == null) + { + _currentAnnouncementInfo = AnnouncementInfo.FromString(e.Result); + + if (!string.IsNullOrEmpty(_currentAnnouncementInfo.Name)) + { + My.Settings.Default.LastAnnouncement = _currentAnnouncementInfo.Name; + } + } + + if (GetAnnouncementInfoCompletedEventEvent != null) + GetAnnouncementInfoCompletedEventEvent(this, e); + } + + private void DownloadUpdateProgressChanged(object sender, DownloadProgressChangedEventArgs e) + { + if (DownloadUpdateProgressChangedEventEvent != null) + DownloadUpdateProgressChangedEventEvent(sender, e); + } + + private void DownloadUpdateCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) + { + AsyncCompletedEventArgs raiseEventArgs = e; + + if (!e.Cancelled && e.Error == null) + { try { - result = webClient.DownloadString(address); - } - catch (ThreadAbortException) - { - cancelled = true; + Authenticode updateAuthenticode = new Authenticode(_currentUpdateInfo.UpdateFilePath); + updateAuthenticode.RequireThumbprintMatch = true; + updateAuthenticode.ThumbprintToMatch = _currentUpdateInfo.CertificateThumbprint; + + if (!(updateAuthenticode.Verify() == (int) Authenticode.StatusValue.Verified)) + { + if (updateAuthenticode.Status == Authenticode.StatusValue.UnhandledException) + { + throw (updateAuthenticode.Exception); + } + else + { + throw (new Exception(updateAuthenticode.StatusMessage)); + } + } } catch (Exception ex) { - exception = ex; + raiseEventArgs = new AsyncCompletedEventArgs(ex, false, null); } - - return NewDownloadStringCompletedEventArgs(result, exception, cancelled, null); } - - private void GetUpdateInfo() + + if (raiseEventArgs.Cancelled || raiseEventArgs.Error != null) { - Uri updateFileUri = new Uri(new Uri(System.Convert.ToString(My.Settings.Default.UpdateAddress)), new Uri(Info.Update.FileName, UriKind.Relative)); - DownloadStringCompletedEventArgs e = DownloadString(updateFileUri); - - if (!e.Cancelled && e.Error == null) - { - _currentUpdateInfo = UpdateInfo.FromString(e.Result); - - My.Settings.Default.CheckForUpdatesLastCheck = DateTime.UtcNow; - if (!My.Settings.Default.UpdatePending) - { - My.Settings.Default.UpdatePending = IsUpdateAvailable(); - } - } - - if (GetUpdateInfoCompletedEventEvent != null) - GetUpdateInfoCompletedEventEvent(this, e); + File.Delete(_currentUpdateInfo.UpdateFilePath); } - - private void GetChangeLog() - { - DownloadStringCompletedEventArgs e = DownloadString(_currentUpdateInfo.ChangeLogAddress); - if (!e.Cancelled && e.Error == null) - { - _changeLog = e.Result; - } + if (DownloadUpdateCompletedEventEvent != null) + DownloadUpdateCompletedEventEvent(this, raiseEventArgs); - if (GetChangeLogCompletedEventEvent != null) - GetChangeLogCompletedEventEvent(this, e); - } - - private void GetAnnouncementInfo() - { - Uri announcementFileUri = new Uri(System.Convert.ToString(My.Settings.Default.AnnouncementAddress)); - DownloadStringCompletedEventArgs e = DownloadString(announcementFileUri); - - if (!e.Cancelled && e.Error == null) - { - _currentAnnouncementInfo = AnnouncementInfo.FromString(e.Result); - - if (!string.IsNullOrEmpty(_currentAnnouncementInfo.Name)) - { - My.Settings.Default.LastAnnouncement = _currentAnnouncementInfo.Name; - } - } - - if (GetAnnouncementInfoCompletedEventEvent != null) - GetAnnouncementInfoCompletedEventEvent(this, e); - } - - private void DownloadUpdateProgressChanged(object sender, DownloadProgressChangedEventArgs e) - { - if (DownloadUpdateProgressChangedEventEvent != null) - DownloadUpdateProgressChangedEventEvent(sender, e); - } - - private void DownloadUpdateCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) - { - AsyncCompletedEventArgs raiseEventArgs = e; - - if (!e.Cancelled && e.Error == null) - { - try - { - Authenticode updateAuthenticode = new Authenticode(_currentUpdateInfo.UpdateFilePath); - updateAuthenticode.RequireThumbprintMatch = true; - updateAuthenticode.ThumbprintToMatch = _currentUpdateInfo.CertificateThumbprint; - - if (!(updateAuthenticode.Verify() == (int) Authenticode.StatusValue.Verified)) - { - if (updateAuthenticode.Status == Authenticode.StatusValue.UnhandledException) - { - throw (updateAuthenticode.Exception); - } - else - { - throw (new Exception(updateAuthenticode.StatusMessage)); - } - } - } - catch (Exception ex) - { - raiseEventArgs = new AsyncCompletedEventArgs(ex, false, null); - } - } - - if (raiseEventArgs.Cancelled || raiseEventArgs.Error != null) - { - File.Delete(_currentUpdateInfo.UpdateFilePath); - } - - if (DownloadUpdateCompletedEventEvent != null) - DownloadUpdateCompletedEventEvent(this, raiseEventArgs); - - _downloadUpdateWebClient.Dispose(); - _downloadUpdateWebClient = null; - } -#endregion - -#region Public Classes - public class UpdateInfo - { -#region Public Properties - public bool IsValid {get; set;} - public Version Version {get; set;} - public Uri DownloadAddress {get; set;} - public string UpdateFilePath {get; set;} - public Uri ChangeLogAddress {get; set;} - public Uri ImageAddress {get; set;} - public Uri ImageLinkAddress {get; set;} - public string CertificateThumbprint {get; set;} -#endregion - -#region Public Methods - public static UpdateInfo FromString(string input) - { - UpdateInfo newInfo = new UpdateInfo(); - if (string.IsNullOrEmpty(input)) - { - newInfo.IsValid = false; - } - else - { - UpdateFile updateFile = new UpdateFile(input); - newInfo.Version = updateFile.GetVersion("Version"); - newInfo.DownloadAddress = updateFile.GetUri("dURL"); - newInfo.ChangeLogAddress = updateFile.GetUri("clURL"); - newInfo.ImageAddress = updateFile.GetUri("imgURL"); - newInfo.ImageLinkAddress = updateFile.GetUri("imgURLLink"); - newInfo.CertificateThumbprint = updateFile.GetThumbprint("CertificateThumbprint"); - newInfo.IsValid = true; - } - return newInfo; - } -#endregion - } - - public class AnnouncementInfo - { -#region Public Properties - public bool IsValid {get; set;} - public string Name {get; set;} - public Uri Address {get; set;} -#endregion - -#region Public Methods - public static AnnouncementInfo FromString(string input) - { - AnnouncementInfo newInfo = new AnnouncementInfo(); - if (string.IsNullOrEmpty(input)) - { - newInfo.IsValid = false; - } - else - { - UpdateFile updateFile = new UpdateFile(input); - newInfo.Name = updateFile.GetString("Name"); - newInfo.Address = updateFile.GetUri("URL"); - newInfo.IsValid = true; - } - return newInfo; - } -#endregion - } -#endregion - -#region Private Classes - private class UpdateFile - { -#region Public Properties - private Dictionary _items = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - // ReSharper disable MemberCanBePrivate.Local -public Dictionary Items - { - // ReSharper restore MemberCanBePrivate.Local - get - { - return _items; - } - } -#endregion - -#region Public Methods - public UpdateFile(string content) - { - FromString(content); - } - - // ReSharper disable MemberCanBePrivate.Local - public void FromString(string content) - { - // ReSharper restore MemberCanBePrivate.Local - if (string.IsNullOrEmpty(content)) - { - } - else - { - char[] lineSeparators = new char[] {'\n', '\r'}; - char[] keyValueSeparators = new char[] {':', '='}; - char[] commentCharacters = new char[] {'#', ';', '\''}; - - string[] lines = content.Split(lineSeparators.ToString().ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - foreach (string line in lines) - { - line = line.Trim(); - if (line.Length == 0) - { - continue; - } - if (!(line.Substring(0, 1).IndexOfAny(commentCharacters.ToString().ToCharArray()) == -1)) - { - continue; - } - - string[] parts = line.Split(keyValueSeparators.ToString().ToCharArray(), 2); - if (!(parts.Length == 2)) - { - continue; - } - string key = System.Convert.ToString(parts[0].Trim()); - string value = System.Convert.ToString(parts[1].Trim()); - - _items.Add(key, value); - } - } - } - - // ReSharper disable MemberCanBePrivate.Local - public string GetString(string key) - { - // ReSharper restore MemberCanBePrivate.Local - if (!Items.ContainsKey(key)) - { - return string.Empty; - } - return this[key]; - } - - public Version GetVersion(string key) - { - string value = GetString(key); - if (string.IsNullOrEmpty(value)) - { - return null; - } - return new Version(value); - } - - public Uri GetUri(string key) - { - string value = GetString(key); - if (string.IsNullOrEmpty(value)) - { - return null; - } - return new Uri(value); - } - - public string GetThumbprint(string key) - { - return GetString(key).Replace(" ", "").ToUpperInvariant(); - } -#endregion - } -#endregion + _downloadUpdateWebClient.Dispose(); + _downloadUpdateWebClient = null; } + #endregion + + #region Public Classes + public class UpdateInfo + { + #region Public Properties + public bool IsValid {get; set;} + public Version Version {get; set;} + public Uri DownloadAddress {get; set;} + public string UpdateFilePath {get; set;} + public Uri ChangeLogAddress {get; set;} + public Uri ImageAddress {get; set;} + public Uri ImageLinkAddress {get; set;} + public string CertificateThumbprint {get; set;} + #endregion + + #region Public Methods + public static UpdateInfo FromString(string input) + { + UpdateInfo newInfo = new UpdateInfo(); + if (string.IsNullOrEmpty(input)) + { + newInfo.IsValid = false; + } + else + { + UpdateFile updateFile = new UpdateFile(input); + newInfo.Version = updateFile.GetVersion("Version"); + newInfo.DownloadAddress = updateFile.GetUri("dURL"); + newInfo.ChangeLogAddress = updateFile.GetUri("clURL"); + newInfo.ImageAddress = updateFile.GetUri("imgURL"); + newInfo.ImageLinkAddress = updateFile.GetUri("imgURLLink"); + newInfo.CertificateThumbprint = updateFile.GetThumbprint("CertificateThumbprint"); + newInfo.IsValid = true; + } + return newInfo; + } + #endregion + } + + public class AnnouncementInfo + { + #region Public Properties + public bool IsValid {get; set;} + public string Name {get; set;} + public Uri Address {get; set;} + #endregion + + #region Public Methods + public static AnnouncementInfo FromString(string input) + { + AnnouncementInfo newInfo = new AnnouncementInfo(); + if (string.IsNullOrEmpty(input)) + { + newInfo.IsValid = false; + } + else + { + UpdateFile updateFile = new UpdateFile(input); + newInfo.Name = updateFile.GetString("Name"); + newInfo.Address = updateFile.GetUri("URL"); + newInfo.IsValid = true; + } + return newInfo; + } + #endregion + } + #endregion + + #region Private Classes + private class UpdateFile + { + #region Public Properties + private Dictionary _items = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + // ReSharper disable MemberCanBePrivate.Local + public Dictionary Items + { + // ReSharper restore MemberCanBePrivate.Local + get + { + return _items; + } + } + #endregion + + #region Public Methods + public UpdateFile(string content) + { + FromString(content); + } + + // ReSharper disable MemberCanBePrivate.Local + public void FromString(string content) + { + // ReSharper restore MemberCanBePrivate.Local + if (string.IsNullOrEmpty(content)) + { + } + else + { + char[] lineSeparators = new char[] {'\n', '\r'}; + char[] keyValueSeparators = new char[] {':', '='}; + char[] commentCharacters = new char[] {'#', ';', '\''}; + + string[] lines = content.Split(lineSeparators.ToString().ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + foreach (string line in lines) + { + line = line.Trim(); + if (line.Length == 0) + { + continue; + } + if (!(line.Substring(0, 1).IndexOfAny(commentCharacters.ToString().ToCharArray()) == -1)) + { + continue; + } + + string[] parts = line.Split(keyValueSeparators.ToString().ToCharArray(), 2); + if (!(parts.Length == 2)) + { + continue; + } + string key = System.Convert.ToString(parts[0].Trim()); + string value = System.Convert.ToString(parts[1].Trim()); + + _items.Add(key, value); + } + } + } + + // ReSharper disable MemberCanBePrivate.Local + public string GetString(string key) + { + // ReSharper restore MemberCanBePrivate.Local + if (!Items.ContainsKey(key)) + { + return string.Empty; + } + return this[key]; + } + + public Version GetVersion(string key) + { + string value = GetString(key); + if (string.IsNullOrEmpty(value)) + { + return null; + } + return new Version(value); + } + + public Uri GetUri(string key) + { + string value = GetString(key); + if (string.IsNullOrEmpty(value)) + { + return null; + } + return new Uri(value); + } + + public string GetThumbprint(string key) + { + return GetString(key).Replace(" ", "").ToUpperInvariant(); + } + #endregion + } + #endregion + } } diff --git a/mRemoteV1/CS/App/Export.cs b/mRemoteV1/CS/App/Export.cs index 499d5901b..6f44552ed 100644 --- a/mRemoteV1/CS/App/Export.cs +++ b/mRemoteV1/CS/App/Export.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,107 +8,105 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using mRemoteNG.Forms; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.App { public class Export + { + public static void ExportToFile(TreeNode rootTreeNode, TreeNode selectedTreeNode) { - public static void ExportToFile(TreeNode rootTreeNode, TreeNode selectedTreeNode) + try { - try - { - TreeNode exportTreeNode = default(TreeNode); - Security.Save saveSecurity = new Security.Save(); + TreeNode exportTreeNode = default(TreeNode); + Security.Save saveSecurity = new Security.Save(); - using (ExportForm exportForm = new ExportForm()) + using (ExportForm exportForm = new ExportForm()) + { + if (Tree.Node.GetNodeType(selectedTreeNode) == Tree.Node.Type.Container) { - if (Tree.Node.GetNodeType(selectedTreeNode) == Tree.Node.Type.Container) - { - exportForm.SelectedFolder = selectedTreeNode; - } - else if (Tree.Node.GetNodeType(selectedTreeNode) == Tree.Node.Type.Connection) - { - if (Tree.Node.GetNodeType(selectedTreeNode.Parent) == Tree.Node.Type.Container) - { - exportForm.SelectedFolder = selectedTreeNode.Parent; - } - exportForm.SelectedConnection = selectedTreeNode; - } - - if (!(exportForm.ShowDialog(frmMain) == DialogResult.OK)) - { - return ; - } - - switch (exportForm.Scope) - { - case exportForm.ExportScope.SelectedFolder: - exportTreeNode = exportForm.SelectedFolder; - break; - case exportForm.ExportScope.SelectedConnection: - exportTreeNode = exportForm.SelectedConnection; - break; - default: - exportTreeNode = rootTreeNode; - break; - } - - saveSecurity.Username = exportForm.IncludeUsername; - saveSecurity.Password = exportForm.IncludePassword; - saveSecurity.Domain = exportForm.IncludeDomain; - saveSecurity.Inheritance = exportForm.IncludeInheritance; - - SaveExportFile(exportForm.FileName, exportForm.SaveFormat, exportTreeNode, saveSecurity); + exportForm.SelectedFolder = selectedTreeNode; } + else if (Tree.Node.GetNodeType(selectedTreeNode) == Tree.Node.Type.Connection) + { + if (Tree.Node.GetNodeType(selectedTreeNode.Parent) == Tree.Node.Type.Container) + { + exportForm.SelectedFolder = selectedTreeNode.Parent; + } + exportForm.SelectedConnection = selectedTreeNode; + } + + if (!(exportForm.ShowDialog(frmMain) == DialogResult.OK)) + { + return ; + } + + switch (exportForm.Scope) + { + case exportForm.ExportScope.SelectedFolder: + exportTreeNode = exportForm.SelectedFolder; + break; + case exportForm.ExportScope.SelectedConnection: + exportTreeNode = exportForm.SelectedConnection; + break; + default: + exportTreeNode = rootTreeNode; + break; + } + + saveSecurity.Username = exportForm.IncludeUsername; + saveSecurity.Password = exportForm.IncludePassword; + saveSecurity.Domain = exportForm.IncludeDomain; + saveSecurity.Inheritance = exportForm.IncludeInheritance; + + SaveExportFile(exportForm.FileName, exportForm.SaveFormat, exportTreeNode, saveSecurity); + } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "App.Export.ExportToFile() failed.", ex: ex, logOnly: true); - } } - - private static void SaveExportFile(string fileName, mRemoteNG.Config.Connections.Save.Format saveFormat, TreeNode rootNode, Security.Save saveSecurity) + catch (Exception ex) { - bool previousTimerEnabled = false; + Runtime.MessageCollector.AddExceptionMessage(message: "App.Export.ExportToFile() failed.", ex: ex, logOnly: true); + } + } + + private static void SaveExportFile(string fileName, mRemoteNG.Config.Connections.Save.Format saveFormat, TreeNode rootNode, Security.Save saveSecurity) + { + bool previousTimerEnabled = false; - try + try + { + if (TimerSqlWatcher != null) { - if (TimerSqlWatcher != null) - { - previousTimerEnabled = TimerSqlWatcher.Enabled; - TimerSqlWatcher.Enabled = false; - } - - Config.Connections.Save connectionsSave = new Config.Connections.Save(); - connectionsSave.Export = true; - connectionsSave.ConnectionFileName = fileName; - connectionsSave.SaveFormat = saveFormat; - - connectionsSave.ConnectionList = ConnectionList; - connectionsSave.ContainerList = ContainerList; - connectionsSave.RootTreeNode = rootNode; - - connectionsSave.SaveSecurity = saveSecurity; - - connectionsSave.Save_Renamed(); + previousTimerEnabled = TimerSqlWatcher.Enabled; + TimerSqlWatcher.Enabled = false; } - catch (Exception ex) + + Config.Connections.Save connectionsSave = new Config.Connections.Save(); + connectionsSave.Export = true; + connectionsSave.ConnectionFileName = fileName; + connectionsSave.SaveFormat = saveFormat; + + connectionsSave.ConnectionList = ConnectionList; + connectionsSave.ContainerList = ContainerList; + connectionsSave.RootTreeNode = rootNode; + + connectionsSave.SaveSecurity = saveSecurity; + + connectionsSave.Save_Renamed(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(string.Format("Export.SaveExportFile(\"{0}\") failed.", fileName), ex); + } + finally + { + if (TimerSqlWatcher != null) { - MessageCollector.AddExceptionMessage(string.Format("Export.SaveExportFile(\"{0}\") failed.", fileName), ex); - } - finally - { - if (TimerSqlWatcher != null) - { - TimerSqlWatcher.Enabled = previousTimerEnabled; - } + TimerSqlWatcher.Enabled = previousTimerEnabled; } } } + } } diff --git a/mRemoteV1/CS/App/Import.cs b/mRemoteV1/CS/App/Import.cs index 7c76bfa9b..3c30cc4ce 100644 --- a/mRemoteV1/CS/App/Import.cs +++ b/mRemoteV1/CS/App/Import.cs @@ -60,16 +60,16 @@ namespace mRemoteNG.App switch (DetermineFileType(fileName)) { case FileType.mRemoteXml: - Config.import.mRemoteNG.Import(fileName, parentTreeNode); + Config.Import.mRemoteNG.Import(fileName, parentTreeNode); break; case FileType.RemoteDesktopConnection: - Config.import.RemoteDesktopConnection.Import(fileName, parentTreeNode); + Config.Import.RemoteDesktopConnection.Import(fileName, parentTreeNode); break; case FileType.RemoteDesktopConnectionManager: - Config.import.RemoteDesktopConnectionManager.Import(fileName, parentTreeNode); + Config.Import.RemoteDesktopConnectionManager.Import(fileName, parentTreeNode); break; case FileType.PuttyConnectionManager: - Config.import.PuttyConnectionManager.Import(fileName, parentTreeNode); + Config.Import.PuttyConnectionManager.Import(fileName, parentTreeNode); break; default: throw (new FileFormatException("Unrecognized file format.")); @@ -95,7 +95,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage(message: "App.Import.ImportFromFile() failed.", ex: ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage(message: "App.Import.ImportFromFile() failed.", ex: ex, logOnly: true); } } @@ -112,7 +112,7 @@ namespace mRemoteNG.App return ; } - Config.import.ActiveDirectory.Import(ldapPath, parentTreeNode); + Config.Import.ActiveDirectory.Import(ldapPath, parentTreeNode); parentTreeNode.Expand(); Container.Info parentContainer = parentTreeNode.Tag as Container.Info; @@ -125,11 +125,11 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage(message: "App.Import.ImportFromActiveDirectory() failed.", ex: ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage(message: "App.Import.ImportFromActiveDirectory() failed.", ex: ex, logOnly: true); } } - public static void ImportFromPortScan(IEnumerable hosts, Protocol.Protocol.Protocols protocol) + public static void ImportFromPortScan(IEnumerable hosts, Connection.Protocol.Protocols protocol) { try { @@ -155,7 +155,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - MessageCollector.AddExceptionMessage(message: "App.Import.ImportFromPortScan() failed.", ex: ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage(message: "App.Import.ImportFromPortScan() failed.", ex: ex, logOnly: true); } } #endregion diff --git a/mRemoteV1/CS/Config/Config.Connections.Load.cs b/mRemoteV1/CS/Config/Config.Connections.Load.cs index 3d873f966..3d6ec9655 100644 --- a/mRemoteV1/CS/Config/Config.Connections.Load.cs +++ b/mRemoteV1/CS/Config/Config.Connections.Load.cs @@ -427,7 +427,7 @@ namespace mRemoteNG.Config.Connections } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strAddNodesFromSqlFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strAddNodesFromSqlFailed + Constants.vbNewLine + ex.Message, true); } } @@ -604,7 +604,7 @@ namespace mRemoteNG.Config.Connections } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strGetConnectionInfoFromSqlFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strGetConnectionInfoFromSqlFailed + Constants.vbNewLine + ex.Message, true); } return null; @@ -701,7 +701,7 @@ namespace mRemoteNG.Config.Connections } else { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strOldConffile); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strOldConffile); } const double maxSupportedConfVersion = 2.5; @@ -766,7 +766,7 @@ namespace mRemoteNG.Config.Connections if (import && !isExportFile) { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strCannotImportNormalSessionFile); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strCannotImportNormalSessionFile); return ; } @@ -818,7 +818,7 @@ namespace mRemoteNG.Config.Connections catch (Exception ex) { App.Runtime.IsConnectionsFileLoaded = false; - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLoadFromXmlFailed + Constants.vbNewLine + ex.Message + Constants.vbNewLine + ex.StackTrace, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLoadFromXmlFailed + Constants.vbNewLine + ex.Message + Constants.vbNewLine + ex.StackTrace, true); throw; } } @@ -920,7 +920,7 @@ namespace mRemoteNG.Config.Connections } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strAddNodeFromXmlFailed + Constants.vbNewLine + ex.Message + ex.StackTrace, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strAddNodeFromXmlFailed + Constants.vbNewLine + ex.Message + ex.StackTrace, true); throw; } } @@ -1224,7 +1224,7 @@ namespace mRemoteNG.Config.Connections } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strGetConnectionInfoFromXmlFailed, conI.Name, this.ConnectionFileName, ex.Message), false); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strGetConnectionInfoFromXmlFailed, conI.Name, this.ConnectionFileName, ex.Message), false); } return conI; } diff --git a/mRemoteV1/CS/Config/Config.Connections.Save.cs b/mRemoteV1/CS/Config/Config.Connections.Save.cs index 66211535c..fa8d5a598 100644 --- a/mRemoteV1/CS/Config/Config.Connections.Save.cs +++ b/mRemoteV1/CS/Config/Config.Connections.Save.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,12 +8,10 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Xml; using System.IO; using System.Globalization; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.Data.SqlClient; //using mRemoteNG.Tools.Misc; @@ -22,1271 +19,1271 @@ using System.Data.SqlClient; namespace mRemoteNG.Config.Connections { public class Save + { + #region Public Enums + public enum Format + { + None, + mRXML, + mRCSV, + vRDvRE, + vRDCSV, + SQL + } + #endregion + + #region Private Properties + private XmlTextWriter _xmlTextWriter; + private string _password = "mR3m"; + + private SqlConnection _sqlConnection; + private SqlCommand _sqlQuery; + + private int _currentNodeIndex = 0; + private string _parentConstantId = System.Convert.ToString(0); + #endregion + + #region Public Properties + public string SQLHost {get; set;} + public string SQLDatabaseName {get; set;} + public string SQLUsername {get; set;} + public string SQLPassword {get; set;} + + public string ConnectionFileName {get; set;} + public TreeNode RootTreeNode {get; set;} + public bool Export {get; set;} + public Format SaveFormat {get; set;} + public Security.Save SaveSecurity {get; set;} + public Connection.List ConnectionList {get; set;} + public Container.List ContainerList {get; set;} + #endregion + + #region Public Methods + public void Save_Renamed() + { + switch (SaveFormat) { -#region Public Enums - public enum Format - { - None, - mRXML, - mRCSV, - vRDvRE, - vRDCSV, - SQL - } -#endregion - -#region Private Properties - private XmlTextWriter _xmlTextWriter; - private string _password = "mR3m"; - - private SqlConnection _sqlConnection; - private SqlCommand _sqlQuery; - - private int _currentNodeIndex = 0; - private string _parentConstantId = System.Convert.ToString(0); -#endregion - -#region Public Properties - public string SQLHost {get; set;} - public string SQLDatabaseName {get; set;} - public string SQLUsername {get; set;} - public string SQLPassword {get; set;} - - public string ConnectionFileName {get; set;} - public TreeNode RootTreeNode {get; set;} - public bool Export {get; set;} - public Format SaveFormat {get; set;} - public Security.Save SaveSecurity {get; set;} - public Connection.List ConnectionList {get; set;} - public Container.List ContainerList {get; set;} -#endregion - -#region Public Methods - public void Save_Renamed() - { - switch (SaveFormat) + case Format.SQL: + SaveToSQL(); + break; + case Format.mRCSV: + SaveTomRCSV(); + break; + case Format.vRDvRE: + SaveToVRE(); + break; + case Format.vRDCSV: + SaveTovRDCSV(); + break; + default: + SaveToXml(); + if (My.Settings.Default.EncryptCompleteConnectionsFile) { - case Format.SQL: - SaveToSQL(); - break; - case Format.mRCSV: - SaveTomRCSV(); - break; - case Format.vRDvRE: - SaveToVRE(); - break; - case Format.vRDCSV: - SaveTovRDCSV(); - break; - default: - SaveToXml(); - if (My.Settings.Default.EncryptCompleteConnectionsFile) - { - EncryptCompleteFile(); - } - if (!Export) - { - frmMain.Default.ConnectionsFileName = ConnectionFileName; - } - break; + EncryptCompleteFile(); } - frmMain.Default.UsingSqlServer = SaveFormat == Format.SQL; - } -#endregion - -#region SQL - private bool VerifyDatabaseVersion(SqlConnection sqlConnection) - { - bool isVerified = false; - SqlDataReader sqlDataReader = null; - System.Version databaseVersion = null; - try + if (!Export) { - SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlConnection); - sqlDataReader = sqlCommand.ExecuteReader(); - if (!sqlDataReader.HasRows) - { - return true; // assume new empty database - } - sqlDataReader.Read(); - - databaseVersion = new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); - - sqlDataReader.Close(); - - if (databaseVersion.CompareTo(new System.Version(2, 2)) == 0) // 2.2 - { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion.ToString(), "2.3")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new System.Version(2, 3); - } - - if (databaseVersion.CompareTo(new System.Version(2, 3)) == 0) // 2.3 - { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion.ToString(), "2.4")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 4); - } - - if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 - { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion.ToString(), "2.5")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 5); - } - - if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 - { - isVerified = true; - } - - if (isVerified == false) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, string.Format(My.Language.strErrorBadDatabaseVersion, databaseVersion.ToString(), (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.ProductName)); - } + frmMain.Default.ConnectionsFileName = ConnectionFileName; } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); - } - finally - { - if (sqlDataReader != null) - { - if (!sqlDataReader.IsClosed) - { - sqlDataReader.Close(); - } - } - } - return isVerified; - } - - private void SaveToSQL() - { - if (SQLUsername != "") - { - _sqlConnection = new SqlConnection("Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName + ";User Id=" + SQLUsername + ";Password=" + SQLPassword); - } - else - { - _sqlConnection = new SqlConnection("Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName + ";Integrated Security=True"); - } - - _sqlConnection.Open(); - - if (!VerifyDatabaseVersion(_sqlConnection)) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strErrorConnectionListSaveFailed); - return ; - } - - TreeNode tN = default(TreeNode); - tN = RootTreeNode.Clone(); - - string strProtected = ""; - if (tN.Tag != null) - { - if ((tN.Tag as mRemoteNG.Root.Info).Password == true) - { - _password = System.Convert.ToString((tN.Tag as mRemoteNG.Root.Info).PasswordString); - strProtected = Security.Crypt.Encrypt("ThisIsProtected", _password); - } - else - { - strProtected = Security.Crypt.Encrypt("ThisIsNotProtected", _password); - } - } - else - { - strProtected = Security.Crypt.Encrypt("ThisIsNotProtected", _password); - } - - _sqlQuery = new SqlCommand("DELETE FROM tblRoot", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + PrepareValueForDB(tN.Text) + "\', 0, \'" + strProtected + "\'," + App.Info.Connections.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlQuery = new SqlCommand("DELETE FROM tblCons", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - TreeNodeCollection tNC = default(TreeNodeCollection); - tNC = tN.Nodes; - - SaveNodesSQL(tNC); - - _sqlQuery = new SqlCommand("DELETE FROM tblUpdate", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - _sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + Tools.Misc.DBDate(DateTime.Now) + "\')", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlConnection.Close(); - } - - private void SaveNodesSQL(TreeNodeCollection tnc) - { - foreach (TreeNode node in tnc) - { - _currentNodeIndex++; - - Connection.Info curConI = default(Connection.Info); - _sqlQuery = new SqlCommand("INSERT INTO tblCons (Name, Type, Expanded, Description, Icon, Panel, Username, " + "DomainName, Password, Hostname, Protocol, PuttySession, " + "Port, ConnectToConsole, RenderingEngine, ICAEncryptionStrength, RDPAuthenticationLevel, LoadBalanceInfo, Colors, Resolution, AutomaticResize, DisplayWallpaper, " + "DisplayThemes, EnableFontSmoothing, EnableDesktopComposition, CacheBitmaps, RedirectDiskDrives, RedirectPorts, " + "RedirectPrinters, RedirectSmartCards, RedirectSound, RedirectKeys, " + "Connected, PreExtApp, PostExtApp, MacAddress, UserField, ExtApp, VNCCompression, VNCEncoding, VNCAuthMode, " + "VNCProxyType, VNCProxyIP, VNCProxyPort, VNCProxyUsername, VNCProxyPassword, " + "VNCColors, VNCSmartSizeMode, VNCViewOnly, " + "RDGatewayUsageMethod, RDGatewayHostname, RDGatewayUseConnectionCredentials, RDGatewayUsername, RDGatewayPassword, RDGatewayDomain, " + "UseCredSsp, " + "InheritCacheBitmaps, InheritColors, " + "InheritDescription, InheritDisplayThemes, InheritDisplayWallpaper, InheritEnableFontSmoothing, InheritEnableDesktopComposition, InheritDomain, " + "InheritIcon, InheritPanel, InheritPassword, InheritPort, " + "InheritProtocol, InheritPuttySession, InheritRedirectDiskDrives, " + "InheritRedirectKeys, InheritRedirectPorts, InheritRedirectPrinters, " + "InheritRedirectSmartCards, InheritRedirectSound, InheritResolution, InheritAutomaticResize, " + "InheritUseConsoleSession, InheritRenderingEngine, InheritUsername, InheritICAEncryptionStrength, InheritRDPAuthenticationLevel, InheritLoadBalanceInfo, " + "InheritPreExtApp, InheritPostExtApp, InheritMacAddress, InheritUserField, InheritExtApp, InheritVNCCompression, InheritVNCEncoding, " + "InheritVNCAuthMode, InheritVNCProxyType, InheritVNCProxyIP, InheritVNCProxyPort, " + "InheritVNCProxyUsername, InheritVNCProxyPassword, InheritVNCColors, " + "InheritVNCSmartSizeMode, InheritVNCViewOnly, " + "InheritRDGatewayUsageMethod, InheritRDGatewayHostname, InheritRDGatewayUseConnectionCredentials, InheritRDGatewayUsername, InheritRDGatewayPassword, InheritRDGatewayDomain, " - + "InheritUseCredSsp, " + "PositionID, ParentID, ConstantID, LastChange)" + "VALUES (", _sqlConnection - ); - - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection | Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) - { - //_xmlTextWriter.WriteStartElement("Node") - _sqlQuery.CommandText += "\'" + PrepareValueForDB(node.Text) + "\',"; //Name - _sqlQuery.CommandText += "\'" + Tree.Node.GetNodeType(node).ToString() + "\',"; //Type - } - - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) //container - { - _sqlQuery.CommandText += "\'" + this._ContainerList[node.Tag].IsExpanded + "\',"; //Expanded - curConI = this._ContainerList[node.Tag].ConnectionInfo; - SaveConnectionFieldsSQL(curConI); - - _sqlQuery.CommandText = Tools.Misc.PrepareForDB(_sqlQuery.CommandText); - _sqlQuery.ExecuteNonQuery(); - //_parentConstantId = _currentNodeIndex - SaveNodesSQL(node.Nodes); - //_xmlTextWriter.WriteEndElement() - } - - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) - { - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - curConI = this._ConnectionList[node.Tag]; - SaveConnectionFieldsSQL(curConI); - //_xmlTextWriter.WriteEndElement() - _sqlQuery.CommandText = Tools.Misc.PrepareForDB(_sqlQuery.CommandText); - _sqlQuery.ExecuteNonQuery(); - } - - //_parentConstantId = 0 - } - } - - private void SaveConnectionFieldsSQL(Connection.Info curConI) - { - Connection.Info with_1 = curConI; - _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Description) + "\',"; - _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Icon) + "\',"; - _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Panel) + "\',"; - - if (this._SaveSecurity.Username == true) - { - _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Username) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (this._SaveSecurity.Domain == true) - { - _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Domain) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (this._SaveSecurity.Password == true) - { - _sqlQuery.CommandText += "\'" + PrepareValueForDB(Security.Crypt.Encrypt(with_1.Password, _password)) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Hostname) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.Protocol.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.PuttySession) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Port) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.UseConsoleSession) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RenderingEngine.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.ICAEncryption.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RDPAuthenticationLevel.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.LoadBalanceInfo + "\',"; - _sqlQuery.CommandText += "\'" + with_1.Colors.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.Resolution.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.AutomaticResize) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.DisplayWallpaper) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.DisplayThemes) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.EnableFontSmoothing) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.EnableDesktopComposition) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.CacheBitmaps) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectDiskDrives) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectPorts) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectPrinters) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectSmartCards) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RedirectSound.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectKeys) + "\',"; - - if (curConI.OpenConnections.Count > 0) - { - _sqlQuery.CommandText += 1 + ","; - } - else - { - _sqlQuery.CommandText += 0 + ","; - } - - _sqlQuery.CommandText += "\'" + with_1.PreExtApp + "\',"; - _sqlQuery.CommandText += "\'" + with_1.PostExtApp + "\',"; - _sqlQuery.CommandText += "\'" + with_1.MacAddress + "\',"; - _sqlQuery.CommandText += "\'" + with_1.UserField + "\',"; - _sqlQuery.CommandText += "\'" + with_1.ExtApp + "\',"; - - _sqlQuery.CommandText += "\'" + with_1.VNCCompression.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCEncoding.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCAuthMode.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCProxyType.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCProxyIP + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.VNCProxyPort) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCProxyUsername + "\',"; - _sqlQuery.CommandText += "\'" + Security.Crypt.Encrypt(with_1.VNCProxyPassword, _password) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCColors.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCSmartSizeMode.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.VNCViewOnly) + "\',"; - - _sqlQuery.CommandText += "\'" + with_1.RDGatewayUsageMethod.ToString() + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RDGatewayHostname + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RDGatewayUseConnectionCredentials.ToString() + "\',"; - - if (this._SaveSecurity.Username == true) - { - _sqlQuery.CommandText += "\'" + with_1.RDGatewayUsername + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (this._SaveSecurity.Password == true) - { - _sqlQuery.CommandText += "\'" + Security.Crypt.Encrypt(with_1.RDGatewayPassword, _password) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (this._SaveSecurity.Domain == true) - { - _sqlQuery.CommandText += "\'" + with_1.RDGatewayDomain + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.UseCredSsp) + "\',"; - - if (this._SaveSecurity.Inheritance == true) - { - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.CacheBitmaps) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Colors) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Description) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.DisplayThemes) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.DisplayWallpaper) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.EnableFontSmoothing) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.EnableDesktopComposition) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Domain) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Icon) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Panel) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Password) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Port) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Protocol) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.PuttySession) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectDiskDrives) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectKeys) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectPorts) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectPrinters) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectSmartCards) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectSound) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Resolution) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.AutomaticResize) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.UseConsoleSession) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RenderingEngine) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Username) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.ICAEncryption) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDPAuthenticationLevel) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.LoadBalanceInfo) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.PreExtApp) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.PostExtApp) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.MacAddress) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.UserField) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.ExtApp) + "\',"; - - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCCompression) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCEncoding) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCAuthMode) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyType) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyIP) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyPort) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyUsername) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyPassword) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCColors) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCSmartSizeMode) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCViewOnly) + "\',"; - - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayUsageMethod) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayHostname) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayUseConnectionCredentials) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayUsername) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayPassword) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayDomain) + "\',"; - - _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.UseCredSsp) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .AutomaticResize - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .LoadBalanceInfo - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; - - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayUsageMethod - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayHostname - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayUseConnectionCredentials - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayUsername - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayPassword - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayDomain - - _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .UseCredSsp - } - - with_1.PositionID = _currentNodeIndex; - - if (with_1.IsContainer == false) - { - if (with_1.Parent != null) - { - _parentConstantId = System.Convert.ToString((with_1.Parent as Container.Info).ConnectionInfo.ConstantID); - } - else - { - _parentConstantId = System.Convert.ToString(0); - } - } - else - { - if ((with_1.Parent as Container.Info).Parent != null) - { - _parentConstantId = System.Convert.ToString(((with_1.Parent as Container.Info).Parent as Container.Info).ConnectionInfo.ConstantID); - } - else - { - _parentConstantId = System.Convert.ToString(0); - } - } - - _sqlQuery.CommandText += _currentNodeIndex + ",\'" + _parentConstantId + "\',\'" + with_1.ConstantID + "\',\'" + Tools.Misc.DBDate(DateTime.Now) + "\')"; - } -#endregion - -#region XML - private void EncryptCompleteFile() - { - StreamReader streamReader = new StreamReader(ConnectionFileName); - - string fileContents = ""; - fileContents = streamReader.ReadToEnd(); - streamReader.Close(); - - if (!string.IsNullOrEmpty(fileContents)) - { - StreamWriter streamWriter = new StreamWriter(ConnectionFileName); - streamWriter.Write(Security.Crypt.Encrypt(fileContents, _password)); - streamWriter.Close(); - } - } - - private void SaveToXml() - { - try - { - if (!IsConnectionsFileLoaded) - { - return; - } - - TreeNode treeNode = default(TreeNode); - - if (Tree.Node.GetNodeType(RootTreeNode) == Tree.Node.Type.Root) - { - treeNode = RootTreeNode.Clone(); - } - else - { - treeNode = new TreeNode("mR|Export (" + Tools.Misc.DBDate(DateTime.Now) + ")"); - treeNode.Nodes.Add(System.Convert.ToString(RootTreeNode.Clone())); - } - - string tempFileName = Path.GetTempFileName(); - _xmlTextWriter = new XmlTextWriter(tempFileName, System.Text.Encoding.UTF8); - - _xmlTextWriter.Formatting = Formatting.Indented; - _xmlTextWriter.Indentation = 4; - - _xmlTextWriter.WriteStartDocument(); - - _xmlTextWriter.WriteStartElement("Connections"); // Do not localize - _xmlTextWriter.WriteAttributeString("Name", "", treeNode.Text); - _xmlTextWriter.WriteAttributeString("Export", "", System.Convert.ToString(Export)); - - if (Export) - { - _xmlTextWriter.WriteAttributeString("Protected", "", Security.Crypt.Encrypt("ThisIsNotProtected", _password)); - } - else - { - if ((treeNode.Tag as Root.Info).Password == true) - { - _password = System.Convert.ToString((treeNode.Tag as Root.Info).PasswordString); - _xmlTextWriter.WriteAttributeString("Protected", "", Security.Crypt.Encrypt("ThisIsProtected", _password)); - } - else - { - _xmlTextWriter.WriteAttributeString("Protected", "", Security.Crypt.Encrypt("ThisIsNotProtected", _password)); - } - } - - _xmlTextWriter.WriteAttributeString("ConfVersion", "", App.Info.Connections.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture)); - - TreeNodeCollection treeNodeCollection = default(TreeNodeCollection); - treeNodeCollection = treeNode.Nodes; - - SaveNode(treeNodeCollection); - - _xmlTextWriter.WriteEndElement(); - _xmlTextWriter.Close(); - - if (File.Exists(ConnectionFileName)) - { - if (Export) - { - File.Delete(ConnectionFileName); - } - else - { - string backupFileName = ConnectionFileName +".backup"; - File.Delete(backupFileName); - File.Move(ConnectionFileName, backupFileName); - } - } - File.Move(tempFileName, ConnectionFileName); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveToXml failed" + Constants.vbNewLine + ex.Message, false); - } - } - - private void SaveNode(TreeNodeCollection tNC) - { - try - { - foreach (TreeNode node in tNC) - { - Connection.Info curConI = default(Connection.Info); - - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection | Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) - { - _xmlTextWriter.WriteStartElement("Node"); - _xmlTextWriter.WriteAttributeString("Name", "", node.Text); - _xmlTextWriter.WriteAttributeString("Type", "", Tree.Node.GetNodeType(node).ToString()); - } - - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) //container - { - _xmlTextWriter.WriteAttributeString("Expanded", "", System.Convert.ToString(this._ContainerList[node.Tag].TreeNode.IsExpanded)); - curConI = this._ContainerList[node.Tag].ConnectionInfo; - SaveConnectionFields(curConI); - SaveNode(node.Nodes); - _xmlTextWriter.WriteEndElement(); - } - - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) - { - curConI = this._ConnectionList[node.Tag]; - SaveConnectionFields(curConI); - _xmlTextWriter.WriteEndElement(); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveNode failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void SaveConnectionFields(Connection.Info curConI) - { - try - { - _xmlTextWriter.WriteAttributeString("Descr", "", curConI.Description); - - _xmlTextWriter.WriteAttributeString("Icon", "", curConI.Icon); - - _xmlTextWriter.WriteAttributeString("Panel", "", curConI.Panel); - - if (this._SaveSecurity.Username == true) - { - _xmlTextWriter.WriteAttributeString("Username", "", curConI.Username); - } - else - { - _xmlTextWriter.WriteAttributeString("Username", "", ""); - } - - if (this._SaveSecurity.Domain == true) - { - _xmlTextWriter.WriteAttributeString("Domain", "", curConI.Domain); - } - else - { - _xmlTextWriter.WriteAttributeString("Domain", "", ""); - } - - if (this._SaveSecurity.Password == true) - { - _xmlTextWriter.WriteAttributeString("Password", "", Security.Crypt.Encrypt(curConI.Password, _password)); - } - else - { - _xmlTextWriter.WriteAttributeString("Password", "", ""); - } - - _xmlTextWriter.WriteAttributeString("Hostname", "", curConI.Hostname); - - _xmlTextWriter.WriteAttributeString("Protocol", "", curConI.Protocol.ToString()); - - _xmlTextWriter.WriteAttributeString("PuttySession", "", curConI.PuttySession); - - _xmlTextWriter.WriteAttributeString("Port", "", System.Convert.ToString(curConI.Port)); - - _xmlTextWriter.WriteAttributeString("ConnectToConsole", "", System.Convert.ToString(curConI.UseConsoleSession)); - - _xmlTextWriter.WriteAttributeString("UseCredSsp", "", System.Convert.ToString(curConI.UseCredSsp)); - - _xmlTextWriter.WriteAttributeString("RenderingEngine", "", curConI.RenderingEngine.ToString()); - - _xmlTextWriter.WriteAttributeString("ICAEncryptionStrength", "", curConI.ICAEncryption.ToString()); - - _xmlTextWriter.WriteAttributeString("RDPAuthenticationLevel", "", curConI.RDPAuthenticationLevel.ToString()); - - _xmlTextWriter.WriteAttributeString("LoadBalanceInfo", "", curConI.LoadBalanceInfo); - - _xmlTextWriter.WriteAttributeString("Colors", "", curConI.Colors.ToString()); - - _xmlTextWriter.WriteAttributeString("Resolution", "", curConI.Resolution.ToString()); - - _xmlTextWriter.WriteAttributeString("AutomaticResize", "", System.Convert.ToString(curConI.AutomaticResize)); - - _xmlTextWriter.WriteAttributeString("DisplayWallpaper", "", System.Convert.ToString(curConI.DisplayWallpaper)); - - _xmlTextWriter.WriteAttributeString("DisplayThemes", "", System.Convert.ToString(curConI.DisplayThemes)); - - _xmlTextWriter.WriteAttributeString("EnableFontSmoothing", "", System.Convert.ToString(curConI.EnableFontSmoothing)); - - _xmlTextWriter.WriteAttributeString("EnableDesktopComposition", "", System.Convert.ToString(curConI.EnableDesktopComposition)); - - _xmlTextWriter.WriteAttributeString("CacheBitmaps", "", System.Convert.ToString(curConI.CacheBitmaps)); - - _xmlTextWriter.WriteAttributeString("RedirectDiskDrives", "", System.Convert.ToString(curConI.RedirectDiskDrives)); - - _xmlTextWriter.WriteAttributeString("RedirectPorts", "", System.Convert.ToString(curConI.RedirectPorts)); - - _xmlTextWriter.WriteAttributeString("RedirectPrinters", "", System.Convert.ToString(curConI.RedirectPrinters)); - - _xmlTextWriter.WriteAttributeString("RedirectSmartCards", "", System.Convert.ToString(curConI.RedirectSmartCards)); - - _xmlTextWriter.WriteAttributeString("RedirectSound", "", curConI.RedirectSound.ToString()); - - _xmlTextWriter.WriteAttributeString("RedirectKeys", "", System.Convert.ToString(curConI.RedirectKeys)); - - if (curConI.OpenConnections.Count > 0) - { - _xmlTextWriter.WriteAttributeString("Connected", "", System.Convert.ToString(true)); - } - else - { - _xmlTextWriter.WriteAttributeString("Connected", "", System.Convert.ToString(false)); - } - - _xmlTextWriter.WriteAttributeString("PreExtApp", "", curConI.PreExtApp); - _xmlTextWriter.WriteAttributeString("PostExtApp", "", curConI.PostExtApp); - _xmlTextWriter.WriteAttributeString("MacAddress", "", curConI.MacAddress); - _xmlTextWriter.WriteAttributeString("UserField", "", curConI.UserField); - _xmlTextWriter.WriteAttributeString("ExtApp", "", curConI.ExtApp); - - _xmlTextWriter.WriteAttributeString("VNCCompression", "", curConI.VNCCompression.ToString()); - _xmlTextWriter.WriteAttributeString("VNCEncoding", "", curConI.VNCEncoding.ToString()); - _xmlTextWriter.WriteAttributeString("VNCAuthMode", "", curConI.VNCAuthMode.ToString()); - _xmlTextWriter.WriteAttributeString("VNCProxyType", "", curConI.VNCProxyType.ToString()); - _xmlTextWriter.WriteAttributeString("VNCProxyIP", "", curConI.VNCProxyIP); - _xmlTextWriter.WriteAttributeString("VNCProxyPort", "", System.Convert.ToString(curConI.VNCProxyPort)); - _xmlTextWriter.WriteAttributeString("VNCProxyUsername", "", curConI.VNCProxyUsername); - _xmlTextWriter.WriteAttributeString("VNCProxyPassword", "", Security.Crypt.Encrypt(curConI.VNCProxyPassword, _password)); - _xmlTextWriter.WriteAttributeString("VNCColors", "", curConI.VNCColors.ToString()); - _xmlTextWriter.WriteAttributeString("VNCSmartSizeMode", "", curConI.VNCSmartSizeMode.ToString()); - _xmlTextWriter.WriteAttributeString("VNCViewOnly", "", System.Convert.ToString(curConI.VNCViewOnly)); - - _xmlTextWriter.WriteAttributeString("RDGatewayUsageMethod", "", curConI.RDGatewayUsageMethod.ToString()); - _xmlTextWriter.WriteAttributeString("RDGatewayHostname", "", curConI.RDGatewayHostname); - - _xmlTextWriter.WriteAttributeString("RDGatewayUseConnectionCredentials", "", curConI.RDGatewayUseConnectionCredentials.ToString()); - - if (this._SaveSecurity.Username == true) - { - _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", curConI.RDGatewayUsername); - } - else - { - _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", ""); - } - - if (this._SaveSecurity.Password == true) - { - _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", Security.Crypt.Encrypt(curConI.RDGatewayPassword, _password)); - } - else - { - _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", ""); - } - - if (this._SaveSecurity.Domain == true) - { - _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", curConI.RDGatewayDomain); - } - else - { - _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", ""); - } - - if (this._SaveSecurity.Inheritance == true) - { - _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", System.Convert.ToString(curConI.Inherit.CacheBitmaps)); - _xmlTextWriter.WriteAttributeString("InheritColors", "", System.Convert.ToString(curConI.Inherit.Colors)); - _xmlTextWriter.WriteAttributeString("InheritDescription", "", System.Convert.ToString(curConI.Inherit.Description)); - _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", System.Convert.ToString(curConI.Inherit.DisplayThemes)); - _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", System.Convert.ToString(curConI.Inherit.DisplayWallpaper)); - _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", System.Convert.ToString(curConI.Inherit.EnableFontSmoothing)); - _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", System.Convert.ToString(curConI.Inherit.EnableDesktopComposition)); - _xmlTextWriter.WriteAttributeString("InheritDomain", "", System.Convert.ToString(curConI.Inherit.Domain)); - _xmlTextWriter.WriteAttributeString("InheritIcon", "", System.Convert.ToString(curConI.Inherit.Icon)); - _xmlTextWriter.WriteAttributeString("InheritPanel", "", System.Convert.ToString(curConI.Inherit.Panel)); - _xmlTextWriter.WriteAttributeString("InheritPassword", "", System.Convert.ToString(curConI.Inherit.Password)); - _xmlTextWriter.WriteAttributeString("InheritPort", "", System.Convert.ToString(curConI.Inherit.Port)); - _xmlTextWriter.WriteAttributeString("InheritProtocol", "", System.Convert.ToString(curConI.Inherit.Protocol)); - _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", System.Convert.ToString(curConI.Inherit.PuttySession)); - _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", System.Convert.ToString(curConI.Inherit.RedirectDiskDrives)); - _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", System.Convert.ToString(curConI.Inherit.RedirectKeys)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", System.Convert.ToString(curConI.Inherit.RedirectPorts)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", System.Convert.ToString(curConI.Inherit.RedirectPrinters)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", System.Convert.ToString(curConI.Inherit.RedirectSmartCards)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", System.Convert.ToString(curConI.Inherit.RedirectSound)); - _xmlTextWriter.WriteAttributeString("InheritResolution", "", System.Convert.ToString(curConI.Inherit.Resolution)); - _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", System.Convert.ToString(curConI.Inherit.AutomaticResize)); - _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", System.Convert.ToString(curConI.Inherit.UseConsoleSession)); - _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", System.Convert.ToString(curConI.Inherit.UseCredSsp)); - _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", System.Convert.ToString(curConI.Inherit.RenderingEngine)); - _xmlTextWriter.WriteAttributeString("InheritUsername", "", System.Convert.ToString(curConI.Inherit.Username)); - _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", System.Convert.ToString(curConI.Inherit.ICAEncryption)); - _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", System.Convert.ToString(curConI.Inherit.RDPAuthenticationLevel)); - _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", System.Convert.ToString(curConI.Inherit.LoadBalanceInfo)); - _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", System.Convert.ToString(curConI.Inherit.PreExtApp)); - _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", System.Convert.ToString(curConI.Inherit.PostExtApp)); - _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", System.Convert.ToString(curConI.Inherit.MacAddress)); - _xmlTextWriter.WriteAttributeString("InheritUserField", "", System.Convert.ToString(curConI.Inherit.UserField)); - _xmlTextWriter.WriteAttributeString("InheritExtApp", "", System.Convert.ToString(curConI.Inherit.ExtApp)); - _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", System.Convert.ToString(curConI.Inherit.VNCCompression)); - _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", System.Convert.ToString(curConI.Inherit.VNCEncoding)); - _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", System.Convert.ToString(curConI.Inherit.VNCAuthMode)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", System.Convert.ToString(curConI.Inherit.VNCProxyType)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", System.Convert.ToString(curConI.Inherit.VNCProxyIP)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", System.Convert.ToString(curConI.Inherit.VNCProxyPort)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", System.Convert.ToString(curConI.Inherit.VNCProxyUsername)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", System.Convert.ToString(curConI.Inherit.VNCProxyPassword)); - _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", System.Convert.ToString(curConI.Inherit.VNCColors)); - _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", System.Convert.ToString(curConI.Inherit.VNCSmartSizeMode)); - _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", System.Convert.ToString(curConI.Inherit.VNCViewOnly)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsageMethod", "", System.Convert.ToString(curConI.Inherit.RDGatewayUsageMethod)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", System.Convert.ToString(curConI.Inherit.RDGatewayHostname)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", System.Convert.ToString(curConI.Inherit.RDGatewayUseConnectionCredentials)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", System.Convert.ToString(curConI.Inherit.RDGatewayUsername)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", System.Convert.ToString(curConI.Inherit.RDGatewayPassword)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", System.Convert.ToString(curConI.Inherit.RDGatewayDomain)); - } - else - { - _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritColors", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDescription", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDomain", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritIcon", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPanel", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPassword", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPort", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritProtocol", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritResolution", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUsername", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUserField", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritExtApp", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", System.Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", System.Convert.ToString(false)); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveConnectionFields failed" + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region CSV - private StreamWriter csvWr; - - private void SaveTomRCSV() - { - if (App.Runtime.IsConnectionsFileLoaded == false) - { - return; - } - - TreeNode tN = default(TreeNode); - tN = RootTreeNode.Clone(); - - TreeNodeCollection tNC = default(TreeNodeCollection); - tNC = tN.Nodes; - - csvWr = new StreamWriter(ConnectionFileName); - - - string csvLn = string.Empty; - - csvLn += "Name;Folder;Description;Icon;Panel;"; - - if (SaveSecurity.Username) - { - csvLn += "Username;"; - } - - if (SaveSecurity.Password) - { - csvLn += "Password;"; - } - - if (SaveSecurity.Domain) - { - csvLn += "Domain;"; - } - - csvLn += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;"; - - if (SaveSecurity.Inheritance) - { - csvLn += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain"; - } - - csvWr.WriteLine(csvLn); - - SaveNodemRCSV(tNC); - - csvWr.Close(); - } - - private void SaveNodemRCSV(TreeNodeCollection tNC) - { - foreach (TreeNode node in tNC) - { - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) - { - Connection.Info curConI = node.Tag; - - WritemRCSVLine(curConI); - } - else if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) - { - SaveNodemRCSV(node.Nodes); - } - } - } - - private void WritemRCSVLine(Connection.Info con) - { - string nodePath = con.TreeNode.FullPath; - - int firstSlash = nodePath.IndexOf("\\"); - nodePath = nodePath.Remove(0, firstSlash + 1); - int lastSlash = nodePath.LastIndexOf("\\"); - - if (lastSlash > 0) - { - nodePath = nodePath.Remove(lastSlash); - } - else - { - nodePath = ""; - } - - string csvLn = string.Empty; - - csvLn += con.Name + ";" + nodePath + ";" + con.Description + ";" + con.Icon + ";" + con.Panel + ";"; - - if (SaveSecurity.Username) - { - csvLn += con.Username + ";"; - } - - if (SaveSecurity.Password) - { - csvLn += con.Password + ";"; - } - - if (SaveSecurity.Domain) - { - csvLn += con.Domain + ";"; - } - - csvLn += con.Hostname + ";" + con.Protocol.ToString() + ";" + con.PuttySession + ";" + System.Convert.ToString(con.Port) + ";" + System.Convert.ToString(con.UseConsoleSession) + ";" + System.Convert.ToString(con.UseCredSsp) + ";" + con.RenderingEngine.ToString() + ";" + con.ICAEncryption.ToString() + ";" + con.RDPAuthenticationLevel.ToString() + ";" + con.LoadBalanceInfo + ";" + con.Colors.ToString() + ";" + con.Resolution.ToString() + ";" + System.Convert.ToString(con.AutomaticResize) + ";" + System.Convert.ToString(con.DisplayWallpaper) + ";" + System.Convert.ToString(con.DisplayThemes) + ";" + System.Convert.ToString(con.EnableFontSmoothing) + ";" + System.Convert.ToString(con.EnableDesktopComposition) + ";" + System.Convert.ToString(con.CacheBitmaps) + ";" + System.Convert.ToString(con.RedirectDiskDrives) + ";" + System.Convert.ToString(con.RedirectPorts) + ";" + System.Convert.ToString(con.RedirectPrinters) + ";" + System.Convert.ToString(con.RedirectSmartCards) + ";" + con.RedirectSound.ToString() + ";" + System.Convert.ToString(con.RedirectKeys) + ";" + con.PreExtApp + ";" + con.PostExtApp + ";" + con.MacAddress + ";" + con.UserField + ";" + con.ExtApp + ";" + con.VNCCompression.ToString() + ";" + con.VNCEncoding.ToString() + ";" + con.VNCAuthMode.ToString() + ";" + con.VNCProxyType.ToString() + ";" + con.VNCProxyIP + ";" + System.Convert.ToString(con.VNCProxyPort) + ";" + con.VNCProxyUsername + ";" + con.VNCProxyPassword + ";" + con.VNCColors.ToString() + ";" + con.VNCSmartSizeMode.ToString() + ";" + System.Convert.ToString(con.VNCViewOnly) + ";"; - - if (SaveSecurity.Inheritance) - { - csvLn += con.Inherit.CacheBitmaps + ";" + System.Convert.ToString(con.Inherit.Colors) + ";" + System.Convert.ToString(con.Inherit.Description) + ";" + System.Convert.ToString(con.Inherit.DisplayThemes) + ";" + System.Convert.ToString(con.Inherit.DisplayWallpaper) + ";" + System.Convert.ToString(con.Inherit.EnableFontSmoothing) + ";" + System.Convert.ToString(con.Inherit.EnableDesktopComposition) + ";" + System.Convert.ToString(con.Inherit.Domain) + ";" + System.Convert.ToString(con.Inherit.Icon) + ";" + System.Convert.ToString(con.Inherit.Panel) + ";" + System.Convert.ToString(con.Inherit.Password) + ";" + System.Convert.ToString(con.Inherit.Port) + ";" + System.Convert.ToString(con.Inherit.Protocol) + ";" + System.Convert.ToString(con.Inherit.PuttySession) + ";" + System.Convert.ToString(con.Inherit.RedirectDiskDrives) + ";" + System.Convert.ToString(con.Inherit.RedirectKeys) + ";" + System.Convert.ToString(con.Inherit.RedirectPorts) + ";" + System.Convert.ToString(con.Inherit.RedirectPrinters) + ";" + System.Convert.ToString(con.Inherit.RedirectSmartCards) + ";" + System.Convert.ToString(con.Inherit.RedirectSound) + ";" + System.Convert.ToString(con.Inherit.Resolution) + ";" + System.Convert.ToString(con.Inherit.AutomaticResize) + ";" + System.Convert.ToString(con.Inherit.UseConsoleSession) + ";" + System.Convert.ToString(con.Inherit.UseCredSsp) + ";" + System.Convert.ToString(con.Inherit.RenderingEngine) + ";" + System.Convert.ToString(con.Inherit.Username) + ";" + System.Convert.ToString(con.Inherit.ICAEncryption) + ";" + System.Convert.ToString(con.Inherit.RDPAuthenticationLevel) + ";" + System.Convert.ToString(con.Inherit.LoadBalanceInfo) + ";" + System.Convert.ToString(con.Inherit.PreExtApp) + ";" + System.Convert.ToString(con.Inherit.PostExtApp) + ";" + System.Convert.ToString(con.Inherit.MacAddress) + ";" + System.Convert.ToString(con.Inherit.UserField) + ";" + System.Convert.ToString(con.Inherit.ExtApp) + ";" + System.Convert.ToString(con.Inherit.VNCCompression) + ";" - + System.Convert.ToString(con.Inherit.VNCEncoding) + ";" + System.Convert.ToString(con.Inherit.VNCAuthMode) + ";" + System.Convert.ToString(con.Inherit.VNCProxyType) + ";" + System.Convert.ToString(con.Inherit.VNCProxyIP) + ";" + System.Convert.ToString(con.Inherit.VNCProxyPort) + ";" + System.Convert.ToString(con.Inherit.VNCProxyUsername) + ";" + System.Convert.ToString(con.Inherit.VNCProxyPassword) + ";" + System.Convert.ToString(con.Inherit.VNCColors) + ";" + System.Convert.ToString(con.Inherit.VNCSmartSizeMode) + ";" + System.Convert.ToString(con.Inherit.VNCViewOnly); - } - - csvWr.WriteLine(csvLn); - } -#endregion - -#region vRD CSV - private void SaveTovRDCSV() - { - if (App.Runtime.IsConnectionsFileLoaded == false) - { - return; - } - - TreeNode tN = default(TreeNode); - tN = RootTreeNode.Clone(); - - TreeNodeCollection tNC = default(TreeNodeCollection); - tNC = tN.Nodes; - - csvWr = new StreamWriter(ConnectionFileName); - - SaveNodevRDCSV(tNC); - - csvWr.Close(); - } - - private void SaveNodevRDCSV(TreeNodeCollection tNC) - { - foreach (TreeNode node in tNC) - { - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) - { - Connection.Info curConI = node.Tag; - - if (curConI.Protocol == Connection.Protocol.Protocols.RDP) - { - WritevRDCSVLine(curConI); - } - } - else if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) - { - SaveNodevRDCSV(node.Nodes); - } - } - } - - private void WritevRDCSVLine(Connection.Info con) - { - string nodePath = con.TreeNode.FullPath; - - int firstSlash = nodePath.IndexOf("\\"); - nodePath = nodePath.Remove(0, firstSlash + 1); - int lastSlash = nodePath.LastIndexOf("\\"); - - if (lastSlash > 0) - { - nodePath = nodePath.Remove(lastSlash); - } - else - { - nodePath = ""; - } - - csvWr.WriteLine(con.Name + ";" + con.Hostname + ";" + con.MacAddress + ";;" + System.Convert.ToString(con.Port) + ";" + System.Convert.ToString(con.UseConsoleSession) + ";" + nodePath); - } -#endregion - -#region vRD VRE - private void SaveToVRE() - { - if (App.Runtime.IsConnectionsFileLoaded == false) - { - return; - } - - TreeNode tN = default(TreeNode); - tN = RootTreeNode.Clone(); - - TreeNodeCollection tNC = default(TreeNodeCollection); - tNC = tN.Nodes; - - _xmlTextWriter = new XmlTextWriter(ConnectionFileName, System.Text.Encoding.UTF8); - _xmlTextWriter.Formatting = Formatting.Indented; - _xmlTextWriter.Indentation = 4; - - _xmlTextWriter.WriteStartDocument(); - - _xmlTextWriter.WriteStartElement("vRDConfig"); - _xmlTextWriter.WriteAttributeString("Version", "", "2.0"); - - _xmlTextWriter.WriteStartElement("Connections"); - SaveNodeVRE(tNC); - _xmlTextWriter.WriteEndElement(); - - _xmlTextWriter.WriteEndElement(); - _xmlTextWriter.WriteEndDocument(); - _xmlTextWriter.Close(); - } - - private void SaveNodeVRE(TreeNodeCollection tNC) - { - foreach (TreeNode node in tNC) - { - if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) - { - Connection.Info curConI = node.Tag; - - if (curConI.Protocol == Connection.Protocol.Protocols.RDP) - { - _xmlTextWriter.WriteStartElement("Connection"); - _xmlTextWriter.WriteAttributeString("Id", "", ""); - - WriteVREitem(curConI); - - _xmlTextWriter.WriteEndElement(); - } - } - else - { - SaveNodeVRE(node.Nodes); - } - } - } - - private void WriteVREitem(Connection.Info con) - { - //Name - _xmlTextWriter.WriteStartElement("ConnectionName"); - _xmlTextWriter.WriteValue(con.Name); - _xmlTextWriter.WriteEndElement(); - - //Hostname - _xmlTextWriter.WriteStartElement("ServerName"); - _xmlTextWriter.WriteValue(con.Hostname); - _xmlTextWriter.WriteEndElement(); - - //Mac Adress - _xmlTextWriter.WriteStartElement("MACAddress"); - _xmlTextWriter.WriteValue(con.MacAddress); - _xmlTextWriter.WriteEndElement(); - - //Management Board URL - _xmlTextWriter.WriteStartElement("MgmtBoardUrl"); - _xmlTextWriter.WriteValue(""); - _xmlTextWriter.WriteEndElement(); - - //Description - _xmlTextWriter.WriteStartElement("Description"); - _xmlTextWriter.WriteValue(con.Description); - _xmlTextWriter.WriteEndElement(); - - //Port - _xmlTextWriter.WriteStartElement("Port"); - _xmlTextWriter.WriteValue(con.Port); - _xmlTextWriter.WriteEndElement(); - - //Console Session - _xmlTextWriter.WriteStartElement("Console"); - _xmlTextWriter.WriteValue(con.UseConsoleSession); - _xmlTextWriter.WriteEndElement(); - - //Redirect Clipboard - _xmlTextWriter.WriteStartElement("ClipBoard"); - _xmlTextWriter.WriteValue(true); - _xmlTextWriter.WriteEndElement(); - - //Redirect Printers - _xmlTextWriter.WriteStartElement("Printer"); - _xmlTextWriter.WriteValue(con.RedirectPrinters); - _xmlTextWriter.WriteEndElement(); - - //Redirect Ports - _xmlTextWriter.WriteStartElement("Serial"); - _xmlTextWriter.WriteValue(con.RedirectPorts); - _xmlTextWriter.WriteEndElement(); - - //Redirect Disks - _xmlTextWriter.WriteStartElement("LocalDrives"); - _xmlTextWriter.WriteValue(con.RedirectDiskDrives); - _xmlTextWriter.WriteEndElement(); - - //Redirect Smartcards - _xmlTextWriter.WriteStartElement("SmartCard"); - _xmlTextWriter.WriteValue(con.RedirectSmartCards); - _xmlTextWriter.WriteEndElement(); - - //Connection Place - _xmlTextWriter.WriteStartElement("ConnectionPlace"); - _xmlTextWriter.WriteValue("2"); //---------------------------------------------------------- - _xmlTextWriter.WriteEndElement(); - - //Smart Size - _xmlTextWriter.WriteStartElement("AutoSize"); - _xmlTextWriter.WriteValue(con.Resolution == Connection.Protocol.RDP.RDPResolutions.SmartSize); - _xmlTextWriter.WriteEndElement(); - - //SeparateResolutionX - _xmlTextWriter.WriteStartElement("SeparateResolutionX"); - _xmlTextWriter.WriteValue("1024"); - _xmlTextWriter.WriteEndElement(); - - //SeparateResolutionY - _xmlTextWriter.WriteStartElement("SeparateResolutionY"); - _xmlTextWriter.WriteValue("768"); - _xmlTextWriter.WriteEndElement(); - - Rectangle resolution = Connection.Protocol.RDP.GetResolutionRectangle(con.Resolution); - if (resolution.Width == 0) - { - resolution.Width = 1024; - } - if (resolution.Height == 0) - { - resolution.Height = 768; - } - - //TabResolutionX - _xmlTextWriter.WriteStartElement("TabResolutionX"); - _xmlTextWriter.WriteValue(resolution.Width); - _xmlTextWriter.WriteEndElement(); - - //TabResolutionY - _xmlTextWriter.WriteStartElement("TabResolutionY"); - _xmlTextWriter.WriteValue(resolution.Height); - _xmlTextWriter.WriteEndElement(); - - //RDPColorDepth - _xmlTextWriter.WriteStartElement("RDPColorDepth"); - _xmlTextWriter.WriteValue(con.Colors.ToString().Replace("Colors", "").Replace("Bit", "")); - _xmlTextWriter.WriteEndElement(); - - //Bitmap Caching - _xmlTextWriter.WriteStartElement("BitmapCaching"); - _xmlTextWriter.WriteValue(con.CacheBitmaps); - _xmlTextWriter.WriteEndElement(); - - //Themes - _xmlTextWriter.WriteStartElement("Themes"); - _xmlTextWriter.WriteValue(con.DisplayThemes); - _xmlTextWriter.WriteEndElement(); - - //Wallpaper - _xmlTextWriter.WriteStartElement("Wallpaper"); - _xmlTextWriter.WriteValue(con.DisplayWallpaper); - _xmlTextWriter.WriteEndElement(); - } -#endregion + break; } + frmMain.Default.UsingSqlServer = SaveFormat == Format.SQL; + } + #endregion + + #region SQL + private bool VerifyDatabaseVersion(SqlConnection sqlConnection) + { + bool isVerified = false; + SqlDataReader sqlDataReader = null; + System.Version databaseVersion = null; + try + { + SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlConnection); + sqlDataReader = sqlCommand.ExecuteReader(); + if (!sqlDataReader.HasRows) + { + return true; // assume new empty database + } + sqlDataReader.Read(); + + databaseVersion = new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); + + sqlDataReader.Close(); + + if (databaseVersion.CompareTo(new System.Version(2, 2)) == 0) // 2.2 + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion.ToString(), "2.3")); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new System.Version(2, 3); + } + + if (databaseVersion.CompareTo(new System.Version(2, 3)) == 0) // 2.3 + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion.ToString(), "2.4")); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 4); + } + + if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion.ToString(), "2.5")); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 5); + } + + if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 + { + isVerified = true; + } + + if (isVerified == false) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, string.Format(My.Language.strErrorBadDatabaseVersion, databaseVersion.ToString(), (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.ProductName)); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); + } + finally + { + if (sqlDataReader != null) + { + if (!sqlDataReader.IsClosed) + { + sqlDataReader.Close(); + } + } + } + return isVerified; + } + + private void SaveToSQL() + { + if (SQLUsername != "") + { + _sqlConnection = new SqlConnection("Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName + ";User Id=" + SQLUsername + ";Password=" + SQLPassword); + } + else + { + _sqlConnection = new SqlConnection("Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName + ";Integrated Security=True"); + } + + _sqlConnection.Open(); + + if (!VerifyDatabaseVersion(_sqlConnection)) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strErrorConnectionListSaveFailed); + return ; + } + + TreeNode tN = default(TreeNode); + tN = RootTreeNode.Clone(); + + string strProtected = ""; + if (tN.Tag != null) + { + if ((tN.Tag as mRemoteNG.Root.Info).Password == true) + { + _password = System.Convert.ToString((tN.Tag as mRemoteNG.Root.Info).PasswordString); + strProtected = Security.Crypt.Encrypt("ThisIsProtected", _password); + } + else + { + strProtected = Security.Crypt.Encrypt("ThisIsNotProtected", _password); + } + } + else + { + strProtected = Security.Crypt.Encrypt("ThisIsNotProtected", _password); + } + + _sqlQuery = new SqlCommand("DELETE FROM tblRoot", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + _sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + PrepareValueForDB(tN.Text) + "\', 0, \'" + strProtected + "\'," + App.Info.Connections.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + _sqlQuery = new SqlCommand("DELETE FROM tblCons", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + TreeNodeCollection tNC = default(TreeNodeCollection); + tNC = tN.Nodes; + + SaveNodesSQL(tNC); + + _sqlQuery = new SqlCommand("DELETE FROM tblUpdate", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + _sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + Tools.Misc.DBDate(DateTime.Now) + "\')", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + _sqlConnection.Close(); + } + + private void SaveNodesSQL(TreeNodeCollection tnc) + { + foreach (TreeNode node in tnc) + { + _currentNodeIndex++; + + Connection.Info curConI = default(Connection.Info); + _sqlQuery = new SqlCommand("INSERT INTO tblCons (Name, Type, Expanded, Description, Icon, Panel, Username, " + "DomainName, Password, Hostname, Protocol, PuttySession, " + "Port, ConnectToConsole, RenderingEngine, ICAEncryptionStrength, RDPAuthenticationLevel, LoadBalanceInfo, Colors, Resolution, AutomaticResize, DisplayWallpaper, " + "DisplayThemes, EnableFontSmoothing, EnableDesktopComposition, CacheBitmaps, RedirectDiskDrives, RedirectPorts, " + "RedirectPrinters, RedirectSmartCards, RedirectSound, RedirectKeys, " + "Connected, PreExtApp, PostExtApp, MacAddress, UserField, ExtApp, VNCCompression, VNCEncoding, VNCAuthMode, " + "VNCProxyType, VNCProxyIP, VNCProxyPort, VNCProxyUsername, VNCProxyPassword, " + "VNCColors, VNCSmartSizeMode, VNCViewOnly, " + "RDGatewayUsageMethod, RDGatewayHostname, RDGatewayUseConnectionCredentials, RDGatewayUsername, RDGatewayPassword, RDGatewayDomain, " + "UseCredSsp, " + "InheritCacheBitmaps, InheritColors, " + "InheritDescription, InheritDisplayThemes, InheritDisplayWallpaper, InheritEnableFontSmoothing, InheritEnableDesktopComposition, InheritDomain, " + "InheritIcon, InheritPanel, InheritPassword, InheritPort, " + "InheritProtocol, InheritPuttySession, InheritRedirectDiskDrives, " + "InheritRedirectKeys, InheritRedirectPorts, InheritRedirectPrinters, " + "InheritRedirectSmartCards, InheritRedirectSound, InheritResolution, InheritAutomaticResize, " + "InheritUseConsoleSession, InheritRenderingEngine, InheritUsername, InheritICAEncryptionStrength, InheritRDPAuthenticationLevel, InheritLoadBalanceInfo, " + "InheritPreExtApp, InheritPostExtApp, InheritMacAddress, InheritUserField, InheritExtApp, InheritVNCCompression, InheritVNCEncoding, " + "InheritVNCAuthMode, InheritVNCProxyType, InheritVNCProxyIP, InheritVNCProxyPort, " + "InheritVNCProxyUsername, InheritVNCProxyPassword, InheritVNCColors, " + "InheritVNCSmartSizeMode, InheritVNCViewOnly, " + "InheritRDGatewayUsageMethod, InheritRDGatewayHostname, InheritRDGatewayUseConnectionCredentials, InheritRDGatewayUsername, InheritRDGatewayPassword, InheritRDGatewayDomain, " + + "InheritUseCredSsp, " + "PositionID, ParentID, ConstantID, LastChange)" + "VALUES (", _sqlConnection + ); + + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection | Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) + { + //_xmlTextWriter.WriteStartElement("Node") + _sqlQuery.CommandText += "\'" + PrepareValueForDB(node.Text) + "\',"; //Name + _sqlQuery.CommandText += "\'" + Tree.Node.GetNodeType(node).ToString() + "\',"; //Type + } + + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) //container + { + _sqlQuery.CommandText += "\'" + this._ContainerList[node.Tag].IsExpanded + "\',"; //Expanded + curConI = this._ContainerList[node.Tag].ConnectionInfo; + SaveConnectionFieldsSQL(curConI); + + _sqlQuery.CommandText = Tools.Misc.PrepareForDB(_sqlQuery.CommandText); + _sqlQuery.ExecuteNonQuery(); + //_parentConstantId = _currentNodeIndex + SaveNodesSQL(node.Nodes); + //_xmlTextWriter.WriteEndElement() + } + + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) + { + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + curConI = this._ConnectionList[node.Tag]; + SaveConnectionFieldsSQL(curConI); + //_xmlTextWriter.WriteEndElement() + _sqlQuery.CommandText = Tools.Misc.PrepareForDB(_sqlQuery.CommandText); + _sqlQuery.ExecuteNonQuery(); + } + + //_parentConstantId = 0 + } + } + + private void SaveConnectionFieldsSQL(Connection.Info curConI) + { + Connection.Info with_1 = curConI; + _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Description) + "\',"; + _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Icon) + "\',"; + _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Panel) + "\',"; + + if (this._SaveSecurity.Username == true) + { + _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Username) + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + "" + "\',"; + } + + if (this._SaveSecurity.Domain == true) + { + _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Domain) + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + "" + "\',"; + } + + if (this._SaveSecurity.Password == true) + { + _sqlQuery.CommandText += "\'" + PrepareValueForDB(Security.Crypt.Encrypt(with_1.Password, _password)) + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + "" + "\',"; + } + + _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.Hostname) + "\',"; + _sqlQuery.CommandText += "\'" + with_1.Protocol.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + PrepareValueForDB(with_1.PuttySession) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Port) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.UseConsoleSession) + "\',"; + _sqlQuery.CommandText += "\'" + with_1.RenderingEngine.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.ICAEncryption.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.RDPAuthenticationLevel.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.LoadBalanceInfo + "\',"; + _sqlQuery.CommandText += "\'" + with_1.Colors.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.Resolution.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.AutomaticResize) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.DisplayWallpaper) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.DisplayThemes) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.EnableFontSmoothing) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.EnableDesktopComposition) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.CacheBitmaps) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectDiskDrives) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectPorts) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectPrinters) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectSmartCards) + "\',"; + _sqlQuery.CommandText += "\'" + with_1.RedirectSound.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.RedirectKeys) + "\',"; + + if (curConI.OpenConnections.Count > 0) + { + _sqlQuery.CommandText += 1 + ","; + } + else + { + _sqlQuery.CommandText += 0 + ","; + } + + _sqlQuery.CommandText += "\'" + with_1.PreExtApp + "\',"; + _sqlQuery.CommandText += "\'" + with_1.PostExtApp + "\',"; + _sqlQuery.CommandText += "\'" + with_1.MacAddress + "\',"; + _sqlQuery.CommandText += "\'" + with_1.UserField + "\',"; + _sqlQuery.CommandText += "\'" + with_1.ExtApp + "\',"; + + _sqlQuery.CommandText += "\'" + with_1.VNCCompression.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.VNCEncoding.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.VNCAuthMode.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.VNCProxyType.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.VNCProxyIP + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.VNCProxyPort) + "\',"; + _sqlQuery.CommandText += "\'" + with_1.VNCProxyUsername + "\',"; + _sqlQuery.CommandText += "\'" + Security.Crypt.Encrypt(with_1.VNCProxyPassword, _password) + "\',"; + _sqlQuery.CommandText += "\'" + with_1.VNCColors.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.VNCSmartSizeMode.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.VNCViewOnly) + "\',"; + + _sqlQuery.CommandText += "\'" + with_1.RDGatewayUsageMethod.ToString() + "\',"; + _sqlQuery.CommandText += "\'" + with_1.RDGatewayHostname + "\',"; + _sqlQuery.CommandText += "\'" + with_1.RDGatewayUseConnectionCredentials.ToString() + "\',"; + + if (this._SaveSecurity.Username == true) + { + _sqlQuery.CommandText += "\'" + with_1.RDGatewayUsername + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + "" + "\',"; + } + + if (this._SaveSecurity.Password == true) + { + _sqlQuery.CommandText += "\'" + Security.Crypt.Encrypt(with_1.RDGatewayPassword, _password) + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + "" + "\',"; + } + + if (this._SaveSecurity.Domain == true) + { + _sqlQuery.CommandText += "\'" + with_1.RDGatewayDomain + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + "" + "\',"; + } + + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.UseCredSsp) + "\',"; + + if (this._SaveSecurity.Inheritance == true) + { + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.CacheBitmaps) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Colors) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Description) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.DisplayThemes) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.DisplayWallpaper) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.EnableFontSmoothing) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.EnableDesktopComposition) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Domain) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Icon) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Panel) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Password) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Port) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Protocol) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.PuttySession) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectDiskDrives) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectKeys) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectPorts) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectPrinters) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectSmartCards) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RedirectSound) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Resolution) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.AutomaticResize) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.UseConsoleSession) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RenderingEngine) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.Username) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.ICAEncryption) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDPAuthenticationLevel) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.LoadBalanceInfo) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.PreExtApp) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.PostExtApp) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.MacAddress) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.UserField) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.ExtApp) + "\',"; + + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCCompression) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCEncoding) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCAuthMode) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyType) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyIP) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyPort) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyUsername) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCProxyPassword) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCColors) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCSmartSizeMode) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.VNCViewOnly) + "\',"; + + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayUsageMethod) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayHostname) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayUseConnectionCredentials) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayUsername) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayPassword) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.RDGatewayDomain) + "\',"; + + _sqlQuery.CommandText += "\'" + System.Convert.ToString(with_1.Inherit.UseCredSsp) + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .AutomaticResize + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .LoadBalanceInfo + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; + + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayUsageMethod + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayHostname + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayUseConnectionCredentials + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayUsername + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayPassword + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .RDGatewayDomain + + _sqlQuery.CommandText += "\'" + System.Convert.ToString(false) + "\',"; // .UseCredSsp + } + + with_1.PositionID = _currentNodeIndex; + + if (with_1.IsContainer == false) + { + if (with_1.Parent != null) + { + _parentConstantId = System.Convert.ToString((with_1.Parent as Container.Info).ConnectionInfo.ConstantID); + } + else + { + _parentConstantId = System.Convert.ToString(0); + } + } + else + { + if ((with_1.Parent as Container.Info).Parent != null) + { + _parentConstantId = System.Convert.ToString(((with_1.Parent as Container.Info).Parent as Container.Info).ConnectionInfo.ConstantID); + } + else + { + _parentConstantId = System.Convert.ToString(0); + } + } + + _sqlQuery.CommandText += _currentNodeIndex + ",\'" + _parentConstantId + "\',\'" + with_1.ConstantID + "\',\'" + Tools.Misc.DBDate(DateTime.Now) + "\')"; + } + #endregion + + #region XML + private void EncryptCompleteFile() + { + StreamReader streamReader = new StreamReader(ConnectionFileName); + + string fileContents = ""; + fileContents = streamReader.ReadToEnd(); + streamReader.Close(); + + if (!string.IsNullOrEmpty(fileContents)) + { + StreamWriter streamWriter = new StreamWriter(ConnectionFileName); + streamWriter.Write(Security.Crypt.Encrypt(fileContents, _password)); + streamWriter.Close(); + } + } + + private void SaveToXml() + { + try + { + if (!IsConnectionsFileLoaded) + { + return; + } + + TreeNode treeNode = default(TreeNode); + + if (Tree.Node.GetNodeType(RootTreeNode) == Tree.Node.Type.Root) + { + treeNode = RootTreeNode.Clone(); + } + else + { + treeNode = new TreeNode("mR|Export (" + Tools.Misc.DBDate(DateTime.Now) + ")"); + treeNode.Nodes.Add(System.Convert.ToString(RootTreeNode.Clone())); + } + + string tempFileName = Path.GetTempFileName(); + _xmlTextWriter = new XmlTextWriter(tempFileName, System.Text.Encoding.UTF8); + + _xmlTextWriter.Formatting = Formatting.Indented; + _xmlTextWriter.Indentation = 4; + + _xmlTextWriter.WriteStartDocument(); + + _xmlTextWriter.WriteStartElement("Connections"); // Do not localize + _xmlTextWriter.WriteAttributeString("Name", "", treeNode.Text); + _xmlTextWriter.WriteAttributeString("Export", "", System.Convert.ToString(Export)); + + if (Export) + { + _xmlTextWriter.WriteAttributeString("Protected", "", Security.Crypt.Encrypt("ThisIsNotProtected", _password)); + } + else + { + if ((treeNode.Tag as Root.Info).Password == true) + { + _password = System.Convert.ToString((treeNode.Tag as Root.Info).PasswordString); + _xmlTextWriter.WriteAttributeString("Protected", "", Security.Crypt.Encrypt("ThisIsProtected", _password)); + } + else + { + _xmlTextWriter.WriteAttributeString("Protected", "", Security.Crypt.Encrypt("ThisIsNotProtected", _password)); + } + } + + _xmlTextWriter.WriteAttributeString("ConfVersion", "", App.Info.Connections.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture)); + + TreeNodeCollection treeNodeCollection = default(TreeNodeCollection); + treeNodeCollection = treeNode.Nodes; + + SaveNode(treeNodeCollection); + + _xmlTextWriter.WriteEndElement(); + _xmlTextWriter.Close(); + + if (File.Exists(ConnectionFileName)) + { + if (Export) + { + File.Delete(ConnectionFileName); + } + else + { + string backupFileName = ConnectionFileName +".backup"; + File.Delete(backupFileName); + File.Move(ConnectionFileName, backupFileName); + } + } + File.Move(tempFileName, ConnectionFileName); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveToXml failed" + Constants.vbNewLine + ex.Message, false); + } + } + + private void SaveNode(TreeNodeCollection tNC) + { + try + { + foreach (TreeNode node in tNC) + { + Connection.Info curConI = default(Connection.Info); + + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection | Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) + { + _xmlTextWriter.WriteStartElement("Node"); + _xmlTextWriter.WriteAttributeString("Name", "", node.Text); + _xmlTextWriter.WriteAttributeString("Type", "", Tree.Node.GetNodeType(node).ToString()); + } + + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) //container + { + _xmlTextWriter.WriteAttributeString("Expanded", "", System.Convert.ToString(this._ContainerList[node.Tag].TreeNode.IsExpanded)); + curConI = this._ContainerList[node.Tag].ConnectionInfo; + SaveConnectionFields(curConI); + SaveNode(node.Nodes); + _xmlTextWriter.WriteEndElement(); + } + + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) + { + curConI = this._ConnectionList[node.Tag]; + SaveConnectionFields(curConI); + _xmlTextWriter.WriteEndElement(); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveNode failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void SaveConnectionFields(Connection.Info curConI) + { + try + { + _xmlTextWriter.WriteAttributeString("Descr", "", curConI.Description); + + _xmlTextWriter.WriteAttributeString("Icon", "", curConI.Icon); + + _xmlTextWriter.WriteAttributeString("Panel", "", curConI.Panel); + + if (this._SaveSecurity.Username == true) + { + _xmlTextWriter.WriteAttributeString("Username", "", curConI.Username); + } + else + { + _xmlTextWriter.WriteAttributeString("Username", "", ""); + } + + if (this._SaveSecurity.Domain == true) + { + _xmlTextWriter.WriteAttributeString("Domain", "", curConI.Domain); + } + else + { + _xmlTextWriter.WriteAttributeString("Domain", "", ""); + } + + if (this._SaveSecurity.Password == true) + { + _xmlTextWriter.WriteAttributeString("Password", "", Security.Crypt.Encrypt(curConI.Password, _password)); + } + else + { + _xmlTextWriter.WriteAttributeString("Password", "", ""); + } + + _xmlTextWriter.WriteAttributeString("Hostname", "", curConI.Hostname); + + _xmlTextWriter.WriteAttributeString("Protocol", "", curConI.Protocol.ToString()); + + _xmlTextWriter.WriteAttributeString("PuttySession", "", curConI.PuttySession); + + _xmlTextWriter.WriteAttributeString("Port", "", System.Convert.ToString(curConI.Port)); + + _xmlTextWriter.WriteAttributeString("ConnectToConsole", "", System.Convert.ToString(curConI.UseConsoleSession)); + + _xmlTextWriter.WriteAttributeString("UseCredSsp", "", System.Convert.ToString(curConI.UseCredSsp)); + + _xmlTextWriter.WriteAttributeString("RenderingEngine", "", curConI.RenderingEngine.ToString()); + + _xmlTextWriter.WriteAttributeString("ICAEncryptionStrength", "", curConI.ICAEncryption.ToString()); + + _xmlTextWriter.WriteAttributeString("RDPAuthenticationLevel", "", curConI.RDPAuthenticationLevel.ToString()); + + _xmlTextWriter.WriteAttributeString("LoadBalanceInfo", "", curConI.LoadBalanceInfo); + + _xmlTextWriter.WriteAttributeString("Colors", "", curConI.Colors.ToString()); + + _xmlTextWriter.WriteAttributeString("Resolution", "", curConI.Resolution.ToString()); + + _xmlTextWriter.WriteAttributeString("AutomaticResize", "", System.Convert.ToString(curConI.AutomaticResize)); + + _xmlTextWriter.WriteAttributeString("DisplayWallpaper", "", System.Convert.ToString(curConI.DisplayWallpaper)); + + _xmlTextWriter.WriteAttributeString("DisplayThemes", "", System.Convert.ToString(curConI.DisplayThemes)); + + _xmlTextWriter.WriteAttributeString("EnableFontSmoothing", "", System.Convert.ToString(curConI.EnableFontSmoothing)); + + _xmlTextWriter.WriteAttributeString("EnableDesktopComposition", "", System.Convert.ToString(curConI.EnableDesktopComposition)); + + _xmlTextWriter.WriteAttributeString("CacheBitmaps", "", System.Convert.ToString(curConI.CacheBitmaps)); + + _xmlTextWriter.WriteAttributeString("RedirectDiskDrives", "", System.Convert.ToString(curConI.RedirectDiskDrives)); + + _xmlTextWriter.WriteAttributeString("RedirectPorts", "", System.Convert.ToString(curConI.RedirectPorts)); + + _xmlTextWriter.WriteAttributeString("RedirectPrinters", "", System.Convert.ToString(curConI.RedirectPrinters)); + + _xmlTextWriter.WriteAttributeString("RedirectSmartCards", "", System.Convert.ToString(curConI.RedirectSmartCards)); + + _xmlTextWriter.WriteAttributeString("RedirectSound", "", curConI.RedirectSound.ToString()); + + _xmlTextWriter.WriteAttributeString("RedirectKeys", "", System.Convert.ToString(curConI.RedirectKeys)); + + if (curConI.OpenConnections.Count > 0) + { + _xmlTextWriter.WriteAttributeString("Connected", "", System.Convert.ToString(true)); + } + else + { + _xmlTextWriter.WriteAttributeString("Connected", "", System.Convert.ToString(false)); + } + + _xmlTextWriter.WriteAttributeString("PreExtApp", "", curConI.PreExtApp); + _xmlTextWriter.WriteAttributeString("PostExtApp", "", curConI.PostExtApp); + _xmlTextWriter.WriteAttributeString("MacAddress", "", curConI.MacAddress); + _xmlTextWriter.WriteAttributeString("UserField", "", curConI.UserField); + _xmlTextWriter.WriteAttributeString("ExtApp", "", curConI.ExtApp); + + _xmlTextWriter.WriteAttributeString("VNCCompression", "", curConI.VNCCompression.ToString()); + _xmlTextWriter.WriteAttributeString("VNCEncoding", "", curConI.VNCEncoding.ToString()); + _xmlTextWriter.WriteAttributeString("VNCAuthMode", "", curConI.VNCAuthMode.ToString()); + _xmlTextWriter.WriteAttributeString("VNCProxyType", "", curConI.VNCProxyType.ToString()); + _xmlTextWriter.WriteAttributeString("VNCProxyIP", "", curConI.VNCProxyIP); + _xmlTextWriter.WriteAttributeString("VNCProxyPort", "", System.Convert.ToString(curConI.VNCProxyPort)); + _xmlTextWriter.WriteAttributeString("VNCProxyUsername", "", curConI.VNCProxyUsername); + _xmlTextWriter.WriteAttributeString("VNCProxyPassword", "", Security.Crypt.Encrypt(curConI.VNCProxyPassword, _password)); + _xmlTextWriter.WriteAttributeString("VNCColors", "", curConI.VNCColors.ToString()); + _xmlTextWriter.WriteAttributeString("VNCSmartSizeMode", "", curConI.VNCSmartSizeMode.ToString()); + _xmlTextWriter.WriteAttributeString("VNCViewOnly", "", System.Convert.ToString(curConI.VNCViewOnly)); + + _xmlTextWriter.WriteAttributeString("RDGatewayUsageMethod", "", curConI.RDGatewayUsageMethod.ToString()); + _xmlTextWriter.WriteAttributeString("RDGatewayHostname", "", curConI.RDGatewayHostname); + + _xmlTextWriter.WriteAttributeString("RDGatewayUseConnectionCredentials", "", curConI.RDGatewayUseConnectionCredentials.ToString()); + + if (this._SaveSecurity.Username == true) + { + _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", curConI.RDGatewayUsername); + } + else + { + _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", ""); + } + + if (this._SaveSecurity.Password == true) + { + _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", Security.Crypt.Encrypt(curConI.RDGatewayPassword, _password)); + } + else + { + _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", ""); + } + + if (this._SaveSecurity.Domain == true) + { + _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", curConI.RDGatewayDomain); + } + else + { + _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", ""); + } + + if (this._SaveSecurity.Inheritance == true) + { + _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", System.Convert.ToString(curConI.Inherit.CacheBitmaps)); + _xmlTextWriter.WriteAttributeString("InheritColors", "", System.Convert.ToString(curConI.Inherit.Colors)); + _xmlTextWriter.WriteAttributeString("InheritDescription", "", System.Convert.ToString(curConI.Inherit.Description)); + _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", System.Convert.ToString(curConI.Inherit.DisplayThemes)); + _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", System.Convert.ToString(curConI.Inherit.DisplayWallpaper)); + _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", System.Convert.ToString(curConI.Inherit.EnableFontSmoothing)); + _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", System.Convert.ToString(curConI.Inherit.EnableDesktopComposition)); + _xmlTextWriter.WriteAttributeString("InheritDomain", "", System.Convert.ToString(curConI.Inherit.Domain)); + _xmlTextWriter.WriteAttributeString("InheritIcon", "", System.Convert.ToString(curConI.Inherit.Icon)); + _xmlTextWriter.WriteAttributeString("InheritPanel", "", System.Convert.ToString(curConI.Inherit.Panel)); + _xmlTextWriter.WriteAttributeString("InheritPassword", "", System.Convert.ToString(curConI.Inherit.Password)); + _xmlTextWriter.WriteAttributeString("InheritPort", "", System.Convert.ToString(curConI.Inherit.Port)); + _xmlTextWriter.WriteAttributeString("InheritProtocol", "", System.Convert.ToString(curConI.Inherit.Protocol)); + _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", System.Convert.ToString(curConI.Inherit.PuttySession)); + _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", System.Convert.ToString(curConI.Inherit.RedirectDiskDrives)); + _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", System.Convert.ToString(curConI.Inherit.RedirectKeys)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", System.Convert.ToString(curConI.Inherit.RedirectPorts)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", System.Convert.ToString(curConI.Inherit.RedirectPrinters)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", System.Convert.ToString(curConI.Inherit.RedirectSmartCards)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", System.Convert.ToString(curConI.Inherit.RedirectSound)); + _xmlTextWriter.WriteAttributeString("InheritResolution", "", System.Convert.ToString(curConI.Inherit.Resolution)); + _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", System.Convert.ToString(curConI.Inherit.AutomaticResize)); + _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", System.Convert.ToString(curConI.Inherit.UseConsoleSession)); + _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", System.Convert.ToString(curConI.Inherit.UseCredSsp)); + _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", System.Convert.ToString(curConI.Inherit.RenderingEngine)); + _xmlTextWriter.WriteAttributeString("InheritUsername", "", System.Convert.ToString(curConI.Inherit.Username)); + _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", System.Convert.ToString(curConI.Inherit.ICAEncryption)); + _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", System.Convert.ToString(curConI.Inherit.RDPAuthenticationLevel)); + _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", System.Convert.ToString(curConI.Inherit.LoadBalanceInfo)); + _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", System.Convert.ToString(curConI.Inherit.PreExtApp)); + _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", System.Convert.ToString(curConI.Inherit.PostExtApp)); + _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", System.Convert.ToString(curConI.Inherit.MacAddress)); + _xmlTextWriter.WriteAttributeString("InheritUserField", "", System.Convert.ToString(curConI.Inherit.UserField)); + _xmlTextWriter.WriteAttributeString("InheritExtApp", "", System.Convert.ToString(curConI.Inherit.ExtApp)); + _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", System.Convert.ToString(curConI.Inherit.VNCCompression)); + _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", System.Convert.ToString(curConI.Inherit.VNCEncoding)); + _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", System.Convert.ToString(curConI.Inherit.VNCAuthMode)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", System.Convert.ToString(curConI.Inherit.VNCProxyType)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", System.Convert.ToString(curConI.Inherit.VNCProxyIP)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", System.Convert.ToString(curConI.Inherit.VNCProxyPort)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", System.Convert.ToString(curConI.Inherit.VNCProxyUsername)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", System.Convert.ToString(curConI.Inherit.VNCProxyPassword)); + _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", System.Convert.ToString(curConI.Inherit.VNCColors)); + _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", System.Convert.ToString(curConI.Inherit.VNCSmartSizeMode)); + _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", System.Convert.ToString(curConI.Inherit.VNCViewOnly)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsageMethod", "", System.Convert.ToString(curConI.Inherit.RDGatewayUsageMethod)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", System.Convert.ToString(curConI.Inherit.RDGatewayHostname)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", System.Convert.ToString(curConI.Inherit.RDGatewayUseConnectionCredentials)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", System.Convert.ToString(curConI.Inherit.RDGatewayUsername)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", System.Convert.ToString(curConI.Inherit.RDGatewayPassword)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", System.Convert.ToString(curConI.Inherit.RDGatewayDomain)); + } + else + { + _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritColors", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDescription", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDomain", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritIcon", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPanel", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPassword", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPort", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritProtocol", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritResolution", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUsername", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUserField", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritExtApp", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", System.Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", System.Convert.ToString(false)); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveConnectionFields failed" + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region CSV + private StreamWriter csvWr; + + private void SaveTomRCSV() + { + if (App.Runtime.IsConnectionsFileLoaded == false) + { + return; + } + + TreeNode tN = default(TreeNode); + tN = RootTreeNode.Clone(); + + TreeNodeCollection tNC = default(TreeNodeCollection); + tNC = tN.Nodes; + + csvWr = new StreamWriter(ConnectionFileName); + + + string csvLn = string.Empty; + + csvLn += "Name;Folder;Description;Icon;Panel;"; + + if (SaveSecurity.Username) + { + csvLn += "Username;"; + } + + if (SaveSecurity.Password) + { + csvLn += "Password;"; + } + + if (SaveSecurity.Domain) + { + csvLn += "Domain;"; + } + + csvLn += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;"; + + if (SaveSecurity.Inheritance) + { + csvLn += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain"; + } + + csvWr.WriteLine(csvLn); + + SaveNodemRCSV(tNC); + + csvWr.Close(); + } + + private void SaveNodemRCSV(TreeNodeCollection tNC) + { + foreach (TreeNode node in tNC) + { + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) + { + Connection.Info curConI = node.Tag; + + WritemRCSVLine(curConI); + } + else if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) + { + SaveNodemRCSV(node.Nodes); + } + } + } + + private void WritemRCSVLine(Connection.Info con) + { + string nodePath = con.TreeNode.FullPath; + + int firstSlash = nodePath.IndexOf("\\"); + nodePath = nodePath.Remove(0, firstSlash + 1); + int lastSlash = nodePath.LastIndexOf("\\"); + + if (lastSlash > 0) + { + nodePath = nodePath.Remove(lastSlash); + } + else + { + nodePath = ""; + } + + string csvLn = string.Empty; + + csvLn += con.Name + ";" + nodePath + ";" + con.Description + ";" + con.Icon + ";" + con.Panel + ";"; + + if (SaveSecurity.Username) + { + csvLn += con.Username + ";"; + } + + if (SaveSecurity.Password) + { + csvLn += con.Password + ";"; + } + + if (SaveSecurity.Domain) + { + csvLn += con.Domain + ";"; + } + + csvLn += con.Hostname + ";" + con.Protocol.ToString() + ";" + con.PuttySession + ";" + System.Convert.ToString(con.Port) + ";" + System.Convert.ToString(con.UseConsoleSession) + ";" + System.Convert.ToString(con.UseCredSsp) + ";" + con.RenderingEngine.ToString() + ";" + con.ICAEncryption.ToString() + ";" + con.RDPAuthenticationLevel.ToString() + ";" + con.LoadBalanceInfo + ";" + con.Colors.ToString() + ";" + con.Resolution.ToString() + ";" + System.Convert.ToString(con.AutomaticResize) + ";" + System.Convert.ToString(con.DisplayWallpaper) + ";" + System.Convert.ToString(con.DisplayThemes) + ";" + System.Convert.ToString(con.EnableFontSmoothing) + ";" + System.Convert.ToString(con.EnableDesktopComposition) + ";" + System.Convert.ToString(con.CacheBitmaps) + ";" + System.Convert.ToString(con.RedirectDiskDrives) + ";" + System.Convert.ToString(con.RedirectPorts) + ";" + System.Convert.ToString(con.RedirectPrinters) + ";" + System.Convert.ToString(con.RedirectSmartCards) + ";" + con.RedirectSound.ToString() + ";" + System.Convert.ToString(con.RedirectKeys) + ";" + con.PreExtApp + ";" + con.PostExtApp + ";" + con.MacAddress + ";" + con.UserField + ";" + con.ExtApp + ";" + con.VNCCompression.ToString() + ";" + con.VNCEncoding.ToString() + ";" + con.VNCAuthMode.ToString() + ";" + con.VNCProxyType.ToString() + ";" + con.VNCProxyIP + ";" + System.Convert.ToString(con.VNCProxyPort) + ";" + con.VNCProxyUsername + ";" + con.VNCProxyPassword + ";" + con.VNCColors.ToString() + ";" + con.VNCSmartSizeMode.ToString() + ";" + System.Convert.ToString(con.VNCViewOnly) + ";"; + + if (SaveSecurity.Inheritance) + { + csvLn += con.Inherit.CacheBitmaps + ";" + System.Convert.ToString(con.Inherit.Colors) + ";" + System.Convert.ToString(con.Inherit.Description) + ";" + System.Convert.ToString(con.Inherit.DisplayThemes) + ";" + System.Convert.ToString(con.Inherit.DisplayWallpaper) + ";" + System.Convert.ToString(con.Inherit.EnableFontSmoothing) + ";" + System.Convert.ToString(con.Inherit.EnableDesktopComposition) + ";" + System.Convert.ToString(con.Inherit.Domain) + ";" + System.Convert.ToString(con.Inherit.Icon) + ";" + System.Convert.ToString(con.Inherit.Panel) + ";" + System.Convert.ToString(con.Inherit.Password) + ";" + System.Convert.ToString(con.Inherit.Port) + ";" + System.Convert.ToString(con.Inherit.Protocol) + ";" + System.Convert.ToString(con.Inherit.PuttySession) + ";" + System.Convert.ToString(con.Inherit.RedirectDiskDrives) + ";" + System.Convert.ToString(con.Inherit.RedirectKeys) + ";" + System.Convert.ToString(con.Inherit.RedirectPorts) + ";" + System.Convert.ToString(con.Inherit.RedirectPrinters) + ";" + System.Convert.ToString(con.Inherit.RedirectSmartCards) + ";" + System.Convert.ToString(con.Inherit.RedirectSound) + ";" + System.Convert.ToString(con.Inherit.Resolution) + ";" + System.Convert.ToString(con.Inherit.AutomaticResize) + ";" + System.Convert.ToString(con.Inherit.UseConsoleSession) + ";" + System.Convert.ToString(con.Inherit.UseCredSsp) + ";" + System.Convert.ToString(con.Inherit.RenderingEngine) + ";" + System.Convert.ToString(con.Inherit.Username) + ";" + System.Convert.ToString(con.Inherit.ICAEncryption) + ";" + System.Convert.ToString(con.Inherit.RDPAuthenticationLevel) + ";" + System.Convert.ToString(con.Inherit.LoadBalanceInfo) + ";" + System.Convert.ToString(con.Inherit.PreExtApp) + ";" + System.Convert.ToString(con.Inherit.PostExtApp) + ";" + System.Convert.ToString(con.Inherit.MacAddress) + ";" + System.Convert.ToString(con.Inherit.UserField) + ";" + System.Convert.ToString(con.Inherit.ExtApp) + ";" + System.Convert.ToString(con.Inherit.VNCCompression) + ";" + + System.Convert.ToString(con.Inherit.VNCEncoding) + ";" + System.Convert.ToString(con.Inherit.VNCAuthMode) + ";" + System.Convert.ToString(con.Inherit.VNCProxyType) + ";" + System.Convert.ToString(con.Inherit.VNCProxyIP) + ";" + System.Convert.ToString(con.Inherit.VNCProxyPort) + ";" + System.Convert.ToString(con.Inherit.VNCProxyUsername) + ";" + System.Convert.ToString(con.Inherit.VNCProxyPassword) + ";" + System.Convert.ToString(con.Inherit.VNCColors) + ";" + System.Convert.ToString(con.Inherit.VNCSmartSizeMode) + ";" + System.Convert.ToString(con.Inherit.VNCViewOnly); + } + + csvWr.WriteLine(csvLn); + } + #endregion + + #region vRD CSV + private void SaveTovRDCSV() + { + if (App.Runtime.IsConnectionsFileLoaded == false) + { + return; + } + + TreeNode tN = default(TreeNode); + tN = RootTreeNode.Clone(); + + TreeNodeCollection tNC = default(TreeNodeCollection); + tNC = tN.Nodes; + + csvWr = new StreamWriter(ConnectionFileName); + + SaveNodevRDCSV(tNC); + + csvWr.Close(); + } + + private void SaveNodevRDCSV(TreeNodeCollection tNC) + { + foreach (TreeNode node in tNC) + { + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) + { + Connection.Info curConI = node.Tag; + + if (curConI.Protocol == Connection.Protocol.Protocols.RDP) + { + WritevRDCSVLine(curConI); + } + } + else if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Container) + { + SaveNodevRDCSV(node.Nodes); + } + } + } + + private void WritevRDCSVLine(Connection.Info con) + { + string nodePath = con.TreeNode.FullPath; + + int firstSlash = nodePath.IndexOf("\\"); + nodePath = nodePath.Remove(0, firstSlash + 1); + int lastSlash = nodePath.LastIndexOf("\\"); + + if (lastSlash > 0) + { + nodePath = nodePath.Remove(lastSlash); + } + else + { + nodePath = ""; + } + + csvWr.WriteLine(con.Name + ";" + con.Hostname + ";" + con.MacAddress + ";;" + System.Convert.ToString(con.Port) + ";" + System.Convert.ToString(con.UseConsoleSession) + ";" + nodePath); + } + #endregion + + #region vRD VRE + private void SaveToVRE() + { + if (App.Runtime.IsConnectionsFileLoaded == false) + { + return; + } + + TreeNode tN = default(TreeNode); + tN = RootTreeNode.Clone(); + + TreeNodeCollection tNC = default(TreeNodeCollection); + tNC = tN.Nodes; + + _xmlTextWriter = new XmlTextWriter(ConnectionFileName, System.Text.Encoding.UTF8); + _xmlTextWriter.Formatting = Formatting.Indented; + _xmlTextWriter.Indentation = 4; + + _xmlTextWriter.WriteStartDocument(); + + _xmlTextWriter.WriteStartElement("vRDConfig"); + _xmlTextWriter.WriteAttributeString("Version", "", "2.0"); + + _xmlTextWriter.WriteStartElement("Connections"); + SaveNodeVRE(tNC); + _xmlTextWriter.WriteEndElement(); + + _xmlTextWriter.WriteEndElement(); + _xmlTextWriter.WriteEndDocument(); + _xmlTextWriter.Close(); + } + + private void SaveNodeVRE(TreeNodeCollection tNC) + { + foreach (TreeNode node in tNC) + { + if (Tree.Node.GetNodeType(node) == Tree.Node.Type.Connection) + { + Connection.Info curConI = node.Tag; + + if (curConI.Protocol == Connection.Protocol.Protocols.RDP) + { + _xmlTextWriter.WriteStartElement("Connection"); + _xmlTextWriter.WriteAttributeString("Id", "", ""); + + WriteVREitem(curConI); + + _xmlTextWriter.WriteEndElement(); + } + } + else + { + SaveNodeVRE(node.Nodes); + } + } + } + + private void WriteVREitem(Connection.Info con) + { + //Name + _xmlTextWriter.WriteStartElement("ConnectionName"); + _xmlTextWriter.WriteValue(con.Name); + _xmlTextWriter.WriteEndElement(); + + //Hostname + _xmlTextWriter.WriteStartElement("ServerName"); + _xmlTextWriter.WriteValue(con.Hostname); + _xmlTextWriter.WriteEndElement(); + + //Mac Adress + _xmlTextWriter.WriteStartElement("MACAddress"); + _xmlTextWriter.WriteValue(con.MacAddress); + _xmlTextWriter.WriteEndElement(); + + //Management Board URL + _xmlTextWriter.WriteStartElement("MgmtBoardUrl"); + _xmlTextWriter.WriteValue(""); + _xmlTextWriter.WriteEndElement(); + + //Description + _xmlTextWriter.WriteStartElement("Description"); + _xmlTextWriter.WriteValue(con.Description); + _xmlTextWriter.WriteEndElement(); + + //Port + _xmlTextWriter.WriteStartElement("Port"); + _xmlTextWriter.WriteValue(con.Port); + _xmlTextWriter.WriteEndElement(); + + //Console Session + _xmlTextWriter.WriteStartElement("Console"); + _xmlTextWriter.WriteValue(con.UseConsoleSession); + _xmlTextWriter.WriteEndElement(); + + //Redirect Clipboard + _xmlTextWriter.WriteStartElement("ClipBoard"); + _xmlTextWriter.WriteValue(true); + _xmlTextWriter.WriteEndElement(); + + //Redirect Printers + _xmlTextWriter.WriteStartElement("Printer"); + _xmlTextWriter.WriteValue(con.RedirectPrinters); + _xmlTextWriter.WriteEndElement(); + + //Redirect Ports + _xmlTextWriter.WriteStartElement("Serial"); + _xmlTextWriter.WriteValue(con.RedirectPorts); + _xmlTextWriter.WriteEndElement(); + + //Redirect Disks + _xmlTextWriter.WriteStartElement("LocalDrives"); + _xmlTextWriter.WriteValue(con.RedirectDiskDrives); + _xmlTextWriter.WriteEndElement(); + + //Redirect Smartcards + _xmlTextWriter.WriteStartElement("SmartCard"); + _xmlTextWriter.WriteValue(con.RedirectSmartCards); + _xmlTextWriter.WriteEndElement(); + + //Connection Place + _xmlTextWriter.WriteStartElement("ConnectionPlace"); + _xmlTextWriter.WriteValue("2"); //---------------------------------------------------------- + _xmlTextWriter.WriteEndElement(); + + //Smart Size + _xmlTextWriter.WriteStartElement("AutoSize"); + _xmlTextWriter.WriteValue(con.Resolution == Connection.Protocol.RDP.RDPResolutions.SmartSize); + _xmlTextWriter.WriteEndElement(); + + //SeparateResolutionX + _xmlTextWriter.WriteStartElement("SeparateResolutionX"); + _xmlTextWriter.WriteValue("1024"); + _xmlTextWriter.WriteEndElement(); + + //SeparateResolutionY + _xmlTextWriter.WriteStartElement("SeparateResolutionY"); + _xmlTextWriter.WriteValue("768"); + _xmlTextWriter.WriteEndElement(); + + Rectangle resolution = Connection.Protocol.RDP.GetResolutionRectangle(con.Resolution); + if (resolution.Width == 0) + { + resolution.Width = 1024; + } + if (resolution.Height == 0) + { + resolution.Height = 768; + } + + //TabResolutionX + _xmlTextWriter.WriteStartElement("TabResolutionX"); + _xmlTextWriter.WriteValue(resolution.Width); + _xmlTextWriter.WriteEndElement(); + + //TabResolutionY + _xmlTextWriter.WriteStartElement("TabResolutionY"); + _xmlTextWriter.WriteValue(resolution.Height); + _xmlTextWriter.WriteEndElement(); + + //RDPColorDepth + _xmlTextWriter.WriteStartElement("RDPColorDepth"); + _xmlTextWriter.WriteValue(con.Colors.ToString().Replace("Colors", "").Replace("Bit", "")); + _xmlTextWriter.WriteEndElement(); + + //Bitmap Caching + _xmlTextWriter.WriteStartElement("BitmapCaching"); + _xmlTextWriter.WriteValue(con.CacheBitmaps); + _xmlTextWriter.WriteEndElement(); + + //Themes + _xmlTextWriter.WriteStartElement("Themes"); + _xmlTextWriter.WriteValue(con.DisplayThemes); + _xmlTextWriter.WriteEndElement(); + + //Wallpaper + _xmlTextWriter.WriteStartElement("Wallpaper"); + _xmlTextWriter.WriteValue(con.DisplayWallpaper); + _xmlTextWriter.WriteEndElement(); + } + #endregion + } } diff --git a/mRemoteV1/CS/Config/Config.Settings.Save.cs b/mRemoteV1/CS/Config/Config.Settings.Save.cs index e9cede46b..8b6da4e80 100644 --- a/mRemoteV1/CS/Config/Config.Settings.Save.cs +++ b/mRemoteV1/CS/Config/Config.Settings.Save.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,9 +8,7 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.Xml; using System.IO; @@ -19,120 +16,120 @@ using System.IO; namespace mRemoteNG.Config.Settings { public class Save + { + #region Public Methods + public static void Save_Renamed() + { + try { -#region Public Methods - public static void Save_Renamed() + frmMain with_1 = frmMain; + Tools.WindowPlacement windowPlacement = new Tools.WindowPlacement(frmMain); + if (with_1.WindowState == FormWindowState.Minimized & windowPlacement.RestoreToMaximized) { - try - { - frmMain with_1 = frmMain; - Tools.WindowPlacement windowPlacement = new Tools.WindowPlacement(frmMain); - if (with_1.WindowState == FormWindowState.Minimized & windowPlacement.RestoreToMaximized) - { - with_1.Opacity = 0; - with_1.WindowState = FormWindowState.Maximized; - } - - My.Settings.Default.MainFormLocation = with_1.Location; - My.Settings.Default.MainFormSize = with_1.Size; - - if (!(with_1.WindowState == FormWindowState.Normal)) - { - My.Settings.Default.MainFormRestoreLocation = with_1.RestoreBounds.Location; - My.Settings.Default.MainFormRestoreSize = with_1.RestoreBounds.Size; - } - - My.Settings.Default.MainFormState = with_1.WindowState; - - My.Settings.Default.MainFormKiosk = with_1.Fullscreen.Value; - - My.Settings.Default.FirstStart = false; - My.Settings.Default.ResetPanels = false; - My.Settings.Default.ResetToolbars = false; - My.Settings.Default.NoReconnect = false; - - My.Settings.Default.ExtAppsTBLocation = with_1.tsExternalTools.Location; - if (with_1.tsExternalTools.Parent != null) - { - My.Settings.Default.ExtAppsTBParentDock = with_1.tsExternalTools.Parent.Dock.ToString(); - } - My.Settings.Default.ExtAppsTBVisible = with_1.tsExternalTools.Visible; - My.Settings.Default.ExtAppsTBShowText = with_1.cMenToolbarShowText.Checked; - - My.Settings.Default.QuickyTBLocation = with_1.tsQuickConnect.Location; - if (with_1.tsQuickConnect.Parent != null) - { - My.Settings.Default.QuickyTBParentDock = with_1.tsQuickConnect.Parent.Dock.ToString(); - } - My.Settings.Default.QuickyTBVisible = with_1.tsQuickConnect.Visible; - - My.Settings.Default.ConDefaultPassword = Security.Crypt.Encrypt(System.Convert.ToString(My.Settings.Default.ConDefaultPassword), App.Info.General.EncryptionKey); - - My.Settings.Default.Save(); - - SavePanelsToXML(); - SaveExternalAppsToXML(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Saving settings failed" + Constants.vbNewLine + Constants.vbNewLine + ex.Message, false); - } + with_1.Opacity = 0; + with_1.WindowState = FormWindowState.Maximized; } - - public static void SavePanelsToXML() + + My.Settings.Default.MainFormLocation = with_1.Location; + My.Settings.Default.MainFormSize = with_1.Size; + + if (!(with_1.WindowState == FormWindowState.Normal)) { - try - { - if (Directory.Exists(App.Info.Settings.SettingsPath) == false) - { - Directory.CreateDirectory(App.Info.Settings.SettingsPath); - } - - frmMain.Default.pnlDock.SaveAsXml(App.Info.Settings.SettingsPath + "\\" + App.Info.Settings.LayoutFileName); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SavePanelsToXML failed" + Constants.vbNewLine + Constants.vbNewLine + ex.Message, false); - } + My.Settings.Default.MainFormRestoreLocation = with_1.RestoreBounds.Location; + My.Settings.Default.MainFormRestoreSize = with_1.RestoreBounds.Size; } - - public static void SaveExternalAppsToXML() + + My.Settings.Default.MainFormState = with_1.WindowState; + + My.Settings.Default.MainFormKiosk = with_1.Fullscreen.Value; + + My.Settings.Default.FirstStart = false; + My.Settings.Default.ResetPanels = false; + My.Settings.Default.ResetToolbars = false; + My.Settings.Default.NoReconnect = false; + + My.Settings.Default.ExtAppsTBLocation = with_1.tsExternalTools.Location; + if (with_1.tsExternalTools.Parent != null) { - try - { - if (Directory.Exists(App.Info.Settings.SettingsPath) == false) - { - Directory.CreateDirectory(App.Info.Settings.SettingsPath); - } - - XmlTextWriter xmlTextWriter = new XmlTextWriter(App.Info.Settings.SettingsPath + "\\" + App.Info.Settings.ExtAppsFilesName, System.Text.Encoding.UTF8); - xmlTextWriter.Formatting = Formatting.Indented; - xmlTextWriter.Indentation = 4; - - xmlTextWriter.WriteStartDocument(); - xmlTextWriter.WriteStartElement("Apps"); - - foreach (Tools.ExternalTool extA in ExternalTools) - { - xmlTextWriter.WriteStartElement("App"); - xmlTextWriter.WriteAttributeString("DisplayName", "", extA.DisplayName); - xmlTextWriter.WriteAttributeString("FileName", "", extA.FileName); - xmlTextWriter.WriteAttributeString("Arguments", "", extA.Arguments); - xmlTextWriter.WriteAttributeString("WaitForExit", "", System.Convert.ToString(extA.WaitForExit)); - xmlTextWriter.WriteAttributeString("TryToIntegrate", "", System.Convert.ToString(extA.TryIntegrate)); - xmlTextWriter.WriteEndElement(); - } - - xmlTextWriter.WriteEndElement(); - xmlTextWriter.WriteEndDocument(); - - xmlTextWriter.Close(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveExternalAppsToXML failed" + Constants.vbNewLine + Constants.vbNewLine + ex.Message, false); - } + My.Settings.Default.ExtAppsTBParentDock = with_1.tsExternalTools.Parent.Dock.ToString(); } -#endregion + My.Settings.Default.ExtAppsTBVisible = with_1.tsExternalTools.Visible; + My.Settings.Default.ExtAppsTBShowText = with_1.cMenToolbarShowText.Checked; + + My.Settings.Default.QuickyTBLocation = with_1.tsQuickConnect.Location; + if (with_1.tsQuickConnect.Parent != null) + { + My.Settings.Default.QuickyTBParentDock = with_1.tsQuickConnect.Parent.Dock.ToString(); + } + My.Settings.Default.QuickyTBVisible = with_1.tsQuickConnect.Visible; + + My.Settings.Default.ConDefaultPassword = Security.Crypt.Encrypt(System.Convert.ToString(My.Settings.Default.ConDefaultPassword), App.Info.General.EncryptionKey); + + My.Settings.Default.Save(); + + SavePanelsToXML(); + SaveExternalAppsToXML(); } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Saving settings failed" + Constants.vbNewLine + Constants.vbNewLine + ex.Message, false); + } + } + + public static void SavePanelsToXML() + { + try + { + if (Directory.Exists(App.Info.Settings.SettingsPath) == false) + { + Directory.CreateDirectory(App.Info.Settings.SettingsPath); + } + + frmMain.Default.pnlDock.SaveAsXml(App.Info.Settings.SettingsPath + "\\" + App.Info.Settings.LayoutFileName); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SavePanelsToXML failed" + Constants.vbNewLine + Constants.vbNewLine + ex.Message, false); + } + } + + public static void SaveExternalAppsToXML() + { + try + { + if (Directory.Exists(App.Info.Settings.SettingsPath) == false) + { + Directory.CreateDirectory(App.Info.Settings.SettingsPath); + } + + XmlTextWriter xmlTextWriter = new XmlTextWriter(App.Info.Settings.SettingsPath + "\\" + App.Info.Settings.ExtAppsFilesName, System.Text.Encoding.UTF8); + xmlTextWriter.Formatting = Formatting.Indented; + xmlTextWriter.Indentation = 4; + + xmlTextWriter.WriteStartDocument(); + xmlTextWriter.WriteStartElement("Apps"); + + foreach (Tools.ExternalTool extA in ExternalTools) + { + xmlTextWriter.WriteStartElement("App"); + xmlTextWriter.WriteAttributeString("DisplayName", "", extA.DisplayName); + xmlTextWriter.WriteAttributeString("FileName", "", extA.FileName); + xmlTextWriter.WriteAttributeString("Arguments", "", extA.Arguments); + xmlTextWriter.WriteAttributeString("WaitForExit", "", System.Convert.ToString(extA.WaitForExit)); + xmlTextWriter.WriteAttributeString("TryToIntegrate", "", System.Convert.ToString(extA.TryIntegrate)); + xmlTextWriter.WriteEndElement(); + } + + xmlTextWriter.WriteEndElement(); + xmlTextWriter.WriteEndDocument(); + + xmlTextWriter.Close(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveExternalAppsToXML failed" + Constants.vbNewLine + Constants.vbNewLine + ex.Message, false); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/Config/Import/ActiveDirectory.cs b/mRemoteV1/CS/Config/Import/ActiveDirectory.cs index e6e7e6b23..f4b4341bc 100644 --- a/mRemoteV1/CS/Config/Import/ActiveDirectory.cs +++ b/mRemoteV1/CS/Config/Import/ActiveDirectory.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,10 +8,8 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.DirectoryServices; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.Text.RegularExpressions; using mRemoteNG.My; @@ -20,110 +17,110 @@ using mRemoteNG.My; namespace mRemoteNG.Config.Import { public class ActiveDirectory + { + public static void Import(string ldapPath, TreeNode parentTreeNode) { - public static void Import(string ldapPath, TreeNode parentTreeNode) + try { - try + TreeNode treeNode = Tree.Node.AddNode(Tree.Node.Type.Container); + + Container.Info containerInfo = new Container.Info(); + containerInfo.TreeNode = treeNode; + containerInfo.ConnectionInfo = new Connection.Info(containerInfo); + + string name = ""; + Match match = Regex.Match(ldapPath, "ou=([^,]*)", RegexOptions.IgnoreCase); + if (match.Success) { - TreeNode treeNode = Tree.Node.AddNode(Tree.Node.Type.Container); - - Container.Info containerInfo = new Container.Info(); - containerInfo.TreeNode = treeNode; - containerInfo.ConnectionInfo = new Connection.Info(containerInfo); - - string name = ""; - Match match = Regex.Match(ldapPath, "ou=([^,]*)", RegexOptions.IgnoreCase); - if (match.Success) - { - name = match.Groups[1].Captures[0].Value; - } - else - { - name = My.Language.strActiveDirectory; - } - - containerInfo.Name = name; - - // We can only inherit from a container node, not the root node or connection nodes - if (Tree.Node.GetNodeType(parentTreeNode) == Tree.Node.Type.Container) - { - containerInfo.Parent = parentTreeNode.Tag; - } - else - { - containerInfo.ConnectionInfo.Inherit.TurnOffInheritanceCompletely(); - } - - treeNode.Text = name; - treeNode.Name = name; - treeNode.Tag = containerInfo; - ContainerList.Add(containerInfo); - - ImportComputers(ldapPath, treeNode); - - parentTreeNode.Nodes.Add(treeNode); + name = match.Groups[1].Captures[0].Value; } - catch (Exception ex) + else { - MessageCollector.AddExceptionMessage(message: "Config.Import.ActiveDirectory.Import() failed.", ex: ex, logOnly: true); + name = My.Language.strActiveDirectory; } + + containerInfo.Name = name; + + // We can only inherit from a container node, not the root node or connection nodes + if (Tree.Node.GetNodeType(parentTreeNode) == Tree.Node.Type.Container) + { + containerInfo.Parent = parentTreeNode.Tag; + } + else + { + containerInfo.ConnectionInfo.Inherit.TurnOffInheritanceCompletely(); + } + + treeNode.Text = name; + treeNode.Name = name; + treeNode.Tag = containerInfo; + ContainerList.Add(containerInfo); + + ImportComputers(ldapPath, treeNode); + + parentTreeNode.Nodes.Add(treeNode); } - - private static void ImportComputers(string ldapPath, TreeNode parentTreeNode) + catch (Exception ex) { - try - { - string strDisplayName = ""; - string strDescription = ""; - string strHostName = ""; - - const string ldapFilter = "(objectClass=computer)"; - - DirectorySearcher ldapSearcher = new DirectorySearcher(); - SearchResultCollection ldapResults = default(SearchResultCollection); - SearchResult ldapResult = default(SearchResult); - - ldapSearcher.SearchRoot = new DirectoryEntry(ldapPath); - ldapSearcher.PropertiesToLoad.AddRange(new[] {"securityEquals", "cn"}); - ldapSearcher.Filter = ldapFilter; - ldapSearcher.SearchScope = SearchScope.OneLevel; - - ldapResults = ldapSearcher.FindAll(); - - foreach (SearchResult tempLoopVar_ldapResult in ldapResults) - { - ldapResult = tempLoopVar_ldapResult; - System.DirectoryServices.DirectoryEntry with_2 = ldapResult.GetDirectoryEntry(); - strDisplayName = System.Convert.ToString(with_2.Properties["cn"].Value); - strDescription = System.Convert.ToString(with_2.Properties["Description"].Value); - strHostName = System.Convert.ToString(with_2.Properties["dNSHostName"].Value); - - TreeNode treeNode = Tree.Node.AddNode(Tree.Node.Type.Connection, strDisplayName); - - Connection.Info connectionInfo = new Connection.Info(); - Connection.Info.Inheritance inheritanceInfo = new Connection.Info.Inheritance(connectionInfo, true); - inheritanceInfo.Description = false; - if (parentTreeNode.Tag is Container.Info) - { - connectionInfo.Parent = parentTreeNode.Tag; - } - connectionInfo.Inherit = inheritanceInfo; - connectionInfo.Name = strDisplayName; - connectionInfo.Hostname = strHostName; - connectionInfo.Description = strDescription; - connectionInfo.TreeNode = treeNode; - treeNode.Name = strDisplayName; - treeNode.Tag = connectionInfo; //set the nodes tag to the conI - //add connection to connections - ConnectionList.Add(connectionInfo); - - parentTreeNode.Nodes.Add(treeNode); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "Config.Import.ActiveDirectory.ImportComputers() failed.", ex: ex, logOnly: true); - } + Runtime.MessageCollector.AddExceptionMessage(message: "Config.Import.ActiveDirectory.Import() failed.", ex: ex, logOnly: true); } } + + private static void ImportComputers(string ldapPath, TreeNode parentTreeNode) + { + try + { + string strDisplayName = ""; + string strDescription = ""; + string strHostName = ""; + + const string ldapFilter = "(objectClass=computer)"; + + DirectorySearcher ldapSearcher = new DirectorySearcher(); + SearchResultCollection ldapResults = default(SearchResultCollection); + SearchResult ldapResult = default(SearchResult); + + ldapSearcher.SearchRoot = new DirectoryEntry(ldapPath); + ldapSearcher.PropertiesToLoad.AddRange(new[] {"securityEquals", "cn"}); + ldapSearcher.Filter = ldapFilter; + ldapSearcher.SearchScope = SearchScope.OneLevel; + + ldapResults = ldapSearcher.FindAll(); + + foreach (SearchResult tempLoopVar_ldapResult in ldapResults) + { + ldapResult = tempLoopVar_ldapResult; + System.DirectoryServices.DirectoryEntry with_2 = ldapResult.GetDirectoryEntry(); + strDisplayName = System.Convert.ToString(with_2.Properties["cn"].Value); + strDescription = System.Convert.ToString(with_2.Properties["Description"].Value); + strHostName = System.Convert.ToString(with_2.Properties["dNSHostName"].Value); + + TreeNode treeNode = Tree.Node.AddNode(Tree.Node.Type.Connection, strDisplayName); + + Connection.Info connectionInfo = new Connection.Info(); + Connection.Info.Inheritance inheritanceInfo = new Connection.Info.Inheritance(connectionInfo, true); + inheritanceInfo.Description = false; + if (parentTreeNode.Tag is Container.Info) + { + connectionInfo.Parent = parentTreeNode.Tag; + } + connectionInfo.Inherit = inheritanceInfo; + connectionInfo.Name = strDisplayName; + connectionInfo.Hostname = strHostName; + connectionInfo.Description = strDescription; + connectionInfo.TreeNode = treeNode; + treeNode.Name = strDisplayName; + treeNode.Tag = connectionInfo; //set the nodes tag to the conI + //add connection to connections + ConnectionList.Add(connectionInfo); + + parentTreeNode.Nodes.Add(treeNode); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "Config.Import.ActiveDirectory.ImportComputers() failed.", ex: ex, logOnly: true); + } + } + } } diff --git a/mRemoteV1/CS/Config/Import/RemoteDesktopConnection.cs b/mRemoteV1/CS/Config/Import/RemoteDesktopConnection.cs index a10ca1b2c..b781e3696 100644 --- a/mRemoteV1/CS/Config/Import/RemoteDesktopConnection.cs +++ b/mRemoteV1/CS/Config/Import/RemoteDesktopConnection.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,221 +8,219 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.IO; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.Config.Import { public class RemoteDesktopConnection + { + public static void Import(string fileName, TreeNode parentTreeNode) { - public static void Import(string fileName, TreeNode parentTreeNode) + string[] lines = File.ReadAllLines(fileName); + + string name = Path.GetFileNameWithoutExtension(fileName); + TreeNode treeNode = new TreeNode(name); + parentTreeNode.Nodes.Add(treeNode); + + Connection.Info connectionInfo = new Connection.Info(); + connectionInfo.Inherit = new Connection.Info.Inheritance(connectionInfo); + connectionInfo.Name = name; + connectionInfo.TreeNode = treeNode; + + if (treeNode.Parent.Tag is Container.Info) { - string[] lines = File.ReadAllLines(fileName); - - string name = Path.GetFileNameWithoutExtension(fileName); - TreeNode treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - Connection.Info connectionInfo = new Connection.Info(); - connectionInfo.Inherit = new Connection.Info.Inheritance(connectionInfo); - connectionInfo.Name = name; - connectionInfo.TreeNode = treeNode; - - if (treeNode.Parent.Tag is Container.Info) - { - connectionInfo.Parent = treeNode.Parent.Tag; - } - - treeNode.Name = name; - treeNode.Tag = connectionInfo; - treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; - treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; - - foreach (string line in lines) - { - string[] parts = line.Split(new char[] {':'}, 3); - if (parts.Length < 3) - { - continue; - } - - string key = parts[0]; - string value = parts[2]; - - SetConnectionInfoParameter(connectionInfo, key, value); - } - - ConnectionList.Add(connectionInfo); + connectionInfo.Parent = treeNode.Parent.Tag; } - - private static void SetConnectionInfoParameter(Protocol.Info connectionInfo, string key, string value) + + treeNode.Name = name; + treeNode.Tag = connectionInfo; + treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; + treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; + + foreach (string line in lines) { - switch (key.ToLower()) + string[] parts = line.Split(new char[] {':'}, 3); + if (parts.Length < 3) { - case "full address": - Uri uri = new Uri("dummyscheme" + System.Uri.SchemeDelimiter + value); - if (!string.IsNullOrEmpty(uri.Host)) - { - connectionInfo.Hostname = uri.Host; - } - if (!(uri.Port == -1)) - { - connectionInfo.Port = uri.Port; - } - break; - case "server port": - connectionInfo.Port = (int) value; - break; - case "username": - connectionInfo.Username = value; - break; - case "domain": - connectionInfo.Domain = value; - break; - case "session bpp": - switch (value) - { - case 8: - connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors256; - break; - case 15: - connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors15Bit; - break; - case 16: - connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors16Bit; - break; - case 24: - connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors24Bit; - break; - case 32: - connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors32Bit; - break; - } - break; - case "bitmapcachepersistenable": - if (value == 1) - { - connectionInfo.CacheBitmaps = true; - } - else - { - connectionInfo.CacheBitmaps = false; - } - break; - case "screen mode id": - if (value == 2) - { - connectionInfo.Resolution = Connection.Protocol.RDP.RDPResolutions.Fullscreen; - } - else - { - connectionInfo.Resolution = Connection.Protocol.RDP.RDPResolutions.FitToWindow; - } - break; - case "connect to console": - if (value == 1) - { - connectionInfo.UseConsoleSession = true; - } - break; - case "disable wallpaper": - if (value == 1) - { - connectionInfo.DisplayWallpaper = true; - } - else - { - connectionInfo.DisplayWallpaper = false; - } - break; - case "disable themes": - if (value == 1) - { - connectionInfo.DisplayThemes = true; - } - else - { - connectionInfo.DisplayThemes = false; - } - break; - case "allow font smoothing": - if (value == 1) - { - connectionInfo.EnableFontSmoothing = true; - } - else - { - connectionInfo.EnableFontSmoothing = false; - } - break; - case "allow desktop composition": - if (value == 1) - { - connectionInfo.EnableDesktopComposition = true; - } - else - { - connectionInfo.EnableDesktopComposition = false; - } - break; - case "redirectsmartcards": - if (value == 1) - { - connectionInfo.RedirectSmartCards = true; - } - else - { - connectionInfo.RedirectSmartCards = false; - } - break; - case "redirectdrives": - if (value == 1) - { - connectionInfo.RedirectDiskDrives = true; - } - else - { - connectionInfo.RedirectDiskDrives = false; - } - break; - case "redirectcomports": - if (value == 1) - { - connectionInfo.RedirectPorts = true; - } - else - { - connectionInfo.RedirectPorts = false; - } - break; - case "redirectprinters": - if (value == 1) - { - connectionInfo.RedirectPrinters = true; - } - else - { - connectionInfo.RedirectPrinters = false; - } - break; - case "audiomode": - switch (value) - { - case 0: - connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.BringToThisComputer; - break; - case 1: - connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.LeaveAtRemoteComputer; - break; - case 2: - connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.DoNotPlay; - break; - } - break; + continue; } + + string key = parts[0]; + string value = parts[2]; + + SetConnectionInfoParameter(connectionInfo, key, value); + } + + ConnectionList.Add(connectionInfo); + } + + private static void SetConnectionInfoParameter(Connection.Info connectionInfo, string key, string value) + { + switch (key.ToLower()) + { + case "full address": + Uri uri = new Uri("dummyscheme" + System.Uri.SchemeDelimiter + value); + if (!string.IsNullOrEmpty(uri.Host)) + { + connectionInfo.Hostname = uri.Host; + } + if (!(uri.Port == -1)) + { + connectionInfo.Port = uri.Port; + } + break; + case "server port": + connectionInfo.Port = value; + break; + case "username": + connectionInfo.Username = value; + break; + case "domain": + connectionInfo.Domain = value; + break; + case "session bpp": + switch (value) + { + case "8": + connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors256; + break; + case "15": + connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors15Bit; + break; + case "16": + connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors16Bit; + break; + case "24": + connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors24Bit; + break; + case "32": + connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors32Bit; + break; + } + break; + case "bitmapcachepersistenable": + if (value == "1") + { + connectionInfo.CacheBitmaps = true; + } + else + { + connectionInfo.CacheBitmaps = false; + } + break; + case "screen mode id": + if (value == "2") + { + connectionInfo.Resolution = Connection.Protocol.RDP.RDPResolutions.Fullscreen; + } + else + { + connectionInfo.Resolution = Connection.Protocol.RDP.RDPResolutions.FitToWindow; + } + break; + case "connect to console": + if (value == "1") + { + connectionInfo.UseConsoleSession = true; + } + break; + case "disable wallpaper": + if (value == "1") + { + connectionInfo.DisplayWallpaper = true; + } + else + { + connectionInfo.DisplayWallpaper = false; + } + break; + case "disable themes": + if (value == "1") + { + connectionInfo.DisplayThemes = true; + } + else + { + connectionInfo.DisplayThemes = false; + } + break; + case "allow font smoothing": + if (value == "1") + { + connectionInfo.EnableFontSmoothing = true; + } + else + { + connectionInfo.EnableFontSmoothing = false; + } + break; + case "allow desktop composition": + if (value == "1") + { + connectionInfo.EnableDesktopComposition = true; + } + else + { + connectionInfo.EnableDesktopComposition = false; + } + break; + case "redirectsmartcards": + if (value == "1") + { + connectionInfo.RedirectSmartCards = true; + } + else + { + connectionInfo.RedirectSmartCards = false; + } + break; + case "redirectdrives": + if (value == "1") + { + connectionInfo.RedirectDiskDrives = true; + } + else + { + connectionInfo.RedirectDiskDrives = false; + } + break; + case "redirectcomports": + if (value == "1") + { + connectionInfo.RedirectPorts = true; + } + else + { + connectionInfo.RedirectPorts = false; + } + break; + case "redirectprinters": + if (value == "1") + { + connectionInfo.RedirectPrinters = true; + } + else + { + connectionInfo.RedirectPrinters = false; + } + break; + case "audiomode": + switch (value) + { + case "0": + connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.BringToThisComputer; + break; + case "1": + connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.LeaveAtRemoteComputer; + break; + case "2": + connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.DoNotPlay; + break; + } + break; } } + } } diff --git a/mRemoteV1/CS/Config/Import/RemoteDesktopConnectionManager.cs b/mRemoteV1/CS/Config/Import/RemoteDesktopConnectionManager.cs index 10759a07b..988e374c3 100644 --- a/mRemoteV1/CS/Config/Import/RemoteDesktopConnectionManager.cs +++ b/mRemoteV1/CS/Config/Import/RemoteDesktopConnectionManager.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,387 +8,385 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Xml; using System.IO; using System.Runtime.InteropServices; using mRemoteNG.Connection.Protocol; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.Config.Import { public class RemoteDesktopConnectionManager + { + public static void Import(string fileName, TreeNode parentTreeNode) { - public static void Import(string fileName, TreeNode parentTreeNode) + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.Load(fileName); + + XmlNode rdcManNode = xmlDocument.SelectSingleNode("/RDCMan"); + int schemaVersion = (int) (rdcManNode.Attributes["schemaVersion"].Value); + if (!(schemaVersion == 1)) { - XmlDocument xmlDocument = new XmlDocument(); - xmlDocument.Load(fileName); - - XmlNode rdcManNode = xmlDocument.SelectSingleNode("/RDCMan"); - int schemaVersion = (int) (rdcManNode.Attributes["schemaVersion"].Value); - if (!(schemaVersion == 1)) - { - throw (new FileFormatException(string.Format("Unsupported schema version ({0}).", schemaVersion))); - } - - XmlNode versionNode = rdcManNode.SelectSingleNode("./version"); - Version version = new Version(versionNode.InnerText); - if (!(version == new Version(2, 2))) - { - throw (new FileFormatException(string.Format("Unsupported file version ({0}).", version))); - } - - XmlNode fileNode = rdcManNode.SelectSingleNode("./file"); - ImportFileOrGroup(fileNode, parentTreeNode); + throw (new FileFormatException(string.Format("Unsupported schema version ({0}).", schemaVersion))); } - - private static void ImportFileOrGroup(XmlNode xmlNode, TreeNode parentTreeNode) + + XmlNode versionNode = rdcManNode.SelectSingleNode("./version"); + Version version = new Version(versionNode.InnerText); + if (!(version == new Version(2, 2))) { - XmlNode propertiesNode = xmlNode.SelectSingleNode("./properties"); - string name = propertiesNode.SelectSingleNode("./name").InnerText; - - TreeNode treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - Container.Info containerInfo = new Container.Info(); - containerInfo.TreeNode = treeNode; - containerInfo.Name = name; - - Connection.Info connectionInfo = ConnectionInfoFromXml(propertiesNode); - connectionInfo.Parent = containerInfo; - connectionInfo.IsContainer = true; - containerInfo.ConnectionInfo = connectionInfo; - - // We can only inherit from a container node, not the root node or connection nodes - if (Tree.Node.GetNodeType(parentTreeNode) == Tree.Node.Type.Container) - { - containerInfo.Parent = parentTreeNode.Tag; - } - else - { - connectionInfo.Inherit.TurnOffInheritanceCompletely(); - } - - treeNode.Name = name; - treeNode.Tag = containerInfo; - treeNode.ImageIndex = Images.Enums.TreeImage.Container; - treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container; - - foreach (XmlNode childNode in xmlNode.SelectNodes("./group|./server")) - { - switch (childNode.Name) - { - case "group": - ImportFileOrGroup(childNode, treeNode); - break; - case "server": - ImportServer(childNode, treeNode); - break; - } - } - - containerInfo.IsExpanded = bool.Parse(propertiesNode.SelectSingleNode("./expanded").InnerText); - if (containerInfo.IsExpanded) - { - treeNode.Expand(); - } - - ContainerList.Add(containerInfo); + throw (new FileFormatException(string.Format("Unsupported file version ({0}).", version))); } + + XmlNode fileNode = rdcManNode.SelectSingleNode("./file"); + ImportFileOrGroup(fileNode, parentTreeNode); + } - private static void ImportServer(XmlNode serverNode, TreeNode parentTreeNode) + private static void ImportFileOrGroup(XmlNode xmlNode, TreeNode parentTreeNode) + { + XmlNode propertiesNode = xmlNode.SelectSingleNode("./properties"); + string name = propertiesNode.SelectSingleNode("./name").InnerText; + + TreeNode treeNode = new TreeNode(name); + parentTreeNode.Nodes.Add(treeNode); + + Container.Info containerInfo = new Container.Info(); + containerInfo.TreeNode = treeNode; + containerInfo.Name = name; + + Connection.Info connectionInfo = ConnectionInfoFromXml(propertiesNode); + connectionInfo.Parent = containerInfo; + connectionInfo.IsContainer = true; + containerInfo.ConnectionInfo = connectionInfo; + + // We can only inherit from a container node, not the root node or connection nodes + if (Tree.Node.GetNodeType(parentTreeNode) == Tree.Node.Type.Container) { - string name = serverNode.SelectSingleNode("./displayName").InnerText; - TreeNode treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - Connection.Info connectionInfo = ConnectionInfoFromXml(serverNode); - connectionInfo.TreeNode = treeNode; - connectionInfo.Parent = parentTreeNode.Tag; - - treeNode.Name = name; - treeNode.Tag = connectionInfo; - treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; - treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; - - ConnectionList.Add(connectionInfo); + containerInfo.Parent = parentTreeNode.Tag; } - - private static Protocol.Info ConnectionInfoFromXml(XmlNode xmlNode) + else { - Connection.Info connectionInfo = new Connection.Info(); - connectionInfo.Inherit = new Connection.Info.Inheritance(connectionInfo); - - string name = xmlNode.SelectSingleNode("./name").InnerText; - - string displayName = ""; - XmlNode displayNameNode = xmlNode.SelectSingleNode("./displayName"); - if (displayNameNode == null) - { - displayName = name; - } - else - { - displayName = displayNameNode.InnerText; - } - - connectionInfo.Name = displayName; - connectionInfo.Description = xmlNode.SelectSingleNode("./comment").InnerText; - connectionInfo.Hostname = name; - - XmlNode logonCredentialsNode = xmlNode.SelectSingleNode("./logonCredentials"); - if (logonCredentialsNode.Attributes["inherit"].Value == "None") - { - connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName").InnerText; - - XmlNode passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - if (passwordNode.Attributes["storeAsClearText"].Value == "True") - { - connectionInfo.Password = passwordNode.InnerText; - } - else - { - connectionInfo.Password = DecryptPassword(passwordNode.InnerText); - } - - connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain").InnerText; - } - else - { - connectionInfo.Inherit.Username = true; - connectionInfo.Inherit.Password = true; - connectionInfo.Inherit.Domain = true; - } - - XmlNode connectionSettingsNode = xmlNode.SelectSingleNode("./connectionSettings"); - if (connectionSettingsNode.Attributes["inherit"].Value == "None") - { - connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole").InnerText); - // ./startProgram - // ./workingDir - connectionInfo.Port = (int) (connectionSettingsNode.SelectSingleNode("./port").InnerText); - } - else - { - connectionInfo.Inherit.UseConsoleSession = true; - connectionInfo.Inherit.Port = true; - } - - XmlNode gatewaySettingsNode = xmlNode.SelectSingleNode("./gatewaySettings"); - if (gatewaySettingsNode.Attributes["inherit"].Value == "None") - { - if (gatewaySettingsNode.SelectSingleNode("./enabled").InnerText == "True") - { - connectionInfo.RDGatewayUsageMethod = RDP.RDGatewayUsageMethod.Always; - } - else - { - connectionInfo.RDGatewayUsageMethod = RDP.RDGatewayUsageMethod.Never; - } - - connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName").InnerText; - connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName").InnerText; - - XmlNode passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - if (passwordNode.Attributes["storeAsClearText"].Value == "True") - { - connectionInfo.RDGatewayPassword = passwordNode.InnerText; - } - else - { - connectionInfo.Password = DecryptPassword(passwordNode.InnerText); - } - - connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain").InnerText; - // ./logonMethod - // ./localBypass - // ./credSharing - } - else - { - connectionInfo.Inherit.RDGatewayUsageMethod = true; - connectionInfo.Inherit.RDGatewayHostname = true; - connectionInfo.Inherit.RDGatewayUsername = true; - connectionInfo.Inherit.RDGatewayPassword = true; - connectionInfo.Inherit.RDGatewayDomain = true; - } - - XmlNode remoteDesktopNode = xmlNode.SelectSingleNode("./remoteDesktop"); - if (remoteDesktopNode.Attributes["inherit"].Value == "None") - { - string resolutionString = System.Convert.ToString(remoteDesktopNode.SelectSingleNode("./size").InnerText.Replace(" ", "")); - try - { - connectionInfo.Resolution = "Res" + System.Convert.ToString(Tools.Misc.StringToEnum(typeof(Connection.Protocol.RDP.RDPResolutions), resolutionString)); - } - catch (ArgumentException) - { - connectionInfo.Resolution = RDP.RDPResolutions.FitToWindow; - } - - if (remoteDesktopNode.SelectSingleNode("./sameSizeAsClientArea").InnerText == "True") - { - connectionInfo.Resolution = RDP.RDPResolutions.FitToWindow; - } - - if (remoteDesktopNode.SelectSingleNode("./fullScreen").InnerText == "True") - { - connectionInfo.Resolution = RDP.RDPResolutions.Fullscreen; - } - - connectionInfo.Colors = remoteDesktopNode.SelectSingleNode("./colorDepth").InnerText; - } - else - { - connectionInfo.Inherit.Resolution = true; - connectionInfo.Inherit.Colors = true; - } - - XmlNode localResourcesNode = xmlNode.SelectSingleNode("./localResources"); - if (localResourcesNode.Attributes["inherit"].Value == "None") - { - switch (localResourcesNode.SelectSingleNode("./audioRedirection").InnerText) - { - case 0: // Bring to this computer - connectionInfo.RedirectSound = RDP.RDPSounds.BringToThisComputer; - break; - case 1: // Leave at remote computer - connectionInfo.RedirectSound = RDP.RDPSounds.LeaveAtRemoteComputer; - break; - case 2: // Do not play - connectionInfo.RedirectSound = RDP.RDPSounds.DoNotPlay; - break; - } - - // ./audioRedirectionQuality - // ./audioCaptureRedirection - - switch (localResourcesNode.SelectSingleNode("./keyboardHook").InnerText) - { - case 0: // On the local computer - connectionInfo.RedirectKeys = false; - break; - case 1: // On the remote computer - connectionInfo.RedirectKeys = true; - break; - case 2: // In full screen mode only - connectionInfo.RedirectKeys = false; - break; - } - - // ./redirectClipboard - connectionInfo.RedirectDiskDrives = bool.Parse(localResourcesNode.SelectSingleNode("./redirectDrives").InnerText); - connectionInfo.RedirectPorts = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPorts").InnerText); - connectionInfo.RedirectPrinters = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPrinters").InnerText); - connectionInfo.RedirectSmartCards = bool.Parse(localResourcesNode.SelectSingleNode("./redirectSmartCards").InnerText); - } - else - { - connectionInfo.Inherit.RedirectSound = true; - connectionInfo.Inherit.RedirectKeys = true; - connectionInfo.Inherit.RedirectDiskDrives = true; - connectionInfo.Inherit.RedirectPorts = true; - connectionInfo.Inherit.RedirectPrinters = true; - connectionInfo.Inherit.RedirectSmartCards = true; - } - - XmlNode securitySettingsNode = xmlNode.SelectSingleNode("./securitySettings"); - if (securitySettingsNode.Attributes["inherit"].Value == "None") - { - switch (securitySettingsNode.SelectSingleNode("./authentication").InnerText) - { - case 0: // No authentication - connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.NoAuth; - break; - case 1: // Do not connect if authentication fails - connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.AuthRequired; - break; - case 2: // Warn if authentication fails - connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.WarnOnFailedAuth; - break; - } - } - else - { - connectionInfo.Inherit.RDPAuthenticationLevel = true; - } - - // ./displaySettings/thumbnailScale - // ./displaySettings/liveThumbnailUpdates - // ./displaySettings/showDisconnectedThumbnails - - return connectionInfo; + connectionInfo.Inherit.TurnOffInheritanceCompletely(); } - - private static string DecryptPassword(string ciphertext) - { - if (string.IsNullOrEmpty(ciphertext)) - { - return null; - } - GCHandle gcHandle = new GCHandle(); - Win32.DATA_BLOB plaintextData = new Win32.DATA_BLOB(); + treeNode.Name = name; + treeNode.Tag = containerInfo; + treeNode.ImageIndex = Images.Enums.TreeImage.Container; + treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container; + + foreach (XmlNode childNode in xmlNode.SelectNodes("./group|./server")) + { + switch (childNode.Name) + { + case "group": + ImportFileOrGroup(childNode, treeNode); + break; + case "server": + ImportServer(childNode, treeNode); + break; + } + } + + containerInfo.IsExpanded = bool.Parse(propertiesNode.SelectSingleNode("./expanded").InnerText); + if (containerInfo.IsExpanded) + { + treeNode.Expand(); + } + + Runtime.ContainerList.Add(containerInfo); + } + + private static void ImportServer(XmlNode serverNode, TreeNode parentTreeNode) + { + string name = serverNode.SelectSingleNode("./displayName").InnerText; + TreeNode treeNode = new TreeNode(name); + parentTreeNode.Nodes.Add(treeNode); + + Connection.Info connectionInfo = ConnectionInfoFromXml(serverNode); + connectionInfo.TreeNode = treeNode; + connectionInfo.Parent = parentTreeNode.Tag; + + treeNode.Name = name; + treeNode.Tag = connectionInfo; + treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; + treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; + + Runtime.ConnectionList.Add(connectionInfo); + } + + private static Protocol.Info ConnectionInfoFromXml(XmlNode xmlNode) + { + Connection.Info connectionInfo = new Connection.Info(); + connectionInfo.Inherit = new Connection.Info.Inheritance(connectionInfo); + + string name = xmlNode.SelectSingleNode("./name").InnerText; + + string displayName = ""; + XmlNode displayNameNode = xmlNode.SelectSingleNode("./displayName"); + if (displayNameNode == null) + { + displayName = name; + } + else + { + displayName = displayNameNode.InnerText; + } + + connectionInfo.Name = displayName; + connectionInfo.Description = xmlNode.SelectSingleNode("./comment").InnerText; + connectionInfo.Hostname = name; + + XmlNode logonCredentialsNode = xmlNode.SelectSingleNode("./logonCredentials"); + if (logonCredentialsNode.Attributes["inherit"].Value == "None") + { + connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName").InnerText; + + XmlNode passwordNode = logonCredentialsNode.SelectSingleNode("./password"); + if (passwordNode.Attributes["storeAsClearText"].Value == "True") + { + connectionInfo.Password = passwordNode.InnerText; + } + else + { + connectionInfo.Password = DecryptPassword(passwordNode.InnerText); + } + + connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain").InnerText; + } + else + { + connectionInfo.Inherit.Username = true; + connectionInfo.Inherit.Password = true; + connectionInfo.Inherit.Domain = true; + } + + XmlNode connectionSettingsNode = xmlNode.SelectSingleNode("./connectionSettings"); + if (connectionSettingsNode.Attributes["inherit"].Value == "None") + { + connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole").InnerText); + // ./startProgram + // ./workingDir + connectionInfo.Port = (int) (connectionSettingsNode.SelectSingleNode("./port").InnerText); + } + else + { + connectionInfo.Inherit.UseConsoleSession = true; + connectionInfo.Inherit.Port = true; + } + + XmlNode gatewaySettingsNode = xmlNode.SelectSingleNode("./gatewaySettings"); + if (gatewaySettingsNode.Attributes["inherit"].Value == "None") + { + if (gatewaySettingsNode.SelectSingleNode("./enabled").InnerText == "True") + { + connectionInfo.RDGatewayUsageMethod = RDP.RDGatewayUsageMethod.Always; + } + else + { + connectionInfo.RDGatewayUsageMethod = RDP.RDGatewayUsageMethod.Never; + } + + connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName").InnerText; + connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName").InnerText; + + XmlNode passwordNode = logonCredentialsNode.SelectSingleNode("./password"); + if (passwordNode.Attributes["storeAsClearText"].Value == "True") + { + connectionInfo.RDGatewayPassword = passwordNode.InnerText; + } + else + { + connectionInfo.Password = DecryptPassword(passwordNode.InnerText); + } + + connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain").InnerText; + // ./logonMethod + // ./localBypass + // ./credSharing + } + else + { + connectionInfo.Inherit.RDGatewayUsageMethod = true; + connectionInfo.Inherit.RDGatewayHostname = true; + connectionInfo.Inherit.RDGatewayUsername = true; + connectionInfo.Inherit.RDGatewayPassword = true; + connectionInfo.Inherit.RDGatewayDomain = true; + } + + XmlNode remoteDesktopNode = xmlNode.SelectSingleNode("./remoteDesktop"); + if (remoteDesktopNode.Attributes["inherit"].Value == "None") + { + string resolutionString = System.Convert.ToString(remoteDesktopNode.SelectSingleNode("./size").InnerText.Replace(" ", "")); try { - byte[] ciphertextArray = Convert.FromBase64String(ciphertext); - gcHandle = System.Runtime.InteropServices.GCHandle.Alloc(ciphertextArray, GCHandleType.Pinned); - - Win32.DATA_BLOB ciphertextData = new Win32.DATA_BLOB(); - ciphertextData.cbData = ciphertextArray.Length; - ciphertextData.pbData = gcHandle.AddrOfPinnedObject(); - - Win32.DATA_BLOB temp_optionalEntropy = null; - IntPtr temp_promptStruct = null; - if (!Win32.CryptUnprotectData(ref ciphertextData, null, ref temp_optionalEntropy, null, ref temp_promptStruct, 0, ref plaintextData)) - { - return null; - } - - int plaintextLength = (int) ((double) plaintextData.cbData / 2); // Char = 2 bytes - char[] plaintextArray = new char[plaintextLength - 1 + 1]; - Marshal.Copy(plaintextData.pbData, plaintextArray, 0, plaintextLength); - - return new string(plaintextArray); + connectionInfo.Resolution = "Res" + System.Convert.ToString(Tools.Misc.StringToEnum(typeof(Connection.Protocol.RDP.RDPResolutions), resolutionString)); } - catch (Exception ex) + catch (ArgumentException) + { + connectionInfo.Resolution = RDP.RDPResolutions.FitToWindow; + } + + if (remoteDesktopNode.SelectSingleNode("./sameSizeAsClientArea").InnerText == "True") + { + connectionInfo.Resolution = RDP.RDPResolutions.FitToWindow; + } + + if (remoteDesktopNode.SelectSingleNode("./fullScreen").InnerText == "True") + { + connectionInfo.Resolution = RDP.RDPResolutions.Fullscreen; + } + + connectionInfo.Colors = remoteDesktopNode.SelectSingleNode("./colorDepth").InnerText; + } + else + { + connectionInfo.Inherit.Resolution = true; + connectionInfo.Inherit.Colors = true; + } + + XmlNode localResourcesNode = xmlNode.SelectSingleNode("./localResources"); + if (localResourcesNode.Attributes["inherit"].Value == "None") + { + switch (localResourcesNode.SelectSingleNode("./audioRedirection").InnerText) + { + case 0: // Bring to this computer + connectionInfo.RedirectSound = RDP.RDPSounds.BringToThisComputer; + break; + case 1: // Leave at remote computer + connectionInfo.RedirectSound = RDP.RDPSounds.LeaveAtRemoteComputer; + break; + case 2: // Do not play + connectionInfo.RedirectSound = RDP.RDPSounds.DoNotPlay; + break; + } + + // ./audioRedirectionQuality + // ./audioCaptureRedirection + + switch (localResourcesNode.SelectSingleNode("./keyboardHook").InnerText) + { + case 0: // On the local computer + connectionInfo.RedirectKeys = false; + break; + case 1: // On the remote computer + connectionInfo.RedirectKeys = true; + break; + case 2: // In full screen mode only + connectionInfo.RedirectKeys = false; + break; + } + + // ./redirectClipboard + connectionInfo.RedirectDiskDrives = bool.Parse(localResourcesNode.SelectSingleNode("./redirectDrives").InnerText); + connectionInfo.RedirectPorts = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPorts").InnerText); + connectionInfo.RedirectPrinters = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPrinters").InnerText); + connectionInfo.RedirectSmartCards = bool.Parse(localResourcesNode.SelectSingleNode("./redirectSmartCards").InnerText); + } + else + { + connectionInfo.Inherit.RedirectSound = true; + connectionInfo.Inherit.RedirectKeys = true; + connectionInfo.Inherit.RedirectDiskDrives = true; + connectionInfo.Inherit.RedirectPorts = true; + connectionInfo.Inherit.RedirectPrinters = true; + connectionInfo.Inherit.RedirectSmartCards = true; + } + + XmlNode securitySettingsNode = xmlNode.SelectSingleNode("./securitySettings"); + if (securitySettingsNode.Attributes["inherit"].Value == "None") + { + switch (securitySettingsNode.SelectSingleNode("./authentication").InnerText) + { + case 0: // No authentication + connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.NoAuth; + break; + case 1: // Do not connect if authentication fails + connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.AuthRequired; + break; + case 2: // Warn if authentication fails + connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.WarnOnFailedAuth; + break; + } + } + else + { + connectionInfo.Inherit.RDPAuthenticationLevel = true; + } + + // ./displaySettings/thumbnailScale + // ./displaySettings/liveThumbnailUpdates + // ./displaySettings/showDisconnectedThumbnails + + return connectionInfo; + } + + private static string DecryptPassword(string ciphertext) + { + if (string.IsNullOrEmpty(ciphertext)) + { + return null; + } + + GCHandle gcHandle = new GCHandle(); + Win32.DATA_BLOB plaintextData = new Win32.DATA_BLOB(); + try + { + byte[] ciphertextArray = Convert.FromBase64String(ciphertext); + gcHandle = System.Runtime.InteropServices.GCHandle.Alloc(ciphertextArray, GCHandleType.Pinned); + + Win32.DATA_BLOB ciphertextData = new Win32.DATA_BLOB(); + ciphertextData.cbData = ciphertextArray.Length; + ciphertextData.pbData = gcHandle.AddrOfPinnedObject(); + + Win32.DATA_BLOB temp_optionalEntropy = null; + IntPtr temp_promptStruct = null; + if (!Win32.CryptUnprotectData(ref ciphertextData, null, ref temp_optionalEntropy, null, ref temp_promptStruct, 0, ref plaintextData)) { - MessageCollector.AddExceptionMessage(message: "RemoteDesktopConnectionManager.DecryptPassword() failed.", ex: ex, logOnly: true); return null; } - finally - { - if (gcHandle.IsAllocated) - { - gcHandle.Free(); - } - if (!(plaintextData.pbData == IntPtr.Zero)) - { - Win32.LocalFree(plaintextData.pbData); - } - } + + int plaintextLength = (int) ((double) plaintextData.cbData / 2); // Char = 2 bytes + char[] plaintextArray = new char[plaintextLength - 1 + 1]; + Marshal.Copy(plaintextData.pbData, plaintextArray, 0, plaintextLength); + + return new string(plaintextArray); } - - // ReSharper disable once ClassNeverInstantiated.Local - private class Win32 + catch (Exception ex) { - // ReSharper disable InconsistentNaming - // ReSharper disable IdentifierTypo - // ReSharper disable StringLiteralTypo - [DllImport("crypt32.dll", CharSet = CharSet.Unicode)]public static extern bool CryptUnprotectData(ref DATA_BLOB dataIn, string description, ref DATA_BLOB optionalEntropy, IntPtr reserved, ref IntPtr promptStruct, int flags, ref DATA_BLOB dataOut); - - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]public static extern void LocalFree(IntPtr ptr); - - public struct DATA_BLOB + Runtime.MessageCollector.AddExceptionMessage(message: "RemoteDesktopConnectionManager.DecryptPassword() failed.", ex: ex, logOnly: true); + return null; + } + finally + { + if (gcHandle.IsAllocated) { - public int cbData; - public IntPtr pbData; + gcHandle.Free(); + } + if (!(plaintextData.pbData == IntPtr.Zero)) + { + Win32.LocalFree(plaintextData.pbData); } - // ReSharper restore StringLiteralTypo - // ReSharper restore IdentifierTypo - // ReSharper restore InconsistentNaming } } + + // ReSharper disable once ClassNeverInstantiated.Local + private class Win32 + { + // ReSharper disable InconsistentNaming + // ReSharper disable IdentifierTypo + // ReSharper disable StringLiteralTypo + [DllImport("crypt32.dll", CharSet = CharSet.Unicode)]public static extern bool CryptUnprotectData(ref DATA_BLOB dataIn, string description, ref DATA_BLOB optionalEntropy, IntPtr reserved, ref IntPtr promptStruct, int flags, ref DATA_BLOB dataOut); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]public static extern void LocalFree(IntPtr ptr); + + public struct DATA_BLOB + { + public int cbData; + public IntPtr pbData; + } + // ReSharper restore StringLiteralTypo + // ReSharper restore IdentifierTypo + // ReSharper restore InconsistentNaming + } + } } diff --git a/mRemoteV1/CS/Config/KeyboardShortcuts.cs b/mRemoteV1/CS/Config/KeyboardShortcuts.cs index 53d9f4fbe..5d47a3dae 100644 --- a/mRemoteV1/CS/Config/KeyboardShortcuts.cs +++ b/mRemoteV1/CS/Config/KeyboardShortcuts.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,11 +8,9 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Runtime.InteropServices; using System.ComponentModel; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using SharedLibraryNG; @@ -21,9 +18,9 @@ namespace mRemoteNG.Config { public class KeyboardShortcuts { -#region Public Properties + #region Public Properties private static KeyboardShortcutMap _defaultMap = null; -public static KeyboardShortcutMap DefaultMap + public static KeyboardShortcutMap DefaultMap { get { @@ -33,7 +30,7 @@ public static KeyboardShortcutMap DefaultMap } private static KeyboardShortcutMap _map; -public static KeyboardShortcutMap Map + public static KeyboardShortcutMap Map { get { @@ -48,9 +45,9 @@ public static KeyboardShortcutMap Map RequestKeyNotifications(_handle); } } -#endregion + #endregion -#region Public Methods + #region Public Methods public static void RequestKeyNotifications(IntPtr handle) { // ReSharper disable LocalizableElement @@ -75,16 +72,16 @@ public static KeyboardShortcutMap Map KeyboardHook.HookKeyMsgData msgData = Marshal.PtrToStructure(m.LParam, typeof(KeyboardHook.HookKeyMsgData)); return Map.GetCommand(msgData.KeyCode, msgData.ModifierKeys); } -#endregion + #endregion -#region Private Fields + #region Private Fields // ReSharper disable once UnusedMember.Local private static KeyboardHook _keyboardHook = new KeyboardHook(); private static bool _mapLoaded = false; private static IntPtr _handle = IntPtr.Zero; -#endregion + #endregion -#region Private Methods + #region Private Methods private static void LoadDefaultMap() { if (_defaultMap != null) @@ -129,24 +126,24 @@ public static KeyboardShortcutMap Map KeyboardHook.CancelKeyNotification(_handle, shortcutMapping.Key.KeyCode, shortcutMapping.Key.ModifierKeys, false); } } -#endregion + #endregion } public class KeyboardShortcutMap : ICloneable { -#region Public Properties + #region Public Properties private List _mappings; -public List Mappings + public List Mappings { get { return _mappings; } } -#endregion + #endregion -#region Constructors + #region Constructors public KeyboardShortcutMap() { _mappings = new List(); @@ -156,9 +153,9 @@ public List Mappings { _mappings = mappings; } -#endregion + #endregion -#region Public Methods + #region Public Methods public void Add(ShortcutCommand command, ShortcutKey shortcutKey) { if (Mappings.Contains(new ShortcutMapping(command, shortcutKey))) @@ -229,9 +226,9 @@ public List Mappings newMappings.AddRange(Mappings); return new KeyboardShortcutMap(newMappings); } -#endregion + #endregion -#region Private Methods + #region Private Methods private static ShortcutKey[] ParseConfigString(string shortcutKeysString) { List shortcutKeys = new List(); @@ -243,7 +240,7 @@ public List Mappings } catch (Exception ex) { - MessageCollector.AddExceptionMessage(message: string.Format("KeyboardShortcuts.ParseShortcutKeysString({0}) failed at {1}.", shortcutKeysString, shortcutKeyString), ex: ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage(message: string.Format("KeyboardShortcuts.ParseShortcutKeysString({0}) failed at {1}.", shortcutKeysString, shortcutKeyString), ex: ex, logOnly: true); continue; } } @@ -288,15 +285,15 @@ public List Mappings Mappings.Remove(mapping); } } -#endregion + #endregion } - [ImmutableObject(true)]public class ShortcutMapping : IEquatable + [ImmutableObject(true)] + public class ShortcutMapping : IEquatable { - -#region Public Properties + #region Public Properties private ShortcutCommand _command; -public ShortcutCommand Command + public ShortcutCommand Command { get { @@ -305,24 +302,24 @@ public ShortcutCommand Command } private ShortcutKey _key; -public ShortcutKey Key + public ShortcutKey Key { get { return _key; } } -#endregion + #endregion -#region Constructors + #region Constructors public ShortcutMapping(ShortcutCommand command, ShortcutKey key) { _command = command; _key = key; } -#endregion + #endregion -#region Public Methods + #region Public Methods public bool Equals(ShortcutMapping other) { if (!(Command == other.Command)) @@ -335,15 +332,15 @@ public ShortcutKey Key } return true; } -#endregion + #endregion } - [ImmutableObject(true)]public class ShortcutKey : IEquatable + [ImmutableObject(true)] + public class ShortcutKey : IEquatable { - -#region Public Properties + #region Public Properties private int _keyCode; -public int KeyCode + public int KeyCode { get { @@ -352,16 +349,16 @@ public int KeyCode } private KeyboardHook.ModifierKeys _modifierKeys; -public KeyboardHook.ModifierKeys ModifierKeys + public KeyboardHook.ModifierKeys ModifierKeys { get { return _modifierKeys; } } -#endregion + #endregion -#region Constructors + #region Constructors public ShortcutKey(int keyCode, KeyboardHook.ModifierKeys modifierKeys) { _keyCode = keyCode; @@ -384,9 +381,9 @@ public KeyboardHook.ModifierKeys ModifierKeys _modifierKeys = _modifierKeys | KeyboardHook.ModifierKeys.Alt; } } -#endregion + #endregion -#region Public Methods + #region Public Methods public string ToConfigString() { return string.Join("/", new string[] {KeyCode, Convert.ToInt32(ModifierKeys)}); @@ -419,9 +416,9 @@ public KeyboardHook.ModifierKeys ModifierKeys } return true; } -#endregion + #endregion -#region Operators + #region Operators public static bool operator ==(ShortcutKey shortcutKey1, ShortcutKey shortcutKey2) { return shortcutKey1.Equals(shortcutKey2); @@ -455,13 +452,13 @@ public KeyboardHook.ModifierKeys ModifierKeys { return new ShortcutKey(keys); } -#endregion + #endregion } public enum ShortcutCommand - { - None = 0, - PreviousTab, - NextTab - } + { + None = 0, + PreviousTab, + NextTab + } } diff --git a/mRemoteV1/CS/Connection/Connection.Icon.cs b/mRemoteV1/CS/Connection/Connection.Icon.cs index 45a6a3d9d..9f0f132bd 100644 --- a/mRemoteV1/CS/Connection/Connection.Icon.cs +++ b/mRemoteV1/CS/Connection/Connection.Icon.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,53 +8,50 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.ComponentModel; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.Connection { public class Icon : StringConverter + { + public static string[] Icons = new string[] {}; + + public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) { - - public static string[] Icons = new string[] {}; - - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) - { - return new StandardValuesCollection(Icons); - } - - public override bool GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) - { - return true; - } - - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) - { - return true; - } - - public static System.Drawing.Icon FromString(string IconName) - { - try - { - string IconPath = (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\Icons\\" + IconName +".ico"; - - if (System.IO.File.Exists(IconPath)) - { - System.Drawing.Icon nI = new System.Drawing.Icon(IconPath); - - return nI; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t get Icon from String" + Constants.vbNewLine + ex.Message); - } - - return null; - } + return new StandardValuesCollection(Icons); } + + public override bool GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) + { + return true; + } + + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + { + return true; + } + + public static System.Drawing.Icon FromString(string IconName) + { + try + { + string IconPath = (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\Icons\\" + IconName +".ico"; + + if (System.IO.File.Exists(IconPath)) + { + System.Drawing.Icon nI = new System.Drawing.Icon(IconPath); + + return nI; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t get Icon from String" + Constants.vbNewLine + ex.Message); + } + + return null; + } + } } diff --git a/mRemoteV1/CS/Connection/Connection.Info.cs b/mRemoteV1/CS/Connection/Connection.Info.cs index 2395f690f..1ba0331f3 100644 --- a/mRemoteV1/CS/Connection/Connection.Info.cs +++ b/mRemoteV1/CS/Connection/Connection.Info.cs @@ -17,10 +17,11 @@ using mRemoteNG.App; namespace mRemoteNG.Connection { - [DefaultProperty("Name")]public partial class Info + [DefaultProperty("Name")] + public partial class Info { -#region Public Properties -#region Display + #region Public Properties + #region Display [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), LocalizedAttributes.LocalizedDisplayName("strPropertyNameName"), LocalizedAttributes.LocalizedDescription("strPropertyDescriptionName")] @@ -74,8 +75,8 @@ namespace mRemoteNG.Connection _panel = value; } } -#endregion -#region Connection + #endregion + #region Connection private string _hostname = string.Empty; [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), LocalizedAttributes.LocalizedDisplayName("strPropertyNameAddress"), @@ -147,8 +148,8 @@ namespace mRemoteNG.Connection _domain = value.Trim(); } } -#endregion -#region Protocol + #endregion + #region Protocol private Protocol.Protocols _protocol; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors. [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), LocalizedAttributes.LocalizedDisplayName("strPropertyNameProtocol"), @@ -316,8 +317,8 @@ namespace mRemoteNG.Connection _useCredSsp = value; } } -#endregion -#region RD Gateway + #endregion + #region RD Gateway private Protocol.RDP.RDGatewayUsageMethod _rdGatewayUsageMethod; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors. [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUsageMethod"), @@ -416,8 +417,8 @@ namespace mRemoteNG.Connection _rdGatewayDomain = value.Trim(); } } -#endregion -#region Appearance + #endregion + #region Appearance private Protocol.RDP.RDPResolutions _resolution; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors. [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), LocalizedAttributes.LocalizedDisplayName("strPropertyNameResolution"), @@ -553,8 +554,8 @@ namespace mRemoteNG.Connection _enableDesktopComposition = value; } } -#endregion -#region Redirect + #endregion + #region Redirect private bool _redirectKeys; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors. [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectKeys"), @@ -656,8 +657,8 @@ namespace mRemoteNG.Connection _redirectSound = value; } } -#endregion -#region Misc + #endregion + #region Misc private string _preExtApp; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors. [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalToolBefore"), @@ -723,8 +724,8 @@ namespace mRemoteNG.Connection _userField = value; } } -#endregion -#region VNC + #endregion + #region VNC private Protocol.VNC.Compression _vncCompression; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors. [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), Browsable(false), @@ -918,10 +919,11 @@ namespace mRemoteNG.Connection _vncViewOnly = value; } } -#endregion - - [Browsable(false)]private Inheritance _Inherit = -@privateprivate ;Inheritance Inherit + #endregion + + [Browsable(false)] + private Inheritance _Inherit; + public Inheritance Inherit { get { @@ -932,9 +934,10 @@ namespace mRemoteNG.Connection _Inherit = value; } } - - [Browsable(false)]private Protocol.List _OpenConnections = -@privateprivate ;Protocol.List OpenConnections + + [Browsable(false)] + private Protocol.List _OpenConnections = new Protocol.List(); + public Protocol.List OpenConnections { get { @@ -946,8 +949,9 @@ namespace mRemoteNG.Connection } } - [Browsable(false)]private bool _IsContainer = false; - private bool IsContainer + [Browsable(false)] + private bool _IsContainer = false; + public bool IsContainer { get { @@ -959,8 +963,9 @@ namespace mRemoteNG.Connection } } - [Browsable(false)]private bool _IsDefault = false; - private bool IsDefault + [Browsable(false)] + private bool _IsDefault = false; + public bool IsDefault { get { @@ -972,10 +977,12 @@ namespace mRemoteNG.Connection } } - [Browsable(false)]public Container.Info Parent {get; set;} + [Browsable(false)] + public Container.Info Parent {get; set;} - [Browsable(false)]private int _PositionID = 0; - private int PositionID + [Browsable(false)] + private int _PositionID = 0; + public int PositionID { get { @@ -987,12 +994,15 @@ namespace mRemoteNG.Connection } } - [Browsable(false)]public string ConstantID {get; set;} + [Browsable(false)] + public string ConstantID {get; set;} - [Browsable(false)]public TreeNode TreeNode {get; set;} + [Browsable(false)] + public TreeNode TreeNode {get; set;} - [Browsable(false)]private bool _IsQuickConnect = false; - private bool IsQuickConnect + [Browsable(false)] + private bool _IsQuickConnect = false; + public bool IsQuickConnect { get { @@ -1004,8 +1014,9 @@ namespace mRemoteNG.Connection } } - [Browsable(false)]private bool _PleaseConnect = false; - private bool PleaseConnect + [Browsable(false)] + private bool _PleaseConnect = false; + public bool PleaseConnect { get { @@ -1018,7 +1029,7 @@ namespace mRemoteNG.Connection } #endregion -#region Constructors + #region Constructors public Info() { // VBConversions Note: Non-static class variable initialization is below. Class variables cannot be initially assigned non-static values in C#. @@ -1034,9 +1045,9 @@ namespace mRemoteNG.Connection IsContainer = true; this.Parent = parent; } -#endregion + #endregion -#region Public Methods + #region Public Methods public Info Copy() { Info newConnectionInfo = (Info)MemberwiseClone(); @@ -1062,9 +1073,9 @@ namespace mRemoteNG.Connection { Port = GetDefaultPort(); } -#endregion + #endregion -#region Public Enumerations + #region Public Enumerations [Flags()]public enum Force { None = 0, @@ -1075,9 +1086,9 @@ namespace mRemoteNG.Connection DontUseConsoleSession = 16, NoCredentials = 32 } -#endregion + #endregion -#region Private Methods + #region Private Methods private TPropertyType GetInheritedPropertyValue(string propertyName, TPropertyType value) { Type inheritType = Inherit.GetType(); @@ -1162,6 +1173,6 @@ namespace mRemoteNG.Connection Runtime.MessageCollector.AddExceptionMessage(My.Language.strConnectionSetDefaultPortFailed, ex, Messages.MessageClass.ErrorMsg); } } -#endregion + #endregion } } diff --git a/mRemoteV1/CS/Connection/Connection.List.cs b/mRemoteV1/CS/Connection/Connection.List.cs index 32ef5284c..341900739 100644 --- a/mRemoteV1/CS/Connection/Connection.List.cs +++ b/mRemoteV1/CS/Connection/Connection.List.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,22 +8,20 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports namespace mRemoteNG.Connection { public class List : CollectionBase { - -#region Public Properties -public Connection.Info this[object Index] + #region Public Properties + public Connection.Info this[object Index] { get { if (Index is Connection.Info) { - return Index; + return (Connection.Info)Index; } else { @@ -33,16 +30,13 @@ public Connection.Info this[object Index] } } -public new int Count + public new int Count { - get - { - return List.Count; - } + get { return List.Count; } } -#endregion + #endregion -#region Public Methods + #region Public Methods public Connection.Info Add(Connection.Info cInfo) { this.List.Add(cInfo); @@ -80,7 +74,7 @@ public new int Count { try { - return this.MemberwiseClone(); + return (Connection.List)this.MemberwiseClone(); } catch (Exception) { @@ -93,6 +87,6 @@ public new int Count { this.List.Clear(); } -#endregion + #endregion } } diff --git a/mRemoteV1/CS/Connection/Connection.Protocol.Base.cs b/mRemoteV1/CS/Connection/Connection.Protocol.Base.cs index fbe45df4f..acb62f24e 100644 --- a/mRemoteV1/CS/Connection/Connection.Protocol.Base.cs +++ b/mRemoteV1/CS/Connection/Connection.Protocol.Base.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,389 +8,387 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Threading; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.Connection.Protocol { public class Base + { + #region Properties + #region Control + private string _Name; + public string Name + { + get { -#region Properties -#region Control - private string _Name; -public string Name - { - get - { - return this._Name; - } - set - { - this._Name = value; - } - } - - private UI.Window.Connection _connectionWindow; -public UI.Window.Connection ConnectionWindow - { - get - { - return _connectionWindow; - } - set - { - _connectionWindow = value; - _connectionWindow.ResizeBegin += ResizeBegin; - _connectionWindow.Resize += Resize; - _connectionWindow.ResizeEnd += ResizeEnd; - } - } - - private InterfaceControl _interfaceControl; -public InterfaceControl InterfaceControl - { - get - { - return _interfaceControl; - } - set - { - _interfaceControl = value; - ConnectionWindow = _interfaceControl.GetContainerControl() as UI.Window.Connection; - } - } - - private Control _Control; -public Control Control - { - get - { - return this._Control; - } - set - { - this._Control = value; - } - } -#endregion - - private mRemoteNG.Connection.Info.Force _Force; -public mRemoteNG.Connection.Info.Force Force - { - get - { - return this._Force; - } - set - { - this._Force = value; - } - } - - public System.Timers.Timer tmrReconnect = new System.Timers.Timer(2000); - public ReconnectGroup ReconnectGroup; -#endregion - -#region Methods - public virtual void Focus() - { - try - { - this._Control.Focus(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t focus Control (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); - } - } - - public virtual void ResizeBegin(System.Object sender, EventArgs e) - { - - } - - public virtual void Resize(System.Object sender, EventArgs e) - { - - } - - public virtual void ResizeEnd(System.Object sender, EventArgs e) - { - - } - - public virtual bool SetProps() - { - try - { - this._interfaceControl.Parent.Tag = this._interfaceControl; - this._interfaceControl.Show(); - - if (this._Control != null) - { - this._Control.Name = this._Name; - this._Control.Parent = this._interfaceControl; - this._Control.Location = this._interfaceControl.Location; - this._Control.Size = this.InterfaceControl.Size; - this._Control.Anchor = this._interfaceControl.Anchor; - } - - return true; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t SetProps (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); - return false; - } - } - - public virtual bool Connect() - { - if (InterfaceControl.Info.Protocol != Protocols.RDP) - { - if (ConnectedEvent != null) - ConnectedEvent(this); - } - } - - public virtual void Disconnect() - { - this.Close(); - } - - public virtual void Close() - { - Thread t = new Thread(new System.Threading.ThreadStart(CloseBG)); - t.SetApartmentState(System.Threading.ApartmentState.STA); - t.IsBackground = true; - t.Start(); - } - - private void CloseBG() - { - if (ClosedEvent != null) - ClosedEvent(this); - - try - { - tmrReconnect.Enabled = false; - - if (this._Control != null) - { - try - { - this.DisposeControl(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Could not dispose control, probably form is already closed (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); - } - } - - if (this._interfaceControl != null) - { - try - { - if (this._interfaceControl.Parent != null) - { - if (this._interfaceControl.Parent.Tag != null) - { - this.SetTagToNothing(); - } - - this.DisposeInterface(); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Could not set InterfaceControl.Parent.Tag or Dispose Interface, probably form is already closed (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t Close InterfaceControl BG (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); - } - } - - private delegate void DisposeInterfaceCB(); - private void DisposeInterface() - { - if (this._interfaceControl.InvokeRequired) - { - DisposeInterfaceCB s = new DisposeInterfaceCB(DisposeInterface); - this._interfaceControl.Invoke(s); - } - else - { - this._interfaceControl.Dispose(); - } - } - - private delegate void SetTagToNothingCB(); - private void SetTagToNothing() - { - if (this._interfaceControl.Parent.InvokeRequired) - { - SetTagToNothingCB s = new SetTagToNothingCB(SetTagToNothing); - this._interfaceControl.Parent.Invoke(s); - } - else - { - this._interfaceControl.Parent.Tag = null; - } - } - - private delegate void DisposeControlCB(); - private void DisposeControl() - { - if (this._Control.InvokeRequired) - { - DisposeControlCB s = new DisposeControlCB(DisposeControl); - this._Control.Invoke(s); - } - else - { - this._Control.Dispose(); - } - } -#endregion - -#region Events - public delegate void ConnectingEventHandler(object sender); - private ConnectingEventHandler ConnectingEvent; - - public event ConnectingEventHandler Connecting - { - add - { - ConnectingEvent = (ConnectingEventHandler) System.Delegate.Combine(ConnectingEvent, value); - } - remove - { - ConnectingEvent = (ConnectingEventHandler) System.Delegate.Remove(ConnectingEvent, value); - } - } - - public delegate void ConnectedEventHandler(object sender); - private ConnectedEventHandler ConnectedEvent; - - public event ConnectedEventHandler Connected - { - add - { - ConnectedEvent = (ConnectedEventHandler) System.Delegate.Combine(ConnectedEvent, value); - } - remove - { - ConnectedEvent = (ConnectedEventHandler) System.Delegate.Remove(ConnectedEvent, value); - } - } - - public delegate void DisconnectedEventHandler(object sender, string DisconnectedMessage); - private DisconnectedEventHandler DisconnectedEvent; - - public event DisconnectedEventHandler Disconnected - { - add - { - DisconnectedEvent = (DisconnectedEventHandler) System.Delegate.Combine(DisconnectedEvent, value); - } - remove - { - DisconnectedEvent = (DisconnectedEventHandler) System.Delegate.Remove(DisconnectedEvent, value); - } - } - - public delegate void ErrorOccuredEventHandler(object sender, string ErrorMessage); - private ErrorOccuredEventHandler ErrorOccuredEvent; - - public event ErrorOccuredEventHandler ErrorOccured - { - add - { - ErrorOccuredEvent = (ErrorOccuredEventHandler) System.Delegate.Combine(ErrorOccuredEvent, value); - } - remove - { - ErrorOccuredEvent = (ErrorOccuredEventHandler) System.Delegate.Remove(ErrorOccuredEvent, value); - } - } - - public delegate void ClosingEventHandler(object sender); - private ClosingEventHandler ClosingEvent; - - public event ClosingEventHandler Closing - { - add - { - ClosingEvent = (ClosingEventHandler) System.Delegate.Combine(ClosingEvent, value); - } - remove - { - ClosingEvent = (ClosingEventHandler) System.Delegate.Remove(ClosingEvent, value); - } - } - - public delegate void ClosedEventHandler(object sender); - private ClosedEventHandler ClosedEvent; - - public event ClosedEventHandler Closed - { - add - { - ClosedEvent = (ClosedEventHandler) System.Delegate.Combine(ClosedEvent, value); - } - remove - { - ClosedEvent = (ClosedEventHandler) System.Delegate.Remove(ClosedEvent, value); - } - } - - - public void Event_Closing(object sender) - { - if (ClosingEvent != null) - ClosingEvent(sender); - } - - public void Event_Closed(object sender) - { - if (ClosedEvent != null) - ClosedEvent(sender); - } - - public void Event_Connecting(object sender) - { - if (ConnectingEvent != null) - ConnectingEvent(sender); - } - - public void Event_Connected(object sender) - { - if (ConnectedEvent != null) - ConnectedEvent(sender); - } - - public void Event_Disconnected(object sender, string DisconnectedMessage) - { - if (DisconnectedEvent != null) - DisconnectedEvent(sender, DisconnectedMessage); - } - - public void Event_ErrorOccured(object sender, string ErrorMsg) - { - if (ErrorOccuredEvent != null) - ErrorOccuredEvent(sender, ErrorMsg); - } - - public void Event_ReconnectGroupCloseClicked() - { - Close(); - } -#endregion + return this._Name; } + set + { + this._Name = value; + } + } + + private UI.Window.Connection _connectionWindow; + public UI.Window.Connection ConnectionWindow + { + get + { + return _connectionWindow; + } + set + { + _connectionWindow = value; + _connectionWindow.ResizeBegin += ResizeBegin; + _connectionWindow.Resize += Resize; + _connectionWindow.ResizeEnd += ResizeEnd; + } + } + + private InterfaceControl _interfaceControl; + public InterfaceControl InterfaceControl + { + get + { + return _interfaceControl; + } + set + { + _interfaceControl = value; + ConnectionWindow = _interfaceControl.GetContainerControl() as UI.Window.Connection; + } + } + + private Control _Control; + public Control Control + { + get + { + return this._Control; + } + set + { + this._Control = value; + } + } + #endregion + + private mRemoteNG.Connection.Info.Force _Force; + public mRemoteNG.Connection.Info.Force Force + { + get + { + return this._Force; + } + set + { + this._Force = value; + } + } + + public System.Timers.Timer tmrReconnect = new System.Timers.Timer(2000); + public ReconnectGroup ReconnectGroup; + #endregion + + #region Methods + public virtual void Focus() + { + try + { + this._Control.Focus(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t focus Control (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); + } + } + + public virtual void ResizeBegin(System.Object sender, EventArgs e) + { + + } + + public virtual void Resize(System.Object sender, EventArgs e) + { + + } + + public virtual void ResizeEnd(System.Object sender, EventArgs e) + { + + } + + public virtual bool SetProps() + { + try + { + this._interfaceControl.Parent.Tag = this._interfaceControl; + this._interfaceControl.Show(); + + if (this._Control != null) + { + this._Control.Name = this._Name; + this._Control.Parent = this._interfaceControl; + this._Control.Location = this._interfaceControl.Location; + this._Control.Size = this.InterfaceControl.Size; + this._Control.Anchor = this._interfaceControl.Anchor; + } + + return true; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t SetProps (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); + return false; + } + } + + public virtual bool Connect() + { + if (InterfaceControl.Info.Protocol != Protocols.RDP) + { + if (ConnectedEvent != null) + ConnectedEvent(this); + } + } + + public virtual void Disconnect() + { + this.Close(); + } + + public virtual void Close() + { + Thread t = new Thread(new System.Threading.ThreadStart(CloseBG)); + t.SetApartmentState(System.Threading.ApartmentState.STA); + t.IsBackground = true; + t.Start(); + } + + private void CloseBG() + { + if (ClosedEvent != null) + ClosedEvent(this); + + try + { + tmrReconnect.Enabled = false; + + if (this._Control != null) + { + try + { + this.DisposeControl(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Could not dispose control, probably form is already closed (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); + } + } + + if (this._interfaceControl != null) + { + try + { + if (this._interfaceControl.Parent != null) + { + if (this._interfaceControl.Parent.Tag != null) + { + this.SetTagToNothing(); + } + + this.DisposeInterface(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Could not set InterfaceControl.Parent.Tag or Dispose Interface, probably form is already closed (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t Close InterfaceControl BG (Connection.Protocol.Base)" + Constants.vbNewLine + ex.Message, true); + } + } + + private delegate void DisposeInterfaceCB(); + private void DisposeInterface() + { + if (this._interfaceControl.InvokeRequired) + { + DisposeInterfaceCB s = new DisposeInterfaceCB(DisposeInterface); + this._interfaceControl.Invoke(s); + } + else + { + this._interfaceControl.Dispose(); + } + } + + private delegate void SetTagToNothingCB(); + private void SetTagToNothing() + { + if (this._interfaceControl.Parent.InvokeRequired) + { + SetTagToNothingCB s = new SetTagToNothingCB(SetTagToNothing); + this._interfaceControl.Parent.Invoke(s); + } + else + { + this._interfaceControl.Parent.Tag = null; + } + } + + private delegate void DisposeControlCB(); + private void DisposeControl() + { + if (this._Control.InvokeRequired) + { + DisposeControlCB s = new DisposeControlCB(DisposeControl); + this._Control.Invoke(s); + } + else + { + this._Control.Dispose(); + } + } + #endregion + + #region Events + public delegate void ConnectingEventHandler(object sender); + private ConnectingEventHandler ConnectingEvent; + + public event ConnectingEventHandler Connecting + { + add + { + ConnectingEvent = (ConnectingEventHandler) System.Delegate.Combine(ConnectingEvent, value); + } + remove + { + ConnectingEvent = (ConnectingEventHandler) System.Delegate.Remove(ConnectingEvent, value); + } + } + + public delegate void ConnectedEventHandler(object sender); + private ConnectedEventHandler ConnectedEvent; + + public event ConnectedEventHandler Connected + { + add + { + ConnectedEvent = (ConnectedEventHandler) System.Delegate.Combine(ConnectedEvent, value); + } + remove + { + ConnectedEvent = (ConnectedEventHandler) System.Delegate.Remove(ConnectedEvent, value); + } + } + + public delegate void DisconnectedEventHandler(object sender, string DisconnectedMessage); + private DisconnectedEventHandler DisconnectedEvent; + + public event DisconnectedEventHandler Disconnected + { + add + { + DisconnectedEvent = (DisconnectedEventHandler) System.Delegate.Combine(DisconnectedEvent, value); + } + remove + { + DisconnectedEvent = (DisconnectedEventHandler) System.Delegate.Remove(DisconnectedEvent, value); + } + } + + public delegate void ErrorOccuredEventHandler(object sender, string ErrorMessage); + private ErrorOccuredEventHandler ErrorOccuredEvent; + + public event ErrorOccuredEventHandler ErrorOccured + { + add + { + ErrorOccuredEvent = (ErrorOccuredEventHandler) System.Delegate.Combine(ErrorOccuredEvent, value); + } + remove + { + ErrorOccuredEvent = (ErrorOccuredEventHandler) System.Delegate.Remove(ErrorOccuredEvent, value); + } + } + + public delegate void ClosingEventHandler(object sender); + private ClosingEventHandler ClosingEvent; + + public event ClosingEventHandler Closing + { + add + { + ClosingEvent = (ClosingEventHandler) System.Delegate.Combine(ClosingEvent, value); + } + remove + { + ClosingEvent = (ClosingEventHandler) System.Delegate.Remove(ClosingEvent, value); + } + } + + public delegate void ClosedEventHandler(object sender); + private ClosedEventHandler ClosedEvent; + + public event ClosedEventHandler Closed + { + add + { + ClosedEvent = (ClosedEventHandler) System.Delegate.Combine(ClosedEvent, value); + } + remove + { + ClosedEvent = (ClosedEventHandler) System.Delegate.Remove(ClosedEvent, value); + } + } + + + public void Event_Closing(object sender) + { + if (ClosingEvent != null) + ClosingEvent(sender); + } + + public void Event_Closed(object sender) + { + if (ClosedEvent != null) + ClosedEvent(sender); + } + + public void Event_Connecting(object sender) + { + if (ConnectingEvent != null) + ConnectingEvent(sender); + } + + public void Event_Connected(object sender) + { + if (ConnectedEvent != null) + ConnectedEvent(sender); + } + + public void Event_Disconnected(object sender, string DisconnectedMessage) + { + if (DisconnectedEvent != null) + DisconnectedEvent(sender, DisconnectedMessage); + } + + public void Event_ErrorOccured(object sender, string ErrorMsg) + { + if (ErrorOccuredEvent != null) + ErrorOccuredEvent(sender, ErrorMsg); + } + + public void Event_ReconnectGroupCloseClicked() + { + Close(); + } + #endregion + } } diff --git a/mRemoteV1/CS/Connection/Connection.Protocol.HTTPBase.cs b/mRemoteV1/CS/Connection/Connection.Protocol.HTTPBase.cs index dc8e7ddf4..6b241b285 100644 --- a/mRemoteV1/CS/Connection/Connection.Protocol.HTTPBase.cs +++ b/mRemoteV1/CS/Connection/Connection.Protocol.HTTPBase.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -10,9 +9,7 @@ using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; using mRemoteNG.Tools; -// End of VB project level imports - -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; //using mRemoteNG.Tools.LocalizedAttributes; @@ -20,15 +17,14 @@ namespace mRemoteNG.Connection.Protocol { public class HTTPBase : Base { - -#region Private Properties + #region Private Properties private Control wBrowser; public string httpOrS; public int defaultPort; private string tabTitle; -#endregion + #endregion -#region Public Methods + #region Public Methods public HTTPBase(RenderingEngine RenderingEngine) { try @@ -47,7 +43,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strHttpConnectionFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strHttpConnectionFailed + Constants.vbNewLine + ex.Message, true); } } @@ -96,7 +92,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strHttpSetPropsFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strHttpSetPropsFailed + Constants.vbNewLine + ex.Message, true); return false; } } @@ -162,16 +158,16 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strHttpConnectFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strHttpConnectFailed + Constants.vbNewLine + ex.Message, true); return false; } } -#endregion + #endregion -#region Private Methods -#endregion + #region Private Methods + #endregion -#region Events + #region Events private void wBrowser_Navigated(object sender, System.Windows.Forms.WebBrowserNavigatedEventArgs e) { WebBrowser objWebBrowser = wBrowser as WebBrowser; @@ -249,12 +245,12 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strHttpDocumentTileChangeFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strHttpDocumentTileChangeFailed + Constants.vbNewLine + ex.Message, true); } } -#endregion + #endregion -#region Enums + #region Enums public enum RenderingEngine { [LocalizedAttributes.LocalizedDescription("strHttpInternetExplorer")] @@ -282,6 +278,6 @@ namespace mRemoteNG.Connection.Protocol NWMF_INACTIVETAB = 0x100000 // ReSharper restore InconsistentNaming } -#endregion + #endregion } } diff --git a/mRemoteV1/CS/Connection/Connection.Protocol.ICA.cs b/mRemoteV1/CS/Connection/Connection.Protocol.ICA.cs index 76aac20a0..657c2c0c2 100644 --- a/mRemoteV1/CS/Connection/Connection.Protocol.ICA.cs +++ b/mRemoteV1/CS/Connection/Connection.Protocol.ICA.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,9 +8,7 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.Threading; using mRemoteNG.Tools; //using mRemoteNG.Tools.LocalizedAttributes; @@ -21,9 +18,7 @@ namespace mRemoteNG.Connection.Protocol { public class ICA : Base { - -#region Default Instance - + #region Default Instance private static ICA defaultInstance; ///

@@ -51,15 +46,14 @@ namespace mRemoteNG.Connection.Protocol { defaultInstance = null; } + #endregion -#endregion - -#region Private Properties + #region Private Properties private AxICAClient ICA_Renamed; private Connection.Info Info; -#endregion + #endregion -#region Public Methods + #region Public Methods public ICA() { try @@ -68,7 +62,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaControlFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaControlFailed + Constants.vbNewLine + ex.Message, true); } } @@ -130,7 +124,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetPropsFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetPropsFailed + Constants.vbNewLine + ex.Message, true); return false; } } @@ -147,13 +141,13 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaConnectionFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaConnectionFailed + Constants.vbNewLine + ex.Message); return false; } } -#endregion + #endregion -#region Private Methods + #region Private Methods private void SetCredentials() { try @@ -216,7 +210,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetCredentialsFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetCredentialsFailed + Constants.vbNewLine + ex.Message, true); } } @@ -253,7 +247,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetResolutionFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetResolutionFailed + Constants.vbNewLine + ex.Message, true); } } @@ -310,12 +304,12 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetEventHandlersFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetEventHandlersFailed + Constants.vbNewLine + ex.Message, true); } } -#endregion + #endregion -#region Private Events & Handlers + #region Private Events & Handlers private void ICAEvent_OnConnecting(object sender, System.EventArgs e) { base.Event_Connecting(this); @@ -350,9 +344,9 @@ namespace mRemoteNG.Connection.Protocol base.Close(); } } -#endregion + #endregion -#region Reconnect Stuff + #region Reconnect Stuff public void tmrReconnect_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { bool srvReady = Tools.PortScan.Scanner.IsPortOpen(Info.Hostname, System.Convert.ToString(Info.Port)); @@ -366,9 +360,9 @@ namespace mRemoteNG.Connection.Protocol ICA_Renamed.Default.Connect(); } } -#endregion + #endregion -#region Enums + #region Enums public enum Defaults { Port = 1494, @@ -388,6 +382,6 @@ namespace mRemoteNG.Connection.Protocol [LocalizedAttributes.LocalizedDescription("strEnc128Bit")] Encr128Bit = 128 } -#endregion + #endregion } } \ No newline at end of file diff --git a/mRemoteV1/CS/Connection/Connection.Protocol.IntegratedProgram.cs b/mRemoteV1/CS/Connection/Connection.Protocol.IntegratedProgram.cs index fe2b56137..bcff2b47a 100644 --- a/mRemoteV1/CS/Connection/Connection.Protocol.IntegratedProgram.cs +++ b/mRemoteV1/CS/Connection/Connection.Protocol.IntegratedProgram.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,167 +8,165 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - //using mRemoteNG.App.Native; using System.Threading; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using mRemoteNG.Tools; namespace mRemoteNG.Connection.Protocol { public class IntegratedProgram : Base + { + #region Public Methods + public override bool SetProps() + { + if (InterfaceControl.Info != null) { -#region Public Methods - public override bool SetProps() - { - if (InterfaceControl.Info != null) - { - _externalTool = GetExtAppByName(System.Convert.ToString(InterfaceControl.Info.ExtApp)); - _externalTool.ConnectionInfo = InterfaceControl.Info; - } - - return base.SetProps(); - } - - public override bool Connect() - { - try - { - if (_externalTool.TryIntegrate == false) - { - _externalTool.Start(InterfaceControl.Info); - Close(); - return null; - } - - _process = new Process(); - - _process.StartInfo.UseShellExecute = true; - _process.StartInfo.FileName = _externalTool.ParseArguments(_externalTool.FileName); - _process.StartInfo.Arguments = _externalTool.ParseArguments(_externalTool.Arguments); - - _process.EnableRaisingEvents = true; - _process.Exited += ProcessExited; - - _process.Start(); - _process.WaitForInputIdle(System.Convert.ToInt32(My.Settings.Default.MaxPuttyWaitTime * 1000)); - - int startTicks = Environment.TickCount; - while (_handle.ToInt32() == 0 & Environment.TickCount < startTicks + (My.Settings.Default.MaxPuttyWaitTime * 1000)) - { - _process.Refresh(); - if (!(_process.MainWindowTitle == "Default IME")) - { - _handle = _process.MainWindowHandle; - } - if (_handle.ToInt32() == 0) - { - Thread.Sleep(0); - } - } - - SetParent(_handle, InterfaceControl.Handle); - - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strIntAppStuff, true); - - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strIntAppHandle, _handle.ToString()), true); - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strIntAppTitle, _process.MainWindowTitle), true); - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strIntAppParentHandle, InterfaceControl.Parent.Handle.ToString()), true); - - Resize(this, new EventArgs()); - - base.Connect(); - return true; - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(My.Language.strIntAppConnectionFailed, ex); - return false; - } - } - - public override void Focus() - { - try - { - if (ConnectionWindow.InTabDrag) - { - return ; - } - SetForegroundWindow(_handle); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: My.Language.strIntAppFocusFailed, ex: ex, logOnly: true); - } - } - - public override void Resize(object sender, EventArgs e) - { - try - { - if (InterfaceControl.Size == Size.Empty) - { - return ; - } - MoveWindow(_handle, System.Convert.ToInt32(- SystemInformation.FrameBorderSize.Width), System.Convert.ToInt32(- (SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height)), InterfaceControl.Width + (SystemInformation.FrameBorderSize.Width * 2), InterfaceControl.Height + SystemInformation.CaptionHeight + (SystemInformation.FrameBorderSize.Height * 2), true); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: My.Language.strIntAppResizeFailed, ex: ex, logOnly: true); - } - } - - public override void Close() - { - try - { - if (!_process.HasExited) - { - _process.Kill(); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: My.Language.strIntAppKillFailed, ex: ex, logOnly: true); - } - - try - { - if (!_process.HasExited) - { - _process.Dispose(); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: My.Language.strIntAppDisposeFailed, ex: ex, logOnly: true); - } - - base.Close(); - } -#endregion - -#region Private Fields - private ExternalTool _externalTool; - private IntPtr _handle; - private Process _process; -#endregion - -#region Private Methods - private void ProcessExited(object sender, EventArgs e) - { - Event_Closed(this); - } -#endregion - -#region Enumerations - public enum Defaults - { - Port = 0 - } -#endregion + _externalTool = GetExtAppByName(System.Convert.ToString(InterfaceControl.Info.ExtApp)); + _externalTool.ConnectionInfo = InterfaceControl.Info; } + + return base.SetProps(); + } + + public override bool Connect() + { + try + { + if (_externalTool.TryIntegrate == false) + { + _externalTool.Start(InterfaceControl.Info); + Close(); + return null; + } + + _process = new Process(); + + _process.StartInfo.UseShellExecute = true; + _process.StartInfo.FileName = _externalTool.ParseArguments(_externalTool.FileName); + _process.StartInfo.Arguments = _externalTool.ParseArguments(_externalTool.Arguments); + + _process.EnableRaisingEvents = true; + _process.Exited += ProcessExited; + + _process.Start(); + _process.WaitForInputIdle(System.Convert.ToInt32(My.Settings.Default.MaxPuttyWaitTime * 1000)); + + int startTicks = Environment.TickCount; + while (_handle.ToInt32() == 0 & Environment.TickCount < startTicks + (My.Settings.Default.MaxPuttyWaitTime * 1000)) + { + _process.Refresh(); + if (!(_process.MainWindowTitle == "Default IME")) + { + _handle = _process.MainWindowHandle; + } + if (_handle.ToInt32() == 0) + { + Thread.Sleep(0); + } + } + + SetParent(_handle, InterfaceControl.Handle); + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strIntAppStuff, true); + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strIntAppHandle, _handle.ToString()), true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strIntAppTitle, _process.MainWindowTitle), true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, string.Format(My.Language.strIntAppParentHandle, InterfaceControl.Parent.Handle.ToString()), true); + + Resize(this, new EventArgs()); + + base.Connect(); + return true; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(My.Language.strIntAppConnectionFailed, ex); + return false; + } + } + + public override void Focus() + { + try + { + if (ConnectionWindow.InTabDrag) + { + return ; + } + SetForegroundWindow(_handle); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: My.Language.strIntAppFocusFailed, ex: ex, logOnly: true); + } + } + + public override void Resize(object sender, EventArgs e) + { + try + { + if (InterfaceControl.Size == Size.Empty) + { + return ; + } + MoveWindow(_handle, System.Convert.ToInt32(- SystemInformation.FrameBorderSize.Width), System.Convert.ToInt32(- (SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height)), InterfaceControl.Width + (SystemInformation.FrameBorderSize.Width * 2), InterfaceControl.Height + SystemInformation.CaptionHeight + (SystemInformation.FrameBorderSize.Height * 2), true); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: My.Language.strIntAppResizeFailed, ex: ex, logOnly: true); + } + } + + public override void Close() + { + try + { + if (!_process.HasExited) + { + _process.Kill(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: My.Language.strIntAppKillFailed, ex: ex, logOnly: true); + } + + try + { + if (!_process.HasExited) + { + _process.Dispose(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: My.Language.strIntAppDisposeFailed, ex: ex, logOnly: true); + } + + base.Close(); + } + #endregion + + #region Private Fields + private ExternalTool _externalTool; + private IntPtr _handle; + private Process _process; + #endregion + + #region Private Methods + private void ProcessExited(object sender, EventArgs e) + { + Event_Closed(this); + } + #endregion + + #region Enumerations + public enum Defaults + { + Port = 0 + } + #endregion + } } diff --git a/mRemoteV1/CS/Connection/Connection.Protocol.PuttyBase.cs b/mRemoteV1/CS/Connection/Connection.Protocol.PuttyBase.cs index fa84c69e4..4e99a8cbc 100644 --- a/mRemoteV1/CS/Connection/Connection.Protocol.PuttyBase.cs +++ b/mRemoteV1/CS/Connection/Connection.Protocol.PuttyBase.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,15 +8,13 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Runtime.InteropServices; using System.ComponentModel; using mRemoteNG.Messages; //using mRemoteNG.App.Native; using System.Threading; using Microsoft.Win32; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.Text.RegularExpressions; using mRemoteNG.Tools; @@ -25,19 +22,18 @@ using mRemoteNG.Tools; namespace mRemoteNG.Connection.Protocol { public class PuttyBase : Base - { - -#region Constants + { + #region Constants private const int IDM_RECONF = 0x50; // PuTTY Settings Menu ID -#endregion + #endregion -#region Private Properties + #region Private Properties bool _isPuttyNg; -#endregion + #endregion -#region Public Properties + #region Public Properties private Putty_Protocol _PuttyProtocol; -public Putty_Protocol PuttyProtocol + public Putty_Protocol PuttyProtocol { get { @@ -50,7 +46,7 @@ public Putty_Protocol PuttyProtocol } private Putty_SSHVersion _PuttySSHVersion; -public Putty_SSHVersion PuttySSHVersion + public Putty_SSHVersion PuttySSHVersion { get { @@ -63,7 +59,7 @@ public Putty_SSHVersion PuttySSHVersion } private IntPtr _PuttyHandle; -public IntPtr PuttyHandle + public IntPtr PuttyHandle { get { @@ -76,7 +72,7 @@ public IntPtr PuttyHandle } private Process _PuttyProcess; -public Process PuttyProcess + public Process PuttyProcess { get { @@ -89,7 +85,7 @@ public Process PuttyProcess } private static string _PuttyPath; -public static string PuttyPath + public static string PuttyPath { get { @@ -101,7 +97,7 @@ public static string PuttyPath } } -public bool Focused + public bool Focused { get { @@ -115,16 +111,16 @@ public bool Focused } } } -#endregion + #endregion -#region Private Events & Handlers + #region Private Events & Handlers private void ProcessExited(object sender, System.EventArgs e) { base.EVENT_CLOSED(this); } -#endregion + #endregion -#region Public Methods + #region Public Methods public PuttyBase() { @@ -237,11 +233,11 @@ public bool Focused SetParent(PuttyHandle, InterfaceControl.Handle); } - MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strPuttyStuff, true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strPuttyStuff, true); - MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strPuttyHandle, PuttyHandle.ToString()), true); - MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strPuttyTitle, PuttyProcess.MainWindowTitle), true); - MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strPuttyParentHandle, InterfaceControl.Parent.Handle.ToString()), true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strPuttyHandle, PuttyHandle.ToString()), true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strPuttyTitle, PuttyProcess.MainWindowTitle), true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strPuttyParentHandle, InterfaceControl.Parent.Handle.ToString()), true); Resize(this, new EventArgs()); @@ -250,7 +246,7 @@ public bool Focused } catch (Exception ex) { - MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strPuttyConnectionFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strPuttyConnectionFailed + Constants.vbNewLine + ex.Message); return false; } } @@ -267,7 +263,7 @@ public bool Focused } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyFocusFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyFocusFailed + Constants.vbNewLine + ex.Message, true); } } @@ -283,7 +279,7 @@ public bool Focused } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyResizeFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyResizeFailed + Constants.vbNewLine + ex.Message, true); } } @@ -298,7 +294,7 @@ public bool Focused } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyKillFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyKillFailed + Constants.vbNewLine + ex.Message, true); } try @@ -307,7 +303,7 @@ public bool Focused } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyDisposeFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyDisposeFailed + Constants.vbNewLine + ex.Message, true); } base.Close(); @@ -322,12 +318,12 @@ public bool Focused } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyShowSettingsDialogFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyShowSettingsDialogFailed + Constants.vbNewLine + ex.Message, true); } } -#endregion + #endregion -#region Enums + #region Enums public enum Putty_Protocol { ssh = 0, @@ -342,6 +338,6 @@ public bool Focused ssh1 = 1, ssh2 = 2 } -#endregion + #endregion } } diff --git a/mRemoteV1/CS/Connection/Connection.Protocol.RDP.cs b/mRemoteV1/CS/Connection/Connection.Protocol.RDP.cs index 40ef4079e..450574dd9 100644 --- a/mRemoteV1/CS/Connection/Connection.Protocol.RDP.cs +++ b/mRemoteV1/CS/Connection/Connection.Protocol.RDP.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,13 +8,11 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Threading; using EOLWTSCOM; using System.ComponentModel; using mRemoteNG.Messages; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; //using mRemoteNG.Tools.LocalizedAttributes; using MSTSCLib; using mRemoteNG.Tools; @@ -25,7 +22,7 @@ namespace mRemoteNG.Connection.Protocol { public class RDP : Base { -#region Properties + #region Properties public bool SmartSize { get @@ -75,20 +72,20 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectKeysFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectKeysFailed + Constants.vbNewLine + ex.Message, true); } } } -#endregion + #endregion -#region Private Declarations + #region Private Declarations private MSTSCLib.MsRdpClient5NotSafeForScripting _rdpClient; private Version _rdpVersion; private Info _connectionInfo; private bool _loginComplete; -#endregion + #endregion -#region Public Methods + #region Public Methods public RDP() { Control = new AxMsRdpClient5NotSafeForScripting(); @@ -115,7 +112,7 @@ namespace mRemoteNG.Connection.Protocol } catch (System.Runtime.InteropServices.COMException ex) { - MessageCollector.AddExceptionMessage(My.Language.strRdpControlCreationFailed, ex); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strRdpControlCreationFailed, ex); Control.Dispose(); return false; } @@ -164,7 +161,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPropsFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPropsFailed + Constants.vbNewLine + ex.Message, true); return false; } } @@ -182,7 +179,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpConnectionOpenFailed + Constants.vbNewLine + ex.Message); } return false; @@ -196,7 +193,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpDisconnectFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpDisconnectFailed + Constants.vbNewLine + ex.Message, true); base.Close(); } } @@ -209,7 +206,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpToggleFullscreenFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpToggleFullscreenFailed + Constants.vbNewLine + ex.Message, true); } } @@ -221,7 +218,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpToggleSmartSizeFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpToggleSmartSizeFailed + Constants.vbNewLine + ex.Message, true); } } @@ -236,7 +233,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpFocusFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpFocusFailed + Constants.vbNewLine + ex.Message, true); } } @@ -264,9 +261,9 @@ namespace mRemoteNG.Connection.Protocol } _controlBeginningSize = Size.Empty; } -#endregion + #endregion -#region Private Methods + #region Private Methods private bool DoResize() { Control.Location = InterfaceControl.Location; @@ -328,12 +325,12 @@ namespace mRemoteNG.Connection.Protocol { if (_rdpClient.TransportSettings.GatewayIsSupported == 0) { - MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayNotSupported, true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayNotSupported, true); return ; } else { - MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayIsSupported, true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayIsSupported, true); } if (!(_connectionInfo.RDGatewayUsageMethod == RDGatewayUsageMethod.Never)) @@ -369,7 +366,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strRdpSetGatewayFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strRdpSetGatewayFailed + Constants.vbNewLine + ex.Message, true); } } @@ -394,18 +391,18 @@ namespace mRemoteNG.Connection.Protocol if (_rdpVersion >= Versions.RDC61) { - MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strRdpSetConsoleSwitch, "6.1"), true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strRdpSetConsoleSwitch, "6.1"), true); _rdpClient.AdvancedSettings7.ConnectToAdministerServer = value; } else { - MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strRdpSetConsoleSwitch, "6.0"), true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(My.Language.strRdpSetConsoleSwitch, "6.0"), true); _rdpClient.AdvancedSettings2.ConnectToServerConsole = value; } } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strRdpSetConsoleSessionFailed, ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strRdpSetConsoleSessionFailed, ex, MessageClass.ErrorMsg, true); } } @@ -471,7 +468,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetCredentialsFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetCredentialsFailed + Constants.vbNewLine + ex.Message, true); } } @@ -508,7 +505,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetResolutionFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetResolutionFailed + Constants.vbNewLine + ex.Message, true); } } @@ -523,7 +520,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPortFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPortFailed + Constants.vbNewLine + ex.Message, true); } } @@ -539,7 +536,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectionFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectionFailed + Constants.vbNewLine + ex.Message, true); } } @@ -572,7 +569,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPerformanceFlagsFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPerformanceFlagsFailed + Constants.vbNewLine + ex.Message, true); } } @@ -584,7 +581,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetAuthenticationLevelFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetAuthenticationLevelFailed + Constants.vbNewLine + ex.Message, true); } } @@ -600,7 +597,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddExceptionMessage("Unable to set load balance info.", ex); + Runtime.MessageCollector.AddExceptionMessage("Unable to set load balance info.", ex); } } @@ -617,12 +614,12 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetEventHandlersFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetEventHandlersFailed + Constants.vbNewLine + ex.Message, true); } } -#endregion + #endregion -#region Private Events & Handlers + #region Private Events & Handlers private void RDPEvent_OnFatalError(int errorCode) { Event_ErrorOccured(this, System.Convert.ToString(errorCode)); @@ -674,9 +671,9 @@ namespace mRemoteNG.Connection.Protocol if (LeaveFullscreenEvent != null) LeaveFullscreenEvent(this, new EventArgs()); } -#endregion + #endregion -#region Public Events & Handlers + #region Public Events & Handlers public delegate void LeaveFullscreenEventHandler(Connection.Protocol.RDP sender, System.EventArgs e); private LeaveFullscreenEventHandler LeaveFullscreenEvent; @@ -691,10 +688,9 @@ namespace mRemoteNG.Connection.Protocol LeaveFullscreenEvent = (LeaveFullscreenEventHandler) System.Delegate.Remove(LeaveFullscreenEvent, value); } } + #endregion -#endregion - -#region Enums + #region Enums public enum Defaults { Colors = RDPColors.Colors16Bit, @@ -796,9 +792,9 @@ namespace mRemoteNG.Connection.Protocol [LocalizedAttributes.LocalizedDescription("strUseSmartCard")] SmartCard = 2 } -#endregion + #endregion -#region Resolution + #region Resolution public static Rectangle GetResolutionRectangle(RDPResolutions resolution) { string[] resolutionParts = null; @@ -815,7 +811,7 @@ namespace mRemoteNG.Connection.Protocol return new Rectangle(0, 0, (int) (resolutionParts[0]), (int) (resolutionParts[1])); } } -#endregion + #endregion public class Versions { @@ -825,7 +821,7 @@ namespace mRemoteNG.Connection.Protocol public static Version RDC80 = new Version(6, 2, 9200); } -#region Terminal Sessions + #region Terminal Sessions public class TerminalSessions { private WTSCOM _wtsCom; @@ -838,7 +834,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddExceptionMessage("TerminalSessions.New() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("TerminalSessions.New() failed.", ex, MessageClass.ErrorMsg, true); } } @@ -855,7 +851,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strRdpOpenConnectionFailed, ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strRdpOpenConnectionFailed, ex, MessageClass.ErrorMsg, true); } } @@ -872,7 +868,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strRdpCloseConnectionFailed, ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strRdpCloseConnectionFailed, ex, MessageClass.ErrorMsg, true); } } @@ -916,7 +912,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strRdpGetSessionsFailed, ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strRdpGetSessionsFailed, ex, MessageClass.ErrorMsg, true); } return sessions; @@ -937,7 +933,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddExceptionMessage("TerminalSessions.KillSession() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("TerminalSessions.KillSession() failed.", ex, MessageClass.ErrorMsg, true); } return result; @@ -978,7 +974,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddExceptionMessage(My.Language.strRdpAddSessionFailed, ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage(My.Language.strRdpAddSessionFailed, ex, MessageClass.ErrorMsg, true); } return newSession; @@ -998,9 +994,9 @@ namespace mRemoteNG.Connection.Protocol public string SessionUser {get; set;} public string SessionName {get; set;} } -#endregion + #endregion -#region Fatal Errors + #region Fatal Errors public class FatalErrors { public FatalErrors() @@ -1019,14 +1015,14 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpErrorGetFailure + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpErrorGetFailure + Constants.vbNewLine + ex.Message, true); return string.Format(My.Language.strRdpErrorUnknown, id); } } } -#endregion + #endregion -#region Reconnect Stuff + #region Reconnect Stuff public void tmrReconnect_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { bool srvReady = Tools.PortScan.Scanner.IsPortOpen(_connectionInfo.Hostname, System.Convert.ToString(_connectionInfo.Port)); @@ -1041,6 +1037,6 @@ namespace mRemoteNG.Connection.Protocol _rdpClient.Connect(); } } -#endregion + #endregion } } diff --git a/mRemoteV1/CS/Connection/Connection.Protocol.VNC.cs b/mRemoteV1/CS/Connection/Connection.Protocol.VNC.cs index 3f8391e8e..d87c8ab53 100644 --- a/mRemoteV1/CS/Connection/Connection.Protocol.VNC.cs +++ b/mRemoteV1/CS/Connection/Connection.Protocol.VNC.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,9 +8,7 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.ComponentModel; using mRemoteNG.Tools; //using mRemoteNG.Tools.LocalizedAttributes; @@ -21,8 +18,7 @@ namespace mRemoteNG.Connection.Protocol { public class VNC : Base { - -#region Properties + #region Properties public bool SmartSize { get { return VNC_Renamed.Scaled; } @@ -34,14 +30,14 @@ namespace mRemoteNG.Connection.Protocol get { return VNC_Renamed.ViewOnly; } set { VNC_Renamed.ViewOnly = value; } } -#endregion + #endregion -#region Private Declarations + #region Private Declarations private VncSharp.RemoteDesktop VNC_Renamed; private Connection.Info Info; -#endregion + #endregion -#region Public Methods + #region Public Methods public VNC() { this.Control = new VncSharp.RemoteDesktop(); @@ -126,7 +122,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncSetPropsFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncSetPropsFailed + Constants.vbNewLine + ex.Message, true); return false; } } @@ -141,7 +137,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncConnectionOpenFailed + Constants.vbNewLine + ex.Message); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncConnectionOpenFailed + Constants.vbNewLine + ex.Message); return false; } @@ -156,7 +152,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncConnectionDisconnectFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncConnectionDisconnectFailed + Constants.vbNewLine + ex.Message, true); } } @@ -176,7 +172,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncSendSpecialKeysFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncSendSpecialKeysFailed + Constants.vbNewLine + ex.Message, true); } } @@ -189,7 +185,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncToggleSmartSizeFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncToggleSmartSizeFailed + Constants.vbNewLine + ex.Message, true); } } @@ -201,7 +197,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncToggleViewOnlyFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncToggleViewOnlyFailed + Constants.vbNewLine + ex.Message, true); } } @@ -218,7 +214,7 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncStartChatFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncStartChatFailed + Constants.vbNewLine + ex.Message, true); } } @@ -246,130 +242,130 @@ namespace mRemoteNG.Connection.Protocol } catch (Exception ex) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncRefreshFailed + Constants.vbNewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncRefreshFailed + Constants.vbNewLine + ex.Message, true); } } -#endregion + #endregion -#region Private Methods - private void SetEventHandlers() + #region Private Methods + private void SetEventHandlers() + { + try + { + VNC_Renamed.ConnectComplete += VNCEvent_Connected; + VNC_Renamed.ConnectionLost += VNCEvent_Disconnected; + mRemoteNG.frmMain.clipboardchange += VNCEvent_ClipboardChanged; + if (!((Force & Info.Force.NoCredentials) == (int) Info.Force.NoCredentials) && !string.IsNullOrEmpty(Info.Password)) { - try - { - VNC_Renamed.ConnectComplete += VNCEvent_Connected; - VNC_Renamed.ConnectionLost += VNCEvent_Disconnected; - mRemoteNG.frmMain.clipboardchange += VNCEvent_ClipboardChanged; - if (!((Force & Info.Force.NoCredentials) == (int) Info.Force.NoCredentials) && !string.IsNullOrEmpty(Info.Password)) - { - VNC_Renamed.GetPassword = new System.EventHandler(VNCEvent_Authenticate); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncSetEventHandlersFailed + Constants.vbNewLine + ex.Message, true); - } + VNC_Renamed.GetPassword = new System.EventHandler(VNCEvent_Authenticate); } -#endregion - -#region Private Events & Handlers - private void VNCEvent_Connected(object sender, EventArgs e) - { - base.Event_Connected(this); - VNC_Renamed.AutoScroll = Info.VNCSmartSizeMode == SmartSizeMode.SmartSNo; - } - - private void VNCEvent_Disconnected(object sender, EventArgs e) - { - base.Event_Disconnected(sender, e.ToString()); - base.Close(); - } - - private void VNCEvent_ClipboardChanged() - { - this.VNC_Renamed.FillServerClipboard(); - } - - private string VNCEvent_Authenticate() - { - return Info.Password; - } -#endregion - -#region Enums - public enum Defaults - { - Port = 5900 - } - - public enum SpecialKeys - { - CtrlAltDel, - CtrlEsc - } - - public enum Compression - { - [LocalizedAttributes.LocalizedDescription("strNoCompression")]CompNone = 99, - [Description("0")]Comp0 = 0, - [Description("1")]Comp1 = 1, - [Description("2")]Comp2 = 2, - [Description("3")]Comp3 = 3, - [Description("4")]Comp4 = 4, - [Description("5")]Comp5 = 5, - [Description("6")]Comp6 = 6, - [Description("7")]Comp7 = 7, - [Description("8")]Comp8 = 8, - [Description("9")]Comp9 = 9 - } - - public enum Encoding - { - [Description("Raw")]EncRaw, - [Description("RRE")]EncRRE, - [Description("CoRRE")]EncCorre, - [Description("Hextile")]EncHextile, - [Description("Zlib")]EncZlib, - [Description("Tight")]EncTight, - [Description("ZlibHex")]EncZLibHex, - [Description("ZRLE")]EncZRLE - } - - public enum AuthMode - { - [LocalizedAttributes.LocalizedDescription("VNC")] - AuthVNC, - [LocalizedAttributes.LocalizedDescription("Windows")] - AuthWin - } - - public enum ProxyType - { - [LocalizedAttributes.LocalizedDescription("strNone")] - ProxyNone, - [LocalizedAttributes.LocalizedDescription("strHttp")] - ProxyHTTP, - [LocalizedAttributes.LocalizedDescription("strSocks5")] - ProxySocks5, - [LocalizedAttributes.LocalizedDescription("strUltraVncRepeater")] - ProxyUltra - } - - public enum Colors - { - [LocalizedAttributes.LocalizedDescription("strNormal")] - ColNormal, - [Description("8-bit")]Col8Bit - } - - public enum SmartSizeMode - { - [LocalizedAttributes.LocalizedDescription("strNoSmartSize")] - SmartSNo, - [LocalizedAttributes.LocalizedDescription("strFree")] - SmartSFree, - [LocalizedAttributes.LocalizedDescription("strAspect")] - SmartSAspect - } -#endregion } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strVncSetEventHandlersFailed + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Private Events & Handlers + private void VNCEvent_Connected(object sender, EventArgs e) + { + base.Event_Connected(this); + VNC_Renamed.AutoScroll = Info.VNCSmartSizeMode == SmartSizeMode.SmartSNo; + } + + private void VNCEvent_Disconnected(object sender, EventArgs e) + { + base.Event_Disconnected(sender, e.ToString()); + base.Close(); + } + + private void VNCEvent_ClipboardChanged() + { + this.VNC_Renamed.FillServerClipboard(); + } + + private string VNCEvent_Authenticate() + { + return Info.Password; + } + #endregion + + #region Enums + public enum Defaults + { + Port = 5900 + } + + public enum SpecialKeys + { + CtrlAltDel, + CtrlEsc + } + + public enum Compression + { + [LocalizedAttributes.LocalizedDescription("strNoCompression")]CompNone = 99, + [Description("0")]Comp0 = 0, + [Description("1")]Comp1 = 1, + [Description("2")]Comp2 = 2, + [Description("3")]Comp3 = 3, + [Description("4")]Comp4 = 4, + [Description("5")]Comp5 = 5, + [Description("6")]Comp6 = 6, + [Description("7")]Comp7 = 7, + [Description("8")]Comp8 = 8, + [Description("9")]Comp9 = 9 + } + + public enum Encoding + { + [Description("Raw")]EncRaw, + [Description("RRE")]EncRRE, + [Description("CoRRE")]EncCorre, + [Description("Hextile")]EncHextile, + [Description("Zlib")]EncZlib, + [Description("Tight")]EncTight, + [Description("ZlibHex")]EncZLibHex, + [Description("ZRLE")]EncZRLE + } + + public enum AuthMode + { + [LocalizedAttributes.LocalizedDescription("VNC")] + AuthVNC, + [LocalizedAttributes.LocalizedDescription("Windows")] + AuthWin + } + + public enum ProxyType + { + [LocalizedAttributes.LocalizedDescription("strNone")] + ProxyNone, + [LocalizedAttributes.LocalizedDescription("strHttp")] + ProxyHTTP, + [LocalizedAttributes.LocalizedDescription("strSocks5")] + ProxySocks5, + [LocalizedAttributes.LocalizedDescription("strUltraVncRepeater")] + ProxyUltra + } + + public enum Colors + { + [LocalizedAttributes.LocalizedDescription("strNormal")] + ColNormal, + [Description("8-bit")]Col8Bit + } + + public enum SmartSizeMode + { + [LocalizedAttributes.LocalizedDescription("strNoSmartSize")] + SmartSNo, + [LocalizedAttributes.LocalizedDescription("strFree")] + SmartSFree, + [LocalizedAttributes.LocalizedDescription("strAspect")] + SmartSAspect + } + #endregion + } } diff --git a/mRemoteV1/CS/Forms/OptionsForm.cs b/mRemoteV1/CS/Forms/OptionsForm.cs index d2db6cf25..2c77bd305 100644 --- a/mRemoteV1/CS/Forms/OptionsForm.cs +++ b/mRemoteV1/CS/Forms/OptionsForm.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,260 +8,258 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using mRemoteNG.Forms.OptionsPages; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using mRemoteNG.My; namespace mRemoteNG.Forms { public partial class OptionsForm + { + #region Constructors + public OptionsForm() { -#region Constructors - public OptionsForm() - { - // This call is required by the designer. - InitializeComponent(); - // Add any initialization after the InitializeComponent() call. + // This call is required by the designer. + InitializeComponent(); + // Add any initialization after the InitializeComponent() call. - FontOverride(this); + FontOverride(this); - _pages.Add(new Forms.OptionsPages.StartupExitPage(), new PageInfo()); - _pages.Add(new AppearancePage(), new PageInfo()); - _pages.Add(new TabsPanelsPage(), new PageInfo()); - _pages.Add(new ConnectionsPage(), new PageInfo()); - _pages.Add(new SqlServerPage(), new PageInfo()); - _pages.Add(new UpdatesPage(), new PageInfo()); - _pages.Add(new ThemePage(), new PageInfo()); - _pages.Add(new KeyboardPage(), new PageInfo()); - _pages.Add(new AdvancedPage(), new PageInfo()); + _pages.Add(new Forms.OptionsPages.StartupExitPage(), new PageInfo()); + _pages.Add(new AppearancePage(), new PageInfo()); + _pages.Add(new TabsPanelsPage(), new PageInfo()); + _pages.Add(new ConnectionsPage(), new PageInfo()); + _pages.Add(new SqlServerPage(), new PageInfo()); + _pages.Add(new UpdatesPage(), new PageInfo()); + _pages.Add(new ThemePage(), new PageInfo()); + _pages.Add(new KeyboardPage(), new PageInfo()); + _pages.Add(new AdvancedPage(), new PageInfo()); - _startPage = GetPageFromType(typeof(Forms.OptionsPages.StartupExitPage)); + _startPage = GetPageFromType(typeof(Forms.OptionsPages.StartupExitPage)); - _pageIconImageList.ColorDepth = ColorDepth.Depth32Bit; - PageListView.LargeImageList = _pageIconImageList; - } -#endregion - -#region Public Methods - public DialogResult ShowDialog(IWin32Window ownerWindow, Type pageType) - { - _startPage = GetPageFromType(pageType); - return ShowDialog(ownerWindow); - } -#endregion - -#region Private Fields - private Dictionary _pages = new Dictionary(); - private ImageList _pageIconImageList = new ImageList(); - - private OptionsPage _startPage; - private OptionsPage _selectedPage = null; -#endregion - -#region Private Methods -#region Event Handlers - public void OptionsForm_Load(System.Object sender, EventArgs e) - { - foreach (KeyValuePair keyValuePair in _pages) - { - OptionsPage page = KeyValuePair.Key; - PageInfo pageInfo = KeyValuePair.Value; - _pageIconImageList.Images.Add(pageInfo.IconKey, page.PageIcon); - pageInfo.ListViewItem = PageListView.Items.Add(page.PageName, pageInfo.IconKey); - } - - ApplyLanguage(); - LoadSettings(); - - ShowPage(_startPage); - } - - public void OptionsForm_FormClosing(System.Object sender, FormClosingEventArgs e) - { - if (DialogResult == DialogResult.OK) - { - SaveSettings(); - } - else - { - RevertSettings(); - } - } - - public void PageListView_ItemSelectionChanged(System.Object sender, ListViewItemSelectionChangedEventArgs e) - { - if (!e.IsSelected) - { - return ; - } - if (_pages.Count < 1) - { - return ; - } - OptionsPage page = GetPageFromListViewItem(e.Item); - if (_selectedPage != page) - { - ShowPage(page); - } - SelectNextControl(PageListView, true, true, true, true); - } - - public void PageListView_MouseUp(System.Object sender, MouseEventArgs e) - { - if (PageListView.SelectedIndices.Count == 0) - { - PageInfo pageInfo = _pages[_selectedPage]; - pageInfo.ListViewItem.Selected = true; - } - SelectNextControl(PageListView, true, true, true, true); - } - - public void OkButton_Click(System.Object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - Close(); - } - - public void CancelButtonControl_Click(System.Object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } -#endregion - - private void ApplyLanguage() - { - Text = Language.strMenuOptions; - OkButton.Text = Language.strButtonOK; - CancelButtonControl.Text = Language.strButtonCancel; - - foreach (OptionsPage page in _pages.Keys) - { - try - { - page.ApplyLanguage(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.ApplyLanguage() failed for page {0}.", page.PageName), ex: ex, logOnly: true); - } - } - } - - private void LoadSettings() - { - foreach (OptionsPage page in _pages.Keys) - { - try - { - page.LoadSettings(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.LoadSettings() failed for page {0}.", page.PageName), ex: ex, logOnly: true); - } - } - } - - private void SaveSettings() - { - foreach (OptionsPage page in _pages.Keys) - { - try - { - page.SaveSettings(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.SaveSettings() failed for page {0}.", page.PageName), ex: ex, logOnly: true); - } - } - } - - private void RevertSettings() - { - foreach (OptionsPage page in _pages.Keys) - { - try - { - page.RevertSettings(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.RevertSettings() failed for page {0}.", page.PageName), ex: ex, logOnly: true); - } - } - } - - private OptionsPage GetPageFromType(Type pageType) - { - foreach (OptionsPage page in _pages.Keys) - { - if (page.GetType() == pageType) - { - return page; - } - } - return null; - } - - private OptionsPage GetPageFromListViewItem(ListViewItem listViewItem) - { - foreach (KeyValuePair keyValuePair in _pages) - { - OptionsPage page = KeyValuePair.Key; - PageInfo pageInfo = KeyValuePair.Value; - if (pageInfo.ListViewItem == listViewItem) - { - return page; - } - } - return null; - } - - private void ShowPage(OptionsPage newPage) - { - if (_selectedPage != null) - { - OptionsPage oldPage = _selectedPage; - oldPage.Visible = false; - if (_pages.ContainsKey(oldPage)) - { - PageInfo oldPageInfo = _pages[oldPage]; - oldPageInfo.ListViewItem.Selected = false; - } - } - - _selectedPage = newPage; - - if (newPage != null) - { - newPage.Parent = PagePanel; - newPage.Dock = DockStyle.Fill; - newPage.Visible = true; - if (_pages.ContainsKey(newPage)) - { - PageInfo newPageInfo = _pages[newPage]; - newPageInfo.ListViewItem.Selected = true; - } - } - } -#endregion - -#region Private Classes - private class PageInfo - { - public string IconKey {get; set;} - public ListViewItem ListViewItem {get; set;} - - public PageInfo() - { - IconKey = Guid.NewGuid().ToString(); - } - } -#endregion + _pageIconImageList.ColorDepth = ColorDepth.Depth32Bit; + PageListView.LargeImageList = _pageIconImageList; } + #endregion + + #region Public Methods + public DialogResult ShowDialog(IWin32Window ownerWindow, Type pageType) + { + _startPage = GetPageFromType(pageType); + return ShowDialog(ownerWindow); + } + #endregion + + #region Private Fields + private Dictionary _pages = new Dictionary(); + private ImageList _pageIconImageList = new ImageList(); + + private OptionsPage _startPage; + private OptionsPage _selectedPage = null; + #endregion + + #region Private Methods + #region Event Handlers + public void OptionsForm_Load(System.Object sender, EventArgs e) + { + foreach (KeyValuePair keyValuePair in _pages) + { + OptionsPage page = KeyValuePair.Key; + PageInfo pageInfo = KeyValuePair.Value; + _pageIconImageList.Images.Add(pageInfo.IconKey, page.PageIcon); + pageInfo.ListViewItem = PageListView.Items.Add(page.PageName, pageInfo.IconKey); + } + + ApplyLanguage(); + LoadSettings(); + + ShowPage(_startPage); + } + + public void OptionsForm_FormClosing(System.Object sender, FormClosingEventArgs e) + { + if (DialogResult == DialogResult.OK) + { + SaveSettings(); + } + else + { + RevertSettings(); + } + } + + public void PageListView_ItemSelectionChanged(System.Object sender, ListViewItemSelectionChangedEventArgs e) + { + if (!e.IsSelected) + { + return ; + } + if (_pages.Count < 1) + { + return ; + } + OptionsPage page = GetPageFromListViewItem(e.Item); + if (_selectedPage != page) + { + ShowPage(page); + } + SelectNextControl(PageListView, true, true, true, true); + } + + public void PageListView_MouseUp(System.Object sender, MouseEventArgs e) + { + if (PageListView.SelectedIndices.Count == 0) + { + PageInfo pageInfo = _pages[_selectedPage]; + pageInfo.ListViewItem.Selected = true; + } + SelectNextControl(PageListView, true, true, true, true); + } + + public void OkButton_Click(System.Object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + public void CancelButtonControl_Click(System.Object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + #endregion + + private void ApplyLanguage() + { + Text = Language.strMenuOptions; + OkButton.Text = Language.strButtonOK; + CancelButtonControl.Text = Language.strButtonCancel; + + foreach (OptionsPage page in _pages.Keys) + { + try + { + page.ApplyLanguage(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.ApplyLanguage() failed for page {0}.", page.PageName), ex: ex, logOnly: true); + } + } + } + + private void LoadSettings() + { + foreach (OptionsPage page in _pages.Keys) + { + try + { + page.LoadSettings(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.LoadSettings() failed for page {0}.", page.PageName), ex: ex, logOnly: true); + } + } + } + + private void SaveSettings() + { + foreach (OptionsPage page in _pages.Keys) + { + try + { + page.SaveSettings(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.SaveSettings() failed for page {0}.", page.PageName), ex: ex, logOnly: true); + } + } + } + + private void RevertSettings() + { + foreach (OptionsPage page in _pages.Keys) + { + try + { + page.RevertSettings(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: string.Format("OptionsPage.RevertSettings() failed for page {0}.", page.PageName), ex: ex, logOnly: true); + } + } + } + + private OptionsPage GetPageFromType(Type pageType) + { + foreach (OptionsPage page in _pages.Keys) + { + if (page.GetType() == pageType) + { + return page; + } + } + return null; + } + + private OptionsPage GetPageFromListViewItem(ListViewItem listViewItem) + { + foreach (KeyValuePair keyValuePair in _pages) + { + OptionsPage page = KeyValuePair.Key; + PageInfo pageInfo = KeyValuePair.Value; + if (pageInfo.ListViewItem == listViewItem) + { + return page; + } + } + return null; + } + + private void ShowPage(OptionsPage newPage) + { + if (_selectedPage != null) + { + OptionsPage oldPage = _selectedPage; + oldPage.Visible = false; + if (_pages.ContainsKey(oldPage)) + { + PageInfo oldPageInfo = _pages[oldPage]; + oldPageInfo.ListViewItem.Selected = false; + } + } + + _selectedPage = newPage; + + if (newPage != null) + { + newPage.Parent = PagePanel; + newPage.Dock = DockStyle.Fill; + newPage.Visible = true; + if (_pages.ContainsKey(newPage)) + { + PageInfo newPageInfo = _pages[newPage]; + newPageInfo.ListViewItem.Selected = true; + } + } + } + #endregion + + #region Private Classes + private class PageInfo + { + public string IconKey {get; set;} + public ListViewItem ListViewItem {get; set;} + + public PageInfo() + { + IconKey = Guid.NewGuid().ToString(); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/Forms/frmMain.cs b/mRemoteV1/CS/Forms/frmMain.cs index 78fbb7233..e1fe88857 100644 --- a/mRemoteV1/CS/Forms/frmMain.cs +++ b/mRemoteV1/CS/Forms/frmMain.cs @@ -968,7 +968,7 @@ namespace mRemoteNG } catch (Exception ex) { - MessageCollector.AddExceptionMessage("btnQuickConnect_ButtonClick() failed.", ex, Messages.MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("btnQuickConnect_ButtonClick() failed.", ex, Messages.MessageClass.ErrorMsg, true); } } @@ -1080,7 +1080,7 @@ namespace mRemoteNG } catch (Exception ex) { - MessageCollector.AddExceptionMessage("frmMain.AddNodeToMenu() failed", ex, Messages.MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("frmMain.AddNodeToMenu() failed", ex, Messages.MessageClass.ErrorMsg, true); } } diff --git a/mRemoteV1/CS/Security/Security.Crypt.cs b/mRemoteV1/CS/Security/Security.Crypt.cs index 8ad2c6473..9439ce524 100644 --- a/mRemoteV1/CS/Security/Security.Crypt.cs +++ b/mRemoteV1/CS/Security/Security.Crypt.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,117 +8,115 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.IO; using System.Security.Cryptography; using System.Text; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.Security { public class Crypt + { + public static string Encrypt(string StrToEncrypt, string StrSecret) { - public static string Encrypt(string StrToEncrypt, string StrSecret) + if (StrToEncrypt == "" || StrSecret == "") { - if (StrToEncrypt == "" || StrSecret == "") - { - return StrToEncrypt; - } - - try - { - RijndaelManaged rd = new RijndaelManaged(); - - MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); - byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(StrSecret)); - - md5.Clear(); - rd.Key = key; - rd.GenerateIV(); - - byte[] iv = rd.IV; - MemoryStream ms = new MemoryStream(); - - ms.Write(iv, 0, iv.Length); - - CryptoStream cs = new CryptoStream(ms, rd.CreateEncryptor(), CryptoStreamMode.Write); - byte[] data = System.Text.Encoding.UTF8.GetBytes(StrToEncrypt); - - cs.Write(data, 0, data.Length); - cs.FlushFinalBlock(); - - byte[] encdata = ms.ToArray(); - cs.Close(); - rd.Clear(); - - return Convert.ToBase64String(encdata); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strErrorEncryptionFailed, ex.Message)); - } - return StrToEncrypt; } - - public static string Decrypt(string ciphertextBase64, string password) + + try { - if (string.IsNullOrEmpty(ciphertextBase64) || string.IsNullOrEmpty(password)) - { - return ciphertextBase64; - } - - try - { - string plaintext = ""; - - using (RijndaelManaged rijndaelManaged = new RijndaelManaged()) - { - using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()) - { - byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); - rijndaelManaged.Key = key; - } - - - byte[] ciphertext = Convert.FromBase64String(ciphertextBase64); - - using (MemoryStream memoryStream = new MemoryStream(ciphertext)) - { - const int ivLength = 16; - byte[] iv = new byte[ivLength - 1 + 1]; - memoryStream.Read(iv, 0, ivLength); - rijndaelManaged.IV = iv; - - using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Read)) - { - using (StreamReader streamReader = new StreamReader(cryptoStream, System.Text.Encoding.UTF8, true)) - { - plaintext = streamReader.ReadToEnd(); - } - - rijndaelManaged.Clear(); - } // cryptoStream - - } // memoryStream - - } // rijndaelManaged - - - return plaintext; - } - catch (Exception ex) - { - // Ignore CryptographicException "Padding is invalid and cannot be removed." when password is incorrect. - if (!(ex is CryptographicException)) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strErrorDecryptionFailed, ex.Message)); - } - } + RijndaelManaged rd = new RijndaelManaged(); + + MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); + byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(StrSecret)); + + md5.Clear(); + rd.Key = key; + rd.GenerateIV(); + + byte[] iv = rd.IV; + MemoryStream ms = new MemoryStream(); + + ms.Write(iv, 0, iv.Length); + + CryptoStream cs = new CryptoStream(ms, rd.CreateEncryptor(), CryptoStreamMode.Write); + byte[] data = System.Text.Encoding.UTF8.GetBytes(StrToEncrypt); + + cs.Write(data, 0, data.Length); + cs.FlushFinalBlock(); + + byte[] encdata = ms.ToArray(); + cs.Close(); + rd.Clear(); + + return Convert.ToBase64String(encdata); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strErrorEncryptionFailed, ex.Message)); + } + return StrToEncrypt; + } + + public static string Decrypt(string ciphertextBase64, string password) + { + if (string.IsNullOrEmpty(ciphertextBase64) || string.IsNullOrEmpty(password)) + { return ciphertextBase64; } + + try + { + string plaintext = ""; + + using (RijndaelManaged rijndaelManaged = new RijndaelManaged()) + { + using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()) + { + byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); + rijndaelManaged.Key = key; + } + + + byte[] ciphertext = Convert.FromBase64String(ciphertextBase64); + + using (MemoryStream memoryStream = new MemoryStream(ciphertext)) + { + const int ivLength = 16; + byte[] iv = new byte[ivLength - 1 + 1]; + memoryStream.Read(iv, 0, ivLength); + rijndaelManaged.IV = iv; + + using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Read)) + { + using (StreamReader streamReader = new StreamReader(cryptoStream, System.Text.Encoding.UTF8, true)) + { + plaintext = streamReader.ReadToEnd(); + } + + rijndaelManaged.Clear(); + } // cryptoStream + + } // memoryStream + + } // rijndaelManaged + + + return plaintext; + } + catch (Exception ex) + { + // Ignore CryptographicException "Padding is invalid and cannot be removed." when password is incorrect. + if (!(ex is CryptographicException)) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(My.Language.strErrorDecryptionFailed, ex.Message)); + } + } + + return ciphertextBase64; } + } } diff --git a/mRemoteV1/CS/Security/Security.Impersonator.cs b/mRemoteV1/CS/Security/Security.Impersonator.cs index d520f3004..bf14362ed 100644 --- a/mRemoteV1/CS/Security/Security.Impersonator.cs +++ b/mRemoteV1/CS/Security/Security.Impersonator.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,12 +8,10 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Runtime.InteropServices; using System.Security.Principal; using System.Security.Permissions; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; [assembly:SecurityPermissionAttribute(SecurityAction.RequestMinimum,UnmanagedCode=true)] @@ -23,102 +20,102 @@ using System.Security.Permissions; namespace mRemoteNG.Security { public class Impersonator + { + #region Logon API + private const int LOGON32_PROVIDER_DEFAULT = 0; + private const int LOGON32_LOGON_NEW_CREDENTIALS = 9; + + private const int SecurityImpersonation = 2; + + [DllImport("advapi32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] + private static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); + + private const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x100; + private const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200; + private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000; + + [DllImport("kernel32.dll")]private static extern int FormatMessage(int dwFlags, ref IntPtr lpSource, int dwMessageId, int dwLanguageId, ref string lpBuffer, int nSize, ref IntPtr Arguments); + + [DllImport("kernel32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] + private static extern bool CloseHandle(IntPtr handle); + + [DllImport("advapi32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] + private static extern int DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle); + #endregion + + private IntPtr tokenHandle = new IntPtr(0); + private WindowsImpersonationContext impersonatedUser = null; + + // GetErrorMessage formats and returns an error message corresponding to the input errorCode. + private string GetErrorMessage(int errorCode) { -#region Logon API - private const int LOGON32_PROVIDER_DEFAULT = 0; - private const int LOGON32_LOGON_NEW_CREDENTIALS = 9; + int messageSize = 255; + string lpMsgBuf = ""; + int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; + + IntPtr ptrlpSource = IntPtr.Zero; + IntPtr prtArguments = IntPtr.Zero; + + int retVal = FormatMessage(dwFlags, ref ptrlpSource, errorCode, 0, ref lpMsgBuf, messageSize, ref prtArguments); + return lpMsgBuf.Trim(new char[] {char.Parse(Constants.vbCr), char.Parse(Constants.vbLf)}); + } - private const int SecurityImpersonation = 2; - - [DllImport("advapi32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] - private static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); - - private const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x100; - private const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200; - private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000; - - [DllImport("kernel32.dll")]private static extern int FormatMessage(int dwFlags, ref IntPtr lpSource, int dwMessageId, int dwLanguageId, ref string lpBuffer, int nSize, ref IntPtr Arguments); - - [DllImport("kernel32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] - private static extern bool CloseHandle(IntPtr handle); - - [DllImport("advapi32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] - private static extern int DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle); -#endregion - - private IntPtr tokenHandle = new IntPtr(0); - private WindowsImpersonationContext impersonatedUser = null; - - // GetErrorMessage formats and returns an error message corresponding to the input errorCode. - private string GetErrorMessage(int errorCode) + [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]public void StartImpersonation(string DomainName, string UserName, string Password) + { + try { - int messageSize = 255; - string lpMsgBuf = ""; - int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; - - IntPtr ptrlpSource = IntPtr.Zero; - IntPtr prtArguments = IntPtr.Zero; - - int retVal = FormatMessage(dwFlags, ref ptrlpSource, errorCode, 0, ref lpMsgBuf, messageSize, ref prtArguments); - return lpMsgBuf.Trim(new char[] {char.Parse(Constants.vbCr), char.Parse(Constants.vbLf)}); + if (!(impersonatedUser == null)) + { + throw (new Exception("Already impersonating a user.")); + } + + tokenHandle = IntPtr.Zero; + + int returnValue = System.Convert.ToInt32(LogonUser(UserName, DomainName, Password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref tokenHandle)); + + if (0 == returnValue) + { + int errCode = Marshal.GetLastWin32Error(); + string errMsg = "LogonUser failed with error code: " + errCode.ToString() + "(" + GetErrorMessage(errCode) + ")"; + ApplicationException exLogon = new ApplicationException(errMsg); + throw (exLogon); + } + + WindowsIdentity newId = new WindowsIdentity(tokenHandle); + impersonatedUser = newId.Impersonate(); } - - [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]public void StartImpersonation(string DomainName, string UserName, string Password) + catch (Exception ex) { - try - { - if (!(impersonatedUser == null)) - { - throw (new Exception("Already impersonating a user.")); - } - - tokenHandle = IntPtr.Zero; - - int returnValue = System.Convert.ToInt32(LogonUser(UserName, DomainName, Password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref tokenHandle)); - - if (0 == returnValue) - { - int errCode = Marshal.GetLastWin32Error(); - string errMsg = "LogonUser failed with error code: " + errCode.ToString() + "(" + GetErrorMessage(errCode) + ")"; - ApplicationException exLogon = new ApplicationException(errMsg); - throw (exLogon); - } - - WindowsIdentity newId = new WindowsIdentity(tokenHandle); - impersonatedUser = newId.Impersonate(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Starting Impersonation failed (Sessions feature will not work)" + Constants.vbNewLine + ex.Message, true); - } - } - - [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]public void StopImpersonation() - { - if (impersonatedUser == null) - { - return; - } - - try - { - impersonatedUser.Undo(); // Stop impersonating the user. - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Stopping Impersonation failed" + Constants.vbNewLine + ex.Message, true); - throw; - } - finally - { - - if (!System.IntPtr.op_Equality(tokenHandle, IntPtr.Zero)) - { - CloseHandle(tokenHandle); - } - - impersonatedUser = null; - } + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Starting Impersonation failed (Sessions feature will not work)" + Constants.vbNewLine + ex.Message, true); } } + + [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]public void StopImpersonation() + { + if (impersonatedUser == null) + { + return; + } + + try + { + impersonatedUser.Undo(); // Stop impersonating the user. + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Stopping Impersonation failed" + Constants.vbNewLine + ex.Message, true); + throw; + } + finally + { + + if (!System.IntPtr.op_Equality(tokenHandle, IntPtr.Zero)) + { + CloseHandle(tokenHandle); + } + + impersonatedUser = null; + } + } + } } diff --git a/mRemoteV1/CS/Tools/ExternalTool.cs b/mRemoteV1/CS/Tools/ExternalTool.cs index 524ce7b10..6a7dd0ea2 100644 --- a/mRemoteV1/CS/Tools/ExternalTool.cs +++ b/mRemoteV1/CS/Tools/ExternalTool.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,9 +8,7 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.IO; using System.ComponentModel; @@ -20,7 +17,7 @@ namespace mRemoteNG.Tools { public class ExternalTool { -#region Public Properties + #region Public Properties public string DisplayName {get; set;} public string FileName {get; set;} public bool WaitForExit {get; set;} @@ -57,18 +54,18 @@ namespace mRemoteNG.Tools } } } -#endregion + #endregion -#region Constructors + #region Constructors public ExternalTool(string displayName = "", string fileName = "", string arguments = "") { this.DisplayName = displayName; this.FileName = fileName; this.Arguments = arguments; } -#endregion + #endregion -#region Public Methods + #region Public Methods // Start external app public void Start(Connection.Info startConnectionInfo = null) { @@ -101,7 +98,7 @@ namespace mRemoteNG.Tools } catch (Exception ex) { - MessageCollector.AddExceptionMessage("ExternalApp.Start() failed.", ex); + Runtime.MessageCollector.AddExceptionMessage("ExternalApp.Start() failed.", ex); } } @@ -129,7 +126,7 @@ namespace mRemoteNG.Tools } catch (Exception ex) { - MessageCollector.AddExceptionMessage(message: "ExternalApp.StartIntegrated() failed.", ex: ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage(message: "ExternalApp.StartIntegrated() failed.", ex: ex, logOnly: true); } } @@ -319,9 +316,9 @@ namespace mRemoteNG.Tools return result; } -#endregion + #endregion -#region Private Methods + #region Private Methods private string GetVariableReplacement(string variable, string original) { string replacement = ""; @@ -424,43 +421,43 @@ namespace mRemoteNG.Tools } return replacement; } -#endregion + #endregion } public class ExternalToolsTypeConverter : StringConverter + { + + public static string[] ExternalTools { - - public static string[] ExternalTools + get { - get + List externalToolList = new List(); + + // Add a blank entry to signify that no external tool is selected + externalToolList.Add(string.Empty); + + foreach (ExternalTool externalTool in App.Runtime.ExternalTools) { - List externalToolList = new List(); - - // Add a blank entry to signify that no external tool is selected - externalToolList.Add(string.Empty); - - foreach (ExternalTool externalTool in App.Runtime.ExternalTools) - { - externalToolList.Add(externalTool.DisplayName); - } - - return externalToolList.ToArray(); + externalToolList.Add(externalTool.DisplayName); } - } - - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) - { - return new StandardValuesCollection(ExternalTools); - } - - public override bool GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) - { - return true; - } - - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) - { - return true; + + return externalToolList.ToArray(); } } + + public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) + { + return new StandardValuesCollection(ExternalTools); + } + + public override bool GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) + { + return true; + } + + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + { + return true; + } + } } diff --git a/mRemoteV1/CS/Tools/IeBrowserEmulation.cs b/mRemoteV1/CS/Tools/IeBrowserEmulation.cs index 29dcb8b5e..63e28fe41 100644 --- a/mRemoteV1/CS/Tools/IeBrowserEmulation.cs +++ b/mRemoteV1/CS/Tools/IeBrowserEmulation.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,68 +8,66 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.IO; using Microsoft.Win32; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.Tools { public class IeBrowserEmulation + { + private const string BrowserEmulationKey = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION"; + private static int _previousIeBrowserEmulationValue = 0; + public static void Register() { - private const string BrowserEmulationKey = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION"; - private static int _previousIeBrowserEmulationValue = 0; - public static void Register() + try { - try + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); + if (registryKey == null) { - RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); - if (registryKey == null) - { - Registry.CurrentUser.CreateSubKey(BrowserEmulationKey); - registryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); - if (registryKey == null) - { - return ; - } - } - string exeName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); - _previousIeBrowserEmulationValue = System.Convert.ToInt32(registryKey.GetValue(exeName, 0)); - registryKey.SetValue(exeName, 11000, RegistryValueKind.DWord); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "IeBrowserEmulation.Register() failed.", ex: ex, logOnly: true); - } - } - - public static void Unregister() - { -#if PORTABLE - try - { - RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); + Registry.CurrentUser.CreateSubKey(BrowserEmulationKey); + registryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); if (registryKey == null) { return ; } - string exeName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); - if (_previousIeBrowserEmulationValue == 0) - { - registryKey.DeleteValue(exeName); - } - else - { - registryKey.SetValue(exeName, _previousIeBrowserEmulationValue, RegistryValueKind.DWord); - } } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "IeBrowserEmulation.Unregister() failed.", ex: ex, logOnly: true); - } -#endif + string exeName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); + _previousIeBrowserEmulationValue = System.Convert.ToInt32(registryKey.GetValue(exeName, 0)); + registryKey.SetValue(exeName, 11000, RegistryValueKind.DWord); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "IeBrowserEmulation.Register() failed.", ex: ex, logOnly: true); } } + + public static void Unregister() + { + #if PORTABLE + try + { + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true); + if (registryKey == null) + { + return ; + } + string exeName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); + if (_previousIeBrowserEmulationValue == 0) + { + registryKey.DeleteValue(exeName); + } + else + { + registryKey.SetValue(exeName, _previousIeBrowserEmulationValue, RegistryValueKind.DWord); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "IeBrowserEmulation.Unregister() failed.", ex: ex, logOnly: true); + } + #endif + } + } } diff --git a/mRemoteV1/CS/Tools/Tools.Controls.cs b/mRemoteV1/CS/Tools/Tools.Controls.cs index 481f99917..6ee791ade 100644 --- a/mRemoteV1/CS/Tools/Tools.Controls.cs +++ b/mRemoteV1/CS/Tools/Tools.Controls.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,306 +8,304 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.Tools { public class Controls + { + public class ComboBoxItem { - public class ComboBoxItem + private string _Text; + public string Text { - private string _Text; -public string Text - { - get - { - return this._Text; - } - set - { - this._Text = value; - } - } - - private object _Tag; -public object Tag - { - get - { - return this._Tag; - } - set - { - this._Tag = value; - } - } - - public ComboBoxItem(string Text, object Tag = null) - { - this._Text = Text; - if (Tag != null) - { - this._Tag = Tag; - } - } - - public override string ToString() + get { return this._Text; } + set + { + this._Text = value; + } } - - - public class NotificationAreaIcon + + private object _Tag; + public object Tag { - private NotifyIcon _nI; - - private ContextMenuStrip _cMen; - private ToolStripMenuItem _cMenCons; - private ToolStripSeparator _cMenSep1; - private ToolStripMenuItem _cMenExit; - - private bool _Disposed; -public bool Disposed + get { - get + return this._Tag; + } + set + { + this._Tag = value; + } + } + + public ComboBoxItem(string Text, object Tag = null) + { + this._Text = Text; + if (Tag != null) + { + this._Tag = Tag; + } + } + + public override string ToString() + { + return this._Text; + } + } + + + public class NotificationAreaIcon + { + private NotifyIcon _nI; + + private ContextMenuStrip _cMen; + private ToolStripMenuItem _cMenCons; + private ToolStripSeparator _cMenSep1; + private ToolStripMenuItem _cMenExit; + + private bool _Disposed; + public bool Disposed + { + get + { + return _Disposed; + } + set + { + _Disposed = value; + } + } + + + //Public Event MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) + //Public Event MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) + + + public NotificationAreaIcon() + { + try + { + this._cMenCons = new ToolStripMenuItem(); + this._cMenCons.Text = My.Language.strConnections; + this._cMenCons.Image = global::My.Resources.Root; + + this._cMenSep1 = new ToolStripSeparator(); + + this._cMenExit = new ToolStripMenuItem(); + this._cMenExit.Text = My.Language.strMenuExit; + this._cMenExit.Click += cMenExit_Click; + + this._cMen = new ContextMenuStrip(); + this._cMen.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this._cMen.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this._cMen.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this._cMenCons, this._cMenSep1, this._cMenExit}); + + this._nI = new NotifyIcon(); + this._nI.Text = "mRemote"; + this._nI.BalloonTipText = "mRemote"; + this._nI.Icon = global::My.Resources.mRemote_Icon; + this._nI.ContextMenuStrip = this._cMen; + this._nI.Visible = true; + + this._nI.MouseClick += nI_MouseClick; + this._nI.MouseDoubleClick += nI_MouseDoubleClick; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Creating new SysTrayIcon failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public void Dispose() + { + try + { + this._nI.Visible = false; + this._nI.Dispose(); + this._cMen.Dispose(); + this._Disposed = true; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Disposing SysTrayIcon failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void nI_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + this._cMenCons.DropDownItems.Clear(); + + foreach (TreeNode tNode in App.Runtime.Windows.treeForm.tvConnections.Nodes) { - return _Disposed; - } - set - { - _Disposed = value; + AddNodeToMenu(tNode.Nodes, this._cMenCons); } } + } - - //Public Event MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) - //Public Event MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) - - - public NotificationAreaIcon() + private void AddNodeToMenu(TreeNodeCollection tnc, ToolStripMenuItem menToolStrip) + { + try { - try + foreach (TreeNode tNode in tnc) { - this._cMenCons = new ToolStripMenuItem(); - this._cMenCons.Text = My.Language.strConnections; - this._cMenCons.Image = global::My.Resources.Root; - - this._cMenSep1 = new ToolStripSeparator(); - - this._cMenExit = new ToolStripMenuItem(); - this._cMenExit.Text = My.Language.strMenuExit; - this._cMenExit.Click += cMenExit_Click; - - this._cMen = new ContextMenuStrip(); - this._cMen.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this._cMen.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this._cMen.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this._cMenCons, this._cMenSep1, this._cMenExit}); - - this._nI = new NotifyIcon(); - this._nI.Text = "mRemote"; - this._nI.BalloonTipText = "mRemote"; - this._nI.Icon = global::My.Resources.mRemote_Icon; - this._nI.ContextMenuStrip = this._cMen; - this._nI.Visible = true; - - this._nI.MouseClick += nI_MouseClick; - this._nI.MouseDoubleClick += nI_MouseDoubleClick; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Creating new SysTrayIcon failed" + Constants.vbNewLine + ex.Message, true); - } - } - - public void Dispose() - { - try - { - this._nI.Visible = false; - this._nI.Dispose(); - this._cMen.Dispose(); - this._Disposed = true; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Disposing SysTrayIcon failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void nI_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) - { - if (e.Button == MouseButtons.Right) - { - this._cMenCons.DropDownItems.Clear(); - - foreach (TreeNode tNode in App.Runtime.Windows.treeForm.tvConnections.Nodes) - { - AddNodeToMenu(tNode.Nodes, this._cMenCons); - } - } - } - - private void AddNodeToMenu(TreeNodeCollection tnc, ToolStripMenuItem menToolStrip) - { - try - { - foreach (TreeNode tNode in tnc) - { - ToolStripMenuItem tMenItem = new ToolStripMenuItem(); - tMenItem.Text = tNode.Text; - tMenItem.Tag = tNode; + ToolStripMenuItem tMenItem = new ToolStripMenuItem(); + tMenItem.Text = tNode.Text; + tMenItem.Tag = tNode; - if (Tree.Node.GetNodeType(tNode) == Tree.Node.Type.Container) - { - tMenItem.Image = global::My.Resources.Folder; - tMenItem.Tag = tNode.Tag; - - menToolStrip.DropDownItems.Add(tMenItem); - AddNodeToMenu(tNode.Nodes, tMenItem); - } - else if (Tree.Node.GetNodeType(tNode) == Tree.Node.Type.Connection | Tree.Node.GetNodeType(tNode) == Tree.Node.Type.PuttySession) - { - tMenItem.Image = Windows.treeForm.imgListTree.Images[tNode.ImageIndex]; - tMenItem.Tag = tNode.Tag; - - menToolStrip.DropDownItems.Add(tMenItem); - } - - tMenItem.MouseUp += ConMenItem_MouseUp; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddNodeToMenu failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void nI_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) - { - if (frmMain.Default.Visible == true) - { - HideForm(); - } - else - { - ShowForm(); - } - } - - private void ShowForm() - { - frmMain.Default.Show(); - frmMain.Default.WindowState = frmMain.Default.PreviousWindowState; - - if (My.Settings.Default.ShowSystemTrayIcon == false) - { - App.Runtime.NotificationAreaIcon.Dispose(); - App.Runtime.NotificationAreaIcon = null; - } - } - - private void HideForm() - { - frmMain.Default.Hide(); - frmMain.Default.PreviousWindowState = frmMain.Default.WindowState; - } - - private void ConMenItem_MouseUp(System.Object sender, System.Windows.Forms.MouseEventArgs e) - { - if (e.Button == MouseButtons.Left) - { - if (sender.Tag is Connection.Info) + if (Tree.Node.GetNodeType(tNode) == Tree.Node.Type.Container) { - if (frmMain.Default.Visible == false) - { - ShowForm(); - } - App.Runtime.OpenConnection(sender.Tag); + tMenItem.Image = global::My.Resources.Folder; + tMenItem.Tag = tNode.Tag; + + menToolStrip.DropDownItems.Add(tMenItem); + AddNodeToMenu(tNode.Nodes, tMenItem); } + else if (Tree.Node.GetNodeType(tNode) == Tree.Node.Type.Connection | Tree.Node.GetNodeType(tNode) == Tree.Node.Type.PuttySession) + { + tMenItem.Image = Windows.treeForm.imgListTree.Images[tNode.ImageIndex]; + tMenItem.Tag = tNode.Tag; + + menToolStrip.DropDownItems.Add(tMenItem); + } + + tMenItem.MouseUp += ConMenItem_MouseUp; } } - - private void cMenExit_Click(System.Object sender, System.EventArgs e) + catch (Exception ex) { - App.Runtime.Shutdown.Quit(); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddNodeToMenu failed" + Constants.vbNewLine + ex.Message, true); } } - - public static SaveFileDialog ConnectionsSaveAsDialog() + + private void nI_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) { - SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.CheckPathExists = true; - saveFileDialog.InitialDirectory = App.Info.Connections.DefaultConnectionsPath; - saveFileDialog.FileName = App.Info.Connections.DefaultConnectionsFile; - saveFileDialog.OverwritePrompt = true; - - saveFileDialog.Filter = My.Language.strFiltermRemoteXML + "|*.xml|" + My.Language.strFilterAll + "|*.*"; - - return saveFileDialog; - } - - public static SaveFileDialog ConnectionsExportDialog() - { - SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.CheckPathExists = true; - saveFileDialog.InitialDirectory = App.Info.Connections.DefaultConnectionsPath; - saveFileDialog.FileName = App.Info.Connections.DefaultConnectionsFile; - saveFileDialog.OverwritePrompt = true; - - saveFileDialog.Filter = My.Language.strFiltermRemoteXML + "|*.xml|" + My.Language.strFiltermRemoteCSV + "|*.csv|" + My.Language.strFiltervRD2008CSV + "|*.csv|" + My.Language.strFilterAll + "|*.*"; - - return saveFileDialog; - } - - public static OpenFileDialog ConnectionsLoadDialog() - { - OpenFileDialog lDlg = new OpenFileDialog(); - lDlg.CheckFileExists = true; - lDlg.InitialDirectory = App.Info.Connections.DefaultConnectionsPath; - lDlg.Filter = My.Language.strFiltermRemoteXML + "|*.xml|" + My.Language.strFilterAll + "|*.*"; - - return lDlg; - } - - public static OpenFileDialog ImportConnectionsRdpFileDialog() - { - OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.CheckFileExists = true; - openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal); - openFileDialog.Filter = string.Join("|", new[] {My.Language.strFilterRDP, "*.rdp", My.Language.strFilterAll, "*.*"}); - openFileDialog.Multiselect = true; - return openFileDialog; - } - - public class TreeNodeSorter : IComparer - { - - public System.Windows.Forms.SortOrder Sorting {get; set;} - - public TreeNodeSorter(SortOrder sortOrder = System.Windows.Forms.SortOrder.None) + if (frmMain.Default.Visible == true) { - Sorting = sortOrder; + HideForm(); } - - public int Compare(object x, object y) + else { - TreeNode tx = (TreeNode) x; - TreeNode ty = (TreeNode) y; + ShowForm(); + } + } + + private void ShowForm() + { + frmMain.Default.Show(); + frmMain.Default.WindowState = frmMain.Default.PreviousWindowState; - switch (Sorting) + if (My.Settings.Default.ShowSystemTrayIcon == false) + { + App.Runtime.NotificationAreaIcon.Dispose(); + App.Runtime.NotificationAreaIcon = null; + } + } + + private void HideForm() + { + frmMain.Default.Hide(); + frmMain.Default.PreviousWindowState = frmMain.Default.WindowState; + } + + private void ConMenItem_MouseUp(System.Object sender, System.Windows.Forms.MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + if (sender.Tag is Connection.Info) { - case SortOrder.Ascending: - return string.Compare(tx.Text, ty.Text); - case SortOrder.Descending: - return string.Compare(ty.Text, tx.Text); - default: - return 0; + if (frmMain.Default.Visible == false) + { + ShowForm(); + } + App.Runtime.OpenConnection(sender.Tag); } } } + + private void cMenExit_Click(System.Object sender, System.EventArgs e) + { + App.Runtime.Shutdown.Quit(); + } + } + + public static SaveFileDialog ConnectionsSaveAsDialog() + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.CheckPathExists = true; + saveFileDialog.InitialDirectory = App.Info.Connections.DefaultConnectionsPath; + saveFileDialog.FileName = App.Info.Connections.DefaultConnectionsFile; + saveFileDialog.OverwritePrompt = true; + + saveFileDialog.Filter = My.Language.strFiltermRemoteXML + "|*.xml|" + My.Language.strFilterAll + "|*.*"; + + return saveFileDialog; + } + + public static SaveFileDialog ConnectionsExportDialog() + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.CheckPathExists = true; + saveFileDialog.InitialDirectory = App.Info.Connections.DefaultConnectionsPath; + saveFileDialog.FileName = App.Info.Connections.DefaultConnectionsFile; + saveFileDialog.OverwritePrompt = true; + + saveFileDialog.Filter = My.Language.strFiltermRemoteXML + "|*.xml|" + My.Language.strFiltermRemoteCSV + "|*.csv|" + My.Language.strFiltervRD2008CSV + "|*.csv|" + My.Language.strFilterAll + "|*.*"; + + return saveFileDialog; + } + + public static OpenFileDialog ConnectionsLoadDialog() + { + OpenFileDialog lDlg = new OpenFileDialog(); + lDlg.CheckFileExists = true; + lDlg.InitialDirectory = App.Info.Connections.DefaultConnectionsPath; + lDlg.Filter = My.Language.strFiltermRemoteXML + "|*.xml|" + My.Language.strFilterAll + "|*.*"; + + return lDlg; + } + + public static OpenFileDialog ImportConnectionsRdpFileDialog() + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.CheckFileExists = true; + openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal); + openFileDialog.Filter = string.Join("|", new[] {My.Language.strFilterRDP, "*.rdp", My.Language.strFilterAll, "*.*"}); + openFileDialog.Multiselect = true; + return openFileDialog; + } + + public class TreeNodeSorter : IComparer + { + + public System.Windows.Forms.SortOrder Sorting {get; set;} + + public TreeNodeSorter(SortOrder sortOrder = System.Windows.Forms.SortOrder.None) + { + Sorting = sortOrder; + } + + public int Compare(object x, object y) + { + TreeNode tx = (TreeNode) x; + TreeNode ty = (TreeNode) y; + + switch (Sorting) + { + case SortOrder.Ascending: + return string.Compare(tx.Text, ty.Text); + case SortOrder.Descending: + return string.Compare(ty.Text, tx.Text); + default: + return 0; + } + } } + } } diff --git a/mRemoteV1/CS/Tools/Tools.Misc.cs b/mRemoteV1/CS/Tools/Tools.Misc.cs index 70964244e..53d9d83fa 100644 --- a/mRemoteV1/CS/Tools/Tools.Misc.cs +++ b/mRemoteV1/CS/Tools/Tools.Misc.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,15 +8,13 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Reflection; using System.ComponentModel; using System.Runtime.InteropServices; using System.Collections.Specialized; using System.Text.RegularExpressions; using mRemoteNG.Forms; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.IO; using System.Data.SqlClient; @@ -25,507 +22,507 @@ using System.Data.SqlClient; namespace mRemoteNG.Tools { public class Misc + { + private struct SHFILEINFO { - private struct SHFILEINFO + public IntPtr hIcon; // : icon + public int iIcon; // : icondex + public int dwAttributes; // : SFGAO_ flags + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]public string szDisplayName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]public string szTypeName; + } + + [DllImport("shell32.dll")]private static extern IntPtr SHGetFileInfo(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, int uFlags); + + private const int SHGFI_ICON = 0x100; + private const int SHGFI_SMALLICON = 0x1; + //Private Const SHGFI_LARGEICON = &H0 ' Large icon + + public static Icon GetIconFromFile(string FileName) + { + try { - public IntPtr hIcon; // : icon - public int iIcon; // : icondex - public int dwAttributes; // : SFGAO_ flags - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]public string szDisplayName; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]public string szTypeName; - } - - [DllImport("shell32.dll")]private static extern IntPtr SHGetFileInfo(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, int uFlags); - - private const int SHGFI_ICON = 0x100; - private const int SHGFI_SMALLICON = 0x1; - //Private Const SHGFI_LARGEICON = &H0 ' Large icon - - public static Icon GetIconFromFile(string FileName) - { - try + if (File.Exists(FileName) == false) { - if (File.Exists(FileName) == false) - { - return null; - } - - IntPtr hImgSmall; //The handle to the system image list. - //Dim hImgLarge As IntPtr 'The handle to the system image list. - SHFILEINFO shinfo = new SHFILEINFO(); - shinfo = new SHFILEINFO(); - - shinfo.szDisplayName = new string('\0', 260); - shinfo.szTypeName = new string('\0', 80); - - //Use this to get the small icon. - hImgSmall = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_SMALLICON); - - //Use this to get the large icon. - //hImgLarge = SHGetFileInfo(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON); - - //The icon is returned in the hIcon member of the - //shinfo struct. - System.Drawing.Icon myIcon = default(System.Drawing.Icon); - myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon); - - return myIcon; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "GetIconFromFile failed (Tools.Misc)" + Constants.vbNewLine + ex.Message, true); return null; } - } - - public delegate void SQLUpdateCheckFinishedEventHandler(bool UpdateAvailable); - private static SQLUpdateCheckFinishedEventHandler SQLUpdateCheckFinishedEvent; - - public static event SQLUpdateCheckFinishedEventHandler SQLUpdateCheckFinished - { - add - { - SQLUpdateCheckFinishedEvent = (SQLUpdateCheckFinishedEventHandler) System.Delegate.Combine(SQLUpdateCheckFinishedEvent, value); - } - remove - { - SQLUpdateCheckFinishedEvent = (SQLUpdateCheckFinishedEventHandler) System.Delegate.Remove(SQLUpdateCheckFinishedEvent, value); - } - } - - public static void IsSQLUpdateAvailableBG() - { - System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(IsSQLUpdateAvailable)); - t.SetApartmentState(System.Threading.ApartmentState.STA); - t.Start(); - } - - public static bool IsSQLUpdateAvailable() - { - try - { - SqlConnection sqlCon = default(SqlConnection); - SqlCommand sqlQuery = default(SqlCommand); - SqlDataReader sqlRd = default(SqlDataReader); - DateTime LastUpdateInDB = default(DateTime); + IntPtr hImgSmall; //The handle to the system image list. + //Dim hImgLarge As IntPtr 'The handle to the system image list. + SHFILEINFO shinfo = new SHFILEINFO(); + shinfo = new SHFILEINFO(); - if (My.Settings.Default.SQLUser != "") - { - sqlCon = new SqlConnection("Data Source=" + My.Settings.Default.SQLHost + ";Initial Catalog=" + My.Settings.Default.SQLDatabaseName + ";User Id=" + My.Settings.Default.SQLUser + ";Password=" + Security.Crypt.Decrypt(System.Convert.ToString(My.Settings.Default.SQLPass), App.Info.General.EncryptionKey)); - } - else - { - sqlCon = new SqlConnection("Data Source=" + My.Settings.Default.SQLHost + ";Initial Catalog=" + My.Settings.Default.SQLDatabaseName + ";Integrated Security=True"); - } + shinfo.szDisplayName = new string('\0', 260); + shinfo.szTypeName = new string('\0', 80); - sqlCon.Open(); + //Use this to get the small icon. + hImgSmall = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_SMALLICON); - sqlQuery = new SqlCommand("SELECT * FROM tblUpdate", sqlCon); - sqlRd = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); + //Use this to get the large icon. + //hImgLarge = SHGetFileInfo(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON); - sqlRd.Read(); + //The icon is returned in the hIcon member of the + //shinfo struct. + System.Drawing.Icon myIcon = default(System.Drawing.Icon); + myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon); - if (sqlRd.HasRows) - { - LastUpdateInDB = System.Convert.ToDateTime(sqlRd["LastUpdate"]); - - if (LastUpdateInDB > LastSqlUpdate) - { - if (SQLUpdateCheckFinishedEvent != null) - SQLUpdateCheckFinishedEvent(true); - return true; - } - } - - if (SQLUpdateCheckFinishedEvent != null) - SQLUpdateCheckFinishedEvent(false); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "IsSQLUpdateAvailable failed (Tools.Misc)" + Constants.vbNewLine + ex.Message, true); - } - - return false; + return myIcon; } - - public static string PasswordDialog(string passwordName = null, bool verify = true) + catch (Exception ex) { - PasswordForm passwordForm = new PasswordForm(passwordName, verify); - - if (passwordForm.ShowDialog() == DialogResult.OK) - { - return passwordForm.Password; - } - else - { - return ""; - } - } - - public static string CreateConstantID() - { - return Guid.NewGuid().ToString(); - } - - public static string LeadingZero(string Number) - { - if (Number < 10) - { - return "0" + Number; - } - else - { - return Number; - } - } - - public static string DBDate(DateTime Dt) - { - string strDate = ""; - - strDate = Dt.Year + LeadingZero(System.Convert.ToString(Dt.Month)) + LeadingZero(System.Convert.ToString(Dt.Day)) + " " + LeadingZero(System.Convert.ToString(Dt.Hour)) + ":" + LeadingZero(System.Convert.ToString(Dt.Minute)) + ":" + LeadingZero(System.Convert.ToString(Dt.Second)); - - return strDate; - } - - public static string PrepareForDB(string Text) - { - Text = Strings.Replace(Expression: Text, Find: "\'True\'", Replacement: "1", Compare: CompareMethod.Text); - Text = Strings.Replace(Expression: Text, Find: "\'False\'", Replacement: "0", Compare: CompareMethod.Text); - - return Text; - } - - public static string PrepareValueForDB(string Text) - { - Text = Strings.Replace(Expression: Text, Find: "\'", Replacement: "\'\'", Compare: CompareMethod.Text); - - return Text; - } - - public static object StringToEnum(Type t, string value) - { - return Enum.Parse(t, value); - } - - public static string GetExceptionMessageRecursive(Exception ex, string separator = Constants.vbNewLine) - { - string message = ex.Message; - if (ex.InnerException != null) - { - string innerMessage = GetExceptionMessageRecursive(ex.InnerException, separator); - message = string.Join(separator, new string[] {message, innerMessage}); - } - return message; - } - - public static Image TakeScreenshot(UI.Window.Connection sender) - { - try - { - int LeftStart = sender.TabController.SelectedTab.PointToScreen(new Point(sender.TabController.SelectedTab.Left)).X; //Me.Left + Splitter.SplitterDistance + 11 - int TopStart = sender.TabController.SelectedTab.PointToScreen(new Point(sender.TabController.SelectedTab.Top)).Y; //Me.Top + Splitter.Top + TabController.Top + TabController.SelectedTab.Top * 2 - 3 - int LeftWidth = sender.TabController.SelectedTab.Width; //Me.Width - (Splitter.SplitterDistance + 16) - int TopHeight = sender.TabController.SelectedTab.Height; //Me.Height - (Splitter.Top + TabController.Top + TabController.SelectedTab.Top * 2 + 2) - - Size currentFormSize = new Size(LeftWidth, TopHeight); - Bitmap ScreenToBitmap = new Bitmap(LeftWidth, TopHeight); - System.Drawing.Graphics gGraphics = System.Drawing.Graphics.FromImage(ScreenToBitmap); - - gGraphics.CopyFromScreen(new Point(LeftStart, TopStart), new Point(0, 0), currentFormSize); - - return ScreenToBitmap; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Taking Screenshot failed" + Constants.vbNewLine + ex.Message, true); - } - + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "GetIconFromFile failed (Tools.Misc)" + Constants.vbNewLine + ex.Message, true); return null; } + } - public class EnumTypeConverter : EnumConverter + public delegate void SQLUpdateCheckFinishedEventHandler(bool UpdateAvailable); + private static SQLUpdateCheckFinishedEventHandler SQLUpdateCheckFinishedEvent; + + public static event SQLUpdateCheckFinishedEventHandler SQLUpdateCheckFinished + { + add { - private System.Type _enumType; - - public EnumTypeConverter(System.Type type) : base(type) - { - _enumType = type; - } - - public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destType) - { - return destType == typeof(string); - } - - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destType) - { - FieldInfo fi = _enumType.GetField(Enum.GetName(_enumType, value)); - DescriptionAttribute dna = (DescriptionAttribute) (Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute))); + SQLUpdateCheckFinishedEvent = (SQLUpdateCheckFinishedEventHandler) System.Delegate.Combine(SQLUpdateCheckFinishedEvent, value); + } + remove + { + SQLUpdateCheckFinishedEvent = (SQLUpdateCheckFinishedEventHandler) System.Delegate.Remove(SQLUpdateCheckFinishedEvent, value); + } + } + + public static void IsSQLUpdateAvailableBG() + { + System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(IsSQLUpdateAvailable)); + t.SetApartmentState(System.Threading.ApartmentState.STA); + t.Start(); + } + + public static bool IsSQLUpdateAvailable() + { + try + { + SqlConnection sqlCon = default(SqlConnection); + SqlCommand sqlQuery = default(SqlCommand); + SqlDataReader sqlRd = default(SqlDataReader); - if (dna != null) - { - return dna.Description; - } - else - { - return value.ToString(); - } - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type srcType) + DateTime LastUpdateInDB = default(DateTime); + + if (My.Settings.Default.SQLUser != "") { - return srcType == typeof(string); + sqlCon = new SqlConnection("Data Source=" + My.Settings.Default.SQLHost + ";Initial Catalog=" + My.Settings.Default.SQLDatabaseName + ";User Id=" + My.Settings.Default.SQLUser + ";Password=" + Security.Crypt.Decrypt(System.Convert.ToString(My.Settings.Default.SQLPass), App.Info.General.EncryptionKey)); } - - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + else { - foreach (FieldInfo fi in _enumType.GetFields()) - { - DescriptionAttribute dna = (DescriptionAttribute) (Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute))); + sqlCon = new SqlConnection("Data Source=" + My.Settings.Default.SQLHost + ";Initial Catalog=" + My.Settings.Default.SQLDatabaseName + ";Integrated Security=True"); + } + + sqlCon.Open(); + + sqlQuery = new SqlCommand("SELECT * FROM tblUpdate", sqlCon); + sqlRd = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); + + sqlRd.Read(); + + if (sqlRd.HasRows) + { + LastUpdateInDB = System.Convert.ToDateTime(sqlRd["LastUpdate"]); - if ((dna != null) && (((string) value) == dna.Description)) - { - return Enum.Parse(_enumType, fi.Name); - } + if (LastUpdateInDB > LastSqlUpdate) + { + if (SQLUpdateCheckFinishedEvent != null) + SQLUpdateCheckFinishedEvent(true); + return true; } + } - return Enum.Parse(_enumType, (string) value); + if (SQLUpdateCheckFinishedEvent != null) + SQLUpdateCheckFinishedEvent(false); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "IsSQLUpdateAvailable failed (Tools.Misc)" + Constants.vbNewLine + ex.Message, true); + } + + return false; + } + + public static string PasswordDialog(string passwordName = null, bool verify = true) + { + PasswordForm passwordForm = new PasswordForm(passwordName, verify); + + if (passwordForm.ShowDialog() == DialogResult.OK) + { + return passwordForm.Password; + } + else + { + return ""; + } + } + + public static string CreateConstantID() + { + return Guid.NewGuid().ToString(); + } + + public static string LeadingZero(string Number) + { + if (Number < 10) + { + return "0" + Number; + } + else + { + return Number; + } + } + + public static string DBDate(DateTime Dt) + { + string strDate = ""; + + strDate = Dt.Year + LeadingZero(System.Convert.ToString(Dt.Month)) + LeadingZero(System.Convert.ToString(Dt.Day)) + " " + LeadingZero(System.Convert.ToString(Dt.Hour)) + ":" + LeadingZero(System.Convert.ToString(Dt.Minute)) + ":" + LeadingZero(System.Convert.ToString(Dt.Second)); + + return strDate; + } + + public static string PrepareForDB(string Text) + { + Text = Strings.Replace(Expression: Text, Find: "\'True\'", Replacement: "1", Compare: CompareMethod.Text); + Text = Strings.Replace(Expression: Text, Find: "\'False\'", Replacement: "0", Compare: CompareMethod.Text); + + return Text; + } + + public static string PrepareValueForDB(string Text) + { + Text = Strings.Replace(Expression: Text, Find: "\'", Replacement: "\'\'", Compare: CompareMethod.Text); + + return Text; + } + + public static object StringToEnum(Type t, string value) + { + return Enum.Parse(t, value); + } + + public static string GetExceptionMessageRecursive(Exception ex, string separator = Constants.vbNewLine) + { + string message = ex.Message; + if (ex.InnerException != null) + { + string innerMessage = GetExceptionMessageRecursive(ex.InnerException, separator); + message = string.Join(separator, new string[] {message, innerMessage}); + } + return message; + } + + public static Image TakeScreenshot(UI.Window.Connection sender) + { + try + { + int LeftStart = sender.TabController.SelectedTab.PointToScreen(new Point(sender.TabController.SelectedTab.Left)).X; //Me.Left + Splitter.SplitterDistance + 11 + int TopStart = sender.TabController.SelectedTab.PointToScreen(new Point(sender.TabController.SelectedTab.Top)).Y; //Me.Top + Splitter.Top + TabController.Top + TabController.SelectedTab.Top * 2 - 3 + int LeftWidth = sender.TabController.SelectedTab.Width; //Me.Width - (Splitter.SplitterDistance + 16) + int TopHeight = sender.TabController.SelectedTab.Height; //Me.Height - (Splitter.Top + TabController.Top + TabController.SelectedTab.Top * 2 + 2) + + Size currentFormSize = new Size(LeftWidth, TopHeight); + Bitmap ScreenToBitmap = new Bitmap(LeftWidth, TopHeight); + System.Drawing.Graphics gGraphics = System.Drawing.Graphics.FromImage(ScreenToBitmap); + + gGraphics.CopyFromScreen(new Point(LeftStart, TopStart), new Point(0, 0), currentFormSize); + + return ScreenToBitmap; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Taking Screenshot failed" + Constants.vbNewLine + ex.Message, true); + } + + return null; + } + + public class EnumTypeConverter : EnumConverter + { + private System.Type _enumType; + + public EnumTypeConverter(System.Type type) : base(type) + { + _enumType = type; + } + + public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destType) + { + return destType == typeof(string); + } + + public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destType) + { + FieldInfo fi = _enumType.GetField(Enum.GetName(_enumType, value)); + DescriptionAttribute dna = (DescriptionAttribute) (Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute))); + + if (dna != null) + { + return dna.Description; + } + else + { + return value.ToString(); } } - - public class YesNoTypeConverter : TypeConverter + + public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type srcType) { + return srcType == typeof(string); + } - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + { + foreach (FieldInfo fi in _enumType.GetFields()) { - if (sourceType == typeof(string)) - { - return true; - } - - return base.CanConvertFrom(context, sourceType); - } - - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) - { - if (destinationType == typeof(string)) - { - return true; - } - - return base.CanConvertTo(context, destinationType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) - { - if (value.GetType() == typeof(string)) - { - if ((value).ToString().ToLower() == My.Language.strYes.ToLower()) - { - return true; - } + DescriptionAttribute dna = (DescriptionAttribute) (Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute))); - if ((value).ToString().ToLower() == My.Language.strNo.ToLower()) - { - return false; - } - - throw (new Exception("Values must be \"Yes\" or \"No\"")); - } - - return base.ConvertFrom(context, culture, value); - } - - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) - { - if (destinationType == typeof(string)) + if ((dna != null) && (((string) value) == dna.Description)) { - return ((System.Convert.ToBoolean(value)) ? My.Language.strYes : My.Language.strNo); + return Enum.Parse(_enumType, fi.Name); } - - return base.ConvertTo(context, culture, value, destinationType); } + + return Enum.Parse(_enumType, (string) value); + } + } + + public class YesNoTypeConverter : TypeConverter + { - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(string)) { return true; } + + return base.CanConvertFrom(context, sourceType); + } - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) { - bool[] bools = new bool[] {true, false}; + return true; + } - System.ComponentModel.TypeConverter.StandardValuesCollection svc = new System.ComponentModel.TypeConverter.StandardValuesCollection(bools); + return base.CanConvertTo(context, destinationType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + { + if (value.GetType() == typeof(string)) + { + if ((value).ToString().ToLower() == My.Language.strYes.ToLower()) + { + return true; + } + + if ((value).ToString().ToLower() == My.Language.strNo.ToLower()) + { + return false; + } + + throw (new Exception("Values must be \"Yes\" or \"No\"")); + } - return svc; + return base.ConvertFrom(context, culture, value); + } + + public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) + { + if (destinationType == typeof(string)) + { + return ((System.Convert.ToBoolean(value)) ? My.Language.strYes : My.Language.strNo); + } + + return base.ConvertTo(context, culture, value, destinationType); + } + + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + { + return true; + } + + public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + { + bool[] bools = new bool[] {true, false}; + + System.ComponentModel.TypeConverter.StandardValuesCollection svc = new System.ComponentModel.TypeConverter.StandardValuesCollection(bools); + + return svc; + } + } + + public class Fullscreen + { + public Fullscreen(Form handledForm) + { + _handledForm = handledForm; + } + + private Form _handledForm; + private FormWindowState _savedWindowState; + private FormBorderStyle _savedBorderStyle; + private Rectangle _savedBounds; + + private bool _value = false; + public bool Value + { + get + { + return _value; + } + set + { + if (_value == value) + { + return ; + } + if (!_value) + { + EnterFullscreen(); + } + else + { + ExitFullscreen(); + } + _value = value; } } - - public class Fullscreen + + private void EnterFullscreen() { - public Fullscreen(Form handledForm) - { - _handledForm = handledForm; - } - - private Form _handledForm; - private FormWindowState _savedWindowState; - private FormBorderStyle _savedBorderStyle; - private Rectangle _savedBounds; - - private bool _value = false; -public bool Value - { - get - { - return _value; - } - set - { - if (_value == value) - { - return ; - } - if (!_value) - { - EnterFullscreen(); - } - else - { - ExitFullscreen(); - } - _value = value; - } - } - - private void EnterFullscreen() - { - _savedBorderStyle = _handledForm.FormBorderStyle; - _savedWindowState = _handledForm.WindowState; - _savedBounds = _handledForm.Bounds; + _savedBorderStyle = _handledForm.FormBorderStyle; + _savedWindowState = _handledForm.WindowState; + _savedBounds = _handledForm.Bounds; - _handledForm.FormBorderStyle = FormBorderStyle.None; - if (_handledForm.WindowState == FormWindowState.Maximized) - { - _handledForm.WindowState = FormWindowState.Normal; - } - _handledForm.WindowState = FormWindowState.Maximized; - } - - private void ExitFullscreen() + _handledForm.FormBorderStyle = FormBorderStyle.None; + if (_handledForm.WindowState == FormWindowState.Maximized) { - _handledForm.FormBorderStyle = _savedBorderStyle; - _handledForm.WindowState = _savedWindowState; - _handledForm.Bounds = _savedBounds; + _handledForm.WindowState = FormWindowState.Normal; + } + _handledForm.WindowState = FormWindowState.Maximized; + } + + private void ExitFullscreen() + { + _handledForm.FormBorderStyle = _savedBorderStyle; + _handledForm.WindowState = _savedWindowState; + _handledForm.Bounds = _savedBounds; + } + } + + + // + //* Arguments class: application arguments interpreter + //* + //* Authors: R. LOPES + //* Contributors: R. LOPES + //* Created: 25 October 2002 + //* Modified: 28 October 2002 + //* + //* Version: 1.0 + // + public class CMDArguments + { + private StringDictionary Parameters; + + // Retrieve a parameter value if it exists + public string this[string Param] + { + get + { + return (Parameters[Param]); } } - - - // - //* Arguments class: application arguments interpreter - //* - //* Authors: R. LOPES - //* Contributors: R. LOPES - //* Created: 25 October 2002 - //* Modified: 28 October 2002 - //* - //* Version: 1.0 - // - public class CMDArguments + + public CMDArguments(string[] Args) { - private StringDictionary Parameters; - - // Retrieve a parameter value if it exists -public string this[string Param] - { - get - { - return (Parameters[Param]); - } - } - - public CMDArguments(string[] Args) - { - Parameters = new StringDictionary(); - Regex Spliter = new Regex("^-{1,2}|^/|=|:", (System.Text.RegularExpressions.RegexOptions) (RegexOptions.IgnoreCase | RegexOptions.Compiled)); - Regex Remover = new Regex("^[\'\"]?(.*?)[\'\"]?$", (System.Text.RegularExpressions.RegexOptions) (RegexOptions.IgnoreCase | RegexOptions.Compiled)); - string Parameter = null; - string[] Parts = null; + Parameters = new StringDictionary(); + Regex Spliter = new Regex("^-{1,2}|^/|=|:", (System.Text.RegularExpressions.RegexOptions) (RegexOptions.IgnoreCase | RegexOptions.Compiled)); + Regex Remover = new Regex("^[\'\"]?(.*?)[\'\"]?$", (System.Text.RegularExpressions.RegexOptions) (RegexOptions.IgnoreCase | RegexOptions.Compiled)); + string Parameter = null; + string[] Parts = null; - // Valid parameters forms: - // {-,/,--}param{ ,=,:}((",')value(",')) - // Examples: -param1 value1 --param2 /param3:"Test-:-work" /param4=happy -param5 '--=nice=--' + // Valid parameters forms: + // {-,/,--}param{ ,=,:}((",')value(",')) + // Examples: -param1 value1 --param2 /param3:"Test-:-work" /param4=happy -param5 '--=nice=--' - try + try + { + foreach (string Txt in Args) { - foreach (string Txt in Args) + // Look for new parameters (-,/ or --) and a possible enclosed value (=,:) + Parts = Spliter.Split(Txt, 3); + switch (Parts.Length) { - // Look for new parameters (-,/ or --) and a possible enclosed value (=,:) - Parts = Spliter.Split(Txt, 3); - switch (Parts.Length) - { - case 1: - // Found a value (for the last parameter found (space separator)) - if (Parameter != null) - { - if (!Parameters.ContainsKey(Parameter)) - { - Parts[0] = Remover.Replace(Parts[0], "$1"); - Parameters.Add(Parameter, Parts[0]); - } - Parameter = null; - } - // else Error: no parameter waiting for a value (skipped) - break; - case 2: - // Found just a parameter - // The last parameter is still waiting. With no value, set it to true. - if (Parameter != null) - { - if (!Parameters.ContainsKey(Parameter)) - { - Parameters.Add(Parameter, "true"); - } - } - Parameter = Parts[1]; - break; - case 3: - // Parameter with enclosed value - // The last parameter is still waiting. With no value, set it to true. - if (Parameter != null) - { - if (!Parameters.ContainsKey(Parameter)) - { - Parameters.Add(Parameter, "true"); - } - } - Parameter = Parts[1]; - // Remove possible enclosing characters (",') + case 1: + // Found a value (for the last parameter found (space separator)) + if (Parameter != null) + { if (!Parameters.ContainsKey(Parameter)) { - Parts[2] = Remover.Replace(Parts[2], "$1"); - Parameters.Add(Parameter, Parts[2]); + Parts[0] = Remover.Replace(Parts[0], "$1"); + Parameters.Add(Parameter, Parts[0]); } Parameter = null; - break; - } - } - // In case a parameter is still waiting - if (Parameter != null) - { - if (!Parameters.ContainsKey(Parameter)) - { - Parameters.Add(Parameter, "true"); - } + } + // else Error: no parameter waiting for a value (skipped) + break; + case 2: + // Found just a parameter + // The last parameter is still waiting. With no value, set it to true. + if (Parameter != null) + { + if (!Parameters.ContainsKey(Parameter)) + { + Parameters.Add(Parameter, "true"); + } + } + Parameter = Parts[1]; + break; + case 3: + // Parameter with enclosed value + // The last parameter is still waiting. With no value, set it to true. + if (Parameter != null) + { + if (!Parameters.ContainsKey(Parameter)) + { + Parameters.Add(Parameter, "true"); + } + } + Parameter = Parts[1]; + // Remove possible enclosing characters (",') + if (!Parameters.ContainsKey(Parameter)) + { + Parts[2] = Remover.Replace(Parts[2], "$1"); + Parameters.Add(Parameter, Parts[2]); + } + Parameter = null; + break; } } - catch (Exception ex) + // In case a parameter is still waiting + if (Parameter != null) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Creating new Args failed" + Constants.vbNewLine + ex.Message, true); + if (!Parameters.ContainsKey(Parameter)) + { + Parameters.Add(Parameter, "true"); + } } } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Creating new Args failed" + Constants.vbNewLine + ex.Message, true); + } } } + } } diff --git a/mRemoteV1/CS/Tools/Tools.PortScan.cs b/mRemoteV1/CS/Tools/Tools.PortScan.cs index 03b7135f7..7191c9629 100644 --- a/mRemoteV1/CS/Tools/Tools.PortScan.cs +++ b/mRemoteV1/CS/Tools/Tools.PortScan.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,10 +8,8 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Threading; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.Net.NetworkInformation; using System.Net; @@ -21,9 +18,9 @@ namespace mRemoteNG.Tools.PortScan { public class ScanHost { -#region Properties + #region Properties private static int _SSHPort = Connection.Protocol.SSH1.Defaults.Port; -public static int SSHPort + public static int SSHPort { get { @@ -36,7 +33,7 @@ public static int SSHPort } private static int _TelnetPort = Connection.Protocol.Telnet.Defaults.Port; -public static int TelnetPort + public static int TelnetPort { get { @@ -49,7 +46,7 @@ public static int TelnetPort } private static int _HTTPPort = Connection.Protocol.HTTP.Defaults.Port; -public static int HTTPPort + public static int HTTPPort { get { @@ -62,7 +59,7 @@ public static int HTTPPort } private static int _HTTPSPort = Connection.Protocol.HTTPS.Defaults.Port; -public static int HTTPSPort + public static int HTTPSPort { get { @@ -75,7 +72,7 @@ public static int HTTPSPort } private static int _RloginPort = Connection.Protocol.Rlogin.Defaults.Port; -public static int RloginPort + public static int RloginPort { get { @@ -88,7 +85,7 @@ public static int RloginPort } private static int _RDPPort = Connection.Protocol.RDP.Defaults.Port; -public static int RDPPort + public static int RDPPort { get { @@ -101,7 +98,7 @@ public static int RDPPort } private static int _VNCPort = Connection.Protocol.VNC.Defaults.Port; -public static int VNCPort + public static int VNCPort { get { @@ -114,7 +111,7 @@ public static int VNCPort } private string _hostName = ""; -public string HostName + public string HostName { get { @@ -126,7 +123,7 @@ public string HostName } } -public string HostNameWithoutDomain + public string HostNameWithoutDomain { get { @@ -139,7 +136,7 @@ public string HostNameWithoutDomain } private string _hostIp; -public string HostIp + public string HostIp { get { @@ -152,7 +149,7 @@ public string HostIp } private ArrayList _openPorts = new ArrayList(); -public ArrayList OpenPorts + public ArrayList OpenPorts { get { @@ -165,7 +162,7 @@ public ArrayList OpenPorts } private ArrayList _closedPorts; -public ArrayList ClosedPorts + public ArrayList ClosedPorts { get { @@ -178,7 +175,7 @@ public ArrayList ClosedPorts } private bool _RDP; -public bool RDP + public bool RDP { get { @@ -191,7 +188,7 @@ public bool RDP } private bool _VNC; -public bool VNC + public bool VNC { get { @@ -204,7 +201,7 @@ public bool VNC } private bool _SSH; -public bool SSH + public bool SSH { get { @@ -217,7 +214,7 @@ public bool SSH } private bool _Telnet; -public bool Telnet + public bool Telnet { get { @@ -230,7 +227,7 @@ public bool Telnet } private bool _Rlogin; -public bool Rlogin + public bool Rlogin { get { @@ -243,7 +240,7 @@ public bool Rlogin } private bool _HTTP; -public bool HTTP + public bool HTTP { get { @@ -256,7 +253,7 @@ public bool HTTP } private bool _HTTPS; -public bool HTTPS + public bool HTTPS { get { @@ -267,9 +264,9 @@ public bool HTTPS _HTTPS = value; } } -#endregion + #endregion -#region Methods + #region Methods public ScanHost(string host) { _hostIp = host; @@ -285,7 +282,7 @@ public bool HTTPS } catch (Exception) { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "ToString failed (Tools.PortScan)", true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "ToString failed (Tools.PortScan)", true); return ""; } } @@ -338,7 +335,7 @@ public bool HTTPS } catch (Exception ex) { - MessageCollector.AddExceptionMessage("Tools.PortScan.ToListViewItem() failed.", ex, Messages.MessageClass.WarningMsg, true); + Runtime.MessageCollector.AddExceptionMessage("Tools.PortScan.ToListViewItem() failed.", ex, Messages.MessageClass.WarningMsg, true); return null; } } @@ -365,323 +362,322 @@ public bool HTTPS _HTTPS = value; _HTTP = value; } -#endregion + #endregion } public class Scanner + { + #region Private Members + private List _ipAddresses = new List(); + private List _ports = new List(); + + private Thread _scanThread; + private List _scannedHosts = new List(); + #endregion + + #region Public Methods + public Scanner(IPAddress ipAddress1, IPAddress ipAddress2) + { + IPAddress ipAddressStart = IpAddressMin(ipAddress1, ipAddress2); + IPAddress ipAddressEnd = IpAddressMax(ipAddress1, ipAddress2); + + _ports.Clear(); + _ports.AddRange(new int[] {scanHost.SSHPort, scanHost.TelnetPort, scanHost.HTTPPort, scanHost.HTTPSPort, scanHost.RloginPort, scanHost.RDPPort, scanHost.VNCPort}); + + _ipAddresses.Clear(); + _ipAddresses.AddRange(IpAddressArrayFromRange(ipAddressStart, ipAddressEnd)); + + _scannedHosts.Clear(); + } + + public Scanner(IPAddress ipAddress1, IPAddress ipAddress2, int port1, int port2) : this(ipAddress1, ipAddress2) + { + + int portStart = Math.Min(port1, port2); + int portEnd = Math.Max(port1, port2); + + _ports.Clear(); + for (int port = portStart; port <= portEnd; port++) { -#region Private Members - private List _ipAddresses = new List(); - private List _ports = new List(); + _ports.Add(port); + } + } - private Thread _scanThread; - private List _scannedHosts = new List(); -#endregion + public void StartScan() + { + _scanThread = new Thread(new System.Threading.ThreadStart(ScanAsync)); + _scanThread.SetApartmentState(ApartmentState.STA); + _scanThread.IsBackground = true; + _scanThread.Start(); + } -#region Public Methods - public Scanner(IPAddress ipAddress1, IPAddress ipAddress2) - { - IPAddress ipAddressStart = IpAddressMin(ipAddress1, ipAddress2); - IPAddress ipAddressEnd = IpAddressMax(ipAddress1, ipAddress2); - - _ports.Clear(); - _ports.AddRange(new int[] {scanHost.SSHPort, scanHost.TelnetPort, scanHost.HTTPPort, scanHost.HTTPSPort, scanHost.RloginPort, scanHost.RDPPort, scanHost.VNCPort}); - - _ipAddresses.Clear(); - _ipAddresses.AddRange(IpAddressArrayFromRange(ipAddressStart, ipAddressEnd)); - - _scannedHosts.Clear(); - } + public void StopScan() + { + _scanThread.Abort(); + } - public Scanner(IPAddress ipAddress1, IPAddress ipAddress2, int port1, int port2) : this(ipAddress1, ipAddress2) - { - - int portStart = Math.Min(port1, port2); - int portEnd = Math.Max(port1, port2); - - _ports.Clear(); - for (int port = portStart; port <= portEnd; port++) - { - _ports.Add(port); - } - } + public static bool IsPortOpen(string hostname, string port) + { + try + { + // ReSharper disable UnusedVariable + System.Net.Sockets.TcpClient tcpClient = new System.Net.Sockets.TcpClient(hostname, (int) port); + // ReSharper restore UnusedVariable + return true; + } + catch (Exception) + { + return false; + } + } + #endregion - public void StartScan() - { - _scanThread = new Thread(new System.Threading.ThreadStart(ScanAsync)); - _scanThread.SetApartmentState(ApartmentState.STA); - _scanThread.IsBackground = true; - _scanThread.Start(); - } - - public void StopScan() - { - _scanThread.Abort(); - } - - public static bool IsPortOpen(string hostname, string port) - { - try - { - // ReSharper disable UnusedVariable - System.Net.Sockets.TcpClient tcpClient = new System.Net.Sockets.TcpClient(hostname, (int) port); - // ReSharper restore UnusedVariable - return true; - } - catch (Exception) - { - return false; - } - } -#endregion - -#region Private Methods - private void ScanAsync() - { - try - { - int hostCount = 0; + #region Private Methods + private void ScanAsync() + { + try + { + int hostCount = 0; - foreach (IPAddress ipAddress in _ipAddresses) + foreach (IPAddress ipAddress in _ipAddresses) + { + if (BeginHostScanEvent != null) + BeginHostScanEvent(ipAddress.ToString()); + + ScanHost scanHost = new ScanHost(ipAddress.ToString()); + hostCount++; + + if (!IsHostAlive(ipAddress)) + { + scanHost.ClosedPorts.AddRange(_ports); + scanHost.SetAllProtocols(false); + } + else + { + foreach (int port in _ports) { - if (BeginHostScanEvent != null) - BeginHostScanEvent(ipAddress.ToString()); - - ScanHost scanHost = new ScanHost(ipAddress.ToString()); - hostCount++; - - if (!IsHostAlive(ipAddress)) - { - scanHost.ClosedPorts.AddRange(_ports); - scanHost.SetAllProtocols(false); - } - else - { - foreach (int port in _ports) - { - bool isPortOpen = false; + bool isPortOpen = false; - try - { - // ReSharper disable UnusedVariable - System.Net.Sockets.TcpClient tcpClient = new System.Net.Sockets.TcpClient(ipAddress.ToString(), port); - // ReSharper restore UnusedVariable - - isPortOpen = true; - scanHost.OpenPorts.Add(port); - } - catch (Exception) - { - isPortOpen = false; - scanHost.ClosedPorts.Add(port); - } - - if (port == scanHost.SSHPort) - { - scanHost.SSH = isPortOpen; - } - else if (port == scanHost.TelnetPort) - { - scanHost.Telnet = isPortOpen; - } - else if (port == scanHost.HTTPPort) - { - scanHost.HTTP = isPortOpen; - } - else if (port == scanHost.HTTPSPort) - { - scanHost.HTTPS = isPortOpen; - } - else if (port == scanHost.RloginPort) - { - scanHost.Rlogin = isPortOpen; - } - else if (port == scanHost.RDPPort) - { - scanHost.RDP = isPortOpen; - } - else if (port == scanHost.VNCPort) - { - scanHost.VNC = isPortOpen; - } - } - } - try { - scanHost.HostName = Dns.GetHostEntry(scanHost.HostIp).HostName; + // ReSharper disable UnusedVariable + System.Net.Sockets.TcpClient tcpClient = new System.Net.Sockets.TcpClient(ipAddress.ToString(), port); + // ReSharper restore UnusedVariable + + isPortOpen = true; + scanHost.OpenPorts.Add(port); } catch (Exception) { + isPortOpen = false; + scanHost.ClosedPorts.Add(port); } - if (string.IsNullOrEmpty(scanHost.HostName)) + + if (port == scanHost.SSHPort) { - scanHost.HostName = scanHost.HostIp; + scanHost.SSH = isPortOpen; + } + else if (port == scanHost.TelnetPort) + { + scanHost.Telnet = isPortOpen; + } + else if (port == scanHost.HTTPPort) + { + scanHost.HTTP = isPortOpen; + } + else if (port == scanHost.HTTPSPort) + { + scanHost.HTTPS = isPortOpen; + } + else if (port == scanHost.RloginPort) + { + scanHost.Rlogin = isPortOpen; + } + else if (port == scanHost.RDPPort) + { + scanHost.RDP = isPortOpen; + } + else if (port == scanHost.VNCPort) + { + scanHost.VNC = isPortOpen; } - - _scannedHosts.Add(scanHost); - if (HostScannedEvent != null) - HostScannedEvent(scanHost, hostCount, _ipAddresses.Count); } - - if (ScanCompleteEvent != null) - ScanCompleteEvent(_scannedHosts); } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "StartScanBG failed (Tools.PortScan)" + Constants.vbNewLine + ex.Message, true); - } - } - - private static bool IsHostAlive(IPAddress ipAddress) - { - Ping pingSender = new Ping(); - PingReply pingReply; - + try { - pingReply = pingSender.Send(ipAddress); - - if (pingReply.Status == IPStatus.Success) - { - return true; - } - else - { - return false; - } + scanHost.HostName = Dns.GetHostEntry(scanHost.HostIp).HostName; } catch (Exception) { - return false; } + if (string.IsNullOrEmpty(scanHost.HostName)) + { + scanHost.HostName = scanHost.HostIp; + } + + _scannedHosts.Add(scanHost); + if (HostScannedEvent != null) + HostScannedEvent(scanHost, hostCount, _ipAddresses.Count); } - - private static IPAddress[] IpAddressArrayFromRange(IPAddress ipAddress1, IPAddress ipAddress2) - { - IPAddress startIpAddress = IpAddressMin(ipAddress1, ipAddress2); - IPAddress endIpAddress = IpAddressMax(ipAddress1, ipAddress2); - - int startAddress = IpAddressToInt32(startIpAddress); - int endAddress = IpAddressToInt32(endIpAddress); - int addressCount = endAddress - startAddress; - - IPAddress[] addressArray = new IPAddress[addressCount + 1]; - int index = 0; - for (int address = startAddress; address <= endAddress; address++) - { - addressArray[index] = IpAddressFromInt32(address); - index++; - } - - return addressArray; - } - - private static IPAddress IpAddressMin(IPAddress ipAddress1, IPAddress ipAddress2) - { - if (IpAddressCompare(ipAddress1, ipAddress2) < 0) // ipAddress1 < ipAddress2 - { - return ipAddress1; - } - else - { - return ipAddress2; - } - } - - private static IPAddress IpAddressMax(IPAddress ipAddress1, IPAddress ipAddress2) - { - if (IpAddressCompare(ipAddress1, ipAddress2) > 0) // ipAddress1 > ipAddress2 - { - return ipAddress1; - } - else - { - return ipAddress2; - } - } - - private static int IpAddressCompare(IPAddress ipAddress1, IPAddress ipAddress2) - { - return IpAddressToInt32(ipAddress1) - IpAddressToInt32(ipAddress2); - } - - private static int IpAddressToInt32(IPAddress ipAddress) - { - if (!(ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)) - { - throw (new ArgumentException("ipAddress")); - } - - byte[] addressBytes = ipAddress.GetAddressBytes(); // in network order (big-endian) - if (BitConverter.IsLittleEndian) - { - Array.Reverse(addressBytes); // to host order (little-endian) - } - Debug.Assert(addressBytes.Length == 4); - - return BitConverter.ToInt32(addressBytes, 0); - } - - private static IPAddress IpAddressFromInt32(int ipAddress) - { - byte[] addressBytes = BitConverter.GetBytes(ipAddress); // in host order - if (BitConverter.IsLittleEndian) - { - Array.Reverse(addressBytes); // to network order (big-endian) - } - Debug.Assert(addressBytes.Length == 4); - - return new ipAddress(addressBytes); - } -#endregion - -#region Events - public delegate void BeginHostScanEventHandler(string host); - private BeginHostScanEventHandler BeginHostScanEvent; - - public event BeginHostScanEventHandler BeginHostScan - { - add - { - BeginHostScanEvent = (BeginHostScanEventHandler) System.Delegate.Combine(BeginHostScanEvent, value); - } - remove - { - BeginHostScanEvent = (BeginHostScanEventHandler) System.Delegate.Remove(BeginHostScanEvent, value); - } - } - - public delegate void HostScannedEventHandler(ScanHost scanHost, int scannedHostCount, int totalHostCount); - private HostScannedEventHandler HostScannedEvent; - - public event HostScannedEventHandler HostScanned - { - add - { - HostScannedEvent = (HostScannedEventHandler) System.Delegate.Combine(HostScannedEvent, value); - } - remove - { - HostScannedEvent = (HostScannedEventHandler) System.Delegate.Remove(HostScannedEvent, value); - } - } - - public delegate void ScanCompleteEventHandler(List hosts); - private ScanCompleteEventHandler ScanCompleteEvent; - - public event ScanCompleteEventHandler ScanComplete - { - add - { - ScanCompleteEvent = (ScanCompleteEventHandler) System.Delegate.Combine(ScanCompleteEvent, value); - } - remove - { - ScanCompleteEvent = (ScanCompleteEventHandler) System.Delegate.Remove(ScanCompleteEvent, value); - } - } - -#endregion + + if (ScanCompleteEvent != null) + ScanCompleteEvent(_scannedHosts); } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "StartScanBG failed (Tools.PortScan)" + Constants.vbNewLine + ex.Message, true); + } + } + + private static bool IsHostAlive(IPAddress ipAddress) + { + Ping pingSender = new Ping(); + PingReply pingReply; + + try + { + pingReply = pingSender.Send(ipAddress); + + if (pingReply.Status == IPStatus.Success) + { + return true; + } + else + { + return false; + } + } + catch (Exception) + { + return false; + } + } + + private static IPAddress[] IpAddressArrayFromRange(IPAddress ipAddress1, IPAddress ipAddress2) + { + IPAddress startIpAddress = IpAddressMin(ipAddress1, ipAddress2); + IPAddress endIpAddress = IpAddressMax(ipAddress1, ipAddress2); + + int startAddress = IpAddressToInt32(startIpAddress); + int endAddress = IpAddressToInt32(endIpAddress); + int addressCount = endAddress - startAddress; + + IPAddress[] addressArray = new IPAddress[addressCount + 1]; + int index = 0; + for (int address = startAddress; address <= endAddress; address++) + { + addressArray[index] = IpAddressFromInt32(address); + index++; + } + + return addressArray; + } + + private static IPAddress IpAddressMin(IPAddress ipAddress1, IPAddress ipAddress2) + { + if (IpAddressCompare(ipAddress1, ipAddress2) < 0) // ipAddress1 < ipAddress2 + { + return ipAddress1; + } + else + { + return ipAddress2; + } + } + + private static IPAddress IpAddressMax(IPAddress ipAddress1, IPAddress ipAddress2) + { + if (IpAddressCompare(ipAddress1, ipAddress2) > 0) // ipAddress1 > ipAddress2 + { + return ipAddress1; + } + else + { + return ipAddress2; + } + } + + private static int IpAddressCompare(IPAddress ipAddress1, IPAddress ipAddress2) + { + return IpAddressToInt32(ipAddress1) - IpAddressToInt32(ipAddress2); + } + + private static int IpAddressToInt32(IPAddress ipAddress) + { + if (!(ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)) + { + throw (new ArgumentException("ipAddress")); + } + + byte[] addressBytes = ipAddress.GetAddressBytes(); // in network order (big-endian) + if (BitConverter.IsLittleEndian) + { + Array.Reverse(addressBytes); // to host order (little-endian) + } + Debug.Assert(addressBytes.Length == 4); + + return BitConverter.ToInt32(addressBytes, 0); + } + + private static IPAddress IpAddressFromInt32(int ipAddress) + { + byte[] addressBytes = BitConverter.GetBytes(ipAddress); // in host order + if (BitConverter.IsLittleEndian) + { + Array.Reverse(addressBytes); // to network order (big-endian) + } + Debug.Assert(addressBytes.Length == 4); + + return new ipAddress(addressBytes); + } + #endregion + + #region Events + public delegate void BeginHostScanEventHandler(string host); + private BeginHostScanEventHandler BeginHostScanEvent; + + public event BeginHostScanEventHandler BeginHostScan + { + add + { + BeginHostScanEvent = (BeginHostScanEventHandler) System.Delegate.Combine(BeginHostScanEvent, value); + } + remove + { + BeginHostScanEvent = (BeginHostScanEventHandler) System.Delegate.Remove(BeginHostScanEvent, value); + } + } + + public delegate void HostScannedEventHandler(ScanHost scanHost, int scannedHostCount, int totalHostCount); + private HostScannedEventHandler HostScannedEvent; + + public event HostScannedEventHandler HostScanned + { + add + { + HostScannedEvent = (HostScannedEventHandler) System.Delegate.Combine(HostScannedEvent, value); + } + remove + { + HostScannedEvent = (HostScannedEventHandler) System.Delegate.Remove(HostScannedEvent, value); + } + } + + public delegate void ScanCompleteEventHandler(List hosts); + private ScanCompleteEventHandler ScanCompleteEvent; + + public event ScanCompleteEventHandler ScanComplete + { + add + { + ScanCompleteEvent = (ScanCompleteEventHandler) System.Delegate.Combine(ScanCompleteEvent, value); + } + remove + { + ScanCompleteEvent = (ScanCompleteEventHandler) System.Delegate.Remove(ScanCompleteEvent, value); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/Tree/Tree.Node.cs b/mRemoteV1/CS/Tree/Tree.Node.cs index f03947f7d..1410d4cb4 100644 --- a/mRemoteV1/CS/Tree/Tree.Node.cs +++ b/mRemoteV1/CS/Tree/Tree.Node.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,689 +8,692 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.DirectoryServices; namespace mRemoteNG.Tree { public class Node + { + #region Enums + public enum Type { - public enum Type + None = 0, + Root = 1, + Container = 2, + Connection = 3, + PuttyRoot = 4, + PuttySession = 5 + } + #endregion + + #region Public Properties + private static TreeView _TreeView; + public static TreeView TreeView + { + get { - None = 0, - Root = 1, - Container = 2, - Connection = 3, - PuttyRoot = 4, - PuttySession = 5 + return _TreeView; } - - private static TreeView _TreeView; -public static TreeView TreeView + set { - get - { - return _TreeView; - } - set - { - _TreeView = value; - } + _TreeView = value; } + } -public static TreeNode SelectedNode + public static TreeNode SelectedNode + { + get { - get - { - return _TreeView.SelectedNode; - } - set - { - treeNodeToBeSelected = value; - SelectNode(); - } + return _TreeView.SelectedNode; } - - private static TreeNode treeNodeToBeSelected; - private delegate void SelectNodeCB(); - private static void SelectNode() + set { - if (_TreeView.InvokeRequired == true) - { - SelectNodeCB d = new SelectNodeCB(SelectNode); - _TreeView.Invoke(d); - } - else - { - _TreeView.SelectedNode = treeNodeToBeSelected; - } + treeNodeToBeSelected = value; + SelectNode(); } - - - public static string GetConstantID(TreeNode node) + } + #endregion + + #region Public Methods + private static TreeNode treeNodeToBeSelected; + private delegate void SelectNodeCB(); + private static void SelectNode() + { + if (_TreeView.InvokeRequired == true) { - if (GetNodeType(node) == Type.Connection) - { - return (node.Tag as mRemoteNG.Connection.Info).ConstantID; - } - else if (GetNodeType(node) == Type.Container) - { - return (node.Tag as mRemoteNG.Container.Info).ConnectionInfo.ConstantID; - } + SelectNodeCB d = new SelectNodeCB(SelectNode); + _TreeView.Invoke(d); + } + else + { + _TreeView.SelectedNode = treeNodeToBeSelected; + } + } + + + public static string GetConstantID(TreeNode node) + { + if (GetNodeType(node) == Type.Connection) + { + return (node.Tag as mRemoteNG.Connection.Info).ConstantID; + } + else if (GetNodeType(node) == Type.Container) + { + return (node.Tag as mRemoteNG.Container.Info).ConnectionInfo.ConstantID; + } - return null; - } + return null; + } - public static TreeNode GetNodeFromPositionID(int id) + public static TreeNode GetNodeFromPositionID(int id) + { + foreach (Connection.Info conI in Runtime.ConnectionList) { - foreach (Connection.Info conI in ConnectionList) + if (conI.PositionID == id) { - if (conI.PositionID == id) + if (conI.IsContainer) { - if (conI.IsContainer) - { - return (conI.Parent as Container.Info).TreeNode; - } - else - { - return conI.TreeNode; - } - } - } - - return null; - } - - public static TreeNode GetNodeFromConstantID(string id) - { - foreach (Connection.Info conI in ConnectionList) - { - if (conI.ConstantID == id) - { - if (conI.IsContainer) - { - return (conI.Parent as Container.Info).TreeNode; - } - else - { - return conI.TreeNode; - } - } - } - - return null; - } - - public static Tree.Node.Type GetNodeType(TreeNode treeNode) - { - try - { - if (treeNode == null) - { - return Type.None; - } - - if (treeNode.Tag == null) - { - return Type.None; - } - - if (treeNode.Tag is Root.PuttySessions.Info) - { - return Type.PuttyRoot; - } - else if (treeNode.Tag is Root.Info) - { - return Type.Root; - } - else if (treeNode.Tag is Container.Info) - { - return Type.Container; - } - else if (treeNode.Tag is Connection.PuttySession.Info) - { - return Type.PuttySession; - } - else if (treeNode.Tag is Connection.Info) - { - return Type.Connection; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t get node type" + Constants.vbNewLine + ex.Message, true); - } - - return Type.None; - } - - public static Tree.Node.Type GetNodeTypeFromString(string str) - { - try - { - switch (str.ToLower()) - { - case "root": - return Type.Root; - case "container": - return Type.Container; - case "connection": - return Type.Connection; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t get node type from string" + Constants.vbNewLine + ex.Message, true); - } - - return Type.None; - } - - public static TreeNode Find(TreeNode treeNode, string searchFor) - { - TreeNode tmpNode = default(TreeNode); - - try - { - if ((treeNode.Text.ToLower()).IndexOf(searchFor.ToLower()) + 1 > 0) - { - return treeNode; + return (conI.Parent as Container.Info).TreeNode; } else { - foreach (TreeNode childNode in treeNode.Nodes) - { - tmpNode = Find(childNode, searchFor); - if (!(tmpNode == null)) - { - return tmpNode; - } - } + return conI.TreeNode; } } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Find node failed" + Constants.vbNewLine + ex.Message, true); - } - - return null; } - - public static TreeNode Find(TreeNode treeNode, Connection.Info conInfo) - { - TreeNode tmpNode = default(TreeNode); - try + return null; + } + + public static TreeNode GetNodeFromConstantID(string id) + { + foreach (Connection.Info conI in Runtime.ConnectionList) + { + if (conI.ConstantID == id) { - if (treeNode.Tag == conInfo) + if (conI.IsContainer) { - return treeNode; + return (conI.Parent as Container.Info).TreeNode; } else { - foreach (TreeNode childNode in treeNode.Nodes) - { - tmpNode = Find(childNode, conInfo); - if (!(tmpNode == null)) - { - return tmpNode; - } - } + return conI.TreeNode; } } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Find node failed" + Constants.vbNewLine + ex.Message, true); - } + } - return null; - } + return null; + } - public static bool IsEmpty(TreeNode treeNode) + public static Tree.Node.Type GetNodeType(TreeNode treeNode) + { + try { - try - { - if (treeNode.Nodes.Count <= 0) - { - return false; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "IsEmpty (Tree.Node) failed" + Constants.vbNewLine + ex.Message, true); - } - - return true; - } - - - - public static TreeNode AddNode(Type nodeType, string name = null) - { - try - { - TreeNode treeNode = new TreeNode(); - string defaultName = ""; - - switch (nodeType) - { - case Type.Connection: - case Type.PuttySession: - defaultName = My.Language.strNewConnection; - treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; - treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; - break; - case Type.Container: - defaultName = My.Language.strNewFolder; - treeNode.ImageIndex = Images.Enums.TreeImage.Container; - treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container; - break; - case Type.Root: - defaultName = My.Language.strNewRoot; - treeNode.ImageIndex = Images.Enums.TreeImage.Root; - treeNode.SelectedImageIndex = Images.Enums.TreeImage.Root; - break; - } - - if (!string.IsNullOrEmpty(name)) - { - treeNode.Name = name; - } - else - { - treeNode.Name = defaultName; - } - treeNode.Text = treeNode.Name; - - return treeNode; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddNode failed" + Constants.vbNewLine + ex.Message, true); - } - - return null; - } - - public static void CloneNode(TreeNode oldTreeNode, TreeNode parentNode = null) - { - try - { - if (GetNodeType(oldTreeNode) == Type.Connection) - { - Connection.Info oldConnectionInfo = (Connection.Info) oldTreeNode.Tag; - - Connection.Info newConnectionInfo = oldConnectionInfo.Copy(); - Connection.Info.Inheritance newInheritance = oldConnectionInfo.Inherit.Copy(); - newInheritance.Parent = newConnectionInfo; - newConnectionInfo.Inherit = newInheritance; - - ConnectionList.Add(newConnectionInfo); - - TreeNode newTreeNode = new TreeNode(newConnectionInfo.Name); - newTreeNode.Tag = newConnectionInfo; - newTreeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; - newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; - - newConnectionInfo.TreeNode = newTreeNode; - - if (parentNode == null) - { - oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode); - TreeView.SelectedNode = newTreeNode; - } - else - { - Container.Info parentContainerInfo = parentNode.Tag as Container.Info; - if (parentContainerInfo != null) - { - newConnectionInfo.Parent = parentContainerInfo; - } - parentNode.Nodes.Add(newTreeNode); - } - } - else if (GetNodeType(oldTreeNode) == Type.Container) - { - Container.Info oldContainerInfo = (Container.Info) oldTreeNode.Tag; - - Container.Info newContainerInfo = oldContainerInfo.Copy(); - Connection.Info newConnectionInfo = oldContainerInfo.ConnectionInfo.Copy(); - newContainerInfo.ConnectionInfo = newConnectionInfo; - - TreeNode newTreeNode = new TreeNode(newContainerInfo.Name); - newTreeNode.Tag = newContainerInfo; - newTreeNode.ImageIndex = Images.Enums.TreeImage.Container; - newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Container; - newContainerInfo.ConnectionInfo.Parent = newContainerInfo; - - ContainerList.Add(newContainerInfo); - - if (parentNode == null) - { - oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode); - TreeView.SelectedNode = newTreeNode; - } - else - { - parentNode.Nodes.Add(newTreeNode); - } - - foreach (TreeNode childTreeNode in oldTreeNode.Nodes) - { - CloneNode(childTreeNode, newTreeNode); - } - - newTreeNode.Expand(); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, string.Format(My.Language.strErrorCloneNodeFailed, ex.Message)); - } - } - - public static void SetNodeImage(TreeNode treeNode, Images.Enums.TreeImage Img) - { - SetNodeImageIndex(treeNode, Img); - } - - private delegate void SetNodeImageIndexDelegate(TreeNode treeNode, int imageIndex); - private static void SetNodeImageIndex(TreeNode treeNode, int imageIndex) - { - if (treeNode == null || treeNode.TreeView == null) - { - return ; - } - if (treeNode.TreeView.InvokeRequired) - { - treeNode.TreeView.Invoke(new SetNodeImageIndexDelegate(SetNodeImageIndex), new object[] {treeNode, imageIndex}); - return ; - } - - treeNode.ImageIndex = imageIndex; - treeNode.SelectedImageIndex = imageIndex; - } - - // VBConversions Note: Former VB static variables moved to class level because they aren't supported in C#. - static TreeNode SetNodeToolTip_old_node = default(TreeNode); - - public static void SetNodeToolTip(MouseEventArgs e, ToolTip tTip) - { - try - { - if (My.Settings.Default.ShowDescriptionTooltipsInTree) - { - //Find the node under the mouse. - // static TreeNode old_node = default(TreeNode); VBConversions Note: Static variable moved to class level and renamed SetNodeToolTip_old_node. Local static variables are not supported in C#. - TreeNode new_node = _TreeView.GetNodeAt(e.X, e.Y); - if (new_node == SetNodeToolTip_old_node) - { - return; - } - SetNodeToolTip_old_node = new_node; - - //See if we have a node. - if (SetNodeToolTip_old_node == null) - { - tTip.SetToolTip(_TreeView, ""); - } - else - { - //Get this node's object data. - if (GetNodeType(SetNodeToolTip_old_node) == Type.Connection) - { - tTip.SetToolTip(_TreeView, (SetNodeToolTip_old_node.Tag as mRemoteNG.Connection.Info).Description); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SetNodeToolTip failed" + Constants.vbNewLine + ex.Message, true); - } - } - - - public static void DeleteSelectedNode() - { - try - { - if (SelectedNode == null) - { - return ; - } - - if (Tree.Node.GetNodeType(SelectedNode) == Type.Root) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "The root item cannot be deleted!"); - } - else if (Tree.Node.GetNodeType(SelectedNode) == Type.Container) - { - if (Tree.Node.IsEmpty(SelectedNode) == false) - { - if (Interaction.MsgBox(string.Format(My.Language.strConfirmDeleteNodeFolder, SelectedNode.Text), (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.YesNo | MsgBoxStyle.Question), null) == MsgBoxResult.Yes) - { - SelectedNode.Remove(); - } - } - else - { - if (Interaction.MsgBox(string.Format(My.Language.strConfirmDeleteNodeFolderNotEmpty, SelectedNode.Text), (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.YesNo | MsgBoxStyle.Question), null) == MsgBoxResult.Yes) - { - foreach (TreeNode tNode in SelectedNode.Nodes) - { - tNode.Remove(); - } - SelectedNode.Remove(); - } - } - } - else if (Tree.Node.GetNodeType(SelectedNode) == Type.Connection) - { - if (Interaction.MsgBox(string.Format(My.Language.strConfirmDeleteNodeConnection, SelectedNode.Text), (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.YesNo | MsgBoxStyle.Question), null) == MsgBoxResult.Yes) - { - SelectedNode.Remove(); - } - } - else - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Tree item type is unknown so it cannot be deleted!"); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Deleting selected node failed" + Constants.vbNewLine + ex.Message, true); - } - } - - public static void StartRenameSelectedNode() - { - if (SelectedNode != null) - { - SelectedNode.BeginEdit(); - } - } - - public static void FinishRenameSelectedNode(string newName) - { - if (newName == null) - { - return ; - } - - if (newName.Length > 0) - { - SelectedNode.Tag.Name = newName; - - if (My.Settings.Default.SetHostnameLikeDisplayName) - { - Connection.Info connectionInfo = SelectedNode.Tag as Connection.Info; - if (connectionInfo != null) - { - connectionInfo.Hostname = newName; - } - } - } - } - - public static void MoveNodeUp() - { - try - { - if (SelectedNode != null) - { - if (!(SelectedNode.PrevNode == null)) - { - TreeView.BeginUpdate(); - TreeView.Sorted = false; - - TreeNode newNode = SelectedNode.Clone(); - SelectedNode.Parent.Nodes.Insert(SelectedNode.Index - 1, newNode); - SelectedNode.Remove(); - SelectedNode = newNode; - - TreeView.EndUpdate(); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "MoveNodeUp failed" + Constants.vbNewLine + ex.Message, true); - } - } - - public static void MoveNodeDown() - { - try - { - if (SelectedNode != null) - { - if (!(SelectedNode.NextNode == null)) - { - TreeView.BeginUpdate(); - TreeView.Sorted = false; - - TreeNode newNode = SelectedNode.Clone(); - SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 2, newNode); - SelectedNode.Remove(); - SelectedNode = newNode; - - TreeView.EndUpdate(); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "MoveNodeDown failed" + Constants.vbNewLine + ex.Message, true); - } - } - - public static void ExpandAllNodes() - { - TreeView.BeginUpdate(); - TreeView.ExpandAll(); - TreeView.EndUpdate(); - } - - public static void CollapseAllNodes() - { - TreeView.BeginUpdate(); - foreach (TreeNode treeNode in TreeView.Nodes[0].Nodes) - { - treeNode.Collapse(false); - } - TreeView.EndUpdate(); - } - - public static void Sort(TreeNode treeNode, System.Windows.Forms.SortOrder sorting) - { - if (TreeView == null) - { - return ; - } - - TreeView.BeginUpdate(); - if (treeNode == null) { - if (TreeView.Nodes.Count > 0) - { - treeNode = TreeView.Nodes[0]; - } - else - { - return ; - } + return Type.None; } - else if (GetNodeType(treeNode) == Type.Connection) - { - treeNode = treeNode.Parent; - if (treeNode == null) - { - return ; - } - } - - Sort(treeNode, new Tools.Controls.TreeNodeSorter(sorting)); - - TreeView.EndUpdate(); - } - - // Adapted from http://www.codeproject.com/Tips/252234/ASP-NET-TreeView-Sort - private static void Sort(TreeNode treeNode, Tools.Controls.TreeNodeSorter nodeSorter) - { - foreach (TreeNode childNode in treeNode.Nodes) - { - Sort(childNode, nodeSorter); - } - - try - { - List sortedNodes = new List(); - TreeNode currentNode = null; - while (treeNode.Nodes.Count > 0) - { - foreach (TreeNode childNode in treeNode.Nodes) - { - if (currentNode == null || nodeSorter.Compare(childNode, currentNode) < 0) - { - currentNode = childNode; - } - } - treeNode.Nodes.Remove(currentNode); - sortedNodes.Add(currentNode); - currentNode = null; - } - foreach (TreeNode childNode in sortedNodes) - { - treeNode.Nodes.Add(childNode); - } - } - catch (Exception ex) + if (treeNode.Tag == null) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Sort nodes failed" + Constants.vbNewLine + ex.Message, true); + return Type.None; + } + + if (treeNode.Tag is Root.PuttySessions.Info) + { + return Type.PuttyRoot; + } + else if (treeNode.Tag is Root.Info) + { + return Type.Root; + } + else if (treeNode.Tag is Container.Info) + { + return Type.Container; + } + else if (treeNode.Tag is Connection.PuttySession.Info) + { + return Type.PuttySession; + } + else if (treeNode.Tag is Connection.Info) + { + return Type.Connection; } } - - private delegate void ResetTreeDelegate(); - public static void ResetTree() + catch (Exception ex) { - if (TreeView.InvokeRequired) + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t get node type" + Constants.vbNewLine + ex.Message, true); + } + + return Type.None; + } + + public static Tree.Node.Type GetNodeTypeFromString(string str) + { + try + { + switch (str.ToLower()) { - ResetTreeDelegate resetTreeDelegate = new ResetTreeDelegate(ResetTree); - Windows.treeForm.Invoke(resetTreeDelegate); + case "root": + return Type.Root; + case "container": + return Type.Container; + case "connection": + return Type.Connection; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t get node type from string" + Constants.vbNewLine + ex.Message, true); + } + + return Type.None; + } + + public static TreeNode Find(TreeNode treeNode, string searchFor) + { + TreeNode tmpNode = default(TreeNode); + + try + { + if ((treeNode.Text.ToLower()).IndexOf(searchFor.ToLower()) + 1 > 0) + { + return treeNode; } else { - TreeView.BeginUpdate(); - TreeView.Nodes.Clear(); - TreeView.Nodes.Add(My.Language.strConnections); - TreeView.EndUpdate(); + foreach (TreeNode childNode in treeNode.Nodes) + { + tmpNode = Find(childNode, searchFor); + if (!(tmpNode == null)) + { + return tmpNode; + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Find node failed" + Constants.vbNewLine + ex.Message, true); + } + + return null; + } + + public static TreeNode Find(TreeNode treeNode, Connection.Info conInfo) + { + TreeNode tmpNode = default(TreeNode); + + try + { + if (treeNode.Tag == conInfo) + { + return treeNode; + } + else + { + foreach (TreeNode childNode in treeNode.Nodes) + { + tmpNode = Find(childNode, conInfo); + if (!(tmpNode == null)) + { + return tmpNode; + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Find node failed" + Constants.vbNewLine + ex.Message, true); + } + + return null; + } + + public static bool IsEmpty(TreeNode treeNode) + { + try + { + if (treeNode.Nodes.Count <= 0) + { + return false; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "IsEmpty (Tree.Node) failed" + Constants.vbNewLine + ex.Message, true); + } + + return true; + } + + + + public static TreeNode AddNode(Type nodeType, string name = null) + { + try + { + TreeNode treeNode = new TreeNode(); + string defaultName = ""; + + switch (nodeType) + { + case Type.Connection: + case Type.PuttySession: + defaultName = My.Language.strNewConnection; + treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; + treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; + break; + case Type.Container: + defaultName = My.Language.strNewFolder; + treeNode.ImageIndex = Images.Enums.TreeImage.Container; + treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container; + break; + case Type.Root: + defaultName = My.Language.strNewRoot; + treeNode.ImageIndex = Images.Enums.TreeImage.Root; + treeNode.SelectedImageIndex = Images.Enums.TreeImage.Root; + break; + } + + if (!string.IsNullOrEmpty(name)) + { + treeNode.Name = name; + } + else + { + treeNode.Name = defaultName; + } + treeNode.Text = treeNode.Name; + + return treeNode; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddNode failed" + Constants.vbNewLine + ex.Message, true); + } + + return null; + } + + public static void CloneNode(TreeNode oldTreeNode, TreeNode parentNode = null) + { + try + { + if (GetNodeType(oldTreeNode) == Type.Connection) + { + Connection.Info oldConnectionInfo = (Connection.Info) oldTreeNode.Tag; + + Connection.Info newConnectionInfo = oldConnectionInfo.Copy(); + Connection.Info.Inheritance newInheritance = oldConnectionInfo.Inherit.Copy(); + newInheritance.Parent = newConnectionInfo; + newConnectionInfo.Inherit = newInheritance; + + Runtime.ConnectionList.Add(newConnectionInfo); + + TreeNode newTreeNode = new TreeNode(newConnectionInfo.Name); + newTreeNode.Tag = newConnectionInfo; + newTreeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed; + newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed; + + newConnectionInfo.TreeNode = newTreeNode; + + if (parentNode == null) + { + oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode); + TreeView.SelectedNode = newTreeNode; + } + else + { + Container.Info parentContainerInfo = parentNode.Tag as Container.Info; + if (parentContainerInfo != null) + { + newConnectionInfo.Parent = parentContainerInfo; + } + parentNode.Nodes.Add(newTreeNode); + } + } + else if (GetNodeType(oldTreeNode) == Type.Container) + { + Container.Info oldContainerInfo = (Container.Info) oldTreeNode.Tag; + + Container.Info newContainerInfo = oldContainerInfo.Copy(); + Connection.Info newConnectionInfo = oldContainerInfo.ConnectionInfo.Copy(); + newContainerInfo.ConnectionInfo = newConnectionInfo; + + TreeNode newTreeNode = new TreeNode(newContainerInfo.Name); + newTreeNode.Tag = newContainerInfo; + newTreeNode.ImageIndex = Images.Enums.TreeImage.Container; + newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Container; + newContainerInfo.ConnectionInfo.Parent = newContainerInfo; + + Runtime.ContainerList.Add(newContainerInfo); + + if (parentNode == null) + { + oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode); + TreeView.SelectedNode = newTreeNode; + } + else + { + parentNode.Nodes.Add(newTreeNode); + } + + foreach (TreeNode childTreeNode in oldTreeNode.Nodes) + { + CloneNode(childTreeNode, newTreeNode); + } + + newTreeNode.Expand(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, string.Format(My.Language.strErrorCloneNodeFailed, ex.Message)); + } + } + + public static void SetNodeImage(TreeNode treeNode, Images.Enums.TreeImage Img) + { + SetNodeImageIndex(treeNode, Img); + } + + private delegate void SetNodeImageIndexDelegate(TreeNode treeNode, int imageIndex); + private static void SetNodeImageIndex(TreeNode treeNode, int imageIndex) + { + if (treeNode == null || treeNode.TreeView == null) + { + return ; + } + if (treeNode.TreeView.InvokeRequired) + { + treeNode.TreeView.Invoke(new SetNodeImageIndexDelegate(SetNodeImageIndex), new object[] {treeNode, imageIndex}); + return ; + } + + treeNode.ImageIndex = imageIndex; + treeNode.SelectedImageIndex = imageIndex; + } + + // VBConversions Note: Former VB static variables moved to class level because they aren't supported in C#. + static TreeNode SetNodeToolTip_old_node = default(TreeNode); + public static void SetNodeToolTip(MouseEventArgs e, ToolTip tTip) + { + try + { + if (My.Settings.Default.ShowDescriptionTooltipsInTree) + { + //Find the node under the mouse. + // static TreeNode old_node = default(TreeNode); VBConversions Note: Static variable moved to class level and renamed SetNodeToolTip_old_node. Local static variables are not supported in C#. + TreeNode new_node = _TreeView.GetNodeAt(e.X, e.Y); + if (new_node == SetNodeToolTip_old_node) + { + return; + } + SetNodeToolTip_old_node = new_node; + + //See if we have a node. + if (SetNodeToolTip_old_node == null) + { + tTip.SetToolTip(_TreeView, ""); + } + else + { + //Get this node's object data. + if (GetNodeType(SetNodeToolTip_old_node) == Type.Connection) + { + tTip.SetToolTip(_TreeView, (SetNodeToolTip_old_node.Tag as mRemoteNG.Connection.Info).Description); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SetNodeToolTip failed" + Constants.vbNewLine + ex.Message, true); + } + } + + + public static void DeleteSelectedNode() + { + try + { + if (SelectedNode == null) + { + return ; + } + + if (Tree.Node.GetNodeType(SelectedNode) == Type.Root) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "The root item cannot be deleted!"); + } + else if (Tree.Node.GetNodeType(SelectedNode) == Type.Container) + { + if (Tree.Node.IsEmpty(SelectedNode) == false) + { + if (Interaction.MsgBox(string.Format(My.Language.strConfirmDeleteNodeFolder, SelectedNode.Text), (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.YesNo | MsgBoxStyle.Question), null) == MsgBoxResult.Yes) + { + SelectedNode.Remove(); + } + } + else + { + if (Interaction.MsgBox(string.Format(My.Language.strConfirmDeleteNodeFolderNotEmpty, SelectedNode.Text), (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.YesNo | MsgBoxStyle.Question), null) == MsgBoxResult.Yes) + { + foreach (TreeNode tNode in SelectedNode.Nodes) + { + tNode.Remove(); + } + SelectedNode.Remove(); + } + } + } + else if (Tree.Node.GetNodeType(SelectedNode) == Type.Connection) + { + if (Interaction.MsgBox(string.Format(My.Language.strConfirmDeleteNodeConnection, SelectedNode.Text), (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.YesNo | MsgBoxStyle.Question), null) == MsgBoxResult.Yes) + { + SelectedNode.Remove(); + } + } + else + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Tree item type is unknown so it cannot be deleted!"); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Deleting selected node failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public static void StartRenameSelectedNode() + { + if (SelectedNode != null) + { + SelectedNode.BeginEdit(); + } + } + + public static void FinishRenameSelectedNode(string newName) + { + if (newName == null) + { + return ; + } + + if (newName.Length > 0) + { + SelectedNode.Tag.Name = newName; + + if (My.Settings.Default.SetHostnameLikeDisplayName) + { + Connection.Info connectionInfo = SelectedNode.Tag as Connection.Info; + if (connectionInfo != null) + { + connectionInfo.Hostname = newName; + } } } } -} + + public static void MoveNodeUp() + { + try + { + if (SelectedNode != null) + { + if (!(SelectedNode.PrevNode == null)) + { + TreeView.BeginUpdate(); + TreeView.Sorted = false; + + TreeNode newNode = (TreeNode)SelectedNode.Clone(); + SelectedNode.Parent.Nodes.Insert(SelectedNode.Index - 1, newNode); + SelectedNode.Remove(); + SelectedNode = newNode; + + TreeView.EndUpdate(); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "MoveNodeUp failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public static void MoveNodeDown() + { + try + { + if (SelectedNode != null) + { + if (!(SelectedNode.NextNode == null)) + { + TreeView.BeginUpdate(); + TreeView.Sorted = false; + + TreeNode newNode = (TreeNode)SelectedNode.Clone(); + SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 2, newNode); + SelectedNode.Remove(); + SelectedNode = newNode; + + TreeView.EndUpdate(); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "MoveNodeDown failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public static void ExpandAllNodes() + { + TreeView.BeginUpdate(); + TreeView.ExpandAll(); + TreeView.EndUpdate(); + } + + public static void CollapseAllNodes() + { + TreeView.BeginUpdate(); + foreach (TreeNode treeNode in TreeView.Nodes[0].Nodes) + { + treeNode.Collapse(false); + } + TreeView.EndUpdate(); + } + + public static void Sort(TreeNode treeNode, System.Windows.Forms.SortOrder sorting) + { + if (TreeView == null) + { + return ; + } + + TreeView.BeginUpdate(); + + if (treeNode == null) + { + if (TreeView.Nodes.Count > 0) + { + treeNode = TreeView.Nodes[0]; + } + else + { + return ; + } + } + else if (GetNodeType(treeNode) == Type.Connection) + { + treeNode = treeNode.Parent; + if (treeNode == null) + { + return ; + } + } + + Sort(treeNode, new Tools.Controls.TreeNodeSorter(sorting)); + + TreeView.EndUpdate(); + } + + // Adapted from http://www.codeproject.com/Tips/252234/ASP-NET-TreeView-Sort + private static void Sort(TreeNode treeNode, Tools.Controls.TreeNodeSorter nodeSorter) + { + foreach (TreeNode childNode in treeNode.Nodes) + { + Sort(childNode, nodeSorter); + } + + try + { + List sortedNodes = new List(); + TreeNode currentNode = null; + while (treeNode.Nodes.Count > 0) + { + foreach (TreeNode childNode in treeNode.Nodes) + { + if (currentNode == null || nodeSorter.Compare(childNode, currentNode) < 0) + { + currentNode = childNode; + } + } + treeNode.Nodes.Remove(currentNode); + sortedNodes.Add(currentNode); + currentNode = null; + } + + foreach (TreeNode childNode in sortedNodes) + { + treeNode.Nodes.Add(childNode); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Sort nodes failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private delegate void ResetTreeDelegate(); + public static void ResetTree() + { + if (TreeView.InvokeRequired) + { + ResetTreeDelegate resetTreeDelegate = new ResetTreeDelegate(ResetTree); + Windows.treeForm.Invoke(resetTreeDelegate); + } + else + { + TreeView.BeginUpdate(); + TreeView.Nodes.Clear(); + TreeView.Nodes.Add(My.Language.strConnections); + TreeView.EndUpdate(); + } + } + #endregion + } +} \ No newline at end of file diff --git a/mRemoteV1/CS/UI/UI.Window.About.cs b/mRemoteV1/CS/UI/UI.Window.About.cs index 01f305605..7ee98ff07 100644 --- a/mRemoteV1/CS/UI/UI.Window.About.cs +++ b/mRemoteV1/CS/UI/UI.Window.About.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,352 +8,349 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using WeifenLuo.WinFormsUI.Docking; using System.IO; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { - public class About : Base + public class About : Base + { + #region Form Init + internal System.Windows.Forms.Label lblCopyright; + internal System.Windows.Forms.Label lblTitle; + internal System.Windows.Forms.Label lblVersion; + internal System.Windows.Forms.Label lblLicense; + internal System.Windows.Forms.TextBox txtChangeLog; + internal System.Windows.Forms.Label lblChangeLog; + internal System.Windows.Forms.Panel pnlBottom; + internal System.Windows.Forms.PictureBox pbLogo; + internal System.Windows.Forms.Label lblEdition; + internal System.Windows.Forms.LinkLabel llblFAMFAMFAM; + internal System.Windows.Forms.LinkLabel llblMagicLibrary; + internal System.Windows.Forms.LinkLabel llblWeifenLuo; + internal System.Windows.Forms.Panel pnlTop; + + private void InitializeComponent() + { + this.pnlTop = new System.Windows.Forms.Panel(); + this.Load += new System.EventHandler(About_Load); + this.lblEdition = new System.Windows.Forms.Label(); + this.pbLogo = new System.Windows.Forms.PictureBox(); + this.pnlBottom = new System.Windows.Forms.Panel(); + this.llblWeifenLuo = new System.Windows.Forms.LinkLabel(); + this.llblWeifenLuo.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblWeifenLuo_LinkClicked); + this.llblMagicLibrary = new System.Windows.Forms.LinkLabel(); + this.llblMagicLibrary.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblMagicLibrary_LinkClicked); + this.llblFAMFAMFAM = new System.Windows.Forms.LinkLabel(); + this.llblFAMFAMFAM.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblFAMFAMFAM_LinkClicked); + this.txtChangeLog = new System.Windows.Forms.TextBox(); + this.lblTitle = new System.Windows.Forms.Label(); + this.lblVersion = new System.Windows.Forms.Label(); + this.lblChangeLog = new System.Windows.Forms.Label(); + this.lblLicense = new System.Windows.Forms.Label(); + this.lblCopyright = new System.Windows.Forms.Label(); + this.pnlTop.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbLogo).BeginInit(); + this.pnlBottom.SuspendLayout(); + this.SuspendLayout(); + // + //pnlTop + // + this.pnlTop.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlTop.BackColor = System.Drawing.Color.Black; + this.pnlTop.Controls.Add(this.lblEdition); + this.pnlTop.Controls.Add(this.pbLogo); + this.pnlTop.ForeColor = System.Drawing.Color.White; + this.pnlTop.Location = new System.Drawing.Point(-1, -1); + this.pnlTop.Name = "pnlTop"; + this.pnlTop.Size = new System.Drawing.Size(788, 145); + this.pnlTop.TabIndex = 0; + // + //lblEdition + // + this.lblEdition.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); + this.lblEdition.BackColor = System.Drawing.Color.Black; + this.lblEdition.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (14.25F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblEdition.ForeColor = System.Drawing.Color.White; + this.lblEdition.Location = new System.Drawing.Point(512, 112); + this.lblEdition.Name = "lblEdition"; + this.lblEdition.Size = new System.Drawing.Size(264, 24); + this.lblEdition.TabIndex = 0; + this.lblEdition.Text = "Edition"; + this.lblEdition.TextAlign = System.Drawing.ContentAlignment.BottomRight; + this.lblEdition.Visible = false; + // + //pbLogo + // + this.pbLogo.Image = global::My.Resources.Resources.Logo; + this.pbLogo.Location = new System.Drawing.Point(8, 8); + this.pbLogo.Name = "pbLogo"; + this.pbLogo.Size = new System.Drawing.Size(492, 128); + this.pbLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pbLogo.TabIndex = 1; + this.pbLogo.TabStop = false; + // + //pnlBottom + // + this.pnlBottom.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlBottom.BackColor = System.Drawing.SystemColors.Control; + this.pnlBottom.Controls.Add(this.llblWeifenLuo); + this.pnlBottom.Controls.Add(this.llblMagicLibrary); + this.pnlBottom.Controls.Add(this.llblFAMFAMFAM); + this.pnlBottom.Controls.Add(this.txtChangeLog); + this.pnlBottom.Controls.Add(this.lblTitle); + this.pnlBottom.Controls.Add(this.lblVersion); + this.pnlBottom.Controls.Add(this.lblChangeLog); + this.pnlBottom.Controls.Add(this.lblLicense); + this.pnlBottom.Controls.Add(this.lblCopyright); + this.pnlBottom.ForeColor = System.Drawing.SystemColors.ControlText; + this.pnlBottom.Location = new System.Drawing.Point(-1, 144); + this.pnlBottom.Name = "pnlBottom"; + this.pnlBottom.Size = new System.Drawing.Size(788, 418); + this.pnlBottom.TabIndex = 1; + // + //llblWeifenLuo + // + this.llblWeifenLuo.AutoSize = true; + this.llblWeifenLuo.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.llblWeifenLuo.ForeColor = System.Drawing.SystemColors.ControlText; + this.llblWeifenLuo.LinkColor = System.Drawing.Color.Blue; + this.llblWeifenLuo.Location = new System.Drawing.Point(16, 158); + this.llblWeifenLuo.Name = "llblWeifenLuo"; + this.llblWeifenLuo.Size = new System.Drawing.Size(78, 22); + this.llblWeifenLuo.TabIndex = 9; + this.llblWeifenLuo.TabStop = true; + this.llblWeifenLuo.Text = "WeifenLuo"; + this.llblWeifenLuo.UseCompatibleTextRendering = true; + // + //llblMagicLibrary + // + this.llblMagicLibrary.AutoSize = true; + this.llblMagicLibrary.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.llblMagicLibrary.ForeColor = System.Drawing.SystemColors.ControlText; + this.llblMagicLibrary.LinkColor = System.Drawing.Color.Blue; + this.llblMagicLibrary.Location = new System.Drawing.Point(16, 136); + this.llblMagicLibrary.Name = "llblMagicLibrary"; + this.llblMagicLibrary.Size = new System.Drawing.Size(92, 22); + this.llblMagicLibrary.TabIndex = 8; + this.llblMagicLibrary.TabStop = true; + this.llblMagicLibrary.Text = "MagicLibrary"; + this.llblMagicLibrary.UseCompatibleTextRendering = true; + // + //llblFAMFAMFAM + // + this.llblFAMFAMFAM.AutoSize = true; + this.llblFAMFAMFAM.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.llblFAMFAMFAM.ForeColor = System.Drawing.SystemColors.ControlText; + this.llblFAMFAMFAM.LinkColor = System.Drawing.Color.Blue; + this.llblFAMFAMFAM.Location = new System.Drawing.Point(16, 116); + this.llblFAMFAMFAM.Name = "llblFAMFAMFAM"; + this.llblFAMFAMFAM.Size = new System.Drawing.Size(101, 22); + this.llblFAMFAMFAM.TabIndex = 4; + this.llblFAMFAMFAM.TabStop = true; + this.llblFAMFAMFAM.Text = "FAMFAMFAM"; + this.llblFAMFAMFAM.UseCompatibleTextRendering = true; + // + //txtChangeLog + // + this.txtChangeLog.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtChangeLog.BackColor = System.Drawing.SystemColors.Control; + this.txtChangeLog.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtChangeLog.Cursor = System.Windows.Forms.Cursors.Default; + this.txtChangeLog.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (9.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.txtChangeLog.ForeColor = System.Drawing.SystemColors.ControlText; + this.txtChangeLog.Location = new System.Drawing.Point(24, 224); + this.txtChangeLog.Multiline = true; + this.txtChangeLog.Name = "txtChangeLog"; + this.txtChangeLog.ReadOnly = true; + this.txtChangeLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtChangeLog.Size = new System.Drawing.Size(760, 192); + this.txtChangeLog.TabIndex = 7; + this.txtChangeLog.TabStop = false; + // + //lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (14.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblTitle.ForeColor = System.Drawing.SystemColors.ControlText; + this.lblTitle.Location = new System.Drawing.Point(16, 16); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(122, 27); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "mRemoteNG"; + this.lblTitle.UseCompatibleTextRendering = true; + // + //lblVersion + // + this.lblVersion.AutoSize = true; + this.lblVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblVersion.ForeColor = System.Drawing.SystemColors.ControlText; + this.lblVersion.Location = new System.Drawing.Point(16, 56); + this.lblVersion.Name = "lblVersion"; + this.lblVersion.Size = new System.Drawing.Size(57, 22); + this.lblVersion.TabIndex = 1; + this.lblVersion.Text = "Version"; + this.lblVersion.UseCompatibleTextRendering = true; + // + //lblChangeLog + // + this.lblChangeLog.AutoSize = true; + this.lblChangeLog.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblChangeLog.ForeColor = System.Drawing.SystemColors.ControlText; + this.lblChangeLog.Location = new System.Drawing.Point(16, 199); + this.lblChangeLog.Name = "lblChangeLog"; + this.lblChangeLog.Size = new System.Drawing.Size(92, 22); + this.lblChangeLog.TabIndex = 6; + this.lblChangeLog.Text = "Change Log:"; + this.lblChangeLog.UseCompatibleTextRendering = true; + // + //lblLicense + // + this.lblLicense.AutoSize = true; + this.lblLicense.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblLicense.ForeColor = System.Drawing.SystemColors.ControlText; + this.lblLicense.Location = new System.Drawing.Point(16, 96); + this.lblLicense.Name = "lblLicense"; + this.lblLicense.Size = new System.Drawing.Size(58, 22); + this.lblLicense.TabIndex = 5; + this.lblLicense.Text = "License"; + this.lblLicense.UseCompatibleTextRendering = true; + // + //lblCopyright + // + this.lblCopyright.AutoSize = true; + this.lblCopyright.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblCopyright.ForeColor = System.Drawing.SystemColors.ControlText; + this.lblCopyright.Location = new System.Drawing.Point(16, 76); + this.lblCopyright.Name = "lblCopyright"; + this.lblCopyright.Size = new System.Drawing.Size(70, 22); + this.lblCopyright.TabIndex = 2; + this.lblCopyright.Text = "Copyright"; + this.lblCopyright.UseCompatibleTextRendering = true; + // + //About + // + this.BackColor = System.Drawing.SystemColors.Control; + this.ClientSize = new System.Drawing.Size(784, 564); + this.Controls.Add(this.pnlTop); + this.Controls.Add(this.pnlBottom); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.ForeColor = System.Drawing.SystemColors.ControlText; + this.Icon = global::My.Resources.Resources.mRemote_Icon; + this.MaximumSize = new System.Drawing.Size(20000, 10000); + this.Name = "About"; + this.TabText = "About"; + this.Text = "About"; + this.pnlTop.ResumeLayout(false); + this.pnlTop.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbLogo).EndInit(); + this.pnlBottom.ResumeLayout(false); + this.pnlBottom.PerformLayout(); + this.ResumeLayout(false); + + } + #endregion + + #region Public Methods + public About(DockContent Panel) + { + this.WindowType = Type.About; + this.DockPnl = Panel; + this.InitializeComponent(); + App.Runtime.FontOverride(this); + } + #endregion + + #region Private Methods + private void ApplyLanguage() + { + lblLicense.Text = My.Language.strLabelReleasedUnderGPL; + lblChangeLog.Text = My.Language.strLabelChangeLog; + TabText = My.Language.strAbout; + Text = My.Language.strAbout; + } + + private void ApplyEditions() + { + #if PORTABLE + lblEdition.Text = My.Language.strLabelPortableEdition; + lblEdition.Visible = true; + #endif + } + + private void FillLinkLabel(LinkLabel llbl, string Text, string URL) + { + llbl.Links.Clear(); + + int Open = Text.IndexOf("["); + int Close = 0; + while (Open != -1) { - -#region Form Init - internal System.Windows.Forms.Label lblCopyright; - internal System.Windows.Forms.Label lblTitle; - internal System.Windows.Forms.Label lblVersion; - internal System.Windows.Forms.Label lblLicense; - internal System.Windows.Forms.TextBox txtChangeLog; - internal System.Windows.Forms.Label lblChangeLog; - internal System.Windows.Forms.Panel pnlBottom; - internal System.Windows.Forms.PictureBox pbLogo; - internal System.Windows.Forms.Label lblEdition; - internal System.Windows.Forms.LinkLabel llblFAMFAMFAM; - internal System.Windows.Forms.LinkLabel llblMagicLibrary; - internal System.Windows.Forms.LinkLabel llblWeifenLuo; - internal System.Windows.Forms.Panel pnlTop; - - private void InitializeComponent() + Text = Text.Remove(Open, 1); + Close = Text.IndexOf("]", Open); + if (Close == -1) { - this.pnlTop = new System.Windows.Forms.Panel(); - this.Load += new System.EventHandler(About_Load); - this.lblEdition = new System.Windows.Forms.Label(); - this.pbLogo = new System.Windows.Forms.PictureBox(); - this.pnlBottom = new System.Windows.Forms.Panel(); - this.llblWeifenLuo = new System.Windows.Forms.LinkLabel(); - this.llblWeifenLuo.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblWeifenLuo_LinkClicked); - this.llblMagicLibrary = new System.Windows.Forms.LinkLabel(); - this.llblMagicLibrary.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblMagicLibrary_LinkClicked); - this.llblFAMFAMFAM = new System.Windows.Forms.LinkLabel(); - this.llblFAMFAMFAM.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblFAMFAMFAM_LinkClicked); - this.txtChangeLog = new System.Windows.Forms.TextBox(); - this.lblTitle = new System.Windows.Forms.Label(); - this.lblVersion = new System.Windows.Forms.Label(); - this.lblChangeLog = new System.Windows.Forms.Label(); - this.lblLicense = new System.Windows.Forms.Label(); - this.lblCopyright = new System.Windows.Forms.Label(); - this.pnlTop.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbLogo).BeginInit(); - this.pnlBottom.SuspendLayout(); - this.SuspendLayout(); - // - //pnlTop - // - this.pnlTop.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlTop.BackColor = System.Drawing.Color.Black; - this.pnlTop.Controls.Add(this.lblEdition); - this.pnlTop.Controls.Add(this.pbLogo); - this.pnlTop.ForeColor = System.Drawing.Color.White; - this.pnlTop.Location = new System.Drawing.Point(-1, -1); - this.pnlTop.Name = "pnlTop"; - this.pnlTop.Size = new System.Drawing.Size(788, 145); - this.pnlTop.TabIndex = 0; - // - //lblEdition - // - this.lblEdition.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); - this.lblEdition.BackColor = System.Drawing.Color.Black; - this.lblEdition.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (14.25F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblEdition.ForeColor = System.Drawing.Color.White; - this.lblEdition.Location = new System.Drawing.Point(512, 112); - this.lblEdition.Name = "lblEdition"; - this.lblEdition.Size = new System.Drawing.Size(264, 24); - this.lblEdition.TabIndex = 0; - this.lblEdition.Text = "Edition"; - this.lblEdition.TextAlign = System.Drawing.ContentAlignment.BottomRight; - this.lblEdition.Visible = false; - // - //pbLogo - // - this.pbLogo.Image = global::My.Resources.Resources.Logo; - this.pbLogo.Location = new System.Drawing.Point(8, 8); - this.pbLogo.Name = "pbLogo"; - this.pbLogo.Size = new System.Drawing.Size(492, 128); - this.pbLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pbLogo.TabIndex = 1; - this.pbLogo.TabStop = false; - // - //pnlBottom - // - this.pnlBottom.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlBottom.BackColor = System.Drawing.SystemColors.Control; - this.pnlBottom.Controls.Add(this.llblWeifenLuo); - this.pnlBottom.Controls.Add(this.llblMagicLibrary); - this.pnlBottom.Controls.Add(this.llblFAMFAMFAM); - this.pnlBottom.Controls.Add(this.txtChangeLog); - this.pnlBottom.Controls.Add(this.lblTitle); - this.pnlBottom.Controls.Add(this.lblVersion); - this.pnlBottom.Controls.Add(this.lblChangeLog); - this.pnlBottom.Controls.Add(this.lblLicense); - this.pnlBottom.Controls.Add(this.lblCopyright); - this.pnlBottom.ForeColor = System.Drawing.SystemColors.ControlText; - this.pnlBottom.Location = new System.Drawing.Point(-1, 144); - this.pnlBottom.Name = "pnlBottom"; - this.pnlBottom.Size = new System.Drawing.Size(788, 418); - this.pnlBottom.TabIndex = 1; - // - //llblWeifenLuo - // - this.llblWeifenLuo.AutoSize = true; - this.llblWeifenLuo.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.llblWeifenLuo.ForeColor = System.Drawing.SystemColors.ControlText; - this.llblWeifenLuo.LinkColor = System.Drawing.Color.Blue; - this.llblWeifenLuo.Location = new System.Drawing.Point(16, 158); - this.llblWeifenLuo.Name = "llblWeifenLuo"; - this.llblWeifenLuo.Size = new System.Drawing.Size(78, 22); - this.llblWeifenLuo.TabIndex = 9; - this.llblWeifenLuo.TabStop = true; - this.llblWeifenLuo.Text = "WeifenLuo"; - this.llblWeifenLuo.UseCompatibleTextRendering = true; - // - //llblMagicLibrary - // - this.llblMagicLibrary.AutoSize = true; - this.llblMagicLibrary.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.llblMagicLibrary.ForeColor = System.Drawing.SystemColors.ControlText; - this.llblMagicLibrary.LinkColor = System.Drawing.Color.Blue; - this.llblMagicLibrary.Location = new System.Drawing.Point(16, 136); - this.llblMagicLibrary.Name = "llblMagicLibrary"; - this.llblMagicLibrary.Size = new System.Drawing.Size(92, 22); - this.llblMagicLibrary.TabIndex = 8; - this.llblMagicLibrary.TabStop = true; - this.llblMagicLibrary.Text = "MagicLibrary"; - this.llblMagicLibrary.UseCompatibleTextRendering = true; - // - //llblFAMFAMFAM - // - this.llblFAMFAMFAM.AutoSize = true; - this.llblFAMFAMFAM.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.llblFAMFAMFAM.ForeColor = System.Drawing.SystemColors.ControlText; - this.llblFAMFAMFAM.LinkColor = System.Drawing.Color.Blue; - this.llblFAMFAMFAM.Location = new System.Drawing.Point(16, 116); - this.llblFAMFAMFAM.Name = "llblFAMFAMFAM"; - this.llblFAMFAMFAM.Size = new System.Drawing.Size(101, 22); - this.llblFAMFAMFAM.TabIndex = 4; - this.llblFAMFAMFAM.TabStop = true; - this.llblFAMFAMFAM.Text = "FAMFAMFAM"; - this.llblFAMFAMFAM.UseCompatibleTextRendering = true; - // - //txtChangeLog - // - this.txtChangeLog.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtChangeLog.BackColor = System.Drawing.SystemColors.Control; - this.txtChangeLog.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtChangeLog.Cursor = System.Windows.Forms.Cursors.Default; - this.txtChangeLog.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (9.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.txtChangeLog.ForeColor = System.Drawing.SystemColors.ControlText; - this.txtChangeLog.Location = new System.Drawing.Point(24, 224); - this.txtChangeLog.Multiline = true; - this.txtChangeLog.Name = "txtChangeLog"; - this.txtChangeLog.ReadOnly = true; - this.txtChangeLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtChangeLog.Size = new System.Drawing.Size(760, 192); - this.txtChangeLog.TabIndex = 7; - this.txtChangeLog.TabStop = false; - // - //lblTitle - // - this.lblTitle.AutoSize = true; - this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (14.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblTitle.ForeColor = System.Drawing.SystemColors.ControlText; - this.lblTitle.Location = new System.Drawing.Point(16, 16); - this.lblTitle.Name = "lblTitle"; - this.lblTitle.Size = new System.Drawing.Size(122, 27); - this.lblTitle.TabIndex = 0; - this.lblTitle.Text = "mRemoteNG"; - this.lblTitle.UseCompatibleTextRendering = true; - // - //lblVersion - // - this.lblVersion.AutoSize = true; - this.lblVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblVersion.ForeColor = System.Drawing.SystemColors.ControlText; - this.lblVersion.Location = new System.Drawing.Point(16, 56); - this.lblVersion.Name = "lblVersion"; - this.lblVersion.Size = new System.Drawing.Size(57, 22); - this.lblVersion.TabIndex = 1; - this.lblVersion.Text = "Version"; - this.lblVersion.UseCompatibleTextRendering = true; - // - //lblChangeLog - // - this.lblChangeLog.AutoSize = true; - this.lblChangeLog.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblChangeLog.ForeColor = System.Drawing.SystemColors.ControlText; - this.lblChangeLog.Location = new System.Drawing.Point(16, 199); - this.lblChangeLog.Name = "lblChangeLog"; - this.lblChangeLog.Size = new System.Drawing.Size(92, 22); - this.lblChangeLog.TabIndex = 6; - this.lblChangeLog.Text = "Change Log:"; - this.lblChangeLog.UseCompatibleTextRendering = true; - // - //lblLicense - // - this.lblLicense.AutoSize = true; - this.lblLicense.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblLicense.ForeColor = System.Drawing.SystemColors.ControlText; - this.lblLicense.Location = new System.Drawing.Point(16, 96); - this.lblLicense.Name = "lblLicense"; - this.lblLicense.Size = new System.Drawing.Size(58, 22); - this.lblLicense.TabIndex = 5; - this.lblLicense.Text = "License"; - this.lblLicense.UseCompatibleTextRendering = true; - // - //lblCopyright - // - this.lblCopyright.AutoSize = true; - this.lblCopyright.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (11.0F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblCopyright.ForeColor = System.Drawing.SystemColors.ControlText; - this.lblCopyright.Location = new System.Drawing.Point(16, 76); - this.lblCopyright.Name = "lblCopyright"; - this.lblCopyright.Size = new System.Drawing.Size(70, 22); - this.lblCopyright.TabIndex = 2; - this.lblCopyright.Text = "Copyright"; - this.lblCopyright.UseCompatibleTextRendering = true; - // - //About - // - this.BackColor = System.Drawing.SystemColors.Control; - this.ClientSize = new System.Drawing.Size(784, 564); - this.Controls.Add(this.pnlTop); - this.Controls.Add(this.pnlBottom); - this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.ForeColor = System.Drawing.SystemColors.ControlText; - this.Icon = global::My.Resources.Resources.mRemote_Icon; - this.MaximumSize = new System.Drawing.Size(20000, 10000); - this.Name = "About"; - this.TabText = "About"; - this.Text = "About"; - this.pnlTop.ResumeLayout(false); - this.pnlTop.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbLogo).EndInit(); - this.pnlBottom.ResumeLayout(false); - this.pnlBottom.PerformLayout(); - this.ResumeLayout(false); - + break; } -#endregion - -#region Public Methods - public About(DockContent Panel) - { - this.WindowType = Type.About; - this.DockPnl = Panel; - this.InitializeComponent(); - App.Runtime.FontOverride(this); - } -#endregion - -#region Private Methods - private void ApplyLanguage() - { - lblLicense.Text = My.Language.strLabelReleasedUnderGPL; - lblChangeLog.Text = My.Language.strLabelChangeLog; - TabText = My.Language.strAbout; - Text = My.Language.strAbout; - } - - private void ApplyEditions() - { -#if PORTABLE - lblEdition.Text = My.Language.strLabelPortableEdition; - lblEdition.Visible = true; -#endif - } - - private void FillLinkLabel(LinkLabel llbl, string Text, string URL) - { - llbl.Links.Clear(); - - int Open = Text.IndexOf("["); - int Close = 0; - while (Open != -1) - { - Text = Text.Remove(Open, 1); - Close = Text.IndexOf("]", Open); - if (Close == -1) - { - break; - } - Text = Text.Remove(Close, 1); - llbl.Links.Add(Open, Close - Open, URL); - Open = Text.IndexOf("[", Open); - } - - llbl.Text = Text; - } -#endregion - -#region Form Stuff - private void About_Load(object sender, System.EventArgs e) - { - ApplyLanguage(); - ApplyEditions(); - - try - { - lblCopyright.Text = (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.Copyright; - - this.lblVersion.Text = "Version " + (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.Version.ToString(); - - FillLinkLabel(llblFAMFAMFAM, My.Language.strFAMFAMFAMAttribution, My.Language.strFAMFAMFAMAttributionURL); - FillLinkLabel(llblMagicLibrary, My.Language.strMagicLibraryAttribution, My.Language.strMagicLibraryAttributionURL); - FillLinkLabel(llblWeifenLuo, My.Language.strWeifenLuoAttribution, My.Language.strWeifenLuoAttributionURL); - - if (File.Exists((new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\CHANGELOG.TXT")) - { - StreamReader sR = new StreamReader((new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\CHANGELOG.TXT"); - this.txtChangeLog.Text = sR.ReadToEnd(); - sR.Close(); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Loading About failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void llblFAMFAMFAM_LinkClicked(System.Object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) - { - App.Runtime.GoToURL(My.Language.strFAMFAMFAMAttributionURL); - } - - private void llblMagicLibrary_LinkClicked(System.Object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) - { - App.Runtime.GoToURL(My.Language.strMagicLibraryAttributionURL); - } - - private void llblWeifenLuo_LinkClicked(System.Object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) - { - App.Runtime.GoToURL(My.Language.strWeifenLuoAttributionURL); - } -#endregion + Text = Text.Remove(Close, 1); + llbl.Links.Add(Open, Close - Open, URL); + Open = Text.IndexOf("[", Open); } + + llbl.Text = Text; + } + #endregion + + #region Form Stuff + private void About_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); + ApplyEditions(); + + try + { + lblCopyright.Text = (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.Copyright; + + this.lblVersion.Text = "Version " + (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.Version.ToString(); + + FillLinkLabel(llblFAMFAMFAM, My.Language.strFAMFAMFAMAttribution, My.Language.strFAMFAMFAMAttributionURL); + FillLinkLabel(llblMagicLibrary, My.Language.strMagicLibraryAttribution, My.Language.strMagicLibraryAttributionURL); + FillLinkLabel(llblWeifenLuo, My.Language.strWeifenLuoAttribution, My.Language.strWeifenLuoAttributionURL); + + if (File.Exists((new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\CHANGELOG.TXT")) + { + StreamReader sR = new StreamReader((new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\CHANGELOG.TXT"); + this.txtChangeLog.Text = sR.ReadToEnd(); + sR.Close(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Loading About failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void llblFAMFAMFAM_LinkClicked(System.Object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) + { + App.Runtime.GoToURL(My.Language.strFAMFAMFAMAttributionURL); + } + + private void llblMagicLibrary_LinkClicked(System.Object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) + { + App.Runtime.GoToURL(My.Language.strMagicLibraryAttributionURL); + } + + private void llblWeifenLuo_LinkClicked(System.Object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) + { + App.Runtime.GoToURL(My.Language.strWeifenLuoAttributionURL); + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.Announcement.cs b/mRemoteV1/CS/UI/UI.Window.Announcement.cs index 448bac2a7..1802c5b99 100644 --- a/mRemoteV1/CS/UI/UI.Window.Announcement.cs +++ b/mRemoteV1/CS/UI/UI.Window.Announcement.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,99 +8,97 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.ComponentModel; using mRemoteNG.My; using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public partial class Announcement : Base + { + #region Public Methods + public Announcement(DockContent panel) + { + WindowType = Type.Announcement; + DockPnl = panel; + InitializeComponent(); + } + #endregion + + #region Private Fields + private App.Update _appUpdate; + #endregion + + #region Private Methods + public void Announcement_Load(object sender, EventArgs e) + { + webBrowser.Navigated += webBrowser_Navigated; + + ApplyLanguage(); + CheckForAnnouncement(); + } + + private void ApplyLanguage() + { + + } + + private void webBrowser_Navigated(object sender, System.Windows.Forms.WebBrowserNavigatedEventArgs e) + { + // This can only be set once the WebBrowser control is shown, it will throw a COM exception otherwise. + webBrowser.AllowWebBrowserDrop = false; + + webBrowser.Navigated -= webBrowser_Navigated; + } + + private void CheckForAnnouncement() + { + if (_appUpdate == null) { -#region Public Methods - public Announcement(DockContent panel) - { - WindowType = Type.Announcement; - DockPnl = panel; - InitializeComponent(); - } -#endregion - -#region Private Fields - private App.Update _appUpdate; -#endregion - -#region Private Methods - public void Announcement_Load(object sender, EventArgs e) - { - webBrowser.Navigated += webBrowser_Navigated; - - ApplyLanguage(); - CheckForAnnouncement(); - } - - private void ApplyLanguage() - { - - } - - private void webBrowser_Navigated(object sender, System.Windows.Forms.WebBrowserNavigatedEventArgs e) - { - // This can only be set once the WebBrowser control is shown, it will throw a COM exception otherwise. - webBrowser.AllowWebBrowserDrop = false; - - webBrowser.Navigated -= webBrowser_Navigated; - } - - private void CheckForAnnouncement() - { - if (_appUpdate == null) - { - _appUpdate = new App.Update(); - _appUpdate.Load += _appUpdate.Update_Load; - } - else if (_appUpdate.IsGetAnnouncementInfoRunning) - { - return ; - } - - _appUpdate.GetAnnouncementInfoCompletedEvent += GetAnnouncementInfoCompleted; - - _appUpdate.GetAnnouncementInfoAsync(); - } - - private void GetAnnouncementInfoCompleted(object sender, AsyncCompletedEventArgs e) - { - if (InvokeRequired) - { - AsyncCompletedEventHandler myDelegate = new AsyncCompletedEventHandler(GetAnnouncementInfoCompleted); - Invoke(myDelegate, new object[] {sender, e}); - return ; - } - - try - { - _appUpdate.GetAnnouncementInfoCompletedEvent -= GetAnnouncementInfoCompleted; - - if (e.Cancelled) - { - return ; - } - if (e.Error != null) - { - throw (e.Error); - } - - webBrowser.Navigate(_appUpdate.CurrentAnnouncementInfo.Address); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(Language.strUpdateGetAnnouncementInfoFailed, ex); - } - } -#endregion + _appUpdate = new App.Update(); + _appUpdate.Load += _appUpdate.Update_Load; } + else if (_appUpdate.IsGetAnnouncementInfoRunning) + { + return ; + } + + _appUpdate.GetAnnouncementInfoCompletedEvent += GetAnnouncementInfoCompleted; + + _appUpdate.GetAnnouncementInfoAsync(); + } + + private void GetAnnouncementInfoCompleted(object sender, AsyncCompletedEventArgs e) + { + if (InvokeRequired) + { + AsyncCompletedEventHandler myDelegate = new AsyncCompletedEventHandler(GetAnnouncementInfoCompleted); + Invoke(myDelegate, new object[] {sender, e}); + return ; + } + + try + { + _appUpdate.GetAnnouncementInfoCompletedEvent -= GetAnnouncementInfoCompleted; + + if (e.Cancelled) + { + return ; + } + if (e.Error != null) + { + throw (e.Error); + } + + webBrowser.Navigate(_appUpdate.CurrentAnnouncementInfo.Address); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(Language.strUpdateGetAnnouncementInfoFailed, ex); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.Base.cs b/mRemoteV1/CS/UI/UI.Window.Base.cs index 90a83ffad..8d60ed4cd 100644 --- a/mRemoteV1/CS/UI/UI.Window.Base.cs +++ b/mRemoteV1/CS/UI/UI.Window.Base.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,102 +8,98 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using WeifenLuo.WinFormsUI.Docking; namespace mRemoteNG.UI.Window { public class Base : DockContent - { - public Base() - { - InitializeComponent(); + { + public Base() + { + InitializeComponent(); - //Added to support default instance behavour in C# - if (defaultInstance == null) - defaultInstance = this; - } + //Added to support default instance behavour in C# + if (defaultInstance == null) + defaultInstance = this; + } -#region Default Instance + #region Default Instance + private static Base defaultInstance; - private static Base defaultInstance; - - /// - /// Added by the VB.Net to C# Converter to support default instance behavour in C# - /// -public static Base Default + /// + /// Added by the VB.Net to C# Converter to support default instance behavour in C# + /// + public static Base Default + { + get + { + if (defaultInstance == null) { - get - { - if (defaultInstance == null) - { - defaultInstance = new Base(); - defaultInstance.FormClosed += new FormClosedEventHandler(defaultInstance_FormClosed); - } + defaultInstance = new Base(); + defaultInstance.FormClosed += new FormClosedEventHandler(defaultInstance_FormClosed); + } - return defaultInstance; - } - set - { - defaultInstance = value; - } - } - - static void defaultInstance_FormClosed(object sender, FormClosedEventArgs e) - { - defaultInstance = null; - } - -#endregion - -#region Public Properties - private Type _WindowType; -public Type WindowType - { - get - { - return this._WindowType; - } - set - { - this._WindowType = value; - } - } - - private DockContent _DockPnl; -public DockContent DockPnl - { - get - { - return this._DockPnl; - } - set - { - this._DockPnl = value; - } - } -#endregion - -#region Public Methods - public void SetFormText(string Text) - { - this.Text = Text; - this.TabText = Text; - } -#endregion - -#region Private Methods - private void Base_Load(System.Object sender, System.EventArgs e) - { - frmMain.Default.ShowHidePanelTabs(); - } - - private void Base_FormClosed(System.Object sender, System.Windows.Forms.FormClosedEventArgs e) - { - frmMain.Default.ShowHidePanelTabs(this); - } -#endregion + return defaultInstance; } + set + { + defaultInstance = value; + } + } + + static void defaultInstance_FormClosed(object sender, FormClosedEventArgs e) + { + defaultInstance = null; + } + #endregion + + #region Public Properties + private Type _WindowType; + public Type WindowType + { + get + { + return this._WindowType; + } + set + { + this._WindowType = value; + } + } + + private DockContent _DockPnl; + public DockContent DockPnl + { + get + { + return this._DockPnl; + } + set + { + this._DockPnl = value; + } + } + #endregion + + #region Public Methods + public void SetFormText(string Text) + { + this.Text = Text; + this.TabText = Text; + } + #endregion + + #region Private Methods + private void Base_Load(System.Object sender, System.EventArgs e) + { + frmMain.Default.ShowHidePanelTabs(); + } + + private void Base_FormClosed(System.Object sender, System.Windows.Forms.FormClosedEventArgs e) + { + frmMain.Default.ShowHidePanelTabs(this); + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.ComponentsCheck.cs b/mRemoteV1/CS/UI/UI.Window.ComponentsCheck.cs index 13b9557ef..bf7b0ae15 100644 --- a/mRemoteV1/CS/UI/UI.Window.ComponentsCheck.cs +++ b/mRemoteV1/CS/UI/UI.Window.ComponentsCheck.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,710 +8,707 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using WeifenLuo.WinFormsUI.Docking; using System.IO; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.Threading; namespace mRemoteNG.UI.Window { public class ComponentsCheck : Base + { + #region Form Stuff + internal System.Windows.Forms.PictureBox pbCheck1; + internal System.Windows.Forms.Label lblCheck1; + internal System.Windows.Forms.Panel pnlCheck2; + internal System.Windows.Forms.Label lblCheck2; + internal System.Windows.Forms.PictureBox pbCheck2; + internal System.Windows.Forms.Panel pnlCheck3; + internal System.Windows.Forms.Label lblCheck3; + internal System.Windows.Forms.PictureBox pbCheck3; + internal System.Windows.Forms.Panel pnlCheck4; + internal System.Windows.Forms.Label lblCheck4; + internal System.Windows.Forms.PictureBox pbCheck4; + internal System.Windows.Forms.Panel pnlCheck5; + internal System.Windows.Forms.Label lblCheck5; + internal System.Windows.Forms.PictureBox pbCheck5; + internal System.Windows.Forms.Button btnCheckAgain; + internal System.Windows.Forms.TextBox txtCheck1; + internal System.Windows.Forms.TextBox txtCheck2; + internal System.Windows.Forms.TextBox txtCheck3; + internal System.Windows.Forms.TextBox txtCheck4; + internal System.Windows.Forms.TextBox txtCheck5; + internal System.Windows.Forms.CheckBox chkAlwaysShow; + internal System.Windows.Forms.Panel pnlChecks; + internal System.Windows.Forms.Panel pnlCheck6; + internal System.Windows.Forms.TextBox txtCheck6; + internal System.Windows.Forms.Label lblCheck6; + internal System.Windows.Forms.PictureBox pbCheck6; + internal System.Windows.Forms.Panel pnlCheck1; + + private void InitializeComponent() + { + this.pnlCheck1 = new System.Windows.Forms.Panel(); + this.Load += new System.EventHandler(ComponentsCheck_Load); + this.txtCheck1 = new System.Windows.Forms.TextBox(); + this.lblCheck1 = new System.Windows.Forms.Label(); + this.pbCheck1 = new System.Windows.Forms.PictureBox(); + this.pnlCheck2 = new System.Windows.Forms.Panel(); + this.txtCheck2 = new System.Windows.Forms.TextBox(); + this.lblCheck2 = new System.Windows.Forms.Label(); + this.pbCheck2 = new System.Windows.Forms.PictureBox(); + this.pnlCheck3 = new System.Windows.Forms.Panel(); + this.txtCheck3 = new System.Windows.Forms.TextBox(); + this.lblCheck3 = new System.Windows.Forms.Label(); + this.pbCheck3 = new System.Windows.Forms.PictureBox(); + this.pnlCheck4 = new System.Windows.Forms.Panel(); + this.txtCheck4 = new System.Windows.Forms.TextBox(); + this.lblCheck4 = new System.Windows.Forms.Label(); + this.pbCheck4 = new System.Windows.Forms.PictureBox(); + this.pnlCheck5 = new System.Windows.Forms.Panel(); + this.txtCheck5 = new System.Windows.Forms.TextBox(); + this.lblCheck5 = new System.Windows.Forms.Label(); + this.pbCheck5 = new System.Windows.Forms.PictureBox(); + this.btnCheckAgain = new System.Windows.Forms.Button(); + this.btnCheckAgain.Click += new System.EventHandler(this.btnCheckAgain_Click); + this.chkAlwaysShow = new System.Windows.Forms.CheckBox(); + this.chkAlwaysShow.CheckedChanged += new System.EventHandler(this.chkAlwaysShow_CheckedChanged); + this.pnlChecks = new System.Windows.Forms.Panel(); + this.pnlCheck6 = new System.Windows.Forms.Panel(); + this.txtCheck6 = new System.Windows.Forms.TextBox(); + this.lblCheck6 = new System.Windows.Forms.Label(); + this.pbCheck6 = new System.Windows.Forms.PictureBox(); + this.pnlCheck1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck1).BeginInit(); + this.pnlCheck2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck2).BeginInit(); + this.pnlCheck3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck3).BeginInit(); + this.pnlCheck4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck4).BeginInit(); + this.pnlCheck5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck5).BeginInit(); + this.pnlChecks.SuspendLayout(); + this.pnlCheck6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck6).BeginInit(); + this.SuspendLayout(); + // + //pnlCheck1 + // + this.pnlCheck1.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlCheck1.Controls.Add(this.txtCheck1); + this.pnlCheck1.Controls.Add(this.lblCheck1); + this.pnlCheck1.Controls.Add(this.pbCheck1); + this.pnlCheck1.Location = new System.Drawing.Point(3, 3); + this.pnlCheck1.Name = "pnlCheck1"; + this.pnlCheck1.Size = new System.Drawing.Size(562, 130); + this.pnlCheck1.TabIndex = 10; + this.pnlCheck1.Visible = false; + // + //txtCheck1 + // + this.txtCheck1.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtCheck1.BackColor = System.Drawing.SystemColors.Control; + this.txtCheck1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtCheck1.Location = new System.Drawing.Point(129, 29); + this.txtCheck1.Multiline = true; + this.txtCheck1.Name = "txtCheck1"; + this.txtCheck1.ReadOnly = true; + this.txtCheck1.Size = new System.Drawing.Size(430, 97); + this.txtCheck1.TabIndex = 2; + // + //lblCheck1 + // + this.lblCheck1.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblCheck1.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblCheck1.ForeColor = System.Drawing.SystemColors.ControlText; + this.lblCheck1.Location = new System.Drawing.Point(108, 3); + this.lblCheck1.Name = "lblCheck1"; + this.lblCheck1.Size = new System.Drawing.Size(451, 23); + this.lblCheck1.TabIndex = 1; + this.lblCheck1.Text = "RDP check succeeded!"; + // + //pbCheck1 + // + this.pbCheck1.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left); + this.pbCheck1.Location = new System.Drawing.Point(3, 3); + this.pbCheck1.Name = "pbCheck1"; + this.pbCheck1.Size = new System.Drawing.Size(72, 123); + this.pbCheck1.TabIndex = 0; + this.pbCheck1.TabStop = false; + // + //pnlCheck2 + // + this.pnlCheck2.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlCheck2.Controls.Add(this.txtCheck2); + this.pnlCheck2.Controls.Add(this.lblCheck2); + this.pnlCheck2.Controls.Add(this.pbCheck2); + this.pnlCheck2.Location = new System.Drawing.Point(3, 139); + this.pnlCheck2.Name = "pnlCheck2"; + this.pnlCheck2.Size = new System.Drawing.Size(562, 130); + this.pnlCheck2.TabIndex = 20; + this.pnlCheck2.Visible = false; + // + //txtCheck2 + // + this.txtCheck2.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtCheck2.BackColor = System.Drawing.SystemColors.Control; + this.txtCheck2.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtCheck2.Location = new System.Drawing.Point(129, 29); + this.txtCheck2.Multiline = true; + this.txtCheck2.Name = "txtCheck2"; + this.txtCheck2.ReadOnly = true; + this.txtCheck2.Size = new System.Drawing.Size(430, 97); + this.txtCheck2.TabIndex = 2; + // + //lblCheck2 + // + this.lblCheck2.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblCheck2.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblCheck2.Location = new System.Drawing.Point(112, 3); + this.lblCheck2.Name = "lblCheck2"; + this.lblCheck2.Size = new System.Drawing.Size(447, 23); + this.lblCheck2.TabIndex = 1; + this.lblCheck2.Text = "RDP check succeeded!"; + // + //pbCheck2 + // + this.pbCheck2.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left); + this.pbCheck2.Location = new System.Drawing.Point(3, 3); + this.pbCheck2.Name = "pbCheck2"; + this.pbCheck2.Size = new System.Drawing.Size(72, 123); + this.pbCheck2.TabIndex = 0; + this.pbCheck2.TabStop = false; + // + //pnlCheck3 + // + this.pnlCheck3.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlCheck3.Controls.Add(this.txtCheck3); + this.pnlCheck3.Controls.Add(this.lblCheck3); + this.pnlCheck3.Controls.Add(this.pbCheck3); + this.pnlCheck3.Location = new System.Drawing.Point(3, 275); + this.pnlCheck3.Name = "pnlCheck3"; + this.pnlCheck3.Size = new System.Drawing.Size(562, 130); + this.pnlCheck3.TabIndex = 30; + this.pnlCheck3.Visible = false; + // + //txtCheck3 + // + this.txtCheck3.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtCheck3.BackColor = System.Drawing.SystemColors.Control; + this.txtCheck3.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtCheck3.Location = new System.Drawing.Point(129, 29); + this.txtCheck3.Multiline = true; + this.txtCheck3.Name = "txtCheck3"; + this.txtCheck3.ReadOnly = true; + this.txtCheck3.Size = new System.Drawing.Size(430, 97); + this.txtCheck3.TabIndex = 2; + // + //lblCheck3 + // + this.lblCheck3.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblCheck3.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblCheck3.Location = new System.Drawing.Point(112, 3); + this.lblCheck3.Name = "lblCheck3"; + this.lblCheck3.Size = new System.Drawing.Size(447, 23); + this.lblCheck3.TabIndex = 1; + this.lblCheck3.Text = "RDP check succeeded!"; + // + //pbCheck3 + // + this.pbCheck3.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left); + this.pbCheck3.Location = new System.Drawing.Point(3, 3); + this.pbCheck3.Name = "pbCheck3"; + this.pbCheck3.Size = new System.Drawing.Size(72, 123); + this.pbCheck3.TabIndex = 0; + this.pbCheck3.TabStop = false; + // + //pnlCheck4 + // + this.pnlCheck4.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlCheck4.Controls.Add(this.txtCheck4); + this.pnlCheck4.Controls.Add(this.lblCheck4); + this.pnlCheck4.Controls.Add(this.pbCheck4); + this.pnlCheck4.Location = new System.Drawing.Point(3, 411); + this.pnlCheck4.Name = "pnlCheck4"; + this.pnlCheck4.Size = new System.Drawing.Size(562, 130); + this.pnlCheck4.TabIndex = 40; + this.pnlCheck4.Visible = false; + // + //txtCheck4 + // + this.txtCheck4.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtCheck4.BackColor = System.Drawing.SystemColors.Control; + this.txtCheck4.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtCheck4.Location = new System.Drawing.Point(129, 30); + this.txtCheck4.Multiline = true; + this.txtCheck4.Name = "txtCheck4"; + this.txtCheck4.ReadOnly = true; + this.txtCheck4.Size = new System.Drawing.Size(430, 97); + this.txtCheck4.TabIndex = 2; + // + //lblCheck4 + // + this.lblCheck4.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblCheck4.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblCheck4.Location = new System.Drawing.Point(112, 3); + this.lblCheck4.Name = "lblCheck4"; + this.lblCheck4.Size = new System.Drawing.Size(447, 23); + this.lblCheck4.TabIndex = 1; + this.lblCheck4.Text = "RDP check succeeded!"; + // + //pbCheck4 + // + this.pbCheck4.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left); + this.pbCheck4.Location = new System.Drawing.Point(3, 3); + this.pbCheck4.Name = "pbCheck4"; + this.pbCheck4.Size = new System.Drawing.Size(72, 123); + this.pbCheck4.TabIndex = 0; + this.pbCheck4.TabStop = false; + // + //pnlCheck5 + // + this.pnlCheck5.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlCheck5.Controls.Add(this.txtCheck5); + this.pnlCheck5.Controls.Add(this.lblCheck5); + this.pnlCheck5.Controls.Add(this.pbCheck5); + this.pnlCheck5.Location = new System.Drawing.Point(3, 547); + this.pnlCheck5.Name = "pnlCheck5"; + this.pnlCheck5.Size = new System.Drawing.Size(562, 130); + this.pnlCheck5.TabIndex = 50; + this.pnlCheck5.Visible = false; + // + //txtCheck5 + // + this.txtCheck5.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtCheck5.BackColor = System.Drawing.SystemColors.Control; + this.txtCheck5.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtCheck5.Location = new System.Drawing.Point(129, 29); + this.txtCheck5.Multiline = true; + this.txtCheck5.Name = "txtCheck5"; + this.txtCheck5.ReadOnly = true; + this.txtCheck5.Size = new System.Drawing.Size(430, 97); + this.txtCheck5.TabIndex = 2; + // + //lblCheck5 + // + this.lblCheck5.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblCheck5.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblCheck5.Location = new System.Drawing.Point(112, 3); + this.lblCheck5.Name = "lblCheck5"; + this.lblCheck5.Size = new System.Drawing.Size(447, 23); + this.lblCheck5.TabIndex = 1; + this.lblCheck5.Text = "RDP check succeeded!"; + // + //pbCheck5 + // + this.pbCheck5.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left); + this.pbCheck5.Location = new System.Drawing.Point(3, 3); + this.pbCheck5.Name = "pbCheck5"; + this.pbCheck5.Size = new System.Drawing.Size(72, 123); + this.pbCheck5.TabIndex = 0; + this.pbCheck5.TabStop = false; + // + //btnCheckAgain + // + this.btnCheckAgain.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right); + this.btnCheckAgain.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnCheckAgain.Location = new System.Drawing.Point(476, 842); + this.btnCheckAgain.Name = "btnCheckAgain"; + this.btnCheckAgain.Size = new System.Drawing.Size(104, 23); + this.btnCheckAgain.TabIndex = 0; + this.btnCheckAgain.Text = "Check again"; + this.btnCheckAgain.UseVisualStyleBackColor = true; + // + //chkAlwaysShow + // + this.chkAlwaysShow.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); + this.chkAlwaysShow.AutoSize = true; + this.chkAlwaysShow.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.chkAlwaysShow.Location = new System.Drawing.Point(12, 846); + this.chkAlwaysShow.Name = "chkAlwaysShow"; + this.chkAlwaysShow.Size = new System.Drawing.Size(185, 17); + this.chkAlwaysShow.TabIndex = 51; + this.chkAlwaysShow.Text = "Always show this screen at startup"; + this.chkAlwaysShow.UseVisualStyleBackColor = true; + // + //pnlChecks + // + this.pnlChecks.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlChecks.AutoScroll = true; + this.pnlChecks.Controls.Add(this.pnlCheck1); + this.pnlChecks.Controls.Add(this.pnlCheck2); + this.pnlChecks.Controls.Add(this.pnlCheck3); + this.pnlChecks.Controls.Add(this.pnlCheck6); + this.pnlChecks.Controls.Add(this.pnlCheck5); + this.pnlChecks.Controls.Add(this.pnlCheck4); + this.pnlChecks.Location = new System.Drawing.Point(12, 12); + this.pnlChecks.Name = "pnlChecks"; + this.pnlChecks.Size = new System.Drawing.Size(568, 824); + this.pnlChecks.TabIndex = 52; + // + //pnlCheck6 + // + this.pnlCheck6.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlCheck6.Controls.Add(this.txtCheck6); + this.pnlCheck6.Controls.Add(this.lblCheck6); + this.pnlCheck6.Controls.Add(this.pbCheck6); + this.pnlCheck6.Location = new System.Drawing.Point(3, 683); + this.pnlCheck6.Name = "pnlCheck6"; + this.pnlCheck6.Size = new System.Drawing.Size(562, 130); + this.pnlCheck6.TabIndex = 50; + this.pnlCheck6.Visible = false; + // + //txtCheck6 + // + this.txtCheck6.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtCheck6.BackColor = System.Drawing.SystemColors.Control; + this.txtCheck6.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtCheck6.Location = new System.Drawing.Point(129, 29); + this.txtCheck6.Multiline = true; + this.txtCheck6.Name = "txtCheck6"; + this.txtCheck6.ReadOnly = true; + this.txtCheck6.Size = new System.Drawing.Size(430, 97); + this.txtCheck6.TabIndex = 2; + // + //lblCheck6 + // + this.lblCheck6.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblCheck6.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblCheck6.Location = new System.Drawing.Point(112, 3); + this.lblCheck6.Name = "lblCheck6"; + this.lblCheck6.Size = new System.Drawing.Size(447, 23); + this.lblCheck6.TabIndex = 1; + this.lblCheck6.Text = "RDP check succeeded!"; + // + //pbCheck6 + // + this.pbCheck6.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left); + this.pbCheck6.Location = new System.Drawing.Point(3, 3); + this.pbCheck6.Name = "pbCheck6"; + this.pbCheck6.Size = new System.Drawing.Size(72, 123); + this.pbCheck6.TabIndex = 0; + this.pbCheck6.TabStop = false; + // + //ComponentsCheck + // + this.ClientSize = new System.Drawing.Size(592, 877); + this.Controls.Add(this.pnlChecks); + this.Controls.Add(this.chkAlwaysShow); + this.Controls.Add(this.btnCheckAgain); + this.Icon = global::My.Resources.Resources.ComponentsCheck_Icon; + this.Name = "ComponentsCheck"; + this.TabText = "Components Check"; + this.Text = "Components Check"; + this.pnlCheck1.ResumeLayout(false); + this.pnlCheck1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck1).EndInit(); + this.pnlCheck2.ResumeLayout(false); + this.pnlCheck2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck2).EndInit(); + this.pnlCheck3.ResumeLayout(false); + this.pnlCheck3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck3).EndInit(); + this.pnlCheck4.ResumeLayout(false); + this.pnlCheck4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck4).EndInit(); + this.pnlCheck5.ResumeLayout(false); + this.pnlCheck5.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck5).EndInit(); + this.pnlChecks.ResumeLayout(false); + this.pnlCheck6.ResumeLayout(false); + this.pnlCheck6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbCheck6).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + #endregion + + #region Public Methods + public ComponentsCheck(DockContent Panel) + { + this.WindowType = Type.ComponentsCheck; + this.DockPnl = Panel; + this.InitializeComponent(); + } + #endregion + + #region Form Stuff + private void ComponentsCheck_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); + + chkAlwaysShow.Checked = System.Convert.ToBoolean(My.Settings.Default.StartupComponentsCheck); + CheckComponents(); + } + + private void ApplyLanguage() + { + TabText = My.Language.strComponentsCheck; + Text = My.Language.strComponentsCheck; + chkAlwaysShow.Text = My.Language.strCcAlwaysShowScreen; + btnCheckAgain.Text = My.Language.strCcCheckAgain; + } + + private void btnCheckAgain_Click(System.Object sender, System.EventArgs e) + { + CheckComponents(); + } + + private void chkAlwaysShow_CheckedChanged(System.Object sender, System.EventArgs e) + { + My.Settings.Default.StartupComponentsCheck = chkAlwaysShow.Checked; + My.Settings.Default.Save(); + } + #endregion + + #region Private Methods + private void CheckComponents() + { + string errorMsg = My.Language.strCcNotInstalledProperly; + + pnlCheck1.Visible = true; + pnlCheck2.Visible = true; + pnlCheck3.Visible = true; + pnlCheck4.Visible = true; + pnlCheck5.Visible = true; + pnlCheck6.Visible = true; + + + AxMSTSCLib.AxMsRdpClient5NotSafeForScripting rdpClient = null; + + try { - -#region Form Stuff - internal System.Windows.Forms.PictureBox pbCheck1; - internal System.Windows.Forms.Label lblCheck1; - internal System.Windows.Forms.Panel pnlCheck2; - internal System.Windows.Forms.Label lblCheck2; - internal System.Windows.Forms.PictureBox pbCheck2; - internal System.Windows.Forms.Panel pnlCheck3; - internal System.Windows.Forms.Label lblCheck3; - internal System.Windows.Forms.PictureBox pbCheck3; - internal System.Windows.Forms.Panel pnlCheck4; - internal System.Windows.Forms.Label lblCheck4; - internal System.Windows.Forms.PictureBox pbCheck4; - internal System.Windows.Forms.Panel pnlCheck5; - internal System.Windows.Forms.Label lblCheck5; - internal System.Windows.Forms.PictureBox pbCheck5; - internal System.Windows.Forms.Button btnCheckAgain; - internal System.Windows.Forms.TextBox txtCheck1; - internal System.Windows.Forms.TextBox txtCheck2; - internal System.Windows.Forms.TextBox txtCheck3; - internal System.Windows.Forms.TextBox txtCheck4; - internal System.Windows.Forms.TextBox txtCheck5; - internal System.Windows.Forms.CheckBox chkAlwaysShow; - internal System.Windows.Forms.Panel pnlChecks; - internal System.Windows.Forms.Panel pnlCheck6; - internal System.Windows.Forms.TextBox txtCheck6; - internal System.Windows.Forms.Label lblCheck6; - internal System.Windows.Forms.PictureBox pbCheck6; - internal System.Windows.Forms.Panel pnlCheck1; - - private void InitializeComponent() + rdpClient = new AxMSTSCLib.AxMsRdpClient5NotSafeForScripting(); + rdpClient.CreateControl(); + + while (!rdpClient.Created) { - this.pnlCheck1 = new System.Windows.Forms.Panel(); - this.Load += new System.EventHandler(ComponentsCheck_Load); - this.txtCheck1 = new System.Windows.Forms.TextBox(); - this.lblCheck1 = new System.Windows.Forms.Label(); - this.pbCheck1 = new System.Windows.Forms.PictureBox(); - this.pnlCheck2 = new System.Windows.Forms.Panel(); - this.txtCheck2 = new System.Windows.Forms.TextBox(); - this.lblCheck2 = new System.Windows.Forms.Label(); - this.pbCheck2 = new System.Windows.Forms.PictureBox(); - this.pnlCheck3 = new System.Windows.Forms.Panel(); - this.txtCheck3 = new System.Windows.Forms.TextBox(); - this.lblCheck3 = new System.Windows.Forms.Label(); - this.pbCheck3 = new System.Windows.Forms.PictureBox(); - this.pnlCheck4 = new System.Windows.Forms.Panel(); - this.txtCheck4 = new System.Windows.Forms.TextBox(); - this.lblCheck4 = new System.Windows.Forms.Label(); - this.pbCheck4 = new System.Windows.Forms.PictureBox(); - this.pnlCheck5 = new System.Windows.Forms.Panel(); - this.txtCheck5 = new System.Windows.Forms.TextBox(); - this.lblCheck5 = new System.Windows.Forms.Label(); - this.pbCheck5 = new System.Windows.Forms.PictureBox(); - this.btnCheckAgain = new System.Windows.Forms.Button(); - this.btnCheckAgain.Click += new System.EventHandler(this.btnCheckAgain_Click); - this.chkAlwaysShow = new System.Windows.Forms.CheckBox(); - this.chkAlwaysShow.CheckedChanged += new System.EventHandler(this.chkAlwaysShow_CheckedChanged); - this.pnlChecks = new System.Windows.Forms.Panel(); - this.pnlCheck6 = new System.Windows.Forms.Panel(); - this.txtCheck6 = new System.Windows.Forms.TextBox(); - this.lblCheck6 = new System.Windows.Forms.Label(); - this.pbCheck6 = new System.Windows.Forms.PictureBox(); - this.pnlCheck1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck1).BeginInit(); - this.pnlCheck2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck2).BeginInit(); - this.pnlCheck3.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck3).BeginInit(); - this.pnlCheck4.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck4).BeginInit(); - this.pnlCheck5.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck5).BeginInit(); - this.pnlChecks.SuspendLayout(); - this.pnlCheck6.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck6).BeginInit(); - this.SuspendLayout(); - // - //pnlCheck1 - // - this.pnlCheck1.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlCheck1.Controls.Add(this.txtCheck1); - this.pnlCheck1.Controls.Add(this.lblCheck1); - this.pnlCheck1.Controls.Add(this.pbCheck1); - this.pnlCheck1.Location = new System.Drawing.Point(3, 3); - this.pnlCheck1.Name = "pnlCheck1"; - this.pnlCheck1.Size = new System.Drawing.Size(562, 130); - this.pnlCheck1.TabIndex = 10; - this.pnlCheck1.Visible = false; - // - //txtCheck1 - // - this.txtCheck1.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtCheck1.BackColor = System.Drawing.SystemColors.Control; - this.txtCheck1.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtCheck1.Location = new System.Drawing.Point(129, 29); - this.txtCheck1.Multiline = true; - this.txtCheck1.Name = "txtCheck1"; - this.txtCheck1.ReadOnly = true; - this.txtCheck1.Size = new System.Drawing.Size(430, 97); - this.txtCheck1.TabIndex = 2; - // - //lblCheck1 - // - this.lblCheck1.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lblCheck1.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblCheck1.ForeColor = System.Drawing.SystemColors.ControlText; - this.lblCheck1.Location = new System.Drawing.Point(108, 3); - this.lblCheck1.Name = "lblCheck1"; - this.lblCheck1.Size = new System.Drawing.Size(451, 23); - this.lblCheck1.TabIndex = 1; - this.lblCheck1.Text = "RDP check succeeded!"; - // - //pbCheck1 - // - this.pbCheck1.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left); - this.pbCheck1.Location = new System.Drawing.Point(3, 3); - this.pbCheck1.Name = "pbCheck1"; - this.pbCheck1.Size = new System.Drawing.Size(72, 123); - this.pbCheck1.TabIndex = 0; - this.pbCheck1.TabStop = false; - // - //pnlCheck2 - // - this.pnlCheck2.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlCheck2.Controls.Add(this.txtCheck2); - this.pnlCheck2.Controls.Add(this.lblCheck2); - this.pnlCheck2.Controls.Add(this.pbCheck2); - this.pnlCheck2.Location = new System.Drawing.Point(3, 139); - this.pnlCheck2.Name = "pnlCheck2"; - this.pnlCheck2.Size = new System.Drawing.Size(562, 130); - this.pnlCheck2.TabIndex = 20; - this.pnlCheck2.Visible = false; - // - //txtCheck2 - // - this.txtCheck2.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtCheck2.BackColor = System.Drawing.SystemColors.Control; - this.txtCheck2.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtCheck2.Location = new System.Drawing.Point(129, 29); - this.txtCheck2.Multiline = true; - this.txtCheck2.Name = "txtCheck2"; - this.txtCheck2.ReadOnly = true; - this.txtCheck2.Size = new System.Drawing.Size(430, 97); - this.txtCheck2.TabIndex = 2; - // - //lblCheck2 - // - this.lblCheck2.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lblCheck2.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblCheck2.Location = new System.Drawing.Point(112, 3); - this.lblCheck2.Name = "lblCheck2"; - this.lblCheck2.Size = new System.Drawing.Size(447, 23); - this.lblCheck2.TabIndex = 1; - this.lblCheck2.Text = "RDP check succeeded!"; - // - //pbCheck2 - // - this.pbCheck2.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left); - this.pbCheck2.Location = new System.Drawing.Point(3, 3); - this.pbCheck2.Name = "pbCheck2"; - this.pbCheck2.Size = new System.Drawing.Size(72, 123); - this.pbCheck2.TabIndex = 0; - this.pbCheck2.TabStop = false; - // - //pnlCheck3 - // - this.pnlCheck3.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlCheck3.Controls.Add(this.txtCheck3); - this.pnlCheck3.Controls.Add(this.lblCheck3); - this.pnlCheck3.Controls.Add(this.pbCheck3); - this.pnlCheck3.Location = new System.Drawing.Point(3, 275); - this.pnlCheck3.Name = "pnlCheck3"; - this.pnlCheck3.Size = new System.Drawing.Size(562, 130); - this.pnlCheck3.TabIndex = 30; - this.pnlCheck3.Visible = false; - // - //txtCheck3 - // - this.txtCheck3.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtCheck3.BackColor = System.Drawing.SystemColors.Control; - this.txtCheck3.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtCheck3.Location = new System.Drawing.Point(129, 29); - this.txtCheck3.Multiline = true; - this.txtCheck3.Name = "txtCheck3"; - this.txtCheck3.ReadOnly = true; - this.txtCheck3.Size = new System.Drawing.Size(430, 97); - this.txtCheck3.TabIndex = 2; - // - //lblCheck3 - // - this.lblCheck3.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lblCheck3.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblCheck3.Location = new System.Drawing.Point(112, 3); - this.lblCheck3.Name = "lblCheck3"; - this.lblCheck3.Size = new System.Drawing.Size(447, 23); - this.lblCheck3.TabIndex = 1; - this.lblCheck3.Text = "RDP check succeeded!"; - // - //pbCheck3 - // - this.pbCheck3.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left); - this.pbCheck3.Location = new System.Drawing.Point(3, 3); - this.pbCheck3.Name = "pbCheck3"; - this.pbCheck3.Size = new System.Drawing.Size(72, 123); - this.pbCheck3.TabIndex = 0; - this.pbCheck3.TabStop = false; - // - //pnlCheck4 - // - this.pnlCheck4.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlCheck4.Controls.Add(this.txtCheck4); - this.pnlCheck4.Controls.Add(this.lblCheck4); - this.pnlCheck4.Controls.Add(this.pbCheck4); - this.pnlCheck4.Location = new System.Drawing.Point(3, 411); - this.pnlCheck4.Name = "pnlCheck4"; - this.pnlCheck4.Size = new System.Drawing.Size(562, 130); - this.pnlCheck4.TabIndex = 40; - this.pnlCheck4.Visible = false; - // - //txtCheck4 - // - this.txtCheck4.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtCheck4.BackColor = System.Drawing.SystemColors.Control; - this.txtCheck4.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtCheck4.Location = new System.Drawing.Point(129, 30); - this.txtCheck4.Multiline = true; - this.txtCheck4.Name = "txtCheck4"; - this.txtCheck4.ReadOnly = true; - this.txtCheck4.Size = new System.Drawing.Size(430, 97); - this.txtCheck4.TabIndex = 2; - // - //lblCheck4 - // - this.lblCheck4.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lblCheck4.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblCheck4.Location = new System.Drawing.Point(112, 3); - this.lblCheck4.Name = "lblCheck4"; - this.lblCheck4.Size = new System.Drawing.Size(447, 23); - this.lblCheck4.TabIndex = 1; - this.lblCheck4.Text = "RDP check succeeded!"; - // - //pbCheck4 - // - this.pbCheck4.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left); - this.pbCheck4.Location = new System.Drawing.Point(3, 3); - this.pbCheck4.Name = "pbCheck4"; - this.pbCheck4.Size = new System.Drawing.Size(72, 123); - this.pbCheck4.TabIndex = 0; - this.pbCheck4.TabStop = false; - // - //pnlCheck5 - // - this.pnlCheck5.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlCheck5.Controls.Add(this.txtCheck5); - this.pnlCheck5.Controls.Add(this.lblCheck5); - this.pnlCheck5.Controls.Add(this.pbCheck5); - this.pnlCheck5.Location = new System.Drawing.Point(3, 547); - this.pnlCheck5.Name = "pnlCheck5"; - this.pnlCheck5.Size = new System.Drawing.Size(562, 130); - this.pnlCheck5.TabIndex = 50; - this.pnlCheck5.Visible = false; - // - //txtCheck5 - // - this.txtCheck5.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtCheck5.BackColor = System.Drawing.SystemColors.Control; - this.txtCheck5.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtCheck5.Location = new System.Drawing.Point(129, 29); - this.txtCheck5.Multiline = true; - this.txtCheck5.Name = "txtCheck5"; - this.txtCheck5.ReadOnly = true; - this.txtCheck5.Size = new System.Drawing.Size(430, 97); - this.txtCheck5.TabIndex = 2; - // - //lblCheck5 - // - this.lblCheck5.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lblCheck5.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblCheck5.Location = new System.Drawing.Point(112, 3); - this.lblCheck5.Name = "lblCheck5"; - this.lblCheck5.Size = new System.Drawing.Size(447, 23); - this.lblCheck5.TabIndex = 1; - this.lblCheck5.Text = "RDP check succeeded!"; - // - //pbCheck5 - // - this.pbCheck5.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left); - this.pbCheck5.Location = new System.Drawing.Point(3, 3); - this.pbCheck5.Name = "pbCheck5"; - this.pbCheck5.Size = new System.Drawing.Size(72, 123); - this.pbCheck5.TabIndex = 0; - this.pbCheck5.TabStop = false; - // - //btnCheckAgain - // - this.btnCheckAgain.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right); - this.btnCheckAgain.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnCheckAgain.Location = new System.Drawing.Point(476, 842); - this.btnCheckAgain.Name = "btnCheckAgain"; - this.btnCheckAgain.Size = new System.Drawing.Size(104, 23); - this.btnCheckAgain.TabIndex = 0; - this.btnCheckAgain.Text = "Check again"; - this.btnCheckAgain.UseVisualStyleBackColor = true; - // - //chkAlwaysShow - // - this.chkAlwaysShow.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); - this.chkAlwaysShow.AutoSize = true; - this.chkAlwaysShow.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.chkAlwaysShow.Location = new System.Drawing.Point(12, 846); - this.chkAlwaysShow.Name = "chkAlwaysShow"; - this.chkAlwaysShow.Size = new System.Drawing.Size(185, 17); - this.chkAlwaysShow.TabIndex = 51; - this.chkAlwaysShow.Text = "Always show this screen at startup"; - this.chkAlwaysShow.UseVisualStyleBackColor = true; - // - //pnlChecks - // - this.pnlChecks.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlChecks.AutoScroll = true; - this.pnlChecks.Controls.Add(this.pnlCheck1); - this.pnlChecks.Controls.Add(this.pnlCheck2); - this.pnlChecks.Controls.Add(this.pnlCheck3); - this.pnlChecks.Controls.Add(this.pnlCheck6); - this.pnlChecks.Controls.Add(this.pnlCheck5); - this.pnlChecks.Controls.Add(this.pnlCheck4); - this.pnlChecks.Location = new System.Drawing.Point(12, 12); - this.pnlChecks.Name = "pnlChecks"; - this.pnlChecks.Size = new System.Drawing.Size(568, 824); - this.pnlChecks.TabIndex = 52; - // - //pnlCheck6 - // - this.pnlCheck6.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlCheck6.Controls.Add(this.txtCheck6); - this.pnlCheck6.Controls.Add(this.lblCheck6); - this.pnlCheck6.Controls.Add(this.pbCheck6); - this.pnlCheck6.Location = new System.Drawing.Point(3, 683); - this.pnlCheck6.Name = "pnlCheck6"; - this.pnlCheck6.Size = new System.Drawing.Size(562, 130); - this.pnlCheck6.TabIndex = 50; - this.pnlCheck6.Visible = false; - // - //txtCheck6 - // - this.txtCheck6.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtCheck6.BackColor = System.Drawing.SystemColors.Control; - this.txtCheck6.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtCheck6.Location = new System.Drawing.Point(129, 29); - this.txtCheck6.Multiline = true; - this.txtCheck6.Name = "txtCheck6"; - this.txtCheck6.ReadOnly = true; - this.txtCheck6.Size = new System.Drawing.Size(430, 97); - this.txtCheck6.TabIndex = 2; - // - //lblCheck6 - // - this.lblCheck6.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lblCheck6.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (12.0F), System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblCheck6.Location = new System.Drawing.Point(112, 3); - this.lblCheck6.Name = "lblCheck6"; - this.lblCheck6.Size = new System.Drawing.Size(447, 23); - this.lblCheck6.TabIndex = 1; - this.lblCheck6.Text = "RDP check succeeded!"; - // - //pbCheck6 - // - this.pbCheck6.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left); - this.pbCheck6.Location = new System.Drawing.Point(3, 3); - this.pbCheck6.Name = "pbCheck6"; - this.pbCheck6.Size = new System.Drawing.Size(72, 123); - this.pbCheck6.TabIndex = 0; - this.pbCheck6.TabStop = false; - // - //ComponentsCheck - // - this.ClientSize = new System.Drawing.Size(592, 877); - this.Controls.Add(this.pnlChecks); - this.Controls.Add(this.chkAlwaysShow); - this.Controls.Add(this.btnCheckAgain); - this.Icon = global::My.Resources.Resources.ComponentsCheck_Icon; - this.Name = "ComponentsCheck"; - this.TabText = "Components Check"; - this.Text = "Components Check"; - this.pnlCheck1.ResumeLayout(false); - this.pnlCheck1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck1).EndInit(); - this.pnlCheck2.ResumeLayout(false); - this.pnlCheck2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck2).EndInit(); - this.pnlCheck3.ResumeLayout(false); - this.pnlCheck3.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck3).EndInit(); - this.pnlCheck4.ResumeLayout(false); - this.pnlCheck4.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck4).EndInit(); - this.pnlCheck5.ResumeLayout(false); - this.pnlCheck5.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck5).EndInit(); - this.pnlChecks.ResumeLayout(false); - this.pnlCheck6.ResumeLayout(false); - this.pnlCheck6.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbCheck6).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - + Thread.Sleep(0); + System.Windows.Forms.Application.DoEvents(); } -#endregion - -#region Public Methods - public ComponentsCheck(DockContent Panel) + + if (!(new Version(System.Convert.ToString(rdpClient.Version)) >= mRemoteNG.Connection.Protocol.RDP.Versions.RDC60)) { - this.WindowType = Type.ComponentsCheck; - this.DockPnl = Panel; - this.InitializeComponent(); + throw (new Exception(string.Format("Found RDC Client version {0} but version {1} or higher is required.", rdpClient.Version, mRemoteNG.Connection.Protocol.RDP.Versions.RDC60))); } -#endregion - -#region Form Stuff - private void ComponentsCheck_Load(object sender, System.EventArgs e) - { - ApplyLanguage(); - - chkAlwaysShow.Checked = System.Convert.ToBoolean(My.Settings.Default.StartupComponentsCheck); - CheckComponents(); - } - - private void ApplyLanguage() - { - TabText = My.Language.strComponentsCheck; - Text = My.Language.strComponentsCheck; - chkAlwaysShow.Text = My.Language.strCcAlwaysShowScreen; - btnCheckAgain.Text = My.Language.strCcCheckAgain; - } - - private void btnCheckAgain_Click(System.Object sender, System.EventArgs e) - { - CheckComponents(); - } - - private void chkAlwaysShow_CheckedChanged(System.Object sender, System.EventArgs e) - { - My.Settings.Default.StartupComponentsCheck = chkAlwaysShow.Checked; - My.Settings.Default.Save(); - } -#endregion - -#region Private Methods - private void CheckComponents() - { - string errorMsg = My.Language.strCcNotInstalledProperly; - - pnlCheck1.Visible = true; - pnlCheck2.Visible = true; - pnlCheck3.Visible = true; - pnlCheck4.Visible = true; - pnlCheck5.Visible = true; - pnlCheck6.Visible = true; - - - AxMSTSCLib.AxMsRdpClient5NotSafeForScripting rdpClient = null; - - try - { - rdpClient = new AxMSTSCLib.AxMsRdpClient5NotSafeForScripting(); - rdpClient.CreateControl(); - while (!rdpClient.Created) - { - Thread.Sleep(0); - System.Windows.Forms.Application.DoEvents(); - } - - if (!(new Version(System.Convert.ToString(rdpClient.Version)) >= mRemoteNG.Connection.Protocol.RDP.Versions.RDC60)) - { - throw (new Exception(string.Format("Found RDC Client version {0} but version {1} or higher is required.", rdpClient.Version, mRemoteNG.Connection.Protocol.RDP.Versions.RDC60))); - } - - pbCheck1.Image = global::My.Resources.Good_Symbol; - lblCheck1.ForeColor = Color.DarkOliveGreen; - lblCheck1.Text = "RDP (Remote Desktop) " + My.Language.strCcCheckSucceeded; - txtCheck1.Text = string.Format(My.Language.strCcRDPOK, rdpClient.Version); - } - catch (Exception ex) - { - pbCheck1.Image = global::My.Resources.Bad_Symbol; - lblCheck1.ForeColor = Color.Firebrick; - lblCheck1.Text = "RDP (Remote Desktop) " + My.Language.strCcCheckFailed; - txtCheck1.Text = My.Language.strCcRDPFailed; - - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "RDP " + errorMsg, true); - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, ex.Message, true); - } - - if (rdpClient != null) - { - rdpClient.Dispose(); - } - - - VncSharp.RemoteDesktop VNC = null; - - try - { - VNC = new VncSharp.RemoteDesktop(); - VNC.CreateControl(); - - while (!VNC.Created) - { - Thread.Sleep(10); - System.Windows.Forms.Application.DoEvents(); - } - - pbCheck2.Image = global::My.Resources.Good_Symbol; - lblCheck2.ForeColor = Color.DarkOliveGreen; - lblCheck2.Text = "VNC (Virtual Network Computing) " + My.Language.strCcCheckSucceeded; - txtCheck2.Text = string.Format(My.Language.strCcVNCOK, VNC.ProductVersion); - } - catch (Exception) - { - pbCheck2.Image = global::My.Resources.Bad_Symbol; - lblCheck2.ForeColor = Color.Firebrick; - lblCheck2.Text = "VNC (Virtual Network Computing) " + My.Language.strCcCheckFailed; - txtCheck2.Text = My.Language.strCcVNCFailed; - - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "VNC " + errorMsg, true); - } - - if (VNC != null) - { - VNC.Dispose(); - } - - - string pPath = ""; - if (My.Settings.Default.UseCustomPuttyPath == false) - { - pPath = (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\PuTTYNG.exe"; - } - else - { - pPath = System.Convert.ToString(My.Settings.Default.CustomPuttyPath); - } - - if (File.Exists(pPath)) - { - pbCheck3.Image = global::My.Resources.Good_Symbol; - lblCheck3.ForeColor = Color.DarkOliveGreen; - lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + My.Language.strCcCheckSucceeded; - txtCheck3.Text = My.Language.strCcPuttyOK; - } - else - { - pbCheck3.Image = global::My.Resources.Bad_Symbol; - lblCheck3.ForeColor = Color.Firebrick; - lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + My.Language.strCcCheckFailed; - txtCheck3.Text = My.Language.strCcPuttyFailed; - - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "PuTTY " + errorMsg, true); - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "File " + pPath + " does not exist.", true); - } - - - AxWFICALib.AxICAClient ICA = null; - - try - { - ICA = new AxWFICALib.AxICAClient(); - ICA.Parent = this; - ICA.CreateControl(); - - while (!ICA.Created) - { - Thread.Sleep(10); - System.Windows.Forms.Application.DoEvents(); - } - - pbCheck4.Image = global::My.Resources.Good_Symbol; - lblCheck4.ForeColor = Color.DarkOliveGreen; - lblCheck4.Text = "ICA (Citrix ICA) " + My.Language.strCcCheckSucceeded; - txtCheck4.Text = string.Format(My.Language.strCcICAOK, ICA.Version); - } - catch (Exception ex) - { - pbCheck4.Image = global::My.Resources.Bad_Symbol; - lblCheck4.ForeColor = Color.Firebrick; - lblCheck4.Text = "ICA (Citrix ICA) " + My.Language.strCcCheckFailed; - txtCheck4.Text = My.Language.strCcICAFailed; - - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "ICA " + errorMsg, true); - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, ex.Message, true); - } - - if (ICA != null) - { - ICA.Dispose(); - } - - - bool GeckoBad = false; - - if (My.Settings.Default.XULRunnerPath == "") - { - GeckoBad = true; - } - - if (Directory.Exists(System.Convert.ToString(My.Settings.Default.XULRunnerPath))) - { - if (File.Exists(Path.Combine(System.Convert.ToString(My.Settings.Default.XULRunnerPath), "xpcom.dll")) == false) - { - GeckoBad = true; - } - } - else - { - GeckoBad = true; - } - - if (GeckoBad == false) - { - pbCheck5.Image = global::My.Resources.Good_Symbol; - lblCheck5.ForeColor = Color.DarkOliveGreen; - lblCheck5.Text = "Gecko (Firefox) Rendering Engine (HTTP/S) " + My.Language.strCcCheckSucceeded; - txtCheck5.Text = My.Language.strCcGeckoOK; - } - else - { - pbCheck5.Image = global::My.Resources.Bad_Symbol; - lblCheck5.ForeColor = Color.Firebrick; - lblCheck5.Text = "Gecko (Firefox) Rendering Engine (HTTP/S) " + My.Language.strCcCheckFailed; - txtCheck5.Text = My.Language.strCcGeckoFailed; - - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Gecko " + errorMsg, true); - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "XULrunner was not found in " + My.Settings.Default.XULRunnerPath, true); - } - - - EOLWTSCOM.WTSCOM eol = null; - - try - { - eol = new EOLWTSCOM.WTSCOM(); - - pbCheck6.Image = global::My.Resources.Good_Symbol; - lblCheck6.ForeColor = Color.DarkOliveGreen; - lblCheck6.Text = "(RDP) Sessions " + My.Language.strCcCheckSucceeded; - txtCheck6.Text = My.Language.strCcEOLOK; - } - catch (Exception ex) - { - pbCheck6.Image = global::My.Resources.Bad_Symbol; - lblCheck6.ForeColor = Color.Firebrick; - lblCheck6.Text = "(RDP) Sessions " + My.Language.strCcCheckFailed; - txtCheck6.Text = My.Language.strCcEOLFailed; - - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "EOLWTSCOM " + errorMsg, true); - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, ex.Message, true); - } - } -#endregion - + pbCheck1.Image = global::My.Resources.Good_Symbol; + lblCheck1.ForeColor = Color.DarkOliveGreen; + lblCheck1.Text = "RDP (Remote Desktop) " + My.Language.strCcCheckSucceeded; + txtCheck1.Text = string.Format(My.Language.strCcRDPOK, rdpClient.Version); } + catch (Exception ex) + { + pbCheck1.Image = global::My.Resources.Bad_Symbol; + lblCheck1.ForeColor = Color.Firebrick; + lblCheck1.Text = "RDP (Remote Desktop) " + My.Language.strCcCheckFailed; + txtCheck1.Text = My.Language.strCcRDPFailed; + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "RDP " + errorMsg, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, ex.Message, true); + } + + if (rdpClient != null) + { + rdpClient.Dispose(); + } + + + VncSharp.RemoteDesktop VNC = null; + + try + { + VNC = new VncSharp.RemoteDesktop(); + VNC.CreateControl(); + + while (!VNC.Created) + { + Thread.Sleep(10); + System.Windows.Forms.Application.DoEvents(); + } + + pbCheck2.Image = global::My.Resources.Good_Symbol; + lblCheck2.ForeColor = Color.DarkOliveGreen; + lblCheck2.Text = "VNC (Virtual Network Computing) " + My.Language.strCcCheckSucceeded; + txtCheck2.Text = string.Format(My.Language.strCcVNCOK, VNC.ProductVersion); + } + catch (Exception) + { + pbCheck2.Image = global::My.Resources.Bad_Symbol; + lblCheck2.ForeColor = Color.Firebrick; + lblCheck2.Text = "VNC (Virtual Network Computing) " + My.Language.strCcCheckFailed; + txtCheck2.Text = My.Language.strCcVNCFailed; + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "VNC " + errorMsg, true); + } + + if (VNC != null) + { + VNC.Dispose(); + } + + + string pPath = ""; + if (My.Settings.Default.UseCustomPuttyPath == false) + { + pPath = (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.DirectoryPath + "\\PuTTYNG.exe"; + } + else + { + pPath = System.Convert.ToString(My.Settings.Default.CustomPuttyPath); + } + + if (File.Exists(pPath)) + { + pbCheck3.Image = global::My.Resources.Good_Symbol; + lblCheck3.ForeColor = Color.DarkOliveGreen; + lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + My.Language.strCcCheckSucceeded; + txtCheck3.Text = My.Language.strCcPuttyOK; + } + else + { + pbCheck3.Image = global::My.Resources.Bad_Symbol; + lblCheck3.ForeColor = Color.Firebrick; + lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + My.Language.strCcCheckFailed; + txtCheck3.Text = My.Language.strCcPuttyFailed; + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "PuTTY " + errorMsg, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "File " + pPath + " does not exist.", true); + } + + + AxWFICALib.AxICAClient ICA = null; + + try + { + ICA = new AxWFICALib.AxICAClient(); + ICA.Parent = this; + ICA.CreateControl(); + + while (!ICA.Created) + { + Thread.Sleep(10); + System.Windows.Forms.Application.DoEvents(); + } + + pbCheck4.Image = global::My.Resources.Good_Symbol; + lblCheck4.ForeColor = Color.DarkOliveGreen; + lblCheck4.Text = "ICA (Citrix ICA) " + My.Language.strCcCheckSucceeded; + txtCheck4.Text = string.Format(My.Language.strCcICAOK, ICA.Version); + } + catch (Exception ex) + { + pbCheck4.Image = global::My.Resources.Bad_Symbol; + lblCheck4.ForeColor = Color.Firebrick; + lblCheck4.Text = "ICA (Citrix ICA) " + My.Language.strCcCheckFailed; + txtCheck4.Text = My.Language.strCcICAFailed; + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "ICA " + errorMsg, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, ex.Message, true); + } + + if (ICA != null) + { + ICA.Dispose(); + } + + + bool GeckoBad = false; + + if (My.Settings.Default.XULRunnerPath == "") + { + GeckoBad = true; + } + + if (Directory.Exists(System.Convert.ToString(My.Settings.Default.XULRunnerPath))) + { + if (File.Exists(Path.Combine(System.Convert.ToString(My.Settings.Default.XULRunnerPath), "xpcom.dll")) == false) + { + GeckoBad = true; + } + } + else + { + GeckoBad = true; + } + + if (GeckoBad == false) + { + pbCheck5.Image = global::My.Resources.Good_Symbol; + lblCheck5.ForeColor = Color.DarkOliveGreen; + lblCheck5.Text = "Gecko (Firefox) Rendering Engine (HTTP/S) " + My.Language.strCcCheckSucceeded; + txtCheck5.Text = My.Language.strCcGeckoOK; + } + else + { + pbCheck5.Image = global::My.Resources.Bad_Symbol; + lblCheck5.ForeColor = Color.Firebrick; + lblCheck5.Text = "Gecko (Firefox) Rendering Engine (HTTP/S) " + My.Language.strCcCheckFailed; + txtCheck5.Text = My.Language.strCcGeckoFailed; + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Gecko " + errorMsg, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "XULrunner was not found in " + My.Settings.Default.XULRunnerPath, true); + } + + + EOLWTSCOM.WTSCOM eol = null; + + try + { + eol = new EOLWTSCOM.WTSCOM(); + + pbCheck6.Image = global::My.Resources.Good_Symbol; + lblCheck6.ForeColor = Color.DarkOliveGreen; + lblCheck6.Text = "(RDP) Sessions " + My.Language.strCcCheckSucceeded; + txtCheck6.Text = My.Language.strCcEOLOK; + } + catch (Exception ex) + { + pbCheck6.Image = global::My.Resources.Bad_Symbol; + lblCheck6.ForeColor = Color.Firebrick; + lblCheck6.Text = "(RDP) Sessions " + My.Language.strCcCheckFailed; + txtCheck6.Text = My.Language.strCcEOLFailed; + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "EOLWTSCOM " + errorMsg, true); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, ex.Message, true); + } + } + #endregion + + } } diff --git a/mRemoteV1/CS/UI/UI.Window.Config.cs b/mRemoteV1/CS/UI/UI.Window.Config.cs index 57d739b9a..e93b85f7d 100644 --- a/mRemoteV1/CS/UI/UI.Window.Config.cs +++ b/mRemoteV1/CS/UI/UI.Window.Config.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,8 +8,6 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.IO; using mRemoteNG.Messages; using mRemoteNG.My; @@ -18,1900 +15,1898 @@ using mRemoteNG.Connection.Protocol; using mRemoteNG.Root; using WeifenLuo.WinFormsUI.Docking; using System.Net.NetworkInformation; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public class Config : Base + { + #region Form Init + internal System.Windows.Forms.ToolStripButton btnShowProperties; + internal System.Windows.Forms.ToolStripButton btnShowDefaultProperties; + internal System.Windows.Forms.ToolStripButton btnShowInheritance; + internal System.Windows.Forms.ToolStripButton btnShowDefaultInheritance; + internal System.Windows.Forms.ToolStripButton btnIcon; + internal System.Windows.Forms.ToolStripButton btnHostStatus; + internal System.Windows.Forms.ContextMenuStrip cMenIcons; + private System.ComponentModel.Container components = null; + internal System.Windows.Forms.ContextMenuStrip propertyGridContextMenu; + internal System.Windows.Forms.ToolStripMenuItem propertyGridContextMenuShowHelpText; + internal System.Windows.Forms.ToolStripMenuItem propertyGridContextMenuReset; + internal System.Windows.Forms.ToolStripSeparator ToolStripSeparator1; + internal Azuria.Common.Controls.FilteredPropertyGrid pGrid; + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.Load += new System.EventHandler(Config_Load); + base.SystemColorsChanged += new System.EventHandler(Config_SystemColorsChanged); + this.pGrid = new Azuria.Common.Controls.FilteredPropertyGrid(); + this.pGrid.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.pGrid_PropertyValueChanged); + this.pGrid.PropertySortChanged += new System.EventHandler(this.pGrid_PropertySortChanged); + this.propertyGridContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.propertyGridContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.propertyGridContextMenu_Opening); + this.propertyGridContextMenuReset = new System.Windows.Forms.ToolStripMenuItem(); + this.propertyGridContextMenuReset.Click += new System.EventHandler(this.propertyGridContextMenuReset_Click); + this.ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.propertyGridContextMenuShowHelpText = new System.Windows.Forms.ToolStripMenuItem(); + this.propertyGridContextMenuShowHelpText.Click += new System.EventHandler(this.propertyGridContextMenuShowHelpText_Click); + this.propertyGridContextMenuShowHelpText.CheckedChanged += new System.EventHandler(this.propertyGridContextMenuShowHelpText_CheckedChanged); + this.btnShowInheritance = new System.Windows.Forms.ToolStripButton(); + this.btnShowInheritance.Click += new System.EventHandler(this.btnShowInheritance_Click); + this.btnShowDefaultInheritance = new System.Windows.Forms.ToolStripButton(); + this.btnShowDefaultInheritance.Click += new System.EventHandler(this.btnShowDefaultInheritance_Click); + this.btnShowProperties = new System.Windows.Forms.ToolStripButton(); + this.btnShowProperties.Click += new System.EventHandler(this.btnShowProperties_Click); + this.btnShowDefaultProperties = new System.Windows.Forms.ToolStripButton(); + this.btnShowDefaultProperties.Click += new System.EventHandler(this.btnShowDefaultProperties_Click); + this.btnIcon = new System.Windows.Forms.ToolStripButton(); + this.btnIcon.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnIcon_Click); + this.btnHostStatus = new System.Windows.Forms.ToolStripButton(); + this.btnHostStatus.Click += new System.EventHandler(this.btnHostStatus_Click); + this.cMenIcons = new System.Windows.Forms.ContextMenuStrip(this.components); + this.propertyGridContextMenu.SuspendLayout(); + this.SuspendLayout(); + // + //pGrid + // + this.pGrid.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pGrid.BrowsableProperties = null; + this.pGrid.ContextMenuStrip = this.propertyGridContextMenu; + this.pGrid.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.pGrid.HiddenAttributes = null; + this.pGrid.HiddenProperties = null; + this.pGrid.Location = new System.Drawing.Point(0, 0); + this.pGrid.Name = "pGrid"; + this.pGrid.PropertySort = System.Windows.Forms.PropertySort.Categorized; + this.pGrid.Size = new System.Drawing.Size(226, 530); + this.pGrid.TabIndex = 0; + this.pGrid.UseCompatibleTextRendering = true; + // + //propertyGridContextMenu + // + this.propertyGridContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.propertyGridContextMenuReset, this.ToolStripSeparator1, this.propertyGridContextMenuShowHelpText}); + this.propertyGridContextMenu.Name = "propertyGridContextMenu"; + this.propertyGridContextMenu.Size = new System.Drawing.Size(157, 76); + // + //propertyGridContextMenuReset + // + this.propertyGridContextMenuReset.Name = "propertyGridContextMenuReset"; + this.propertyGridContextMenuReset.Size = new System.Drawing.Size(156, 22); + this.propertyGridContextMenuReset.Text = "&Reset"; + // + //ToolStripSeparator1 + // + this.ToolStripSeparator1.Name = "ToolStripSeparator1"; + this.ToolStripSeparator1.Size = new System.Drawing.Size(153, 6); + // + //propertyGridContextMenuShowHelpText + // + this.propertyGridContextMenuShowHelpText.Name = "propertyGridContextMenuShowHelpText"; + this.propertyGridContextMenuShowHelpText.Size = new System.Drawing.Size(156, 22); + this.propertyGridContextMenuShowHelpText.Text = "&Show Help Text"; + // + //btnShowInheritance + // + this.btnShowInheritance.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnShowInheritance.Image = global::My.Resources.Resources.Inheritance; + this.btnShowInheritance.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnShowInheritance.Name = "btnShowInheritance"; + this.btnShowInheritance.Size = new System.Drawing.Size(23, 22); + this.btnShowInheritance.Text = "Inheritance"; + // + //btnShowDefaultInheritance + // + this.btnShowDefaultInheritance.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnShowDefaultInheritance.Image = global::My.Resources.Resources.Inheritance_Default; + this.btnShowDefaultInheritance.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnShowDefaultInheritance.Name = "btnShowDefaultInheritance"; + this.btnShowDefaultInheritance.Size = new System.Drawing.Size(23, 22); + this.btnShowDefaultInheritance.Text = "Default Inheritance"; + // + //btnShowProperties + // + this.btnShowProperties.Checked = true; + this.btnShowProperties.CheckState = System.Windows.Forms.CheckState.Checked; + this.btnShowProperties.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnShowProperties.Image = global::My.Resources.Resources.Properties; + this.btnShowProperties.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnShowProperties.Name = "btnShowProperties"; + this.btnShowProperties.Size = new System.Drawing.Size(23, 22); + this.btnShowProperties.Text = "Properties"; + // + //btnShowDefaultProperties + // + this.btnShowDefaultProperties.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnShowDefaultProperties.Image = global::My.Resources.Resources.Properties_Default; + this.btnShowDefaultProperties.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnShowDefaultProperties.Name = "btnShowDefaultProperties"; + this.btnShowDefaultProperties.Size = new System.Drawing.Size(23, 22); + this.btnShowDefaultProperties.Text = "Default Properties"; + // + //btnIcon + // + this.btnIcon.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.btnIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnIcon.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnIcon.Name = "btnIcon"; + this.btnIcon.Size = new System.Drawing.Size(23, 22); + this.btnIcon.Text = "Icon"; + // + //btnHostStatus + // + this.btnHostStatus.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.btnHostStatus.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnHostStatus.Image = global::My.Resources.Resources.HostStatus_Check; + this.btnHostStatus.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnHostStatus.Name = "btnHostStatus"; + this.btnHostStatus.Size = new System.Drawing.Size(23, 22); + this.btnHostStatus.Tag = "checking"; + this.btnHostStatus.Text = "Status"; + // + //cMenIcons + // + this.cMenIcons.Name = "cMenIcons"; + this.cMenIcons.Size = new System.Drawing.Size(61, 4); + // + //Config + // + this.ClientSize = new System.Drawing.Size(226, 530); + this.Controls.Add(this.pGrid); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.HideOnClose = true; + this.Icon = global::My.Resources.Resources.Config_Icon; + this.Name = "Config"; + this.TabText = "Config"; + this.Text = "Config"; + this.propertyGridContextMenu.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + #region Private Properties + private bool ConfigLoading = false; + #endregion + + #region Public Properties + public bool PropertiesVisible + { + get { - - -#region Form Init - internal System.Windows.Forms.ToolStripButton btnShowProperties; - internal System.Windows.Forms.ToolStripButton btnShowDefaultProperties; - internal System.Windows.Forms.ToolStripButton btnShowInheritance; - internal System.Windows.Forms.ToolStripButton btnShowDefaultInheritance; - internal System.Windows.Forms.ToolStripButton btnIcon; - internal System.Windows.Forms.ToolStripButton btnHostStatus; - internal System.Windows.Forms.ContextMenuStrip cMenIcons; - private System.ComponentModel.Container components = null; - internal System.Windows.Forms.ContextMenuStrip propertyGridContextMenu; - internal System.Windows.Forms.ToolStripMenuItem propertyGridContextMenuShowHelpText; - internal System.Windows.Forms.ToolStripMenuItem propertyGridContextMenuReset; - internal System.Windows.Forms.ToolStripSeparator ToolStripSeparator1; - internal Azuria.Common.Controls.FilteredPropertyGrid pGrid; - private void InitializeComponent() + if (this.btnShowProperties.Checked) { - this.components = new System.ComponentModel.Container(); - this.Load += new System.EventHandler(Config_Load); - base.SystemColorsChanged += new System.EventHandler(Config_SystemColorsChanged); - this.pGrid = new Azuria.Common.Controls.FilteredPropertyGrid(); - this.pGrid.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.pGrid_PropertyValueChanged); - this.pGrid.PropertySortChanged += new System.EventHandler(this.pGrid_PropertySortChanged); - this.propertyGridContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); - this.propertyGridContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.propertyGridContextMenu_Opening); - this.propertyGridContextMenuReset = new System.Windows.Forms.ToolStripMenuItem(); - this.propertyGridContextMenuReset.Click += new System.EventHandler(this.propertyGridContextMenuReset_Click); - this.ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.propertyGridContextMenuShowHelpText = new System.Windows.Forms.ToolStripMenuItem(); - this.propertyGridContextMenuShowHelpText.Click += new System.EventHandler(this.propertyGridContextMenuShowHelpText_Click); - this.propertyGridContextMenuShowHelpText.CheckedChanged += new System.EventHandler(this.propertyGridContextMenuShowHelpText_CheckedChanged); - this.btnShowInheritance = new System.Windows.Forms.ToolStripButton(); - this.btnShowInheritance.Click += new System.EventHandler(this.btnShowInheritance_Click); - this.btnShowDefaultInheritance = new System.Windows.Forms.ToolStripButton(); - this.btnShowDefaultInheritance.Click += new System.EventHandler(this.btnShowDefaultInheritance_Click); - this.btnShowProperties = new System.Windows.Forms.ToolStripButton(); - this.btnShowProperties.Click += new System.EventHandler(this.btnShowProperties_Click); - this.btnShowDefaultProperties = new System.Windows.Forms.ToolStripButton(); - this.btnShowDefaultProperties.Click += new System.EventHandler(this.btnShowDefaultProperties_Click); - this.btnIcon = new System.Windows.Forms.ToolStripButton(); - this.btnIcon.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnIcon_Click); - this.btnHostStatus = new System.Windows.Forms.ToolStripButton(); - this.btnHostStatus.Click += new System.EventHandler(this.btnHostStatus_Click); - this.cMenIcons = new System.Windows.Forms.ContextMenuStrip(this.components); - this.propertyGridContextMenu.SuspendLayout(); - this.SuspendLayout(); - // - //pGrid - // - this.pGrid.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pGrid.BrowsableProperties = null; - this.pGrid.ContextMenuStrip = this.propertyGridContextMenu; - this.pGrid.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.pGrid.HiddenAttributes = null; - this.pGrid.HiddenProperties = null; - this.pGrid.Location = new System.Drawing.Point(0, 0); - this.pGrid.Name = "pGrid"; - this.pGrid.PropertySort = System.Windows.Forms.PropertySort.Categorized; - this.pGrid.Size = new System.Drawing.Size(226, 530); - this.pGrid.TabIndex = 0; - this.pGrid.UseCompatibleTextRendering = true; - // - //propertyGridContextMenu - // - this.propertyGridContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.propertyGridContextMenuReset, this.ToolStripSeparator1, this.propertyGridContextMenuShowHelpText}); - this.propertyGridContextMenu.Name = "propertyGridContextMenu"; - this.propertyGridContextMenu.Size = new System.Drawing.Size(157, 76); - // - //propertyGridContextMenuReset - // - this.propertyGridContextMenuReset.Name = "propertyGridContextMenuReset"; - this.propertyGridContextMenuReset.Size = new System.Drawing.Size(156, 22); - this.propertyGridContextMenuReset.Text = "&Reset"; - // - //ToolStripSeparator1 - // - this.ToolStripSeparator1.Name = "ToolStripSeparator1"; - this.ToolStripSeparator1.Size = new System.Drawing.Size(153, 6); - // - //propertyGridContextMenuShowHelpText - // - this.propertyGridContextMenuShowHelpText.Name = "propertyGridContextMenuShowHelpText"; - this.propertyGridContextMenuShowHelpText.Size = new System.Drawing.Size(156, 22); - this.propertyGridContextMenuShowHelpText.Text = "&Show Help Text"; - // - //btnShowInheritance - // - this.btnShowInheritance.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnShowInheritance.Image = global::My.Resources.Resources.Inheritance; - this.btnShowInheritance.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnShowInheritance.Name = "btnShowInheritance"; - this.btnShowInheritance.Size = new System.Drawing.Size(23, 22); - this.btnShowInheritance.Text = "Inheritance"; - // - //btnShowDefaultInheritance - // - this.btnShowDefaultInheritance.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnShowDefaultInheritance.Image = global::My.Resources.Resources.Inheritance_Default; - this.btnShowDefaultInheritance.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnShowDefaultInheritance.Name = "btnShowDefaultInheritance"; - this.btnShowDefaultInheritance.Size = new System.Drawing.Size(23, 22); - this.btnShowDefaultInheritance.Text = "Default Inheritance"; - // - //btnShowProperties - // - this.btnShowProperties.Checked = true; - this.btnShowProperties.CheckState = System.Windows.Forms.CheckState.Checked; - this.btnShowProperties.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnShowProperties.Image = global::My.Resources.Resources.Properties; - this.btnShowProperties.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnShowProperties.Name = "btnShowProperties"; - this.btnShowProperties.Size = new System.Drawing.Size(23, 22); - this.btnShowProperties.Text = "Properties"; - // - //btnShowDefaultProperties - // - this.btnShowDefaultProperties.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnShowDefaultProperties.Image = global::My.Resources.Resources.Properties_Default; - this.btnShowDefaultProperties.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnShowDefaultProperties.Name = "btnShowDefaultProperties"; - this.btnShowDefaultProperties.Size = new System.Drawing.Size(23, 22); - this.btnShowDefaultProperties.Text = "Default Properties"; - // - //btnIcon - // - this.btnIcon.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.btnIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnIcon.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnIcon.Name = "btnIcon"; - this.btnIcon.Size = new System.Drawing.Size(23, 22); - this.btnIcon.Text = "Icon"; - // - //btnHostStatus - // - this.btnHostStatus.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.btnHostStatus.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnHostStatus.Image = global::My.Resources.Resources.HostStatus_Check; - this.btnHostStatus.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnHostStatus.Name = "btnHostStatus"; - this.btnHostStatus.Size = new System.Drawing.Size(23, 22); - this.btnHostStatus.Tag = "checking"; - this.btnHostStatus.Text = "Status"; - // - //cMenIcons - // - this.cMenIcons.Name = "cMenIcons"; - this.cMenIcons.Size = new System.Drawing.Size(61, 4); - // - //Config - // - this.ClientSize = new System.Drawing.Size(226, 530); - this.Controls.Add(this.pGrid); - this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.HideOnClose = true; - this.Icon = global::My.Resources.Resources.Config_Icon; - this.Name = "Config"; - this.TabText = "Config"; - this.Text = "Config"; - this.propertyGridContextMenu.ResumeLayout(false); - this.ResumeLayout(false); - + return true; } -#endregion - -#region Private Properties - private bool ConfigLoading = false; -#endregion - -#region Public Properties -public bool PropertiesVisible + else { - get - { - if (this.btnShowProperties.Checked) - { - return true; - } - else - { - return false; - } - } - set - { - this.btnShowProperties.Checked = value; - - if (value == true) - { - this.btnShowInheritance.Checked = false; - this.btnShowDefaultInheritance.Checked = false; - this.btnShowDefaultProperties.Checked = false; - } - } - } - -public bool InheritanceVisible - { - get - { - if (this.btnShowInheritance.Checked) - { - return true; - } - else - { - return false; - } - } - set - { - this.btnShowInheritance.Checked = value; - - if (value == true) - { - this.btnShowProperties.Checked = false; - this.btnShowDefaultInheritance.Checked = false; - this.btnShowDefaultProperties.Checked = false; - } - } - } - -public bool DefaultPropertiesVisible - { - get - { - if (this.btnShowDefaultProperties.Checked) - { - return true; - } - else - { - return false; - } - } - set - { - this.btnShowDefaultProperties.Checked = value; - - if (value == true) - { - this.btnShowProperties.Checked = false; - this.btnShowDefaultInheritance.Checked = false; - this.btnShowInheritance.Checked = false; - } - } - } - -public bool DefaultInheritanceVisible - { - get - { - if (this.btnShowDefaultInheritance.Checked) - { - return true; - } - else - { - return false; - } - } - set - { - this.btnShowDefaultInheritance.Checked = value; - - if (value == true) - { - this.btnShowProperties.Checked = false; - this.btnShowDefaultProperties.Checked = false; - this.btnShowInheritance.Checked = false; - } - } - } -#endregion - -#region Public Methods - public Config(DockContent Panel) - { - this.WindowType = Type.Config; - this.DockPnl = Panel; - this.InitializeComponent(); - } - - // Main form handle command key events - // Adapted from http://kiwigis.blogspot.com/2009/05/adding-tab-key-support-to-propertygrid.html - protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) - { - if ((keyData & Keys.KeyCode) == Keys.Tab) - { - GridItem selectedItem = pGrid.SelectedGridItem; - GridItem gridRoot = selectedItem; - while (gridRoot.GridItemType != GridItemType.Root) - { - gridRoot = gridRoot.Parent; - } - - List gridItems = new List(); - FindChildGridItems(gridRoot, ref gridItems); - - if (!ContainsGridItemProperty(gridItems)) - { - return true; - } - - GridItem newItem = selectedItem; - - if (keyData == (Keys.Tab | Keys.Shift)) - { - newItem = FindPreviousGridItemProperty(gridItems, selectedItem); - } - else if (keyData == Keys.Tab) - { - newItem = FindNextGridItemProperty(gridItems, selectedItem); - } - - pGrid.SelectedGridItem = newItem; - - return true; // Handled - } - else - { - return base.ProcessCmdKey(ref msg, keyData); - } - } - - private void FindChildGridItems(GridItem item, ref List gridItems) - { - gridItems.Add(item); - - if (!item.Expandable || item.Expanded) - { - foreach (GridItem child in item.GridItems) - { - FindChildGridItems(child, ref gridItems); - } - } - } - - private bool ContainsGridItemProperty(List gridItems) - { - foreach (GridItem item in gridItems) - { - if (item.GridItemType == GridItemType.Property) - { - return true; - } - } return false; } - - private GridItem FindPreviousGridItemProperty(System.Collections.Generic.List gridItems, GridItem startItem) - { - if (gridItems.Count == 0) - { - return null; - } - if (startItem == null) - { - return null; - } - - int startIndex = gridItems.IndexOf(startItem); - - if (startItem.GridItemType == GridItemType.Property) - { - startIndex--; - if (startIndex < 0) - { - startIndex = gridItems.Count - 1; - } - } - - int previousIndex = 0; - bool previousIndexValid = false; - for (int index = startIndex; index >= 0; index--) - { - if (gridItems[index].GridItemType == GridItemType.Property) - { - previousIndex = index; - previousIndexValid = true; - break; - } - } - - if (previousIndexValid) - { - return gridItems[previousIndex]; - } - - for (int index = gridItems.Count - 1; index >= startIndex + 1; index--) - { - if (gridItems[index].GridItemType == GridItemType.Property) - { - previousIndex = index; - previousIndexValid = true; - break; - } - } - - if (!previousIndexValid) - { - return null; - } - - return gridItems[previousIndex]; - } - - private GridItem FindNextGridItemProperty(System.Collections.Generic.List gridItems, GridItem startItem) - { - if (gridItems.Count == 0) - { - return null; - } - if (startItem == null) - { - return null; - } - - int startIndex = gridItems.IndexOf(startItem); - - if (startItem.GridItemType == GridItemType.Property) - { - startIndex++; - if (startIndex >= gridItems.Count) - { - startIndex = 0; - } - } - - int nextIndex = 0; - bool nextIndexValid = false; - for (int index = startIndex; index <= gridItems.Count - 1; index++) - { - if (gridItems[index].GridItemType == GridItemType.Property) - { - nextIndex = index; - nextIndexValid = true; - break; - } - } - - if (nextIndexValid) - { - return gridItems[nextIndex]; - } - - for (int index = 0; index <= startIndex - 1; index++) - { - if (gridItems[index].GridItemType == GridItemType.Property) - { - nextIndex = index; - nextIndexValid = true; - break; - } - } - - if (!nextIndexValid) - { - return null; - } - - return gridItems[nextIndex]; - } - - public void SetPropertyGridObject(object Obj) - { - try - { - this.btnShowProperties.Enabled = false; - this.btnShowInheritance.Enabled = false; - this.btnShowDefaultProperties.Enabled = false; - this.btnShowDefaultInheritance.Enabled = false; - this.btnIcon.Enabled = false; - this.btnHostStatus.Enabled = false; + } + set + { + this.btnShowProperties.Checked = value; - this.btnIcon.Image = null; + if (value == true) + { + this.btnShowInheritance.Checked = false; + this.btnShowDefaultInheritance.Checked = false; + this.btnShowDefaultProperties.Checked = false; + } + } + } + + public bool InheritanceVisible + { + get + { + if (this.btnShowInheritance.Checked) + { + return true; + } + else + { + return false; + } + } + set + { + this.btnShowInheritance.Checked = value; - if (Obj is mRemoteNG.Connection.Info) //CONNECTION INFO - { - if ((Obj as mRemoteNG.Connection.Info).IsContainer == false) //NO CONTAINER - { - if (this.PropertiesVisible) //Properties selected - { - this.pGrid.SelectedObject = Obj; - - this.btnShowProperties.Enabled = true; - if ((Obj as mRemoteNG.Connection.Info).Parent != null) - { - this.btnShowInheritance.Enabled = true; - } - else - { - this.btnShowInheritance.Enabled = false; - } - this.btnShowDefaultProperties.Enabled = false; - this.btnShowDefaultInheritance.Enabled = false; - btnIcon.Enabled = true; - this.btnHostStatus.Enabled = true; - } - else if (this.DefaultPropertiesVisible) //Defaults selected - { - this.pGrid.SelectedObject = Obj; - - if ((Obj as mRemoteNG.Connection.Info).IsDefault) //Is the default connection - { - this.btnShowProperties.Enabled = true; - this.btnShowInheritance.Enabled = false; - this.btnShowDefaultProperties.Enabled = true; - this.btnShowDefaultInheritance.Enabled = true; - this.btnIcon.Enabled = true; - this.btnHostStatus.Enabled = false; - } - else //is not the default connection - { - this.btnShowProperties.Enabled = true; - this.btnShowInheritance.Enabled = true; - this.btnShowDefaultProperties.Enabled = false; - this.btnShowDefaultInheritance.Enabled = false; - this.btnIcon.Enabled = true; - this.btnHostStatus.Enabled = true; - - this.PropertiesVisible = true; - } - } - else if (this.InheritanceVisible) //Inheritance selected - { - this.pGrid.SelectedObject = (Obj as mRemoteNG.Connection.Info).Inherit; - - this.btnShowProperties.Enabled = true; - this.btnShowInheritance.Enabled = true; - this.btnShowDefaultProperties.Enabled = false; - this.btnShowDefaultInheritance.Enabled = false; - this.btnIcon.Enabled = true; - this.btnHostStatus.Enabled = true; - } - else if (this.DefaultInheritanceVisible) //Default Inhertiance selected - { - pGrid.SelectedObject = Obj; - - this.btnShowProperties.Enabled = true; - this.btnShowInheritance.Enabled = true; - this.btnShowDefaultProperties.Enabled = false; - this.btnShowDefaultInheritance.Enabled = false; - this.btnIcon.Enabled = true; - this.btnHostStatus.Enabled = true; - - this.PropertiesVisible = true; - } - } - else if ((Obj as mRemoteNG.Connection.Info).IsContainer) //CONTAINER - { - this.pGrid.SelectedObject = Obj; - - this.btnShowProperties.Enabled = true; - if (((Obj as mRemoteNG.Connection.Info).Parent as mRemoteNG.Container.Info).Parent != null) - { - this.btnShowInheritance.Enabled = true; - } - else - { - this.btnShowInheritance.Enabled = false; - } - this.btnShowDefaultProperties.Enabled = false; - this.btnShowDefaultInheritance.Enabled = false; - this.btnIcon.Enabled = true; - this.btnHostStatus.Enabled = false; - - this.PropertiesVisible = true; - } - - Icon conIcon = mRemoteNG.Connection.Icon.FromString(System.Convert.ToString((Obj as mRemoteNG.Connection.Info).Icon)); - if (conIcon != null) - { - this.btnIcon.Image = conIcon.ToBitmap(); - } - } - else if (Obj is Root.Info) //ROOT - { - Root.Info rootInfo = (Root.Info) Obj; - switch (rootInfo.Type) - { - case Root.Info.RootType.Connection: - PropertiesVisible = true; - DefaultPropertiesVisible = false; - btnShowProperties.Enabled = true; - btnShowInheritance.Enabled = false; - btnShowDefaultProperties.Enabled = true; - btnShowDefaultInheritance.Enabled = true; - btnIcon.Enabled = false; - btnHostStatus.Enabled = false; - break; - case Root.Info.RootType.Credential: - throw (new NotImplementedException()); - break; - case Root.Info.RootType.PuttySessions: - PropertiesVisible = true; - DefaultPropertiesVisible = false; - btnShowProperties.Enabled = true; - btnShowInheritance.Enabled = false; - btnShowDefaultProperties.Enabled = false; - btnShowDefaultInheritance.Enabled = false; - btnIcon.Enabled = false; - btnHostStatus.Enabled = false; - break; - } - pGrid.SelectedObject = Obj; - } - else if (Obj is mRemoteNG.Connection.Info.Inheritance) //INHERITANCE + if (value == true) + { + this.btnShowProperties.Checked = false; + this.btnShowDefaultInheritance.Checked = false; + this.btnShowDefaultProperties.Checked = false; + } + } + } + + public bool DefaultPropertiesVisible + { + get + { + if (this.btnShowDefaultProperties.Checked) + { + return true; + } + else + { + return false; + } + } + set + { + this.btnShowDefaultProperties.Checked = value; + + if (value == true) + { + this.btnShowProperties.Checked = false; + this.btnShowDefaultInheritance.Checked = false; + this.btnShowInheritance.Checked = false; + } + } + } + + public bool DefaultInheritanceVisible + { + get + { + if (this.btnShowDefaultInheritance.Checked) + { + return true; + } + else + { + return false; + } + } + set + { + this.btnShowDefaultInheritance.Checked = value; + + if (value == true) + { + this.btnShowProperties.Checked = false; + this.btnShowDefaultProperties.Checked = false; + this.btnShowInheritance.Checked = false; + } + } + } + #endregion + + #region Public Methods + public Config(DockContent Panel) + { + this.WindowType = Type.Config; + this.DockPnl = Panel; + this.InitializeComponent(); + } + + // Main form handle command key events + // Adapted from http://kiwigis.blogspot.com/2009/05/adding-tab-key-support-to-propertygrid.html + protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) + { + if ((keyData & Keys.KeyCode) == Keys.Tab) + { + GridItem selectedItem = pGrid.SelectedGridItem; + GridItem gridRoot = selectedItem; + while (gridRoot.GridItemType != GridItemType.Root) + { + gridRoot = gridRoot.Parent; + } + + List gridItems = new List(); + FindChildGridItems(gridRoot, ref gridItems); + + if (!ContainsGridItemProperty(gridItems)) + { + return true; + } + + GridItem newItem = selectedItem; + + if (keyData == (Keys.Tab | Keys.Shift)) + { + newItem = FindPreviousGridItemProperty(gridItems, selectedItem); + } + else if (keyData == Keys.Tab) + { + newItem = FindNextGridItemProperty(gridItems, selectedItem); + } + + pGrid.SelectedGridItem = newItem; + + return true; // Handled + } + else + { + return base.ProcessCmdKey(ref msg, keyData); + } + } + + private void FindChildGridItems(GridItem item, ref List gridItems) + { + gridItems.Add(item); + + if (!item.Expandable || item.Expanded) + { + foreach (GridItem child in item.GridItems) + { + FindChildGridItems(child, ref gridItems); + } + } + } + + private bool ContainsGridItemProperty(List gridItems) + { + foreach (GridItem item in gridItems) + { + if (item.GridItemType == GridItemType.Property) + { + return true; + } + } + return false; + } + + private GridItem FindPreviousGridItemProperty(System.Collections.Generic.List gridItems, GridItem startItem) + { + if (gridItems.Count == 0) + { + return null; + } + if (startItem == null) + { + return null; + } + + int startIndex = gridItems.IndexOf(startItem); + + if (startItem.GridItemType == GridItemType.Property) + { + startIndex--; + if (startIndex < 0) + { + startIndex = gridItems.Count - 1; + } + } + + int previousIndex = 0; + bool previousIndexValid = false; + for (int index = startIndex; index >= 0; index--) + { + if (gridItems[index].GridItemType == GridItemType.Property) + { + previousIndex = index; + previousIndexValid = true; + break; + } + } + + if (previousIndexValid) + { + return gridItems[previousIndex]; + } + + for (int index = gridItems.Count - 1; index >= startIndex + 1; index--) + { + if (gridItems[index].GridItemType == GridItemType.Property) + { + previousIndex = index; + previousIndexValid = true; + break; + } + } + + if (!previousIndexValid) + { + return null; + } + + return gridItems[previousIndex]; + } + + private GridItem FindNextGridItemProperty(System.Collections.Generic.List gridItems, GridItem startItem) + { + if (gridItems.Count == 0) + { + return null; + } + if (startItem == null) + { + return null; + } + + int startIndex = gridItems.IndexOf(startItem); + + if (startItem.GridItemType == GridItemType.Property) + { + startIndex++; + if (startIndex >= gridItems.Count) + { + startIndex = 0; + } + } + + int nextIndex = 0; + bool nextIndexValid = false; + for (int index = startIndex; index <= gridItems.Count - 1; index++) + { + if (gridItems[index].GridItemType == GridItemType.Property) + { + nextIndex = index; + nextIndexValid = true; + break; + } + } + + if (nextIndexValid) + { + return gridItems[nextIndex]; + } + + for (int index = 0; index <= startIndex - 1; index++) + { + if (gridItems[index].GridItemType == GridItemType.Property) + { + nextIndex = index; + nextIndexValid = true; + break; + } + } + + if (!nextIndexValid) + { + return null; + } + + return gridItems[nextIndex]; + } + + public void SetPropertyGridObject(object Obj) + { + try + { + this.btnShowProperties.Enabled = false; + this.btnShowInheritance.Enabled = false; + this.btnShowDefaultProperties.Enabled = false; + this.btnShowDefaultInheritance.Enabled = false; + this.btnIcon.Enabled = false; + this.btnHostStatus.Enabled = false; + + this.btnIcon.Image = null; + + if (Obj is mRemoteNG.Connection.Info) //CONNECTION INFO + { + if ((Obj as mRemoteNG.Connection.Info).IsContainer == false) //NO CONTAINER + { + if (this.PropertiesVisible) //Properties selected { this.pGrid.SelectedObject = Obj; - - if (this.InheritanceVisible) + + this.btnShowProperties.Enabled = true; + if ((Obj as mRemoteNG.Connection.Info).Parent != null) { - this.InheritanceVisible = true; - this.btnShowProperties.Enabled = true; this.btnShowInheritance.Enabled = true; - this.btnShowDefaultProperties.Enabled = false; - this.btnShowDefaultInheritance.Enabled = false; - this.btnIcon.Enabled = true; - this.btnHostStatus.Enabled = !((Obj as mRemoteNG.Connection.Info.Inheritance).Parent as mRemoteNG.Connection.Info).IsContainer; - - this.InheritanceVisible = true; - - Icon conIcon = mRemoteNG.Connection.Icon.FromString(System.Convert.ToString(((Obj as mRemoteNG.Connection.Info.Inheritance).Parent as mRemoteNG.Connection.Info).Icon)); - if (conIcon != null) - { - this.btnIcon.Image = conIcon.ToBitmap(); - } } - else if (this.DefaultInheritanceVisible) + else + { + this.btnShowInheritance.Enabled = false; + } + this.btnShowDefaultProperties.Enabled = false; + this.btnShowDefaultInheritance.Enabled = false; + btnIcon.Enabled = true; + this.btnHostStatus.Enabled = true; + } + else if (this.DefaultPropertiesVisible) //Defaults selected + { + this.pGrid.SelectedObject = Obj; + + if ((Obj as mRemoteNG.Connection.Info).IsDefault) //Is the default connection { this.btnShowProperties.Enabled = true; this.btnShowInheritance.Enabled = false; this.btnShowDefaultProperties.Enabled = true; this.btnShowDefaultInheritance.Enabled = true; - this.btnIcon.Enabled = false; + this.btnIcon.Enabled = true; this.btnHostStatus.Enabled = false; - - this.DefaultInheritanceVisible = true; } - - } - - this.ShowHideGridItems(); - this.SetHostStatus(Obj); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridObjectFailed + Constants.vbNewLine + ex.Message, true); - } - } - - public void pGrid_SelectedObjectChanged() - { - this.ShowHideGridItems(); - } -#endregion - -#region Private Methods - private void ApplyLanguage() - { - btnShowInheritance.Text = My.Language.strButtonInheritance; - btnShowDefaultInheritance.Text = My.Language.strButtonDefaultInheritance; - btnShowProperties.Text = My.Language.strButtonProperties; - btnShowDefaultProperties.Text = My.Language.strButtonDefaultProperties; - btnIcon.Text = My.Language.strButtonIcon; - btnHostStatus.Text = My.Language.strStatus; - Text = My.Language.strMenuConfig; - TabText = My.Language.strMenuConfig; - propertyGridContextMenuShowHelpText.Text = Language.strMenuShowHelpText; - } - - private void ApplyTheme() - { - pGrid.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; - pGrid.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor; - pGrid.ViewBackColor = Themes.ThemeManager.ActiveTheme.ConfigPanelBackgroundColor; - pGrid.ViewForeColor = Themes.ThemeManager.ActiveTheme.ConfigPanelTextColor; - pGrid.LineColor = Themes.ThemeManager.ActiveTheme.ConfigPanelGridLineColor; - pGrid.HelpBackColor = Themes.ThemeManager.ActiveTheme.ConfigPanelHelpBackgroundColor; - pGrid.HelpForeColor = Themes.ThemeManager.ActiveTheme.ConfigPanelHelpTextColor; - pGrid.CategoryForeColor = Themes.ThemeManager.ActiveTheme.ConfigPanelCategoryTextColor; - } - - private bool _originalPropertyGridToolStripItemCountValid; - private int _originalPropertyGridToolStripItemCount; - - private void AddToolStripItems() - { - try - { - ToolStrip customToolStrip = new ToolStrip(); - customToolStrip.Items.Add(btnShowProperties); - customToolStrip.Items.Add(btnShowInheritance); - customToolStrip.Items.Add(btnShowDefaultProperties); - customToolStrip.Items.Add(btnShowDefaultInheritance); - customToolStrip.Items.Add(btnHostStatus); - customToolStrip.Items.Add(btnIcon); - customToolStrip.Show(); - - ToolStrip propertyGridToolStrip = new ToolStrip(); - - ToolStrip toolStrip = null; - foreach (System.Windows.Forms.Control control in pGrid.Controls) - { - toolStrip = control as ToolStrip; - - if (toolStrip != null) + else //is not the default connection { - propertyGridToolStrip = toolStrip; - break; - } - } - - if (toolStrip == null) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strCouldNotFindToolStripInFilteredPropertyGrid, true); - return ; - } - - if (!_originalPropertyGridToolStripItemCountValid) - { - _originalPropertyGridToolStripItemCount = propertyGridToolStrip.Items.Count; - _originalPropertyGridToolStripItemCountValid = true; - } - Debug.Assert(_originalPropertyGridToolStripItemCount == 5); - - // Hide the "Property Pages" button - propertyGridToolStrip.Items[_originalPropertyGridToolStripItemCount - 1].Visible = false; - - int expectedToolStripItemCount = _originalPropertyGridToolStripItemCount + customToolStrip.Items.Count; - if (propertyGridToolStrip.Items.Count != expectedToolStripItemCount) - { - propertyGridToolStrip.AllowMerge = true; - ToolStripManager.Merge(customToolStrip, propertyGridToolStrip); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strConfigUiLoadFailed + Constants.vbNewLine + ex.Message, true); - } - } - - private void Config_Load(object sender, System.EventArgs e) - { - ApplyLanguage(); - - Themes.ThemeManager.ThemeChanged += ApplyTheme; - ApplyTheme(); - - AddToolStripItems(); - - pGrid.HelpVisible = Settings.ShowConfigHelpText; - } - - private void Config_SystemColorsChanged(System.Object sender, System.EventArgs e) - { - AddToolStripItems(); - } - - private void pGrid_PropertyValueChanged(object s, System.Windows.Forms.PropertyValueChangedEventArgs e) - { - try - { - if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) - { - if (e.ChangedItem.Label == My.Language.strPropertyNameProtocol) - { - (this.pGrid.SelectedObject as mRemoteNG.Connection.Info).SetDefaultPort(); - } - else if (e.ChangedItem.Label == My.Language.strPropertyNameName) - { - App.Runtime.Windows.treeForm.tvConnections.SelectedNode.Text = System.Convert.ToString(this.pGrid.SelectedObject.Name); - if (My.Settings.Default.SetHostnameLikeDisplayName && this.pGrid.SelectedObject is mRemoteNG.Connection.Info) - { - mRemoteNG.Connection.Info connectionInfo = (mRemoteNG.Connection.Info) this.pGrid.SelectedObject; - if (!string.IsNullOrEmpty(connectionInfo.Name)) - { - connectionInfo.Hostname = connectionInfo.Name; - } - } - } - else if (e.ChangedItem.Label == My.Language.strPropertyNameIcon) - { - Icon conIcon = mRemoteNG.Connection.Icon.FromString(System.Convert.ToString((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).Icon)); - if (conIcon != null) - { - this.btnIcon.Image = conIcon.ToBitmap(); - } - } - else if (e.ChangedItem.Label == My.Language.strPropertyNameAddress) - { - this.SetHostStatus(this.pGrid.SelectedObject); - } - - if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).IsDefault) - { - App.Runtime.DefaultConnectionToSettings(); - } - } - - Info rootInfo = pGrid.SelectedObject as Info; - if (rootInfo != null) - { - switch (e.ChangedItem.PropertyDescriptor.Name) - { - case "Password": - if (rootInfo.Password == true) - { - string passwordName = ""; - if (Settings.UseSQLServer) - { - passwordName = Language.strSQLServer.TrimEnd(':'); - } - else - { - passwordName = Path.GetFileName(GetStartupConnectionFileName()); - } + this.btnShowProperties.Enabled = true; + this.btnShowInheritance.Enabled = true; + this.btnShowDefaultProperties.Enabled = false; + this.btnShowDefaultInheritance.Enabled = false; + this.btnIcon.Enabled = true; + this.btnHostStatus.Enabled = true; - string password = Tools.Misc.PasswordDialog(passwordName); - - if (string.IsNullOrEmpty(password)) - { - rootInfo.Password = System.Convert.ToString(false); - } - else - { - rootInfo.PasswordString = password; - } - } - break; - case "Name": - break; - //Windows.treeForm.tvConnections.SelectedNode.Text = pGrid.SelectedObject.Name + this.PropertiesVisible = true; } } - - if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info.Inheritance) + else if (this.InheritanceVisible) //Inheritance selected { - if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info.Inheritance).IsDefault) - { - App.Runtime.DefaultInheritanceToSettings(); - } + this.pGrid.SelectedObject = (Obj as mRemoteNG.Connection.Info).Inherit; + + this.btnShowProperties.Enabled = true; + this.btnShowInheritance.Enabled = true; + this.btnShowDefaultProperties.Enabled = false; + this.btnShowDefaultInheritance.Enabled = false; + this.btnIcon.Enabled = true; + this.btnHostStatus.Enabled = true; } - - this.ShowHideGridItems(); - App.Runtime.SaveConnectionsBG(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridValueFailed + Constants.vbNewLine + ex.Message, true); - } - } - - private void pGrid_PropertySortChanged(object sender, EventArgs e) - { - if (pGrid.PropertySort == PropertySort.CategorizedAlphabetical) - { - pGrid.PropertySort = PropertySort.Categorized; - } - } - - private void ShowHideGridItems() - { - try - { - System.Collections.Generic.List strHide = new System.Collections.Generic.List(); - - if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) - { - mRemoteNG.Connection.Info conI = pGrid.SelectedObject; - - switch (conI.Protocol) - { - case mRemoteNG.Connection.Protocol.Protocols.RDP: - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("PuttySession"); - strHide.Add("RenderingEngine"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - if (conI.RDGatewayUsageMethod == mRemoteNG.Connection.Protocol.RDP.RDGatewayUsageMethod.Never) - { - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - } - else if (conI.RDGatewayUseConnectionCredentials) - { - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsername"); - } - if (!(conI.Resolution == RDP.RDPResolutions.FitToWindow || conI.Resolution == RDP.RDPResolutions.Fullscreen)) - { - strHide.Add("AutomaticResize"); - } - break; - case mRemoteNG.Connection.Protocol.Protocols.VNC: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("PuttySession"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - if (conI.VNCAuthMode == mRemoteNG.Connection.Protocol.VNC.AuthMode.AuthVNC) - { - strHide.Add("Username"); - strHide.Add("Domain"); - } - if (conI.VNCProxyType == mRemoteNG.Connection.Protocol.VNC.ProxyType.ProxyNone) - { - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyUsername"); - } - break; - case mRemoteNG.Connection.Protocol.Protocols.SSH1: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.SSH2: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.Telnet: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("Password"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("Username"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.Rlogin: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("Password"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("Username"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.RAW: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("Password"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("Username"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.HTTP: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("PuttySession"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.HTTPS: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ExtApp"); - strHide.Add("ICAEncryption"); - strHide.Add("PuttySession"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound;Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.ICA: - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("ExtApp"); - strHide.Add("Port"); - strHide.Add("PuttySession"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - case mRemoteNG.Connection.Protocol.Protocols.IntApp: - strHide.Add("CacheBitmaps"); - strHide.Add("Colors"); - strHide.Add("DisplayThemes"); - strHide.Add("DisplayWallpaper"); - strHide.Add("EnableFontSmoothing"); - strHide.Add("EnableDesktopComposition"); - strHide.Add("Domain"); - strHide.Add("ICAEncryption"); - strHide.Add("PuttySession"); - strHide.Add("RDGatewayDomain"); - strHide.Add("RDGatewayHostname"); - strHide.Add("RDGatewayPassword"); - strHide.Add("RDGatewayUsageMethod"); - strHide.Add("RDGatewayUseConnectionCredentials"); - strHide.Add("RDGatewayUsername"); - strHide.Add("RDPAuthenticationLevel"); - strHide.Add("LoadBalanceInfo"); - strHide.Add("RedirectDiskDrives"); - strHide.Add("RedirectKeys"); - strHide.Add("RedirectPorts"); - strHide.Add("RedirectPrinters"); - strHide.Add("RedirectSmartCards"); - strHide.Add("RedirectSound"); - strHide.Add("RenderingEngine"); - strHide.Add("Resolution"); - strHide.Add("AutomaticResize"); - strHide.Add("UseConsoleSession"); - strHide.Add("UseCredSsp"); - strHide.Add("VNCAuthMode"); - strHide.Add("VNCColors"); - strHide.Add("VNCCompression"); - strHide.Add("VNCEncoding"); - strHide.Add("VNCProxyIP"); - strHide.Add("VNCProxyPassword"); - strHide.Add("VNCProxyPort"); - strHide.Add("VNCProxyType"); - strHide.Add("VNCProxyUsername"); - strHide.Add("VNCSmartSizeMode"); - strHide.Add("VNCViewOnly"); - break; - } - - if (conI.IsDefault == false) - { - if (conI.Inherit.CacheBitmaps) - { - strHide.Add("CacheBitmaps"); - } - - if (conI.Inherit.Colors) - { - strHide.Add("Colors"); - } - - if (conI.Inherit.Description) - { - strHide.Add("Description"); - } - - if (conI.Inherit.DisplayThemes) - { - strHide.Add("DisplayThemes"); - } - - if (conI.Inherit.DisplayWallpaper) - { - strHide.Add("DisplayWallpaper"); - } - - if (conI.Inherit.EnableFontSmoothing) - { - strHide.Add("EnableFontSmoothing"); - } - - if (conI.Inherit.EnableDesktopComposition) - { - strHide.Add("EnableDesktopComposition"); - } - - if (conI.Inherit.Domain) - { - strHide.Add("Domain"); - } - - if (conI.Inherit.Icon) - { - strHide.Add("Icon"); - } - - if (conI.Inherit.Password) - { - strHide.Add("Password"); - } - - if (conI.Inherit.Port) - { - strHide.Add("Port"); - } - - if (conI.Inherit.Protocol) - { - strHide.Add("Protocol"); - } - - if (conI.Inherit.PuttySession) - { - strHide.Add("PuttySession"); - } - - if (conI.Inherit.RedirectDiskDrives) - { - strHide.Add("RedirectDiskDrives"); - } - - if (conI.Inherit.RedirectKeys) - { - strHide.Add("RedirectKeys"); - } - - if (conI.Inherit.RedirectPorts) - { - strHide.Add("RedirectPorts"); - } - - if (conI.Inherit.RedirectPrinters) - { - strHide.Add("RedirectPrinters"); - } - - if (conI.Inherit.RedirectSmartCards) - { - strHide.Add("RedirectSmartCards"); - } - - if (conI.Inherit.RedirectSound) - { - strHide.Add("RedirectSound"); - } - - if (conI.Inherit.Resolution) - { - strHide.Add("Resolution"); - } - - if (conI.Inherit.AutomaticResize) - { - strHide.Add("AutomaticResize"); - } - - if (conI.Inherit.UseConsoleSession) - { - strHide.Add("UseConsoleSession"); - } - - if (conI.Inherit.UseCredSsp) - { - strHide.Add("UseCredSsp"); - } - - if (conI.Inherit.RenderingEngine) - { - strHide.Add("RenderingEngine"); - } - - if (conI.Inherit.ICAEncryption) - { - strHide.Add("ICAEncryption"); - } - - if (conI.Inherit.RDPAuthenticationLevel) - { - strHide.Add("RDPAuthenticationLevel"); - } - - if (conI.Inherit.LoadBalanceInfo) - { - strHide.Add("LoadBalanceInfo"); - } - - if (conI.Inherit.Username) - { - strHide.Add("Username"); - } - - if (conI.Inherit.Panel) - { - strHide.Add("Panel"); - } - - if (conI.IsContainer) - { - strHide.Add("Hostname"); - } - - if (conI.Inherit.PreExtApp) - { - strHide.Add("PreExtApp"); - } - - if (conI.Inherit.PostExtApp) - { - strHide.Add("PostExtApp"); - } - - if (conI.Inherit.MacAddress) - { - strHide.Add("MacAddress"); - } - - if (conI.Inherit.UserField) - { - strHide.Add("UserField"); - } - - if (conI.Inherit.VNCAuthMode) - { - strHide.Add("VNCAuthMode"); - } - - if (conI.Inherit.VNCColors) - { - strHide.Add("VNCColors"); - } - - if (conI.Inherit.VNCCompression) - { - strHide.Add("VNCCompression"); - } - - if (conI.Inherit.VNCEncoding) - { - strHide.Add("VNCEncoding"); - } - - if (conI.Inherit.VNCProxyIP) - { - strHide.Add("VNCProxyIP"); - } - - if (conI.Inherit.VNCProxyPassword) - { - strHide.Add("VNCProxyPassword"); - } - - if (conI.Inherit.VNCProxyPort) - { - strHide.Add("VNCProxyPort"); - } - - if (conI.Inherit.VNCProxyType) - { - strHide.Add("VNCProxyType"); - } - - if (conI.Inherit.VNCProxyUsername) - { - strHide.Add("VNCProxyUsername"); - } - - if (conI.Inherit.VNCViewOnly) - { - strHide.Add("VNCViewOnly"); - } - - if (conI.Inherit.VNCSmartSizeMode) - { - strHide.Add("VNCSmartSizeMode"); - } - - if (conI.Inherit.ExtApp) - { - strHide.Add("ExtApp"); - } - - if (conI.Inherit.RDGatewayUsageMethod) - { - strHide.Add("RDGatewayUsageMethod"); - } - - if (conI.Inherit.RDGatewayHostname) - { - strHide.Add("RDGatewayHostname"); - } - - if (conI.Inherit.RDGatewayUsername) - { - strHide.Add("RDGatewayUsername"); - } - - if (conI.Inherit.RDGatewayPassword) - { - strHide.Add("RDGatewayPassword"); - } - - if (conI.Inherit.RDGatewayDomain) - { - strHide.Add("RDGatewayDomain"); - } - - if (conI.Inherit.RDGatewayUseConnectionCredentials) - { - strHide.Add("RDGatewayUseConnectionCredentials"); - } - - if (conI.Inherit.RDGatewayHostname) - { - strHide.Add("RDGatewayHostname"); - } - } - else - { - strHide.Add("Hostname"); - strHide.Add("Name"); - } - } - else if (pGrid.SelectedObject is Root.Info) - { - Root.Info rootInfo = (Root.Info) pGrid.SelectedObject; - if (rootInfo.Type == Root.Info.RootType.PuttySessions) - { - strHide.Add("Password"); - } - } - - this.pGrid.HiddenProperties = strHide.ToArray(); - - this.pGrid.Refresh(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridHideItemsFailed + Constants.vbNewLine + ex.Message, true); - } - } - - private void btnShowProperties_Click(object sender, System.EventArgs e) - { - if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info.Inheritance) - { - if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info.Inheritance).IsDefault) + else if (this.DefaultInheritanceVisible) //Default Inhertiance selected { + pGrid.SelectedObject = Obj; + + this.btnShowProperties.Enabled = true; + this.btnShowInheritance.Enabled = true; + this.btnShowDefaultProperties.Enabled = false; + this.btnShowDefaultInheritance.Enabled = false; + this.btnIcon.Enabled = true; + this.btnHostStatus.Enabled = true; + this.PropertiesVisible = true; - this.InheritanceVisible = false; - this.DefaultPropertiesVisible = false; - this.DefaultInheritanceVisible = false; - this.SetPropertyGridObject(App.Runtime.Windows.treeForm.tvConnections.SelectedNode.Tag as mRemoteNG.Root.Info); + } + } + else if ((Obj as mRemoteNG.Connection.Info).IsContainer) //CONTAINER + { + this.pGrid.SelectedObject = Obj; + + this.btnShowProperties.Enabled = true; + if (((Obj as mRemoteNG.Connection.Info).Parent as mRemoteNG.Container.Info).Parent != null) + { + this.btnShowInheritance.Enabled = true; } else { - this.PropertiesVisible = true; - this.InheritanceVisible = false; - this.DefaultPropertiesVisible = false; - this.DefaultInheritanceVisible = false; - this.SetPropertyGridObject((this.pGrid.SelectedObject as mRemoteNG.Connection.Info.Inheritance).Parent); + this.btnShowInheritance.Enabled = false; } + this.btnShowDefaultProperties.Enabled = false; + this.btnShowDefaultInheritance.Enabled = false; + this.btnIcon.Enabled = true; + this.btnHostStatus.Enabled = false; + + this.PropertiesVisible = true; } - else if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) + + Icon conIcon = mRemoteNG.Connection.Icon.FromString(System.Convert.ToString((Obj as mRemoteNG.Connection.Info).Icon)); + if (conIcon != null) { - if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).IsDefault) - { - this.PropertiesVisible = true; - this.InheritanceVisible = false; - this.DefaultPropertiesVisible = false; - this.DefaultInheritanceVisible = false; - this.SetPropertyGridObject(App.Runtime.Windows.treeForm.tvConnections.SelectedNode.Tag as mRemoteNG.Root.Info); - } + this.btnIcon.Image = conIcon.ToBitmap(); } } - - private void btnShowDefaultProperties_Click(object sender, System.EventArgs e) + else if (Obj is Root.Info) //ROOT { - if (this.pGrid.SelectedObject is mRemoteNG.Root.Info|| this.pGrid.SelectedObject is mRemoteNG.Connection.Info.Inheritance) + Root.Info rootInfo = (Root.Info) Obj; + switch (rootInfo.Type) { - this.PropertiesVisible = false; - this.InheritanceVisible = false; - this.DefaultPropertiesVisible = true; - this.DefaultInheritanceVisible = false; - this.SetPropertyGridObject(App.Runtime.DefaultConnectionFromSettings()); + case Root.Info.RootType.Connection: + PropertiesVisible = true; + DefaultPropertiesVisible = false; + btnShowProperties.Enabled = true; + btnShowInheritance.Enabled = false; + btnShowDefaultProperties.Enabled = true; + btnShowDefaultInheritance.Enabled = true; + btnIcon.Enabled = false; + btnHostStatus.Enabled = false; + break; + case Root.Info.RootType.Credential: + throw (new NotImplementedException()); + break; + case Root.Info.RootType.PuttySessions: + PropertiesVisible = true; + DefaultPropertiesVisible = false; + btnShowProperties.Enabled = true; + btnShowInheritance.Enabled = false; + btnShowDefaultProperties.Enabled = false; + btnShowDefaultInheritance.Enabled = false; + btnIcon.Enabled = false; + btnHostStatus.Enabled = false; + break; } + pGrid.SelectedObject = Obj; } - - private void btnShowInheritance_Click(object sender, System.EventArgs e) + else if (Obj is mRemoteNG.Connection.Info.Inheritance) //INHERITANCE { - if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) + this.pGrid.SelectedObject = Obj; + + if (this.InheritanceVisible) { - this.PropertiesVisible = false; this.InheritanceVisible = true; - this.DefaultPropertiesVisible = false; - this.DefaultInheritanceVisible = false; - this.SetPropertyGridObject((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).Inherit); - } - } - - private void btnShowDefaultInheritance_Click(object sender, System.EventArgs e) - { - if (this.pGrid.SelectedObject is mRemoteNG.Root.Info|| this.pGrid.SelectedObject is mRemoteNG.Connection.Info) - { - this.PropertiesVisible = false; - this.InheritanceVisible = false; - this.DefaultPropertiesVisible = false; - this.DefaultInheritanceVisible = true; - this.SetPropertyGridObject(App.Runtime.DefaultInheritanceFromSettings()); - } - } - - private void btnHostStatus_Click(object sender, System.EventArgs e) - { - SetHostStatus(this.pGrid.SelectedObject); - } - - private void btnIcon_Click(object sender, System.Windows.Forms.MouseEventArgs e) - { - try - { - if (pGrid.SelectedObject is mRemoteNG.Connection.Info&& !(pGrid.SelectedObject is mRemoteNG.Connection.PuttySession.Info)) - { - this.cMenIcons.Items.Clear(); - - foreach (string iStr in mRemoteNG.Connection.Icon.Icons) - { - ToolStripMenuItem tI = new ToolStripMenuItem(); - tI.Text = iStr; - tI.Image = mRemoteNG.Connection.Icon.FromString(iStr).ToBitmap(); - tI.Click += IconMenu_Click; + this.btnShowProperties.Enabled = true; + this.btnShowInheritance.Enabled = true; + this.btnShowDefaultProperties.Enabled = false; + this.btnShowDefaultInheritance.Enabled = false; + this.btnIcon.Enabled = true; + this.btnHostStatus.Enabled = !((Obj as mRemoteNG.Connection.Info.Inheritance).Parent as mRemoteNG.Connection.Info).IsContainer; - this.cMenIcons.Items.Add(tI); - } + this.InheritanceVisible = true; + + Icon conIcon = mRemoteNG.Connection.Icon.FromString(System.Convert.ToString(((Obj as mRemoteNG.Connection.Info.Inheritance).Parent as mRemoteNG.Connection.Info).Icon)); + if (conIcon != null) + { + this.btnIcon.Image = conIcon.ToBitmap(); + } + } + else if (this.DefaultInheritanceVisible) + { + this.btnShowProperties.Enabled = true; + this.btnShowInheritance.Enabled = false; + this.btnShowDefaultProperties.Enabled = true; + this.btnShowDefaultInheritance.Enabled = true; + this.btnIcon.Enabled = false; + this.btnHostStatus.Enabled = false; + + this.DefaultInheritanceVisible = true; + } - Point mPos = new Point(PointToScreen(new Point(e.Location.X + this.pGrid.Width - 100, e.Location.Y))); - this.cMenIcons.Show(mPos); - } - } - catch (Exception ex) + } + + this.ShowHideGridItems(); + this.SetHostStatus(Obj); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridObjectFailed + Constants.vbNewLine + ex.Message, true); + } + } + + public void pGrid_SelectedObjectChanged() + { + this.ShowHideGridItems(); + } + #endregion + + #region Private Methods + private void ApplyLanguage() + { + btnShowInheritance.Text = My.Language.strButtonInheritance; + btnShowDefaultInheritance.Text = My.Language.strButtonDefaultInheritance; + btnShowProperties.Text = My.Language.strButtonProperties; + btnShowDefaultProperties.Text = My.Language.strButtonDefaultProperties; + btnIcon.Text = My.Language.strButtonIcon; + btnHostStatus.Text = My.Language.strStatus; + Text = My.Language.strMenuConfig; + TabText = My.Language.strMenuConfig; + propertyGridContextMenuShowHelpText.Text = Language.strMenuShowHelpText; + } + + private void ApplyTheme() + { + pGrid.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; + pGrid.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor; + pGrid.ViewBackColor = Themes.ThemeManager.ActiveTheme.ConfigPanelBackgroundColor; + pGrid.ViewForeColor = Themes.ThemeManager.ActiveTheme.ConfigPanelTextColor; + pGrid.LineColor = Themes.ThemeManager.ActiveTheme.ConfigPanelGridLineColor; + pGrid.HelpBackColor = Themes.ThemeManager.ActiveTheme.ConfigPanelHelpBackgroundColor; + pGrid.HelpForeColor = Themes.ThemeManager.ActiveTheme.ConfigPanelHelpTextColor; + pGrid.CategoryForeColor = Themes.ThemeManager.ActiveTheme.ConfigPanelCategoryTextColor; + } + + private bool _originalPropertyGridToolStripItemCountValid; + private int _originalPropertyGridToolStripItemCount; + + private void AddToolStripItems() + { + try + { + ToolStrip customToolStrip = new ToolStrip(); + customToolStrip.Items.Add(btnShowProperties); + customToolStrip.Items.Add(btnShowInheritance); + customToolStrip.Items.Add(btnShowDefaultProperties); + customToolStrip.Items.Add(btnShowDefaultInheritance); + customToolStrip.Items.Add(btnHostStatus); + customToolStrip.Items.Add(btnIcon); + customToolStrip.Show(); + + ToolStrip propertyGridToolStrip = new ToolStrip(); + + ToolStrip toolStrip = null; + foreach (System.Windows.Forms.Control control in pGrid.Controls) + { + toolStrip = control as ToolStrip; + + if (toolStrip != null) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridButtonIconClickFailed + Constants.vbNewLine + ex.Message, true); + propertyGridToolStrip = toolStrip; + break; } } - - private void IconMenu_Click(object sender, EventArgs e) + + if (toolStrip == null) { - try - { - mRemoteNG.Connection.Info connectionInfo = pGrid.SelectedObject as mRemoteNG.Connection.Info; - if (connectionInfo == null) - { - return ; - } - - ToolStripMenuItem selectedMenuItem = sender as ToolStripMenuItem; - if (selectedMenuItem == null) - { - return ; - } - - string iconName = selectedMenuItem.Text; - if (string.IsNullOrEmpty(iconName)) - { - return ; - } - - Icon connectionIcon = mRemoteNG.Connection.Icon.FromString(iconName); - if (connectionIcon == null) - { - return ; - } - - btnIcon.Image = connectionIcon.ToBitmap(); - - connectionInfo.Icon = iconName; - pGrid.Refresh(); - - SaveConnectionsBG(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strConfigPropertyGridMenuClickFailed + Constants.vbNewLine + ex.Message, true); - } + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strCouldNotFindToolStripInFilteredPropertyGrid, true); + return ; } -#endregion - -#region Host Status (Ping) - private string HostName; - private System.Threading.Thread pThread; - - private void CheckHostAlive() + + if (!_originalPropertyGridToolStripItemCountValid) { - Ping pingSender = new Ping(); - PingReply pReply; + _originalPropertyGridToolStripItemCount = propertyGridToolStrip.Items.Count; + _originalPropertyGridToolStripItemCountValid = true; + } + Debug.Assert(_originalPropertyGridToolStripItemCount == 5); + + // Hide the "Property Pages" button + propertyGridToolStrip.Items[_originalPropertyGridToolStripItemCount - 1].Visible = false; + + int expectedToolStripItemCount = _originalPropertyGridToolStripItemCount + customToolStrip.Items.Count; + if (propertyGridToolStrip.Items.Count != expectedToolStripItemCount) + { + propertyGridToolStrip.AllowMerge = true; + ToolStripManager.Merge(customToolStrip, propertyGridToolStrip); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strConfigUiLoadFailed + Constants.vbNewLine + ex.Message, true); + } + } + + private void Config_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); - try + Themes.ThemeManager.ThemeChanged += ApplyTheme; + ApplyTheme(); + + AddToolStripItems(); + + pGrid.HelpVisible = Settings.ShowConfigHelpText; + } + + private void Config_SystemColorsChanged(System.Object sender, System.EventArgs e) + { + AddToolStripItems(); + } + + private void pGrid_PropertyValueChanged(object s, System.Windows.Forms.PropertyValueChangedEventArgs e) + { + try + { + if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) + { + if (e.ChangedItem.Label == My.Language.strPropertyNameProtocol) { - pReply = pingSender.Send(HostName); - - if (pReply.Status == IPStatus.Success) + (this.pGrid.SelectedObject as mRemoteNG.Connection.Info).SetDefaultPort(); + } + else if (e.ChangedItem.Label == My.Language.strPropertyNameName) + { + App.Runtime.Windows.treeForm.tvConnections.SelectedNode.Text = System.Convert.ToString(this.pGrid.SelectedObject.Name); + if (My.Settings.Default.SetHostnameLikeDisplayName && this.pGrid.SelectedObject is mRemoteNG.Connection.Info) { - if ((string) this.btnHostStatus.Tag == "checking") + mRemoteNG.Connection.Info connectionInfo = (mRemoteNG.Connection.Info) this.pGrid.SelectedObject; + if (!string.IsNullOrEmpty(connectionInfo.Name)) { - ShowStatusImage(global::My.Resources.HostStatus_On); - } - } - else - { - if ((string) this.btnHostStatus.Tag == "checking") - { - ShowStatusImage(global::My.Resources.HostStatus_Off); + connectionInfo.Hostname = connectionInfo.Name; } } } - catch (Exception) + else if (e.ChangedItem.Label == My.Language.strPropertyNameIcon) { - if ((string) this.btnHostStatus.Tag == "checking") + Icon conIcon = mRemoteNG.Connection.Icon.FromString(System.Convert.ToString((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).Icon)); + if (conIcon != null) { - ShowStatusImage(global::My.Resources.HostStatus_Off); + this.btnIcon.Image = conIcon.ToBitmap(); } } + else if (e.ChangedItem.Label == My.Language.strPropertyNameAddress) + { + this.SetHostStatus(this.pGrid.SelectedObject); + } + + if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).IsDefault) + { + App.Runtime.DefaultConnectionToSettings(); + } } - - delegate void ShowStatusImageCB(Image Image); - private void ShowStatusImage(Image Image) + + Info rootInfo = pGrid.SelectedObject as Info; + if (rootInfo != null) { - if (this.pGrid.InvokeRequired) + switch (e.ChangedItem.PropertyDescriptor.Name) { - ShowStatusImageCB d = new ShowStatusImageCB(ShowStatusImage); - this.pGrid.Invoke(d, new object[] {Image}); + case "Password": + if (rootInfo.Password == true) + { + string passwordName = ""; + if (Settings.UseSQLServer) + { + passwordName = Language.strSQLServer.TrimEnd(':'); + } + else + { + passwordName = Path.GetFileName(GetStartupConnectionFileName()); + } + + string password = Tools.Misc.PasswordDialog(passwordName); + + if (string.IsNullOrEmpty(password)) + { + rootInfo.Password = System.Convert.ToString(false); + } + else + { + rootInfo.PasswordString = password; + } + } + break; + case "Name": + break; + //Windows.treeForm.tvConnections.SelectedNode.Text = pGrid.SelectedObject.Name + } + } + + if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info.Inheritance) + { + if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info.Inheritance).IsDefault) + { + App.Runtime.DefaultInheritanceToSettings(); + } + } + + this.ShowHideGridItems(); + App.Runtime.SaveConnectionsBG(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridValueFailed + Constants.vbNewLine + ex.Message, true); + } + } + + private void pGrid_PropertySortChanged(object sender, EventArgs e) + { + if (pGrid.PropertySort == PropertySort.CategorizedAlphabetical) + { + pGrid.PropertySort = PropertySort.Categorized; + } + } + + private void ShowHideGridItems() + { + try + { + System.Collections.Generic.List strHide = new System.Collections.Generic.List(); + + if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) + { + mRemoteNG.Connection.Info conI = pGrid.SelectedObject; + + switch (conI.Protocol) + { + case mRemoteNG.Connection.Protocol.Protocols.RDP: + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("PuttySession"); + strHide.Add("RenderingEngine"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + if (conI.RDGatewayUsageMethod == mRemoteNG.Connection.Protocol.RDP.RDGatewayUsageMethod.Never) + { + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + } + else if (conI.RDGatewayUseConnectionCredentials) + { + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsername"); + } + if (!(conI.Resolution == RDP.RDPResolutions.FitToWindow || conI.Resolution == RDP.RDPResolutions.Fullscreen)) + { + strHide.Add("AutomaticResize"); + } + break; + case mRemoteNG.Connection.Protocol.Protocols.VNC: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("PuttySession"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + if (conI.VNCAuthMode == mRemoteNG.Connection.Protocol.VNC.AuthMode.AuthVNC) + { + strHide.Add("Username"); + strHide.Add("Domain"); + } + if (conI.VNCProxyType == mRemoteNG.Connection.Protocol.VNC.ProxyType.ProxyNone) + { + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyUsername"); + } + break; + case mRemoteNG.Connection.Protocol.Protocols.SSH1: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.SSH2: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.Telnet: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("Password"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("Username"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.Rlogin: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("Password"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("Username"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.RAW: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("Password"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("Username"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.HTTP: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("PuttySession"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.HTTPS: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ExtApp"); + strHide.Add("ICAEncryption"); + strHide.Add("PuttySession"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound;Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.ICA: + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("ExtApp"); + strHide.Add("Port"); + strHide.Add("PuttySession"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + case mRemoteNG.Connection.Protocol.Protocols.IntApp: + strHide.Add("CacheBitmaps"); + strHide.Add("Colors"); + strHide.Add("DisplayThemes"); + strHide.Add("DisplayWallpaper"); + strHide.Add("EnableFontSmoothing"); + strHide.Add("EnableDesktopComposition"); + strHide.Add("Domain"); + strHide.Add("ICAEncryption"); + strHide.Add("PuttySession"); + strHide.Add("RDGatewayDomain"); + strHide.Add("RDGatewayHostname"); + strHide.Add("RDGatewayPassword"); + strHide.Add("RDGatewayUsageMethod"); + strHide.Add("RDGatewayUseConnectionCredentials"); + strHide.Add("RDGatewayUsername"); + strHide.Add("RDPAuthenticationLevel"); + strHide.Add("LoadBalanceInfo"); + strHide.Add("RedirectDiskDrives"); + strHide.Add("RedirectKeys"); + strHide.Add("RedirectPorts"); + strHide.Add("RedirectPrinters"); + strHide.Add("RedirectSmartCards"); + strHide.Add("RedirectSound"); + strHide.Add("RenderingEngine"); + strHide.Add("Resolution"); + strHide.Add("AutomaticResize"); + strHide.Add("UseConsoleSession"); + strHide.Add("UseCredSsp"); + strHide.Add("VNCAuthMode"); + strHide.Add("VNCColors"); + strHide.Add("VNCCompression"); + strHide.Add("VNCEncoding"); + strHide.Add("VNCProxyIP"); + strHide.Add("VNCProxyPassword"); + strHide.Add("VNCProxyPort"); + strHide.Add("VNCProxyType"); + strHide.Add("VNCProxyUsername"); + strHide.Add("VNCSmartSizeMode"); + strHide.Add("VNCViewOnly"); + break; + } + + if (conI.IsDefault == false) + { + if (conI.Inherit.CacheBitmaps) + { + strHide.Add("CacheBitmaps"); + } + + if (conI.Inherit.Colors) + { + strHide.Add("Colors"); + } + + if (conI.Inherit.Description) + { + strHide.Add("Description"); + } + + if (conI.Inherit.DisplayThemes) + { + strHide.Add("DisplayThemes"); + } + + if (conI.Inherit.DisplayWallpaper) + { + strHide.Add("DisplayWallpaper"); + } + + if (conI.Inherit.EnableFontSmoothing) + { + strHide.Add("EnableFontSmoothing"); + } + + if (conI.Inherit.EnableDesktopComposition) + { + strHide.Add("EnableDesktopComposition"); + } + + if (conI.Inherit.Domain) + { + strHide.Add("Domain"); + } + + if (conI.Inherit.Icon) + { + strHide.Add("Icon"); + } + + if (conI.Inherit.Password) + { + strHide.Add("Password"); + } + + if (conI.Inherit.Port) + { + strHide.Add("Port"); + } + + if (conI.Inherit.Protocol) + { + strHide.Add("Protocol"); + } + + if (conI.Inherit.PuttySession) + { + strHide.Add("PuttySession"); + } + + if (conI.Inherit.RedirectDiskDrives) + { + strHide.Add("RedirectDiskDrives"); + } + + if (conI.Inherit.RedirectKeys) + { + strHide.Add("RedirectKeys"); + } + + if (conI.Inherit.RedirectPorts) + { + strHide.Add("RedirectPorts"); + } + + if (conI.Inherit.RedirectPrinters) + { + strHide.Add("RedirectPrinters"); + } + + if (conI.Inherit.RedirectSmartCards) + { + strHide.Add("RedirectSmartCards"); + } + + if (conI.Inherit.RedirectSound) + { + strHide.Add("RedirectSound"); + } + + if (conI.Inherit.Resolution) + { + strHide.Add("Resolution"); + } + + if (conI.Inherit.AutomaticResize) + { + strHide.Add("AutomaticResize"); + } + + if (conI.Inherit.UseConsoleSession) + { + strHide.Add("UseConsoleSession"); + } + + if (conI.Inherit.UseCredSsp) + { + strHide.Add("UseCredSsp"); + } + + if (conI.Inherit.RenderingEngine) + { + strHide.Add("RenderingEngine"); + } + + if (conI.Inherit.ICAEncryption) + { + strHide.Add("ICAEncryption"); + } + + if (conI.Inherit.RDPAuthenticationLevel) + { + strHide.Add("RDPAuthenticationLevel"); + } + + if (conI.Inherit.LoadBalanceInfo) + { + strHide.Add("LoadBalanceInfo"); + } + + if (conI.Inherit.Username) + { + strHide.Add("Username"); + } + + if (conI.Inherit.Panel) + { + strHide.Add("Panel"); + } + + if (conI.IsContainer) + { + strHide.Add("Hostname"); + } + + if (conI.Inherit.PreExtApp) + { + strHide.Add("PreExtApp"); + } + + if (conI.Inherit.PostExtApp) + { + strHide.Add("PostExtApp"); + } + + if (conI.Inherit.MacAddress) + { + strHide.Add("MacAddress"); + } + + if (conI.Inherit.UserField) + { + strHide.Add("UserField"); + } + + if (conI.Inherit.VNCAuthMode) + { + strHide.Add("VNCAuthMode"); + } + + if (conI.Inherit.VNCColors) + { + strHide.Add("VNCColors"); + } + + if (conI.Inherit.VNCCompression) + { + strHide.Add("VNCCompression"); + } + + if (conI.Inherit.VNCEncoding) + { + strHide.Add("VNCEncoding"); + } + + if (conI.Inherit.VNCProxyIP) + { + strHide.Add("VNCProxyIP"); + } + + if (conI.Inherit.VNCProxyPassword) + { + strHide.Add("VNCProxyPassword"); + } + + if (conI.Inherit.VNCProxyPort) + { + strHide.Add("VNCProxyPort"); + } + + if (conI.Inherit.VNCProxyType) + { + strHide.Add("VNCProxyType"); + } + + if (conI.Inherit.VNCProxyUsername) + { + strHide.Add("VNCProxyUsername"); + } + + if (conI.Inherit.VNCViewOnly) + { + strHide.Add("VNCViewOnly"); + } + + if (conI.Inherit.VNCSmartSizeMode) + { + strHide.Add("VNCSmartSizeMode"); + } + + if (conI.Inherit.ExtApp) + { + strHide.Add("ExtApp"); + } + + if (conI.Inherit.RDGatewayUsageMethod) + { + strHide.Add("RDGatewayUsageMethod"); + } + + if (conI.Inherit.RDGatewayHostname) + { + strHide.Add("RDGatewayHostname"); + } + + if (conI.Inherit.RDGatewayUsername) + { + strHide.Add("RDGatewayUsername"); + } + + if (conI.Inherit.RDGatewayPassword) + { + strHide.Add("RDGatewayPassword"); + } + + if (conI.Inherit.RDGatewayDomain) + { + strHide.Add("RDGatewayDomain"); + } + + if (conI.Inherit.RDGatewayUseConnectionCredentials) + { + strHide.Add("RDGatewayUseConnectionCredentials"); + } + + if (conI.Inherit.RDGatewayHostname) + { + strHide.Add("RDGatewayHostname"); + } } else { - this.btnHostStatus.Image = Image; - this.btnHostStatus.Tag = "checkfinished"; + strHide.Add("Hostname"); + strHide.Add("Name"); } } - - public void SetHostStatus(object ConnectionInfo) + else if (pGrid.SelectedObject is Root.Info) { - try + Root.Info rootInfo = (Root.Info) pGrid.SelectedObject; + if (rootInfo.Type == Root.Info.RootType.PuttySessions) { - this.btnHostStatus.Image = global::My.Resources.HostStatus_Check; + strHide.Add("Password"); + } + } - // To check status, ConnectionInfo must be an mRemoteNG.Connection.Info that is not a container - if (ConnectionInfo is mRemoteNG.Connection.Info) - { - if ((ConnectionInfo as mRemoteNG.Connection.Info).IsContainer) - { - return ; - } - } - else - { - return ; - } + this.pGrid.HiddenProperties = strHide.ToArray(); - this.btnHostStatus.Tag = "checking"; - HostName = (ConnectionInfo as mRemoteNG.Connection.Info).Hostname; - pThread = new System.Threading.Thread(new System.Threading.ThreadStart(CheckHostAlive)); - pThread.SetApartmentState(System.Threading.ApartmentState.STA); - pThread.IsBackground = true; - pThread.Start(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridSetHostStatusFailed + Constants.vbNewLine + ex.Message, true); - } - } -#endregion + this.pGrid.Refresh(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridHideItemsFailed + Constants.vbNewLine + ex.Message, true); + } + } - private void propertyGridContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e) + private void btnShowProperties_Click(object sender, System.EventArgs e) + { + if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info.Inheritance) + { + if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info.Inheritance).IsDefault) { - try - { - propertyGridContextMenuShowHelpText.Checked = Settings.ShowConfigHelpText; - GridItem gridItem = pGrid.SelectedGridItem; - propertyGridContextMenuReset.Enabled = System.Convert.ToBoolean(pGrid.SelectedObject != null && gridItem != null && gridItem.PropertyDescriptor != null && gridItem.PropertyDescriptor.CanResetValue(pGrid.SelectedObject)); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage("UI.Window.Config.propertyGridContextMenu_Opening() failed.", ex, MessageClass.ErrorMsg, true); - } + this.PropertiesVisible = true; + this.InheritanceVisible = false; + this.DefaultPropertiesVisible = false; + this.DefaultInheritanceVisible = false; + this.SetPropertyGridObject(App.Runtime.Windows.treeForm.tvConnections.SelectedNode.Tag as mRemoteNG.Root.Info); } - - private void propertyGridContextMenuReset_Click(System.Object sender, EventArgs e) + else { - try - { - GridItem gridItem = pGrid.SelectedGridItem; - if (pGrid.SelectedObject != null && gridItem != null && gridItem.PropertyDescriptor != null && gridItem.PropertyDescriptor.CanResetValue(pGrid.SelectedObject)) - { - pGrid.ResetSelectedProperty(); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage("UI.Window.Config.propertyGridContextMenuReset_Click() failed.", ex, MessageClass.ErrorMsg, true); - } - } - - private void propertyGridContextMenuShowHelpText_Click(object sender, EventArgs e) - { - propertyGridContextMenuShowHelpText.Checked = !propertyGridContextMenuShowHelpText.Checked; - } - - private void propertyGridContextMenuShowHelpText_CheckedChanged(object sender, EventArgs e) - { - Settings.ShowConfigHelpText = propertyGridContextMenuShowHelpText.Checked; - pGrid.HelpVisible = propertyGridContextMenuShowHelpText.Checked; + this.PropertiesVisible = true; + this.InheritanceVisible = false; + this.DefaultPropertiesVisible = false; + this.DefaultInheritanceVisible = false; + this.SetPropertyGridObject((this.pGrid.SelectedObject as mRemoteNG.Connection.Info.Inheritance).Parent); } } + else if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) + { + if ((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).IsDefault) + { + this.PropertiesVisible = true; + this.InheritanceVisible = false; + this.DefaultPropertiesVisible = false; + this.DefaultInheritanceVisible = false; + this.SetPropertyGridObject(App.Runtime.Windows.treeForm.tvConnections.SelectedNode.Tag as mRemoteNG.Root.Info); + } + } + } + + private void btnShowDefaultProperties_Click(object sender, System.EventArgs e) + { + if (this.pGrid.SelectedObject is mRemoteNG.Root.Info|| this.pGrid.SelectedObject is mRemoteNG.Connection.Info.Inheritance) + { + this.PropertiesVisible = false; + this.InheritanceVisible = false; + this.DefaultPropertiesVisible = true; + this.DefaultInheritanceVisible = false; + this.SetPropertyGridObject(App.Runtime.DefaultConnectionFromSettings()); + } + } + + private void btnShowInheritance_Click(object sender, System.EventArgs e) + { + if (this.pGrid.SelectedObject is mRemoteNG.Connection.Info) + { + this.PropertiesVisible = false; + this.InheritanceVisible = true; + this.DefaultPropertiesVisible = false; + this.DefaultInheritanceVisible = false; + this.SetPropertyGridObject((this.pGrid.SelectedObject as mRemoteNG.Connection.Info).Inherit); + } + } + + private void btnShowDefaultInheritance_Click(object sender, System.EventArgs e) + { + if (this.pGrid.SelectedObject is mRemoteNG.Root.Info|| this.pGrid.SelectedObject is mRemoteNG.Connection.Info) + { + this.PropertiesVisible = false; + this.InheritanceVisible = false; + this.DefaultPropertiesVisible = false; + this.DefaultInheritanceVisible = true; + this.SetPropertyGridObject(App.Runtime.DefaultInheritanceFromSettings()); + } + } + + private void btnHostStatus_Click(object sender, System.EventArgs e) + { + SetHostStatus(this.pGrid.SelectedObject); + } + + private void btnIcon_Click(object sender, System.Windows.Forms.MouseEventArgs e) + { + try + { + if (pGrid.SelectedObject is mRemoteNG.Connection.Info&& !(pGrid.SelectedObject is mRemoteNG.Connection.PuttySession.Info)) + { + this.cMenIcons.Items.Clear(); + + foreach (string iStr in mRemoteNG.Connection.Icon.Icons) + { + ToolStripMenuItem tI = new ToolStripMenuItem(); + tI.Text = iStr; + tI.Image = mRemoteNG.Connection.Icon.FromString(iStr).ToBitmap(); + tI.Click += IconMenu_Click; + + this.cMenIcons.Items.Add(tI); + } + + Point mPos = new Point(PointToScreen(new Point(e.Location.X + this.pGrid.Width - 100, e.Location.Y))); + this.cMenIcons.Show(mPos); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridButtonIconClickFailed + Constants.vbNewLine + ex.Message, true); + } + } + + private void IconMenu_Click(object sender, EventArgs e) + { + try + { + mRemoteNG.Connection.Info connectionInfo = pGrid.SelectedObject as mRemoteNG.Connection.Info; + if (connectionInfo == null) + { + return ; + } + + ToolStripMenuItem selectedMenuItem = sender as ToolStripMenuItem; + if (selectedMenuItem == null) + { + return ; + } + + string iconName = selectedMenuItem.Text; + if (string.IsNullOrEmpty(iconName)) + { + return ; + } + + Icon connectionIcon = mRemoteNG.Connection.Icon.FromString(iconName); + if (connectionIcon == null) + { + return ; + } + + btnIcon.Image = connectionIcon.ToBitmap(); + + connectionInfo.Icon = iconName; + pGrid.Refresh(); + + SaveConnectionsBG(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strConfigPropertyGridMenuClickFailed + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Host Status (Ping) + private string HostName; + private System.Threading.Thread pThread; + + private void CheckHostAlive() + { + Ping pingSender = new Ping(); + PingReply pReply; + + try + { + pReply = pingSender.Send(HostName); + + if (pReply.Status == IPStatus.Success) + { + if ((string) this.btnHostStatus.Tag == "checking") + { + ShowStatusImage(global::My.Resources.HostStatus_On); + } + } + else + { + if ((string) this.btnHostStatus.Tag == "checking") + { + ShowStatusImage(global::My.Resources.HostStatus_Off); + } + } + } + catch (Exception) + { + if ((string) this.btnHostStatus.Tag == "checking") + { + ShowStatusImage(global::My.Resources.HostStatus_Off); + } + } + } + + delegate void ShowStatusImageCB(Image Image); + private void ShowStatusImage(Image Image) + { + if (this.pGrid.InvokeRequired) + { + ShowStatusImageCB d = new ShowStatusImageCB(ShowStatusImage); + this.pGrid.Invoke(d, new object[] {Image}); + } + else + { + this.btnHostStatus.Image = Image; + this.btnHostStatus.Tag = "checkfinished"; + } + } + + public void SetHostStatus(object ConnectionInfo) + { + try + { + this.btnHostStatus.Image = global::My.Resources.HostStatus_Check; + + // To check status, ConnectionInfo must be an mRemoteNG.Connection.Info that is not a container + if (ConnectionInfo is mRemoteNG.Connection.Info) + { + if ((ConnectionInfo as mRemoteNG.Connection.Info).IsContainer) + { + return ; + } + } + else + { + return ; + } + + this.btnHostStatus.Tag = "checking"; + HostName = (ConnectionInfo as mRemoteNG.Connection.Info).Hostname; + pThread = new System.Threading.Thread(new System.Threading.ThreadStart(CheckHostAlive)); + pThread.SetApartmentState(System.Threading.ApartmentState.STA); + pThread.IsBackground = true; + pThread.Start(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strConfigPropertyGridSetHostStatusFailed + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + private void propertyGridContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + try + { + propertyGridContextMenuShowHelpText.Checked = Settings.ShowConfigHelpText; + GridItem gridItem = pGrid.SelectedGridItem; + propertyGridContextMenuReset.Enabled = System.Convert.ToBoolean(pGrid.SelectedObject != null && gridItem != null && gridItem.PropertyDescriptor != null && gridItem.PropertyDescriptor.CanResetValue(pGrid.SelectedObject)); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage("UI.Window.Config.propertyGridContextMenu_Opening() failed.", ex, MessageClass.ErrorMsg, true); + } + } + + private void propertyGridContextMenuReset_Click(System.Object sender, EventArgs e) + { + try + { + GridItem gridItem = pGrid.SelectedGridItem; + if (pGrid.SelectedObject != null && gridItem != null && gridItem.PropertyDescriptor != null && gridItem.PropertyDescriptor.CanResetValue(pGrid.SelectedObject)) + { + pGrid.ResetSelectedProperty(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage("UI.Window.Config.propertyGridContextMenuReset_Click() failed.", ex, MessageClass.ErrorMsg, true); + } + } + + private void propertyGridContextMenuShowHelpText_Click(object sender, EventArgs e) + { + propertyGridContextMenuShowHelpText.Checked = !propertyGridContextMenuShowHelpText.Checked; + } + + private void propertyGridContextMenuShowHelpText_CheckedChanged(object sender, EventArgs e) + { + Settings.ShowConfigHelpText = propertyGridContextMenuShowHelpText.Checked; + pGrid.HelpVisible = propertyGridContextMenuShowHelpText.Checked; + } + } } diff --git a/mRemoteV1/CS/UI/UI.Window.Connection.cs b/mRemoteV1/CS/UI/UI.Window.Connection.cs index eda2a6808..b277c1a0d 100644 --- a/mRemoteV1/CS/UI/UI.Window.Connection.cs +++ b/mRemoteV1/CS/UI/UI.Window.Connection.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,1340 +8,1336 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Windows; using mRemoteNG.Connection; using mRemoteNG.App; using Crownwood; using WeifenLuo.WinFormsUI.Docking; using PSTaskDialog; -//using mRemoteNG.App.Runtime; using mRemoteNG.Config; namespace mRemoteNG.UI.Window { public class Connection : UI.Window.Base + { + #region Form Init + internal System.Windows.Forms.ContextMenuStrip cmenTab; + private System.ComponentModel.Container components = null; + internal System.Windows.Forms.ToolStripMenuItem cmenTabFullscreen; + internal System.Windows.Forms.ToolStripMenuItem cmenTabScreenshot; + internal System.Windows.Forms.ToolStripMenuItem cmenTabTransferFile; + internal System.Windows.Forms.ToolStripMenuItem cmenTabSendSpecialKeys; + internal System.Windows.Forms.ToolStripSeparator cmenTabSep1; + internal System.Windows.Forms.ToolStripMenuItem cmenTabRenameTab; + internal System.Windows.Forms.ToolStripMenuItem cmenTabDuplicateTab; + internal System.Windows.Forms.ToolStripMenuItem cmenTabDisconnect; + internal System.Windows.Forms.ToolStripMenuItem cmenTabSmartSize; + internal System.Windows.Forms.ToolStripMenuItem cmenTabSendSpecialKeysCtrlAltDel; + internal System.Windows.Forms.ToolStripMenuItem cmenTabSendSpecialKeysCtrlEsc; + internal System.Windows.Forms.ToolStripMenuItem cmenTabViewOnly; + internal System.Windows.Forms.ToolStripMenuItem cmenTabReconnect; + internal System.Windows.Forms.ToolStripMenuItem cmenTabExternalApps; + internal System.Windows.Forms.ToolStripMenuItem cmenTabStartChat; + internal System.Windows.Forms.ToolStripMenuItem cmenTabRefreshScreen; + internal System.Windows.Forms.ToolStripSeparator ToolStripSeparator1; + internal System.Windows.Forms.ToolStripMenuItem cmenTabPuttySettings; + + public Crownwood.Magic.Controls.TabControl TabController; + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.Load += new System.EventHandler(Connection_Load); + this.DockStateChanged += new System.EventHandler(Connection_DockStateChanged); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Connection_FormClosing); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Connection)); + this.TabController = new Crownwood.Magic.Controls.TabControl(); + this.TabController.ClosePressed += new System.EventHandler(this.TabController_ClosePressed); + this.TabController.DoubleClickTab += new Crownwood.Magic.Controls.TabControl.DoubleClickTabHandler(this.TabController_DoubleClickTab); + this.TabController.DragDrop += new System.Windows.Forms.DragEventHandler(this.TabController_DragDrop); + this.TabController.DragEnter += new System.Windows.Forms.DragEventHandler(this.TabController_DragEnter); + this.TabController.DragOver += new System.Windows.Forms.DragEventHandler(this.TabController_DragOver); + this.TabController.SelectionChanged += new System.EventHandler(this.TabController_SelectionChanged); + this.TabController.MouseUp += new System.Windows.Forms.MouseEventHandler(this.TabController_MouseUp); + this.TabController.PageDragEnd += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragStart); + this.TabController.PageDragStart += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragStart); + this.TabController.PageDragMove += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragMove); + this.TabController.PageDragEnd += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragEnd); + this.TabController.PageDragQuit += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragEnd); + this.cmenTab = new System.Windows.Forms.ContextMenuStrip(this.components); + this.cmenTabFullscreen = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabFullscreen.Click += new System.EventHandler(this.cmenTabFullscreen_Click); + this.cmenTabSmartSize = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabSmartSize.Click += new System.EventHandler(this.cmenTabSmartSize_Click); + this.cmenTabViewOnly = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabViewOnly.Click += new System.EventHandler(this.cmenTabViewOnly_Click); + this.ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.cmenTabScreenshot = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabScreenshot.Click += new System.EventHandler(this.cmenTabScreenshot_Click); + this.cmenTabStartChat = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabStartChat.Click += new System.EventHandler(this.cmenTabStartChat_Click); + this.cmenTabTransferFile = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabTransferFile.Click += new System.EventHandler(this.cmenTabTransferFile_Click); + this.cmenTabRefreshScreen = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabRefreshScreen.Click += new System.EventHandler(this.cmenTabRefreshScreen_Click); + this.cmenTabSendSpecialKeys = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabSendSpecialKeysCtrlAltDel = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabSendSpecialKeysCtrlAltDel.Click += new System.EventHandler(this.cmenTabSendSpecialKeysCtrlAltDel_Click); + this.cmenTabSendSpecialKeysCtrlEsc = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabSendSpecialKeysCtrlEsc.Click += new System.EventHandler(this.cmenTabSendSpecialKeysCtrlEsc_Click); + this.cmenTabExternalApps = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.cmenTabRenameTab = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabRenameTab.Click += new System.EventHandler(this.cmenTabRenameTab_Click); + this.cmenTabDuplicateTab = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabDuplicateTab.Click += new System.EventHandler(this.cmenTabDuplicateTab_Click); + this.cmenTabReconnect = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabReconnect.Click += new System.EventHandler(this.cmenTabReconnect_Click); + this.cmenTabDisconnect = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabDisconnect.Click += new System.EventHandler(this.cmenTabDisconnect_Click); + this.cmenTabPuttySettings = new System.Windows.Forms.ToolStripMenuItem(); + this.cmenTabPuttySettings.Click += new System.EventHandler(this.cmenTabPuttySettings_Click); + this.cmenTab.SuspendLayout(); + this.SuspendLayout(); + // + //TabController + // + this.TabController.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.TabController.Appearance = Crownwood.Magic.Controls.TabControl.VisualAppearance.MultiDocument; + this.TabController.Cursor = System.Windows.Forms.Cursors.Hand; + this.TabController.DragFromControl = false; + this.TabController.IDEPixelArea = true; + this.TabController.IDEPixelBorder = false; + this.TabController.Location = new System.Drawing.Point(0, -1); + this.TabController.Name = "TabController"; + this.TabController.Size = new System.Drawing.Size(632, 454); + this.TabController.TabIndex = 0; + // + //cmenTab + // + this.cmenTab.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cmenTabFullscreen, this.cmenTabSmartSize, this.cmenTabViewOnly, this.ToolStripSeparator1, this.cmenTabScreenshot, this.cmenTabStartChat, this.cmenTabTransferFile, this.cmenTabRefreshScreen, this.cmenTabSendSpecialKeys, this.cmenTabPuttySettings, this.cmenTabExternalApps, this.cmenTabSep1, this.cmenTabRenameTab, this.cmenTabDuplicateTab, this.cmenTabReconnect, this.cmenTabDisconnect}); + this.cmenTab.Name = "cmenTab"; + this.cmenTab.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.cmenTab.Size = new System.Drawing.Size(202, 346); + // + //cmenTabFullscreen + // + this.cmenTabFullscreen.Image = global::My.Resources.Resources.arrow_out; + this.cmenTabFullscreen.Name = "cmenTabFullscreen"; + this.cmenTabFullscreen.Size = new System.Drawing.Size(201, 22); + this.cmenTabFullscreen.Text = "Fullscreen (RDP)"; + // + //cmenTabSmartSize + // + this.cmenTabSmartSize.Image = global::My.Resources.Resources.SmartSize; + this.cmenTabSmartSize.Name = "cmenTabSmartSize"; + this.cmenTabSmartSize.Size = new System.Drawing.Size(201, 22); + this.cmenTabSmartSize.Text = "SmartSize (RDP/VNC)"; + // + //cmenTabViewOnly + // + this.cmenTabViewOnly.Name = "cmenTabViewOnly"; + this.cmenTabViewOnly.Size = new System.Drawing.Size(201, 22); + this.cmenTabViewOnly.Text = "View Only (VNC)"; + // + //ToolStripSeparator1 + // + this.ToolStripSeparator1.Name = "ToolStripSeparator1"; + this.ToolStripSeparator1.Size = new System.Drawing.Size(198, 6); + // + //cmenTabScreenshot + // + this.cmenTabScreenshot.Image = global::My.Resources.Resources.Screenshot_Add; + this.cmenTabScreenshot.Name = "cmenTabScreenshot"; + this.cmenTabScreenshot.Size = new System.Drawing.Size(201, 22); + this.cmenTabScreenshot.Text = "Screenshot"; + // + //cmenTabStartChat + // + this.cmenTabStartChat.Image = global::My.Resources.Resources.Chat; + this.cmenTabStartChat.Name = "cmenTabStartChat"; + this.cmenTabStartChat.Size = new System.Drawing.Size(201, 22); + this.cmenTabStartChat.Text = "Start Chat (VNC)"; + this.cmenTabStartChat.Visible = false; + // + //cmenTabTransferFile + // + this.cmenTabTransferFile.Image = global::My.Resources.Resources.SSHTransfer; + this.cmenTabTransferFile.Name = "cmenTabTransferFile"; + this.cmenTabTransferFile.Size = new System.Drawing.Size(201, 22); + this.cmenTabTransferFile.Text = "Transfer File (SSH)"; + // + //cmenTabRefreshScreen + // + this.cmenTabRefreshScreen.Image = global::My.Resources.Resources.Refresh; + this.cmenTabRefreshScreen.Name = "cmenTabRefreshScreen"; + this.cmenTabRefreshScreen.Size = new System.Drawing.Size(201, 22); + this.cmenTabRefreshScreen.Text = "Refresh Screen (VNC)"; + // + //cmenTabSendSpecialKeys + // + this.cmenTabSendSpecialKeys.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cmenTabSendSpecialKeysCtrlAltDel, this.cmenTabSendSpecialKeysCtrlEsc}); + this.cmenTabSendSpecialKeys.Image = global::My.Resources.Resources.Keyboard; + this.cmenTabSendSpecialKeys.Name = "cmenTabSendSpecialKeys"; + this.cmenTabSendSpecialKeys.Size = new System.Drawing.Size(201, 22); + this.cmenTabSendSpecialKeys.Text = "Send special Keys (VNC)"; + // + //cmenTabSendSpecialKeysCtrlAltDel + // + this.cmenTabSendSpecialKeysCtrlAltDel.Name = "cmenTabSendSpecialKeysCtrlAltDel"; + this.cmenTabSendSpecialKeysCtrlAltDel.Size = new System.Drawing.Size(141, 22); + this.cmenTabSendSpecialKeysCtrlAltDel.Text = "Ctrl+Alt+Del"; + // + //cmenTabSendSpecialKeysCtrlEsc + // + this.cmenTabSendSpecialKeysCtrlEsc.Name = "cmenTabSendSpecialKeysCtrlEsc"; + this.cmenTabSendSpecialKeysCtrlEsc.Size = new System.Drawing.Size(141, 22); + this.cmenTabSendSpecialKeysCtrlEsc.Text = "Ctrl+Esc"; + // + //cmenTabExternalApps + // + this.cmenTabExternalApps.Image = (System.Drawing.Image) (resources.GetObject("cmenTabExternalApps.Image")); + this.cmenTabExternalApps.Name = "cmenTabExternalApps"; + this.cmenTabExternalApps.Size = new System.Drawing.Size(201, 22); + this.cmenTabExternalApps.Text = "External Applications"; + // + //cmenTabSep1 + // + this.cmenTabSep1.Name = "cmenTabSep1"; + this.cmenTabSep1.Size = new System.Drawing.Size(198, 6); + // + //cmenTabRenameTab + // + this.cmenTabRenameTab.Image = global::My.Resources.Resources.Rename; + this.cmenTabRenameTab.Name = "cmenTabRenameTab"; + this.cmenTabRenameTab.Size = new System.Drawing.Size(201, 22); + this.cmenTabRenameTab.Text = "Rename Tab"; + // + //cmenTabDuplicateTab + // + this.cmenTabDuplicateTab.Name = "cmenTabDuplicateTab"; + this.cmenTabDuplicateTab.Size = new System.Drawing.Size(201, 22); + this.cmenTabDuplicateTab.Text = "Duplicate Tab"; + // + //cmenTabReconnect + // + this.cmenTabReconnect.Image = (System.Drawing.Image) (resources.GetObject("cmenTabReconnect.Image")); + this.cmenTabReconnect.Name = "cmenTabReconnect"; + this.cmenTabReconnect.Size = new System.Drawing.Size(201, 22); + this.cmenTabReconnect.Text = "Reconnect"; + // + //cmenTabDisconnect + // + this.cmenTabDisconnect.Image = global::My.Resources.Resources.Pause; + this.cmenTabDisconnect.Name = "cmenTabDisconnect"; + this.cmenTabDisconnect.Size = new System.Drawing.Size(201, 22); + this.cmenTabDisconnect.Text = "Disconnect"; + // + //cmenTabPuttySettings + // + this.cmenTabPuttySettings.Name = "cmenTabPuttySettings"; + this.cmenTabPuttySettings.Size = new System.Drawing.Size(201, 22); + this.cmenTabPuttySettings.Text = "PuTTY Settings"; + // + //Connection + // + this.ClientSize = new System.Drawing.Size(632, 453); + this.Controls.Add(this.TabController); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.Icon = global::My.Resources.Resources.mRemote_Icon; + this.Name = "Connection"; + this.TabText = "UI.Window.Connection"; + this.Text = "UI.Window.Connection"; + this.cmenTab.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + #region Public Methods + public Connection(DockContent Panel, string FormText = "") + { + + if (FormText == "") { - -#region Form Init - internal System.Windows.Forms.ContextMenuStrip cmenTab; - private System.ComponentModel.Container components = null; - internal System.Windows.Forms.ToolStripMenuItem cmenTabFullscreen; - internal System.Windows.Forms.ToolStripMenuItem cmenTabScreenshot; - internal System.Windows.Forms.ToolStripMenuItem cmenTabTransferFile; - internal System.Windows.Forms.ToolStripMenuItem cmenTabSendSpecialKeys; - internal System.Windows.Forms.ToolStripSeparator cmenTabSep1; - internal System.Windows.Forms.ToolStripMenuItem cmenTabRenameTab; - internal System.Windows.Forms.ToolStripMenuItem cmenTabDuplicateTab; - internal System.Windows.Forms.ToolStripMenuItem cmenTabDisconnect; - internal System.Windows.Forms.ToolStripMenuItem cmenTabSmartSize; - internal System.Windows.Forms.ToolStripMenuItem cmenTabSendSpecialKeysCtrlAltDel; - internal System.Windows.Forms.ToolStripMenuItem cmenTabSendSpecialKeysCtrlEsc; - internal System.Windows.Forms.ToolStripMenuItem cmenTabViewOnly; - internal System.Windows.Forms.ToolStripMenuItem cmenTabReconnect; - internal System.Windows.Forms.ToolStripMenuItem cmenTabExternalApps; - internal System.Windows.Forms.ToolStripMenuItem cmenTabStartChat; - internal System.Windows.Forms.ToolStripMenuItem cmenTabRefreshScreen; - internal System.Windows.Forms.ToolStripSeparator ToolStripSeparator1; - internal System.Windows.Forms.ToolStripMenuItem cmenTabPuttySettings; - - public Crownwood.Magic.Controls.TabControl TabController; - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.Load += new System.EventHandler(Connection_Load); - this.DockStateChanged += new System.EventHandler(Connection_DockStateChanged); - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Connection_FormClosing); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Connection)); - this.TabController = new Crownwood.Magic.Controls.TabControl(); - this.TabController.ClosePressed += new System.EventHandler(this.TabController_ClosePressed); - this.TabController.DoubleClickTab += new Crownwood.Magic.Controls.TabControl.DoubleClickTabHandler(this.TabController_DoubleClickTab); - this.TabController.DragDrop += new System.Windows.Forms.DragEventHandler(this.TabController_DragDrop); - this.TabController.DragEnter += new System.Windows.Forms.DragEventHandler(this.TabController_DragEnter); - this.TabController.DragOver += new System.Windows.Forms.DragEventHandler(this.TabController_DragOver); - this.TabController.SelectionChanged += new System.EventHandler(this.TabController_SelectionChanged); - this.TabController.MouseUp += new System.Windows.Forms.MouseEventHandler(this.TabController_MouseUp); - this.TabController.PageDragEnd += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragStart); - this.TabController.PageDragStart += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragStart); - this.TabController.PageDragMove += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragMove); - this.TabController.PageDragEnd += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragEnd); - this.TabController.PageDragQuit += new System.Windows.Forms.MouseEventHandler(this.TabController_PageDragEnd); - this.cmenTab = new System.Windows.Forms.ContextMenuStrip(this.components); - this.cmenTabFullscreen = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabFullscreen.Click += new System.EventHandler(this.cmenTabFullscreen_Click); - this.cmenTabSmartSize = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabSmartSize.Click += new System.EventHandler(this.cmenTabSmartSize_Click); - this.cmenTabViewOnly = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabViewOnly.Click += new System.EventHandler(this.cmenTabViewOnly_Click); - this.ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.cmenTabScreenshot = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabScreenshot.Click += new System.EventHandler(this.cmenTabScreenshot_Click); - this.cmenTabStartChat = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabStartChat.Click += new System.EventHandler(this.cmenTabStartChat_Click); - this.cmenTabTransferFile = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabTransferFile.Click += new System.EventHandler(this.cmenTabTransferFile_Click); - this.cmenTabRefreshScreen = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabRefreshScreen.Click += new System.EventHandler(this.cmenTabRefreshScreen_Click); - this.cmenTabSendSpecialKeys = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabSendSpecialKeysCtrlAltDel = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabSendSpecialKeysCtrlAltDel.Click += new System.EventHandler(this.cmenTabSendSpecialKeysCtrlAltDel_Click); - this.cmenTabSendSpecialKeysCtrlEsc = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabSendSpecialKeysCtrlEsc.Click += new System.EventHandler(this.cmenTabSendSpecialKeysCtrlEsc_Click); - this.cmenTabExternalApps = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabSep1 = new System.Windows.Forms.ToolStripSeparator(); - this.cmenTabRenameTab = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabRenameTab.Click += new System.EventHandler(this.cmenTabRenameTab_Click); - this.cmenTabDuplicateTab = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabDuplicateTab.Click += new System.EventHandler(this.cmenTabDuplicateTab_Click); - this.cmenTabReconnect = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabReconnect.Click += new System.EventHandler(this.cmenTabReconnect_Click); - this.cmenTabDisconnect = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabDisconnect.Click += new System.EventHandler(this.cmenTabDisconnect_Click); - this.cmenTabPuttySettings = new System.Windows.Forms.ToolStripMenuItem(); - this.cmenTabPuttySettings.Click += new System.EventHandler(this.cmenTabPuttySettings_Click); - this.cmenTab.SuspendLayout(); - this.SuspendLayout(); - // - //TabController - // - this.TabController.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.TabController.Appearance = Crownwood.Magic.Controls.TabControl.VisualAppearance.MultiDocument; - this.TabController.Cursor = System.Windows.Forms.Cursors.Hand; - this.TabController.DragFromControl = false; - this.TabController.IDEPixelArea = true; - this.TabController.IDEPixelBorder = false; - this.TabController.Location = new System.Drawing.Point(0, -1); - this.TabController.Name = "TabController"; - this.TabController.Size = new System.Drawing.Size(632, 454); - this.TabController.TabIndex = 0; - // - //cmenTab - // - this.cmenTab.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cmenTabFullscreen, this.cmenTabSmartSize, this.cmenTabViewOnly, this.ToolStripSeparator1, this.cmenTabScreenshot, this.cmenTabStartChat, this.cmenTabTransferFile, this.cmenTabRefreshScreen, this.cmenTabSendSpecialKeys, this.cmenTabPuttySettings, this.cmenTabExternalApps, this.cmenTabSep1, this.cmenTabRenameTab, this.cmenTabDuplicateTab, this.cmenTabReconnect, this.cmenTabDisconnect}); - this.cmenTab.Name = "cmenTab"; - this.cmenTab.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.cmenTab.Size = new System.Drawing.Size(202, 346); - // - //cmenTabFullscreen - // - this.cmenTabFullscreen.Image = global::My.Resources.Resources.arrow_out; - this.cmenTabFullscreen.Name = "cmenTabFullscreen"; - this.cmenTabFullscreen.Size = new System.Drawing.Size(201, 22); - this.cmenTabFullscreen.Text = "Fullscreen (RDP)"; - // - //cmenTabSmartSize - // - this.cmenTabSmartSize.Image = global::My.Resources.Resources.SmartSize; - this.cmenTabSmartSize.Name = "cmenTabSmartSize"; - this.cmenTabSmartSize.Size = new System.Drawing.Size(201, 22); - this.cmenTabSmartSize.Text = "SmartSize (RDP/VNC)"; - // - //cmenTabViewOnly - // - this.cmenTabViewOnly.Name = "cmenTabViewOnly"; - this.cmenTabViewOnly.Size = new System.Drawing.Size(201, 22); - this.cmenTabViewOnly.Text = "View Only (VNC)"; - // - //ToolStripSeparator1 - // - this.ToolStripSeparator1.Name = "ToolStripSeparator1"; - this.ToolStripSeparator1.Size = new System.Drawing.Size(198, 6); - // - //cmenTabScreenshot - // - this.cmenTabScreenshot.Image = global::My.Resources.Resources.Screenshot_Add; - this.cmenTabScreenshot.Name = "cmenTabScreenshot"; - this.cmenTabScreenshot.Size = new System.Drawing.Size(201, 22); - this.cmenTabScreenshot.Text = "Screenshot"; - // - //cmenTabStartChat - // - this.cmenTabStartChat.Image = global::My.Resources.Resources.Chat; - this.cmenTabStartChat.Name = "cmenTabStartChat"; - this.cmenTabStartChat.Size = new System.Drawing.Size(201, 22); - this.cmenTabStartChat.Text = "Start Chat (VNC)"; - this.cmenTabStartChat.Visible = false; - // - //cmenTabTransferFile - // - this.cmenTabTransferFile.Image = global::My.Resources.Resources.SSHTransfer; - this.cmenTabTransferFile.Name = "cmenTabTransferFile"; - this.cmenTabTransferFile.Size = new System.Drawing.Size(201, 22); - this.cmenTabTransferFile.Text = "Transfer File (SSH)"; - // - //cmenTabRefreshScreen - // - this.cmenTabRefreshScreen.Image = global::My.Resources.Resources.Refresh; - this.cmenTabRefreshScreen.Name = "cmenTabRefreshScreen"; - this.cmenTabRefreshScreen.Size = new System.Drawing.Size(201, 22); - this.cmenTabRefreshScreen.Text = "Refresh Screen (VNC)"; - // - //cmenTabSendSpecialKeys - // - this.cmenTabSendSpecialKeys.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cmenTabSendSpecialKeysCtrlAltDel, this.cmenTabSendSpecialKeysCtrlEsc}); - this.cmenTabSendSpecialKeys.Image = global::My.Resources.Resources.Keyboard; - this.cmenTabSendSpecialKeys.Name = "cmenTabSendSpecialKeys"; - this.cmenTabSendSpecialKeys.Size = new System.Drawing.Size(201, 22); - this.cmenTabSendSpecialKeys.Text = "Send special Keys (VNC)"; - // - //cmenTabSendSpecialKeysCtrlAltDel - // - this.cmenTabSendSpecialKeysCtrlAltDel.Name = "cmenTabSendSpecialKeysCtrlAltDel"; - this.cmenTabSendSpecialKeysCtrlAltDel.Size = new System.Drawing.Size(141, 22); - this.cmenTabSendSpecialKeysCtrlAltDel.Text = "Ctrl+Alt+Del"; - // - //cmenTabSendSpecialKeysCtrlEsc - // - this.cmenTabSendSpecialKeysCtrlEsc.Name = "cmenTabSendSpecialKeysCtrlEsc"; - this.cmenTabSendSpecialKeysCtrlEsc.Size = new System.Drawing.Size(141, 22); - this.cmenTabSendSpecialKeysCtrlEsc.Text = "Ctrl+Esc"; - // - //cmenTabExternalApps - // - this.cmenTabExternalApps.Image = (System.Drawing.Image) (resources.GetObject("cmenTabExternalApps.Image")); - this.cmenTabExternalApps.Name = "cmenTabExternalApps"; - this.cmenTabExternalApps.Size = new System.Drawing.Size(201, 22); - this.cmenTabExternalApps.Text = "External Applications"; - // - //cmenTabSep1 - // - this.cmenTabSep1.Name = "cmenTabSep1"; - this.cmenTabSep1.Size = new System.Drawing.Size(198, 6); - // - //cmenTabRenameTab - // - this.cmenTabRenameTab.Image = global::My.Resources.Resources.Rename; - this.cmenTabRenameTab.Name = "cmenTabRenameTab"; - this.cmenTabRenameTab.Size = new System.Drawing.Size(201, 22); - this.cmenTabRenameTab.Text = "Rename Tab"; - // - //cmenTabDuplicateTab - // - this.cmenTabDuplicateTab.Name = "cmenTabDuplicateTab"; - this.cmenTabDuplicateTab.Size = new System.Drawing.Size(201, 22); - this.cmenTabDuplicateTab.Text = "Duplicate Tab"; - // - //cmenTabReconnect - // - this.cmenTabReconnect.Image = (System.Drawing.Image) (resources.GetObject("cmenTabReconnect.Image")); - this.cmenTabReconnect.Name = "cmenTabReconnect"; - this.cmenTabReconnect.Size = new System.Drawing.Size(201, 22); - this.cmenTabReconnect.Text = "Reconnect"; - // - //cmenTabDisconnect - // - this.cmenTabDisconnect.Image = global::My.Resources.Resources.Pause; - this.cmenTabDisconnect.Name = "cmenTabDisconnect"; - this.cmenTabDisconnect.Size = new System.Drawing.Size(201, 22); - this.cmenTabDisconnect.Text = "Disconnect"; - // - //cmenTabPuttySettings - // - this.cmenTabPuttySettings.Name = "cmenTabPuttySettings"; - this.cmenTabPuttySettings.Size = new System.Drawing.Size(201, 22); - this.cmenTabPuttySettings.Text = "PuTTY Settings"; - // - //Connection - // - this.ClientSize = new System.Drawing.Size(632, 453); - this.Controls.Add(this.TabController); - this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.Icon = global::My.Resources.Resources.mRemote_Icon; - this.Name = "Connection"; - this.TabText = "UI.Window.Connection"; - this.Text = "UI.Window.Connection"; - this.cmenTab.ResumeLayout(false); - this.ResumeLayout(false); + FormText = My.Language.strNewPanel; + } + this.WindowType = Type.Connection; + this.DockPnl = Panel; + this.InitializeComponent(); + this.Text = FormText; + this.TabText = FormText; + } + + public Crownwood.Magic.Controls.TabPage AddConnectionTab(Protocol.Info conI) + { + try + { + Crownwood.Magic.Controls.TabPage nTab = new Crownwood.Magic.Controls.TabPage(); + nTab.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); + + if (My.Settings.Default.ShowProtocolOnTabs) + { + nTab.Title = conI.Protocol.ToString() + ": "; } -#endregion - -#region Public Methods - public Connection(DockContent Panel, string FormText = "") + else { - - if (FormText == "") + nTab.Title = ""; + } + + nTab.Title += conI.Name; + + if (My.Settings.Default.ShowLogonInfoOnTabs) + { + nTab.Title += " ("; + + if (conI.Domain != "") { - FormText = My.Language.strNewPanel; + nTab.Title += conI.Domain; } - - this.WindowType = Type.Connection; - this.DockPnl = Panel; - this.InitializeComponent(); - this.Text = FormText; - this.TabText = FormText; - } - - public Crownwood.Magic.Controls.TabPage AddConnectionTab(Protocol.Info conI) - { - try + + if (conI.Username != "") { - Crownwood.Magic.Controls.TabPage nTab = new Crownwood.Magic.Controls.TabPage(); - nTab.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); - - if (My.Settings.Default.ShowProtocolOnTabs) + if (conI.Domain != "") { - nTab.Title = conI.Protocol.ToString() + ": "; + nTab.Title += "\\"; } - else - { - nTab.Title = ""; - } - - nTab.Title += conI.Name; - - if (My.Settings.Default.ShowLogonInfoOnTabs) - { - nTab.Title += " ("; - - if (conI.Domain != "") - { - nTab.Title += conI.Domain; - } - - if (conI.Username != "") - { - if (conI.Domain != "") - { - nTab.Title += "\\"; - } - nTab.Title += conI.Username; - } + nTab.Title += conI.Username; + } - nTab.Title += ")"; - } + nTab.Title += ")"; + } - nTab.Title = nTab.Title.Replace("&", "&&"); + nTab.Title = nTab.Title.Replace("&", "&&"); - System.Drawing.Icon conIcon = mRemoteNG.Connection.Icon.FromString(conI.Icon); - if (conIcon != null) - { - nTab.Icon = conIcon; - } + System.Drawing.Icon conIcon = mRemoteNG.Connection.Icon.FromString(conI.Icon); + if (conIcon != null) + { + nTab.Icon = conIcon; + } - if (My.Settings.Default.OpenTabsRightOfSelected) - { - this.TabController.TabPages.Insert(this.TabController.SelectedIndex + 1, nTab); - } - else - { - this.TabController.TabPages.Add(nTab); - } + if (My.Settings.Default.OpenTabsRightOfSelected) + { + this.TabController.TabPages.Insert(this.TabController.SelectedIndex + 1, nTab); + } + else + { + this.TabController.TabPages.Add(nTab); + } - nTab.Selected = true; - _ignoreChangeSelectedTabClick = false; + nTab.Selected = true; + _ignoreChangeSelectedTabClick = false; - return nTab; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddConnectionTab (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } + return nTab; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddConnectionTab (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } - return null; - } -#endregion + return null; + } + #endregion -#region Private Methods - public void UpdateSelectedConnection() + #region Private Methods + public void UpdateSelectedConnection() + { + if (TabController.SelectedTab == null) + { + frmMain.Default.SelectedConnection = null; + } + else + { + InterfaceControl interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; + if (interfaceControl == null) { - if (TabController.SelectedTab == null) - { - frmMain.Default.SelectedConnection = null; - } - else - { - InterfaceControl interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; - if (interfaceControl == null) - { - frmMain.Default.SelectedConnection = null; - } - else - { - frmMain.Default.SelectedConnection = interfaceControl.Info; - } - } + frmMain.Default.SelectedConnection = null; } -#endregion - -#region Form - private void Connection_Load(object sender, System.EventArgs e) + else { - ApplyLanguage(); + frmMain.Default.SelectedConnection = interfaceControl.Info; } + } + } + #endregion - private bool _documentHandlersAdded = false; - private bool _floatHandlersAdded = false; - private void Connection_DockStateChanged(System.Object sender, EventArgs e) + #region Form + private void Connection_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); + } + + private bool _documentHandlersAdded = false; + private bool _floatHandlersAdded = false; + private void Connection_DockStateChanged(System.Object sender, EventArgs e) + { + if (DockState == DockState.Float) + { + if (_documentHandlersAdded) { - if (DockState == DockState.Float) - { - if (_documentHandlersAdded) - { - frmMain.Default.ResizeBegin -= Connection_ResizeBegin; - frmMain.Default.ResizeEnd -= Connection_ResizeEnd; - _documentHandlersAdded = false; - } - DockHandler.FloatPane.FloatWindow.ResizeBegin += Connection_ResizeBegin; - DockHandler.FloatPane.FloatWindow.ResizeEnd += Connection_ResizeEnd; - _floatHandlersAdded = true; - } - else if (DockState == DockState.Document) - { - if (_floatHandlersAdded) - { - DockHandler.FloatPane.FloatWindow.ResizeBegin -= Connection_ResizeBegin; - DockHandler.FloatPane.FloatWindow.ResizeEnd -= Connection_ResizeEnd; - _floatHandlersAdded = false; - } - frmMain.Default.ResizeBegin += Connection_ResizeBegin; - frmMain.Default.ResizeEnd += Connection_ResizeEnd; - _documentHandlersAdded = true; - } + frmMain.Default.ResizeBegin -= Connection_ResizeBegin; + frmMain.Default.ResizeEnd -= Connection_ResizeEnd; + _documentHandlersAdded = false; } - - private void ApplyLanguage() + DockHandler.FloatPane.FloatWindow.ResizeBegin += Connection_ResizeBegin; + DockHandler.FloatPane.FloatWindow.ResizeEnd += Connection_ResizeEnd; + _floatHandlersAdded = true; + } + else if (DockState == DockState.Document) + { + if (_floatHandlersAdded) { - cmenTabFullscreen.Text = My.Language.strMenuFullScreenRDP; - cmenTabSmartSize.Text = My.Language.strMenuSmartSize; - cmenTabViewOnly.Text = My.Language.strMenuViewOnly; - cmenTabScreenshot.Text = My.Language.strMenuScreenshot; - cmenTabStartChat.Text = My.Language.strMenuStartChat; - cmenTabTransferFile.Text = My.Language.strMenuTransferFile; - cmenTabRefreshScreen.Text = My.Language.strMenuRefreshScreen; - cmenTabSendSpecialKeys.Text = My.Language.strMenuSendSpecialKeys; - cmenTabSendSpecialKeysCtrlAltDel.Text = My.Language.strMenuCtrlAltDel; - cmenTabSendSpecialKeysCtrlEsc.Text = My.Language.strMenuCtrlEsc; - cmenTabExternalApps.Text = My.Language.strMenuExternalTools; - cmenTabRenameTab.Text = My.Language.strMenuRenameTab; - cmenTabDuplicateTab.Text = My.Language.strMenuDuplicateTab; - cmenTabReconnect.Text = My.Language.strMenuReconnect; - cmenTabDisconnect.Text = My.Language.strMenuDisconnect; - cmenTabPuttySettings.Text = My.Language.strPuttySettings; + DockHandler.FloatPane.FloatWindow.ResizeBegin -= Connection_ResizeBegin; + DockHandler.FloatPane.FloatWindow.ResizeEnd -= Connection_ResizeEnd; + _floatHandlersAdded = false; } + frmMain.Default.ResizeBegin += Connection_ResizeBegin; + frmMain.Default.ResizeEnd += Connection_ResizeEnd; + _documentHandlersAdded = true; + } + } - private void Connection_FormClosing(object sender, FormClosingEventArgs e) + private void ApplyLanguage() + { + cmenTabFullscreen.Text = My.Language.strMenuFullScreenRDP; + cmenTabSmartSize.Text = My.Language.strMenuSmartSize; + cmenTabViewOnly.Text = My.Language.strMenuViewOnly; + cmenTabScreenshot.Text = My.Language.strMenuScreenshot; + cmenTabStartChat.Text = My.Language.strMenuStartChat; + cmenTabTransferFile.Text = My.Language.strMenuTransferFile; + cmenTabRefreshScreen.Text = My.Language.strMenuRefreshScreen; + cmenTabSendSpecialKeys.Text = My.Language.strMenuSendSpecialKeys; + cmenTabSendSpecialKeysCtrlAltDel.Text = My.Language.strMenuCtrlAltDel; + cmenTabSendSpecialKeysCtrlEsc.Text = My.Language.strMenuCtrlEsc; + cmenTabExternalApps.Text = My.Language.strMenuExternalTools; + cmenTabRenameTab.Text = My.Language.strMenuRenameTab; + cmenTabDuplicateTab.Text = My.Language.strMenuDuplicateTab; + cmenTabReconnect.Text = My.Language.strMenuReconnect; + cmenTabDisconnect.Text = My.Language.strMenuDisconnect; + cmenTabPuttySettings.Text = My.Language.strPuttySettings; + } + + private void Connection_FormClosing(object sender, FormClosingEventArgs e) + { + if (!frmMain.Default.IsClosing && + ((My.Settings.Default.ConfirmCloseConnection == ConfirmClose.All & TabController.TabPages.Count > 0) || + (My.Settings.Default.ConfirmCloseConnection == ConfirmClose.Multiple & TabController.TabPages.Count > 1))) + { + DialogResult result = cTaskDialog.MessageBox(this, (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.ProductName, string.Format(My.Language.strConfirmCloseConnectionPanelMainInstruction, this.Text), "", "", "", My.Language.strCheckboxDoNotShowThisMessageAgain, eTaskDialogButtons.YesNo, eSysIcons.Question, null); + if (cTaskDialog.VerificationChecked) { - if (!frmMain.Default.IsClosing && - ((My.Settings.Default.ConfirmCloseConnection == ConfirmClose.All & TabController.TabPages.Count > 0) || - (My.Settings.Default.ConfirmCloseConnection == ConfirmClose.Multiple & TabController.TabPages.Count > 1))) - { - DialogResult result = cTaskDialog.MessageBox(this, (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.ProductName, string.Format(My.Language.strConfirmCloseConnectionPanelMainInstruction, this.Text), "", "", "", My.Language.strCheckboxDoNotShowThisMessageAgain, eTaskDialogButtons.YesNo, eSysIcons.Question, null); - if (cTaskDialog.VerificationChecked) - { - My.Settings.Default.ConfirmCloseConnection--; - } - if (result == DialogResult.No) - { - e.Cancel = true; - return; - } - } + My.Settings.Default.ConfirmCloseConnection--; + } + if (result == DialogResult.No) + { + e.Cancel = true; + return; + } + } - try + try + { + foreach (Crownwood.Magic.Controls.TabPage tabP in this.TabController.TabPages) + { + if (tabP.Tag != null) { - foreach (Crownwood.Magic.Controls.TabPage tabP in this.TabController.TabPages) - { - if (tabP.Tag != null) - { - mRemoteNG.Connection.InterfaceControl interfaceControl = tabP.Tag; - interfaceControl.Protocol.Close(); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Connection.Connection_FormClosing() failed" + Constants.vbNewLine + ex.Message, true); + mRemoteNG.Connection.InterfaceControl interfaceControl = tabP.Tag; + interfaceControl.Protocol.Close(); } } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Connection.Connection_FormClosing() failed" + Constants.vbNewLine + ex.Message, true); + } + } - private EventHandler ResizeBeginEvent; - public new event EventHandler ResizeBegin - { - add - { - ResizeBeginEvent = (EventHandler) System.Delegate.Combine(ResizeBeginEvent, value); - } - remove - { - ResizeBeginEvent = (EventHandler) System.Delegate.Remove(ResizeBeginEvent, value); - } - } + private EventHandler ResizeBeginEvent; + public new event EventHandler ResizeBegin + { + add + { + ResizeBeginEvent = (EventHandler) System.Delegate.Combine(ResizeBeginEvent, value); + } + remove + { + ResizeBeginEvent = (EventHandler) System.Delegate.Remove(ResizeBeginEvent, value); + } + } - private void Connection_ResizeBegin(System.Object sender, EventArgs e) - { - if (ResizeBeginEvent != null) - ResizeBeginEvent(this, e); - } + private void Connection_ResizeBegin(System.Object sender, EventArgs e) + { + if (ResizeBeginEvent != null) + ResizeBeginEvent(this, e); + } - private EventHandler ResizeEndEvent; - public new event EventHandler ResizeEnd - { - add - { - ResizeEndEvent = (EventHandler) System.Delegate.Combine(ResizeEndEvent, value); - } - remove - { - ResizeEndEvent = (EventHandler) System.Delegate.Remove(ResizeEndEvent, value); - } - } + private EventHandler ResizeEndEvent; + public new event EventHandler ResizeEnd + { + add + { + ResizeEndEvent = (EventHandler) System.Delegate.Combine(ResizeEndEvent, value); + } + remove + { + ResizeEndEvent = (EventHandler) System.Delegate.Remove(ResizeEndEvent, value); + } + } - public void Connection_ResizeEnd(System.Object sender, EventArgs e) - { - if (ResizeEndEvent != null) - ResizeEndEvent(sender, e); - } -#endregion + public void Connection_ResizeEnd(System.Object sender, EventArgs e) + { + if (ResizeEndEvent != null) + ResizeEndEvent(sender, e); + } + #endregion -#region TabController - private void TabController_ClosePressed(object sender, System.EventArgs e) - { - if (this.TabController.SelectedTab == null) - { - return; - } + #region TabController + private void TabController_ClosePressed(object sender, System.EventArgs e) + { + if (this.TabController.SelectedTab == null) + { + return; + } - this.CloseConnectionTab(); - } + this.CloseConnectionTab(); + } - private void CloseConnectionTab() + private void CloseConnectionTab() + { + Crownwood.Magic.Controls.TabPage selectedTab = TabController.SelectedTab; + if (My.Settings.Default.ConfirmCloseConnection == ConfirmClose.All) + { + DialogResult result = cTaskDialog.MessageBox(this, (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.ProductName, string.Format(My.Language.strConfirmCloseConnectionMainInstruction, selectedTab.Title), "", "", "", My.Language.strCheckboxDoNotShowThisMessageAgain, eTaskDialogButtons.YesNo, eSysIcons.Question, null); + if (cTaskDialog.VerificationChecked) { - Crownwood.Magic.Controls.TabPage selectedTab = TabController.SelectedTab; - if (My.Settings.Default.ConfirmCloseConnection == ConfirmClose.All) - { - DialogResult result = cTaskDialog.MessageBox(this, (new Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase()).Info.ProductName, string.Format(My.Language.strConfirmCloseConnectionMainInstruction, selectedTab.Title), "", "", "", My.Language.strCheckboxDoNotShowThisMessageAgain, eTaskDialogButtons.YesNo, eSysIcons.Question, null); - if (cTaskDialog.VerificationChecked) - { - My.Settings.Default.ConfirmCloseConnection--; - } - if (result == DialogResult.No) - { - return; - } - } + My.Settings.Default.ConfirmCloseConnection--; + } + if (result == DialogResult.No) + { + return; + } + } - try - { - if (selectedTab.Tag != null) - { - mRemoteNG.Connection.InterfaceControl interfaceControl = selectedTab.Tag; - interfaceControl.Protocol.Close(); - } - else - { - CloseTab(selectedTab); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Connection.CloseConnectionTab() failed" + Constants.vbNewLine + ex.Message, true); - } + try + { + if (selectedTab.Tag != null) + { + mRemoteNG.Connection.InterfaceControl interfaceControl = selectedTab.Tag; + interfaceControl.Protocol.Close(); + } + else + { + CloseTab(selectedTab); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Connection.CloseConnectionTab() failed" + Constants.vbNewLine + ex.Message, true); + } - UpdateSelectedConnection(); - } + UpdateSelectedConnection(); + } - private void TabController_DoubleClickTab(Crownwood.Magic.Controls.TabControl sender, Crownwood.Magic.Controls.TabPage page) - { - _firstClickTicks = 0; - if (My.Settings.Default.DoubleClickOnTabClosesIt) - { - this.CloseConnectionTab(); - } - } + private void TabController_DoubleClickTab(Crownwood.Magic.Controls.TabControl sender, Crownwood.Magic.Controls.TabPage page) + { + _firstClickTicks = 0; + if (My.Settings.Default.DoubleClickOnTabClosesIt) + { + this.CloseConnectionTab(); + } + } -#region Drag and Drop - private void TabController_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) - { - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) - { - App.Runtime.OpenConnection(e.Data.GetData("System.Windows.Forms.TreeNode", true).Tag, this, mRemoteNG.Connection.Info.Force.DoNotJump); - } - } + #region Drag and Drop + private void TabController_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) + { + if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) + { + App.Runtime.OpenConnection(e.Data.GetData("System.Windows.Forms.TreeNode", true).Tag, this, mRemoteNG.Connection.Info.Force.DoNotJump); + } + } - private void TabController_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) - { - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) - { - e.Effect = DragDropEffects.Move; - } - } + private void TabController_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) + { + if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) + { + e.Effect = DragDropEffects.Move; + } + } - private void TabController_DragOver(object sender, System.Windows.Forms.DragEventArgs e) - { - e.Effect = DragDropEffects.Move; - } -#endregion -#endregion + private void TabController_DragOver(object sender, System.Windows.Forms.DragEventArgs e) + { + e.Effect = DragDropEffects.Move; + } + #endregion + #endregion -#region Tab Menu - private void ShowHideMenuButtons() + #region Tab Menu + private void ShowHideMenuButtons() + { + try + { + if (this.TabController.SelectedTab == null) { - try - { - if (this.TabController.SelectedTab == null) - { - return; - } + return; + } + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + if (IC == null) + { + return; + } + + if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP) + { + mRemoteNG.Connection.Protocol.RDP rdp = IC.Protocol; + + cmenTabFullscreen.Enabled = true; + cmenTabFullscreen.Checked = rdp.Fullscreen; + + cmenTabSmartSize.Enabled = true; + cmenTabSmartSize.Checked = rdp.SmartSize; + } + else + { + cmenTabFullscreen.Enabled = false; + cmenTabSmartSize.Enabled = false; + } + + if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.VNC) + { + this.cmenTabSendSpecialKeys.Enabled = true; + this.cmenTabViewOnly.Enabled = true; + + this.cmenTabSmartSize.Enabled = true; + this.cmenTabStartChat.Enabled = true; + this.cmenTabRefreshScreen.Enabled = true; + this.cmenTabTransferFile.Enabled = false; + + mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; + this.cmenTabSmartSize.Checked = vnc.SmartSize; + this.cmenTabViewOnly.Checked = vnc.ViewOnly; + } + else + { + this.cmenTabSendSpecialKeys.Enabled = false; + this.cmenTabViewOnly.Enabled = false; + this.cmenTabStartChat.Enabled = false; + this.cmenTabRefreshScreen.Enabled = false; + this.cmenTabTransferFile.Enabled = false; + } + + if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH1 | IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH2) + { + this.cmenTabTransferFile.Enabled = true; + } + + if (IC.Protocol is mRemoteNG.Connection.Protocol.PuttyBase) + { + this.cmenTabPuttySettings.Enabled = true; + } + else + { + this.cmenTabPuttySettings.Enabled = false; + } + + AddExternalApps(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowHideMenuButtons (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void cmenTabScreenshot_Click(System.Object sender, System.EventArgs e) + { + cmenTab.Close(); + Application.DoEvents(); + Windows.screenshotForm.AddScreenshot(Tools.Misc.TakeScreenshot(this)); + } + + private void cmenTabSmartSize_Click(System.Object sender, System.EventArgs e) + { + this.ToggleSmartSize(); + } + + private void cmenTabReconnect_Click(System.Object sender, System.EventArgs e) + { + this.Reconnect(); + } + + private void cmenTabTransferFile_Click(System.Object sender, System.EventArgs e) + { + this.TransferFile(); + } + + private void cmenTabViewOnly_Click(System.Object sender, System.EventArgs e) + { + this.ToggleViewOnly(); + } + + private void cmenTabStartChat_Click(object sender, System.EventArgs e) + { + this.StartChat(); + } + + private void cmenTabRefreshScreen_Click(object sender, System.EventArgs e) + { + this.RefreshScreen(); + } + + private void cmenTabSendSpecialKeysCtrlAltDel_Click(System.Object sender, System.EventArgs e) + { + this.SendSpecialKeys(mRemoteNG.Connection.Protocol.VNC.SpecialKeys.CtrlAltDel); + } + + private void cmenTabSendSpecialKeysCtrlEsc_Click(System.Object sender, System.EventArgs e) + { + this.SendSpecialKeys(mRemoteNG.Connection.Protocol.VNC.SpecialKeys.CtrlEsc); + } + + private void cmenTabFullscreen_Click(System.Object sender, System.EventArgs e) + { + this.ToggleFullscreen(); + } + + private void cmenTabPuttySettings_Click(System.Object sender, System.EventArgs e) + { + this.ShowPuttySettingsDialog(); + } + + private void cmenTabExternalAppsEntry_Click(object sender, System.EventArgs e) + { + StartExternalApp(sender.Tag); + } + + private void cmenTabDisconnect_Click(System.Object sender, System.EventArgs e) + { + this.CloseTabMenu(); + } + + private void cmenTabDuplicateTab_Click(System.Object sender, System.EventArgs e) + { + this.DuplicateTab(); + } + + private void cmenTabRenameTab_Click(System.Object sender, System.EventArgs e) + { + this.RenameTab(); + } + #endregion + + #region Tab Actions + private void ToggleSmartSize() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC == null) - { - return; - } - - if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP) + + if (IC.Protocol is mRemoteNG.Connection.Protocol.RDP) { mRemoteNG.Connection.Protocol.RDP rdp = IC.Protocol; - - cmenTabFullscreen.Enabled = true; - cmenTabFullscreen.Checked = rdp.Fullscreen; - - cmenTabSmartSize.Enabled = true; - cmenTabSmartSize.Checked = rdp.SmartSize; + rdp.ToggleSmartSize(); } - else + else if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) { - cmenTabFullscreen.Enabled = false; - cmenTabSmartSize.Enabled = false; - } - - if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.VNC) - { - this.cmenTabSendSpecialKeys.Enabled = true; - this.cmenTabViewOnly.Enabled = true; - - this.cmenTabSmartSize.Enabled = true; - this.cmenTabStartChat.Enabled = true; - this.cmenTabRefreshScreen.Enabled = true; - this.cmenTabTransferFile.Enabled = false; - mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; - this.cmenTabSmartSize.Checked = vnc.SmartSize; - this.cmenTabViewOnly.Checked = vnc.ViewOnly; + vnc.ToggleSmartSize(); } - else - { - this.cmenTabSendSpecialKeys.Enabled = false; - this.cmenTabViewOnly.Enabled = false; - this.cmenTabStartChat.Enabled = false; - this.cmenTabRefreshScreen.Enabled = false; - this.cmenTabTransferFile.Enabled = false; - } - + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleSmartSize (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void TransferFile() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH1 | IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH2) { - this.cmenTabTransferFile.Enabled = true; + SSHTransferFile(); } + else if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.VNC) + { + VNCTransferFile(); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "TransferFile (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void SSHTransferFile() + { + try + { - if (IC.Protocol is mRemoteNG.Connection.Protocol.PuttyBase) - { - this.cmenTabPuttySettings.Enabled = true; - } - else - { - this.cmenTabPuttySettings.Enabled = false; - } + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - AddExternalApps(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowHideMenuButtons (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void cmenTabScreenshot_Click(System.Object sender, System.EventArgs e) - { - cmenTab.Close(); - Application.DoEvents(); - Windows.screenshotForm.AddScreenshot(Tools.Misc.TakeScreenshot(this)); - } - - private void cmenTabSmartSize_Click(System.Object sender, System.EventArgs e) - { - this.ToggleSmartSize(); - } - - private void cmenTabReconnect_Click(System.Object sender, System.EventArgs e) - { - this.Reconnect(); - } - - private void cmenTabTransferFile_Click(System.Object sender, System.EventArgs e) - { - this.TransferFile(); - } - - private void cmenTabViewOnly_Click(System.Object sender, System.EventArgs e) - { - this.ToggleViewOnly(); - } - - private void cmenTabStartChat_Click(object sender, System.EventArgs e) - { - this.StartChat(); - } - - private void cmenTabRefreshScreen_Click(object sender, System.EventArgs e) - { - this.RefreshScreen(); - } - - private void cmenTabSendSpecialKeysCtrlAltDel_Click(System.Object sender, System.EventArgs e) - { - this.SendSpecialKeys(mRemoteNG.Connection.Protocol.VNC.SpecialKeys.CtrlAltDel); - } - - private void cmenTabSendSpecialKeysCtrlEsc_Click(System.Object sender, System.EventArgs e) - { - this.SendSpecialKeys(mRemoteNG.Connection.Protocol.VNC.SpecialKeys.CtrlEsc); - } - - private void cmenTabFullscreen_Click(System.Object sender, System.EventArgs e) - { - this.ToggleFullscreen(); - } - - private void cmenTabPuttySettings_Click(System.Object sender, System.EventArgs e) - { - this.ShowPuttySettingsDialog(); - } - - private void cmenTabExternalAppsEntry_Click(object sender, System.EventArgs e) - { - StartExternalApp(sender.Tag); - } - - private void cmenTabDisconnect_Click(System.Object sender, System.EventArgs e) - { - this.CloseTabMenu(); - } - - private void cmenTabDuplicateTab_Click(System.Object sender, System.EventArgs e) - { - this.DuplicateTab(); - } - - private void cmenTabRenameTab_Click(System.Object sender, System.EventArgs e) - { - this.RenameTab(); - } -#endregion - -#region Tab Actions - private void ToggleSmartSize() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Protocol is mRemoteNG.Connection.Protocol.RDP) - { - mRemoteNG.Connection.Protocol.RDP rdp = IC.Protocol; - rdp.ToggleSmartSize(); - } - else if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) - { - mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; - vnc.ToggleSmartSize(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleSmartSize (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void TransferFile() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH1 | IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH2) - { - SSHTransferFile(); - } - else if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.VNC) - { - VNCTransferFile(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "TransferFile (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void SSHTransferFile() - { - try - { + Windows.Show(Type.SSHTransfer); + mRemoteNG.Connection.Info conI = IC.Info; + + Windows.sshtransferForm.Hostname = conI.Hostname; + Windows.sshtransferForm.Username = conI.Username; + Windows.sshtransferForm.Password = conI.Password; + Windows.sshtransferForm.Port = System.Convert.ToString(conI.Port); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SSHTransferFile (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void VNCTransferFile() + { + try + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; + vnc.StartFileTransfer(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "VNCTransferFile (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void ToggleViewOnly() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) + { + cmenTabViewOnly.Checked = !cmenTabViewOnly.Checked; + + mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; + vnc.ToggleViewOnly(); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleViewOnly (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void StartChat() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) + { + mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; + vnc.StartChat(); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartChat (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void RefreshScreen() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) + { + mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; + vnc.RefreshScreen(); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RefreshScreen (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void SendSpecialKeys(mRemoteNG.Protocol.Protocol.VNC.SpecialKeys Keys) + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) + { + mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; + vnc.SendSpecialKeys(Keys); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SendSpecialKeys (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void ToggleFullscreen() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + if (IC.Protocol is mRemoteNG.Connection.Protocol.RDP) + { + mRemoteNG.Connection.Protocol.RDP rdp = IC.Protocol; + rdp.ToggleFullscreen(); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleFullscreen (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void ShowPuttySettingsDialog() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl objInterfaceControl = this.TabController.SelectedTab.Tag; + + if (objInterfaceControl.Protocol is mRemoteNG.Connection.Protocol.PuttyBase) + { + mRemoteNG.Connection.Protocol.PuttyBase objPuttyBase = objInterfaceControl.Protocol; + + objPuttyBase.ShowSettingsDialog(); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowPuttySettingsDialog (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void AddExternalApps() + { + try + { + //clean up + cmenTabExternalApps.DropDownItems.Clear(); - Windows.Show(Type.SSHTransfer); + //add ext apps + foreach (Tools.ExternalTool extA in Runtime.ExternalTools) + { + ToolStripMenuItem nItem = new ToolStripMenuItem(); + nItem.Text = extA.DisplayName; + nItem.Tag = extA; + + nItem.Image = extA.Image; + + nItem.Click += cmenTabExternalAppsEntry_Click; + + cmenTabExternalApps.DropDownItems.Add(nItem); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeTools_DropDownOpening failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); + } + } + + private void StartExternalApp(Tools.ExternalTool ExtA) + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + ExtA.Start(IC.Info); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cmenTabExternalAppsEntry_Click failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); + } + } + + private void CloseTabMenu() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + IC.Protocol.Close(); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "CloseTabMenu (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void DuplicateTab() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + App.Runtime.OpenConnection(IC.Info, mRemoteNG.Connection.Info.Force.DoNotJump); + _ignoreChangeSelectedTabClick = false; + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "DuplicateTab (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void Reconnect() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; mRemoteNG.Connection.Info conI = IC.Info; + + IC.Protocol.Close(); + + App.Runtime.OpenConnection(conI, mRemoteNG.Connection.Info.Force.DoNotJump); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Reconnect (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void RenameTab() + { + try + { + string nTitle = Interaction.InputBox(Prompt: My.Language.strNewTitle + ":", DefaultResponse: this.TabController.SelectedTab.Title.Replace("&&", "&")); - Windows.sshtransferForm.Hostname = conI.Hostname; - Windows.sshtransferForm.Username = conI.Username; - Windows.sshtransferForm.Password = conI.Password; - Windows.sshtransferForm.Port = System.Convert.ToString(conI.Port); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SSHTransferFile (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void VNCTransferFile() + if (!string.IsNullOrEmpty(nTitle)) { - try - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; - vnc.StartFileTransfer(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "VNCTransferFile (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void ToggleViewOnly() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) - { - cmenTabViewOnly.Checked = !cmenTabViewOnly.Checked; - - mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; - vnc.ToggleViewOnly(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleViewOnly (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void StartChat() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) - { - mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; - vnc.StartChat(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartChat (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void RefreshScreen() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) - { - mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; - vnc.RefreshScreen(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RefreshScreen (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void SendSpecialKeys(mRemoteNG.Protocol.Protocol.VNC.SpecialKeys Keys) - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Protocol is mRemoteNG.Connection.Protocol.VNC) - { - mRemoteNG.Connection.Protocol.VNC vnc = IC.Protocol; - vnc.SendSpecialKeys(Keys); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SendSpecialKeys (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void ToggleFullscreen() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Protocol is mRemoteNG.Connection.Protocol.RDP) - { - mRemoteNG.Connection.Protocol.RDP rdp = IC.Protocol; - rdp.ToggleFullscreen(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleFullscreen (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void ShowPuttySettingsDialog() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl objInterfaceControl = this.TabController.SelectedTab.Tag; - - if (objInterfaceControl.Protocol is mRemoteNG.Connection.Protocol.PuttyBase) - { - mRemoteNG.Connection.Protocol.PuttyBase objPuttyBase = objInterfaceControl.Protocol; - - objPuttyBase.ShowSettingsDialog(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowPuttySettingsDialog (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void AddExternalApps() - { - try - { - //clean up - cmenTabExternalApps.DropDownItems.Clear(); - - //add ext apps - foreach (Tools.ExternalTool extA in Runtime.ExternalTools) - { - ToolStripMenuItem nItem = new ToolStripMenuItem(); - nItem.Text = extA.DisplayName; - nItem.Tag = extA; - - nItem.Image = extA.Image; - - nItem.Click += cmenTabExternalAppsEntry_Click; - - cmenTabExternalApps.DropDownItems.Add(nItem); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeTools_DropDownOpening failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); - } - } - - private void StartExternalApp(Tools.ExternalTool ExtA) - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - ExtA.Start(IC.Info); - } - } - - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cmenTabExternalAppsEntry_Click failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); - } - } - - private void CloseTabMenu() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - IC.Protocol.Close(); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "CloseTabMenu (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void DuplicateTab() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - App.Runtime.OpenConnection(IC.Info, mRemoteNG.Connection.Info.Force.DoNotJump); - _ignoreChangeSelectedTabClick = false; - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "DuplicateTab (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void Reconnect() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - mRemoteNG.Connection.Info conI = IC.Info; - - IC.Protocol.Close(); - - App.Runtime.OpenConnection(conI, mRemoteNG.Connection.Info.Force.DoNotJump); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Reconnect (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void RenameTab() - { - try - { - string nTitle = Interaction.InputBox(Prompt: My.Language.strNewTitle + ":", DefaultResponse: this.TabController.SelectedTab.Title.Replace("&&", "&")); - - if (!string.IsNullOrEmpty(nTitle)) - { - this.TabController.SelectedTab.Title = nTitle.Replace("&", "&&"); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RenameTab (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } + this.TabController.SelectedTab.Title = nTitle.Replace("&", "&&"); } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RenameTab (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } #endregion #region Protocols - public void Prot_Event_Closed(object sender) - { - mRemoteNG.Connection.Protocol.Base Prot = sender; - CloseTab((Crownwood.Magic.Controls.TabPage) Prot.InterfaceControl.Parent); - } + public void Prot_Event_Closed(object sender) + { + mRemoteNG.Connection.Protocol.Base Prot = sender; + CloseTab((Crownwood.Magic.Controls.TabPage) Prot.InterfaceControl.Parent); + } #endregion #region Tabs - private delegate void CloseTabCB(Crownwood.Magic.Controls.TabPage TabToBeClosed); - private void CloseTab(Crownwood.Magic.Controls.TabPage TabToBeClosed) - { - if (this.TabController.InvokeRequired) - { - CloseTabCB s = new CloseTabCB(CloseTab); + private delegate void CloseTabCB(Crownwood.Magic.Controls.TabPage TabToBeClosed); + private void CloseTab(Crownwood.Magic.Controls.TabPage TabToBeClosed) + { + if (this.TabController.InvokeRequired) + { + CloseTabCB s = new CloseTabCB(CloseTab); - try - { - this.TabController.Invoke(s, TabToBeClosed); - } - catch (System.Runtime.InteropServices.COMException) - { - this.TabController.Invoke(s, TabToBeClosed); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t close tab" + Constants.vbNewLine + ex.Message, true); - } - } - else - { - try - { - this.TabController.TabPages.Remove(TabToBeClosed); - _ignoreChangeSelectedTabClick = false; - } - catch (System.Runtime.InteropServices.COMException) - { - CloseTab(TabToBeClosed); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t close tab" + Constants.vbNewLine + ex.Message, true); - } - - if (this.TabController.TabPages.Count == 0) - { - this.Close(); - } - } - } - - private bool _ignoreChangeSelectedTabClick = false; - private void TabController_SelectionChanged(object sender, EventArgs e) + try { - _ignoreChangeSelectedTabClick = true; - UpdateSelectedConnection(); - FocusIC(); - RefreshIC(); + this.TabController.Invoke(s, TabToBeClosed); } - - private int _firstClickTicks = 0; - private Rectangle _doubleClickRectangle; - private void TabController_MouseUp(object sender, MouseEventArgs e) + catch (System.Runtime.InteropServices.COMException) { - try - { - if (!(Native.GetForegroundWindow() == frmMain.Default.Handle) && !_ignoreChangeSelectedTabClick) - { - Crownwood.Magic.Controls.TabPage clickedTab = TabController.TabPageFromPoint(e.Location); - if (clickedTab != null && TabController.SelectedTab != clickedTab) - { - Native.SetForegroundWindow(Handle); - TabController.SelectedTab = clickedTab; - } - } - _ignoreChangeSelectedTabClick = false; - - switch (e.Button) - { - case MouseButtons.Left: - int currentTicks = Environment.TickCount; - int elapsedTicks = currentTicks - _firstClickTicks; - if (elapsedTicks > SystemInformation.DoubleClickTime || !_doubleClickRectangle.Contains(MousePosition)) - { - _firstClickTicks = currentTicks; - _doubleClickRectangle = new Rectangle(MousePosition.X - ((double) SystemInformation.DoubleClickSize.Width / 2), MousePosition.Y - ((double) SystemInformation.DoubleClickSize.Height / 2), SystemInformation.DoubleClickSize.Width, SystemInformation.DoubleClickSize.Height); - FocusIC(); - } - else - { - TabController.OnDoubleClickTab(TabController.SelectedTab); - } - break; - case MouseButtons.Middle: - CloseConnectionTab(); - break; - case MouseButtons.Right: - ShowHideMenuButtons(); - Native.SetForegroundWindow(Handle); - cmenTab.Show(TabController, e.Location); - break; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "TabController_MouseUp (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } + this.TabController.Invoke(s, TabToBeClosed); } - - private void FocusIC() + catch (Exception ex) { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - IC.Protocol.Focus(); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "FocusIC (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); - } + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t close tab" + Constants.vbNewLine + ex.Message, true); } - - public void RefreshIC() - { - try - { - if (this.TabController.SelectedTab != null) - { - if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) - { - mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; - - if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.VNC) - { - (IC.Protocol as mRemoteNG.Connection.Protocol.VNC).RefreshScreen(); - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RefreshIC (UI.Window.Connection) failed" + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region Window Overrides - protected override void WndProc(ref Message m) - { - try - { - if (m.Msg == Native.WM_MOUSEACTIVATE) - { - Crownwood.Magic.Controls.TabPage selectedTab = TabController.SelectedTab; - if (selectedTab != null) - { - Rectangle tabClientRectangle = selectedTab.RectangleToScreen(selectedTab.ClientRectangle); - if (tabClientRectangle.Contains(MousePosition)) - { - InterfaceControl interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; - if (interfaceControl != null && interfaceControl.Info != null) - { - if (interfaceControl.Info.Protocol == Protocol.Protocols.RDP) - { - interfaceControl.Protocol.Focus(); - return ; // Do not pass to base class - } - } - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.Connection.WndProc() failed.", ex: ex, logOnly: true); - } - - base.WndProc(ref m); - } -#endregion - -#region Tab drag and drop - private bool _InTabDrag = false; -public bool InTabDrag - { - get - { - return _InTabDrag; - } - set - { - _InTabDrag = value; - } - } - private void TabController_PageDragStart(object sender, MouseEventArgs e) - { - Cursor = Cursors.SizeWE; - } - - private void TabController_PageDragMove(object sender, MouseEventArgs e) - { - InTabDrag = true; // For some reason PageDragStart gets raised again after PageDragEnd so set this here instead - - Crownwood.Magic.Controls.TabPage sourceTab = TabController.SelectedTab; - Crownwood.Magic.Controls.TabPage destinationTab = TabController.TabPageFromPoint(e.Location); - - if (!TabController.TabPages.Contains(destinationTab) || sourceTab == destinationTab) - { - return ; - } - - int targetIndex = TabController.TabPages.IndexOf(destinationTab); - - TabController.TabPages.SuspendEvents(); - TabController.TabPages.Remove(sourceTab); - TabController.TabPages.Insert(targetIndex, sourceTab); - TabController.SelectedTab = sourceTab; - TabController.TabPages.ResumeEvents(); - } - - private void TabController_PageDragEnd(object sender, MouseEventArgs e) - { - Cursor = Cursors.Default; - InTabDrag = false; - mRemoteNG.Connection.InterfaceControl interfaceControl = TabController.SelectedTab.Tag as mRemoteNG.Connection.InterfaceControl; - if (interfaceControl != null) - { - interfaceControl.Protocol.Focus(); - } - } -#endregion } + else + { + try + { + this.TabController.TabPages.Remove(TabToBeClosed); + _ignoreChangeSelectedTabClick = false; + } + catch (System.Runtime.InteropServices.COMException) + { + CloseTab(TabToBeClosed); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t close tab" + Constants.vbNewLine + ex.Message, true); + } + + if (this.TabController.TabPages.Count == 0) + { + this.Close(); + } + } + } + + private bool _ignoreChangeSelectedTabClick = false; + private void TabController_SelectionChanged(object sender, EventArgs e) + { + _ignoreChangeSelectedTabClick = true; + UpdateSelectedConnection(); + FocusIC(); + RefreshIC(); + } + + private int _firstClickTicks = 0; + private Rectangle _doubleClickRectangle; + private void TabController_MouseUp(object sender, MouseEventArgs e) + { + try + { + if (!(Native.GetForegroundWindow() == frmMain.Default.Handle) && !_ignoreChangeSelectedTabClick) + { + Crownwood.Magic.Controls.TabPage clickedTab = TabController.TabPageFromPoint(e.Location); + if (clickedTab != null && TabController.SelectedTab != clickedTab) + { + Native.SetForegroundWindow(Handle); + TabController.SelectedTab = clickedTab; + } + } + _ignoreChangeSelectedTabClick = false; + + switch (e.Button) + { + case MouseButtons.Left: + int currentTicks = Environment.TickCount; + int elapsedTicks = currentTicks - _firstClickTicks; + if (elapsedTicks > SystemInformation.DoubleClickTime || !_doubleClickRectangle.Contains(MousePosition)) + { + _firstClickTicks = currentTicks; + _doubleClickRectangle = new Rectangle(MousePosition.X - ((double) SystemInformation.DoubleClickSize.Width / 2), MousePosition.Y - ((double) SystemInformation.DoubleClickSize.Height / 2), SystemInformation.DoubleClickSize.Width, SystemInformation.DoubleClickSize.Height); + FocusIC(); + } + else + { + TabController.OnDoubleClickTab(TabController.SelectedTab); + } + break; + case MouseButtons.Middle: + CloseConnectionTab(); + break; + case MouseButtons.Right: + ShowHideMenuButtons(); + Native.SetForegroundWindow(Handle); + cmenTab.Show(TabController, e.Location); + break; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "TabController_MouseUp (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void FocusIC() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + IC.Protocol.Focus(); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "FocusIC (UI.Window.Connections) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public void RefreshIC() + { + try + { + if (this.TabController.SelectedTab != null) + { + if (this.TabController.SelectedTab.Tag is mRemoteNG.Connection.InterfaceControl) + { + mRemoteNG.Connection.InterfaceControl IC = this.TabController.SelectedTab.Tag; + + if (IC.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.VNC) + { + (IC.Protocol as mRemoteNG.Connection.Protocol.VNC).RefreshScreen(); + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RefreshIC (UI.Window.Connection) failed" + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Window Overrides + protected override void WndProc(ref Message m) + { + try + { + if (m.Msg == Native.WM_MOUSEACTIVATE) + { + Crownwood.Magic.Controls.TabPage selectedTab = TabController.SelectedTab; + if (selectedTab != null) + { + Rectangle tabClientRectangle = selectedTab.RectangleToScreen(selectedTab.ClientRectangle); + if (tabClientRectangle.Contains(MousePosition)) + { + InterfaceControl interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; + if (interfaceControl != null && interfaceControl.Info != null) + { + if (interfaceControl.Info.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP) + { + interfaceControl.Protocol.Focus(); + return ; // Do not pass to base class + } + } + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.Connection.WndProc() failed.", ex: ex, logOnly: true); + } + + base.WndProc(ref m); + } + #endregion + + #region Tab drag and drop + private bool _InTabDrag = false; + public bool InTabDrag + { + get + { + return _InTabDrag; + } + set + { + _InTabDrag = value; + } + } + private void TabController_PageDragStart(object sender, MouseEventArgs e) + { + Cursor = Cursors.SizeWE; + } + + private void TabController_PageDragMove(object sender, MouseEventArgs e) + { + InTabDrag = true; // For some reason PageDragStart gets raised again after PageDragEnd so set this here instead + + Crownwood.Magic.Controls.TabPage sourceTab = TabController.SelectedTab; + Crownwood.Magic.Controls.TabPage destinationTab = TabController.TabPageFromPoint(e.Location); + + if (!TabController.TabPages.Contains(destinationTab) || sourceTab == destinationTab) + { + return ; + } + + int targetIndex = TabController.TabPages.IndexOf(destinationTab); + + TabController.TabPages.SuspendEvents(); + TabController.TabPages.Remove(sourceTab); + TabController.TabPages.Insert(targetIndex, sourceTab); + TabController.SelectedTab = sourceTab; + TabController.TabPages.ResumeEvents(); + } + + private void TabController_PageDragEnd(object sender, MouseEventArgs e) + { + Cursor = Cursors.Default; + InTabDrag = false; + mRemoteNG.Connection.InterfaceControl interfaceControl = TabController.SelectedTab.Tag as mRemoteNG.Connection.InterfaceControl; + if (interfaceControl != null) + { + interfaceControl.Protocol.Focus(); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.ErrorsAndInfos.cs b/mRemoteV1/CS/UI/UI.Window.ErrorsAndInfos.cs index d8f119235..155295854 100644 --- a/mRemoteV1/CS/UI/UI.Window.ErrorsAndInfos.cs +++ b/mRemoteV1/CS/UI/UI.Window.ErrorsAndInfos.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,495 +8,492 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Text; using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public class ErrorsAndInfos : Base + { + #region Form Init + internal System.Windows.Forms.PictureBox pbError; + internal System.Windows.Forms.Label lblMsgDate; + internal System.Windows.Forms.ListView lvErrorCollector; + internal System.Windows.Forms.ColumnHeader clmMessage; + internal System.Windows.Forms.TextBox txtMsgText; + internal System.Windows.Forms.ImageList imgListMC; + private System.ComponentModel.Container components = null; + internal System.Windows.Forms.ContextMenuStrip cMenMC; + internal System.Windows.Forms.ToolStripMenuItem cMenMCCopy; + internal System.Windows.Forms.ToolStripMenuItem cMenMCDelete; + internal System.Windows.Forms.Panel pnlErrorMsg; + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.Load += new System.EventHandler(ErrorsAndInfos_Load); + this.Resize += new System.EventHandler(ErrorsAndInfos_Resize); + this.pnlErrorMsg = new System.Windows.Forms.Panel(); + this.txtMsgText = new System.Windows.Forms.TextBox(); + this.txtMsgText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MC_KeyDown); + this.lblMsgDate = new System.Windows.Forms.Label(); + this.pbError = new System.Windows.Forms.PictureBox(); + this.lvErrorCollector = new System.Windows.Forms.ListView(); + this.lvErrorCollector.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MC_KeyDown); + this.lvErrorCollector.SelectedIndexChanged += new System.EventHandler(this.lvErrorCollector_SelectedIndexChanged); + this.clmMessage = (System.Windows.Forms.ColumnHeader) (new System.Windows.Forms.ColumnHeader()); + this.cMenMC = new System.Windows.Forms.ContextMenuStrip(this.components); + this.cMenMC.Opening += new System.ComponentModel.CancelEventHandler(this.cMenMC_Opening); + this.cMenMCCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenMCCopy.Click += new System.EventHandler(this.cMenMCCopy_Click); + this.cMenMCDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenMCDelete.Click += new System.EventHandler(this.cMenMCDelete_Click); + this.imgListMC = new System.Windows.Forms.ImageList(this.components); + this.pnlErrorMsg.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbError).BeginInit(); + this.cMenMC.SuspendLayout(); + this.SuspendLayout(); + // + //pnlErrorMsg + // + this.pnlErrorMsg.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlErrorMsg.BackColor = System.Drawing.SystemColors.Control; + this.pnlErrorMsg.Controls.Add(this.txtMsgText); + this.pnlErrorMsg.Controls.Add(this.lblMsgDate); + this.pnlErrorMsg.Controls.Add(this.pbError); + this.pnlErrorMsg.Location = new System.Drawing.Point(0, 1); + this.pnlErrorMsg.Name = "pnlErrorMsg"; + this.pnlErrorMsg.Size = new System.Drawing.Size(198, 232); + this.pnlErrorMsg.TabIndex = 20; + // + //txtMsgText + // + this.txtMsgText.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtMsgText.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtMsgText.Location = new System.Drawing.Point(40, 20); + this.txtMsgText.Multiline = true; + this.txtMsgText.Name = "txtMsgText"; + this.txtMsgText.ReadOnly = true; + this.txtMsgText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtMsgText.Size = new System.Drawing.Size(158, 211); + this.txtMsgText.TabIndex = 30; + // + //lblMsgDate + // + this.lblMsgDate.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblMsgDate.Font = new System.Drawing.Font("Tahoma", (float) (8.25F), System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.lblMsgDate.Location = new System.Drawing.Point(40, 5); + this.lblMsgDate.Name = "lblMsgDate"; + this.lblMsgDate.Size = new System.Drawing.Size(155, 13); + this.lblMsgDate.TabIndex = 40; + // + //pbError + // + this.pbError.InitialImage = null; + this.pbError.Location = new System.Drawing.Point(2, 5); + this.pbError.Name = "pbError"; + this.pbError.Size = new System.Drawing.Size(32, 32); + this.pbError.TabIndex = 0; + this.pbError.TabStop = false; + // + //lvErrorCollector + // + this.lvErrorCollector.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lvErrorCollector.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.lvErrorCollector.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {this.clmMessage}); + this.lvErrorCollector.ContextMenuStrip = this.cMenMC; + this.lvErrorCollector.FullRowSelect = true; + this.lvErrorCollector.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.lvErrorCollector.HideSelection = false; + this.lvErrorCollector.Location = new System.Drawing.Point(203, 1); + this.lvErrorCollector.Name = "lvErrorCollector"; + this.lvErrorCollector.ShowGroups = false; + this.lvErrorCollector.Size = new System.Drawing.Size(413, 232); + this.lvErrorCollector.SmallImageList = this.imgListMC; + this.lvErrorCollector.TabIndex = 10; + this.lvErrorCollector.UseCompatibleStateImageBehavior = false; + this.lvErrorCollector.View = System.Windows.Forms.View.Details; + // + //clmMessage + // + this.clmMessage.Text = global::mRemoteNG.My.Language.strColumnMessage; + this.clmMessage.Width = 184; + // + //cMenMC + // + this.cMenMC.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.cMenMC.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenMCCopy, this.cMenMCDelete}); + this.cMenMC.Name = "cMenMC"; + this.cMenMC.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.cMenMC.Size = new System.Drawing.Size(153, 70); + // + //cMenMCCopy + // + this.cMenMCCopy.Image = global::My.Resources.Resources.Copy; + this.cMenMCCopy.Name = "cMenMCCopy"; + this.cMenMCCopy.ShortcutKeys = (System.Windows.Forms.Keys) (System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C); + this.cMenMCCopy.Size = new System.Drawing.Size(152, 22); + this.cMenMCCopy.Text = global::mRemoteNG.My.Language.strMenuCopy; + // + //cMenMCDelete + // + this.cMenMCDelete.Image = global::My.Resources.Resources.Delete; + this.cMenMCDelete.Name = "cMenMCDelete"; + this.cMenMCDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; + this.cMenMCDelete.Size = new System.Drawing.Size(152, 22); + this.cMenMCDelete.Text = global::mRemoteNG.My.Language.strMenuDelete; + // + //imgListMC + // + this.imgListMC.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imgListMC.ImageSize = new System.Drawing.Size(16, 16); + this.imgListMC.TransparentColor = System.Drawing.Color.Transparent; + // + //ErrorsAndInfos + // + this.ClientSize = new System.Drawing.Size(617, 233); + this.Controls.Add(this.lvErrorCollector); + this.Controls.Add(this.pnlErrorMsg); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.HideOnClose = true; + this.Icon = global::My.Resources.Resources.Info_Icon; + this.Name = "ErrorsAndInfos"; + this.TabText = global::mRemoteNG.My.Language.strMenuNotifications; + this.Text = "Notifications"; + this.pnlErrorMsg.ResumeLayout(false); + this.pnlErrorMsg.PerformLayout(); + ((System.ComponentModel.ISupportInitialize) this.pbError).EndInit(); + this.cMenMC.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + #region Public Properties + private DockContent _PreviousActiveForm; + public DockContent PreviousActiveForm + { + get { + return this._PreviousActiveForm; + } + set + { + this._PreviousActiveForm = value; + } + } + #endregion -#region Form Init - internal System.Windows.Forms.PictureBox pbError; - internal System.Windows.Forms.Label lblMsgDate; - internal System.Windows.Forms.ListView lvErrorCollector; - internal System.Windows.Forms.ColumnHeader clmMessage; - internal System.Windows.Forms.TextBox txtMsgText; - internal System.Windows.Forms.ImageList imgListMC; - private System.ComponentModel.Container components = null; - internal System.Windows.Forms.ContextMenuStrip cMenMC; - internal System.Windows.Forms.ToolStripMenuItem cMenMCCopy; - internal System.Windows.Forms.ToolStripMenuItem cMenMCDelete; - internal System.Windows.Forms.Panel pnlErrorMsg; - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.Load += new System.EventHandler(ErrorsAndInfos_Load); - this.Resize += new System.EventHandler(ErrorsAndInfos_Resize); - this.pnlErrorMsg = new System.Windows.Forms.Panel(); - this.txtMsgText = new System.Windows.Forms.TextBox(); - this.txtMsgText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MC_KeyDown); - this.lblMsgDate = new System.Windows.Forms.Label(); - this.pbError = new System.Windows.Forms.PictureBox(); - this.lvErrorCollector = new System.Windows.Forms.ListView(); - this.lvErrorCollector.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MC_KeyDown); - this.lvErrorCollector.SelectedIndexChanged += new System.EventHandler(this.lvErrorCollector_SelectedIndexChanged); - this.clmMessage = (System.Windows.Forms.ColumnHeader) (new System.Windows.Forms.ColumnHeader()); - this.cMenMC = new System.Windows.Forms.ContextMenuStrip(this.components); - this.cMenMC.Opening += new System.ComponentModel.CancelEventHandler(this.cMenMC_Opening); - this.cMenMCCopy = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenMCCopy.Click += new System.EventHandler(this.cMenMCCopy_Click); - this.cMenMCDelete = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenMCDelete.Click += new System.EventHandler(this.cMenMCDelete_Click); - this.imgListMC = new System.Windows.Forms.ImageList(this.components); - this.pnlErrorMsg.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbError).BeginInit(); - this.cMenMC.SuspendLayout(); - this.SuspendLayout(); - // - //pnlErrorMsg - // - this.pnlErrorMsg.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlErrorMsg.BackColor = System.Drawing.SystemColors.Control; - this.pnlErrorMsg.Controls.Add(this.txtMsgText); - this.pnlErrorMsg.Controls.Add(this.lblMsgDate); - this.pnlErrorMsg.Controls.Add(this.pbError); - this.pnlErrorMsg.Location = new System.Drawing.Point(0, 1); - this.pnlErrorMsg.Name = "pnlErrorMsg"; - this.pnlErrorMsg.Size = new System.Drawing.Size(198, 232); - this.pnlErrorMsg.TabIndex = 20; - // - //txtMsgText - // - this.txtMsgText.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtMsgText.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtMsgText.Location = new System.Drawing.Point(40, 20); - this.txtMsgText.Multiline = true; - this.txtMsgText.Name = "txtMsgText"; - this.txtMsgText.ReadOnly = true; - this.txtMsgText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtMsgText.Size = new System.Drawing.Size(158, 211); - this.txtMsgText.TabIndex = 30; - // - //lblMsgDate - // - this.lblMsgDate.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lblMsgDate.Font = new System.Drawing.Font("Tahoma", (float) (8.25F), System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.lblMsgDate.Location = new System.Drawing.Point(40, 5); - this.lblMsgDate.Name = "lblMsgDate"; - this.lblMsgDate.Size = new System.Drawing.Size(155, 13); - this.lblMsgDate.TabIndex = 40; - // - //pbError - // - this.pbError.InitialImage = null; - this.pbError.Location = new System.Drawing.Point(2, 5); - this.pbError.Name = "pbError"; - this.pbError.Size = new System.Drawing.Size(32, 32); - this.pbError.TabIndex = 0; - this.pbError.TabStop = false; - // - //lvErrorCollector - // - this.lvErrorCollector.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.lvErrorCollector.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.lvErrorCollector.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {this.clmMessage}); - this.lvErrorCollector.ContextMenuStrip = this.cMenMC; - this.lvErrorCollector.FullRowSelect = true; - this.lvErrorCollector.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; - this.lvErrorCollector.HideSelection = false; - this.lvErrorCollector.Location = new System.Drawing.Point(203, 1); - this.lvErrorCollector.Name = "lvErrorCollector"; - this.lvErrorCollector.ShowGroups = false; - this.lvErrorCollector.Size = new System.Drawing.Size(413, 232); - this.lvErrorCollector.SmallImageList = this.imgListMC; - this.lvErrorCollector.TabIndex = 10; - this.lvErrorCollector.UseCompatibleStateImageBehavior = false; - this.lvErrorCollector.View = System.Windows.Forms.View.Details; - // - //clmMessage - // - this.clmMessage.Text = global::mRemoteNG.My.Language.strColumnMessage; - this.clmMessage.Width = 184; - // - //cMenMC - // - this.cMenMC.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.cMenMC.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenMCCopy, this.cMenMCDelete}); - this.cMenMC.Name = "cMenMC"; - this.cMenMC.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.cMenMC.Size = new System.Drawing.Size(153, 70); - // - //cMenMCCopy - // - this.cMenMCCopy.Image = global::My.Resources.Resources.Copy; - this.cMenMCCopy.Name = "cMenMCCopy"; - this.cMenMCCopy.ShortcutKeys = (System.Windows.Forms.Keys) (System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C); - this.cMenMCCopy.Size = new System.Drawing.Size(152, 22); - this.cMenMCCopy.Text = global::mRemoteNG.My.Language.strMenuCopy; - // - //cMenMCDelete - // - this.cMenMCDelete.Image = global::My.Resources.Resources.Delete; - this.cMenMCDelete.Name = "cMenMCDelete"; - this.cMenMCDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.cMenMCDelete.Size = new System.Drawing.Size(152, 22); - this.cMenMCDelete.Text = global::mRemoteNG.My.Language.strMenuDelete; - // - //imgListMC - // - this.imgListMC.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; - this.imgListMC.ImageSize = new System.Drawing.Size(16, 16); - this.imgListMC.TransparentColor = System.Drawing.Color.Transparent; - // - //ErrorsAndInfos - // - this.ClientSize = new System.Drawing.Size(617, 233); - this.Controls.Add(this.lvErrorCollector); - this.Controls.Add(this.pnlErrorMsg); - this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.HideOnClose = true; - this.Icon = global::My.Resources.Resources.Info_Icon; - this.Name = "ErrorsAndInfos"; - this.TabText = global::mRemoteNG.My.Language.strMenuNotifications; - this.Text = "Notifications"; - this.pnlErrorMsg.ResumeLayout(false); - this.pnlErrorMsg.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.pbError).EndInit(); - this.cMenMC.ResumeLayout(false); - this.ResumeLayout(false); - - } -#endregion + #region Form Stuff + private void ErrorsAndInfos_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); + } -#region Public Properties - private DockContent _PreviousActiveForm; -public DockContent PreviousActiveForm - { - get - { - return this._PreviousActiveForm; - } - set - { - this._PreviousActiveForm = value; - } - } -#endregion + private void ApplyLanguage() + { + clmMessage.Text = My.Language.strColumnMessage; + cMenMCCopy.Text = My.Language.strMenuNotificationsCopyAll; + cMenMCDelete.Text = My.Language.strMenuNotificationsDeleteAll; + TabText = My.Language.strMenuNotifications; + Text = My.Language.strMenuNotifications; + } + #endregion -#region Form Stuff - private void ErrorsAndInfos_Load(object sender, System.EventArgs e) - { - ApplyLanguage(); - } + #region Public Methods + public ErrorsAndInfos(DockContent Panel) + { + this.WindowType = Type.ErrorsAndInfos; + this.DockPnl = Panel; + this.InitializeComponent(); + this.LayoutVertical(); + this.FillImageList(); + } + #endregion - private void ApplyLanguage() - { - clmMessage.Text = My.Language.strColumnMessage; - cMenMCCopy.Text = My.Language.strMenuNotificationsCopyAll; - cMenMCDelete.Text = My.Language.strMenuNotificationsDeleteAll; - TabText = My.Language.strMenuNotifications; - Text = My.Language.strMenuNotifications; - } -#endregion - -#region Public Methods - public ErrorsAndInfos(DockContent Panel) - { - this.WindowType = Type.ErrorsAndInfos; - this.DockPnl = Panel; - this.InitializeComponent(); - this.LayoutVertical(); - this.FillImageList(); - } -#endregion - -#region Private Methods - private void FillImageList() - { - this.imgListMC.Images.Add(global::My.Resources.InformationSmall); - this.imgListMC.Images.Add(global::My.Resources.WarningSmall); - this.imgListMC.Images.Add(global::My.Resources.ErrorSmall); - } + #region Private Methods + private void FillImageList() + { + this.imgListMC.Images.Add(global::My.Resources.InformationSmall); + this.imgListMC.Images.Add(global::My.Resources.WarningSmall); + this.imgListMC.Images.Add(global::My.Resources.ErrorSmall); + } - private ControlLayout _Layout = ControlLayout.Vertical; + private ControlLayout _Layout = ControlLayout.Vertical; - private void LayoutVertical() - { - try - { - this.pnlErrorMsg.Location = new Point(0, this.Height - 200); - this.pnlErrorMsg.Size = new Size(this.Width, this.Height - this.pnlErrorMsg.Top); - this.pnlErrorMsg.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right); - this.txtMsgText.Size = new Size(this.pnlErrorMsg.Width - this.pbError.Width - 8, this.pnlErrorMsg.Height - 20); - this.lvErrorCollector.Location = new Point(0, 0); - this.lvErrorCollector.Size = new Size(this.Width, this.Height - this.pnlErrorMsg.Height - 5); - this.lvErrorCollector.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); + private void LayoutVertical() + { + try + { + this.pnlErrorMsg.Location = new Point(0, this.Height - 200); + this.pnlErrorMsg.Size = new Size(this.Width, this.Height - this.pnlErrorMsg.Top); + this.pnlErrorMsg.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right); + this.txtMsgText.Size = new Size(this.pnlErrorMsg.Width - this.pbError.Width - 8, this.pnlErrorMsg.Height - 20); + this.lvErrorCollector.Location = new Point(0, 0); + this.lvErrorCollector.Size = new Size(this.Width, this.Height - this.pnlErrorMsg.Height - 5); + this.lvErrorCollector.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); - this._Layout = ControlLayout.Vertical; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "LayoutVertical (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); - } - } + this._Layout = ControlLayout.Vertical; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "LayoutVertical (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); + } + } - private void LayoutHorizontal() - { - try - { - this.pnlErrorMsg.Location = new Point(0, 0); - this.pnlErrorMsg.Size = new Size(200, this.Height); - this.pnlErrorMsg.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Top); - this.txtMsgText.Size = new Size(this.pnlErrorMsg.Width - this.pbError.Width - 8, this.pnlErrorMsg.Height - 20); - this.lvErrorCollector.Location = new Point(this.pnlErrorMsg.Width + 5, 0); - this.lvErrorCollector.Size = new Size(this.Width - this.pnlErrorMsg.Width - 5, this.Height); - this.lvErrorCollector.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); + private void LayoutHorizontal() + { + try + { + this.pnlErrorMsg.Location = new Point(0, 0); + this.pnlErrorMsg.Size = new Size(200, this.Height); + this.pnlErrorMsg.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Top); + this.txtMsgText.Size = new Size(this.pnlErrorMsg.Width - this.pbError.Width - 8, this.pnlErrorMsg.Height - 20); + this.lvErrorCollector.Location = new Point(this.pnlErrorMsg.Width + 5, 0); + this.lvErrorCollector.Size = new Size(this.Width - this.pnlErrorMsg.Width - 5, this.Height); + this.lvErrorCollector.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); - this._Layout = ControlLayout.Horizontal; - } - catch (Exception ex) + this._Layout = ControlLayout.Horizontal; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "LayoutHorizontal (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void ErrorsAndInfos_Resize(object sender, System.EventArgs e) + { + try + { + if (this.Width > this.Height) + { + if (this._Layout == ControlLayout.Vertical) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "LayoutHorizontal (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); + this.LayoutHorizontal(); } } + else + { + if (this._Layout == ControlLayout.Horizontal) + { + this.LayoutVertical(); + } + } + + this.lvErrorCollector.Columns[0].Width = this.lvErrorCollector.Width - 20; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ErrorsAndInfos_Resize (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); + } + } - private void ErrorsAndInfos_Resize(object sender, System.EventArgs e) + private void pnlErrorMsg_ResetDefaultStyle() + { + try + { + this.pnlErrorMsg.BackColor = Color.FromKnownColor(KnownColor.Control); + this.pbError.Image = null; + this.txtMsgText.Text = ""; + this.txtMsgText.BackColor = Color.FromKnownColor(KnownColor.Control); + this.lblMsgDate.Text = ""; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "pnlErrorMsg_ResetDefaultStyle (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void MC_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + try + { + if (e.KeyCode == Keys.Escape) { try { - if (this.Width > this.Height) + if (this._PreviousActiveForm != null) { - if (this._Layout == ControlLayout.Vertical) - { - this.LayoutHorizontal(); - } + this._PreviousActiveForm.Show(frmMain.Default.pnlDock); } else { - if (this._Layout == ControlLayout.Horizontal) - { - this.LayoutVertical(); - } - } - - this.lvErrorCollector.Columns[0].Width = this.lvErrorCollector.Width - 20; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ErrorsAndInfos_Resize (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void pnlErrorMsg_ResetDefaultStyle() - { - try - { - this.pnlErrorMsg.BackColor = Color.FromKnownColor(KnownColor.Control); - this.pbError.Image = null; - this.txtMsgText.Text = ""; - this.txtMsgText.BackColor = Color.FromKnownColor(KnownColor.Control); - this.lblMsgDate.Text = ""; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "pnlErrorMsg_ResetDefaultStyle (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void MC_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) - { - try - { - if (e.KeyCode == Keys.Escape) - { - try - { - if (this._PreviousActiveForm != null) - { - this._PreviousActiveForm.Show(frmMain.Default.pnlDock); - } - else - { - App.Runtime.Windows.treeForm.Show(frmMain.Default.pnlDock); - } - } - catch (Exception) - { - } + App.Runtime.Windows.treeForm.Show(frmMain.Default.pnlDock); } } - catch (Exception ex) + catch (Exception) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "MC_KeyDown (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); } } - - private void lvErrorCollector_SelectedIndexChanged(System.Object sender, System.EventArgs e) - { - try - { - if (this.lvErrorCollector.SelectedItems.Count == 0 | this.lvErrorCollector.SelectedItems.Count > 1) - { - this.pnlErrorMsg_ResetDefaultStyle(); - return; - } - - ListViewItem sItem = this.lvErrorCollector.SelectedItems[0]; - Messages.Message eMsg = sItem.Tag; - switch (eMsg.MsgClass) - { - case Messages.MessageClass.InformationMsg: - this.pbError.Image = global::My.Resources.Information; - this.pnlErrorMsg.BackColor = Color.LightSteelBlue; - this.txtMsgText.BackColor = Color.LightSteelBlue; - break; - case Messages.MessageClass.WarningMsg: - this.pbError.Image = global::My.Resources.Warning; - this.pnlErrorMsg.BackColor = Color.Gold; - this.txtMsgText.BackColor = Color.Gold; - break; - case Messages.MessageClass.ErrorMsg: - this.pbError.Image = global::My.Resources._Error; - this.pnlErrorMsg.BackColor = Color.IndianRed; - this.txtMsgText.BackColor = Color.IndianRed; - break; - } - - this.lblMsgDate.Text = eMsg.MsgDate.ToString(); - this.txtMsgText.Text = eMsg.MsgText; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "lvErrorCollector_SelectedIndexChanged (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void cMenMC_Opening(System.Object sender, System.ComponentModel.CancelEventArgs e) - { - if (lvErrorCollector.Items.Count) - { - cMenMCCopy.Enabled = true; - cMenMCDelete.Enabled = true; - } - else - { - cMenMCCopy.Enabled = false; - cMenMCDelete.Enabled = false; - } - - if (lvErrorCollector.SelectedItems.Count) - { - cMenMCCopy.Text = My.Language.strMenuCopy; - cMenMCDelete.Text = My.Language.strMenuNotificationsDelete; - } - else - { - cMenMCCopy.Text = My.Language.strMenuNotificationsCopyAll; - cMenMCDelete.Text = My.Language.strMenuNotificationsDeleteAll; - } - } - - private void cMenMCCopy_Click(System.Object sender, System.EventArgs e) - { - CopyMessagesToClipboard(); - } - - private void CopyMessagesToClipboard() - { - try - { - IEnumerable items = default(IEnumerable); - if (lvErrorCollector.SelectedItems.Count) - { - items = lvErrorCollector.SelectedItems; - } - else - { - items = lvErrorCollector.Items; - } - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine("----------"); - - lvErrorCollector.BeginUpdate(); - - Messages.Message message = default(Messages.Message); - foreach (ListViewItem item in items) - { - message = item.Tag as Messages.Message; - if (message == null) - { - continue; - } - - stringBuilder.AppendLine(message.MsgClass.ToString()); - stringBuilder.AppendLine(message.MsgDate.ToString()); - stringBuilder.AppendLine(message.MsgText); - stringBuilder.AppendLine("----------"); - } - - Clipboard.SetText(stringBuilder.ToString()); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.ErrorsAndInfos.CopyMessagesToClipboard() failed." + Constants.vbNewLine + ex.Message, true); - } - finally - { - lvErrorCollector.EndUpdate(); - } - } - - private void cMenMCDelete_Click(System.Object sender, System.EventArgs e) - { - DeleteMessages(); - } - - private void DeleteMessages() - { - try - { - lvErrorCollector.BeginUpdate(); - - if (lvErrorCollector.SelectedItems.Count) - { - foreach (ListViewItem item in lvErrorCollector.SelectedItems) - { - item.Remove(); - } - } - else - { - lvErrorCollector.Items.Clear(); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.ErrorsAndInfos.DeleteMessages() failed" + Constants.vbNewLine + ex.Message, true); - } - finally - { - lvErrorCollector.EndUpdate(); - } - } -#endregion - - public enum ControlLayout - { - Vertical = 0, - Horizontal = 1 - } } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "MC_KeyDown (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void lvErrorCollector_SelectedIndexChanged(System.Object sender, System.EventArgs e) + { + try + { + if (this.lvErrorCollector.SelectedItems.Count == 0 | this.lvErrorCollector.SelectedItems.Count > 1) + { + this.pnlErrorMsg_ResetDefaultStyle(); + return; + } + + ListViewItem sItem = this.lvErrorCollector.SelectedItems[0]; + Messages.Message eMsg = sItem.Tag; + switch (eMsg.MsgClass) + { + case Messages.MessageClass.InformationMsg: + this.pbError.Image = global::My.Resources.Information; + this.pnlErrorMsg.BackColor = Color.LightSteelBlue; + this.txtMsgText.BackColor = Color.LightSteelBlue; + break; + case Messages.MessageClass.WarningMsg: + this.pbError.Image = global::My.Resources.Warning; + this.pnlErrorMsg.BackColor = Color.Gold; + this.txtMsgText.BackColor = Color.Gold; + break; + case Messages.MessageClass.ErrorMsg: + this.pbError.Image = global::My.Resources._Error; + this.pnlErrorMsg.BackColor = Color.IndianRed; + this.txtMsgText.BackColor = Color.IndianRed; + break; + } + + this.lblMsgDate.Text = eMsg.MsgDate.ToString(); + this.txtMsgText.Text = eMsg.MsgText; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "lvErrorCollector_SelectedIndexChanged (UI.Window.ErrorsAndInfos) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void cMenMC_Opening(System.Object sender, System.ComponentModel.CancelEventArgs e) + { + if (lvErrorCollector.Items.Count) + { + cMenMCCopy.Enabled = true; + cMenMCDelete.Enabled = true; + } + else + { + cMenMCCopy.Enabled = false; + cMenMCDelete.Enabled = false; + } + + if (lvErrorCollector.SelectedItems.Count) + { + cMenMCCopy.Text = My.Language.strMenuCopy; + cMenMCDelete.Text = My.Language.strMenuNotificationsDelete; + } + else + { + cMenMCCopy.Text = My.Language.strMenuNotificationsCopyAll; + cMenMCDelete.Text = My.Language.strMenuNotificationsDeleteAll; + } + } + + private void cMenMCCopy_Click(System.Object sender, System.EventArgs e) + { + CopyMessagesToClipboard(); + } + + private void CopyMessagesToClipboard() + { + try + { + IEnumerable items = default(IEnumerable); + if (lvErrorCollector.SelectedItems.Count) + { + items = lvErrorCollector.SelectedItems; + } + else + { + items = lvErrorCollector.Items; + } + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("----------"); + + lvErrorCollector.BeginUpdate(); + + Messages.Message message = default(Messages.Message); + foreach (ListViewItem item in items) + { + message = item.Tag as Messages.Message; + if (message == null) + { + continue; + } + + stringBuilder.AppendLine(message.MsgClass.ToString()); + stringBuilder.AppendLine(message.MsgDate.ToString()); + stringBuilder.AppendLine(message.MsgText); + stringBuilder.AppendLine("----------"); + } + + Clipboard.SetText(stringBuilder.ToString()); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.ErrorsAndInfos.CopyMessagesToClipboard() failed." + Constants.vbNewLine + ex.Message, true); + } + finally + { + lvErrorCollector.EndUpdate(); + } + } + + private void cMenMCDelete_Click(System.Object sender, System.EventArgs e) + { + DeleteMessages(); + } + + private void DeleteMessages() + { + try + { + lvErrorCollector.BeginUpdate(); + + if (lvErrorCollector.SelectedItems.Count) + { + foreach (ListViewItem item in lvErrorCollector.SelectedItems) + { + item.Remove(); + } + } + else + { + lvErrorCollector.Items.Clear(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.ErrorsAndInfos.DeleteMessages() failed" + Constants.vbNewLine + ex.Message, true); + } + finally + { + lvErrorCollector.EndUpdate(); + } + } + #endregion + + public enum ControlLayout + { + Vertical = 0, + Horizontal = 1 + } + } } diff --git a/mRemoteV1/CS/UI/UI.Window.ExternalTools.cs b/mRemoteV1/CS/UI/UI.Window.ExternalTools.cs index e46cef06e..95894f951 100644 --- a/mRemoteV1/CS/UI/UI.Window.ExternalTools.cs +++ b/mRemoteV1/CS/UI/UI.Window.ExternalTools.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,302 +8,300 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using mRemoteNG.App; using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using mRemoteNG.My; namespace mRemoteNG.UI.Window { public partial class ExternalTools : Base - { -#region Constructors - public ExternalTools(DockContent panel) - { - InitializeComponent(); + { + #region Constructors + public ExternalTools(DockContent panel) + { + InitializeComponent(); - WindowType = Type.ExternalApps; - DockPnl = panel; - } -#endregion + WindowType = Type.ExternalApps; + DockPnl = panel; + } + #endregion -#region Private Fields - private Tools.ExternalTool _selectedTool = null; -#endregion + #region Private Fields + private Tools.ExternalTool _selectedTool = null; + #endregion -#region Private Methods -#region Event Handlers - public void ExternalTools_Load(object sender, EventArgs e) + #region Private Methods + #region Event Handlers + public void ExternalTools_Load(object sender, EventArgs e) + { + ApplyLanguage(); + UpdateToolsListView(); + } + + static public void ExternalTools_FormClosed(System.Object sender, FormClosedEventArgs e) + { + mRemoteNG.Config.Settings.Save.SaveExternalAppsToXML(); + } + + public void NewTool_Click(System.Object sender, EventArgs e) + { + try + { + Tools.ExternalTool externalTool = new Tools.ExternalTool(Language.strExternalToolDefaultName); + Runtime.ExternalTools.Add(externalTool); + UpdateToolsListView(externalTool); + DisplayNameTextBox.Focus(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.NewTool_Click() failed.", ex: ex, logOnly: true); + } + } + + public void DeleteTool_Click(System.Object sender, EventArgs e) + { + try + { + string message = ""; + if (ToolsListView.SelectedItems.Count == 1) { - ApplyLanguage(); - UpdateToolsListView(); + message = string.Format(Language.strConfirmDeleteExternalTool, ToolsListView.SelectedItems[0].Text); } - - static public void ExternalTools_FormClosed(System.Object sender, FormClosedEventArgs e) + else if (ToolsListView.SelectedItems.Count > 1) { - mRemoteNG.Config.Settings.Save.SaveExternalAppsToXML(); + message = string.Format(Language.strConfirmDeleteExternalToolMultiple, ToolsListView.SelectedItems.Count); } - - public void NewTool_Click(System.Object sender, EventArgs e) + else { - try - { - Tools.ExternalTool externalTool = new Tools.ExternalTool(Language.strExternalToolDefaultName); - Runtime.ExternalTools.Add(externalTool); - UpdateToolsListView(externalTool); - DisplayNameTextBox.Focus(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.NewTool_Click() failed.", ex: ex, logOnly: true); - } + return ; } - - public void DeleteTool_Click(System.Object sender, EventArgs e) - { - try - { - string message = ""; - if (ToolsListView.SelectedItems.Count == 1) - { - message = string.Format(Language.strConfirmDeleteExternalTool, ToolsListView.SelectedItems[0].Text); - } - else if (ToolsListView.SelectedItems.Count > 1) - { - message = string.Format(Language.strConfirmDeleteExternalToolMultiple, ToolsListView.SelectedItems.Count); - } - else - { - return ; - } - if (!(Interaction.MsgBox(message, (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.Question | MsgBoxStyle.YesNo), null) == MsgBoxResult.Yes)) - { - return ; - } + if (!(Interaction.MsgBox(message, (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.Question | MsgBoxStyle.YesNo), null) == MsgBoxResult.Yes)) + { + return ; + } - foreach (ListViewItem listViewItem in ToolsListView.SelectedItems) - { - Tools.ExternalTool externalTool = listViewItem.Tag as Tools.ExternalTool; - if (externalTool == null) - { - continue; - } + foreach (ListViewItem listViewItem in ToolsListView.SelectedItems) + { + Tools.ExternalTool externalTool = listViewItem.Tag as Tools.ExternalTool; + if (externalTool == null) + { + continue; + } - Runtime.ExternalTools.Remove(listViewItem.Tag); - listViewItem.Remove(); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.DeleteTool_Click() failed.", ex: ex, logOnly: true); - } + Runtime.ExternalTools.Remove(listViewItem.Tag); + listViewItem.Remove(); } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.DeleteTool_Click() failed.", ex: ex, logOnly: true); + } + } - public void LaunchTool_Click(System.Object sender, EventArgs e) - { - LaunchTool(); - } + public void LaunchTool_Click(System.Object sender, EventArgs e) + { + LaunchTool(); + } - public void ToolsListView_SelectedIndexChanged(System.Object sender, EventArgs e) - { - try - { - if (ToolsListView.SelectedItems.Count == 1) - { - PropertiesGroupBox.Enabled = true; - _selectedTool = ToolsListView.SelectedItems[0].Tag as Tools.ExternalTool; - if (_selectedTool == null) - { - return ; - } - - DisplayNameTextBox.Text = _selectedTool.DisplayName; - FilenameTextBox.Text = _selectedTool.FileName; - ArgumentsCheckBox.Text = _selectedTool.Arguments; - WaitForExitCheckBox.Checked = _selectedTool.WaitForExit; - TryToIntegrateCheckBox.Checked = _selectedTool.TryIntegrate; - } - else - { - PropertiesGroupBox.Enabled = false; - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.ToolsListView_SelectedIndexChanged() failed.", ex: ex, logOnly: true); - } - } - - public void ToolsListView_DoubleClick(object sender, EventArgs e) - { - if (ToolsListView.SelectedItems.Count > 0) - { - LaunchTool(); - } - } - - public void PropertyControl_ChangedOrLostFocus(object sender, EventArgs e) + public void ToolsListView_SelectedIndexChanged(System.Object sender, EventArgs e) + { + try + { + if (ToolsListView.SelectedItems.Count == 1) { + PropertiesGroupBox.Enabled = true; + _selectedTool = ToolsListView.SelectedItems[0].Tag as Tools.ExternalTool; if (_selectedTool == null) { return ; } - - try - { - _selectedTool.DisplayName = DisplayNameTextBox.Text; - _selectedTool.FileName = FilenameTextBox.Text; - _selectedTool.Arguments = ArgumentsCheckBox.Text; - _selectedTool.WaitForExit = WaitForExitCheckBox.Checked; - _selectedTool.TryIntegrate = TryToIntegrateCheckBox.Checked; - - UpdateToolsListView(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.PropertyControl_ChangedOrLostFocus() failed.", ex: ex, logOnly: true); - } - } - - public void BrowseButton_Click(System.Object sender, EventArgs e) - { - try - { - using (OpenFileDialog browseDialog = new OpenFileDialog()) - { - browseDialog.Filter = string.Join("|", new string[] {Language.strFilterApplication, "*.exe", Language.strFilterAll, "*.*"}); - if (browseDialog.ShowDialog() == DialogResult.OK) - { - FilenameTextBox.Text = browseDialog.FileName; - } - } - - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.BrowseButton_Click() failed.", ex: ex, logOnly: true); - } - } - - public void TryToIntegrateCheckBox_CheckedChanged(System.Object sender, EventArgs e) - { - if (TryToIntegrateCheckBox.Checked) - { - WaitForExitCheckBox.Enabled = false; - WaitForExitCheckBox.Checked = false; - } - else - { - WaitForExitCheckBox.Enabled = true; - } - } -#endregion - - private void ApplyLanguage() - { - Text = Language.strMenuExternalTools; - TabText = Language.strMenuExternalTools; - - NewToolToolstripButton.Text = Language.strButtonNew; - DeleteToolToolstripButton.Text = Language.strOptionsKeyboardButtonDelete; - LaunchToolToolstripButton.Text = Language.strButtonLaunch; - - DisplayNameColumnHeader.Text = Language.strColumnDisplayName; - FilenameColumnHeader.Text = Language.strColumnFilename; - ArgumentsColumnHeader.Text = Language.strColumnArguments; - WaitForExitColumnHeader.Text = Language.strColumnWaitForExit; - TryToIntegrateCheckBox.Text = Language.strTryIntegrate; - - PropertiesGroupBox.Text = Language.strGroupboxExternalToolProperties; - - DisplayNameLabel.Text = Language.strLabelDisplayName; - FilenameLabel.Text = Language.strLabelFilename; - ArgumentsLabel.Text = Language.strLabelArguments; - OptionsLabel.Text = Language.strLabelOptions; - WaitForExitCheckBox.Text = Language.strCheckboxWaitForExit; - BrowseButton.Text = Language.strButtonBrowse; - - NewToolMenuItem.Text = Language.strMenuNewExternalTool; - DeleteToolMenuItem.Text = Language.strMenuDeleteExternalTool; - LaunchToolMenuItem.Text = Language.strMenuLaunchExternalTool; - } - - private void UpdateToolsListView(Tools.ExternalTool selectTool = null) - { - try - { - List selectedTools = new List(); - if (selectTool == null) - { - foreach (ListViewItem listViewItem in ToolsListView.SelectedItems) - { - Tools.ExternalTool externalTool = listViewItem.Tag as Tools.ExternalTool; - if (externalTool != null) - { - selectedTools.Add(externalTool); - } - } - } - else - { - selectedTools.Add(selectTool); - } - - ToolsListView.BeginUpdate(); - ToolsListView.Items.Clear(); - - foreach (Tools.ExternalTool externalTool in Runtime.ExternalTools) - { - ListViewItem listViewItem = new ListViewItem(); - listViewItem.Text = externalTool.DisplayName; - listViewItem.SubItems.Add(externalTool.FileName); - listViewItem.SubItems.Add(externalTool.Arguments); - listViewItem.SubItems.Add(externalTool.WaitForExit); - listViewItem.SubItems.Add(externalTool.TryIntegrate); - listViewItem.Tag = externalTool; - ToolsListView.Items.Add(listViewItem); - - if (selectedTools.Contains(externalTool)) - { - listViewItem.Selected = true; - } - } - - ToolsListView.EndUpdate(); - - frmMain.Default.AddExternalToolsToToolBar(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.PopulateToolsListView()", ex: ex, logOnly: true); - } + DisplayNameTextBox.Text = _selectedTool.DisplayName; + FilenameTextBox.Text = _selectedTool.FileName; + ArgumentsCheckBox.Text = _selectedTool.Arguments; + WaitForExitCheckBox.Checked = _selectedTool.WaitForExit; + TryToIntegrateCheckBox.Checked = _selectedTool.TryIntegrate; } - - private void LaunchTool() + else { - try - { - foreach (ListViewItem listViewItem in ToolsListView.SelectedItems) - { - Tools.ExternalTool externalTool = listViewItem.Tag as Tools.ExternalTool; - if (externalTool == null) - { - continue; - } - - externalTool.Start(); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.LaunchTool() failed.", ex: ex, logOnly: true); - } + PropertiesGroupBox.Enabled = false; } -#endregion } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.ToolsListView_SelectedIndexChanged() failed.", ex: ex, logOnly: true); + } + } + + public void ToolsListView_DoubleClick(object sender, EventArgs e) + { + if (ToolsListView.SelectedItems.Count > 0) + { + LaunchTool(); + } + } + + public void PropertyControl_ChangedOrLostFocus(object sender, EventArgs e) + { + if (_selectedTool == null) + { + return ; + } + + try + { + _selectedTool.DisplayName = DisplayNameTextBox.Text; + _selectedTool.FileName = FilenameTextBox.Text; + _selectedTool.Arguments = ArgumentsCheckBox.Text; + _selectedTool.WaitForExit = WaitForExitCheckBox.Checked; + _selectedTool.TryIntegrate = TryToIntegrateCheckBox.Checked; + + UpdateToolsListView(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.PropertyControl_ChangedOrLostFocus() failed.", ex: ex, logOnly: true); + } + } + + public void BrowseButton_Click(System.Object sender, EventArgs e) + { + try + { + using (OpenFileDialog browseDialog = new OpenFileDialog()) + { + browseDialog.Filter = string.Join("|", new string[] {Language.strFilterApplication, "*.exe", Language.strFilterAll, "*.*"}); + if (browseDialog.ShowDialog() == DialogResult.OK) + { + FilenameTextBox.Text = browseDialog.FileName; + } + } + + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.BrowseButton_Click() failed.", ex: ex, logOnly: true); + } + } + + public void TryToIntegrateCheckBox_CheckedChanged(System.Object sender, EventArgs e) + { + if (TryToIntegrateCheckBox.Checked) + { + WaitForExitCheckBox.Enabled = false; + WaitForExitCheckBox.Checked = false; + } + else + { + WaitForExitCheckBox.Enabled = true; + } + } + #endregion + + private void ApplyLanguage() + { + Text = Language.strMenuExternalTools; + TabText = Language.strMenuExternalTools; + + NewToolToolstripButton.Text = Language.strButtonNew; + DeleteToolToolstripButton.Text = Language.strOptionsKeyboardButtonDelete; + LaunchToolToolstripButton.Text = Language.strButtonLaunch; + + DisplayNameColumnHeader.Text = Language.strColumnDisplayName; + FilenameColumnHeader.Text = Language.strColumnFilename; + ArgumentsColumnHeader.Text = Language.strColumnArguments; + WaitForExitColumnHeader.Text = Language.strColumnWaitForExit; + TryToIntegrateCheckBox.Text = Language.strTryIntegrate; + + PropertiesGroupBox.Text = Language.strGroupboxExternalToolProperties; + + DisplayNameLabel.Text = Language.strLabelDisplayName; + FilenameLabel.Text = Language.strLabelFilename; + ArgumentsLabel.Text = Language.strLabelArguments; + OptionsLabel.Text = Language.strLabelOptions; + WaitForExitCheckBox.Text = Language.strCheckboxWaitForExit; + BrowseButton.Text = Language.strButtonBrowse; + + NewToolMenuItem.Text = Language.strMenuNewExternalTool; + DeleteToolMenuItem.Text = Language.strMenuDeleteExternalTool; + LaunchToolMenuItem.Text = Language.strMenuLaunchExternalTool; + } + + private void UpdateToolsListView(Tools.ExternalTool selectTool = null) + { + try + { + List selectedTools = new List(); + if (selectTool == null) + { + foreach (ListViewItem listViewItem in ToolsListView.SelectedItems) + { + Tools.ExternalTool externalTool = listViewItem.Tag as Tools.ExternalTool; + if (externalTool != null) + { + selectedTools.Add(externalTool); + } + } + } + else + { + selectedTools.Add(selectTool); + } + + ToolsListView.BeginUpdate(); + ToolsListView.Items.Clear(); + + foreach (Tools.ExternalTool externalTool in Runtime.ExternalTools) + { + ListViewItem listViewItem = new ListViewItem(); + listViewItem.Text = externalTool.DisplayName; + listViewItem.SubItems.Add(externalTool.FileName); + listViewItem.SubItems.Add(externalTool.Arguments); + listViewItem.SubItems.Add(externalTool.WaitForExit); + listViewItem.SubItems.Add(externalTool.TryIntegrate); + listViewItem.Tag = externalTool; + + ToolsListView.Items.Add(listViewItem); + + if (selectedTools.Contains(externalTool)) + { + listViewItem.Selected = true; + } + } + + ToolsListView.EndUpdate(); + + frmMain.Default.AddExternalToolsToToolBar(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.PopulateToolsListView()", ex: ex, logOnly: true); + } + } + + private void LaunchTool() + { + try + { + foreach (ListViewItem listViewItem in ToolsListView.SelectedItems) + { + Tools.ExternalTool externalTool = listViewItem.Tag as Tools.ExternalTool; + if (externalTool == null) + { + continue; + } + + externalTool.Start(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(message: "UI.Window.ExternalTools.LaunchTool() failed.", ex: ex, logOnly: true); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.PortScan.cs b/mRemoteV1/CS/UI/UI.Window.PortScan.cs index 76d34ee64..71462e355 100644 --- a/mRemoteV1/CS/UI/UI.Window.PortScan.cs +++ b/mRemoteV1/CS/UI/UI.Window.PortScan.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,283 +8,281 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - //using mRemoteNG.Tools.PortScan; using mRemoteNG.My; using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public partial class PortScan : Base + { + #region Constructors + public PortScan(DockContent panel, bool import) + { + InitializeComponent(); + + WindowType = Type.PortScan; + DockPnl = panel; + _import = import; + } + #endregion + + #region Private Properties + private bool IpsValid + { + get { -#region Constructors - public PortScan(DockContent panel, bool import) + if (string.IsNullOrEmpty(ipStart.Octet1)) { - InitializeComponent(); - - WindowType = Type.PortScan; - DockPnl = panel; - _import = import; + return false; } -#endregion - -#region Private Properties -private bool IpsValid + if (string.IsNullOrEmpty(ipStart.Octet2)) { - get - { - if (string.IsNullOrEmpty(ipStart.Octet1)) - { - return false; - } - if (string.IsNullOrEmpty(ipStart.Octet2)) - { - return false; - } - if (string.IsNullOrEmpty(ipStart.Octet3)) - { - return false; - } - if (string.IsNullOrEmpty(ipStart.Octet4)) - { - return false; - } + return false; + } + if (string.IsNullOrEmpty(ipStart.Octet3)) + { + return false; + } + if (string.IsNullOrEmpty(ipStart.Octet4)) + { + return false; + } - if (string.IsNullOrEmpty(ipEnd.Octet1)) - { - return false; - } - if (string.IsNullOrEmpty(ipEnd.Octet2)) - { - return false; - } - if (string.IsNullOrEmpty(ipEnd.Octet3)) - { - return false; - } - if (string.IsNullOrEmpty(ipEnd.Octet4)) - { - return false; - } + if (string.IsNullOrEmpty(ipEnd.Octet1)) + { + return false; + } + if (string.IsNullOrEmpty(ipEnd.Octet2)) + { + return false; + } + if (string.IsNullOrEmpty(ipEnd.Octet3)) + { + return false; + } + if (string.IsNullOrEmpty(ipEnd.Octet4)) + { + return false; + } - return true; - } - } -#endregion - -#region Private Fields - private bool _import; - private Tools.PortScan.Scanner _portScanner; - private bool _scanning = false; -#endregion - -#region Private Methods -#region Event Handlers - public void PortScan_Load(System.Object sender, EventArgs e) - { - ApplyLanguage(); - - try - { - if (_import) - { - lvHosts.Columns.AddRange(new ColumnHeader[] {clmHost, clmSSH, clmTelnet, clmHTTP, clmHTTPS, clmRlogin, clmRDP, clmVNC}); - ShowImportControls(true); - cbProtocol.SelectedIndex = 0; - } - else - { - lvHosts.Columns.AddRange(new ColumnHeader[] {clmHost, clmOpenPorts, clmClosedPorts}); - ShowImportControls(false); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(My.Language.strPortScanCouldNotLoadPanel, ex); - } - } - - public void portStart_Enter(System.Object sender, EventArgs e) - { - portStart.Select(0, portStart.Text.Length); - } - - public void portEnd_Enter(System.Object sender, EventArgs e) - { - portEnd.Select(0, portEnd.Text.Length); - } - - public void btnScan_Click(System.Object sender, EventArgs e) - { - if (_scanning) - { - StopScan(); - } - else - { - if (IpsValid) - { - StartScan(); - } - else - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strCannotStartPortScan); - } - } - } - - public void btnImport_Click(System.Object sender, EventArgs e) - { - mRemoteNG.Connection.Protocol.Protocols protocol = Tools.Misc.StringToEnum(typeof(mRemoteNG.Connection.Protocol.Protocols), System.Convert.ToString(cbProtocol.SelectedItem)); - - List hosts = new List(); - foreach (ListViewItem item in lvHosts.SelectedItems) - { - Tools.PortScan.ScanHost scanHost = item.Tag as Tools.PortScan.ScanHost; - if (scanHost != null) - { - hosts.Add(item.Tag); - } - } - - App.Import.ImportFromPortScan(hosts, protocol); - - DialogResult = DialogResult.OK; - Close(); - } -#endregion - - private void ApplyLanguage() - { - lblStartIP.Text = string.Format("{0}:", My.Language.strStartIP); - lblEndIP.Text = string.Format("{0}:", My.Language.strEndIP); - btnScan.Text = My.Language.strButtonScan; - btnImport.Text = My.Language.strButtonImport; - lblOnlyImport.Text = string.Format("{0}:", My.Language.strProtocolToImport); - clmHost.Text = My.Language.strColumnHostnameIP; - clmOpenPorts.Text = My.Language.strOpenPorts; - clmClosedPorts.Text = My.Language.strClosedPorts; - Label2.Text = string.Format("{0}:", My.Language.strEndPort); - Label1.Text = string.Format("{0}:", My.Language.strStartPort); - TabText = My.Language.strMenuPortScan; - Text = My.Language.strMenuPortScan; - } - - private void ShowImportControls(bool controlsVisible) - { - pnlPorts.Visible = controlsVisible; - pnlImport.Visible = controlsVisible; - if (controlsVisible) - { - lvHosts.Height = pnlImport.Top - lvHosts.Top; - } - else - { - lvHosts.Height = pnlImport.Bottom - lvHosts.Top; - } - } - - private void StartScan() - { - try - { - _scanning = true; - SwitchButtonText(); - lvHosts.Items.Clear(); - - System.Net.IPAddress ipAddressStart = System.Net.IPAddress.Parse(ipStart.Text); - System.Net.IPAddress ipAddressEnd = System.Net.IPAddress.Parse(ipEnd.Text); - - if (_import) - { - _portScanner = new Tools.PortScan.Scanner(ipAddressStart, ipAddressEnd); - } - else - { - _portScanner = new Tools.PortScan.Scanner(ipAddressStart, ipAddressEnd, (int) portStart.Value, (int) portEnd.Value); - } - - _portScanner.BeginHostScan += PortScanner_BeginHostScan; - _portScanner.HostScanned += PortScanner_HostScanned; - _portScanner.ScanComplete += PortScanner_ScanComplete; - - _portScanner.StartScan(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartScan failed (UI.Window.PortScan)" + Constants.vbNewLine + ex.Message, true); - } - } - - private void StopScan() - { - if (_portScanner != null) - { - _portScanner.StopScan(); - } - _scanning = false; - SwitchButtonText(); - } - - private void SwitchButtonText() - { - if (_scanning) - { - btnScan.Text = My.Language.strButtonStop; - } - else - { - btnScan.Text = My.Language.strButtonScan; - } - - prgBar.Maximum = 100; - prgBar.Value = 0; - } - - private static void PortScanner_BeginHostScan(string host) - { - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, "Scanning " + host, true); - } - - private delegate void PortScannerHostScannedDelegate(Tools.PortScan.ScanHost host, int scannedCount, int totalCount); - private void PortScanner_HostScanned(Tools.PortScan.ScanHost host, int scannedCount, int totalCount) - { - if (InvokeRequired) - { - Invoke(new PortScannerHostScannedDelegate(PortScanner_HostScanned), new object[] {host, scannedCount, totalCount}); - return ; - } - - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, "Host scanned " + host.HostIp, true); - - ListViewItem listViewItem = host.ToListViewItem(_import); - if (listViewItem != null) - { - lvHosts.Items.Add(listViewItem); - listViewItem.EnsureVisible(); - } - - prgBar.Maximum = totalCount; - prgBar.Value = scannedCount; - } - - private delegate void PortScannerScanComplete(List hosts); - private void PortScanner_ScanComplete(List hosts) - { - if (InvokeRequired) - { - Invoke(new PortScannerScanComplete(PortScanner_ScanComplete), new object[] {hosts}); - return ; - } - - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, Language.strPortScanComplete); - - _scanning = false; - SwitchButtonText(); - } -#endregion + return true; } + } + #endregion + + #region Private Fields + private bool _import; + private Tools.PortScan.Scanner _portScanner; + private bool _scanning = false; + #endregion + + #region Private Methods + #region Event Handlers + public void PortScan_Load(System.Object sender, EventArgs e) + { + ApplyLanguage(); + + try + { + if (_import) + { + lvHosts.Columns.AddRange(new ColumnHeader[] {clmHost, clmSSH, clmTelnet, clmHTTP, clmHTTPS, clmRlogin, clmRDP, clmVNC}); + ShowImportControls(true); + cbProtocol.SelectedIndex = 0; + } + else + { + lvHosts.Columns.AddRange(new ColumnHeader[] {clmHost, clmOpenPorts, clmClosedPorts}); + ShowImportControls(false); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(My.Language.strPortScanCouldNotLoadPanel, ex); + } + } + + public void portStart_Enter(System.Object sender, EventArgs e) + { + portStart.Select(0, portStart.Text.Length); + } + + public void portEnd_Enter(System.Object sender, EventArgs e) + { + portEnd.Select(0, portEnd.Text.Length); + } + + public void btnScan_Click(System.Object sender, EventArgs e) + { + if (_scanning) + { + StopScan(); + } + else + { + if (IpsValid) + { + StartScan(); + } + else + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strCannotStartPortScan); + } + } + } + + public void btnImport_Click(System.Object sender, EventArgs e) + { + mRemoteNG.Connection.Protocol.Protocols protocol = Tools.Misc.StringToEnum(typeof(mRemoteNG.Connection.Protocol.Protocols), System.Convert.ToString(cbProtocol.SelectedItem)); + + List hosts = new List(); + foreach (ListViewItem item in lvHosts.SelectedItems) + { + Tools.PortScan.ScanHost scanHost = item.Tag as Tools.PortScan.ScanHost; + if (scanHost != null) + { + hosts.Add(item.Tag); + } + } + + App.Import.ImportFromPortScan(hosts, protocol); + + DialogResult = DialogResult.OK; + Close(); + } + #endregion + + private void ApplyLanguage() + { + lblStartIP.Text = string.Format("{0}:", My.Language.strStartIP); + lblEndIP.Text = string.Format("{0}:", My.Language.strEndIP); + btnScan.Text = My.Language.strButtonScan; + btnImport.Text = My.Language.strButtonImport; + lblOnlyImport.Text = string.Format("{0}:", My.Language.strProtocolToImport); + clmHost.Text = My.Language.strColumnHostnameIP; + clmOpenPorts.Text = My.Language.strOpenPorts; + clmClosedPorts.Text = My.Language.strClosedPorts; + Label2.Text = string.Format("{0}:", My.Language.strEndPort); + Label1.Text = string.Format("{0}:", My.Language.strStartPort); + TabText = My.Language.strMenuPortScan; + Text = My.Language.strMenuPortScan; + } + + private void ShowImportControls(bool controlsVisible) + { + pnlPorts.Visible = controlsVisible; + pnlImport.Visible = controlsVisible; + if (controlsVisible) + { + lvHosts.Height = pnlImport.Top - lvHosts.Top; + } + else + { + lvHosts.Height = pnlImport.Bottom - lvHosts.Top; + } + } + + private void StartScan() + { + try + { + _scanning = true; + SwitchButtonText(); + lvHosts.Items.Clear(); + + System.Net.IPAddress ipAddressStart = System.Net.IPAddress.Parse(ipStart.Text); + System.Net.IPAddress ipAddressEnd = System.Net.IPAddress.Parse(ipEnd.Text); + + if (_import) + { + _portScanner = new Tools.PortScan.Scanner(ipAddressStart, ipAddressEnd); + } + else + { + _portScanner = new Tools.PortScan.Scanner(ipAddressStart, ipAddressEnd, (int) portStart.Value, (int) portEnd.Value); + } + + _portScanner.BeginHostScan += PortScanner_BeginHostScan; + _portScanner.HostScanned += PortScanner_HostScanned; + _portScanner.ScanComplete += PortScanner_ScanComplete; + + _portScanner.StartScan(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartScan failed (UI.Window.PortScan)" + Constants.vbNewLine + ex.Message, true); + } + } + + private void StopScan() + { + if (_portScanner != null) + { + _portScanner.StopScan(); + } + _scanning = false; + SwitchButtonText(); + } + + private void SwitchButtonText() + { + if (_scanning) + { + btnScan.Text = My.Language.strButtonStop; + } + else + { + btnScan.Text = My.Language.strButtonScan; + } + + prgBar.Maximum = 100; + prgBar.Value = 0; + } + + private static void PortScanner_BeginHostScan(string host) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, "Scanning " + host, true); + } + + private delegate void PortScannerHostScannedDelegate(Tools.PortScan.ScanHost host, int scannedCount, int totalCount); + private void PortScanner_HostScanned(Tools.PortScan.ScanHost host, int scannedCount, int totalCount) + { + if (InvokeRequired) + { + Invoke(new PortScannerHostScannedDelegate(PortScanner_HostScanned), new object[] {host, scannedCount, totalCount}); + return ; + } + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, "Host scanned " + host.HostIp, true); + + ListViewItem listViewItem = host.ToListViewItem(_import); + if (listViewItem != null) + { + lvHosts.Items.Add(listViewItem); + listViewItem.EnsureVisible(); + } + + prgBar.Maximum = totalCount; + prgBar.Value = scannedCount; + } + + private delegate void PortScannerScanComplete(List hosts); + private void PortScanner_ScanComplete(List hosts) + { + if (InvokeRequired) + { + Invoke(new PortScannerScanComplete(PortScanner_ScanComplete), new object[] {hosts}); + return ; + } + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, Language.strPortScanComplete); + + _scanning = false; + SwitchButtonText(); + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.SSHTransfer.cs b/mRemoteV1/CS/UI/UI.Window.SSHTransfer.cs index 162cae957..31413f739 100644 --- a/mRemoteV1/CS/UI/UI.Window.SSHTransfer.cs +++ b/mRemoteV1/CS/UI/UI.Window.SSHTransfer.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,616 +8,613 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using WeifenLuo.WinFormsUI.Docking; using Tamir.SharpSsh; using System.IO; using System.Threading; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public class SSHTransfer : Base + { + #region Form Init + internal System.Windows.Forms.ProgressBar pbStatus; + internal System.Windows.Forms.Button btnTransfer; + internal System.Windows.Forms.TextBox txtUser; + internal System.Windows.Forms.TextBox txtPassword; + internal System.Windows.Forms.TextBox txtHost; + internal System.Windows.Forms.TextBox txtPort; + internal System.Windows.Forms.Label lblHost; + internal System.Windows.Forms.Label lblPort; + internal System.Windows.Forms.Label lblUser; + internal System.Windows.Forms.Label lblPassword; + internal System.Windows.Forms.Label lblProtocol; + internal System.Windows.Forms.RadioButton radProtSCP; + internal System.Windows.Forms.RadioButton radProtSFTP; + internal System.Windows.Forms.GroupBox grpConnection; + internal System.Windows.Forms.Button btnBrowse; + internal System.Windows.Forms.Label lblRemoteFile; + internal System.Windows.Forms.TextBox txtRemoteFile; + internal System.Windows.Forms.TextBox txtLocalFile; + internal System.Windows.Forms.Label lblLocalFile; + internal System.Windows.Forms.GroupBox grpFiles; + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SSHTransfer)); + this.grpFiles = new System.Windows.Forms.GroupBox(); + this.Load += new System.EventHandler(SSHTransfer_Load); + this.lblLocalFile = new System.Windows.Forms.Label(); + this.txtLocalFile = new System.Windows.Forms.TextBox(); + this.txtRemoteFile = new System.Windows.Forms.TextBox(); + this.lblRemoteFile = new System.Windows.Forms.Label(); + this.btnBrowse = new System.Windows.Forms.Button(); + this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); + this.grpConnection = new System.Windows.Forms.GroupBox(); + this.radProtSFTP = new System.Windows.Forms.RadioButton(); + this.radProtSCP = new System.Windows.Forms.RadioButton(); + this.lblProtocol = new System.Windows.Forms.Label(); + this.lblPassword = new System.Windows.Forms.Label(); + this.lblUser = new System.Windows.Forms.Label(); + this.lblPort = new System.Windows.Forms.Label(); + this.lblHost = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.txtHost = new System.Windows.Forms.TextBox(); + this.txtPassword = new System.Windows.Forms.TextBox(); + this.txtUser = new System.Windows.Forms.TextBox(); + this.btnTransfer = new System.Windows.Forms.Button(); + this.btnTransfer.Click += new System.EventHandler(this.btnTransfer_Click); + this.pbStatus = new System.Windows.Forms.ProgressBar(); + this.grpFiles.SuspendLayout(); + this.grpConnection.SuspendLayout(); + this.SuspendLayout(); + // + //grpFiles + // + this.grpFiles.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.grpFiles.Controls.Add(this.lblLocalFile); + this.grpFiles.Controls.Add(this.txtLocalFile); + this.grpFiles.Controls.Add(this.txtRemoteFile); + this.grpFiles.Controls.Add(this.lblRemoteFile); + this.grpFiles.Controls.Add(this.btnBrowse); + this.grpFiles.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.grpFiles.Location = new System.Drawing.Point(12, 153); + this.grpFiles.Name = "grpFiles"; + this.grpFiles.Size = new System.Drawing.Size(668, 194); + this.grpFiles.TabIndex = 2000; + this.grpFiles.TabStop = false; + this.grpFiles.Text = "Files"; + // + //lblLocalFile + // + this.lblLocalFile.AutoSize = true; + this.lblLocalFile.Location = new System.Drawing.Point(20, 25); + this.lblLocalFile.Name = "lblLocalFile"; + this.lblLocalFile.Size = new System.Drawing.Size(52, 13); + this.lblLocalFile.TabIndex = 10; + this.lblLocalFile.Text = "Local file:"; + // + //txtLocalFile + // + this.txtLocalFile.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtLocalFile.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtLocalFile.Location = new System.Drawing.Point(105, 23); + this.txtLocalFile.Name = "txtLocalFile"; + this.txtLocalFile.Size = new System.Drawing.Size(455, 20); + this.txtLocalFile.TabIndex = 20; + // + //txtRemoteFile + // + this.txtRemoteFile.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtRemoteFile.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtRemoteFile.Location = new System.Drawing.Point(105, 49); + this.txtRemoteFile.Name = "txtRemoteFile"; + this.txtRemoteFile.Size = new System.Drawing.Size(542, 20); + this.txtRemoteFile.TabIndex = 50; + // + //lblRemoteFile + // + this.lblRemoteFile.AutoSize = true; + this.lblRemoteFile.Location = new System.Drawing.Point(20, 51); + this.lblRemoteFile.Name = "lblRemoteFile"; + this.lblRemoteFile.Size = new System.Drawing.Size(63, 13); + this.lblRemoteFile.TabIndex = 40; + this.lblRemoteFile.Text = "Remote file:"; + // + //btnBrowse + // + this.btnBrowse.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); + this.btnBrowse.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnBrowse.Location = new System.Drawing.Point(566, 21); + this.btnBrowse.Name = "btnBrowse"; + this.btnBrowse.Size = new System.Drawing.Size(81, 23); + this.btnBrowse.TabIndex = 30; + this.btnBrowse.Text = "Browse"; + this.btnBrowse.UseVisualStyleBackColor = true; + // + //grpConnection + // + this.grpConnection.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.grpConnection.Controls.Add(this.radProtSFTP); + this.grpConnection.Controls.Add(this.radProtSCP); + this.grpConnection.Controls.Add(this.lblProtocol); + this.grpConnection.Controls.Add(this.lblPassword); + this.grpConnection.Controls.Add(this.lblUser); + this.grpConnection.Controls.Add(this.lblPort); + this.grpConnection.Controls.Add(this.lblHost); + this.grpConnection.Controls.Add(this.txtPort); + this.grpConnection.Controls.Add(this.txtHost); + this.grpConnection.Controls.Add(this.txtPassword); + this.grpConnection.Controls.Add(this.txtUser); + this.grpConnection.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.grpConnection.Location = new System.Drawing.Point(12, 12); + this.grpConnection.Name = "grpConnection"; + this.grpConnection.Size = new System.Drawing.Size(668, 135); + this.grpConnection.TabIndex = 1000; + this.grpConnection.TabStop = false; + this.grpConnection.Text = "Connection"; + // + //radProtSFTP + // + this.radProtSFTP.AutoSize = true; + this.radProtSFTP.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.radProtSFTP.Location = new System.Drawing.Point(153, 103); + this.radProtSFTP.Name = "radProtSFTP"; + this.radProtSFTP.Size = new System.Drawing.Size(51, 17); + this.radProtSFTP.TabIndex = 110; + this.radProtSFTP.Text = "SFTP"; + this.radProtSFTP.UseVisualStyleBackColor = true; + // + //radProtSCP + // + this.radProtSCP.AutoSize = true; + this.radProtSCP.Checked = true; + this.radProtSCP.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.radProtSCP.Location = new System.Drawing.Point(92, 103); + this.radProtSCP.Name = "radProtSCP"; + this.radProtSCP.Size = new System.Drawing.Size(45, 17); + this.radProtSCP.TabIndex = 100; + this.radProtSCP.TabStop = true; + this.radProtSCP.Text = "SCP"; + this.radProtSCP.UseVisualStyleBackColor = true; + // + //lblProtocol + // + this.lblProtocol.AutoSize = true; + this.lblProtocol.Location = new System.Drawing.Point(20, 105); + this.lblProtocol.Name = "lblProtocol"; + this.lblProtocol.Size = new System.Drawing.Size(49, 13); + this.lblProtocol.TabIndex = 90; + this.lblProtocol.Text = "Protocol:"; + // + //lblPassword + // + this.lblPassword.AutoSize = true; + this.lblPassword.Location = new System.Drawing.Point(20, 79); + this.lblPassword.Name = "lblPassword"; + this.lblPassword.Size = new System.Drawing.Size(56, 13); + this.lblPassword.TabIndex = 70; + this.lblPassword.Text = "Password:"; + // + //lblUser + // + this.lblUser.AutoSize = true; + this.lblUser.Location = new System.Drawing.Point(20, 53); + this.lblUser.Name = "lblUser"; + this.lblUser.Size = new System.Drawing.Size(32, 13); + this.lblUser.TabIndex = 50; + this.lblUser.Text = "User:"; + // + //lblPort + // + this.lblPort.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); + this.lblPort.AutoSize = true; + this.lblPort.Location = new System.Drawing.Point(582, 27); + this.lblPort.Name = "lblPort"; + this.lblPort.Size = new System.Drawing.Size(29, 13); + this.lblPort.TabIndex = 30; + this.lblPort.Text = "Port:"; + // + //lblHost + // + this.lblHost.AutoSize = true; + this.lblHost.Location = new System.Drawing.Point(20, 27); + this.lblHost.Name = "lblHost"; + this.lblHost.Size = new System.Drawing.Size(32, 13); + this.lblHost.TabIndex = 10; + this.lblHost.Text = "Host:"; + // + //txtPort + // + this.txtPort.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); + this.txtPort.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtPort.Location = new System.Drawing.Point(617, 25); + this.txtPort.Name = "txtPort"; + this.txtPort.Size = new System.Drawing.Size(30, 20); + this.txtPort.TabIndex = 40; + // + //txtHost + // + this.txtHost.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtHost.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtHost.Location = new System.Drawing.Point(105, 25); + this.txtHost.Name = "txtHost"; + this.txtHost.Size = new System.Drawing.Size(471, 20); + this.txtHost.TabIndex = 20; + // + //txtPassword + // + this.txtPassword.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtPassword.Location = new System.Drawing.Point(105, 77); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.PasswordChar = global::Microsoft.VisualBasic.Strings.ChrW(42); + this.txtPassword.Size = new System.Drawing.Size(471, 20); + this.txtPassword.TabIndex = 80; + // + //txtUser + // + this.txtUser.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.txtUser.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtUser.Location = new System.Drawing.Point(105, 51); + this.txtUser.Name = "txtUser"; + this.txtUser.Size = new System.Drawing.Size(471, 20); + this.txtUser.TabIndex = 60; + // + //btnTransfer + // + this.btnTransfer.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right); + this.btnTransfer.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnTransfer.Image = global::My.Resources.Resources.SSHTransfer; + this.btnTransfer.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnTransfer.Location = new System.Drawing.Point(597, 382); + this.btnTransfer.Name = "btnTransfer"; + this.btnTransfer.Size = new System.Drawing.Size(83, 29); + this.btnTransfer.TabIndex = 10000; + this.btnTransfer.Text = "Transfer"; + this.btnTransfer.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnTransfer.UseVisualStyleBackColor = true; + // + //pbStatus + // + this.pbStatus.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pbStatus.Location = new System.Drawing.Point(12, 353); + this.pbStatus.Name = "pbStatus"; + this.pbStatus.Size = new System.Drawing.Size(668, 23); + this.pbStatus.TabIndex = 3000; + // + //SSHTransfer + // + this.ClientSize = new System.Drawing.Size(692, 423); + this.Controls.Add(this.grpFiles); + this.Controls.Add(this.grpConnection); + this.Controls.Add(this.btnTransfer); + this.Controls.Add(this.pbStatus); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.Icon = (System.Drawing.Icon) (resources.GetObject("$this.Icon")); + this.Name = "SSHTransfer"; + this.TabText = "SSH File Transfer"; + this.Text = "SSH File Transfer"; + this.grpFiles.ResumeLayout(false); + this.grpFiles.PerformLayout(); + this.grpConnection.ResumeLayout(false); + this.grpConnection.PerformLayout(); + this.ResumeLayout(false); + + } + #endregion + + #region Private Properties + private SshTransferProtocolBase sshT; + private OpenFileDialog oDlg; + #endregion + + #region Public Properties + public string Hostname + { + get { + return this.txtHost.Text; + } + set + { + this.txtHost.Text = value; + } + } -#region Form Init - internal System.Windows.Forms.ProgressBar pbStatus; - internal System.Windows.Forms.Button btnTransfer; - internal System.Windows.Forms.TextBox txtUser; - internal System.Windows.Forms.TextBox txtPassword; - internal System.Windows.Forms.TextBox txtHost; - internal System.Windows.Forms.TextBox txtPort; - internal System.Windows.Forms.Label lblHost; - internal System.Windows.Forms.Label lblPort; - internal System.Windows.Forms.Label lblUser; - internal System.Windows.Forms.Label lblPassword; - internal System.Windows.Forms.Label lblProtocol; - internal System.Windows.Forms.RadioButton radProtSCP; - internal System.Windows.Forms.RadioButton radProtSFTP; - internal System.Windows.Forms.GroupBox grpConnection; - internal System.Windows.Forms.Button btnBrowse; - internal System.Windows.Forms.Label lblRemoteFile; - internal System.Windows.Forms.TextBox txtRemoteFile; - internal System.Windows.Forms.TextBox txtLocalFile; - internal System.Windows.Forms.Label lblLocalFile; - internal System.Windows.Forms.GroupBox grpFiles; + public string Port + { + get + { + return this.txtPort.Text; + } + set + { + this.txtPort.Text = value; + } + } - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SSHTransfer)); - this.grpFiles = new System.Windows.Forms.GroupBox(); - this.Load += new System.EventHandler(SSHTransfer_Load); - this.lblLocalFile = new System.Windows.Forms.Label(); - this.txtLocalFile = new System.Windows.Forms.TextBox(); - this.txtRemoteFile = new System.Windows.Forms.TextBox(); - this.lblRemoteFile = new System.Windows.Forms.Label(); - this.btnBrowse = new System.Windows.Forms.Button(); - this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); - this.grpConnection = new System.Windows.Forms.GroupBox(); - this.radProtSFTP = new System.Windows.Forms.RadioButton(); - this.radProtSCP = new System.Windows.Forms.RadioButton(); - this.lblProtocol = new System.Windows.Forms.Label(); - this.lblPassword = new System.Windows.Forms.Label(); - this.lblUser = new System.Windows.Forms.Label(); - this.lblPort = new System.Windows.Forms.Label(); - this.lblHost = new System.Windows.Forms.Label(); - this.txtPort = new System.Windows.Forms.TextBox(); - this.txtHost = new System.Windows.Forms.TextBox(); - this.txtPassword = new System.Windows.Forms.TextBox(); - this.txtUser = new System.Windows.Forms.TextBox(); - this.btnTransfer = new System.Windows.Forms.Button(); - this.btnTransfer.Click += new System.EventHandler(this.btnTransfer_Click); - this.pbStatus = new System.Windows.Forms.ProgressBar(); - this.grpFiles.SuspendLayout(); - this.grpConnection.SuspendLayout(); - this.SuspendLayout(); - // - //grpFiles - // - this.grpFiles.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.grpFiles.Controls.Add(this.lblLocalFile); - this.grpFiles.Controls.Add(this.txtLocalFile); - this.grpFiles.Controls.Add(this.txtRemoteFile); - this.grpFiles.Controls.Add(this.lblRemoteFile); - this.grpFiles.Controls.Add(this.btnBrowse); - this.grpFiles.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.grpFiles.Location = new System.Drawing.Point(12, 153); - this.grpFiles.Name = "grpFiles"; - this.grpFiles.Size = new System.Drawing.Size(668, 194); - this.grpFiles.TabIndex = 2000; - this.grpFiles.TabStop = false; - this.grpFiles.Text = "Files"; - // - //lblLocalFile - // - this.lblLocalFile.AutoSize = true; - this.lblLocalFile.Location = new System.Drawing.Point(20, 25); - this.lblLocalFile.Name = "lblLocalFile"; - this.lblLocalFile.Size = new System.Drawing.Size(52, 13); - this.lblLocalFile.TabIndex = 10; - this.lblLocalFile.Text = "Local file:"; - // - //txtLocalFile - // - this.txtLocalFile.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtLocalFile.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.txtLocalFile.Location = new System.Drawing.Point(105, 23); - this.txtLocalFile.Name = "txtLocalFile"; - this.txtLocalFile.Size = new System.Drawing.Size(455, 20); - this.txtLocalFile.TabIndex = 20; - // - //txtRemoteFile - // - this.txtRemoteFile.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtRemoteFile.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.txtRemoteFile.Location = new System.Drawing.Point(105, 49); - this.txtRemoteFile.Name = "txtRemoteFile"; - this.txtRemoteFile.Size = new System.Drawing.Size(542, 20); - this.txtRemoteFile.TabIndex = 50; - // - //lblRemoteFile - // - this.lblRemoteFile.AutoSize = true; - this.lblRemoteFile.Location = new System.Drawing.Point(20, 51); - this.lblRemoteFile.Name = "lblRemoteFile"; - this.lblRemoteFile.Size = new System.Drawing.Size(63, 13); - this.lblRemoteFile.TabIndex = 40; - this.lblRemoteFile.Text = "Remote file:"; - // - //btnBrowse - // - this.btnBrowse.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); - this.btnBrowse.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnBrowse.Location = new System.Drawing.Point(566, 21); - this.btnBrowse.Name = "btnBrowse"; - this.btnBrowse.Size = new System.Drawing.Size(81, 23); - this.btnBrowse.TabIndex = 30; - this.btnBrowse.Text = "Browse"; - this.btnBrowse.UseVisualStyleBackColor = true; - // - //grpConnection - // - this.grpConnection.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.grpConnection.Controls.Add(this.radProtSFTP); - this.grpConnection.Controls.Add(this.radProtSCP); - this.grpConnection.Controls.Add(this.lblProtocol); - this.grpConnection.Controls.Add(this.lblPassword); - this.grpConnection.Controls.Add(this.lblUser); - this.grpConnection.Controls.Add(this.lblPort); - this.grpConnection.Controls.Add(this.lblHost); - this.grpConnection.Controls.Add(this.txtPort); - this.grpConnection.Controls.Add(this.txtHost); - this.grpConnection.Controls.Add(this.txtPassword); - this.grpConnection.Controls.Add(this.txtUser); - this.grpConnection.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.grpConnection.Location = new System.Drawing.Point(12, 12); - this.grpConnection.Name = "grpConnection"; - this.grpConnection.Size = new System.Drawing.Size(668, 135); - this.grpConnection.TabIndex = 1000; - this.grpConnection.TabStop = false; - this.grpConnection.Text = "Connection"; - // - //radProtSFTP - // - this.radProtSFTP.AutoSize = true; - this.radProtSFTP.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.radProtSFTP.Location = new System.Drawing.Point(153, 103); - this.radProtSFTP.Name = "radProtSFTP"; - this.radProtSFTP.Size = new System.Drawing.Size(51, 17); - this.radProtSFTP.TabIndex = 110; - this.radProtSFTP.Text = "SFTP"; - this.radProtSFTP.UseVisualStyleBackColor = true; - // - //radProtSCP - // - this.radProtSCP.AutoSize = true; - this.radProtSCP.Checked = true; - this.radProtSCP.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.radProtSCP.Location = new System.Drawing.Point(92, 103); - this.radProtSCP.Name = "radProtSCP"; - this.radProtSCP.Size = new System.Drawing.Size(45, 17); - this.radProtSCP.TabIndex = 100; - this.radProtSCP.TabStop = true; - this.radProtSCP.Text = "SCP"; - this.radProtSCP.UseVisualStyleBackColor = true; - // - //lblProtocol - // - this.lblProtocol.AutoSize = true; - this.lblProtocol.Location = new System.Drawing.Point(20, 105); - this.lblProtocol.Name = "lblProtocol"; - this.lblProtocol.Size = new System.Drawing.Size(49, 13); - this.lblProtocol.TabIndex = 90; - this.lblProtocol.Text = "Protocol:"; - // - //lblPassword - // - this.lblPassword.AutoSize = true; - this.lblPassword.Location = new System.Drawing.Point(20, 79); - this.lblPassword.Name = "lblPassword"; - this.lblPassword.Size = new System.Drawing.Size(56, 13); - this.lblPassword.TabIndex = 70; - this.lblPassword.Text = "Password:"; - // - //lblUser - // - this.lblUser.AutoSize = true; - this.lblUser.Location = new System.Drawing.Point(20, 53); - this.lblUser.Name = "lblUser"; - this.lblUser.Size = new System.Drawing.Size(32, 13); - this.lblUser.TabIndex = 50; - this.lblUser.Text = "User:"; - // - //lblPort - // - this.lblPort.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); - this.lblPort.AutoSize = true; - this.lblPort.Location = new System.Drawing.Point(582, 27); - this.lblPort.Name = "lblPort"; - this.lblPort.Size = new System.Drawing.Size(29, 13); - this.lblPort.TabIndex = 30; - this.lblPort.Text = "Port:"; - // - //lblHost - // - this.lblHost.AutoSize = true; - this.lblHost.Location = new System.Drawing.Point(20, 27); - this.lblHost.Name = "lblHost"; - this.lblHost.Size = new System.Drawing.Size(32, 13); - this.lblHost.TabIndex = 10; - this.lblHost.Text = "Host:"; - // - //txtPort - // - this.txtPort.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right); - this.txtPort.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.txtPort.Location = new System.Drawing.Point(617, 25); - this.txtPort.Name = "txtPort"; - this.txtPort.Size = new System.Drawing.Size(30, 20); - this.txtPort.TabIndex = 40; - // - //txtHost - // - this.txtHost.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtHost.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.txtHost.Location = new System.Drawing.Point(105, 25); - this.txtHost.Name = "txtHost"; - this.txtHost.Size = new System.Drawing.Size(471, 20); - this.txtHost.TabIndex = 20; - // - //txtPassword - // - this.txtPassword.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.txtPassword.Location = new System.Drawing.Point(105, 77); - this.txtPassword.Name = "txtPassword"; - this.txtPassword.PasswordChar = global::Microsoft.VisualBasic.Strings.ChrW(42); - this.txtPassword.Size = new System.Drawing.Size(471, 20); - this.txtPassword.TabIndex = 80; - // - //txtUser - // - this.txtUser.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtUser.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.txtUser.Location = new System.Drawing.Point(105, 51); - this.txtUser.Name = "txtUser"; - this.txtUser.Size = new System.Drawing.Size(471, 20); - this.txtUser.TabIndex = 60; - // - //btnTransfer - // - this.btnTransfer.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right); - this.btnTransfer.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnTransfer.Image = global::My.Resources.Resources.SSHTransfer; - this.btnTransfer.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.btnTransfer.Location = new System.Drawing.Point(597, 382); - this.btnTransfer.Name = "btnTransfer"; - this.btnTransfer.Size = new System.Drawing.Size(83, 29); - this.btnTransfer.TabIndex = 10000; - this.btnTransfer.Text = "Transfer"; - this.btnTransfer.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.btnTransfer.UseVisualStyleBackColor = true; - // - //pbStatus - // - this.pbStatus.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pbStatus.Location = new System.Drawing.Point(12, 353); - this.pbStatus.Name = "pbStatus"; - this.pbStatus.Size = new System.Drawing.Size(668, 23); - this.pbStatus.TabIndex = 3000; - // - //SSHTransfer - // - this.ClientSize = new System.Drawing.Size(692, 423); - this.Controls.Add(this.grpFiles); - this.Controls.Add(this.grpConnection); - this.Controls.Add(this.btnTransfer); - this.Controls.Add(this.pbStatus); - this.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.Icon = (System.Drawing.Icon) (resources.GetObject("$this.Icon")); - this.Name = "SSHTransfer"; - this.TabText = "SSH File Transfer"; - this.Text = "SSH File Transfer"; - this.grpFiles.ResumeLayout(false); - this.grpFiles.PerformLayout(); - this.grpConnection.ResumeLayout(false); - this.grpConnection.PerformLayout(); - this.ResumeLayout(false); + public string Username + { + get + { + return this.txtUser.Text; + } + set + { + this.txtUser.Text = value; + } + } + + public string Password + { + get + { + return this.txtPassword.Text; + } + set + { + this.txtPassword.Text = value; + } + } + #endregion + + #region Form Stuff + private void SSHTransfer_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); + } + + private void ApplyLanguage() + { + grpFiles.Text = My.Language.strGroupboxFiles; + lblLocalFile.Text = My.Language.strLocalFile + ":"; + lblRemoteFile.Text = My.Language.strRemoteFile + ":"; + btnBrowse.Text = My.Language.strButtonBrowse; + grpConnection.Text = My.Language.strGroupboxConnection; + lblProtocol.Text = My.Language.strLabelProtocol; + lblPassword.Text = My.Language.strLabelPassword; + lblUser.Text = My.Language.strUser + ":"; + lblPort.Text = My.Language.strLabelPort; + lblHost.Text = My.Language.strHost + ":"; + btnTransfer.Text = My.Language.strTransfer; + TabText = My.Language.strMenuSSHFileTransfer; + Text = My.Language.strMenuSSHFileTransfer; + } + #endregion + + #region Private Methods + private void StartTransfer(SSHTransferProtocol Protocol) + { + if (AllFieldsSet() == false) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPleaseFillAllFields); + return; + } - } -#endregion - -#region Private Properties - private SshTransferProtocolBase sshT; - private OpenFileDialog oDlg; -#endregion - -#region Public Properties -public string Hostname - { - get - { - return this.txtHost.Text; - } - set - { - this.txtHost.Text = value; - } - } - -public string Port - { - get - { - return this.txtPort.Text; - } - set - { - this.txtPort.Text = value; - } - } - -public string Username - { - get - { - return this.txtUser.Text; - } - set - { - this.txtUser.Text = value; - } - } - -public string Password - { - get - { - return this.txtPassword.Text; - } - set - { - this.txtPassword.Text = value; - } - } -#endregion - -#region Form Stuff - private void SSHTransfer_Load(object sender, System.EventArgs e) - { - ApplyLanguage(); - } - - private void ApplyLanguage() - { - grpFiles.Text = My.Language.strGroupboxFiles; - lblLocalFile.Text = My.Language.strLocalFile + ":"; - lblRemoteFile.Text = My.Language.strRemoteFile + ":"; - btnBrowse.Text = My.Language.strButtonBrowse; - grpConnection.Text = My.Language.strGroupboxConnection; - lblProtocol.Text = My.Language.strLabelProtocol; - lblPassword.Text = My.Language.strLabelPassword; - lblUser.Text = My.Language.strUser + ":"; - lblPort.Text = My.Language.strLabelPort; - lblHost.Text = My.Language.strHost + ":"; - btnTransfer.Text = My.Language.strTransfer; - TabText = My.Language.strMenuSSHFileTransfer; - Text = My.Language.strMenuSSHFileTransfer; - } -#endregion - -#region Private Methods - private void StartTransfer(SSHTransferProtocol Protocol) - { - if (AllFieldsSet() == false) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPleaseFillAllFields); - return; - } + if (File.Exists(this.txtLocalFile.Text) == false) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strLocalFileDoesNotExist); + return; + } - if (File.Exists(this.txtLocalFile.Text) == false) - { - MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strLocalFileDoesNotExist); - return; - } - - try - { - if (Protocol == SSHTransferProtocol.SCP) - { - this.sshT = new Scp(txtHost.Text, txtUser.Text, txtPassword.Text); - } - else if (Protocol == SSHTransferProtocol.SFTP) - { - this.sshT = new Sftp(txtHost.Text, txtUser.Text, txtPassword.Text); - } - - sshT.OnTransferStart += SshTransfer_Start; - sshT.OnTransferProgress += SshTransfer_Progress; - sshT.OnTransferEnd += SshTransfer_End; - - this.sshT.Connect((int) this.txtPort.Text); - - LocalFile = this.txtLocalFile.Text; - RemoteFile = this.txtRemoteFile.Text; - - Thread t = new Thread(new System.Threading.ThreadStart(StartTransferBG)); - t.SetApartmentState(ApartmentState.STA); - t.IsBackground = true; - t.Start(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strSSHTransferFailed + Constants.vbNewLine + ex.Message); - this.sshT.Close(); - } - } - - private string LocalFile; - private string RemoteFile; - - private void StartTransferBG() + try + { + if (Protocol == SSHTransferProtocol.SCP) { - try - { - DisableButtons(); - this.sshT.Put(LocalFile, RemoteFile); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strSSHStartTransferBG + Constants.vbNewLine + ex.Message, true); - } + this.sshT = new Scp(txtHost.Text, txtUser.Text, txtPassword.Text); } - - private bool AllFieldsSet() + else if (Protocol == SSHTransferProtocol.SFTP) { - if (this.txtHost.Text != "" && this.txtPort.Text != "" && this.txtUser.Text != "" && this.txtLocalFile.Text != "" && this.txtRemoteFile.Text != "") - { - if (this.txtPassword.Text == "") - { - if (Interaction.MsgBox(My.Language.strEmptyPasswordContinue, (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.Question | MsgBoxStyle.YesNo), null) == MsgBoxResult.No) - { - return false; - } - } + this.sshT = new Sftp(txtHost.Text, txtUser.Text, txtPassword.Text); + } - if (this.txtRemoteFile.Text.EndsWith("/") || this.txtRemoteFile.Text.EndsWith("\\")) - { - this.txtRemoteFile.Text += this.txtLocalFile.Text.Substring(this.txtLocalFile.Text.LastIndexOf("\\") + 1); - } + sshT.OnTransferStart += SshTransfer_Start; + sshT.OnTransferProgress += SshTransfer_Progress; + sshT.OnTransferEnd += SshTransfer_End; - return true; - } - else + this.sshT.Connect((int) this.txtPort.Text); + + LocalFile = this.txtLocalFile.Text; + RemoteFile = this.txtRemoteFile.Text; + + Thread t = new Thread(new System.Threading.ThreadStart(StartTransferBG)); + t.SetApartmentState(ApartmentState.STA); + t.IsBackground = true; + t.Start(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strSSHTransferFailed + Constants.vbNewLine + ex.Message); + this.sshT.Close(); + } + } + + private string LocalFile; + private string RemoteFile; + + private void StartTransferBG() + { + try + { + DisableButtons(); + this.sshT.Put(LocalFile, RemoteFile); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strSSHStartTransferBG + Constants.vbNewLine + ex.Message, true); + } + } + + private bool AllFieldsSet() + { + if (this.txtHost.Text != "" && this.txtPort.Text != "" && this.txtUser.Text != "" && this.txtLocalFile.Text != "" && this.txtRemoteFile.Text != "") + { + if (this.txtPassword.Text == "") + { + if (Interaction.MsgBox(My.Language.strEmptyPasswordContinue, (Microsoft.VisualBasic.MsgBoxStyle) (MsgBoxStyle.Question | MsgBoxStyle.YesNo), null) == MsgBoxResult.No) { return false; } } - - - private long maxVal; - private long curVal; - - delegate void SetStatusCB(); - private void SetStatus() - { - if (pbStatus.InvokeRequired) - { - SetStatusCB d = new SetStatusCB(SetStatus); - this.pbStatus.Invoke(d); - } - else - { - pbStatus.Maximum = maxVal; - pbStatus.Value = curVal; - } - } - - delegate void EnableButtonsCB(); - private void EnableButtons() - { - if (btnTransfer.InvokeRequired) - { - EnableButtonsCB d = new EnableButtonsCB(EnableButtons); - this.btnTransfer.Invoke(d); - } - else - { - btnTransfer.Enabled = true; - } - } - - delegate void DisableButtonsCB(); - private void DisableButtons() - { - if (btnTransfer.InvokeRequired) - { - DisableButtonsCB d = new DisableButtonsCB(DisableButtons); - this.btnTransfer.Invoke(d); - } - else - { - btnTransfer.Enabled = false; - } - } - - private void SshTransfer_Start(string src, string dst, int transferredBytes, int totalBytes, string message) - { - maxVal = totalBytes; - curVal = transferredBytes; - - SetStatus(); - } - - private void SshTransfer_Progress(string src, string dst, int transferredBytes, int totalBytes, string message) - { - maxVal = totalBytes; - curVal = transferredBytes; - - SetStatus(); - } - - private void SshTransfer_End(string src, string dst, int transferredBytes, int totalBytes, string message) - { - try - { - maxVal = totalBytes; - curVal = transferredBytes; - EnableButtons(); - SetStatus(); - - MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strSSHTransferFailed); - - if (this.sshT != null) - { - this.sshT.Close(); - } - else if (this.sshT != null) - { - this.sshT.Close(); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strSSHTransferEndFailed + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region Public Methods - public SSHTransfer(DockContent Panel) + if (this.txtRemoteFile.Text.EndsWith("/") || this.txtRemoteFile.Text.EndsWith("\\")) { - this.WindowType = Type.SSHTransfer; - this.DockPnl = Panel; - this.InitializeComponent(); + this.txtRemoteFile.Text += this.txtLocalFile.Text.Substring(this.txtLocalFile.Text.LastIndexOf("\\") + 1); + } + + return true; + } + else + { + return false; + } + } + + + private long maxVal; + private long curVal; + + delegate void SetStatusCB(); + private void SetStatus() + { + if (pbStatus.InvokeRequired) + { + SetStatusCB d = new SetStatusCB(SetStatus); + this.pbStatus.Invoke(d); + } + else + { + pbStatus.Maximum = maxVal; + pbStatus.Value = curVal; + } + } + + delegate void EnableButtonsCB(); + private void EnableButtons() + { + if (btnTransfer.InvokeRequired) + { + EnableButtonsCB d = new EnableButtonsCB(EnableButtons); + this.btnTransfer.Invoke(d); + } + else + { + btnTransfer.Enabled = true; + } + } + + delegate void DisableButtonsCB(); + private void DisableButtons() + { + if (btnTransfer.InvokeRequired) + { + DisableButtonsCB d = new DisableButtonsCB(DisableButtons); + this.btnTransfer.Invoke(d); + } + else + { + btnTransfer.Enabled = false; + } + } + + private void SshTransfer_Start(string src, string dst, int transferredBytes, int totalBytes, string message) + { + maxVal = totalBytes; + curVal = transferredBytes; - this.oDlg = new OpenFileDialog(); - this.oDlg.Filter = "All Files (*.*)|*.*"; - this.oDlg.CheckFileExists = true; - } -#endregion + SetStatus(); + } -#region Form Stuff - private void btnBrowse_Click(System.Object sender, System.EventArgs e) - { - if (this.oDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) - { - if (this.oDlg.FileName != "") - { - this.txtLocalFile.Text = this.oDlg.FileName; - } - } - } + private void SshTransfer_Progress(string src, string dst, int transferredBytes, int totalBytes, string message) + { + maxVal = totalBytes; + curVal = transferredBytes; + + SetStatus(); + } - private void btnTransfer_Click(System.Object sender, System.EventArgs e) + private void SshTransfer_End(string src, string dst, int transferredBytes, int totalBytes, string message) + { + try + { + maxVal = totalBytes; + curVal = transferredBytes; + + EnableButtons(); + SetStatus(); + + Runtime.MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strSSHTransferFailed); + + if (this.sshT != null) { - if (this.radProtSCP.Checked) - { - this.StartTransfer(SSHTransferProtocol.SCP); - } - else if (this.radProtSFTP.Checked) - { - this.StartTransfer(SSHTransferProtocol.SFTP); - } + this.sshT.Close(); } -#endregion - - private enum SSHTransferProtocol + else if (this.sshT != null) { - SCP = 0, - SFTP = 1 + this.sshT.Close(); } } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strSSHTransferEndFailed + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Public Methods + public SSHTransfer(DockContent Panel) + { + this.WindowType = Type.SSHTransfer; + this.DockPnl = Panel; + this.InitializeComponent(); + + this.oDlg = new OpenFileDialog(); + this.oDlg.Filter = "All Files (*.*)|*.*"; + this.oDlg.CheckFileExists = true; + } + #endregion + + #region Form Stuff + private void btnBrowse_Click(System.Object sender, System.EventArgs e) + { + if (this.oDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + if (this.oDlg.FileName != "") + { + this.txtLocalFile.Text = this.oDlg.FileName; + } + } + } + + private void btnTransfer_Click(System.Object sender, System.EventArgs e) + { + if (this.radProtSCP.Checked) + { + this.StartTransfer(SSHTransferProtocol.SCP); + } + else if (this.radProtSFTP.Checked) + { + this.StartTransfer(SSHTransferProtocol.SFTP); + } + } + #endregion + + private enum SSHTransferProtocol + { + SCP = 0, + SFTP = 1 + } + } } diff --git a/mRemoteV1/CS/UI/UI.Window.ScreenshotManager.cs b/mRemoteV1/CS/UI/UI.Window.ScreenshotManager.cs index 89d820847..24007c937 100644 --- a/mRemoteV1/CS/UI/UI.Window.ScreenshotManager.cs +++ b/mRemoteV1/CS/UI/UI.Window.ScreenshotManager.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,393 +8,389 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; using System.IO; namespace mRemoteNG.UI.Window { public class ScreenshotManager : Base + { + #region Form Init + internal System.Windows.Forms.MenuStrip msMain; + internal System.Windows.Forms.ToolStripMenuItem mMenFile; + internal System.Windows.Forms.ToolStripMenuItem mMenFileSaveAll; + internal System.Windows.Forms.ToolStripMenuItem mMenFileRemoveAll; + internal System.Windows.Forms.ContextMenuStrip cMenScreenshot; + private System.ComponentModel.Container components = null; + internal System.Windows.Forms.ToolStripMenuItem cMenScreenshotCopy; + internal System.Windows.Forms.ToolStripMenuItem cMenScreenshotSave; + internal System.Windows.Forms.SaveFileDialog dlgSaveSingleImage; + internal System.Windows.Forms.FolderBrowserDialog dlgSaveAllImages; + internal System.Windows.Forms.FlowLayoutPanel flpScreenshots; + + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.Load += new System.EventHandler(ScreenshotManager_Load); + this.flpScreenshots = new System.Windows.Forms.FlowLayoutPanel(); + this.msMain = new System.Windows.Forms.MenuStrip(); + this.mMenFile = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenFile.DropDownOpening += new System.EventHandler(this.mMenFile_DropDownOpening); + this.mMenFileSaveAll = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenFileSaveAll.Click += new System.EventHandler(this.mMenFileSaveAll_Click); + this.mMenFileRemoveAll = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenFileRemoveAll.Click += new System.EventHandler(this.mMenFileRemoveAll_Click); + this.cMenScreenshot = new System.Windows.Forms.ContextMenuStrip(this.components); + this.cMenScreenshotCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenScreenshotCopy.Click += new System.EventHandler(this.cMenScreenshotCopy_Click); + this.cMenScreenshotSave = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenScreenshotSave.Click += new System.EventHandler(this.cMenScreenshotSave_Click); + this.dlgSaveSingleImage = new System.Windows.Forms.SaveFileDialog(); + this.dlgSaveAllImages = new System.Windows.Forms.FolderBrowserDialog(); + this.msMain.SuspendLayout(); + this.cMenScreenshot.SuspendLayout(); + this.SuspendLayout(); + // + //flpScreenshots + // + this.flpScreenshots.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.flpScreenshots.AutoScroll = true; + this.flpScreenshots.Location = new System.Drawing.Point(0, 26); + this.flpScreenshots.Name = "flpScreenshots"; + this.flpScreenshots.Size = new System.Drawing.Size(542, 296); + this.flpScreenshots.TabIndex = 0; + // + //msMain + // + this.msMain.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); + this.msMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.mMenFile}); + this.msMain.Location = new System.Drawing.Point(0, 0); + this.msMain.Name = "msMain"; + this.msMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.msMain.Size = new System.Drawing.Size(542, 24); + this.msMain.TabIndex = 1; + this.msMain.Text = "MenuStrip1"; + // + //mMenFile + // + this.mMenFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.mMenFileSaveAll, this.mMenFileRemoveAll}); + this.mMenFile.Image = global::My.Resources.Resources.File; + this.mMenFile.Name = "mMenFile"; + this.mMenFile.Size = new System.Drawing.Size(51, 20); + this.mMenFile.Text = "&File"; + // + //mMenFileSaveAll + // + this.mMenFileSaveAll.Image = global::My.Resources.Resources.Screenshot_Save; + this.mMenFileSaveAll.Name = "mMenFileSaveAll"; + this.mMenFileSaveAll.Size = new System.Drawing.Size(128, 22); + this.mMenFileSaveAll.Text = "Save All"; + // + //mMenFileRemoveAll + // + this.mMenFileRemoveAll.Image = global::My.Resources.Resources.Screenshot_Delete; + this.mMenFileRemoveAll.Name = "mMenFileRemoveAll"; + this.mMenFileRemoveAll.Size = new System.Drawing.Size(128, 22); + this.mMenFileRemoveAll.Text = "Remove All"; + // + //cMenScreenshot + // + this.cMenScreenshot.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenScreenshotCopy, this.cMenScreenshotSave}); + this.cMenScreenshot.Name = "cMenScreenshot"; + this.cMenScreenshot.Size = new System.Drawing.Size(100, 48); + // + //cMenScreenshotCopy + // + this.cMenScreenshotCopy.Image = global::My.Resources.Resources.Screenshot_Copy; + this.cMenScreenshotCopy.Name = "cMenScreenshotCopy"; + this.cMenScreenshotCopy.Size = new System.Drawing.Size(99, 22); + this.cMenScreenshotCopy.Text = "Copy"; + // + //cMenScreenshotSave + // + this.cMenScreenshotSave.Image = global::My.Resources.Resources.Screenshot_Save; + this.cMenScreenshotSave.Name = "cMenScreenshotSave"; + this.cMenScreenshotSave.Size = new System.Drawing.Size(99, 22); + this.cMenScreenshotSave.Text = "Save"; + // + //dlgSaveSingleImage + // + this.dlgSaveSingleImage.Filter = "Graphics Interchange Format File (.gif)|*.gif|Joint Photographic Experts Group Fi" + + "le (.jpeg)|*.jpeg|Joint Photographic Experts Group File (.jpg)|*.jpg|Portable Ne" + + "twork Graphics File (.png)|*.png"; + this.dlgSaveSingleImage.FilterIndex = 4; + // + //ScreenshotManager + // + this.ClientSize = new System.Drawing.Size(542, 323); + this.Controls.Add(this.flpScreenshots); + this.Controls.Add(this.msMain); + this.HideOnClose = true; + this.Icon = global::My.Resources.Resources.Screenshot_Icon; + this.MainMenuStrip = this.msMain; + this.Name = "ScreenshotManager"; + this.TabText = "Screenshots"; + this.Text = "Screenshots"; + this.msMain.ResumeLayout(false); + this.msMain.PerformLayout(); + this.cMenScreenshot.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + #endregion + + #region Form Stuff + private void ScreenshotManager_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); + } + + private void ApplyLanguage() + { + mMenFile.Text = My.Language.strMenuFile; + mMenFileSaveAll.Text = My.Language.strSaveAll; + mMenFileRemoveAll.Text = My.Language.strRemoveAll; + cMenScreenshotCopy.Text = My.Language.strMenuCopy; + cMenScreenshotSave.Text = My.Language.strSave; + dlgSaveSingleImage.Filter = My.Language.strSaveImageFilter; + TabText = My.Language.strScreenshots; + Text = My.Language.strScreenshots; + } + #endregion + + #region Public Methods + public ScreenshotManager(DockContent Panel) + { + this.WindowType = Type.ScreenshotManager; + this.DockPnl = Panel; + this.InitializeComponent(); + } + + public void AddScreenshot(Image Screenshot) + { + try { - -#region Form Init - internal System.Windows.Forms.MenuStrip msMain; - internal System.Windows.Forms.ToolStripMenuItem mMenFile; - internal System.Windows.Forms.ToolStripMenuItem mMenFileSaveAll; - internal System.Windows.Forms.ToolStripMenuItem mMenFileRemoveAll; - internal System.Windows.Forms.ContextMenuStrip cMenScreenshot; - private System.ComponentModel.Container components = null; - internal System.Windows.Forms.ToolStripMenuItem cMenScreenshotCopy; - internal System.Windows.Forms.ToolStripMenuItem cMenScreenshotSave; - internal System.Windows.Forms.SaveFileDialog dlgSaveSingleImage; - internal System.Windows.Forms.FolderBrowserDialog dlgSaveAllImages; - internal System.Windows.Forms.FlowLayoutPanel flpScreenshots; - - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.Load += new System.EventHandler(ScreenshotManager_Load); - this.flpScreenshots = new System.Windows.Forms.FlowLayoutPanel(); - this.msMain = new System.Windows.Forms.MenuStrip(); - this.mMenFile = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenFile.DropDownOpening += new System.EventHandler(this.mMenFile_DropDownOpening); - this.mMenFileSaveAll = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenFileSaveAll.Click += new System.EventHandler(this.mMenFileSaveAll_Click); - this.mMenFileRemoveAll = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenFileRemoveAll.Click += new System.EventHandler(this.mMenFileRemoveAll_Click); - this.cMenScreenshot = new System.Windows.Forms.ContextMenuStrip(this.components); - this.cMenScreenshotCopy = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenScreenshotCopy.Click += new System.EventHandler(this.cMenScreenshotCopy_Click); - this.cMenScreenshotSave = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenScreenshotSave.Click += new System.EventHandler(this.cMenScreenshotSave_Click); - this.dlgSaveSingleImage = new System.Windows.Forms.SaveFileDialog(); - this.dlgSaveAllImages = new System.Windows.Forms.FolderBrowserDialog(); - this.msMain.SuspendLayout(); - this.cMenScreenshot.SuspendLayout(); - this.SuspendLayout(); - // - //flpScreenshots - // - this.flpScreenshots.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.flpScreenshots.AutoScroll = true; - this.flpScreenshots.Location = new System.Drawing.Point(0, 26); - this.flpScreenshots.Name = "flpScreenshots"; - this.flpScreenshots.Size = new System.Drawing.Size(542, 296); - this.flpScreenshots.TabIndex = 0; - // - //msMain - // - this.msMain.Font = new System.Drawing.Font("Microsoft Sans Serif", (float) (8.25F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.msMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.mMenFile}); - this.msMain.Location = new System.Drawing.Point(0, 0); - this.msMain.Name = "msMain"; - this.msMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.msMain.Size = new System.Drawing.Size(542, 24); - this.msMain.TabIndex = 1; - this.msMain.Text = "MenuStrip1"; - // - //mMenFile - // - this.mMenFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.mMenFileSaveAll, this.mMenFileRemoveAll}); - this.mMenFile.Image = global::My.Resources.Resources.File; - this.mMenFile.Name = "mMenFile"; - this.mMenFile.Size = new System.Drawing.Size(51, 20); - this.mMenFile.Text = "&File"; - // - //mMenFileSaveAll - // - this.mMenFileSaveAll.Image = global::My.Resources.Resources.Screenshot_Save; - this.mMenFileSaveAll.Name = "mMenFileSaveAll"; - this.mMenFileSaveAll.Size = new System.Drawing.Size(128, 22); - this.mMenFileSaveAll.Text = "Save All"; - // - //mMenFileRemoveAll - // - this.mMenFileRemoveAll.Image = global::My.Resources.Resources.Screenshot_Delete; - this.mMenFileRemoveAll.Name = "mMenFileRemoveAll"; - this.mMenFileRemoveAll.Size = new System.Drawing.Size(128, 22); - this.mMenFileRemoveAll.Text = "Remove All"; - // - //cMenScreenshot - // - this.cMenScreenshot.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenScreenshotCopy, this.cMenScreenshotSave}); - this.cMenScreenshot.Name = "cMenScreenshot"; - this.cMenScreenshot.Size = new System.Drawing.Size(100, 48); - // - //cMenScreenshotCopy - // - this.cMenScreenshotCopy.Image = global::My.Resources.Resources.Screenshot_Copy; - this.cMenScreenshotCopy.Name = "cMenScreenshotCopy"; - this.cMenScreenshotCopy.Size = new System.Drawing.Size(99, 22); - this.cMenScreenshotCopy.Text = "Copy"; - // - //cMenScreenshotSave - // - this.cMenScreenshotSave.Image = global::My.Resources.Resources.Screenshot_Save; - this.cMenScreenshotSave.Name = "cMenScreenshotSave"; - this.cMenScreenshotSave.Size = new System.Drawing.Size(99, 22); - this.cMenScreenshotSave.Text = "Save"; - // - //dlgSaveSingleImage - // - this.dlgSaveSingleImage.Filter = "Graphics Interchange Format File (.gif)|*.gif|Joint Photographic Experts Group Fi" + - "le (.jpeg)|*.jpeg|Joint Photographic Experts Group File (.jpg)|*.jpg|Portable Ne" + - "twork Graphics File (.png)|*.png"; - this.dlgSaveSingleImage.FilterIndex = 4; - // - //ScreenshotManager - // - this.ClientSize = new System.Drawing.Size(542, 323); - this.Controls.Add(this.flpScreenshots); - this.Controls.Add(this.msMain); - this.HideOnClose = true; - this.Icon = global::My.Resources.Resources.Screenshot_Icon; - this.MainMenuStrip = this.msMain; - this.Name = "ScreenshotManager"; - this.TabText = "Screenshots"; - this.Text = "Screenshots"; - this.msMain.ResumeLayout(false); - this.msMain.PerformLayout(); - this.cMenScreenshot.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } -#endregion - -#region Form Stuff - private void ScreenshotManager_Load(object sender, System.EventArgs e) - { - ApplyLanguage(); - } - - private void ApplyLanguage() - { - mMenFile.Text = My.Language.strMenuFile; - mMenFileSaveAll.Text = My.Language.strSaveAll; - mMenFileRemoveAll.Text = My.Language.strRemoveAll; - cMenScreenshotCopy.Text = My.Language.strMenuCopy; - cMenScreenshotSave.Text = My.Language.strSave; - dlgSaveSingleImage.Filter = My.Language.strSaveImageFilter; - TabText = My.Language.strScreenshots; - Text = My.Language.strScreenshots; - } -#endregion - -#region Public Methods - public ScreenshotManager(DockContent Panel) - { - this.WindowType = Type.ScreenshotManager; - this.DockPnl = Panel; - this.InitializeComponent(); - } - - public void AddScreenshot(Image Screenshot) - { - try - { - PictureBox nPB = new PictureBox(); - nPB.MouseDown += this.pbScreenshot_MouseDown; + PictureBox nPB = new PictureBox(); + nPB.MouseDown += this.pbScreenshot_MouseDown; - nPB.Parent = this.flpScreenshots; - nPB.SizeMode = PictureBoxSizeMode.StretchImage; - nPB.BorderStyle = BorderStyle.FixedSingle; - nPB.ContextMenuStrip = this.cMenScreenshot; - nPB.Image = Screenshot; - nPB.Size = new Size(100, 100); //New Size((Screenshot.Width / 100) * 20, (Screenshot.Height / 100) * 20) - nPB.Show(); + nPB.Parent = this.flpScreenshots; + nPB.SizeMode = PictureBoxSizeMode.StretchImage; + nPB.BorderStyle = BorderStyle.FixedSingle; + nPB.ContextMenuStrip = this.cMenScreenshot; + nPB.Image = Screenshot; + nPB.Size = new Size(100, 100); //New Size((Screenshot.Width / 100) * 20, (Screenshot.Height / 100) * 20) + nPB.Show(); - Button nBtn = new Button(); - nBtn.Click += btnCloseScreenshot_Click; + Button nBtn = new Button(); + nBtn.Click += btnCloseScreenshot_Click; - nBtn.Parent = nPB; - nBtn.FlatStyle = FlatStyle.Flat; - nBtn.Text = "×"; - nBtn.Size = new Size(22, 22); - nBtn.Location = new Point(nPB.Width - nBtn.Width, -1); - nBtn.Show(); + nBtn.Parent = nPB; + nBtn.FlatStyle = FlatStyle.Flat; + nBtn.Text = "×"; + nBtn.Size = new Size(22, 22); + nBtn.Location = new Point(nPB.Width - nBtn.Width, -1); + nBtn.Show(); - this.Show(frmMain.Default.pnlDock); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddScreenshot (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region Private Methods - private void pbScreenshot_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) - { - this.cMenScreenshot.Tag = sender; - - if (e.Button == System.Windows.Forms.MouseButtons.Left) - { - this.OpenScreenshot(sender); - } - } - - private void pbScreenshotOpen_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) - { - if (e.Button == System.Windows.Forms.MouseButtons.Left) - { - this.CloseOpenedScreenshot(sender.Parent); - } - } - - private void CloseOpenedScreenshot(Form form) - { - form.Close(); - } - - private void OpenScreenshot(PictureBox sender) - { - try - { - Image mImage = sender.Image; - - Form nForm = new Form(); - nForm.StartPosition = FormStartPosition.CenterParent; - nForm.ShowInTaskbar = false; - nForm.ShowIcon = false; - nForm.MaximizeBox = false; - nForm.MinimizeBox = false; - nForm.Width = mImage.Width + 2; - nForm.Height = mImage.Height + 2; - nForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; - - PictureBox nPB = new PictureBox(); - nPB.Parent = nForm; - nPB.BorderStyle = BorderStyle.FixedSingle; - nPB.Location = new Point(0, 0); - nPB.SizeMode = PictureBoxSizeMode.AutoSize; - nPB.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Top); - nPB.Image = mImage; - nPB.ContextMenuStrip = this.cMenScreenshot; - nPB.Show(); - - nPB.MouseDown += this.pbScreenshotOpen_MouseDown; - - nForm.ShowDialog(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "OpenScreenshot (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void btnCloseScreenshot_Click(System.Object sender, System.EventArgs e) - { - try - { - sender.Parent.Dispose(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "btnCloseScreenshot_Click (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void mMenFileRemoveAll_Click(System.Object sender, System.EventArgs e) - { - this.RemoveAllImages(); - } - - private void RemoveAllImages() - { - this.flpScreenshots.Controls.Clear(); - } - - private void mMenFileSaveAll_Click(System.Object sender, System.EventArgs e) - { - this.SaveAllImages(); - } - - private void SaveAllImages() - { - try - { - int pCount = 1; - - if (this.dlgSaveAllImages.ShowDialog() == System.Windows.Forms.DialogResult.OK) - { - foreach (string fPath in Directory.GetFiles(this.dlgSaveAllImages.SelectedPath, "Screenshot_*", SearchOption.TopDirectoryOnly)) - { - FileInfo f = new FileInfo(fPath); - - string fCount = f.Name; - fCount = fCount.Replace(f.Extension, ""); - fCount = fCount.Replace("Screenshot_", ""); - - pCount = (int) (double.Parse(fCount) + 1); - } - - foreach (System.Windows.Forms.Control ctrl in this.flpScreenshots.Controls) - { - if (ctrl is PictureBox) - { - (ctrl as PictureBox).Image.Save(this.dlgSaveAllImages.SelectedPath + "\\Screenshot_" + Tools.Misc.LeadingZero(System.Convert.ToString(pCount)) +".png", System.Drawing.Imaging.ImageFormat.Png); - pCount++; - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveAllImages (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void cMenScreenshotCopy_Click(System.Object sender, System.EventArgs e) - { - this.CopyImageToClipboard(); - } - - private void CopyImageToClipboard() - { - try - { - Clipboard.SetImage((cMenScreenshot.Tag as PictureBox).Image); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "CopyImageToClipboard (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void cMenScreenshotSave_Click(System.Object sender, System.EventArgs e) - { - this.SaveSingleImage(); - } - - private void SaveSingleImage() - { - try - { - if (this.dlgSaveSingleImage.ShowDialog() == System.Windows.Forms.DialogResult.OK) - { - switch (this.dlgSaveSingleImage.FileName.Substring(this.dlgSaveSingleImage.FileName.LastIndexOf(".") + 1).ToLower()) - { - case "gif": - (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Gif); - break; - case "jpeg": - (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); - break; - case "jpg": - (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); - break; - case "png": - (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Png); - break; - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveSingleImage (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - private void mMenFile_DropDownOpening(object sender, System.EventArgs e) - { - if (this.flpScreenshots.Controls.Count < 1) - { - this.mMenFileSaveAll.Enabled = false; - this.mMenFileRemoveAll.Enabled = false; - } - else - { - this.mMenFileSaveAll.Enabled = true; - this.mMenFileRemoveAll.Enabled = true; - } - } -#endregion - + this.Show(frmMain.Default.pnlDock); } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddScreenshot (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Private Methods + private void pbScreenshot_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) + { + this.cMenScreenshot.Tag = sender; + + if (e.Button == System.Windows.Forms.MouseButtons.Left) + { + this.OpenScreenshot(sender); + } + } + + private void pbScreenshotOpen_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Left) + { + this.CloseOpenedScreenshot(sender.Parent); + } + } + + private void CloseOpenedScreenshot(Form form) + { + form.Close(); + } + + private void OpenScreenshot(PictureBox sender) + { + try + { + Image mImage = sender.Image; + + Form nForm = new Form(); + nForm.StartPosition = FormStartPosition.CenterParent; + nForm.ShowInTaskbar = false; + nForm.ShowIcon = false; + nForm.MaximizeBox = false; + nForm.MinimizeBox = false; + nForm.Width = mImage.Width + 2; + nForm.Height = mImage.Height + 2; + nForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + + PictureBox nPB = new PictureBox(); + nPB.Parent = nForm; + nPB.BorderStyle = BorderStyle.FixedSingle; + nPB.Location = new Point(0, 0); + nPB.SizeMode = PictureBoxSizeMode.AutoSize; + nPB.Anchor = (System.Windows.Forms.AnchorStyles) (AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Top); + nPB.Image = mImage; + nPB.ContextMenuStrip = this.cMenScreenshot; + nPB.Show(); + + nPB.MouseDown += this.pbScreenshotOpen_MouseDown; + + nForm.ShowDialog(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "OpenScreenshot (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void btnCloseScreenshot_Click(System.Object sender, System.EventArgs e) + { + try + { + sender.Parent.Dispose(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "btnCloseScreenshot_Click (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void mMenFileRemoveAll_Click(System.Object sender, System.EventArgs e) + { + this.RemoveAllImages(); + } + + private void RemoveAllImages() + { + this.flpScreenshots.Controls.Clear(); + } + + private void mMenFileSaveAll_Click(System.Object sender, System.EventArgs e) + { + this.SaveAllImages(); + } + + private void SaveAllImages() + { + try + { + int pCount = 1; + + if (this.dlgSaveAllImages.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + foreach (string fPath in Directory.GetFiles(this.dlgSaveAllImages.SelectedPath, "Screenshot_*", SearchOption.TopDirectoryOnly)) + { + FileInfo f = new FileInfo(fPath); + + string fCount = f.Name; + fCount = fCount.Replace(f.Extension, ""); + fCount = fCount.Replace("Screenshot_", ""); + + pCount = (int) (double.Parse(fCount) + 1); + } + + foreach (System.Windows.Forms.Control ctrl in this.flpScreenshots.Controls) + { + if (ctrl is PictureBox) + { + (ctrl as PictureBox).Image.Save(this.dlgSaveAllImages.SelectedPath + "\\Screenshot_" + Tools.Misc.LeadingZero(System.Convert.ToString(pCount)) +".png", System.Drawing.Imaging.ImageFormat.Png); + pCount++; + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveAllImages (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void cMenScreenshotCopy_Click(System.Object sender, System.EventArgs e) + { + this.CopyImageToClipboard(); + } + + private void CopyImageToClipboard() + { + try + { + Clipboard.SetImage((cMenScreenshot.Tag as PictureBox).Image); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "CopyImageToClipboard (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void cMenScreenshotSave_Click(System.Object sender, System.EventArgs e) + { + this.SaveSingleImage(); + } + + private void SaveSingleImage() + { + try + { + if (this.dlgSaveSingleImage.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + switch (this.dlgSaveSingleImage.FileName.Substring(this.dlgSaveSingleImage.FileName.LastIndexOf(".") + 1).ToLower()) + { + case "gif": + (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Gif); + break; + case "jpeg": + (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); + break; + case "jpg": + (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); + break; + case "png": + (this.cMenScreenshot.Tag as PictureBox).Image.Save(this.dlgSaveSingleImage.FileName, System.Drawing.Imaging.ImageFormat.Png); + break; + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SaveSingleImage (UI.Window.ScreenshotManager) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private void mMenFile_DropDownOpening(object sender, System.EventArgs e) + { + if (this.flpScreenshots.Controls.Count < 1) + { + this.mMenFileSaveAll.Enabled = false; + this.mMenFileRemoveAll.Enabled = false; + } + else + { + this.mMenFileSaveAll.Enabled = true; + this.mMenFileRemoveAll.Enabled = true; + } + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.Sessions.cs b/mRemoteV1/CS/UI/UI.Window.Sessions.cs index c57f2a4a1..49634bfe3 100644 --- a/mRemoteV1/CS/UI/UI.Window.Sessions.cs +++ b/mRemoteV1/CS/UI/UI.Window.Sessions.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,367 +8,365 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.Threading; using mRemoteNG.My; using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public partial class Sessions : Base + { + #region Private Fields + private Thread _getSessionsThread; + private bool _retrieved = false; + #endregion + + #region Public Methods + public Sessions(DockContent panel) + { + WindowType = Type.Sessions; + DockPnl = panel; + InitializeComponent(); + } + + public void GetSessions(bool Auto = false) + { + ClearList(); + if (Auto) { -#region Private Fields - private Thread _getSessionsThread; - private bool _retrieved = false; -#endregion - -#region Public Methods - public Sessions(DockContent panel) + _retrieved = false; + if (!Settings.AutomaticallyGetSessionInfo) { - WindowType = Type.Sessions; - DockPnl = panel; - InitializeComponent(); + return ; } - - public void GetSessions(bool Auto = false) - { - ClearList(); - if (Auto) - { - _retrieved = false; - if (!Settings.AutomaticallyGetSessionInfo) - { - return ; - } - } - - try - { - mRemoteNG.Connection.Info connectionInfo = mRemoteNG.Tree.Node.SelectedNode.Tag as mRemoteNG.Connection.Info; - if (connectionInfo == null) - { - return ; - } - - if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP | connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.ICA)) - { - return ; - } - - BackgroundData data = new BackgroundData(); - data.Hostname = connectionInfo.Hostname; - data.Username = connectionInfo.Username; - data.Password = connectionInfo.Password; - data.Domain = connectionInfo.Domain; - - if (Settings.EmptyCredentials == "custom") - { - if (string.IsNullOrEmpty(data.Username)) - { - data.Username = Settings.DefaultUsername; - } - - if (string.IsNullOrEmpty(data.Password)) - { - data.Password = Security.Crypt.Decrypt(Settings.DefaultPassword, App.Info.General.EncryptionKey); - } - - if (string.IsNullOrEmpty(data.Domain)) - { - data.Domain = Settings.DefaultDomain; - } - } - - if (_getSessionsThread != null) - { - if (_getSessionsThread.IsAlive) - { - _getSessionsThread.Abort(); - } - } - _getSessionsThread = new Thread(new System.Threading.ThreadStart(GetSessionsBackground)); - _getSessionsThread.SetApartmentState(ApartmentState.STA); - _getSessionsThread.IsBackground = true; - _getSessionsThread.Start(data); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Sessions.GetSessions() failed." + Constants.vbNewLine + ex.Message, true); - } - } - - public void KillSession() - { - if (sessionList.SelectedItems.Count == 0) - { - return ; - } - - mRemoteNG.Connection.Info connectionInfo = mRemoteNG.Tree.Node.SelectedNode.Tag as mRemoteNG.Connection.Info; - if (connectionInfo == null) - { - return ; - } - - if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP)) - { - return ; - } - - foreach (ListViewItem lvItem in sessionList.SelectedItems) - { - KillSession(connectionInfo.Hostname, connectionInfo.Username, connectionInfo.Password, connectionInfo.Domain, System.Convert.ToString(lvItem.Tag)); - } - } - - public void KillSession(string hostname, string username, string password, string domain, string sessionId) - { - try - { - BackgroundData data = new BackgroundData(); - data.Hostname = hostname; - data.Username = username; - data.Password = password; - data.Domain = domain; - data.SessionId = long.Parse(sessionId); - - Thread thread = new Thread(new System.Threading.ThreadStart(KillSessionBackground)); - thread.SetApartmentState(ApartmentState.STA); - thread.IsBackground = true; - thread.Start(data); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Sessions.KillSession() failed." + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region Private Methods -#region Form Stuff - public void Sessions_Load(object sender, EventArgs e) - { - ApplyLanguage(); - } - - private void ApplyLanguage() - { - TabText = Language.strMenuSessions; - Text = Language.strMenuSessions; - sessionActivityColumn.Text = Language.strActivity; - sessionMenuLogoff.Text = Language.strLogOff; - sessionMenuRetrieve.Text = Language.strMenuSessionRetrieve; - sessionTypeColumn.Text = Language.strType; - sessionUsernameColumn.Text = Language.strColumnUsername; - } -#endregion - - private void GetSessionsBackground(object dataObject) - { - BackgroundData data = dataObject as BackgroundData; - if (data == null) - { - return ; - } - - Security.Impersonator impersonator = new Security.Impersonator(); - mRemoteNG.Connection.Protocol.RDP.TerminalSessions terminalSessions = new mRemoteNG.Connection.Protocol.RDP.TerminalSessions(); - long serverHandle = 0; - try - { - impersonator.StartImpersonation(data.Domain, data.Username, data.Password); - - serverHandle = terminalSessions.OpenConnection(data.Hostname); - if (serverHandle == 0) - { - return ; - } - - GetSessions(terminalSessions, serverHandle); - - _retrieved = true; - } - catch (ThreadAbortException) - { - - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strSessionGetFailed + Constants.vbNewLine + ex.Message, true); - } - finally - { - impersonator.StopImpersonation(); - if (!(serverHandle == 0)) - { - terminalSessions.CloseConnection(serverHandle); - } - } - } - - // Get sessions from an already impersonated and connected TerminalSessions object - private void GetSessions(mRemoteNG.Protocol.Protocol.RDP.TerminalSessions terminalSessions, long serverHandle) - { - mRemoteNG.Connection.Protocol.RDP.SessionsCollection rdpSessions = terminalSessions.GetSessions(serverHandle); - foreach (mRemoteNG.Connection.Protocol.RDP.Session session in rdpSessions) - { - ListViewItem item = new ListViewItem(); - item.Tag = session.SessionId; - item.Text = session.SessionUser; - item.SubItems.Add(session.SessionState); - item.SubItems.Add(session.SessionName.Replace(Constants.vbNewLine, "")); - AddToList(item); - } - } - - private void KillSessionBackground(object dataObject) - { - BackgroundData data = dataObject as BackgroundData; - if (data == null) - { - return ; - } - - Security.Impersonator impersonator = new Security.Impersonator(); - mRemoteNG.Connection.Protocol.RDP.TerminalSessions terminalSessions = new mRemoteNG.Connection.Protocol.RDP.TerminalSessions(); - long serverHandle = 0; - try - { - if (string.IsNullOrEmpty(data.Username) || string.IsNullOrEmpty(data.Password)) - { - return ; - } - - impersonator.StartImpersonation(data.Domain, data.Username, data.Password); - - serverHandle = terminalSessions.OpenConnection(data.Hostname); - if (!(serverHandle == 0)) - { - terminalSessions.KillSession(serverHandle, data.SessionId); - } - - ClearList(); - GetSessions(terminalSessions, serverHandle); - - _retrieved = true; - } - catch (ThreadAbortException) - { - - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strSessionKillFailed + Constants.vbNewLine + ex.Message, true); - } - finally - { - impersonator.StopImpersonation(); - if (!(serverHandle == 0)) - { - terminalSessions.CloseConnection(serverHandle); - } - } - } - - delegate void AddToListCallback(ListViewItem item); - private void AddToList(ListViewItem item) - { - if (sessionList.InvokeRequired) - { - AddToListCallback callback = new AddToListCallback(AddToList); - sessionList.Invoke(callback, new object[] {item}); - } - else - { - sessionList.Items.Add(item); - } - } - - delegate void ClearListCallback(); - private void ClearList() - { - if (sessionList.InvokeRequired) - { - ClearListCallback callback = new ClearListCallback(ClearList); - sessionList.Invoke(callback); - } - else - { - sessionList.Items.Clear(); - } - } - - private void menuSession_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - mRemoteNG.Connection.Info connectionInfo = default(mRemoteNG.Connection.Info); - if (mRemoteNG.Tree.Node.TreeView == null || mRemoteNG.Tree.Node.SelectedNode == null) - { - connectionInfo = null; - } - else - { - connectionInfo = mRemoteNG.Tree.Node.SelectedNode.Tag as mRemoteNG.Connection.Info; - } - - if (connectionInfo == null) - { - sessionMenuLogoff.Enabled = false; - sessionMenuRetrieve.Enabled = false; - sessionMenuRetrieve.Text = Language.strMenuSessionRetrieve; - return ; - } - - if (connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP & sessionList.SelectedItems.Count > 0) - { - sessionMenuLogoff.Enabled = true; - } - else - { - sessionMenuLogoff.Enabled = false; - } - - if (connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP | connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.ICA) - { - sessionMenuRetrieve.Enabled = true; - } - else - { - sessionMenuRetrieve.Enabled = false; - } - - if (!_retrieved) - { - sessionMenuRetrieve.Text = Language.strMenuSessionRetrieve; - } - else - { - sessionMenuRetrieve.Text = Language.strRefresh; - } - } - - public void sessionMenuRetrieve_Click(System.Object sender, EventArgs e) - { - GetSessions(); - } - - public void sessionMenuLogoff_Click(System.Object sender, EventArgs e) - { - KillSession(); - } -#endregion - -#region Private Classes - private class BackgroundData - { - public string Hostname; - public string Username; - public string Password; - public string Domain; - public long SessionId; - } -#endregion } + + try + { + mRemoteNG.Connection.Info connectionInfo = mRemoteNG.Tree.Node.SelectedNode.Tag as mRemoteNG.Connection.Info; + if (connectionInfo == null) + { + return ; + } + + if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP | connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.ICA)) + { + return ; + } + + BackgroundData data = new BackgroundData(); + data.Hostname = connectionInfo.Hostname; + data.Username = connectionInfo.Username; + data.Password = connectionInfo.Password; + data.Domain = connectionInfo.Domain; + + if (Settings.EmptyCredentials == "custom") + { + if (string.IsNullOrEmpty(data.Username)) + { + data.Username = Settings.DefaultUsername; + } + + if (string.IsNullOrEmpty(data.Password)) + { + data.Password = Security.Crypt.Decrypt(Settings.DefaultPassword, App.Info.General.EncryptionKey); + } + + if (string.IsNullOrEmpty(data.Domain)) + { + data.Domain = Settings.DefaultDomain; + } + } + + if (_getSessionsThread != null) + { + if (_getSessionsThread.IsAlive) + { + _getSessionsThread.Abort(); + } + } + _getSessionsThread = new Thread(new System.Threading.ThreadStart(GetSessionsBackground)); + _getSessionsThread.SetApartmentState(ApartmentState.STA); + _getSessionsThread.IsBackground = true; + _getSessionsThread.Start(data); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Sessions.GetSessions() failed." + Constants.vbNewLine + ex.Message, true); + } + } + + public void KillSession() + { + if (sessionList.SelectedItems.Count == 0) + { + return ; + } + + mRemoteNG.Connection.Info connectionInfo = mRemoteNG.Tree.Node.SelectedNode.Tag as mRemoteNG.Connection.Info; + if (connectionInfo == null) + { + return ; + } + + if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP)) + { + return ; + } + + foreach (ListViewItem lvItem in sessionList.SelectedItems) + { + KillSession(connectionInfo.Hostname, connectionInfo.Username, connectionInfo.Password, connectionInfo.Domain, System.Convert.ToString(lvItem.Tag)); + } + } + + public void KillSession(string hostname, string username, string password, string domain, string sessionId) + { + try + { + BackgroundData data = new BackgroundData(); + data.Hostname = hostname; + data.Username = username; + data.Password = password; + data.Domain = domain; + data.SessionId = long.Parse(sessionId); + + Thread thread = new Thread(new System.Threading.ThreadStart(KillSessionBackground)); + thread.SetApartmentState(ApartmentState.STA); + thread.IsBackground = true; + thread.Start(data); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Sessions.KillSession() failed." + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Private Methods + #region Form Stuff + public void Sessions_Load(object sender, EventArgs e) + { + ApplyLanguage(); + } + + private void ApplyLanguage() + { + TabText = Language.strMenuSessions; + Text = Language.strMenuSessions; + sessionActivityColumn.Text = Language.strActivity; + sessionMenuLogoff.Text = Language.strLogOff; + sessionMenuRetrieve.Text = Language.strMenuSessionRetrieve; + sessionTypeColumn.Text = Language.strType; + sessionUsernameColumn.Text = Language.strColumnUsername; + } + #endregion + + private void GetSessionsBackground(object dataObject) + { + BackgroundData data = dataObject as BackgroundData; + if (data == null) + { + return ; + } + + Security.Impersonator impersonator = new Security.Impersonator(); + mRemoteNG.Connection.Protocol.RDP.TerminalSessions terminalSessions = new mRemoteNG.Connection.Protocol.RDP.TerminalSessions(); + long serverHandle = 0; + try + { + impersonator.StartImpersonation(data.Domain, data.Username, data.Password); + + serverHandle = terminalSessions.OpenConnection(data.Hostname); + if (serverHandle == 0) + { + return ; + } + + GetSessions(terminalSessions, serverHandle); + + _retrieved = true; + } + catch (ThreadAbortException) + { + + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strSessionGetFailed + Constants.vbNewLine + ex.Message, true); + } + finally + { + impersonator.StopImpersonation(); + if (!(serverHandle == 0)) + { + terminalSessions.CloseConnection(serverHandle); + } + } + } + + // Get sessions from an already impersonated and connected TerminalSessions object + private void GetSessions(mRemoteNG.Protocol.Protocol.RDP.TerminalSessions terminalSessions, long serverHandle) + { + mRemoteNG.Connection.Protocol.RDP.SessionsCollection rdpSessions = terminalSessions.GetSessions(serverHandle); + foreach (mRemoteNG.Connection.Protocol.RDP.Session session in rdpSessions) + { + ListViewItem item = new ListViewItem(); + item.Tag = session.SessionId; + item.Text = session.SessionUser; + item.SubItems.Add(session.SessionState); + item.SubItems.Add(session.SessionName.Replace(Constants.vbNewLine, "")); + AddToList(item); + } + } + + private void KillSessionBackground(object dataObject) + { + BackgroundData data = dataObject as BackgroundData; + if (data == null) + { + return ; + } + + Security.Impersonator impersonator = new Security.Impersonator(); + mRemoteNG.Connection.Protocol.RDP.TerminalSessions terminalSessions = new mRemoteNG.Connection.Protocol.RDP.TerminalSessions(); + long serverHandle = 0; + try + { + if (string.IsNullOrEmpty(data.Username) || string.IsNullOrEmpty(data.Password)) + { + return ; + } + + impersonator.StartImpersonation(data.Domain, data.Username, data.Password); + + serverHandle = terminalSessions.OpenConnection(data.Hostname); + if (!(serverHandle == 0)) + { + terminalSessions.KillSession(serverHandle, data.SessionId); + } + + ClearList(); + GetSessions(terminalSessions, serverHandle); + + _retrieved = true; + } + catch (ThreadAbortException) + { + + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, Language.strSessionKillFailed + Constants.vbNewLine + ex.Message, true); + } + finally + { + impersonator.StopImpersonation(); + if (!(serverHandle == 0)) + { + terminalSessions.CloseConnection(serverHandle); + } + } + } + + delegate void AddToListCallback(ListViewItem item); + private void AddToList(ListViewItem item) + { + if (sessionList.InvokeRequired) + { + AddToListCallback callback = new AddToListCallback(AddToList); + sessionList.Invoke(callback, new object[] {item}); + } + else + { + sessionList.Items.Add(item); + } + } + + delegate void ClearListCallback(); + private void ClearList() + { + if (sessionList.InvokeRequired) + { + ClearListCallback callback = new ClearListCallback(ClearList); + sessionList.Invoke(callback); + } + else + { + sessionList.Items.Clear(); + } + } + + private void menuSession_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + mRemoteNG.Connection.Info connectionInfo = default(mRemoteNG.Connection.Info); + if (mRemoteNG.Tree.Node.TreeView == null || mRemoteNG.Tree.Node.SelectedNode == null) + { + connectionInfo = null; + } + else + { + connectionInfo = mRemoteNG.Tree.Node.SelectedNode.Tag as mRemoteNG.Connection.Info; + } + + if (connectionInfo == null) + { + sessionMenuLogoff.Enabled = false; + sessionMenuRetrieve.Enabled = false; + sessionMenuRetrieve.Text = Language.strMenuSessionRetrieve; + return ; + } + + if (connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP & sessionList.SelectedItems.Count > 0) + { + sessionMenuLogoff.Enabled = true; + } + else + { + sessionMenuLogoff.Enabled = false; + } + + if (connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP | connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.ICA) + { + sessionMenuRetrieve.Enabled = true; + } + else + { + sessionMenuRetrieve.Enabled = false; + } + + if (!_retrieved) + { + sessionMenuRetrieve.Text = Language.strMenuSessionRetrieve; + } + else + { + sessionMenuRetrieve.Text = Language.strRefresh; + } + } + + public void sessionMenuRetrieve_Click(System.Object sender, EventArgs e) + { + GetSessions(); + } + + public void sessionMenuLogoff_Click(System.Object sender, EventArgs e) + { + KillSession(); + } + #endregion + + #region Private Classes + private class BackgroundData + { + public string Hostname; + public string Username; + public string Password; + public string Domain; + public long SessionId; + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.Tree.cs b/mRemoteV1/CS/UI/UI.Window.Tree.cs index ae75a1216..9543b8b01 100644 --- a/mRemoteV1/CS/UI/UI.Window.Tree.cs +++ b/mRemoteV1/CS/UI/UI.Window.Tree.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,1028 +8,1026 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using mRemoteNG.App; using mRemoteNG.My; using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public partial class Tree : Base + { + #region Form Stuff + public void Tree_Load(object sender, EventArgs e) + { + ApplyLanguage(); + + Themes.ThemeManager.ThemeChanged += ApplyTheme; + ApplyTheme(); + + txtSearch.Multiline = true; + txtSearch.MinimumSize = new Size(0, 14); + txtSearch.Size = new Size(txtSearch.Size.Width, 14); + txtSearch.Multiline = false; + } + + private void ApplyLanguage() + { + Text = Language.strConnections; + TabText = Language.strConnections; + + mMenAddConnection.ToolTipText = Language.strAddConnection; + mMenAddFolder.ToolTipText = Language.strAddFolder; + mMenView.ToolTipText = Language.strMenuView.Replace("&", ""); + mMenViewExpandAllFolders.Text = Language.strExpandAllFolders; + mMenViewCollapseAllFolders.Text = Language.strCollapseAllFolders; + mMenSortAscending.ToolTipText = Language.strSortAsc; + + cMenTreeConnect.Text = Language.strConnect; + cMenTreeConnectWithOptions.Text = Language.strConnectWithOptions; + cMenTreeConnectWithOptionsConnectToConsoleSession.Text = Language.strConnectToConsoleSession; + cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = Language.strDontConnectToConsoleSessionMenuItem; + cMenTreeConnectWithOptionsConnectInFullscreen.Text = Language.strConnectInFullscreen; + cMenTreeConnectWithOptionsNoCredentials.Text = Language.strConnectNoCredentials; + cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = Language.strChoosePanelBeforeConnecting; + cMenTreeDisconnect.Text = Language.strMenuDisconnect; + + cMenTreeToolsExternalApps.Text = Language.strMenuExternalTools; + cMenTreeToolsTransferFile.Text = Language.strMenuTransferFile; + + cMenTreeDuplicate.Text = Language.strDuplicate; + cMenTreeRename.Text = Language.strRename; + cMenTreeDelete.Text = Language.strMenuDelete; + + cMenTreeImport.Text = Language.strImportMenuItem; + cMenTreeImportFile.Text = Language.strImportFromFileMenuItem; + cMenTreeImportActiveDirectory.Text = Language.strImportAD; + cMenTreeImportPortScan.Text = Language.strImportPortScan; + cMenTreeExportFile.Text = Language.strExportToFileMenuItem; + + cMenTreeAddConnection.Text = Language.strAddConnection; + cMenTreeAddFolder.Text = Language.strAddFolder; + + cMenTreeToolsSort.Text = Language.strSort; + cMenTreeToolsSortAscending.Text = Language.strSortAsc; + cMenTreeToolsSortDescending.Text = Language.strSortDesc; + cMenTreeMoveUp.Text = Language.strMoveUp; + cMenTreeMoveDown.Text = Language.strMoveDown; + + txtSearch.Text = Language.strSearchPrompt; + } + + public void ApplyTheme() + { + msMain.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; + msMain.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor; + tvConnections.BackColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelBackgroundColor; + tvConnections.ForeColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTextColor; + tvConnections.LineColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTreeLineColor; + BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; + txtSearch.BackColor = Themes.ThemeManager.ActiveTheme.SearchBoxBackgroundColor; + txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; + } + #endregion + + #region Public Methods + public Tree(DockContent panel) + { + WindowType = Type.Tree; + DockPnl = panel; + InitializeComponent(); + FillImageList(); + + DescriptionTooltip = new ToolTip(); + DescriptionTooltip.InitialDelay = 300; + DescriptionTooltip.ReshowDelay = 0; + } + + public void InitialRefresh() + { + tvConnections_AfterSelect(tvConnections, new TreeViewEventArgs(tvConnections.SelectedNode, TreeViewAction.ByMouse)); + } + #endregion + + #region Public Properties + public ToolTip DescriptionTooltip {get; set;} + #endregion + + #region Private Methods + private void FillImageList() + { + try { -#region Form Stuff - public void Tree_Load(object sender, EventArgs e) - { - ApplyLanguage(); - - Themes.ThemeManager.ThemeChanged += ApplyTheme; - ApplyTheme(); - - txtSearch.Multiline = true; - txtSearch.MinimumSize = new Size(0, 14); - txtSearch.Size = new Size(txtSearch.Size.Width, 14); - txtSearch.Multiline = false; - } + imgListTree.Images.Add(Resources.Root); + imgListTree.Images.Add(Resources.Folder); + imgListTree.Images.Add(Resources.Play); + imgListTree.Images.Add(Resources.Pause); + imgListTree.Images.Add(Resources.PuttySessions); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "FillImageList (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } - private void ApplyLanguage() - { - Text = Language.strConnections; - TabText = Language.strConnections; - - mMenAddConnection.ToolTipText = Language.strAddConnection; - mMenAddFolder.ToolTipText = Language.strAddFolder; - mMenView.ToolTipText = Language.strMenuView.Replace("&", ""); - mMenViewExpandAllFolders.Text = Language.strExpandAllFolders; - mMenViewCollapseAllFolders.Text = Language.strCollapseAllFolders; - mMenSortAscending.ToolTipText = Language.strSortAsc; - - cMenTreeConnect.Text = Language.strConnect; - cMenTreeConnectWithOptions.Text = Language.strConnectWithOptions; - cMenTreeConnectWithOptionsConnectToConsoleSession.Text = Language.strConnectToConsoleSession; - cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = Language.strDontConnectToConsoleSessionMenuItem; - cMenTreeConnectWithOptionsConnectInFullscreen.Text = Language.strConnectInFullscreen; - cMenTreeConnectWithOptionsNoCredentials.Text = Language.strConnectNoCredentials; - cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = Language.strChoosePanelBeforeConnecting; - cMenTreeDisconnect.Text = Language.strMenuDisconnect; - - cMenTreeToolsExternalApps.Text = Language.strMenuExternalTools; - cMenTreeToolsTransferFile.Text = Language.strMenuTransferFile; - - cMenTreeDuplicate.Text = Language.strDuplicate; - cMenTreeRename.Text = Language.strRename; - cMenTreeDelete.Text = Language.strMenuDelete; - - cMenTreeImport.Text = Language.strImportMenuItem; - cMenTreeImportFile.Text = Language.strImportFromFileMenuItem; - cMenTreeImportActiveDirectory.Text = Language.strImportAD; - cMenTreeImportPortScan.Text = Language.strImportPortScan; - cMenTreeExportFile.Text = Language.strExportToFileMenuItem; - - cMenTreeAddConnection.Text = Language.strAddConnection; - cMenTreeAddFolder.Text = Language.strAddFolder; - - cMenTreeToolsSort.Text = Language.strSort; - cMenTreeToolsSortAscending.Text = Language.strSortAsc; - cMenTreeToolsSortDescending.Text = Language.strSortDesc; - cMenTreeMoveUp.Text = Language.strMoveUp; - cMenTreeMoveDown.Text = Language.strMoveDown; - - txtSearch.Text = Language.strSearchPrompt; - } + public void tvConnections_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + { + cMenTreeDelete.ShortcutKeys = Keys.None; + } - public void ApplyTheme() - { - msMain.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; - msMain.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor; - tvConnections.BackColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelBackgroundColor; - tvConnections.ForeColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTextColor; - tvConnections.LineColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTreeLineColor; - BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; - txtSearch.BackColor = Themes.ThemeManager.ActiveTheme.SearchBoxBackgroundColor; - txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; - } -#endregion - -#region Public Methods - public Tree(DockContent panel) - { - WindowType = Type.Tree; - DockPnl = panel; - InitializeComponent(); - FillImageList(); - - DescriptionTooltip = new ToolTip(); - DescriptionTooltip.InitialDelay = 300; - DescriptionTooltip.ReshowDelay = 0; - } - - public void InitialRefresh() - { - tvConnections_AfterSelect(tvConnections, new TreeViewEventArgs(tvConnections.SelectedNode, TreeViewAction.ByMouse)); - } -#endregion - -#region Public Properties - public ToolTip DescriptionTooltip {get; set;} -#endregion - -#region Private Methods - private void FillImageList() - { - try - { - imgListTree.Images.Add(Resources.Root); - imgListTree.Images.Add(Resources.Folder); - imgListTree.Images.Add(Resources.Play); - imgListTree.Images.Add(Resources.Pause); - imgListTree.Images.Add(Resources.PuttySessions); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "FillImageList (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - public void tvConnections_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) - { - cMenTreeDelete.ShortcutKeys = Keys.None; - } - - public void tvConnections_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) - { - try - { - cMenTreeDelete.ShortcutKeys = Keys.Delete; + public void tvConnections_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + try + { + cMenTreeDelete.ShortcutKeys = Keys.Delete; - mRemoteNG.Tree.Node.FinishRenameSelectedNode(e.Label); - Windows.configForm.pGrid_SelectedObjectChanged(); - ShowHideTreeContextMenuItems(e.Node); - SaveConnectionsBG(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_AfterLabelEdit (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } + mRemoteNG.Tree.Node.FinishRenameSelectedNode(e.Label); + Windows.configForm.pGrid_SelectedObjectChanged(); + ShowHideTreeContextMenuItems(e.Node); + SaveConnectionsBG(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_AfterLabelEdit (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } - public void tvConnections_AfterSelect(object sender, TreeViewEventArgs e) + public void tvConnections_AfterSelect(object sender, TreeViewEventArgs e) + { + try + { + if ((mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Connection) || (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.PuttySession)) { - try - { - if ((mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Connection) || (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.PuttySession)) - { - Windows.configForm.SetPropertyGridObject(e.Node.Tag); - } - else if (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Container) - { - Windows.configForm.SetPropertyGridObject((e.Node.Tag as Container.Info).ConnectionInfo); - } - else if ((mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Root) || (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.PuttyRoot)) - { - Windows.configForm.SetPropertyGridObject(e.Node.Tag); - } - else - { - return; - } - - Windows.configForm.pGrid_SelectedObjectChanged(); - ShowHideTreeContextMenuItems(e.Node); - Windows.sessionsForm.GetSessions(true); - - LastSelected = mRemoteNG.Tree.Node.GetConstantID(e.Node); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_AfterSelect (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } + Windows.configForm.SetPropertyGridObject(e.Node.Tag); } - - public void tvConnections_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + else if (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Container) { - try - { - ShowHideTreeContextMenuItems(tvConnections.SelectedNode); - tvConnections.SelectedNode = e.Node; - - if (e.Button == MouseButtons.Left) - { - if (Settings.SingleClickOnConnectionOpensIt && - (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Connection | - mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.PuttySession)) - { - OpenConnection(); - } - - if (Settings.SingleClickSwitchesToOpenConnection && mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Connection) - { - SwitchToOpenConnection(e.Node.Tag); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_NodeMouseClick (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } + Windows.configForm.SetPropertyGridObject((e.Node.Tag as Container.Info).ConnectionInfo); } - - static public void tvConnections_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) + else if ((mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Root) || (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.PuttyRoot)) { - if (mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.Connection | - mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.PuttySession) + Windows.configForm.SetPropertyGridObject(e.Node.Tag); + } + else + { + return; + } + + Windows.configForm.pGrid_SelectedObjectChanged(); + ShowHideTreeContextMenuItems(e.Node); + Windows.sessionsForm.GetSessions(true); + + LastSelected = mRemoteNG.Tree.Node.GetConstantID(e.Node); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_AfterSelect (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public void tvConnections_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + try + { + ShowHideTreeContextMenuItems(tvConnections.SelectedNode); + tvConnections.SelectedNode = e.Node; + + if (e.Button == MouseButtons.Left) + { + if (Settings.SingleClickOnConnectionOpensIt && + (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Connection | + mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.PuttySession)) { OpenConnection(); } - } - - public void tvConnections_MouseMove(object sender, MouseEventArgs e) - { - try + + if (Settings.SingleClickSwitchesToOpenConnection && mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.Node.Type.Connection) { - mRemoteNG.Tree.Node.SetNodeToolTip(e, DescriptionTooltip); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_MouseMove (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + SwitchToOpenConnection(e.Node.Tag); } } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_NodeMouseClick (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } - private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) + static public void tvConnections_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) + { + if (mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.Connection | + mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.PuttySession) + { + OpenConnection(); + } + } + + public void tvConnections_MouseMove(object sender, MouseEventArgs e) + { + try + { + mRemoteNG.Tree.Node.SetNodeToolTip(e, DescriptionTooltip); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_MouseMove (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) + { + ToolStripMenuItem menuItem = default(ToolStripMenuItem); + foreach (ToolStripItem item in items) + { + menuItem = item as ToolStripMenuItem; + if (menuItem == null) { - ToolStripMenuItem menuItem = default(ToolStripMenuItem); - foreach (ToolStripItem item in items) + continue; + } + menuItem.Enabled = enable; + if (menuItem.HasDropDownItems) + { + EnableMenuItemsRecursive(menuItem.DropDownItems, enable); + } + } + } + + private void ShowHideTreeContextMenuItems(TreeNode selectedNode) + { + if (selectedNode == null) + { + return ; + } + + try + { + cMenTree.Enabled = true; + EnableMenuItemsRecursive(cMenTree.Items); + + if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Connection) + { + mRemoteNG.Connection.Info connectionInfo = selectedNode.Tag; + + if (connectionInfo.OpenConnections.Count == 0) { - menuItem = item as ToolStripMenuItem; - if (menuItem == null) + cMenTreeDisconnect.Enabled = false; + } + + if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH1 | + connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH2)) + { + cMenTreeToolsTransferFile.Enabled = false; + } + + if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP | connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.ICA)) + { + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + } + + if (connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.IntApp) + { + cMenTreeConnectWithOptionsNoCredentials.Enabled = false; + } + } + else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.PuttySession) + { + mRemoteNG.Connection.PuttySession.Info puttySessionInfo = selectedNode.Tag; + + cMenTreeAddConnection.Enabled = false; + cMenTreeAddFolder.Enabled = false; + + if (puttySessionInfo.OpenConnections.Count == 0) + { + cMenTreeDisconnect.Enabled = false; + } + + if (!(puttySessionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH1 | puttySessionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH2)) + { + cMenTreeToolsTransferFile.Enabled = false; + } + + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + cMenTreeToolsSort.Enabled = false; + cMenTreeDuplicate.Enabled = false; + cMenTreeRename.Enabled = false; + cMenTreeDelete.Enabled = false; + cMenTreeMoveUp.Enabled = false; + cMenTreeMoveDown.Enabled = false; + } + else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Container) + { + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + cMenTreeDisconnect.Enabled = false; + + int openConnections = 0; + mRemoteNG.Connection.Info connectionInfo = default(mRemoteNG.Connection.Info); + foreach (TreeNode node in selectedNode.Nodes) + { + if (node.Tag is mRemoteNG.Connection.Info) { - continue; + connectionInfo = node.Tag; + openConnections = openConnections + connectionInfo.OpenConnections.Count; } - menuItem.Enabled = enable; - if (menuItem.HasDropDownItems) + } + if (openConnections == 0) + { + cMenTreeDisconnect.Enabled = false; + } + + cMenTreeToolsTransferFile.Enabled = false; + cMenTreeToolsExternalApps.Enabled = false; + } + else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Root) + { + cMenTreeConnect.Enabled = false; + cMenTreeConnectWithOptions.Enabled = false; + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = false; + cMenTreeDisconnect.Enabled = false; + cMenTreeToolsTransferFile.Enabled = false; + cMenTreeToolsExternalApps.Enabled = false; + cMenTreeDuplicate.Enabled = false; + cMenTreeDelete.Enabled = false; + cMenTreeMoveUp.Enabled = false; + cMenTreeMoveDown.Enabled = false; + } + else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.PuttyRoot) + { + cMenTreeAddConnection.Enabled = false; + cMenTreeAddFolder.Enabled = false; + cMenTreeConnect.Enabled = false; + cMenTreeConnectWithOptions.Enabled = false; + cMenTreeDisconnect.Enabled = false; + cMenTreeToolsTransferFile.Enabled = false; + cMenTreeConnectWithOptions.Enabled = false; + cMenTreeToolsSort.Enabled = false; + cMenTreeToolsExternalApps.Enabled = false; + cMenTreeDuplicate.Enabled = false; + cMenTreeRename.Enabled = true; + cMenTreeDelete.Enabled = false; + cMenTreeMoveUp.Enabled = false; + cMenTreeMoveDown.Enabled = false; + } + else + { + cMenTree.Enabled = false; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowHideTreeContextMenuItems (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Drag and Drop + static public void tvConnections_DragDrop(object sender, DragEventArgs e) + { + try + { + //Check that there is a TreeNode being dragged + if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false) + { + return; + } + + //Get the TreeView raising the event (in case multiple on form) + TreeView selectedTreeview = (TreeView) sender; + + //Get the TreeNode being dragged + System.Windows.Forms.TreeNode dropNode = (System.Windows.Forms.TreeNode) (e.Data.GetData("System.Windows.Forms.TreeNode")); + + //The target node should be selected from the DragOver event + TreeNode targetNode = selectedTreeview.SelectedNode; + + if (dropNode == targetNode) + { + return; + } + + if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Root) + { + return; + } + + if (dropNode == targetNode.Parent) + { + return; + } + + //Remove the drop node from its current location + dropNode.Remove(); + + //If there is no targetNode add dropNode to the bottom of + //the TreeView root nodes, otherwise add it to the end of + //the dropNode child nodes + + if (mRemoteNG.Tree.Node.GetNodeType(targetNode) == mRemoteNG.Tree.Node.Type.Root | mRemoteNG.Tree.Node.GetNodeType(targetNode) == mRemoteNG.Tree.Node.Type.Container) + { + targetNode.Nodes.Insert(0, dropNode); + } + else + { + targetNode.Parent.Nodes.Insert(targetNode.Index + 1, dropNode); + } + + if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Connection | mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Container) + { + if (mRemoteNG.Tree.Node.GetNodeType(dropNode.Parent) == mRemoteNG.Tree.Node.Type.Container) + { + dropNode.Tag.Parent = dropNode.Parent.Tag; + } + else if (mRemoteNG.Tree.Node.GetNodeType(dropNode.Parent) == mRemoteNG.Tree.Node.Type.Root) + { + dropNode.Tag.Parent = null; + if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Connection) { - EnableMenuItemsRecursive(menuItem.DropDownItems, enable); + dropNode.Tag.Inherit.TurnOffInheritanceCompletely(); + } + else if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Container) + { + dropNode.Tag.ConnectionInfo.Inherit.TurnOffInheritanceCompletely(); } } } + + //Ensure the newly created node is visible to + //the user and select it + dropNode.EnsureVisible(); + selectedTreeview.SelectedNode = dropNode; + + SaveConnectionsBG(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragDrop (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } - private void ShowHideTreeContextMenuItems(TreeNode selectedNode) + static public void tvConnections_DragEnter(object sender, DragEventArgs e) + { + try + { + //See if there is a TreeNode being dragged + if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) { - if (selectedNode == null) + //TreeNode found allow move effect + e.Effect = DragDropEffects.Move; + } + else + { + //No TreeNode found, prevent move + e.Effect = DragDropEffects.None; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragEnter (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + static public void tvConnections_DragOver(object sender, DragEventArgs e) + { + try + { + //Check that there is a TreeNode being dragged + if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false) + { + return; + } + + //Get the TreeView raising the event (in case multiple on form) + TreeView selectedTreeview = (TreeView) sender; + + //As the mouse moves over nodes, provide feedback to + //the user by highlighting the node that is the + //current drop target + Point pt = ((TreeView) sender).PointToClient(new Point(e.X, e.Y)); + TreeNode targetNode = selectedTreeview.GetNodeAt(pt); + + //Select the node currently under the cursor + selectedTreeview.SelectedNode = targetNode; + + //Check that the selected node is not the dropNode and + //also that it is not a child of the dropNode and + //therefore an invalid target + TreeNode dropNode = (TreeNode) (e.Data.GetData("System.Windows.Forms.TreeNode")); + + Root.PuttySessions.Info puttyRootInfo = default(Root.PuttySessions.Info); + while (!(targetNode == null)) + { + puttyRootInfo = targetNode.Tag as Root.PuttySessions.Info; + if (puttyRootInfo != null || targetNode == dropNode) { + e.Effect = DragDropEffects.None; return ; } - - try - { - cMenTree.Enabled = true; - EnableMenuItemsRecursive(cMenTree.Items); + targetNode = targetNode.Parent; + } - if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Connection) + //Currently selected node is a suitable target + e.Effect = DragDropEffects.Move; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragOver (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public void tvConnections_ItemDrag(object sender, ItemDragEventArgs e) + { + try + { + TreeNode dragTreeNode = e.Item as TreeNode; + if (dragTreeNode == null) + { + return ; + } + + if (dragTreeNode.Tag == null) + { + return ; + } + if (dragTreeNode.Tag is mRemoteNG.Connection.PuttySession.Info|| !(dragTreeNode.Tag is mRemoteNG.Connection.Info|| dragTreeNode.Tag is Container.Info)) + { + tvConnections.SelectedNode = dragTreeNode; + return ; + } + + //Set the drag node and initiate the DragDrop + DoDragDrop(e.Item, DragDropEffects.Move); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_ItemDrag (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Tree Context Menu + public void cMenTreeAddConnection_Click(System.Object sender, EventArgs e) + { + AddConnection(); + SaveConnectionsBG(); + } + + public void cMenTreeAddFolder_Click(System.Object sender, EventArgs e) + { + AddFolder(); + SaveConnectionsBG(); + } + + static public void cMenTreeConnect_Click(System.Object sender, EventArgs e) + { + OpenConnection(mRemoteNG.Connection.Info.Force.DoNotJump); + } + + static public void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(System.Object sender, EventArgs e) + { + OpenConnection(mRemoteNG.Connection.Info.Force.UseConsoleSession | mRemoteNG.Connection.Info.Force.DoNotJump); + } + + static public void cMenTreeConnectWithOptionsNoCredentials_Click(System.Object sender, EventArgs e) + { + OpenConnection(mRemoteNG.Connection.Info.Force.NoCredentials); + } + + static public void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(System.Object sender, EventArgs e) + { + OpenConnection(mRemoteNG.Connection.Info.Force.DontUseConsoleSession | mRemoteNG.Connection.Info.Force.DoNotJump); + } + + static public void cMenTreeConnectWithOptionsConnectInFullscreen_Click(System.Object sender, EventArgs e) + { + OpenConnection(mRemoteNG.Connection.Info.Force.Fullscreen | mRemoteNG.Connection.Info.Force.DoNotJump); + } + + static public void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(System.Object sender, EventArgs e) + { + OpenConnection(mRemoteNG.Connection.Info.Force.OverridePanel | mRemoteNG.Connection.Info.Force.DoNotJump); + } + + public void cMenTreeDisconnect_Click(System.Object sender, EventArgs e) + { + DisconnectConnection(); + } + + static public void cMenTreeToolsTransferFile_Click(System.Object sender, EventArgs e) + { + SshTransferFile(); + } + + public void mMenSortAscending_Click(System.Object sender, EventArgs e) + { + tvConnections.BeginUpdate(); + mRemoteNG.Tree.Node.Sort(tvConnections.Nodes[0], SortOrder.Ascending); + tvConnections.EndUpdate(); + SaveConnectionsBG(); + } + + public void cMenTreeToolsSortAscending_Click(System.Object sender, EventArgs e) + { + tvConnections.BeginUpdate(); + mRemoteNG.Tree.Node.Sort(tvConnections.SelectedNode, SortOrder.Ascending); + tvConnections.EndUpdate(); + SaveConnectionsBG(); + } + + public void cMenTreeToolsSortDescending_Click(System.Object sender, EventArgs e) + { + tvConnections.BeginUpdate(); + mRemoteNG.Tree.Node.Sort(tvConnections.SelectedNode, SortOrder.Descending); + tvConnections.EndUpdate(); + SaveConnectionsBG(); + } + + public void cMenTree_DropDownOpening(object sender, EventArgs e) + { + AddExternalApps(); + } + + private static void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) + { + StartExternalApp(sender.Tag); + } + + public void cMenTreeDuplicate_Click(System.Object sender, EventArgs e) + { + mRemoteNG.Tree.Node.CloneNode(tvConnections.SelectedNode); + SaveConnectionsBG(); + } + + static public void cMenTreeRename_Click(System.Object sender, EventArgs e) + { + mRemoteNG.Tree.Node.StartRenameSelectedNode(); + SaveConnectionsBG(); + } + + static public void cMenTreeDelete_Click(System.Object sender, EventArgs e) + { + mRemoteNG.Tree.Node.DeleteSelectedNode(); + SaveConnectionsBG(); + } + + static public void cMenTreeImportFile_Click(System.Object sender, EventArgs e) + { + Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); + } + + static public void cMenTreeImportActiveDirectory_Click(System.Object sender, EventArgs e) + { + Windows.Show(Type.ActiveDirectoryImport); + } + + static public void cMenTreeImportPortScan_Click(System.Object sender, EventArgs e) + { + Windows.Show(UI.Window.Type.PortScan, true); + } + + static public void cMenTreeExportFile_Click(System.Object sender, EventArgs e) + { + Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode); + } + static public void cMenTreeMoveUp_Click(System.Object sender, EventArgs e) + { + mRemoteNG.Tree.Node.MoveNodeUp(); + SaveConnectionsBG(); + } + + static public void cMenTreeMoveDown_Click(System.Object sender, EventArgs e) + { + mRemoteNG.Tree.Node.MoveNodeDown(); + SaveConnectionsBG(); + } + #endregion + + #region Context Menu Actions + public void AddConnection() + { + try + { + if (tvConnections.SelectedNode == null) + { + tvConnections.SelectedNode = tvConnections.Nodes[0]; + } + + TreeNode newTreeNode = mRemoteNG.Tree.Node.AddNode(mRemoteNG.Tree.Node.Type.Connection); + if (newTreeNode == null) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Tree.AddConnection() failed." + Constants.vbNewLine + "mRemoteNG.Tree.Node.AddNode() returned Nothing.", true); + return ; + } + + TreeNode containerNode = tvConnections.SelectedNode; + if (mRemoteNG.Tree.Node.GetNodeType(containerNode) == mRemoteNG.Tree.Node.Type.Connection) + { + containerNode = containerNode.Parent; + } + + mRemoteNG.Connection.Info newConnectionInfo = new mRemoteNG.Connection.Info(); + if (mRemoteNG.Tree.Node.GetNodeType(containerNode) == mRemoteNG.Tree.Node.Type.Root) + { + newConnectionInfo.Inherit.TurnOffInheritanceCompletely(); + } + else + { + newConnectionInfo.Parent = containerNode.Tag; + } + + newConnectionInfo.TreeNode = newTreeNode; + newTreeNode.Tag = newConnectionInfo; + ConnectionList.Add(newConnectionInfo); + + containerNode.Nodes.Add(newTreeNode); + + tvConnections.SelectedNode = newTreeNode; + tvConnections.SelectedNode.BeginEdit(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Tree.AddConnection() failed." + Constants.vbNewLine + ex.Message, true); + } + } + + public void AddFolder() + { + try + { + TreeNode newNode = mRemoteNG.Tree.Node.AddNode(mRemoteNG.Tree.Node.Type.Container); + Container.Info newContainerInfo = new Container.Info(); + newNode.Tag = newContainerInfo; + newContainerInfo.TreeNode = newNode; + + TreeNode selectedNode = mRemoteNG.Tree.Node.SelectedNode; + TreeNode parentNode = default(TreeNode); + if (selectedNode == null) + { + parentNode = tvConnections.Nodes[0]; + } + else + { + if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Connection) + { + parentNode = selectedNode.Parent; + } + else + { + parentNode = selectedNode; + } + } + + newContainerInfo.ConnectionInfo = new mRemoteNG.Connection.Info(newContainerInfo); + newContainerInfo.ConnectionInfo.Name = newNode.Text; + + // We can only inherit from a container node, not the root node or connection nodes + if (mRemoteNG.Tree.Node.GetNodeType(parentNode) == mRemoteNG.Tree.Node.Type.Container) + { + newContainerInfo.Parent = parentNode.Tag; + } + else + { + newContainerInfo.ConnectionInfo.Inherit.TurnOffInheritanceCompletely(); + } + + ContainerList.Add(newContainerInfo); + parentNode.Nodes.Add(newNode); + + tvConnections.SelectedNode = newNode; + tvConnections.SelectedNode.BeginEdit(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(Language.strErrorAddFolderFailed, ex.Message), true); + } + } + + private void DisconnectConnection() + { + try + { + if (tvConnections.SelectedNode != null) + { + if (tvConnections.SelectedNode.Tag is mRemoteNG.Connection.Info) + { + mRemoteNG.Connection.Info conI = tvConnections.SelectedNode.Tag; + for (int i = 0; i <= conI.OpenConnections.Count - 1; i++) { - mRemoteNG.Connection.Info connectionInfo = selectedNode.Tag; + conI.OpenConnections[i].Disconnect(); + } + } - if (connectionInfo.OpenConnections.Count == 0) - { - cMenTreeDisconnect.Enabled = false; - } - - if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH1 | - connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH2)) - { - cMenTreeToolsTransferFile.Enabled = false; - } - - if (!(connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.RDP | connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.ICA)) - { - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - } - - if (connectionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.IntApp) - { - cMenTreeConnectWithOptionsNoCredentials.Enabled = false; - } - } - else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.PuttySession) - { - mRemoteNG.Connection.PuttySession.Info puttySessionInfo = selectedNode.Tag; - - cMenTreeAddConnection.Enabled = false; - cMenTreeAddFolder.Enabled = false; - - if (puttySessionInfo.OpenConnections.Count == 0) - { - cMenTreeDisconnect.Enabled = false; - } - - if (!(puttySessionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH1 | puttySessionInfo.Protocol == mRemoteNG.Connection.Protocol.Protocols.SSH2)) - { - cMenTreeToolsTransferFile.Enabled = false; - } - - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeToolsSort.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeRename.Enabled = false; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Container) - { - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeDisconnect.Enabled = false; - - int openConnections = 0; - mRemoteNG.Connection.Info connectionInfo = default(mRemoteNG.Connection.Info); - foreach (TreeNode node in selectedNode.Nodes) - { - if (node.Tag is mRemoteNG.Connection.Info) - { - connectionInfo = node.Tag; - openConnections = openConnections + connectionInfo.OpenConnections.Count; - } - } - if (openConnections == 0) - { - cMenTreeDisconnect.Enabled = false; - } - - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - } - else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Root) - { - cMenTreeConnect.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = false; - cMenTreeDisconnect.Enabled = false; - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.PuttyRoot) - { - cMenTreeAddConnection.Enabled = false; - cMenTreeAddFolder.Enabled = false; - cMenTreeConnect.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeDisconnect.Enabled = false; - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeToolsSort.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeRename.Enabled = true; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else - { - cMenTree.Enabled = false; - } - } - catch (Exception ex) + if (tvConnections.SelectedNode.Tag is Container.Info) { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowHideTreeContextMenuItems (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region Drag and Drop - static public void tvConnections_DragDrop(object sender, DragEventArgs e) - { - try - { - //Check that there is a TreeNode being dragged - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false) + foreach (TreeNode n in tvConnections.SelectedNode.Nodes) { - return; - } - - //Get the TreeView raising the event (in case multiple on form) - TreeView selectedTreeview = (TreeView) sender; - - //Get the TreeNode being dragged - System.Windows.Forms.TreeNode dropNode = (System.Windows.Forms.TreeNode) (e.Data.GetData("System.Windows.Forms.TreeNode")); - - //The target node should be selected from the DragOver event - TreeNode targetNode = selectedTreeview.SelectedNode; - - if (dropNode == targetNode) - { - return; - } - - if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Root) - { - return; - } - - if (dropNode == targetNode.Parent) - { - return; - } - - //Remove the drop node from its current location - dropNode.Remove(); - - //If there is no targetNode add dropNode to the bottom of - //the TreeView root nodes, otherwise add it to the end of - //the dropNode child nodes - - if (mRemoteNG.Tree.Node.GetNodeType(targetNode) == mRemoteNG.Tree.Node.Type.Root | mRemoteNG.Tree.Node.GetNodeType(targetNode) == mRemoteNG.Tree.Node.Type.Container) - { - targetNode.Nodes.Insert(0, dropNode); - } - else - { - targetNode.Parent.Nodes.Insert(targetNode.Index + 1, dropNode); - } - - if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Connection | mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Container) - { - if (mRemoteNG.Tree.Node.GetNodeType(dropNode.Parent) == mRemoteNG.Tree.Node.Type.Container) + if (n.Tag is mRemoteNG.Connection.Info) { - dropNode.Tag.Parent = dropNode.Parent.Tag; - } - else if (mRemoteNG.Tree.Node.GetNodeType(dropNode.Parent) == mRemoteNG.Tree.Node.Type.Root) - { - dropNode.Tag.Parent = null; - if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Connection) - { - dropNode.Tag.Inherit.TurnOffInheritanceCompletely(); - } - else if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.Node.Type.Container) - { - dropNode.Tag.ConnectionInfo.Inherit.TurnOffInheritanceCompletely(); - } - } - } - - //Ensure the newly created node is visible to - //the user and select it - dropNode.EnsureVisible(); - selectedTreeview.SelectedNode = dropNode; - - SaveConnectionsBG(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragDrop (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - static public void tvConnections_DragEnter(object sender, DragEventArgs e) - { - try - { - //See if there is a TreeNode being dragged - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) - { - //TreeNode found allow move effect - e.Effect = DragDropEffects.Move; - } - else - { - //No TreeNode found, prevent move - e.Effect = DragDropEffects.None; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragEnter (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - static public void tvConnections_DragOver(object sender, DragEventArgs e) - { - try - { - //Check that there is a TreeNode being dragged - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false) - { - return; - } - - //Get the TreeView raising the event (in case multiple on form) - TreeView selectedTreeview = (TreeView) sender; - - //As the mouse moves over nodes, provide feedback to - //the user by highlighting the node that is the - //current drop target - Point pt = ((TreeView) sender).PointToClient(new Point(e.X, e.Y)); - TreeNode targetNode = selectedTreeview.GetNodeAt(pt); - - //Select the node currently under the cursor - selectedTreeview.SelectedNode = targetNode; - - //Check that the selected node is not the dropNode and - //also that it is not a child of the dropNode and - //therefore an invalid target - TreeNode dropNode = (TreeNode) (e.Data.GetData("System.Windows.Forms.TreeNode")); - - Root.PuttySessions.Info puttyRootInfo = default(Root.PuttySessions.Info); - while (!(targetNode == null)) - { - puttyRootInfo = targetNode.Tag as Root.PuttySessions.Info; - if (puttyRootInfo != null || targetNode == dropNode) - { - e.Effect = DragDropEffects.None; - return ; - } - targetNode = targetNode.Parent; - } - - //Currently selected node is a suitable target - e.Effect = DragDropEffects.Move; - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragOver (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - public void tvConnections_ItemDrag(object sender, ItemDragEventArgs e) - { - try - { - TreeNode dragTreeNode = e.Item as TreeNode; - if (dragTreeNode == null) - { - return ; - } - - if (dragTreeNode.Tag == null) - { - return ; - } - if (dragTreeNode.Tag is mRemoteNG.Connection.PuttySession.Info|| !(dragTreeNode.Tag is mRemoteNG.Connection.Info|| dragTreeNode.Tag is Container.Info)) - { - tvConnections.SelectedNode = dragTreeNode; - return ; - } - - //Set the drag node and initiate the DragDrop - DoDragDrop(e.Item, DragDropEffects.Move); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_ItemDrag (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region Tree Context Menu - public void cMenTreeAddConnection_Click(System.Object sender, EventArgs e) - { - AddConnection(); - SaveConnectionsBG(); - } - - public void cMenTreeAddFolder_Click(System.Object sender, EventArgs e) - { - AddFolder(); - SaveConnectionsBG(); - } - - static public void cMenTreeConnect_Click(System.Object sender, EventArgs e) - { - OpenConnection(mRemoteNG.Connection.Info.Force.DoNotJump); - } - - static public void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(System.Object sender, EventArgs e) - { - OpenConnection(mRemoteNG.Connection.Info.Force.UseConsoleSession | mRemoteNG.Connection.Info.Force.DoNotJump); - } - - static public void cMenTreeConnectWithOptionsNoCredentials_Click(System.Object sender, EventArgs e) - { - OpenConnection(mRemoteNG.Connection.Info.Force.NoCredentials); - } - - static public void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(System.Object sender, EventArgs e) - { - OpenConnection(mRemoteNG.Connection.Info.Force.DontUseConsoleSession | mRemoteNG.Connection.Info.Force.DoNotJump); - } - - static public void cMenTreeConnectWithOptionsConnectInFullscreen_Click(System.Object sender, EventArgs e) - { - OpenConnection(mRemoteNG.Connection.Info.Force.Fullscreen | mRemoteNG.Connection.Info.Force.DoNotJump); - } - - static public void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(System.Object sender, EventArgs e) - { - OpenConnection(mRemoteNG.Connection.Info.Force.OverridePanel | mRemoteNG.Connection.Info.Force.DoNotJump); - } - - public void cMenTreeDisconnect_Click(System.Object sender, EventArgs e) - { - DisconnectConnection(); - } - - static public void cMenTreeToolsTransferFile_Click(System.Object sender, EventArgs e) - { - SshTransferFile(); - } - - public void mMenSortAscending_Click(System.Object sender, EventArgs e) - { - tvConnections.BeginUpdate(); - mRemoteNG.Tree.Node.Sort(tvConnections.Nodes[0], SortOrder.Ascending); - tvConnections.EndUpdate(); - SaveConnectionsBG(); - } - - public void cMenTreeToolsSortAscending_Click(System.Object sender, EventArgs e) - { - tvConnections.BeginUpdate(); - mRemoteNG.Tree.Node.Sort(tvConnections.SelectedNode, SortOrder.Ascending); - tvConnections.EndUpdate(); - SaveConnectionsBG(); - } - - public void cMenTreeToolsSortDescending_Click(System.Object sender, EventArgs e) - { - tvConnections.BeginUpdate(); - mRemoteNG.Tree.Node.Sort(tvConnections.SelectedNode, SortOrder.Descending); - tvConnections.EndUpdate(); - SaveConnectionsBG(); - } - - public void cMenTree_DropDownOpening(object sender, EventArgs e) - { - AddExternalApps(); - } - - private static void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) - { - StartExternalApp(sender.Tag); - } - - public void cMenTreeDuplicate_Click(System.Object sender, EventArgs e) - { - mRemoteNG.Tree.Node.CloneNode(tvConnections.SelectedNode); - SaveConnectionsBG(); - } - - static public void cMenTreeRename_Click(System.Object sender, EventArgs e) - { - mRemoteNG.Tree.Node.StartRenameSelectedNode(); - SaveConnectionsBG(); - } - - static public void cMenTreeDelete_Click(System.Object sender, EventArgs e) - { - mRemoteNG.Tree.Node.DeleteSelectedNode(); - SaveConnectionsBG(); - } - - static public void cMenTreeImportFile_Click(System.Object sender, EventArgs e) - { - Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); - } - - static public void cMenTreeImportActiveDirectory_Click(System.Object sender, EventArgs e) - { - Windows.Show(Type.ActiveDirectoryImport); - } - - static public void cMenTreeImportPortScan_Click(System.Object sender, EventArgs e) - { - Windows.Show(UI.Window.Type.PortScan, true); - } - - static public void cMenTreeExportFile_Click(System.Object sender, EventArgs e) - { - Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode); - } - static public void cMenTreeMoveUp_Click(System.Object sender, EventArgs e) - { - mRemoteNG.Tree.Node.MoveNodeUp(); - SaveConnectionsBG(); - } - - static public void cMenTreeMoveDown_Click(System.Object sender, EventArgs e) - { - mRemoteNG.Tree.Node.MoveNodeDown(); - SaveConnectionsBG(); - } -#endregion - -#region Context Menu Actions - public void AddConnection() - { - try - { - if (tvConnections.SelectedNode == null) - { - tvConnections.SelectedNode = tvConnections.Nodes[0]; - } - - TreeNode newTreeNode = mRemoteNG.Tree.Node.AddNode(mRemoteNG.Tree.Node.Type.Connection); - if (newTreeNode == null) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Tree.AddConnection() failed." + Constants.vbNewLine + "mRemoteNG.Tree.Node.AddNode() returned Nothing.", true); - return ; - } - - TreeNode containerNode = tvConnections.SelectedNode; - if (mRemoteNG.Tree.Node.GetNodeType(containerNode) == mRemoteNG.Tree.Node.Type.Connection) - { - containerNode = containerNode.Parent; - } - - mRemoteNG.Connection.Info newConnectionInfo = new mRemoteNG.Connection.Info(); - if (mRemoteNG.Tree.Node.GetNodeType(containerNode) == mRemoteNG.Tree.Node.Type.Root) - { - newConnectionInfo.Inherit.TurnOffInheritanceCompletely(); - } - else - { - newConnectionInfo.Parent = containerNode.Tag; - } - - newConnectionInfo.TreeNode = newTreeNode; - newTreeNode.Tag = newConnectionInfo; - ConnectionList.Add(newConnectionInfo); - - containerNode.Nodes.Add(newTreeNode); - - tvConnections.SelectedNode = newTreeNode; - tvConnections.SelectedNode.BeginEdit(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Tree.AddConnection() failed." + Constants.vbNewLine + ex.Message, true); - } - } - - public void AddFolder() - { - try - { - TreeNode newNode = mRemoteNG.Tree.Node.AddNode(mRemoteNG.Tree.Node.Type.Container); - Container.Info newContainerInfo = new Container.Info(); - newNode.Tag = newContainerInfo; - newContainerInfo.TreeNode = newNode; - - TreeNode selectedNode = mRemoteNG.Tree.Node.SelectedNode; - TreeNode parentNode = default(TreeNode); - if (selectedNode == null) - { - parentNode = tvConnections.Nodes[0]; - } - else - { - if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == mRemoteNG.Tree.Node.Type.Connection) - { - parentNode = selectedNode.Parent; - } - else - { - parentNode = selectedNode; - } - } - - newContainerInfo.ConnectionInfo = new mRemoteNG.Connection.Info(newContainerInfo); - newContainerInfo.ConnectionInfo.Name = newNode.Text; - - // We can only inherit from a container node, not the root node or connection nodes - if (mRemoteNG.Tree.Node.GetNodeType(parentNode) == mRemoteNG.Tree.Node.Type.Container) - { - newContainerInfo.Parent = parentNode.Tag; - } - else - { - newContainerInfo.ConnectionInfo.Inherit.TurnOffInheritanceCompletely(); - } - - ContainerList.Add(newContainerInfo); - parentNode.Nodes.Add(newNode); - - tvConnections.SelectedNode = newNode; - tvConnections.SelectedNode.BeginEdit(); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(Language.strErrorAddFolderFailed, ex.Message), true); - } - } - - private void DisconnectConnection() - { - try - { - if (tvConnections.SelectedNode != null) - { - if (tvConnections.SelectedNode.Tag is mRemoteNG.Connection.Info) - { - mRemoteNG.Connection.Info conI = tvConnections.SelectedNode.Tag; + mRemoteNG.Connection.Info conI = n.Tag; for (int i = 0; i <= conI.OpenConnections.Count - 1; i++) { conI.OpenConnections[i].Disconnect(); } } - - if (tvConnections.SelectedNode.Tag is Container.Info) - { - foreach (TreeNode n in tvConnections.SelectedNode.Nodes) - { - if (n.Tag is mRemoteNG.Connection.Info) - { - mRemoteNG.Connection.Info conI = n.Tag; - for (int i = 0; i <= conI.OpenConnections.Count - 1; i++) - { - conI.OpenConnections[i].Disconnect(); - } - } - } - } } } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "DisconnectConnection (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "DisconnectConnection (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } - private static void SshTransferFile() - { - try - { - Windows.Show(Type.SSHTransfer); + private static void SshTransferFile() + { + try + { + Windows.Show(Type.SSHTransfer); - mRemoteNG.Connection.Info conI = mRemoteNG.Tree.Node.SelectedNode.Tag; + mRemoteNG.Connection.Info conI = mRemoteNG.Tree.Node.SelectedNode.Tag; - Windows.sshtransferForm.Hostname = conI.Hostname; - Windows.sshtransferForm.Username = conI.Username; - Windows.sshtransferForm.Password = conI.Password; - Windows.sshtransferForm.Port = System.Convert.ToString(conI.Port); - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SSHTransferFile (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } + Windows.sshtransferForm.Hostname = conI.Hostname; + Windows.sshtransferForm.Username = conI.Username; + Windows.sshtransferForm.Password = conI.Password; + Windows.sshtransferForm.Port = System.Convert.ToString(conI.Port); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SSHTransferFile (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } - private void AddExternalApps() - { - try - { - //clean up - cMenTreeToolsExternalApps.DropDownItems.Clear(); + private void AddExternalApps() + { + try + { + //clean up + cMenTreeToolsExternalApps.DropDownItems.Clear(); - //add ext apps - foreach (Tools.ExternalTool extA in Runtime.ExternalTools) - { - ToolStripMenuItem nItem = new ToolStripMenuItem(); - nItem.Text = extA.DisplayName; - nItem.Tag = extA; + //add ext apps + foreach (Tools.ExternalTool extA in Runtime.ExternalTools) + { + ToolStripMenuItem nItem = new ToolStripMenuItem(); + nItem.Text = extA.DisplayName; + nItem.Tag = extA; - nItem.Image = extA.Image; + nItem.Image = extA.Image; - nItem.Click += cMenTreeToolsExternalAppsEntry_Click; + nItem.Click += cMenTreeToolsExternalAppsEntry_Click; - cMenTreeToolsExternalApps.DropDownItems.Add(nItem); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeTools_DropDownOpening failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); - } + cMenTreeToolsExternalApps.DropDownItems.Add(nItem); } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeTools_DropDownOpening failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); + } + } - private static void StartExternalApp(Tools.ExternalTool externalTool) + private static void StartExternalApp(Tools.ExternalTool externalTool) + { + try + { + if (mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.Connection | mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.PuttySession) { - try + externalTool.Start(mRemoteNG.Tree.Node.SelectedNode.Tag); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeToolsExternalAppsEntry_Click failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + + #region Menu + static public void mMenViewExpandAllFolders_Click(System.Object sender, EventArgs e) + { + mRemoteNG.Tree.Node.ExpandAllNodes(); + } + + public void mMenViewCollapseAllFolders_Click(System.Object sender, EventArgs e) + { + if (tvConnections.SelectedNode != null) + { + if (tvConnections.SelectedNode.IsEditing) + { + tvConnections.SelectedNode.EndEdit(false); + } + } + mRemoteNG.Tree.Node.CollapseAllNodes(); + } + #endregion + + #region Search + public void txtSearch_GotFocus(object sender, EventArgs e) + { + txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextColor; + if (txtSearch.Text == Language.strSearchPrompt) + { + txtSearch.Text = ""; + } + } + + public void txtSearch_LostFocus(object sender, EventArgs e) + { + if (txtSearch.Text == "") + { + txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; + txtSearch.Text = Language.strSearchPrompt; + } + } + + public void txtSearch_KeyDown(object sender, KeyEventArgs e) + { + try + { + if (e.KeyCode == Keys.Escape) + { + e.Handled = true; + tvConnections.Focus(); + } + else if (e.KeyCode == Keys.Up) + { + tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; + } + else if (e.KeyCode == Keys.Down) + { + tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode; + } + else + { + tvConnections_KeyDown(sender, e); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "txtSearch_KeyDown (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public void txtSearch_TextChanged(System.Object sender, EventArgs e) + { + tvConnections.SelectedNode = mRemoteNG.Tree.Node.Find(tvConnections.Nodes[0], txtSearch.Text); + } + + public void tvConnections_KeyPress(object sender, KeyPressEventArgs e) + { + try + { + if (char.IsLetterOrDigit(e.KeyChar)) + { + txtSearch.Text = e.KeyChar.ToString(); + + txtSearch.Focus(); + txtSearch.SelectionStart = txtSearch.TextLength; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_KeyPress (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + + public void tvConnections_KeyDown(object sender, KeyEventArgs e) + { + try + { + if (e.KeyCode == Keys.Enter) + { + if (tvConnections.SelectedNode.Tag is mRemoteNG.Connection.Info) { - if (mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.Connection | mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) == mRemoteNG.Tree.Node.Type.PuttySession) + e.Handled = true; + OpenConnection(); + } + else + { + if (tvConnections.SelectedNode.IsExpanded) { - externalTool.Start(mRemoteNG.Tree.Node.SelectedNode.Tag); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeToolsExternalAppsEntry_Click failed (UI.Window.Tree)" + Constants.vbNewLine + ex.Message, true); - } - } -#endregion - -#region Menu - static public void mMenViewExpandAllFolders_Click(System.Object sender, EventArgs e) - { - mRemoteNG.Tree.Node.ExpandAllNodes(); - } - - public void mMenViewCollapseAllFolders_Click(System.Object sender, EventArgs e) - { - if (tvConnections.SelectedNode != null) - { - if (tvConnections.SelectedNode.IsEditing) - { - tvConnections.SelectedNode.EndEdit(false); - } - } - mRemoteNG.Tree.Node.CollapseAllNodes(); - } -#endregion - -#region Search - public void txtSearch_GotFocus(object sender, EventArgs e) - { - txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextColor; - if (txtSearch.Text == Language.strSearchPrompt) - { - txtSearch.Text = ""; - } - } - - public void txtSearch_LostFocus(object sender, EventArgs e) - { - if (txtSearch.Text == "") - { - txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; - txtSearch.Text = Language.strSearchPrompt; - } - } - - public void txtSearch_KeyDown(object sender, KeyEventArgs e) - { - try - { - if (e.KeyCode == Keys.Escape) - { - e.Handled = true; - tvConnections.Focus(); - } - else if (e.KeyCode == Keys.Up) - { - tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; - } - else if (e.KeyCode == Keys.Down) - { - tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode; + tvConnections.SelectedNode.Collapse(true); } else { - tvConnections_KeyDown(sender, e); + tvConnections.SelectedNode.Expand(); } } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "txtSearch_KeyDown (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } } - - public void txtSearch_TextChanged(System.Object sender, EventArgs e) + else if (e.KeyCode == Keys.Escape ^ e.KeyCode == Keys.Control | e.KeyCode == Keys.F) { - tvConnections.SelectedNode = mRemoteNG.Tree.Node.Find(tvConnections.Nodes[0], txtSearch.Text); + txtSearch.Focus(); + txtSearch.SelectionStart = txtSearch.TextLength; } - - public void tvConnections_KeyPress(object sender, KeyPressEventArgs e) - { - try - { - if (char.IsLetterOrDigit(e.KeyChar)) - { - txtSearch.Text = e.KeyChar.ToString(); - - txtSearch.Focus(); - txtSearch.SelectionStart = txtSearch.TextLength; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_KeyPress (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } - - public void tvConnections_KeyDown(object sender, KeyEventArgs e) - { - try - { - if (e.KeyCode == Keys.Enter) - { - if (tvConnections.SelectedNode.Tag is mRemoteNG.Connection.Info) - { - e.Handled = true; - OpenConnection(); - } - else - { - if (tvConnections.SelectedNode.IsExpanded) - { - tvConnections.SelectedNode.Collapse(true); - } - else - { - tvConnections.SelectedNode.Expand(); - } - } - } - else if (e.KeyCode == Keys.Escape ^ e.KeyCode == Keys.Control | e.KeyCode == Keys.F) - { - txtSearch.Focus(); - txtSearch.SelectionStart = txtSearch.TextLength; - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_KeyDown (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); - } - } -#endregion } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_KeyDown (UI.Window.Tree) failed" + Constants.vbNewLine + ex.Message, true); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/UI/UI.Window.UltraVNCSC.cs b/mRemoteV1/CS/UI/UI.Window.UltraVNCSC.cs index fde13c4b2..28fda5209 100644 --- a/mRemoteV1/CS/UI/UI.Window.UltraVNCSC.cs +++ b/mRemoteV1/CS/UI/UI.Window.UltraVNCSC.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,162 +8,160 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - +using mRemoteNG.App; using WeifenLuo.WinFormsUI.Docking; -//using mRemoteNG.App.Runtime; namespace mRemoteNG.UI.Window { public class UltraVNCSC : Base + { + + #region Form Init + internal System.Windows.Forms.ToolStrip tsMain; + internal System.Windows.Forms.Panel pnlContainer; + internal System.Windows.Forms.ToolStripButton btnDisconnect; + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UltraVNCSC)); + this.tsMain = new System.Windows.Forms.ToolStrip(); + this.Load += new System.EventHandler(UltraVNCSC_Load); + this.btnDisconnect = new System.Windows.Forms.ToolStripButton(); + this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click); + this.pnlContainer = new System.Windows.Forms.Panel(); + this.tsMain.SuspendLayout(); + this.SuspendLayout(); + // + //tsMain + // + this.tsMain.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.btnDisconnect}); + this.tsMain.Location = new System.Drawing.Point(0, 0); + this.tsMain.Name = "tsMain"; + this.tsMain.Size = new System.Drawing.Size(446, 25); + this.tsMain.TabIndex = 0; + this.tsMain.Text = "ToolStrip1"; + // + //btnDisconnect + // + this.btnDisconnect.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.btnDisconnect.Image = (System.Drawing.Image) (resources.GetObject("btnDisconnect.Image")); + this.btnDisconnect.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnDisconnect.Name = "btnDisconnect"; + this.btnDisconnect.Size = new System.Drawing.Size(63, 22); + this.btnDisconnect.Text = "Disconnect"; + // + //pnlContainer + // + this.pnlContainer.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.pnlContainer.Location = new System.Drawing.Point(0, 27); + this.pnlContainer.Name = "pnlContainer"; + this.pnlContainer.Size = new System.Drawing.Size(446, 335); + this.pnlContainer.TabIndex = 1; + // + //UltraVNCSC + // + this.ClientSize = new System.Drawing.Size(446, 362); + this.Controls.Add(this.pnlContainer); + this.Controls.Add(this.tsMain); + this.Icon = global::My.Resources.UVNC_SC_Icon; + this.Name = "UltraVNCSC"; + this.TabText = "UltraVNC SC"; + this.Text = "UltraVNC SC"; + this.tsMain.ResumeLayout(false); + this.tsMain.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + #endregion + + #region Declarations + //Private WithEvents vnc As AxCSC_ViewerXControl + #endregion + + #region Public Methods + public UltraVNCSC(DockContent Panel) + { + this.WindowType = Type.UltraVNCSC; + this.DockPnl = Panel; + this.InitializeComponent(); + } + #endregion + + #region Private Methods + private void UltraVNCSC_Load(object sender, System.EventArgs e) + { + ApplyLanguage(); + + StartListening(); + } + + private void ApplyLanguage() + { + btnDisconnect.Text = My.Language.strButtonDisconnect; + } + + private void StartListening() + { + try { - -#region Form Init - internal System.Windows.Forms.ToolStrip tsMain; - internal System.Windows.Forms.Panel pnlContainer; - internal System.Windows.Forms.ToolStripButton btnDisconnect; - - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UltraVNCSC)); - this.tsMain = new System.Windows.Forms.ToolStrip(); - this.Load += new System.EventHandler(UltraVNCSC_Load); - this.btnDisconnect = new System.Windows.Forms.ToolStripButton(); - this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click); - this.pnlContainer = new System.Windows.Forms.Panel(); - this.tsMain.SuspendLayout(); - this.SuspendLayout(); - // - //tsMain - // - this.tsMain.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.btnDisconnect}); - this.tsMain.Location = new System.Drawing.Point(0, 0); - this.tsMain.Name = "tsMain"; - this.tsMain.Size = new System.Drawing.Size(446, 25); - this.tsMain.TabIndex = 0; - this.tsMain.Text = "ToolStrip1"; - // - //btnDisconnect - // - this.btnDisconnect.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.btnDisconnect.Image = (System.Drawing.Image) (resources.GetObject("btnDisconnect.Image")); - this.btnDisconnect.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnDisconnect.Name = "btnDisconnect"; - this.btnDisconnect.Size = new System.Drawing.Size(63, 22); - this.btnDisconnect.Text = "Disconnect"; - // - //pnlContainer - // - this.pnlContainer.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlContainer.Location = new System.Drawing.Point(0, 27); - this.pnlContainer.Name = "pnlContainer"; - this.pnlContainer.Size = new System.Drawing.Size(446, 335); - this.pnlContainer.TabIndex = 1; - // - //UltraVNCSC - // - this.ClientSize = new System.Drawing.Size(446, 362); - this.Controls.Add(this.pnlContainer); - this.Controls.Add(this.tsMain); - this.Icon = global::My.Resources.UVNC_SC_Icon; - this.Name = "UltraVNCSC"; - this.TabText = "UltraVNC SC"; - this.Text = "UltraVNC SC"; - this.tsMain.ResumeLayout(false); - this.tsMain.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } -#endregion - -#region Declarations - //Private WithEvents vnc As AxCSC_ViewerXControl -#endregion - -#region Public Methods - public UltraVNCSC(DockContent Panel) - { - this.WindowType = Type.UltraVNCSC; - this.DockPnl = Panel; - this.InitializeComponent(); - } -#endregion - -#region Private Methods - private void UltraVNCSC_Load(object sender, System.EventArgs e) - { - ApplyLanguage(); - - StartListening(); - } - - private void ApplyLanguage() - { - btnDisconnect.Text = My.Language.strButtonDisconnect; - } - - private void StartListening() - { - try - { - //If vnc IsNot Nothing Then - // vnc.Dispose() - // vnc = Nothing - //End If + //If vnc IsNot Nothing Then + // vnc.Dispose() + // vnc = Nothing + //End If - //vnc = New AxCSC_ViewerXControl() - //SetupLicense() + //vnc = New AxCSC_ViewerXControl() + //SetupLicense() - //vnc.Parent = pnlContainer - //vnc.Dock = DockStyle.Fill - //vnc.Show() + //vnc.Parent = pnlContainer + //vnc.Dock = DockStyle.Fill + //vnc.Show() - //vnc.StretchMode = ViewerX.ScreenStretchMode.SSM_ASPECT - //vnc.ListeningText = My.Language.strInheritListeningForIncomingVNCConnections & " " & My.Settings.UVNCSCPort + //vnc.StretchMode = ViewerX.ScreenStretchMode.SSM_ASPECT + //vnc.ListeningText = My.Language.strInheritListeningForIncomingVNCConnections & " " & My.Settings.UVNCSCPort - //vnc.ListenEx(My.Settings.UVNCSCPort) - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartListening (UI.Window.UltraVNCSC) failed" + Constants.vbNewLine + ex.Message, false); - Close(); - } - } - - private void SetupLicense() - { - try - { - //Dim f As System.Reflection.FieldInfo - //f = GetType(AxHost).GetField("licenseKey", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) - //f.SetValue(vnc, "{072169039103041044176252035252117103057101225235137221179204110241121074}") - } - catch (Exception ex) - { - MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "VNC SetupLicense failed (UI.Window.UltraVNCSC)" + Constants.vbNewLine + ex.Message, true); - } - } - - //Private Sub vnc_ConnectionAccepted(ByVal sender As Object, ByVal e As AxViewerX._ISmartCodeVNCViewerEvents_ConnectionAcceptedEvent) Handles vnc.ConnectionAccepted - // mC.AddMessage(Messages.MessageClass.InformationMsg, e.bstrServerAddress & " is now connected to your UltraVNC SingleClick panel!") - //End Sub - - //Private Sub vnc_Disconnected(ByVal sender As Object, ByVal e As System.EventArgs) Handles vnc.Disconnected - // StartListening() - //End Sub - - private void btnDisconnect_Click(System.Object sender, System.EventArgs e) - { - //vnc.Dispose() - Dispose(); - App.Runtime.Windows.Show(Type.UltraVNCSC); - } -#endregion - + //vnc.ListenEx(My.Settings.UVNCSCPort) } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartListening (UI.Window.UltraVNCSC) failed" + Constants.vbNewLine + ex.Message, false); + Close(); + } + } + + private void SetupLicense() + { + try + { + //Dim f As System.Reflection.FieldInfo + //f = GetType(AxHost).GetField("licenseKey", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) + //f.SetValue(vnc, "{072169039103041044176252035252117103057101225235137221179204110241121074}") + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "VNC SetupLicense failed (UI.Window.UltraVNCSC)" + Constants.vbNewLine + ex.Message, true); + } + } + + //Private Sub vnc_ConnectionAccepted(ByVal sender As Object, ByVal e As AxViewerX._ISmartCodeVNCViewerEvents_ConnectionAcceptedEvent) Handles vnc.ConnectionAccepted + // mC.AddMessage(Messages.MessageClass.InformationMsg, e.bstrServerAddress & " is now connected to your UltraVNC SingleClick panel!") + //End Sub + + //Private Sub vnc_Disconnected(ByVal sender As Object, ByVal e As System.EventArgs) Handles vnc.Disconnected + // StartListening() + //End Sub + + private void btnDisconnect_Click(System.Object sender, System.EventArgs e) + { + //vnc.Dispose() + Dispose(); + Runtime.Windows.Show(Type.UltraVNCSC); + } + #endregion + + } } diff --git a/mRemoteV1/CS/UI/UI.Window.Update.cs b/mRemoteV1/CS/UI/UI.Window.Update.cs index 29ab8977f..5d45706d8 100644 --- a/mRemoteV1/CS/UI/UI.Window.Update.cs +++ b/mRemoteV1/CS/UI/UI.Window.Update.cs @@ -1,4 +1,3 @@ -// VBConversions Note: VB project level imports using System.Collections.Generic; using System; using AxWFICALib; @@ -9,273 +8,271 @@ using AxMSTSCLib; using Microsoft.VisualBasic; using System.Collections; using System.Windows.Forms; -// End of VB project level imports - using System.ComponentModel; using mRemoteNG.My; using WeifenLuo.WinFormsUI.Docking; using System.IO; -//using mRemoteNG.App.Runtime; +using mRemoteNG.App; namespace mRemoteNG.UI.Window { public partial class Update : Base + { + #region Public Methods + public Update(DockContent panel) + { + WindowType = Type.Update; + DockPnl = panel; + InitializeComponent(); + FontOverride(this); + } + #endregion + + #region Form Stuff + public void Update_Load(object sender, EventArgs e) + { + ApplyLanguage(); + CheckForUpdate(); + } + + private void ApplyLanguage() + { + Text = Language.strMenuCheckForUpdates; + TabText = Language.strMenuCheckForUpdates; + btnCheckForUpdate.Text = Language.strCheckForUpdate; + btnDownload.Text = Language.strDownloadAndInstall; + lblChangeLogLabel.Text = Language.strLabelChangeLog; + lblInstalledVersion.Text = Language.strVersion; + lblInstalledVersionLabel.Text = string.Format("{0}:", Language.strCurrentVersion); + lblLatestVersion.Text = Language.strVersion; + lblLatestVersionLabel.Text = string.Format("{0}:", Language.strAvailableVersion); + } + + public void btnCheckForUpdate_Click(System.Object sender, EventArgs e) + { + CheckForUpdate(); + } + + public void btnDownload_Click(System.Object sender, EventArgs e) + { + DownloadUpdate(); + } + + public void pbUpdateImage_Click(System.Object sender, EventArgs e) + { + Uri linkUri = pbUpdateImage.Tag as Uri; + if (linkUri == null || linkUri.IsFile || linkUri.IsUnc || linkUri.IsLoopback) { -#region Public Methods - public Update(DockContent panel) - { - WindowType = Type.Update; - DockPnl = panel; - InitializeComponent(); - FontOverride(this); - } -#endregion + return ; + } + Process.Start(linkUri.ToString()); + } + #endregion -#region Form Stuff - public void Update_Load(object sender, EventArgs e) - { - ApplyLanguage(); - CheckForUpdate(); - } + #region Private Fields + private App.Update _appUpdate; + private bool _isUpdateDownloadHandlerDeclared = false; + #endregion - private void ApplyLanguage() - { - Text = Language.strMenuCheckForUpdates; - TabText = Language.strMenuCheckForUpdates; - btnCheckForUpdate.Text = Language.strCheckForUpdate; - btnDownload.Text = Language.strDownloadAndInstall; - lblChangeLogLabel.Text = Language.strLabelChangeLog; - lblInstalledVersion.Text = Language.strVersion; - lblInstalledVersionLabel.Text = string.Format("{0}:", Language.strCurrentVersion); - lblLatestVersion.Text = Language.strVersion; - lblLatestVersionLabel.Text = string.Format("{0}:", Language.strAvailableVersion); - } - - public void btnCheckForUpdate_Click(System.Object sender, EventArgs e) - { - CheckForUpdate(); - } - - public void btnDownload_Click(System.Object sender, EventArgs e) - { - DownloadUpdate(); - } - - public void pbUpdateImage_Click(System.Object sender, EventArgs e) - { - Uri linkUri = pbUpdateImage.Tag as Uri; - if (linkUri == null || linkUri.IsFile || linkUri.IsUnc || linkUri.IsLoopback) - { - return ; - } - Process.Start(linkUri.ToString()); - } -#endregion - -#region Private Fields - private App.Update _appUpdate; - private bool _isUpdateDownloadHandlerDeclared = false; -#endregion - -#region Private Methods - private void CheckForUpdate() - { - if (_appUpdate == null) - { - _appUpdate = new App.Update(); - _appUpdate.Load += _appUpdate.Update_Load; - } - else if (_appUpdate.IsGetUpdateInfoRunning) - { - return ; - } + #region Private Methods + private void CheckForUpdate() + { + if (_appUpdate == null) + { + _appUpdate = new App.Update(); + _appUpdate.Load += _appUpdate.Update_Load; + } + else if (_appUpdate.IsGetUpdateInfoRunning) + { + return ; + } - lblStatus.Text = Language.strUpdateCheckingLabel; - lblStatus.ForeColor = SystemColors.WindowText; - lblLatestVersionLabel.Visible = false; - lblInstalledVersion.Visible = false; - lblInstalledVersionLabel.Visible = false; - lblLatestVersion.Visible = false; - btnCheckForUpdate.Visible = false; - pnlUpdate.Visible = false; + lblStatus.Text = Language.strUpdateCheckingLabel; + lblStatus.ForeColor = SystemColors.WindowText; + lblLatestVersionLabel.Visible = false; + lblInstalledVersion.Visible = false; + lblInstalledVersionLabel.Visible = false; + lblLatestVersion.Visible = false; + btnCheckForUpdate.Visible = false; + pnlUpdate.Visible = false; - _appUpdate.GetUpdateInfoCompletedEvent += GetUpdateInfoCompleted; + _appUpdate.GetUpdateInfoCompletedEvent += GetUpdateInfoCompleted; - _appUpdate.GetUpdateInfoAsync(); - } + _appUpdate.GetUpdateInfoAsync(); + } - private void GetUpdateInfoCompleted(object sender, AsyncCompletedEventArgs e) - { - if (InvokeRequired) - { - AsyncCompletedEventHandler myDelegate = new AsyncCompletedEventHandler(GetUpdateInfoCompleted); - Invoke(myDelegate, new object[] {sender, e}); - return ; - } + private void GetUpdateInfoCompleted(object sender, AsyncCompletedEventArgs e) + { + if (InvokeRequired) + { + AsyncCompletedEventHandler myDelegate = new AsyncCompletedEventHandler(GetUpdateInfoCompleted); + Invoke(myDelegate, new object[] {sender, e}); + return ; + } - try - { - _appUpdate.GetUpdateInfoCompletedEvent -= GetUpdateInfoCompleted; + try + { + _appUpdate.GetUpdateInfoCompletedEvent -= GetUpdateInfoCompleted; - lblInstalledVersion.Text = System.Convert.ToString(Application.Info.Version.ToString()); - lblInstalledVersion.Visible = true; - lblInstalledVersionLabel.Visible = true; - btnCheckForUpdate.Visible = true; + lblInstalledVersion.Text = System.Convert.ToString(Application.Info.Version.ToString()); + lblInstalledVersion.Visible = true; + lblInstalledVersionLabel.Visible = true; + btnCheckForUpdate.Visible = true; - if (e.Cancelled) - { - return ; - } - if (e.Error != null) - { - throw (e.Error); - } + if (e.Cancelled) + { + return ; + } + if (e.Error != null) + { + throw (e.Error); + } - if (_appUpdate.IsUpdateAvailable()) - { - lblStatus.Text = Language.strUpdateAvailable; - lblStatus.ForeColor = Color.OrangeRed; - pnlUpdate.Visible = true; + if (_appUpdate.IsUpdateAvailable()) + { + lblStatus.Text = Language.strUpdateAvailable; + lblStatus.ForeColor = Color.OrangeRed; + pnlUpdate.Visible = true; - App.Update.UpdateInfo updateInfo = _appUpdate.CurrentUpdateInfo; + App.Update.UpdateInfo updateInfo = _appUpdate.CurrentUpdateInfo; + lblLatestVersion.Text = updateInfo.Version.ToString(); + lblLatestVersionLabel.Visible = true; + lblLatestVersion.Visible = true; + + if (updateInfo.ImageAddress == null || string.IsNullOrEmpty(updateInfo.ImageAddress.ToString())) + { + pbUpdateImage.Visible = false; + } + else + { + pbUpdateImage.ImageLocation = updateInfo.ImageAddress.ToString(); + pbUpdateImage.Tag = updateInfo.ImageLinkAddress; + pbUpdateImage.Visible = true; + } + + _appUpdate.GetChangeLogCompletedEvent += GetChangeLogCompleted; + _appUpdate.GetChangeLogAsync(); + + btnDownload.Focus(); + } + else + { + lblStatus.Text = Language.strNoUpdateAvailable; + lblStatus.ForeColor = Color.ForestGreen; + + if (_appUpdate.CurrentUpdateInfo != null) + { + App.Update.UpdateInfo updateInfo = _appUpdate.CurrentUpdateInfo; + if (updateInfo.IsValid && updateInfo.Version != null) + { lblLatestVersion.Text = updateInfo.Version.ToString(); lblLatestVersionLabel.Visible = true; lblLatestVersion.Visible = true; - - if (updateInfo.ImageAddress == null || string.IsNullOrEmpty(updateInfo.ImageAddress.ToString())) - { - pbUpdateImage.Visible = false; - } - else - { - pbUpdateImage.ImageLocation = updateInfo.ImageAddress.ToString(); - pbUpdateImage.Tag = updateInfo.ImageLinkAddress; - pbUpdateImage.Visible = true; - } - - _appUpdate.GetChangeLogCompletedEvent += GetChangeLogCompleted; - _appUpdate.GetChangeLogAsync(); - - btnDownload.Focus(); } - else - { - lblStatus.Text = Language.strNoUpdateAvailable; - lblStatus.ForeColor = Color.ForestGreen; - - if (_appUpdate.CurrentUpdateInfo != null) - { - App.Update.UpdateInfo updateInfo = _appUpdate.CurrentUpdateInfo; - if (updateInfo.IsValid && updateInfo.Version != null) - { - lblLatestVersion.Text = updateInfo.Version.ToString(); - lblLatestVersionLabel.Visible = true; - lblLatestVersion.Visible = true; - } - } - } - } - catch (Exception ex) - { - lblStatus.Text = Language.strUpdateCheckFailedLabel; - lblStatus.ForeColor = Color.OrangeRed; - - MessageCollector.AddExceptionMessage(Language.strUpdateCheckCompleteFailed, ex); } } - - private void GetChangeLogCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) - { - if (InvokeRequired) - { - AsyncCompletedEventHandler myDelegate = new AsyncCompletedEventHandler(GetChangeLogCompleted); - Invoke(myDelegate, new object[] {sender, e}); - return ; - } - - try - { - _appUpdate.GetChangeLogCompletedEvent -= GetChangeLogCompleted; - - if (e.Cancelled) - { - return ; - } - if (e.Error != null) - { - throw (e.Error); - } - - txtChangeLog.Text = _appUpdate.ChangeLog; - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(Language.strUpdateGetChangeLogFailed, ex); - } - } - - private void DownloadUpdate() - { - try - { - btnDownload.Enabled = false; - prgbDownload.Visible = true; - prgbDownload.Value = 0; - - if (_isUpdateDownloadHandlerDeclared == false) - { - _appUpdate.DownloadUpdateProgressChangedEvent += DownloadUpdateProgressChanged; - _appUpdate.DownloadUpdateCompletedEvent += DownloadUpdateCompleted; - _isUpdateDownloadHandlerDeclared = true; - } - - _appUpdate.DownloadUpdateAsync(); - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(Language.strUpdateDownloadFailed, ex); - } - } -#endregion - -#region Events - private void DownloadUpdateProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e) - { - prgbDownload.Value = e.ProgressPercentage; - } - - private void DownloadUpdateCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) - { - try - { - btnDownload.Enabled = true; - prgbDownload.Visible = false; - - if (e.Cancelled) - { - return ; - } - if (e.Error != null) - { - throw (e.Error); - } - - if (MessageBox.Show(Language.strUpdateDownloadComplete, Language.strMenuCheckForUpdates, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.OK) - { - Shutdown.Quit(_appUpdate.CurrentUpdateInfo.UpdateFilePath); - return ; - } - else - { - File.Delete(_appUpdate.CurrentUpdateInfo.UpdateFilePath); - } - } - catch (Exception ex) - { - MessageCollector.AddExceptionMessage(Language.strUpdateDownloadCompleteFailed, ex); - } - } -#endregion } + catch (Exception ex) + { + lblStatus.Text = Language.strUpdateCheckFailedLabel; + lblStatus.ForeColor = Color.OrangeRed; + + Runtime.MessageCollector.AddExceptionMessage(Language.strUpdateCheckCompleteFailed, ex); + } + } + + private void GetChangeLogCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) + { + if (InvokeRequired) + { + AsyncCompletedEventHandler myDelegate = new AsyncCompletedEventHandler(GetChangeLogCompleted); + Invoke(myDelegate, new object[] {sender, e}); + return ; + } + + try + { + _appUpdate.GetChangeLogCompletedEvent -= GetChangeLogCompleted; + + if (e.Cancelled) + { + return ; + } + if (e.Error != null) + { + throw (e.Error); + } + + txtChangeLog.Text = _appUpdate.ChangeLog; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(Language.strUpdateGetChangeLogFailed, ex); + } + } + + private void DownloadUpdate() + { + try + { + btnDownload.Enabled = false; + prgbDownload.Visible = true; + prgbDownload.Value = 0; + + if (_isUpdateDownloadHandlerDeclared == false) + { + _appUpdate.DownloadUpdateProgressChangedEvent += DownloadUpdateProgressChanged; + _appUpdate.DownloadUpdateCompletedEvent += DownloadUpdateCompleted; + _isUpdateDownloadHandlerDeclared = true; + } + + _appUpdate.DownloadUpdateAsync(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(Language.strUpdateDownloadFailed, ex); + } + } + #endregion + + #region Events + private void DownloadUpdateProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e) + { + prgbDownload.Value = e.ProgressPercentage; + } + + private void DownloadUpdateCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) + { + try + { + btnDownload.Enabled = true; + prgbDownload.Visible = false; + + if (e.Cancelled) + { + return ; + } + if (e.Error != null) + { + throw (e.Error); + } + + if (MessageBox.Show(Language.strUpdateDownloadComplete, Language.strMenuCheckForUpdates, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.OK) + { + Shutdown.Quit(_appUpdate.CurrentUpdateInfo.UpdateFilePath); + return ; + } + else + { + File.Delete(_appUpdate.CurrentUpdateInfo.UpdateFilePath); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage(Language.strUpdateDownloadCompleteFailed, ex); + } + } + #endregion + } } diff --git a/mRemoteV1/CS/mRemoteV1.v12.suo b/mRemoteV1/CS/mRemoteV1.v12.suo index f3b9681810a1117ce53bfceb6753f135a752971a..bae31ba9de152d8d0b467297182602c4645e0807 100644 GIT binary patch literal 236032 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 S68|&4p5lq5#Q&_8|M@@IyHbPz delta 15467 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 literal 37744 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 aOxM744NTX-bPY_`z;q2v*TDZ?4g6ob4ZQ{c literal 135168 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 X;}j^>Cl0%u&oeDF8}xw@|6kt#O^Ta< delta 1687 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 C&f0tc literal 188402 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 literal 36635 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 BRtf+B diff --git a/mRemoteV1/obj/Debug Portable/Interop.WFICALib.dll b/mRemoteV1/obj/Debug Portable/Interop.WFICALib.dll index b0b26acfe3676fd61095a4f66420e5bff44104a5..355cb0f76abeb4ea385470981b25076ab1cfa28f 100644 GIT binary patch literal 135168 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 abPY_`z;q2v*T8fQOxM744gBxb!2bo$(!9g~ literal 135168 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 diff --git a/mRemoteV1/obj/Debug Portable/mRemoteV1.vbproj.ResolveComReference.cache b/mRemoteV1/obj/Debug Portable/mRemoteV1.vbproj.ResolveComReference.cache index 1da81edaa8118e4e9e4546b5794e7591a8f596dd..dd2d9b9f0330f719ad96852cd5c4dc944d37a2f7 100644 GIT binary patch delta 25 hcmaFI_Kt0X6%!-pW@{#9Mz#Zj70VbePj+F}0sv^72cQ4| delta 25 hcmaFI_Kt0X6%!-JW@{#9MmCTC9!qYWo9x1@1psfT2)6(L