Compare commits

...

72 Commits

Author SHA1 Message Date
Riley McArdle
5835e5f72c Revert "Merge pull request #101 from ozkanpakdil/develop"
This reverts commit 7350e94662, reversing
changes made to 14d1f6cde2.
2014-03-16 13:45:20 -05:00
Andreas Rehm
7350e94662 Merge pull request #101 from ozkanpakdil/develop
multi command for ssh
2014-03-16 16:52:57 +01:00
ozkan.pakdil
d5d2d5bf82 multi command for ssh 2014-03-16 17:44:53 +02:00
Riley McArdle
14d1f6cde2 Add support for importing files from PuTTY Connection Manager. Improve the import and export functionality. 2013-12-17 22:10:24 -06:00
Riley McArdle
9f17b917f7 Change icon for "Full Screen (RDP)" in connection tab context menu. 2013-11-26 16:17:21 -06:00
Riley McArdle
c046b48ee9 Update CHANGELOG.TXT. 2013-11-24 22:21:37 -06:00
Riley McArdle
cb6cf7c01f Move SharedLibraryNG into mRemoteNG solution folder. 2013-11-24 22:18:17 -06:00
Riley McArdle
cd9b07ca0a Update for 1.73 Beta 1. 2013-11-19 20:23:19 -06:00
Riley McArdle
eb435bc6b0 Clean up code and fix possible NullReferenceException in UI.Window.Connection.WndProc(). 2013-11-19 20:18:42 -06:00
Riley McArdle
c9ca613348 Make improvement MR-250 - Show the name of the selected connection tab in the title of the window 2013-11-19 20:16:04 -06:00
Riley McArdle
771855fd07 Fix possible NullReferenceException in ExternalTool.StartIntegrated(). 2013-11-17 21:24:43 -06:00
Riley McArdle
e6967bbc07 Fix variable expansion in external tool filenames. 2013-11-17 21:24:11 -06:00
Riley McArdle
095d8ca719 Update ReSharper abbreviations list. 2013-11-17 21:23:30 -06:00
Riley McArdle
9c089bed37 Code cleanup of external tools. 2013-11-17 21:23:00 -06:00
Riley McArdle
7e94c6f1c9 Fix issue MR-523 - Changes to external tools are not saved until exiting the program 2013-11-17 18:50:14 -06:00
Riley McArdle
df44296ee0 Code cleanup. 2013-11-17 18:37:44 -06:00
Riley McArdle
da42b6f3b2 Fix issue MR-556 - Export fails when overwriting an existing file 2013-11-17 18:37:12 -06:00
Riley McArdle
264756d986 Fix warnings when compiling TestProject. 2013-11-17 18:03:21 -06:00
Riley McArdle
49d9887d03 Fix issue MR-594 - Crash on startup if write access is denied to the IE browser emulation registry key 2013-11-17 18:02:34 -06:00
Riley McArdle
39f22dec4c Add error logging to RemoteDesktopConnectionManager.DecryptPassword(). 2013-11-17 17:49:41 -06:00
Riley McArdle
69befbc97b Code cleanup of Connection.Info. 2013-11-17 17:44:12 -06:00
Riley McArdle
820ed1c457 Fix issue MR-603 - Some configuration options are still shown even when inheritance is enabled 2013-11-17 15:15:35 -06:00
Riley McArdle
c0c6a6dc4b Code cleanup. 2013-11-17 15:01:34 -06:00
Riley McArdle
a410709f92 Add feature MR-512 - Add support for importing files from Remote Desktop Connection Manager 2013-11-17 12:48:40 -06:00
Riley McArdle
3b20e85ff0 Add MR-486 to CHANGELOG.TXT. 2013-11-16 03:19:27 -06:00
Riley McArdle
5d8e7a9fa8 Make improvement MR-419 - Password prompt dialog should have a meaningful window title 2013-11-16 03:09:56 -06:00
Riley McArdle
63ad0760cd Fix issue MR-187 - F7 keyboard shortcut for New Folder conflicts with remote connections 2013-11-16 01:31:10 -06:00
Riley McArdle
2ea29ef8cb Hide UVNC Single Click port setting on advanced options page. 2013-11-16 00:41:31 -06:00
Riley McArdle
f34baa389c Add and improve menu icons. 2013-11-16 00:40:17 -06:00
Riley McArdle
41db2f7fe7 Sort Language.resx. 2013-11-16 00:14:42 -06:00
Riley McArdle
2db04225a7 Add feature MR-212 - Add option to connect without credentials
I have my username/password stored in mRemote, but sometimes i want to
log in as the service account or administrator account for various
reasons. This "new feature" allows you to quickly enter credentials
without changing other settings.
(cherry picked from commit 2ec0cdbc30 by cyclops1982)

Conflicts:
	mRemoteV1/Language/Language.Designer.vb
	mRemoteV1/Language/Language.resx
2013-11-16 00:14:23 -06:00
Riley McArdle
b6004117e6 Improve handling of variables in external tool arguments.
Code cleanup.
2013-11-15 23:27:10 -06:00
Riley McArdle
fd73b28061 Merge branch 'release/1.72' into develop
Conflicts:
	CHANGELOG.TXT
2013-11-13 18:48:43 -06:00
Riley McArdle
da39c03a6f Fix issue MR-592 - Unable to run VBS script as an external tool
Fix issue MR-596 - Incorrect escaping of quotation marks in external tool arguments
2013-11-13 18:20:52 -06:00
Riley McArdle
ba721c9db6 Remove debug message. 2013-11-07 21:02:12 -06:00
Riley McArdle
9b707cf93d Make improvement MR-590 - Make panels docked to the edge of the window keep their size 2013-11-06 02:07:58 -06:00
Riley McArdle
a73b42409f Remove stray trailing colon from SQL Server options page name in some translations. 2013-11-05 04:18:23 -06:00
Riley McArdle
e743b2c699 Refactor options dialog. 2013-11-05 04:10:02 -06:00
Riley McArdle
107c44df88 Merge branch 'release/1.71' into develop
Conflicts:
	CHANGELOG.TXT
2013-11-04 03:44:13 -06:00
Riley McArdle
5e19c420e7 Add feature MR-16 - Add keyboard shortcuts to switch between tabs
Add feature MR-557 - Add Hotkeys to Tabs / Subtabs
2013-11-04 02:41:16 -06:00
Riley McArdle
2f55324708 Continue implementing keyboard options page. 2013-10-31 07:00:48 -05:00
Riley McArdle
6cc6c34c4b Create KeyboardShortcuts class to manage keyboard shortcuts. 2013-10-30 06:28:23 -05:00
Riley McArdle
3d64fbef49 Update CHANGELOG.TXT for 1.71 RC3. 2013-10-29 02:35:33 -05:00
Riley McArdle
539a0198f3 Improve control focus behavior of options dialog. 2013-10-28 09:13:13 -05:00
Riley McArdle
9beebac7fc Set AcceptButton for options dialog. 2013-10-28 09:12:42 -05:00
Riley McArdle
50567fd967 Improve options dialog. Start implementing keyboard options page. 2013-10-28 09:06:10 -05:00
Riley McArdle
3ee004ce4e Code cleanup. 2013-10-28 01:42:43 -05:00
Riley McArdle
a58fd7559c Code cleanup. 2013-10-28 01:39:43 -05:00
Riley McArdle
73d738887a Merge branch 'develop' into feature/hotkeys
Conflicts:
	CHANGELOG.TXT
2013-10-28 01:25:38 -05:00
Riley McArdle
e96199dc37 Change XmingProvider to include sessions from the registry. 2013-10-28 01:14:59 -05:00
Riley McArdle
f5cde10d62 Fix merge error. 2013-10-28 01:06:36 -05:00
Riley McArdle
1d5df08e78 Merge branch 'release/1.71' into develop 2013-10-28 00:03:12 -05:00
Riley McArdle
869c2726bb Fix checking for updates even when disabled. 2013-10-27 06:04:54 -05:00
Riley McArdle
2e663df42a Fix issue MR-578 - Connections file is reset
Fix the wrong connections file opening on startup under certain conditions.
Improve error reporting when loading connections files.
Remove warning message when mRemoteNG is started for the first time about new connections file being created.
2013-10-27 05:46:11 -05:00
Riley McArdle
1c33494547 Update version number to 1.72. 2013-10-27 01:54:48 -05:00
Riley McArdle
4acaefe9c3 Add "Reset" to config panel context menu to allow resetting some config settings to their default value.
Fix config panel showing settings from previously loaded connection file after loading a new one.
Code cleanup.
2013-10-27 01:53:24 -05:00
Riley McArdle
8c3f4c06df Add feature MR-547 - Add support for Xming Portable PuTTY 2013-10-27 01:40:32 -05:00
Riley McArdle
ed589f4b51 Merge branch 'release/1.71' into develop
Conflicts:
	CHANGELOG.TXT
2013-10-25 01:03:54 -05:00
Riley McArdle
0a82828d2e Fix log file not showing operating system version on Windows XP and Windows Server 2003. 2013-10-25 00:57:21 -05:00
Riley McArdle
13c1d049fc Fix issue MR-574 - Crash when retrieving RDP session list if eolwtscom.dll is not registered 2013-10-25 00:56:28 -05:00
Riley McArdle
8c61e95a5b Reword CHANGELOG.TXT. 2013-10-21 20:43:21 -05:00
Riley McArdle
a6fa6e19d0 Fix PuTTY Saved Sessions still showing if all saved sessions are removed 2013-10-21 20:38:39 -05:00
Riley McArdle
8273bdf70f Remove invalid "Site" configuration option from PuTTY Saved Sessions 2013-10-21 18:55:59 -05:00
Riley McArdle
5267de8b87 Merge branch 'release/1.71' into develop
Conflicts:
	CHANGELOG.TXT
2013-10-16 17:21:49 -05:00
Riley McArdle
6036a792e5 Merge branch 'release/1.71' into develop
Conflicts:
	CHANGELOG.TXT
2013-10-14 22:55:53 -05:00
Riley McArdle
1341db0812 Change namespace of HotkeyControl. 2013-10-06 22:31:50 -05:00
Riley McArdle
c16a4134c7 Merge branch 'develop' into feature/hotkeys
Conflicts:
	CHANGELOG.TXT
2013-10-06 21:36:04 -05:00
Riley McArdle
771047ddd7 Merge branch 'release/1.71' into feature/hotkeys 2013-10-06 21:33:03 -05:00
Riley McArdle
718d67f20c Fix misleading log messages about RD Gateway support. 2013-10-06 21:32:12 -05:00
Riley McArdle
d18a510310 Fix issue MR-141 - Add a default protocol option
Fix issue MR-367 - Make the 'Connect' button on the 'Quick Connect' toolbar a forced dropdown
2013-10-06 20:30:38 -05:00
Riley McArdle
3a3da1c6f1 Continue adding support for hotkeys to switch tabs. 2013-10-03 20:56:56 -05:00
Riley McArdle
00647e4963 Start adding support for hotkeys to switch tabs. 2013-10-01 23:27:22 -05:00
170 changed files with 14787 additions and 9399 deletions

View File

@@ -1,8 +1,50 @@
1.71 (2013-10-16):
1.73 Beta 2 ():
Fixed issue MR-619 - Keyboard shortcuts stop working after locking the screen with Win+L
Added support for importing files from PuTTY Connection Manager.
Improved the import and export functionality.
1.73 Beta 1 (2013-11-19):
Added feature MR-16 - Add keyboard shortcuts to switch between tabs
Added feature MR-141 - Add a default protocol option
Added feature MR-212 - Add option to connect without credentials
Added feature MR-512 - Add support for importing files from Remote Desktop Connection Manager
Added feature MR-547 - Add support for Xming Portable PuTTY
Made improvement MR-250 - Show the name of the selected connection tab in the title of the window
Made improvement MR-367 - Make the 'Connect' button on the 'Quick Connect' toolbar a forced dropdown
Made improvement MR-419 - Password prompt dialog should have a meaningful window title
Made improvement MR-486 - Allow escaping of variable names for external tools
Made improvement MR-590 - Make panels docked to the edge of the window keep their size
Fixed issue MR-187 - F7 keyboard shortcut for New Folder conflicts with remote connections
Fixed issue MR-523 - Changes to external tools are not saved until exiting the program
Fixed issue MR-556 - Export fails when overwriting an existing file
Fixed issue MR-594 - Crash on startup if write access is denied to the IE browser emulation registry key
Fixed issue MR-603 - Some configuration options are still shown even when inheritance is enabled
Added "Reset" to config panel context menu to allow resetting some config settings to their default value.
Added and improved menu icons.
Removed misleading log messages about RD Gateway support.
Removed invalid "Site" configuration option from PuTTY Saved Sessions.
Fixed PuTTY Saved Sessions still showing if all saved sessions are removed.
Fixed config panel showing settings from previously loaded connection file after loading a new one.
Improved handling of variables in external tool arguments.
1.72 (2013-11-13):
Fixed issue MR-592 - Unable to run VBS script as an external tool
Fixed issue MR-596 - Incorrect escaping of quotation marks in external tool arguments
1.71 (2013-10-29):
Fixed issue MR-574 - Crash when retrieving RDP session list if eolwtscom.dll is not registered
Fixed issue MR-578 - Connections file is reset
Fixed log file not showing operating system version on Windows XP and Windows Server 2003.
Fixed the wrong connections file opening on startup under certain conditions.
Fixed checking for updates even when disabled.
Improved error reporting when loading connections files.
Removed warning message when mRemoteNG is started for the first time about new connections file being created.
1.71 Release Candidate 2 (2013-10-16):
Fixed issue MR-560 - Cannot Auto-Update With Open Connections: Unable to find an entry point named 'TaskDialogIndirect' in DLL 'ComCtl32'
Fixed issue MR-565 - Double Folder keep heritage on the initial Folder
Fixed issue MR-566 - Typo in German UI Automatic Update Settings
Fixed duplicated folders possibly being named "New Connection" instead of the original folder's name
Fixed duplicated folders possibly being named "New Connection" instead of the original folder's name.
1.71 Release Candidate 1 (2013-10-01):
Fixed issue MR-495 - Having a negative range in port scan creates memory exhaustion.

View File

@@ -4,6 +4,7 @@ Contributors
Jason Barbier
Wiktor Beryt
Lionel Caignec
Ruben d'Arco
Felix Deimel
Holger Henke
Tom Hiller
@@ -35,6 +36,10 @@ Copyright
Copyright <20> 2010-2011 Brandon Hansen
http://nsis.sourceforge.net/DotNetVer
Hotkey Selection Control for .NET
Copyright <20> 2006 Thomas Backman
http://www.codeproject.com/Articles/15085/A-simple-hotkey-selection-control-for-NET
Included Components
===================

10
Local.testsettings Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Local" id="2a25bb82-f5ff-4a67-b5e9-c6aaa54d1e80" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Description>These are default test settings for a local test run.</Description>
<Deployment enabled="false" />
<Execution>
<TestTypeSpecific />
<AgentRule name="Execution Agents">
</AgentRule>
</Execution>
</TestSettings>

View File

@@ -0,0 +1,331 @@
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
//
// Hotkey selection control, written by serenity@exscape.org, 2006-08-03
// Please mail me if you find a bug.
//
namespace SharedLibraryNG
{
/// <summary>
/// A simple control that allows the user to select pretty much any valid hotkey combination
/// </summary>
public class HotkeyControl : TextBox
{
private const string KeySeparator = " + ";
// These variables store the current hotkey and modifier(s)
private Keys _keyCode = Keys.None;
private Keys _modifiers = Keys.None;
// ArrayLists used to enforce the use of proper modifiers.
// Shift+A isn't a valid hotkey, for instance, as it would screw up when the user is typing.
private readonly ArrayList _needNonShiftModifier;
private readonly ArrayList _needNonAltGrModifier;
private readonly ContextMenu _emptyContextMenu = new ContextMenu();
/// <summary>
/// Used to make sure that there is no right-click menu available
/// </summary>
public override ContextMenu ContextMenu
{
get
{
return _emptyContextMenu;
}
// ReSharper disable once ValueParameterNotUsed
set
{
base.ContextMenu = _emptyContextMenu;
}
}
/// <summary>
/// Forces the control to be non-multiline
/// </summary>
public override bool Multiline
{
get
{
return base.Multiline;
}
// ReSharper disable once ValueParameterNotUsed
set
{
// Ignore what the user wants; force Multiline to false
base.Multiline = false;
}
}
/// <summary>
/// Creates a new HotkeyControl
/// </summary>
public HotkeyControl()
{
// Handle events that occurs when keys are pressed
KeyUp += HotkeyControl_KeyUp;
// Fill the ArrayLists that contain all invalid hotkey combinations
_needNonShiftModifier = new ArrayList();
_needNonAltGrModifier = new ArrayList();
PopulateModifierLists();
}
protected override void OnCreateControl()
{
base.OnCreateControl();
ContextMenu = _emptyContextMenu; // Disable right-clicking
Multiline = false;
Text = "None";
}
/// <summary>
/// Populates the ArrayLists specifying disallowed hotkeys
/// such as Shift+A, Ctrl+Alt+4 (would produce a dollar sign) etc
/// </summary>
private void PopulateModifierLists()
{
// Shift + 0 - 9, A - Z
for (var k = Keys.D0; k <= Keys.Z; k++)
_needNonShiftModifier.Add((int)k);
// Shift + Numpad keys
for (var k = Keys.NumPad0; k <= Keys.NumPad9; k++)
_needNonShiftModifier.Add((int)k);
// Shift + Misc (,;<./ etc)
for (var k = Keys.Oem1; k <= Keys.OemBackslash; k++)
_needNonShiftModifier.Add((int)k);
// Misc keys that we can't loop through
_needNonShiftModifier.Add((int)Keys.Insert);
_needNonShiftModifier.Add((int)Keys.Help);
_needNonShiftModifier.Add((int)Keys.Multiply);
_needNonShiftModifier.Add((int)Keys.Add);
_needNonShiftModifier.Add((int)Keys.Subtract);
_needNonShiftModifier.Add((int)Keys.Divide);
_needNonShiftModifier.Add((int)Keys.Decimal);
_needNonShiftModifier.Add((int)Keys.Return);
_needNonShiftModifier.Add((int)Keys.Escape);
_needNonShiftModifier.Add((int)Keys.NumLock);
_needNonShiftModifier.Add((int)Keys.Scroll);
_needNonShiftModifier.Add((int)Keys.Pause);
// Ctrl+Alt + 0 - 9
for (var k = Keys.D0; k <= Keys.D9; k++)
_needNonAltGrModifier.Add((int)k);
}
/// <summary>
/// Fires when all keys are released. If the current hotkey isn't valid, reset it.
/// Otherwise, do nothing and keep the text and hotkey as it was.
/// </summary>
void HotkeyControl_KeyUp(object sender, KeyEventArgs e)
{
if (_keyCode == Keys.None && ModifierKeys == Keys.None) ResetHotkey();
}
/// <summary>
/// Handles some misc keys, such as Ctrl+Delete and Shift+Insert
/// </summary>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var keyCode = keyData & Keys.KeyCode;
var modifiers = keyData & Keys.Modifiers;
if (keyData == Keys.Back || keyData == Keys.Delete)
{
ResetHotkey();
return true;
}
_keyCode = keyCode;
_modifiers = modifiers;
Redraw();
return true;
}
/// <summary>
/// Clears the current hotkey and resets the TextBox
/// </summary>
public void ResetHotkey()
{
_keyCode = Keys.None;
_modifiers = Keys.None;
Text = "None";
}
/// <summary>
/// Used to get/set the hotkey (e.g. Keys.A)
/// </summary>
public Keys KeyCode
{
get
{
return _keyCode;
}
set
{
_keyCode = value;
Redraw(false);
}
}
/// <summary>
/// Used to get/set the modifier keys (e.g. Keys.Alt | Keys.Control)
/// </summary>
public Keys HotkeyModifiers
{
get
{
return _modifiers;
}
set
{
_modifiers = value;
Redraw(false);
}
}
/// <summary>
/// Redraws the TextBox when necessary.
/// </summary>
/// <param name="validate">Specifies whether this function was called by the Hotkey/HotkeyModifiers properties or by the user.</param>
private void Redraw(bool validate = true)
{
// Only validate input if it comes from the user
if (validate)
{
// No modifier or shift only, AND a hotkey that needs another modifier
if ((_modifiers == Keys.Shift || _modifiers == Keys.None) &&
_needNonShiftModifier.Contains((int) _keyCode))
{
if (_modifiers == Keys.None)
{
// Set Ctrl+Alt as the modifier unless Ctrl+Alt+<key> won't work...
if (_needNonAltGrModifier.Contains((int) _keyCode) == false)
_modifiers = Keys.Alt | Keys.Control;
else // ... in that case, use Shift+Alt instead.
_modifiers = Keys.Alt | Keys.Shift;
}
else
{
// User pressed Shift and an invalid key (e.g. a letter or a number),
// that needs another set of modifier keys
_keyCode = Keys.None;
Text = _modifiers + " + Invalid Key";
return;
}
}
// Check all Ctrl+Alt keys
if ((_modifiers == (Keys.Alt | Keys.Control)) &&
_needNonAltGrModifier.Contains((int) _keyCode))
{
// Ctrl+Alt+4 etc won't work; reset hotkey and tell the user
_keyCode = Keys.None;
Text = _modifiers + " + Invalid Key";
return;
}
}
// Don't allow modifiers keys for _keyCode
if (_keyCode == Keys.ShiftKey ||
_keyCode == Keys.LShiftKey ||
_keyCode == Keys.RShiftKey ||
_keyCode == Keys.ControlKey ||
_keyCode == Keys.LControlKey ||
_keyCode == Keys.RControlKey ||
_keyCode == Keys.Menu ||
_keyCode == Keys.LMenu ||
_keyCode == Keys.RMenu ||
_keyCode == Keys.LWin ||
_keyCode == Keys.RWin)
_keyCode = Keys.None;
if (_modifiers == Keys.None)
{
if (_keyCode == Keys.None)
{
ResetHotkey();
return;
}
// We get here if we've got a hotkey that is valid without a modifier,
// like F1-F12, Media-keys etc.
Text = _keyCode.ToString();
return;
}
Text = string.Join(KeySeparator, new[] { KeysToString(_modifiers), KeysToString(_keyCode) });
}
public static string KeysToString(Keys keys)
{
if (keys == Keys.None) return "None";
var modifiers = (keys & Keys.Modifiers);
var keyCode = (keys & Keys.KeyCode);
var strings = new List<string>();
if (modifiers != 0)
{
var modifierStrings = new List<string>(modifiers.ToString().Replace(", ", ",").Split(','));
modifierStrings.Sort(new KeyModifierComparer());
strings.AddRange(modifierStrings);
}
if (keyCode != 0)
{
var keyString = keyCode.ToString();
var keyHashtable = new Dictionary<string, string>
{
{"Next", "PageDown"},
{"Oemcomma", ","},
{"OemMinus", "-"},
{"OemOpenBrackets", "["},
{"OemPeriod", "."},
{"Oemplus", "="},
{"OemQuestion", "/"},
{"Oemtilde", "`"},
{"D0", "0"},
{"D1", "1"},
{"D2", "2"},
{"D3", "3"},
{"D4", "4"},
{"D5", "5"},
{"D6", "6"},
{"D7", "7"},
{"D8", "8"},
{"D9", "9"},
};
if (keyHashtable.ContainsKey(keyString)) keyString = keyHashtable[keyString];
strings.Add(keyString);
}
return string.Join(KeySeparator, strings.ToArray());
}
private class KeyModifierComparer : IComparer<string>
{
private static readonly List<string> ModifierOrder = new List<string>
{
"control",
"alt",
"shift",
};
public int Compare(string x, string y)
{
var xIndex = ModifierOrder.IndexOf(x.ToLowerInvariant());
var yIndex = ModifierOrder.IndexOf(y.ToLowerInvariant());
return xIndex - yIndex;
}
}
}
}

View File

@@ -0,0 +1,258 @@
//
// Based on code from Stephen Toub's MSDN blog at
// http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx
//
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Collections.Generic;
namespace SharedLibraryNG
{
public class KeyboardHook
{
// ReSharper disable InconsistentNaming
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PostMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, HookKeyMsgData lParam);
// ReSharper restore InconsistentNaming
[Flags]
public enum ModifierKeys
{
None = 0x0000,
Shift = 0x0001,
LeftShift = 0x002,
RightShift = 0x004,
Control = 0x0008,
LeftControl = 0x010,
RightControl = 0x20,
Alt = 0x0040,
LeftAlt = 0x0080,
RightAlt = 0x0100,
Win = 0x0200,
LeftWin = 0x0400,
RightWin = 0x0800,
}
protected class KeyNotificationEntry
: IEquatable<KeyNotificationEntry>
{
public IntPtr WindowHandle;
public Int32 KeyCode;
public ModifierKeys ModifierKeys;
public Boolean Block;
public bool Equals(KeyNotificationEntry obj)
{
return (WindowHandle == obj.WindowHandle &&
KeyCode == obj.KeyCode &&
ModifierKeys == obj.ModifierKeys &&
Block == obj.Block);
}
}
public const string HookKeyMsgName = "HOOKKEYMSG-{56BE0940-34DA-11E1-B308-C6714824019B}";
private static Int32 _hookKeyMsg;
public static Int32 HookKeyMsg
{
get
{
if (_hookKeyMsg == 0)
{
_hookKeyMsg = Win32.RegisterWindowMessage(HookKeyMsgName).ToInt32();
if (_hookKeyMsg == 0)
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return _hookKeyMsg;
}
}
// this is a custom structure that will be passed to
// the requested hWnd via a WM_APP_HOOKKEYMSG message
[StructLayout(LayoutKind.Sequential)]
public class HookKeyMsgData
{
public Int32 KeyCode;
public ModifierKeys ModifierKeys;
public Boolean WasBlocked;
}
private static int _referenceCount;
private static IntPtr _hook;
private static readonly Win32.LowLevelKeyboardProcDelegate LowLevelKeyboardProcStaticDelegate = LowLevelKeyboardProc;
private static readonly List<KeyNotificationEntry> NotificationEntries = new List<KeyNotificationEntry>();
public KeyboardHook()
{
_referenceCount++;
SetHook();
}
~KeyboardHook()
{
_referenceCount--;
if (_referenceCount < 1) UnsetHook();
}
private static void SetHook()
{
if (_hook != IntPtr.Zero) return;
var curProcess = Process.GetCurrentProcess();
var curModule = curProcess.MainModule;
var hook = Win32.SetWindowsHookEx(Win32.WH_KEYBOARD_LL, LowLevelKeyboardProcStaticDelegate, Win32.GetModuleHandle(curModule.ModuleName), 0);
if (hook == IntPtr.Zero)
throw new Win32Exception(Marshal.GetLastWin32Error());
_hook = hook;
}
private static void UnsetHook()
{
if (_hook == IntPtr.Zero) return;
Win32.UnhookWindowsHookEx(_hook);
_hook = IntPtr.Zero;
}
private static IntPtr LowLevelKeyboardProc(Int32 nCode, IntPtr wParam, Win32.KBDLLHOOKSTRUCT lParam)
{
var wParamInt = wParam.ToInt32();
var result = 0;
if (nCode == Win32.HC_ACTION)
{
switch (wParamInt)
{
case Win32.WM_KEYDOWN:
case Win32.WM_SYSKEYDOWN:
case Win32.WM_KEYUP:
case Win32.WM_SYSKEYUP:
result = OnKey(wParamInt, lParam);
break;
}
}
if (result != 0) return new IntPtr(result);
return Win32.CallNextHookEx(_hook, nCode, wParam, lParam);
}
private static int OnKey(Int32 msg, Win32.KBDLLHOOKSTRUCT key)
{
var result = 0;
foreach (var notificationEntry in NotificationEntries)
if (GetFocusWindow() == notificationEntry.WindowHandle && notificationEntry.KeyCode == key.vkCode)
{
var modifierKeys = GetModifierKeyState();
if (!ModifierKeysMatch(notificationEntry.ModifierKeys, modifierKeys)) continue;
var wParam = new IntPtr(msg);
var lParam = new HookKeyMsgData
{
KeyCode = key.vkCode,
ModifierKeys = modifierKeys,
WasBlocked = notificationEntry.Block,
};
if (!PostMessage(notificationEntry.WindowHandle, HookKeyMsg, wParam, lParam))
throw new Win32Exception(Marshal.GetLastWin32Error());
if (notificationEntry.Block) result = 1;
}
return result;
}
private static IntPtr GetFocusWindow()
{
var guiThreadInfo = new Win32.GUITHREADINFO();
if (!Win32.GetGUIThreadInfo(0, guiThreadInfo))
throw new Win32Exception(Marshal.GetLastWin32Error());
return Win32.GetAncestor(guiThreadInfo.hwndFocus, Win32.GA_ROOT);
}
protected static Dictionary<Int32, ModifierKeys> ModifierKeyTable = new Dictionary<Int32, ModifierKeys>
{
{ Win32.VK_SHIFT, ModifierKeys.Shift },
{ Win32.VK_LSHIFT, ModifierKeys.LeftShift },
{ Win32.VK_RSHIFT, ModifierKeys.RightShift },
{ Win32.VK_CONTROL, ModifierKeys.Control },
{ Win32.VK_LCONTROL, ModifierKeys.LeftControl },
{ Win32.VK_RCONTROL, ModifierKeys.RightControl },
{ Win32.VK_MENU, ModifierKeys.Alt },
{ Win32.VK_LMENU, ModifierKeys.LeftAlt },
{ Win32.VK_RMENU, ModifierKeys.RightAlt },
{ Win32.VK_LWIN, ModifierKeys.LeftWin },
{ Win32.VK_RWIN, ModifierKeys.RightWin },
};
public static ModifierKeys GetModifierKeyState()
{
var modifierKeyState = ModifierKeys.None;
foreach (KeyValuePair<Int32, ModifierKeys> pair in ModifierKeyTable)
{
if ((Win32.GetAsyncKeyState(pair.Key) & Win32.KEYSTATE_PRESSED) != 0) modifierKeyState |= pair.Value;
}
if ((modifierKeyState & ModifierKeys.LeftWin) != 0) modifierKeyState |= ModifierKeys.Win;
if ((modifierKeyState & ModifierKeys.RightWin) != 0) modifierKeyState |= ModifierKeys.Win;
return modifierKeyState;
}
public static Boolean ModifierKeysMatch(ModifierKeys requestedKeys, ModifierKeys pressedKeys)
{
if ((requestedKeys & ModifierKeys.Shift) != 0) pressedKeys &= ~(ModifierKeys.LeftShift | ModifierKeys.RightShift);
if ((requestedKeys & ModifierKeys.Control) != 0) pressedKeys &= ~(ModifierKeys.LeftControl | ModifierKeys.RightControl);
if ((requestedKeys & ModifierKeys.Alt) != 0) pressedKeys &= ~(ModifierKeys.LeftAlt | ModifierKeys.RightAlt);
if ((requestedKeys & ModifierKeys.Win) != 0) pressedKeys &= ~(ModifierKeys.LeftWin | ModifierKeys.RightWin);
return requestedKeys == pressedKeys;
}
public static void RequestKeyNotification(IntPtr windowHandle, Int32 keyCode, Boolean block)
{
RequestKeyNotification(windowHandle, keyCode, ModifierKeys.None, block);
}
public static void RequestKeyNotification(IntPtr windowHandle, Int32 keyCode, ModifierKeys modifierKeys = ModifierKeys.None, Boolean block = false)
{
var newNotificationEntry = new KeyNotificationEntry
{
WindowHandle = windowHandle,
KeyCode = keyCode,
ModifierKeys = modifierKeys,
Block = block,
};
foreach (var notificationEntry in NotificationEntries)
if (notificationEntry == newNotificationEntry) return;
NotificationEntries.Add(newNotificationEntry);
}
public static void CancelKeyNotification(IntPtr windowHandle, Int32 keyCode, Boolean block)
{
CancelKeyNotification(windowHandle, keyCode, ModifierKeys.None, block);
}
public static void CancelKeyNotification(IntPtr windowHandle, Int32 keyCode, ModifierKeys modifierKeys = ModifierKeys.None, Boolean block = false)
{
var notificationEntry = new KeyNotificationEntry
{
WindowHandle = windowHandle,
KeyCode = keyCode,
ModifierKeys = modifierKeys,
Block = block,
};
NotificationEntries.Remove(notificationEntry);
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("SharedLibraryNG")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SharedLibraryNG")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("f4470853-f933-4203-9d2a-b3c731e225c7")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{0F615504-5F30-4CF2-8341-1DE7FEC95A23}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>SharedLibraryNG</RootNamespace>
<AssemblyName>SharedLibraryNG</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="HotkeyControl.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="KeyboardHook.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Win32.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

171
SharedLibraryNG/Win32.cs Normal file
View File

@@ -0,0 +1,171 @@
using System;
using System.Runtime.InteropServices;
namespace SharedLibraryNG
{
// ReSharper disable InconsistentNaming
public static class Win32
{
#region Functions
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, IntPtr hMod, Int32 dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, KBDLLHOOKSTRUCT lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr RegisterWindowMessage(string lpString);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetGUIThreadInfo(Int32 idThread, GUITHREADINFO lpgui);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetAncestor(IntPtr hwnd, UInt32 gaFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Int16 GetAsyncKeyState(Int32 vKey);
#endregion
#region Delegates
public delegate IntPtr LowLevelKeyboardProcDelegate(Int32 nCode, IntPtr wParam, KBDLLHOOKSTRUCT lParam);
#endregion
#region Structures
[StructLayout(LayoutKind.Sequential)]
public class KBDLLHOOKSTRUCT
{
public Int32 vkCode;
public Int32 scanCode;
public Int32 flags;
public Int32 time;
public IntPtr dwExtraInfo;
};
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[StructLayout(LayoutKind.Sequential)]
public class GUITHREADINFO
{
public GUITHREADINFO()
{
cbSize = Convert.ToInt32(Marshal.SizeOf(this));
}
public Int32 cbSize;
public Int32 flags;
public IntPtr hwndActive;
public IntPtr hwndFocus;
public IntPtr hwndCapture;
public IntPtr hwndMenuOwner;
public IntPtr hwndMoveSize;
public IntPtr hwndCaret;
public RECT rcCaret;
}
#endregion
#region Constants
// GetAncestor
public const int GA_ROOT = 2;
// SetWindowsHookEx
public const int WH_KEYBOARD_LL = 13;
// LowLevelKeyboardProcDelegate
public const int HC_ACTION = 0;
// SendMessage
public const int WM_KEYDOWN = 0x0100;
public const int WM_KEYUP = 0x0101;
public const int WM_SYSKEYDOWN = 0x0104;
public const int WM_SYSKEYUP = 0x0105;
// GetAsyncKeyState
public const int KEYSTATE_PRESSED = 0x8000;
#region Virtual Keys
public const int VK_CANCEL = 0x0003;
public const int VK_BACK = 0x0008;
public const int VK_TAB = 0x0009;
public const int VK_CLEAR = 0x000C;
public const int VK_RETURN = 0x000D;
public const int VK_PAUSE = 0x0013;
public const int VK_ESCAPE = 0x001B;
public const int VK_SNAPSHOT = 0x002C;
public const int VK_INSERT = 0x002D;
public const int VK_DELETE = 0x002E;
public const int VK_HOME = 0x0024;
public const int VK_END = 0x0023;
public const int VK_PRIOR = 0x0021;
public const int VK_NEXT = 0x0022;
public const int VK_LEFT = 0x0025;
public const int VK_UP = 0x0026;
public const int VK_RIGHT = 0x0027;
public const int VK_DOWN = 0x0028;
public const int VK_SELECT = 0x0029;
public const int VK_PRINT = 0x002A;
public const int VK_EXECUTE = 0x002B;
public const int VK_HELP = 0x002F;
public const int VK_LWIN = 0x005B;
public const int VK_RWIN = 0x005C;
public const int VK_APPS = 0x005D;
public const int VK_F1 = 0x0070;
public const int VK_F2 = 0x0071;
public const int VK_F3 = 0x0072;
public const int VK_F4 = 0x0073;
public const int VK_F5 = 0x0074;
public const int VK_F6 = 0x0075;
public const int VK_F7 = 0x0076;
public const int VK_F8 = 0x0077;
public const int VK_F9 = 0x0078;
public const int VK_F10 = 0x0079;
public const int VK_F11 = 0x007A;
public const int VK_F12 = 0x007B;
public const int VK_SHIFT = 0x0010;
public const int VK_LSHIFT = 0x00A0;
public const int VK_RSHIFT = 0x00A1;
public const int VK_CONTROL = 0x0011;
public const int VK_LCONTROL = 0x00A2;
public const int VK_RCONTROL = 0x00A3;
public const int VK_MENU = 0x0012;
public const int VK_LMENU = 0x00A4;
public const int VK_RMENU = 0x00A5;
public const int VK_OEM_1 = 0x00BA;
public const int VK_OEM_2 = 0x00BF;
public const int VK_OEM_3 = 0x00C0;
public const int VK_OEM_4 = 0x00DB;
public const int VK_OEM_5 = 0x00DC;
public const int VK_OEM_6 = 0x00DD;
public const int VK_OEM_7 = 0x00DE;
public const int VK_OEM_8 = 0x00DF;
public const int VK_OEM_102 = 0x00E2;
#endregion
#endregion
// ReSharper restore InconsistentNaming
}
}

View File

@@ -0,0 +1,145 @@
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports mRemoteNG.Tools
Imports mRemoteNG.Connection.PuttySession
'''<summary>
'''This is a test class for ExternalToolTest and is intended
'''to contain all ExternalToolTest Unit Tests
'''</summary>
<TestClass()> _
Public Class ExternalToolTest
'''<summary>
'''Gets or sets the test context which provides
'''information about and functionality for the current test run.
'''</summary>
Public Property TestContext() As TestContext
#Region "Additional test attributes"
'
'You can use the following additional attributes as you write your tests:
'
'Use ClassInitialize to run code before running the first test in the class
'<ClassInitialize()> _
'Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
'End Sub
'
'Use ClassCleanup to run code after all tests in a class have run
'<ClassCleanup()> _
'Public Shared Sub MyClassCleanup()
'End Sub
'
'Use TestInitialize to run code before running each test
'<TestInitialize()> _
'Public Sub MyTestInitialize()
'End Sub
'
'Use TestCleanup to run code after each test has run
'<TestCleanup()> _
'Public Sub MyTestCleanup()
'End Sub
'
#End Region
'''<summary>
'''A test for ParseArguments
'''</summary>
<TestMethod(), _
DeploymentItem("mRemoteNG.exe")> _
Public Sub ParseArgumentsTest()
Dim externalTool As New ExternalTool
' ReSharper disable StringLiteralTypo
externalTool.ConnectionInfo = New Info()
With externalTool.ConnectionInfo
.Name = "EMAN"
.Hostname = "EMANTSOH"
.Port = 9876
.Username = "EMANRESU"
.Password = "DROWSSAP"
.Domain = "NIAMOD"
.Description = "NOITPIRCSED"
.MacAddress = "SSERDDACAM"
.UserField = "DLEIFRESU"
End With
Assert.AreEqual("EMAN, EMANTSOH, 9876, EMANRESU, DROWSSAP, NIAMOD, NOITPIRCSED, SSERDDACAM, DLEIFRESU", externalTool.ParseArguments("%NAME%, %HOSTNAME%, %PORT%, %USERNAME%, %PASSWORD%, %DOMAIN%, %DESCRIPTION%, %MACADDRESS%, %USERFIELD%"))
' ReSharper restore StringLiteralTypo
Assert.AreEqual(Environment.ExpandEnvironmentVariables("%PATH%"), externalTool.ParseArguments("%!PATH%"))
externalTool.ConnectionInfo.Name = "()%!^""<>&|\""\\"
Assert.AreEqual("%%", externalTool.ParseArguments("%%"))
Assert.AreEqual("% %", externalTool.ParseArguments("% %"))
Assert.AreEqual("%-%", externalTool.ParseArguments("%-%"))
Assert.AreEqual("%!%", externalTool.ParseArguments("%!%"))
Assert.AreEqual("%^%", externalTool.ParseArguments("%^%"))
Assert.AreEqual("%%%", externalTool.ParseArguments("%%%"))
Assert.AreEqual("%foobar%", externalTool.ParseArguments("%foobar%"))
Assert.AreEqual("%-foobar%", externalTool.ParseArguments("%-foobar%"))
Assert.AreEqual("%!foobar%", externalTool.ParseArguments("%!foobar%"))
Assert.AreEqual("%-!^\", externalTool.ParseArguments("%-!^\"))
Assert.AreEqual("^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("%NAME%"))
Assert.AreEqual("^(^)^%^!^^^""^<^>^&^|\^""\\", externalTool.ParseArguments("%-NAME%"))
Assert.AreEqual("()%!^""<>&|\""\\", externalTool.ParseArguments("%!NAME%"))
Assert.AreEqual("^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("%name%"))
Assert.AreEqual("%^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("%%name%"))
Assert.AreEqual("^(^)^%^!^^\^""^<^>^&^|\\\^""\\%", externalTool.ParseArguments("%name%%"))
Assert.AreEqual("^(^)^%^!^^\^""^<^>^&^|\\\^""\\ ^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("%name% %name%"))
Assert.AreEqual("%-^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("%-%name%"))
Assert.AreEqual("^(^)^%^!^^\^""^<^>^&^|\\\^""\\-%", externalTool.ParseArguments("%name%-%"))
Assert.AreEqual("%!^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("%!%name%"))
Assert.AreEqual("^(^)^%^!^^\^""^<^>^&^|\\\^""\\!%", externalTool.ParseArguments("%name%!%"))
Assert.AreEqual("\^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("\%NAME%"))
Assert.AreEqual("\^(^)^%^!^^\^""^<^>^&^|\\\^""\\NAME%", externalTool.ParseArguments("\%NAME%NAME%"))
Assert.AreEqual("%NAME\%", externalTool.ParseArguments("%NAME\%"))
Assert.AreEqual("""^(^)^%^!^^\^""^<^>^&^|\\\^""\\\\""", externalTool.ParseArguments("""%NAME%"""))
Assert.AreEqual("""^(^)^%^!^^^""^<^>^&^|\^""\\""", externalTool.ParseArguments("""%-NAME%"""))
Assert.AreEqual("""()%!^""<>&|\""\\""", externalTool.ParseArguments("""%!NAME%"""))
Assert.AreEqual("""^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("""%NAME%"))
Assert.AreEqual("""^(^)^%^!^^^""^<^>^&^|\^""\\", externalTool.ParseArguments("""%-NAME%"))
Assert.AreEqual("""()%!^""<>&|\""\\", externalTool.ParseArguments("""%!NAME%"))
Assert.AreEqual("^(^)^%^!^^\^""^<^>^&^|\\\^""\\\\""", externalTool.ParseArguments("%NAME%"""))
Assert.AreEqual("^(^)^%^!^^^""^<^>^&^|\^""\\""", externalTool.ParseArguments("%-NAME%"""))
Assert.AreEqual("()%!^""<>&|\""\\""", externalTool.ParseArguments("%!NAME%"""))
Assert.AreEqual(Environment.ExpandEnvironmentVariables("%USERNAME%"), externalTool.ParseArguments("\%USERNAME\%"))
Assert.AreEqual(Environment.ExpandEnvironmentVariables("%USERNAME%"), externalTool.ParseArguments("\%-USERNAME\%"))
Assert.AreEqual(Environment.ExpandEnvironmentVariables("%USERNAME%"), externalTool.ParseArguments("\%!USERNAME\%"))
Assert.AreEqual("\^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("\%NAME%"))
Assert.AreEqual("%NAME\%", externalTool.ParseArguments("%NAME\%"))
Assert.AreEqual("\\%NAME\\%", externalTool.ParseArguments("\\%NAME\\%"))
Assert.AreEqual("\\\%NAME\\\%", externalTool.ParseArguments("\\\%NAME\\\%"))
Assert.AreEqual("\\\\%NAME\\\\%", externalTool.ParseArguments("\\\\%NAME\\\\%"))
Assert.AreEqual("\\\\\%NAME\\\\\%", externalTool.ParseArguments("\\\\\%NAME\\\\\%"))
Assert.AreEqual("%NAME%", externalTool.ParseArguments("^%NAME^%"))
Assert.AreEqual("%-NAME%", externalTool.ParseArguments("^%-NAME^%"))
Assert.AreEqual("\%NAME\%", externalTool.ParseArguments("\^%NAME\^%"))
Assert.AreEqual("\%-NAME\%", externalTool.ParseArguments("\^%-NAME\^%"))
Assert.AreEqual("^%NAME^%", externalTool.ParseArguments("^^%NAME^^%"))
Assert.AreEqual("^%-NAME^%", externalTool.ParseArguments("^^%-NAME^^%"))
Assert.AreEqual("^^^^%NAME^^^^%", externalTool.ParseArguments("^^^^^%NAME^^^^^%"))
Assert.AreEqual("^^^^%-NAME^^^^%", externalTool.ParseArguments("^^^^^%-NAME^^^^^%"))
Assert.AreEqual("^^^^%!NAME^^^^%", externalTool.ParseArguments("^^^^^%!NAME^^^^^%"))
Assert.AreEqual("blah%blah", externalTool.ParseArguments("blah%blah"))
Assert.AreEqual("blah^%blah", externalTool.ParseArguments("blah^%blah"))
Assert.AreEqual("blah^^%blah", externalTool.ParseArguments("blah^^%blah"))
Assert.AreEqual("blah^^^%blah", externalTool.ParseArguments("blah^^^%blah"))
Assert.AreEqual("^^^^%-NAME^^^^% ^(^)^%^!^^\^""^<^>^&^|\\\^""\\", externalTool.ParseArguments("^^^^^%-NAME^^^^^% %NAME%"))
End Sub
End Class

View File

@@ -0,0 +1,37 @@
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices
' General Information about an assembly is controlled through the following
' set of attributes. Change these attribute values to modify the information
' associated with an assembly.
' Review the values of the assembly attributes
<Assembly: AssemblyTitle("TestProject")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("TestProject")>
<Assembly: AssemblyCopyright("Copyright © 2013")>
<Assembly: AssemblyTrademark("")>
<Assembly: CLSCompliant(True)>
<Assembly: ComVisible(False)>
'The following GUID is for the ID of the typelib if this project is exposed to COM
<Assembly: Guid("8918ad54-4841-44e9-abda-e1b787b02c7c")>
' Version information for an assembly consists of the following four values:
'
' Major Version
' Minor Version
' Build Number
' Revision
'
' You can specify all the values or you can default the Build and Revision Numbers
' by using the '*' as shown below:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.0.0.0")>
<Assembly: AssemblyFileVersion("1.0.0.0")>

View File

@@ -0,0 +1,2 @@
mRemoteNG.exe
Desktop

View File

@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>
</SchemaVersion>
<ProjectGuid>{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>TestProject</RootNamespace>
<AssemblyName>TestProject</AssemblyName>
<FileAlignment>512</FileAlignment>
<MyType>Windows</MyType>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{F184B08F-C81C-45F6-A57F-5ABD9991F28F}</ProjectTypeGuids>
<ReferencePath>$(DevEnvDir)PublicAssemblies\</ReferencePath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<DefineDebug>true</DefineDebug>
<DefineTrace>true</DefineTrace>
<OutputPath>bin\Debug\</OutputPath>
<DocumentationFile>TestProject.xml</DocumentationFile>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<DefineDebug>false</DefineDebug>
<DefineTrace>true</DefineTrace>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DocumentationFile>TestProject.xml</DocumentationFile>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup>
<OptionExplicit>On</OptionExplicit>
</PropertyGroup>
<PropertyGroup>
<OptionCompare>Binary</OptionCompare>
</PropertyGroup>
<PropertyGroup>
<OptionStrict>Off</OptionStrict>
</PropertyGroup>
<PropertyGroup>
<OptionInfer>On</OptionInfer>
</PropertyGroup>
<ItemGroup>
<Reference Include="ADTree">
<HintPath>..\mRemoteV1\References\ADTree.dll</HintPath>
</Reference>
<Reference Include="AxInterop.MSTSCLib">
<HintPath>..\mRemoteV1\obj\Debug\AxInterop.MSTSCLib.dll</HintPath>
</Reference>
<Reference Include="AxInterop.WFICALib">
<HintPath>..\mRemoteV1\obj\Debug\AxInterop.WFICALib.dll</HintPath>
</Reference>
<Reference Include="DiffieHellman">
<HintPath>..\mRemoteV1\References\DiffieHellman.dll</HintPath>
</Reference>
<Reference Include="FilteredPropertyGrid">
<HintPath>..\mRemoteV1\References\FilteredPropertyGrid.dll</HintPath>
</Reference>
<Reference Include="Interop.EOLWTSCOM">
<HintPath>..\mRemoteV1\obj\Debug\Interop.EOLWTSCOM.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
<Private>True</Private>
</Reference>
<Reference Include="Interop.MSTSCLib">
<HintPath>..\mRemoteV1\obj\Debug\Interop.MSTSCLib.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
<Private>True</Private>
</Reference>
<Reference Include="Interop.SHDocVw">
<HintPath>..\mRemoteV1\obj\Debug\Interop.SHDocVw.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
<Private>True</Private>
</Reference>
<Reference Include="Interop.WFICALib">
<HintPath>..\mRemoteV1\obj\Debug\Interop.WFICALib.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
<Private>True</Private>
</Reference>
<Reference Include="IPTextBox">
<HintPath>..\mRemoteV1\References\IPTextBox.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\mRemoteV1\References\log4net.dll</HintPath>
</Reference>
<Reference Include="MagicLibrary, Version=1.7.4.0, Culture=neutral, PublicKeyToken=3a6eb82f876a49bc">
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.VisualBasic.PowerPacks.Vs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="MiniGeckoBrowser">
<HintPath>..\mRemoteV1\References\MiniGeckoBrowser.dll</HintPath>
</Reference>
<Reference Include="MiniTabControl">
<HintPath>..\mRemoteV1\References\MiniTabControl.dll</HintPath>
</Reference>
<Reference Include="Org.Mentalis.Security">
<HintPath>..\mRemoteV1\References\Org.Mentalis.Security.dll</HintPath>
</Reference>
<Reference Include="PSTaskDialog">
<HintPath>..\mRemoteV1\References\PSTaskDialog.dll</HintPath>
</Reference>
<Reference Include="Skybound.Gecko">
<HintPath>..\mRemoteV1\References\Skybound.Gecko.dll</HintPath>
</Reference>
<Reference Include="stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<EmbedInteropTypes>False</EmbedInteropTypes>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management" />
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="Tamir.SharpSSH">
<HintPath>..\mRemoteV1\References\Tamir.SharpSSH.dll</HintPath>
</Reference>
<Reference Include="VncSharpNG">
<HintPath>..\mRemoteV1\References\VncSharpNG.dll</HintPath>
</Reference>
<Reference Include="WeifenLuo.WinFormsUI.Docking">
<HintPath>..\mRemoteV1\References\WeifenLuo.WinFormsUI.Docking.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Import Include="System" />
<Import Include="System.Collections" />
<Import Include="System.Collections.Generic" />
<Import Include="System.Data" />
<Import Include="System.Diagnostics" />
<Import Include="System.Linq" />
<Import Include="System.Xml.Linq" />
<Import Include="Microsoft.VisualBasic" />
<Import Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
<Visible>False</Visible>
</CodeAnalysisDependentAssemblyPaths>
</ItemGroup>
<ItemGroup>
<Compile Include="ExternalToolTest.vb" />
<Compile Include="My Project\AssemblyInfo.vb" />
</ItemGroup>
<ItemGroup>
<Shadow Include="Test References\mRemoteNG.accessor" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\mRemoteV1\mRemoteV1.vbproj">
<Project>{4934A491-40BC-4E5B-9166-EA1169A220F6}</Project>
<Name>mRemoteV1</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Trace and Test Impact" id="e062ce86-3357-43c9-b5c3-6b38a0dc3776" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Description>These are test settings for Trace and Test Impact.</Description>
<Execution>
<TestTypeSpecific />
<AgentRule name="Execution Agents">
<DataCollectors>
<DataCollector uri="datacollector://microsoft/SystemInfo/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo.SystemInfoDataCollector, Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="System Information">
</DataCollector>
<DataCollector uri="datacollector://microsoft/HttpProxy/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TraceCollector.HttpProxyCollector, Microsoft.VisualStudio.TraceCollector, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="ASP.NET Client Proxy for IntelliTrace and Test Impact">
</DataCollector>
<DataCollector uri="datacollector://microsoft/TestImpact/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TraceCollector.TestImpactDataCollector, Microsoft.VisualStudio.TraceCollector, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="Test Impact">
</DataCollector>
<DataCollector uri="datacollector://microsoft/TraceDebugger/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TraceCollector.TraceDebuggerDataCollector, Microsoft.VisualStudio.TraceCollector, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="IntelliTrace">
</DataCollector>
</DataCollectors>
</AgentRule>
</Execution>
</TestSettings>

View File

@@ -3,7 +3,21 @@ Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "mRemoteV1", "mRemoteV1\mRemoteV1.vbproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TestProject", "TestProject\TestProject.vbproj", "{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{38EB1EFD-C8C8-49A2-BCA7-63F7A02B3153}"
ProjectSection(SolutionItems) = preProject
Local.testsettings = Local.testsettings
mRemoteV1.vsmdi = mRemoteV1.vsmdi
TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedLibraryNG", "SharedLibraryNG\SharedLibraryNG.csproj", "{0F615504-5F30-4CF2-8341-1DE7FEC95A23}"
EndProject
Global
GlobalSection(TestCaseManagementSettings) = postSolution
CategoryFile = mRemoteV1.vsmdi
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug Portable|Any CPU = Debug Portable|Any CPU
Debug|Any CPU = Debug|Any CPU
@@ -19,6 +33,22 @@ Global
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|Any CPU.Build.0 = Release Portable|Any CPU
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|Any CPU.Build.0 = Release|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Debug Portable|Any CPU.ActiveCfg = Debug|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Debug Portable|Any CPU.Build.0 = Debug|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Debug|Any CPU.Build.0 = Debug|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Release Portable|Any CPU.ActiveCfg = Release|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Release Portable|Any CPU.Build.0 = Release|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Release|Any CPU.ActiveCfg = Release|Any CPU
{24E0689D-95C0-4AAB-A93F-B8D6B7F0CB97}.Release|Any CPU.Build.0 = Release|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Debug Portable|Any CPU.ActiveCfg = Debug|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Debug Portable|Any CPU.Build.0 = Debug|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Release Portable|Any CPU.ActiveCfg = Release|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Release Portable|Any CPU.Build.0 = Release|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0F615504-5F30-4CF2-8341-1DE7FEC95A23}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -0,0 +1,7 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeStyle/Naming/VBNaming/Abbreviations/=ICA/@EntryIndexedValue">ICA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/VBNaming/Abbreviations/=ID/@EntryIndexedValue">ID</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/VBNaming/Abbreviations/=IP/@EntryIndexedValue">IP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/VBNaming/Abbreviations/=RDP/@EntryIndexedValue">RDP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/VBNaming/Abbreviations/=VNC/@EntryIndexedValue">VNC</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/VBNaming/Abbreviations/=XML/@EntryIndexedValue">XML</s:String></wpf:ResourceDictionary>

6
mRemoteV1.vsmdi Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<TestLists xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<TestList name="Lists of Tests" id="8c43106b-9dc1-4907-a29f-aa66a61bf5b6">
<RunConfiguration id="2a25bb82-f5ff-4a67-b5e9-c6aaa54d1e80" name="Local" storage="local.testsettings" type="Microsoft.VisualStudio.TestTools.Common.TestRunConfiguration, Microsoft.VisualStudio.QualityTools.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</TestList>
</TestLists>

File diff suppressed because it is too large Load Diff

79
mRemoteV1/App/Export.vb Normal file
View File

@@ -0,0 +1,79 @@
Imports mRemoteNG.Forms
Imports mRemoteNG.App.Runtime
Namespace App
Public Class Export
Public Shared Sub ExportToFile(ByVal rootTreeNode As TreeNode, ByVal selectedTreeNode As TreeNode)
Try
Dim exportTreeNode As TreeNode
Dim saveSecurity As New Security.Save()
Using exportForm As New ExportForm()
With exportForm
Select Case Tree.Node.GetNodeType(selectedTreeNode)
Case Tree.Node.Type.Container
.SelectedFolder = selectedTreeNode
Case Tree.Node.Type.Connection
If Tree.Node.GetNodeType(selectedTreeNode.Parent) = Tree.Node.Type.Container Then
.SelectedFolder = selectedTreeNode.Parent
End If
.SelectedConnection = selectedTreeNode
End Select
If Not exportForm.ShowDialog(frmMain) = DialogResult.OK Then Return
Select Case .Scope
Case exportForm.ExportScope.SelectedFolder
exportTreeNode = .SelectedFolder
Case exportForm.ExportScope.SelectedConnection
exportTreeNode = .SelectedConnection
Case Else
exportTreeNode = rootTreeNode
End Select
saveSecurity.Username = .IncludeUsername
saveSecurity.Password = .IncludePassword
saveSecurity.Domain = .IncludeDomain
saveSecurity.Inheritance = .IncludeInheritance
End With
SaveExportFile(exportForm.FileName, exportForm.SaveFormat, exportTreeNode, saveSecurity)
End Using
Catch ex As Exception
MessageCollector.AddExceptionMessage("App.Export.ExportToFile() failed.", ex, , True)
End Try
End Sub
Private Shared Sub SaveExportFile(ByVal fileName As String, ByVal saveFormat As Config.Connections.Save.Format, ByVal rootNode As TreeNode, ByVal saveSecurity As Security.Save)
Dim previousTimerEnabled As Boolean = False
Try
If TimerSqlWatcher IsNot Nothing Then
previousTimerEnabled = TimerSqlWatcher.Enabled
TimerSqlWatcher.Enabled = False
End If
Dim connectionsSave As New Config.Connections.Save
With connectionsSave
.Export = True
.ConnectionFileName = fileName
.SaveFormat = saveFormat
.ConnectionList = ConnectionList
.ContainerList = ContainerList
.RootTreeNode = rootNode
.SaveSecurity = saveSecurity
End With
connectionsSave.Save()
Catch ex As Exception
MessageCollector.AddExceptionMessage(String.Format("Export.SaveExportFile(""{0}"") failed.", fileName), ex)
Finally
If TimerSqlWatcher IsNot Nothing Then
TimerSqlWatcher.Enabled = previousTimerEnabled
End If
End Try
End Sub
End Class
End Namespace

171
mRemoteV1/App/Import.vb Normal file
View File

@@ -0,0 +1,171 @@
Imports System.Windows.Forms
Imports System.IO
Imports mRemoteNG.My
Imports mRemoteNG.App.Runtime
Imports PSTaskDialog
Namespace App
Public Class Import
#Region "Public Methods"
Public Shared Sub ImportFromFile(ByVal rootTreeNode As TreeNode, ByVal selectedTreeNode As TreeNode, Optional ByVal alwaysUseSelectedTreeNode As Boolean = False)
Try
Using openFileDialog As New OpenFileDialog()
With openFileDialog
.CheckFileExists = True
.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
.Multiselect = True
Dim fileTypes As New List(Of String)
fileTypes.AddRange({Language.strFilterAllImportable, "*.xml;*.rdp;*.rdg;*.dat"})
fileTypes.AddRange({Language.strFiltermRemoteXML, "*.xml"})
fileTypes.AddRange({Language.strFilterRDP, "*.rdp"})
fileTypes.AddRange({Language.strFilterRdgFiles, "*.rdg"})
fileTypes.AddRange({Language.strFilterPuttyConnectionManager, "*.dat"})
fileTypes.AddRange({Language.strFilterAll, "*.*"})
.Filter = String.Join("|", fileTypes.ToArray())
End With
If Not openFileDialog.ShowDialog = DialogResult.OK Then Return
Dim parentTreeNode As TreeNode = GetParentTreeNode(rootTreeNode, selectedTreeNode, alwaysUseSelectedTreeNode)
If parentTreeNode Is Nothing Then Return
For Each fileName As String In openFileDialog.FileNames
Try
Select Case DetermineFileType(fileName)
Case FileType.mRemoteXml
Config.Import.mRemoteNG.Import(fileName, parentTreeNode)
Case FileType.RemoteDesktopConnection
Config.Import.RemoteDesktopConnection.Import(fileName, parentTreeNode)
Case FileType.RemoteDesktopConnectionManager
Config.Import.RemoteDesktopConnectionManager.Import(fileName, parentTreeNode)
Case FileType.PuttyConnectionManager
Config.Import.PuttyConnectionManager.Import(fileName, parentTreeNode)
Case Else
Throw New FileFormatException("Unrecognized file format.")
End Select
Catch ex As Exception
cTaskDialog.ShowTaskDialogBox(Application.ProductName, Language.strImportFileFailedMainInstruction, String.Format(Language.strImportFileFailedContent, fileName), Tools.Misc.GetExceptionMessageRecursive(ex), "", "", "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
End Try
Next
parentTreeNode.Expand()
Dim parentContainer As Container.Info = TryCast(parentTreeNode.Tag, Container.Info)
If parentContainer IsNot Nothing Then parentContainer.IsExpanded = True
SaveConnectionsBG()
End Using
Catch ex As Exception
MessageCollector.AddExceptionMessage("App.Import.ImportFromFile() failed.", ex, , True)
End Try
End Sub
Public Shared Sub ImportFromActiveDirectory(ByVal ldapPath As String)
Try
Dim rootTreeNode As TreeNode = Tree.Node.TreeView.Nodes(0)
Dim selectedTreeNode As TreeNode = Tree.Node.TreeView.SelectedNode
Dim parentTreeNode As TreeNode = GetParentTreeNode(rootTreeNode, selectedTreeNode)
If parentTreeNode Is Nothing Then Return
Config.Import.ActiveDirectory.Import(ldapPath, parentTreeNode)
parentTreeNode.Expand()
Dim parentContainer As Container.Info = TryCast(parentTreeNode.Tag, Container.Info)
If parentContainer IsNot Nothing Then parentContainer.IsExpanded = True
SaveConnectionsBG()
Catch ex As Exception
MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex, , True)
End Try
End Sub
Public Shared Sub ImportFromPortScan(ByVal hosts As IEnumerable, ByVal protocol As Connection.Protocol.Protocols)
Try
Dim rootTreeNode As TreeNode = Tree.Node.TreeView.Nodes(0)
Dim selectedTreeNode As TreeNode = Tree.Node.TreeView.SelectedNode
Dim parentTreeNode As TreeNode = GetParentTreeNode(rootTreeNode, selectedTreeNode)
If parentTreeNode Is Nothing Then Return
Config.Import.PortScan.Import(hosts, protocol, parentTreeNode)
parentTreeNode.Expand()
Dim parentContainer As Container.Info = TryCast(parentTreeNode.Tag, Container.Info)
If parentContainer IsNot Nothing Then parentContainer.IsExpanded = True
SaveConnectionsBG()
Catch ex As Exception
MessageCollector.AddExceptionMessage("App.Import.ImportFromPortScan() failed.", ex, , True)
End Try
End Sub
#End Region
#Region "Private Methods"
Private Shared Function GetParentTreeNode(ByVal rootTreeNode As TreeNode, ByVal selectedTreeNode As TreeNode, Optional ByVal alwaysUseSelectedTreeNode As Boolean = False) As TreeNode
Dim parentTreeNode As TreeNode
selectedTreeNode = GetContainerTreeNode(selectedTreeNode)
If selectedTreeNode Is Nothing OrElse selectedTreeNode Is rootTreeNode Then
parentTreeNode = rootTreeNode
Else
If alwaysUseSelectedTreeNode Then
parentTreeNode = GetContainerTreeNode(selectedTreeNode)
Else
cTaskDialog.ShowCommandBox(Application.ProductName, Language.strImportLocationMainInstruction, Language.strImportLocationContent, "", "", "", String.Format(Language.strImportLocationCommandButtons, vbLf, rootTreeNode.Text, selectedTreeNode.Text), True, eSysIcons.Question, 0)
Select Case cTaskDialog.CommandButtonResult
Case 0 ' Root
parentTreeNode = rootTreeNode
Case 1 ' Selected Folder
parentTreeNode = GetContainerTreeNode(selectedTreeNode)
Case Else ' Cancel
parentTreeNode = Nothing
End Select
End If
End If
Return parentTreeNode
End Function
Private Shared Function GetContainerTreeNode(ByVal treeNode As TreeNode) As TreeNode
Select Case Tree.Node.GetNodeType(treeNode)
Case Tree.Node.Type.Root, Tree.Node.Type.Container
Return treeNode
Case Tree.Node.Type.Connection
Return treeNode.Parent
Case Else
Return Nothing
End Select
End Function
Private Shared Function DetermineFileType(ByVal fileName As String) As FileType
' TODO: Use the file contents to determine the file type instead of trusting the extension
Dim fileExtension As String = Path.GetExtension(fileName).ToLowerInvariant()
Select Case fileExtension
Case ".xml"
Return FileType.mRemoteXml
Case ".rdp"
Return FileType.RemoteDesktopConnection
Case ".rdg"
Return FileType.RemoteDesktopConnectionManager
Case ".dat"
Return FileType.PuttyConnectionManager
Case Else
Return FileType.Unknown
End Select
End Function
#End Region
#Region "Private Enumerations"
Private Enum FileType As Integer
Unknown = 0
' ReSharper disable once InconsistentNaming
mRemoteXml
RemoteDesktopConnection
RemoteDesktopConnectionManager
PuttyConnectionManager
End Enum
#End Region
End Class
End Namespace

View File

@@ -5,6 +5,7 @@ Imports mRemoteNG.App.Runtime
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports mRemoteNG.My
Imports PSTaskDialog
Namespace Config
@@ -19,7 +20,7 @@ Namespace Config
Private sqlQuery As SqlCommand
Private sqlRd As SqlDataReader
Private selNode As TreeNode
Private _selectedTreeNode As TreeNode
#End Region
#Region "Public Properties"
@@ -103,25 +104,9 @@ Namespace Config
End Set
End Property
Private _RootTreeNode As TreeNode
Public Property RootTreeNode() As TreeNode
Get
Return Me._RootTreeNode
End Get
Set(ByVal value As TreeNode)
Me._RootTreeNode = value
End Set
End Property
Private _ConnectionList As Connection.List
Public Property ConnectionList() As Connection.List
Get
Return Me._ConnectionList
End Get
Set(ByVal value As Connection.List)
Me._ConnectionList = value
End Set
End Property
Private _ContainerList As Container.List
Public Property ContainerList() As Container.List
@@ -156,18 +141,17 @@ Namespace Config
#Region "Public Methods"
Public Sub Load(ByVal import As Boolean)
If _UseSQL = True Then
If UseSQL Then
LoadFromSQL()
SetMainFormText("SQL Server")
Else
Dim strCons As String = DecryptCompleteFile()
LoadFromXML(strCons, import)
Dim connections As String = DecryptCompleteFile()
LoadFromXML(connections, import)
End If
If import = False Then
SetMainFormText(ConnectionFileName)
PuttySessions.AddSessionsToTree()
End If
frmMain.UsingSqlServer = UseSQL
frmMain.ConnectionsFileName = ConnectionFileName
If Not import Then Putty.Sessions.AddSessionsToTree()
End Sub
#End Region
@@ -181,7 +165,7 @@ Namespace Config
End If
Try
App.Runtime.IsConnectionsFileLoaded = False
IsConnectionsFileLoaded = False
If _SQLUsername <> "" Then
sqlCon = New SqlConnection("Data Source=" & _SQLHost & ";Initial Catalog=" & _SQLDatabaseName & ";User Id=" & _SQLUsername & ";Password=" & _SQLPassword)
@@ -197,7 +181,7 @@ Namespace Config
sqlRd.Read()
If sqlRd.HasRows = False Then
App.Runtime.SaveConnections()
SaveConnections()
sqlQuery = New SqlCommand("SELECT * FROM tblRoot", sqlCon)
sqlRd = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection)
@@ -212,40 +196,33 @@ Namespace Config
Throw New Exception(String.Format("Incompatible database schema (schema version {0}).", confVersion))
End If
Dim rootNode As TreeNode
rootNode = New TreeNode(sqlRd.Item("Name"))
RootTreeNode.Name = sqlRd.Item("Name")
Dim rInfo As New Root.Info(Root.Info.RootType.Connection)
rInfo.Name = rootNode.Text
rInfo.TreeNode = rootNode
Dim rootInfo As New Root.Info(Root.Info.RootType.Connection)
rootInfo.Name = RootTreeNode.Name
rootInfo.TreeNode = RootTreeNode
rootNode.Tag = rInfo
rootNode.ImageIndex = Images.Enums.TreeImage.Root
rootNode.SelectedImageIndex = Images.Enums.TreeImage.Root
RootTreeNode.Tag = rootInfo
RootTreeNode.ImageIndex = Images.Enums.TreeImage.Root
RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
If Security.Crypt.Decrypt(sqlRd.Item("Protected"), pW) <> "ThisIsNotProtected" Then
If Authenticate(sqlRd.Item("Protected"), False, rInfo) = False Then
If Authenticate(sqlRd.Item("Protected"), False, rootInfo) = False Then
My.Settings.LoadConsFromCustomLocation = False
My.Settings.CustomConsPath = ""
rootNode.Remove()
RootTreeNode.Remove()
Exit Sub
End If
End If
'Me._RootTreeNode.Text = rootNode.Text
'Me._RootTreeNode.Tag = rootNode.Tag
'Me._RootTreeNode.ImageIndex = Images.Enums.TreeImage.Root
'Me._RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
sqlRd.Close()
Windows.treeForm.tvConnections.BeginUpdate()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodesFromSQL(rootNode)
'AddNodeFromXml(xDom.DocumentElement, Me._RootTreeNode)
AddNodesFromSQL(RootTreeNode)
rootNode.Expand()
RootTreeNode.Expand()
'expand containers
For Each contI As Container.Info In Me._ContainerList
@@ -258,21 +235,16 @@ Namespace Config
'open connections from last mremote session
If My.Settings.OpenConsFromLastSession = True And My.Settings.NoReconnect = False Then
For Each conI As Connection.Info In Me._ConnectionList
For Each conI As Connection.Info In ConnectionList
If conI.PleaseConnect = True Then
App.Runtime.OpenConnection(conI)
OpenConnection(conI)
End If
Next
End If
'Tree.Node.TreeView.Nodes.Clear()
'Tree.Node.TreeView.Nodes.Add(rootNode)
AddNodeToTree(rootNode)
SetSelectedNode(selNode)
App.Runtime.IsConnectionsFileLoaded = True
'App.Runtime.Windows.treeForm.InitialRefresh()
IsConnectionsFileLoaded = True
Windows.treeForm.InitialRefresh()
SetSelectedNode(_selectedTreeNode)
Catch ex As Exception
Throw
Finally
@@ -282,29 +254,15 @@ Namespace Config
End Try
End Sub
Private Delegate Sub AddNodeToTreeCB(ByVal TreeNode As TreeNode)
Private Sub AddNodeToTree(ByVal TreeNode As TreeNode)
If Tree.Node.TreeView.InvokeRequired Then
Dim d As New AddNodeToTreeCB(AddressOf AddNodeToTree)
App.Runtime.Windows.treeForm.Invoke(d, New Object() {TreeNode})
Else
App.Runtime.Windows.treeForm.tvConnections.Nodes.Clear()
App.Runtime.Windows.treeForm.tvConnections.Nodes.Add(TreeNode)
App.Runtime.Windows.treeForm.InitialRefresh()
Private Delegate Sub SetSelectedNodeDelegate(ByVal treeNode As TreeNode)
Private Shared Sub SetSelectedNode(ByVal treeNode As TreeNode)
If Tree.Node.TreeView IsNot Nothing AndAlso Tree.Node.TreeView.InvokeRequired Then
Windows.treeForm.Invoke(New SetSelectedNodeDelegate(AddressOf SetSelectedNode), New Object() {treeNode})
Return
End If
Windows.treeForm.tvConnections.SelectedNode = treeNode
End Sub
Private Delegate Sub SetSelectedNodeCB(ByVal TreeNode As TreeNode)
Private Sub SetSelectedNode(ByVal TreeNode As TreeNode)
If Tree.Node.TreeView.InvokeRequired Then
Dim d As New SetSelectedNodeCB(AddressOf SetSelectedNode)
App.Runtime.Windows.treeForm.Invoke(d, New Object() {TreeNode})
Else
App.Runtime.Windows.treeForm.tvConnections.SelectedNode = TreeNode
End If
End Sub
Private Sub AddNodesFromSQL(ByVal baseNode As TreeNode)
Try
sqlCon.Open()
@@ -352,7 +310,7 @@ Namespace Config
End If
If conI.ConstantID = _PreviousSelected Then
selNode = tNode
_selectedTreeNode = tNode
End If
Else
tNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
@@ -385,7 +343,7 @@ Namespace Config
End If
If conI.ConstantID = _PreviousSelected Then
selNode = tNode
_selectedTreeNode = tNode
End If
Else
If sqlRd.Item("Expanded") = True Then
@@ -646,7 +604,7 @@ Namespace Config
Private Sub LoadFromXML(ByVal cons As String, ByVal import As Boolean)
Try
App.Runtime.IsConnectionsFileLoaded = False
If Not import Then IsConnectionsFileLoaded = False
' SECTION 1. Create a DOM Document and load the XML data into it.
Me.xDom = New XmlDocument()
@@ -669,28 +627,32 @@ Namespace Config
End If
' SECTION 2. Initialize the treeview control.
Dim rootNode As TreeNode
Dim rootNodeName As String = ""
If xDom.DocumentElement.HasAttribute("Name") Then rootNodeName = xDom.DocumentElement.Attributes("Name").Value.Trim()
If Not String.IsNullOrEmpty(rootNodeName) Then
rootNode = New TreeNode(rootNodeName)
Dim rootInfo As Root.Info
If import Then
rootInfo = Nothing
Else
rootNode = New TreeNode(xDom.DocumentElement.Name)
Dim rootNodeName As String = ""
If xDom.DocumentElement.HasAttribute("Name") Then rootNodeName = xDom.DocumentElement.Attributes("Name").Value.Trim()
If Not String.IsNullOrEmpty(rootNodeName) Then
RootTreeNode.Name = rootNodeName
Else
RootTreeNode.Name = xDom.DocumentElement.Name
End If
RootTreeNode.Text = RootTreeNode.Name
rootInfo = New Root.Info(Root.Info.RootType.Connection)
rootInfo.Name = RootTreeNode.Name
rootInfo.TreeNode = RootTreeNode
RootTreeNode.Tag = rootInfo
End If
Dim rInfo As New Root.Info(Root.Info.RootType.Connection)
rInfo.Name = rootNode.Text
rInfo.TreeNode = rootNode
rootNode.Tag = rInfo
If Me.confVersion > 1.3 Then '1.4
If Security.Crypt.Decrypt(xDom.DocumentElement.Attributes("Protected").Value, pW) <> "ThisIsNotProtected" Then
If Authenticate(xDom.DocumentElement.Attributes("Protected").Value, False, rInfo) = False Then
If Authenticate(xDom.DocumentElement.Attributes("Protected").Value, False, rootInfo) = False Then
My.Settings.LoadConsFromCustomLocation = False
My.Settings.CustomConsPath = ""
_RootTreeNode.Remove()
RootTreeNode.Remove()
Exit Sub
End If
End If
@@ -709,18 +671,16 @@ Namespace Config
End If
If Not isExportFile Then
_RootTreeNode.Text = rootNode.Text
_RootTreeNode.Tag = rootNode.Tag
_RootTreeNode.ImageIndex = Images.Enums.TreeImage.Root
_RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
RootTreeNode.ImageIndex = Images.Enums.TreeImage.Root
RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
End If
Windows.treeForm.tvConnections.BeginUpdate()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodeFromXml(xDom.DocumentElement, _RootTreeNode)
AddNodeFromXml(xDom.DocumentElement, RootTreeNode)
Me._RootTreeNode.Expand()
RootTreeNode.Expand()
'expand containers
For Each contI As Container.Info In Me._ContainerList
@@ -733,18 +693,18 @@ Namespace Config
'open connections from last mremote session
If My.Settings.OpenConsFromLastSession = True And My.Settings.NoReconnect = False Then
For Each conI As Connection.Info In Me._ConnectionList
For Each conI As Connection.Info In _ConnectionList
If conI.PleaseConnect = True Then
App.Runtime.OpenConnection(conI)
OpenConnection(conI)
End If
Next
End If
Me._RootTreeNode.EnsureVisible()
RootTreeNode.EnsureVisible()
App.Runtime.IsConnectionsFileLoaded = True
App.Runtime.Windows.treeForm.InitialRefresh()
If Not import Then IsConnectionsFileLoaded = True
Windows.treeForm.InitialRefresh()
SetSelectedNode(RootTreeNode)
Catch ex As Exception
App.Runtime.IsConnectionsFileLoaded = False
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLoadFromXmlFailed & vbNewLine & ex.Message & vbNewLine & ex.StackTrace, True)
@@ -760,7 +720,7 @@ Namespace Config
If parentXmlNode.HasChildNodes() Then
For Each xmlNode As XmlNode In parentXmlNode.ChildNodes
Dim treeNode As TreeNode = New TreeNode(xmlNode.Attributes("Name").Value)
parentTreeNode.Nodes.Add(TreeNode)
parentTreeNode.Nodes.Add(treeNode)
If Tree.Node.GetNodeTypeFromString(xmlNode.Attributes("Type").Value) = Tree.Node.Type.Connection Then 'connection info
Dim connectionInfo As Connection.Info = GetConnectionInfoFromXml(xmlNode)
@@ -1077,10 +1037,17 @@ Namespace Config
Return conI
End Function
Private Function Authenticate(ByVal Value As String, ByVal CompareToOriginalValue As Boolean, Optional ByVal RootInfo As mRemoteNG.Root.Info = Nothing) As Boolean
Private Function Authenticate(ByVal Value As String, ByVal CompareToOriginalValue As Boolean, Optional ByVal rootInfo As Root.Info = Nothing) As Boolean
Dim passwordName As String
If UseSQL Then
passwordName = Language.strSQLServer.TrimEnd(":")
Else
passwordName = Path.GetFileName(ConnectionFileName)
End If
If CompareToOriginalValue Then
Do Until Security.Crypt.Decrypt(Value, pW) <> Value
pW = Tools.Misc.PasswordDialog(False)
pW = Tools.Misc.PasswordDialog(passwordName, False)
If pW = "" Then
Return False
@@ -1088,15 +1055,17 @@ Namespace Config
Loop
Else
Do Until Security.Crypt.Decrypt(Value, pW) = "ThisIsProtected"
pW = Tools.Misc.PasswordDialog(False)
pW = Tools.Misc.PasswordDialog(passwordName, False)
If pW = "" Then
Return False
End If
Loop
RootInfo.Password = True
RootInfo.PasswordString = pW
If rootInfo IsNot Nothing Then
rootInfo.Password = True
rootInfo.PasswordString = pW
End If
End If
Return True

View File

@@ -51,7 +51,6 @@ Namespace Config
Select Case SaveFormat
Case Format.SQL
SaveToSQL()
SetMainFormText("SQL Server")
Case Format.mRCSV
SaveTomRCSV()
Case Format.vRDvRE
@@ -63,8 +62,9 @@ Namespace Config
If My.Settings.EncryptCompleteConnectionsFile Then
EncryptCompleteFile()
End If
If Not _Export Then SetMainFormText(ConnectionFileName)
If Not Export Then frmMain.ConnectionsFileName = ConnectionFileName
End Select
frmMain.UsingSqlServer = (SaveFormat = Format.SQL)
End Sub
#End Region
@@ -526,10 +526,14 @@ Namespace Config
_xmlTextWriter.WriteEndElement()
_xmlTextWriter.Close()
If Not Export And File.Exists(ConnectionFileName) Then
Dim backupFileName As String = ConnectionFileName & ".backup"
File.Delete(backupFileName)
File.Move(ConnectionFileName, backupFileName)
If File.Exists(ConnectionFileName) Then
If Export Then
File.Delete(ConnectionFileName)
Else
Dim backupFileName As String = ConnectionFileName & ".backup"
File.Delete(backupFileName)
File.Move(ConnectionFileName, backupFileName)
End If
End If
File.Move(tempFileName, ConnectionFileName)
Catch ex As Exception

View File

@@ -6,7 +6,7 @@ Namespace Config
Namespace Settings
Public Class Save
#Region "Public Methods"
Public Sub Save()
Public Shared Sub Save()
Try
With frmMain
Dim windowPlacement As New Tools.WindowPlacement(frmMain)
@@ -50,14 +50,14 @@ Namespace Config
My.Settings.Save()
End With
Me.SavePanelsToXML()
Me.SaveExternalAppsToXML()
SavePanelsToXML()
SaveExternalAppsToXML()
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Saving settings failed" & vbNewLine & vbNewLine & ex.Message, False)
End Try
End Sub
Public Sub SavePanelsToXML()
Public Shared Sub SavePanelsToXML()
Try
If Directory.Exists(App.Info.Settings.SettingsPath) = False Then
Directory.CreateDirectory(App.Info.Settings.SettingsPath)
@@ -69,7 +69,7 @@ Namespace Config
End Try
End Sub
Public Sub SaveExternalAppsToXML()
Public Shared Sub SaveExternalAppsToXML()
Try
If Directory.Exists(App.Info.Settings.SettingsPath) = False Then
Directory.CreateDirectory(App.Info.Settings.SettingsPath)

View File

@@ -0,0 +1,97 @@
Imports System.DirectoryServices
Imports mRemoteNG.App.Runtime
Imports System.Text.RegularExpressions
Imports mRemoteNG.My
Namespace Config.Import
Public Class ActiveDirectory
Public Shared Sub Import(ByVal ldapPath As String, ByVal parentTreeNode As TreeNode)
Try
Dim treeNode As TreeNode = Tree.Node.AddNode(Tree.Node.Type.Container)
Dim containerInfo As New Container.Info()
containerInfo.TreeNode = treeNode
containerInfo.ConnectionInfo = New Connection.Info(containerInfo)
Dim name As String
Dim match As Match = Regex.Match(ldapPath, "ou=([^,]*)", RegexOptions.IgnoreCase)
If match.Success Then
name = match.Groups(1).Captures(0).Value
Else
name = Language.strActiveDirectory
End If
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 Then
containerInfo.Parent = parentTreeNode.Tag
Else
containerInfo.ConnectionInfo.Inherit.TurnOffInheritanceCompletely()
End If
treeNode.Text = name
treeNode.Name = name
treeNode.Tag = containerInfo
ContainerList.Add(containerInfo)
ImportComputers(ldapPath, treeNode)
parentTreeNode.Nodes.Add(treeNode)
Catch ex As Exception
MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.Import() failed.", ex, , True)
End Try
End Sub
Private Shared Sub ImportComputers(ByVal ldapPath As String, ByVal parentTreeNode As TreeNode)
Try
Dim strDisplayName, strDescription, strHostName As String
Const ldapFilter As String = "(objectClass=computer)"
Dim ldapSearcher As New DirectorySearcher
Dim ldapResults As SearchResultCollection
Dim ldapResult As SearchResult
With ldapSearcher
.SearchRoot = New DirectoryEntry(ldapPath)
.PropertiesToLoad.AddRange({"securityEquals", "cn"})
.Filter = ldapFilter
.SearchScope = SearchScope.OneLevel
End With
ldapResults = ldapSearcher.FindAll()
For Each ldapResult In ldapResults
With ldapResult.GetDirectoryEntry()
strDisplayName = .Properties("cn").Value
strDescription = .Properties("Description").Value
strHostName = .Properties("dNSHostName").Value
End With
Dim treeNode As TreeNode = Tree.Node.AddNode(Tree.Node.Type.Connection, strDisplayName)
Dim connectionInfo As New Connection.Info()
Dim inheritanceInfo As New Connection.Info.Inheritance(connectionInfo, True)
inheritanceInfo.Description = False
If TypeOf parentTreeNode.Tag Is Container.Info Then
connectionInfo.Parent = parentTreeNode.Tag
End If
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)
Next
Catch ex As Exception
MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.ImportComputers() failed.", ex, , True)
End Try
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,72 @@
Imports mRemoteNG.App.Runtime
Namespace Config.Import
Public Class PortScan
Public Shared Sub Import(ByVal hosts As IEnumerable, ByVal protocol As Connection.Protocol.Protocols, ByVal parentTreeNode As TreeNode)
For Each host As Tools.PortScan.ScanHost In hosts
Dim finalProtocol As Connection.Protocol.Protocols
Dim protocolValid As Boolean = False
Dim treeNode As TreeNode = Tree.Node.AddNode(Tree.Node.Type.Connection, host.HostNameWithoutDomain)
Dim connectionInfo As New Connection.Info()
connectionInfo.Inherit = New Connection.Info.Inheritance(connectionInfo)
connectionInfo.Name = host.HostNameWithoutDomain
connectionInfo.Hostname = host.HostName
Select Case protocol
Case Connection.Protocol.Protocols.SSH2
If host.SSH Then
finalProtocol = Connection.Protocol.Protocols.SSH2
protocolValid = True
End If
Case Connection.Protocol.Protocols.Telnet
If host.Telnet Then
finalProtocol = Connection.Protocol.Protocols.Telnet
protocolValid = True
End If
Case Connection.Protocol.Protocols.HTTP
If host.HTTP Then
finalProtocol = Connection.Protocol.Protocols.HTTP
protocolValid = True
End If
Case Connection.Protocol.Protocols.HTTPS
If host.HTTPS Then
finalProtocol = Connection.Protocol.Protocols.HTTPS
protocolValid = True
End If
Case Connection.Protocol.Protocols.Rlogin
If host.Rlogin Then
finalProtocol = Connection.Protocol.Protocols.Rlogin
protocolValid = True
End If
Case Connection.Protocol.Protocols.RDP
If host.RDP Then
finalProtocol = Connection.Protocol.Protocols.RDP
protocolValid = True
End If
Case Connection.Protocol.Protocols.VNC
If host.VNC Then
finalProtocol = Connection.Protocol.Protocols.VNC
protocolValid = True
End If
End Select
If protocolValid Then
connectionInfo.Protocol = finalProtocol
connectionInfo.SetDefaultPort()
treeNode.Tag = connectionInfo
parentTreeNode.Nodes.Add(treeNode)
If TypeOf parentTreeNode.Tag Is Container.Info Then
connectionInfo.Parent = parentTreeNode.Tag
End If
ConnectionList.Add(connectionInfo)
End If
Next
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,160 @@
Imports System.Xml
Imports System.IO
Imports mRemoteNG.App.Runtime
Imports mRemoteNG.Connection.Protocol
Namespace Config.Import
Public Class PuttyConnectionManager
Public Shared Sub Import(ByVal fileName As String, ByVal parentTreeNode As TreeNode)
Dim xmlDocument As New XmlDocument()
xmlDocument.Load(fileName)
Dim configurationNode As XmlNode = xmlDocument.SelectSingleNode("/configuration")
'Dim version As New Version(configurationNode.Attributes("version").Value)
'If Not version = New Version(0, 7, 1, 136) Then
' Throw New FileFormatException(String.Format("Unsupported file version ({0}).", version))
'End If
For Each rootNode As XmlNode In configurationNode.SelectNodes("./root")
ImportRootOrContainer(rootNode, parentTreeNode)
Next
End Sub
Private Shared Sub ImportRootOrContainer(ByVal xmlNode As XmlNode, ByVal parentTreeNode As TreeNode)
Dim xmlNodeType As String = xmlNode.Attributes("type").Value
Select Case xmlNode.Name
Case "root"
If Not String.Compare(xmlNodeType, "database", ignoreCase:=True) = 0 Then
Throw New FileFormatException(String.Format("Unrecognized root node type ({0}).", xmlNodeType))
End If
Case "container"
If Not String.Compare(xmlNodeType, "folder", ignoreCase:=True) = 0 Then
Throw New FileFormatException(String.Format("Unrecognized root node type ({0}).", xmlNodeType))
End If
Case Else
' ReSharper disable once LocalizableElement
Throw New ArgumentException("Argument must be either a root or a container node.", "xmlNode")
End Select
If parentTreeNode Is Nothing Then
Throw New InvalidOperationException("parentInfo.TreeNode must not be null.")
End If
Dim name As String = xmlNode.Attributes("name").Value
Dim treeNode As New TreeNode(name)
parentTreeNode.Nodes.Add(treeNode)
Dim containerInfo As New Container.Info
containerInfo.TreeNode = treeNode
containerInfo.Name = name
Dim connectionInfo As Connection.Info = CreateConnectionInfo(name)
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 Then
containerInfo.Parent = parentTreeNode.Tag
Else
connectionInfo.Inherit.TurnOffInheritanceCompletely()
End If
treeNode.Name = name
treeNode.Tag = containerInfo
treeNode.ImageIndex = Images.Enums.TreeImage.Container
treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container
For Each childNode As XmlNode In xmlNode.SelectNodes("./*")
Select Case childNode.Name
Case "container"
ImportRootOrContainer(childNode, treeNode)
Case "connection"
ImportConnection(childNode, treeNode)
Case Else
Throw New FileFormatException(String.Format("Unrecognized child node ({0}).", childNode.Name))
End Select
Next
containerInfo.IsExpanded = xmlNode.Attributes("expanded").InnerText
If containerInfo.IsExpanded Then treeNode.Expand()
ContainerList.Add(containerInfo)
End Sub
Private Shared Sub ImportConnection(ByVal connectionNode As XmlNode, ByVal parentTreeNode As TreeNode)
Dim connectionNodeType As String = connectionNode.Attributes("type").Value
If Not String.Compare(connectionNodeType, "PuTTY", ignoreCase:=True) = 0 Then
Throw New FileFormatException(String.Format("Unrecognized connection node type ({0}).", connectionNodeType))
End If
Dim name As String = connectionNode.Attributes("name").Value
Dim treeNode As New TreeNode(name)
parentTreeNode.Nodes.Add(treeNode)
Dim connectionInfo As Connection.Info = ConnectionInfoFromXml(connectionNode)
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)
End Sub
Private Shared Function CreateConnectionInfo(ByVal name As String) As Connection.Info
Dim connectionInfo As New Connection.Info
connectionInfo.Inherit = New Connection.Info.Inheritance(connectionInfo)
connectionInfo.Name = name
Return connectionInfo
End Function
Private Shared Function ConnectionInfoFromXml(ByVal xmlNode As XmlNode) As Connection.Info
Dim connectionInfoNode As XmlNode = xmlNode.SelectSingleNode("./connection_info")
Dim name As String = connectionInfoNode.SelectSingleNode("./name").InnerText
Dim connectionInfo As Connection.Info = CreateConnectionInfo(name)
Dim protocol As String = connectionInfoNode.SelectSingleNode("./protocol").InnerText
Select Case protocol.ToLowerInvariant()
Case "telnet"
connectionInfo.Protocol = Protocols.Telnet
Case "ssh"
connectionInfo.Protocol = Protocols.SSH2
Case Else
Throw New FileFormatException(String.Format("Unrecognized protocol ({0}).", protocol))
End Select
connectionInfo.Hostname = connectionInfoNode.SelectSingleNode("./host").InnerText
connectionInfo.Port = connectionInfoNode.SelectSingleNode("./port").InnerText
connectionInfo.PuttySession = connectionInfoNode.SelectSingleNode("./session").InnerText
' ./commandline
connectionInfo.Description = connectionInfoNode.SelectSingleNode("./description").InnerText
Dim loginNode As XmlNode = xmlNode.SelectSingleNode("./login")
connectionInfo.Username = loginNode.SelectSingleNode("login").InnerText
connectionInfo.Password = loginNode.SelectSingleNode("password").InnerText
' ./prompt
' ./timeout/connectiontimeout
' ./timeout/logintimeout
' ./timeout/passwordtimeout
' ./timeout/commandtimeout
' ./command/command1
' ./command/command2
' ./command/command3
' ./command/command4
' ./command/command5
' ./options/loginmacro
' ./options/postcommands
' ./options/endlinechar
Return connectionInfo
End Function
End Class
End Namespace

View File

@@ -0,0 +1,141 @@
Imports System.IO
Imports mRemoteNG.App.Runtime
Namespace Config.Import
Public Class RemoteDesktopConnection
Public Shared Sub Import(ByVal fileName As String, ByVal parentTreeNode As TreeNode)
Dim lines As String() = File.ReadAllLines(fileName)
Dim name As String = Path.GetFileNameWithoutExtension(fileName)
Dim treeNode As TreeNode = New TreeNode(name)
parentTreeNode.Nodes.Add(treeNode)
Dim connectionInfo As New Connection.Info
connectionInfo.Inherit = New Connection.Info.Inheritance(connectionInfo)
connectionInfo.Name = name
connectionInfo.TreeNode = treeNode
If TypeOf treeNode.Parent.Tag Is Container.Info Then
connectionInfo.Parent = treeNode.Parent.Tag
End If
treeNode.Name = name
treeNode.Tag = connectionInfo
treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed
For Each line As String In lines
Dim parts() As String = line.Split(New Char() {":"}, 3)
If parts.Length < 3 Then Continue For
Dim key As String = parts(0)
Dim value As String = parts(2)
SetConnectionInfoParameter(connectionInfo, key, value)
Next
ConnectionList.Add(connectionInfo)
End Sub
Private Shared Sub SetConnectionInfoParameter(ByRef connectionInfo As Connection.Info, ByVal key As String, ByVal value As String)
Select Case LCase(key)
Case "full address"
Dim uri As New Uri("dummyscheme" + uri.SchemeDelimiter + value)
If Not String.IsNullOrEmpty(uri.Host) Then connectionInfo.Hostname = uri.Host
If Not uri.Port = -1 Then connectionInfo.Port = uri.Port
Case "server port"
connectionInfo.Port = value
Case "username"
connectionInfo.Username = value
Case "domain"
connectionInfo.Domain = value
Case "session bpp"
Select Case value
Case 8
connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors256
Case 15
connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors15Bit
Case 16
connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors16Bit
Case 24
connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors24Bit
Case 32
connectionInfo.Colors = Connection.Protocol.RDP.RDPColors.Colors32Bit
End Select
Case "bitmapcachepersistenable"
If value = 1 Then
connectionInfo.CacheBitmaps = True
Else
connectionInfo.CacheBitmaps = False
End If
Case "screen mode id"
If value = 2 Then
connectionInfo.Resolution = Connection.Protocol.RDP.RDPResolutions.Fullscreen
Else
connectionInfo.Resolution = Connection.Protocol.RDP.RDPResolutions.FitToWindow
End If
Case "connect to console"
If value = 1 Then
connectionInfo.UseConsoleSession = True
End If
Case "disable wallpaper"
If value = 1 Then
connectionInfo.DisplayWallpaper = True
Else
connectionInfo.DisplayWallpaper = False
End If
Case "disable themes"
If value = 1 Then
connectionInfo.DisplayThemes = True
Else
connectionInfo.DisplayThemes = False
End If
Case "allow font smoothing"
If value = 1 Then
connectionInfo.EnableFontSmoothing = True
Else
connectionInfo.EnableFontSmoothing = False
End If
Case "allow desktop composition"
If value = 1 Then
connectionInfo.EnableDesktopComposition = True
Else
connectionInfo.EnableDesktopComposition = False
End If
Case "redirectsmartcards"
If value = 1 Then
connectionInfo.RedirectSmartCards = True
Else
connectionInfo.RedirectSmartCards = False
End If
Case "redirectdrives"
If value = 1 Then
connectionInfo.RedirectDiskDrives = True
Else
connectionInfo.RedirectDiskDrives = False
End If
Case "redirectcomports"
If value = 1 Then
connectionInfo.RedirectPorts = True
Else
connectionInfo.RedirectPorts = False
End If
Case "redirectprinters"
If value = 1 Then
connectionInfo.RedirectPrinters = True
Else
connectionInfo.RedirectPrinters = False
End If
Case "audiomode"
Select Case value
Case 0
connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.BringToThisComputer
Case 1
connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.LeaveAtRemoteComputer
Case 2
connectionInfo.RedirectSound = Connection.Protocol.RDP.RDPSounds.DoNotPlay
End Select
End Select
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,298 @@
Imports System.Xml
Imports System.IO
Imports System.Runtime.InteropServices
Imports mRemoteNG.Connection.Protocol
Imports mRemoteNG.App.Runtime
Namespace Config.Import
Public Class RemoteDesktopConnectionManager
Public Shared Sub Import(ByVal fileName As String, ByVal parentTreeNode As TreeNode)
Dim xmlDocument As New XmlDocument()
xmlDocument.Load(fileName)
Dim rdcManNode As XmlNode = xmlDocument.SelectSingleNode("/RDCMan")
Dim schemaVersion As Integer = rdcManNode.Attributes("schemaVersion").Value
If Not schemaVersion = 1 Then
Throw New FileFormatException(String.Format("Unsupported schema version ({0}).", schemaVersion))
End If
Dim versionNode As XmlNode = rdcManNode.SelectSingleNode("./version")
Dim version As New Version(versionNode.InnerText)
If Not version = New Version(2, 2) Then
Throw New FileFormatException(String.Format("Unsupported file version ({0}).", version))
End If
Dim fileNode As XmlNode = rdcManNode.SelectSingleNode("./file")
ImportFileOrGroup(fileNode, parentTreeNode)
End Sub
Private Shared Sub ImportFileOrGroup(ByVal xmlNode As XmlNode, ByVal parentTreeNode As TreeNode)
Dim propertiesNode As XmlNode = xmlNode.SelectSingleNode("./properties")
Dim name As String = propertiesNode.SelectSingleNode("./name").InnerText
Dim treeNode As New TreeNode(name)
parentTreeNode.Nodes.Add(treeNode)
Dim containerInfo As New Container.Info
containerInfo.TreeNode = treeNode
containerInfo.Name = name
Dim connectionInfo As Connection.Info = 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 Then
containerInfo.Parent = parentTreeNode.Tag
Else
connectionInfo.Inherit.TurnOffInheritanceCompletely()
End If
treeNode.Name = name
treeNode.Tag = containerInfo
treeNode.ImageIndex = Images.Enums.TreeImage.Container
treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container
For Each childNode As XmlNode In xmlNode.SelectNodes("./group|./server")
Select Case childNode.Name
Case "group"
ImportFileOrGroup(childNode, treeNode)
Case "server"
ImportServer(childNode, treeNode)
End Select
Next
containerInfo.IsExpanded = propertiesNode.SelectSingleNode("./expanded").InnerText
If containerInfo.IsExpanded Then treeNode.Expand()
ContainerList.Add(containerInfo)
End Sub
Private Shared Sub ImportServer(ByVal serverNode As XmlNode, ByVal parentTreeNode As TreeNode)
Dim name As String = serverNode.SelectSingleNode("./displayName").InnerText
Dim treeNode As New TreeNode(name)
parentTreeNode.Nodes.Add(treeNode)
Dim connectionInfo As Connection.Info = 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)
End Sub
Private Shared Function ConnectionInfoFromXml(ByVal xmlNode As XmlNode) As Connection.Info
Dim connectionInfo As New Connection.Info
connectionInfo.Inherit = New Connection.Info.Inheritance(connectionInfo)
Dim name As String = xmlNode.SelectSingleNode("./name").InnerText
Dim displayName As String
Dim displayNameNode As XmlNode = xmlNode.SelectSingleNode("./displayName")
If displayNameNode Is Nothing Then
displayName = name
Else
displayName = displayNameNode.InnerText
End If
connectionInfo.Name = displayName
connectionInfo.Description = xmlNode.SelectSingleNode("./comment").InnerText
connectionInfo.Hostname = name
Dim logonCredentialsNode As XmlNode = xmlNode.SelectSingleNode("./logonCredentials")
If logonCredentialsNode.Attributes("inherit").Value = "None" Then
connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName").InnerText
Dim passwordNode As XmlNode = logonCredentialsNode.SelectSingleNode("./password")
If passwordNode.Attributes("storeAsClearText").Value = "True" Then
connectionInfo.Password = passwordNode.InnerText
Else
connectionInfo.Password = DecryptPassword(passwordNode.InnerText)
End If
connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain").InnerText
Else
connectionInfo.Inherit.Username = True
connectionInfo.Inherit.Password = True
connectionInfo.Inherit.Domain = True
End If
Dim connectionSettingsNode As XmlNode = xmlNode.SelectSingleNode("./connectionSettings")
If connectionSettingsNode.Attributes("inherit").Value = "None" Then
connectionInfo.UseConsoleSession = connectionSettingsNode.SelectSingleNode("./connectToConsole").InnerText
' ./startProgram
' ./workingDir
connectionInfo.Port = connectionSettingsNode.SelectSingleNode("./port").InnerText
Else
connectionInfo.Inherit.UseConsoleSession = True
connectionInfo.Inherit.Port = True
End If
Dim gatewaySettingsNode As XmlNode = xmlNode.SelectSingleNode("./gatewaySettings")
If gatewaySettingsNode.Attributes("inherit").Value = "None" Then
If gatewaySettingsNode.SelectSingleNode("./enabled").InnerText = "True" Then
connectionInfo.RDGatewayUsageMethod = RDP.RDGatewayUsageMethod.Always
Else
connectionInfo.RDGatewayUsageMethod = RDP.RDGatewayUsageMethod.Never
End If
connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName").InnerText
connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName").InnerText
Dim passwordNode As XmlNode = logonCredentialsNode.SelectSingleNode("./password")
If passwordNode.Attributes("storeAsClearText").Value = "True" Then
connectionInfo.RDGatewayPassword = passwordNode.InnerText
Else
connectionInfo.Password = DecryptPassword(passwordNode.InnerText)
End If
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
End If
Dim remoteDesktopNode As XmlNode = xmlNode.SelectSingleNode("./remoteDesktop")
If remoteDesktopNode.Attributes("inherit").Value = "None" Then
Dim resolutionString As String = remoteDesktopNode.SelectSingleNode("./size").InnerText.Replace(" ", "")
Try
connectionInfo.Resolution = "Res" & Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.RDPResolutions), resolutionString)
Catch ex As ArgumentException
connectionInfo.Resolution = RDP.RDPResolutions.FitToWindow
End Try
If remoteDesktopNode.SelectSingleNode("./sameSizeAsClientArea").InnerText = "True" Then
connectionInfo.Resolution = RDP.RDPResolutions.FitToWindow
End If
If remoteDesktopNode.SelectSingleNode("./fullScreen").InnerText = "True" Then
connectionInfo.Resolution = RDP.RDPResolutions.Fullscreen
End If
connectionInfo.Colors = remoteDesktopNode.SelectSingleNode("./colorDepth").InnerText
Else
connectionInfo.Inherit.Resolution = True
connectionInfo.Inherit.Colors = True
End If
Dim localResourcesNode As XmlNode = xmlNode.SelectSingleNode("./localResources")
If localResourcesNode.Attributes("inherit").Value = "None" Then
Select Case localResourcesNode.SelectSingleNode("./audioRedirection").InnerText
Case 0 ' Bring to this computer
connectionInfo.RedirectSound = RDP.RDPSounds.BringToThisComputer
Case 1 ' Leave at remote computer
connectionInfo.RedirectSound = RDP.RDPSounds.LeaveAtRemoteComputer
Case 2 ' Do not play
connectionInfo.RedirectSound = RDP.RDPSounds.DoNotPlay
End Select
' ./audioRedirectionQuality
' ./audioCaptureRedirection
Select Case localResourcesNode.SelectSingleNode("./keyboardHook").InnerText
Case 0 ' On the local computer
connectionInfo.RedirectKeys = False
Case 1 ' On the remote computer
connectionInfo.RedirectKeys = True
Case 2 ' In full screen mode only
connectionInfo.RedirectKeys = False
End Select
' ./redirectClipboard
connectionInfo.RedirectDiskDrives = localResourcesNode.SelectSingleNode("./redirectDrives").InnerText
connectionInfo.RedirectPorts = localResourcesNode.SelectSingleNode("./redirectPorts").InnerText
connectionInfo.RedirectPrinters = localResourcesNode.SelectSingleNode("./redirectPrinters").InnerText
connectionInfo.RedirectSmartCards = 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
End If
Dim securitySettingsNode As XmlNode = xmlNode.SelectSingleNode("./securitySettings")
If securitySettingsNode.Attributes("inherit").Value = "None" Then
Select Case securitySettingsNode.SelectSingleNode("./authentication").InnerText
Case 0 ' No authentication
connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.NoAuth
Case 1 ' Do not connect if authentication fails
connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.AuthRequired
Case 2 ' Warn if authentication fails
connectionInfo.RDPAuthenticationLevel = RDP.AuthenticationLevel.WarnOnFailedAuth
End Select
Else
connectionInfo.Inherit.RDPAuthenticationLevel = True
End If
' ./displaySettings/thumbnailScale
' ./displaySettings/liveThumbnailUpdates
' ./displaySettings/showDisconnectedThumbnails
Return connectionInfo
End Function
Private Shared Function DecryptPassword(ByVal ciphertext As String) As String
If String.IsNullOrEmpty(ciphertext) Then Return Nothing
Dim gcHandle As GCHandle
Dim plaintextData As Win32.DATA_BLOB
Try
Dim ciphertextArray As Byte() = Convert.FromBase64String(ciphertext)
gcHandle = Runtime.InteropServices.GCHandle.Alloc(ciphertextArray, GCHandleType.Pinned)
Dim ciphertextData As Win32.DATA_BLOB
ciphertextData.cbData = ciphertextArray.Length
ciphertextData.pbData = gcHandle.AddrOfPinnedObject()
If Not Win32.CryptUnprotectData(ciphertextData, Nothing, Nothing, Nothing, Nothing, 0, plaintextData) Then Return Nothing
Dim plaintextLength As Integer = plaintextData.cbData / 2 ' Char = 2 bytes
Dim plaintextArray(plaintextLength - 1) As Char
Marshal.Copy(plaintextData.pbData, plaintextArray, 0, plaintextLength)
Return New String(plaintextArray)
Catch ex As Exception
MessageCollector.AddExceptionMessage("RemoteDesktopConnectionManager.DecryptPassword() failed.", ex, , True)
Return Nothing
Finally
If gcHandle.IsAllocated Then gcHandle.Free()
If Not plaintextData.pbData = IntPtr.Zero Then Win32.LocalFree(plaintextData.pbData)
End Try
End Function
' ReSharper disable once ClassNeverInstantiated.Local
Private Class Win32
' ReSharper disable InconsistentNaming
' ReSharper disable IdentifierTypo
' ReSharper disable StringLiteralTypo
<DllImport("crypt32.dll", CharSet:=CharSet.Unicode)> _
Public Shared Function CryptUnprotectData(ByRef dataIn As DATA_BLOB, ByVal description As String, ByRef optionalEntropy As DATA_BLOB, ByVal reserved As IntPtr, ByRef promptStruct As IntPtr, ByVal flags As Integer, ByRef dataOut As DATA_BLOB) As Boolean
End Function
<DllImport("kernel32.dll", CharSet:=CharSet.Unicode)> _
Public Shared Sub LocalFree(ByVal ptr As IntPtr)
End Sub
Public Structure DATA_BLOB
Public cbData As Integer
Public pbData As IntPtr
End Structure
' ReSharper restore StringLiteralTypo
' ReSharper restore IdentifierTypo
' ReSharper restore InconsistentNaming
End Class
End Class
End Namespace

View File

@@ -0,0 +1,49 @@
Imports System.IO
Imports mRemoteNG.App.Runtime
Namespace Config.Import
' ReSharper disable once InconsistentNaming
Public Class mRemoteNG
Public Shared Sub Import(ByVal fileName As String, ByVal parentTreeNode As TreeNode)
Dim name As String = Path.GetFileNameWithoutExtension(fileName)
Dim treeNode As New TreeNode(name)
parentTreeNode.Nodes.Add(treeNode)
Dim containerInfo As New Container.Info
containerInfo.TreeNode = treeNode
containerInfo.Name = name
Dim connectionInfo As New Connection.Info
connectionInfo.Inherit = New Connection.Info.Inheritance(connectionInfo)
connectionInfo.Name = name
connectionInfo.TreeNode = treeNode
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 Then
containerInfo.Parent = parentTreeNode.Tag
Else
connectionInfo.Inherit.TurnOffInheritanceCompletely()
End If
treeNode.Name = name
treeNode.Tag = containerInfo
treeNode.ImageIndex = Images.Enums.TreeImage.Container
treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container
Dim connectionsLoad As New Connections.Load
With connectionsLoad
.ConnectionFileName = fileName
.RootTreeNode = treeNode
.ConnectionList = ConnectionList
.ContainerList = ContainerList
End With
connectionsLoad.Load(True)
ContainerList.Add(containerInfo)
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,324 @@
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports mRemoteNG.App.Runtime
Imports SharedLibraryNG
Namespace Config
Public Class KeyboardShortcuts
#Region "Public Properties"
Private Shared _defaultMap As KeyboardShortcutMap = Nothing
Public Shared ReadOnly Property DefaultMap() As KeyboardShortcutMap
Get
LoadDefaultMap()
Return _defaultMap
End Get
End Property
Private Shared _map As KeyboardShortcutMap
Public Shared Property Map() As KeyboardShortcutMap
Get
Load()
Return _map
End Get
Set(value As KeyboardShortcutMap)
CancelKeyNotifications()
_map = value
Save()
RequestKeyNotifications(_handle)
End Set
End Property
#End Region
#Region "Public Methods"
Public Shared Sub RequestKeyNotifications(ByVal handle As IntPtr)
' ReSharper disable LocalizableElement
If handle = IntPtr.Zero Then Throw New ArgumentException("The handle cannot be null.", "handle")
If Not _handle = IntPtr.Zero And Not _handle = handle Then Throw New ArgumentException("The handle must match the handle that was specified the first time this function was called.", "handle")
' ReSharper restore LocalizableElement
_handle = handle
For Each shortcutMapping As ShortcutMapping In Map.Mappings
KeyboardHook.RequestKeyNotification(handle, shortcutMapping.Key.KeyCode, shortcutMapping.Key.ModifierKeys, False)
Next
End Sub
Public Shared Function CommandFromHookKeyMessage(ByVal m As Message) As ShortcutCommand
Dim msgData As KeyboardHook.HookKeyMsgData = Marshal.PtrToStructure(m.LParam, GetType(KeyboardHook.HookKeyMsgData))
Return Map.GetCommand(msgData.KeyCode, msgData.ModifierKeys)
End Function
#End Region
#Region "Private Fields"
' ReSharper disable once UnusedMember.Local
Private Shared _keyboardHook As New KeyboardHook
Private Shared _mapLoaded As Boolean = False
Private Shared _handle As IntPtr = IntPtr.Zero
#End Region
#Region "Private Methods"
Private Shared Sub LoadDefaultMap()
If _defaultMap IsNot Nothing Then Return
_defaultMap = New KeyboardShortcutMap()
_defaultMap.AddFromConfigString(ShortcutCommand.PreviousTab, My.Settings.Properties("KeysPreviousTab").DefaultValue)
_defaultMap.AddFromConfigString(ShortcutCommand.NextTab, My.Settings.Properties("KeysNextTab").DefaultValue)
End Sub
Private Shared Sub Load()
If _mapLoaded Then Return
_map = New KeyboardShortcutMap()
_map.AddFromConfigString(ShortcutCommand.PreviousTab, My.Settings.KeysPreviousTab)
_map.AddFromConfigString(ShortcutCommand.NextTab, My.Settings.KeysNextTab)
_mapLoaded = True
End Sub
Private Shared Sub Save()
If _map Is Nothing Then Return
My.Settings.KeysPreviousTab = _map.GetConfigString(ShortcutCommand.PreviousTab)
My.Settings.KeysNextTab = _map.GetConfigString(ShortcutCommand.NextTab)
End Sub
Private Shared Sub CancelKeyNotifications()
If _handle = IntPtr.Zero Then Return
For Each shortcutMapping As ShortcutMapping In Map.Mappings
KeyboardHook.CancelKeyNotification(_handle, shortcutMapping.Key.KeyCode, shortcutMapping.Key.ModifierKeys, False)
Next
End Sub
#End Region
End Class
Public Class KeyboardShortcutMap
Implements ICloneable
#Region "Public Properties"
Private ReadOnly _mappings As List(Of ShortcutMapping)
Public ReadOnly Property Mappings As List(Of ShortcutMapping)
Get
Return _mappings
End Get
End Property
#End Region
#Region "Constructors"
Public Sub New()
_mappings = New List(Of ShortcutMapping)()
End Sub
Public Sub New(ByVal mappings As List(Of ShortcutMapping))
_mappings = mappings
End Sub
#End Region
#Region "Public Methods"
Public Sub Add(ByVal command As ShortcutCommand, ByVal shortcutKey As ShortcutKey)
If Mappings.Contains(New ShortcutMapping(command, shortcutKey)) Then Return
Mappings.Add(New ShortcutMapping(command, shortcutKey))
End Sub
Public Sub AddRange(ByVal command As ShortcutCommand, ByVal shortcutKeys As IEnumerable(Of ShortcutKey))
For Each shortcutKey As ShortcutKey In shortcutKeys
Add(command, shortcutKey)
Next
End Sub
Public Sub Remove(ByVal command As ShortcutCommand, ByVal shortcutKey As ShortcutKey)
Mappings.Remove(New ShortcutMapping(command, shortcutKey))
End Sub
Public Sub AddFromConfigString(ByVal command As ShortcutCommand, ByVal configString As String)
For Each shortcutKey As ShortcutKey In ParseConfigString(configString)
Add(command, shortcutKey)
Next
End Sub
Public Function GetConfigString(ByVal command As ShortcutCommand) As String
Dim parts As New List(Of String)
For Each shortcutKey As ShortcutKey In GetShortcutKeys(command)
parts.Add(shortcutKey.ToConfigString())
Next
Return String.Join(", ", parts.ToArray())
End Function
Public Function GetShortcutKeys(ByVal command As ShortcutCommand) As ShortcutKey()
Dim shortcutKeys As New List(Of ShortcutKey)
For Each shortcutMapping As ShortcutMapping In Mappings
If shortcutMapping.Command = command Then shortcutKeys.Add(shortcutMapping.Key)
Next
Return shortcutKeys.ToArray()
End Function
Public Sub SetShortcutKeys(ByVal command As ShortcutCommand, ByVal shortcutKeys As IEnumerable(Of ShortcutKey))
ClearShortcutKeys(command)
AddRange(command, shortcutKeys)
End Sub
Public Function GetCommand(ByVal keyCode As Int32, ByVal modifierKeys As KeyboardHook.ModifierKeys) As ShortcutCommand
Return GetCommand(New ShortcutKey(keyCode, modifierKeys))
End Function
Public Function Clone() As Object Implements ICloneable.Clone
Dim newMappings As New List(Of ShortcutMapping)()
newMappings.AddRange(Mappings)
Return New KeyboardShortcutMap(newMappings)
End Function
#End Region
#Region "Private Methods"
Private Shared Function ParseConfigString(ByVal shortcutKeysString As String) As ShortcutKey()
Dim shortcutKeys As New List(Of ShortcutKey)
For Each shortcutKeyString As String In shortcutKeysString.Split(New Char() {","}, StringSplitOptions.RemoveEmptyEntries)
Try
shortcutKeys.Add(ShortcutKey.FromConfigString(shortcutKeyString.Trim))
Catch ex As Exception
MessageCollector.AddExceptionMessage(String.Format("KeyboardShortcuts.ParseShortcutKeysString({0}) failed at {1}.", shortcutKeysString, shortcutKeyString), ex, , True)
Continue For
End Try
Next
Return shortcutKeys.ToArray()
End Function
Private Function GetCommand(ByVal shortcutKey As ShortcutKey) As ShortcutCommand
For Each shortcutMapping As ShortcutMapping In Mappings
If ShortcutKeysMatch(shortcutMapping.Key, shortcutKey) Then Return shortcutMapping.Command
Next
Return ShortcutCommand.None
End Function
Private Shared Function ShortcutKeysMatch(ByVal wanted As ShortcutKey, ByVal pressed As ShortcutKey) As Boolean
If Not wanted.KeyCode = pressed.KeyCode Then Return False
Return KeyboardHook.ModifierKeysMatch(wanted.ModifierKeys, pressed.ModifierKeys)
End Function
Private Sub ClearShortcutKeys(ByVal command As ShortcutCommand)
Dim mappingsToRemove As New List(Of ShortcutMapping)
For Each mapping As ShortcutMapping In Mappings
If mapping.Command = command Then mappingsToRemove.Add(mapping)
Next
For Each mapping As ShortcutMapping In mappingsToRemove
Mappings.Remove(mapping)
Next
End Sub
#End Region
End Class
<ImmutableObject(True)> _
Public Class ShortcutMapping
Implements IEquatable(Of ShortcutMapping)
#Region "Public Properties"
Private ReadOnly _command As ShortcutCommand
Public ReadOnly Property Command As ShortcutCommand
Get
Return _command
End Get
End Property
Private ReadOnly _key As ShortcutKey
Public ReadOnly Property Key As ShortcutKey
Get
Return _key
End Get
End Property
#End Region
#Region "Constructors"
Public Sub New(ByVal command As ShortcutCommand, ByVal key As ShortcutKey)
_command = command
_key = Key
End Sub
#End Region
#Region "Public Methods"
Public Overloads Function Equals(other As ShortcutMapping) As Boolean Implements IEquatable(Of ShortcutMapping).Equals
If Not Command = other.Command Then Return False
If Not Key = other.Key Then Return False
Return True
End Function
#End Region
End Class
<ImmutableObject(True)> _
Public Class ShortcutKey
Implements IEquatable(Of ShortcutKey)
#Region "Public Properties"
Private ReadOnly _keyCode As Int32
Public ReadOnly Property KeyCode As Int32
Get
Return _keyCode
End Get
End Property
Private ReadOnly _modifierKeys As KeyboardHook.ModifierKeys
Public ReadOnly Property ModifierKeys As KeyboardHook.ModifierKeys
Get
Return _modifierKeys
End Get
End Property
#End Region
#Region "Constructors"
Public Sub New(ByVal keyCode As Int32, ByVal modifierKeys As KeyboardHook.ModifierKeys)
_keyCode = keyCode
_modifierKeys = modifierKeys
End Sub
Public Sub New(ByVal keysValue As Keys)
_keyCode = keysValue And Keys.KeyCode
If Not (keysValue And Keys.Shift) = 0 Then _modifierKeys = _modifierKeys Or KeyboardHook.ModifierKeys.Shift
If Not (keysValue And Keys.Control) = 0 Then _modifierKeys = _modifierKeys Or KeyboardHook.ModifierKeys.Control
If Not (keysValue And Keys.Alt) = 0 Then _modifierKeys = _modifierKeys Or KeyboardHook.ModifierKeys.Alt
End Sub
#End Region
#Region "Public Methods"
Public Function ToConfigString() As String
Return String.Join("/", New String() {KeyCode, Convert.ToInt32(ModifierKeys)})
End Function
Public Shared Function FromConfigString(ByVal shortcutKeyString As String) As ShortcutKey
Dim parts As String() = shortcutKeyString.Split(New Char() {"/"}, 2)
If Not parts.Length = 2 Then Throw New ArgumentException(String.Format("ShortcutKey.FromString({0}) failed. parts.Length != 2", shortcutKeyString), shortcutKeyString)
Return New ShortcutKey(Convert.ToInt32(parts(0)), Convert.ToInt32(parts(1)))
End Function
Public Overrides Function ToString() As String
Return HotkeyControl.KeysToString(Me)
End Function
Public Overloads Function Equals(other As ShortcutKey) As Boolean Implements IEquatable(Of ShortcutKey).Equals
If Not KeyCode = other.KeyCode Then Return False
If Not ModifierKeys = other.ModifierKeys Then Return False
Return True
End Function
#End Region
#Region "Operators"
Public Shared Operator =(ByVal shortcutKey1 As ShortcutKey, ByVal shortcutKey2 As ShortcutKey) As Boolean
Return shortcutKey1.Equals(shortcutKey2)
End Operator
Public Shared Operator <>(ByVal shortcutKey1 As ShortcutKey, ByVal shortcutKey2 As ShortcutKey) As Boolean
Return Not shortcutKey1.Equals(shortcutKey2)
End Operator
' This is a narrowing conversion because (Keys Or Keys.Modifiers) cannot hold all possible values of KeyboardHook.ModifierKeys
Public Shared Narrowing Operator CType(ByVal shortcutKey As ShortcutKey) As Keys
Dim keysValue As Keys = shortcutKey.KeyCode And Keys.KeyCode
If Not (shortcutKey.ModifierKeys And KeyboardHook.ModifierKeys.Shift) = 0 Then keysValue = keysValue Or Keys.Shift
If Not (shortcutKey.ModifierKeys And KeyboardHook.ModifierKeys.Control) = 0 Then keysValue = keysValue Or Keys.Control
If Not (shortcutKey.ModifierKeys And KeyboardHook.ModifierKeys.Alt) = 0 Then keysValue = keysValue Or Keys.Alt
Return keysValue
End Operator
Public Shared Widening Operator CType(ByVal keys As Keys) As ShortcutKey
Return New ShortcutKey(keys)
End Operator
#End Region
End Class
Public Enum ShortcutCommand As Integer
None = 0
PreviousTab
NextTab
End Enum
End Namespace

View File

@@ -0,0 +1,99 @@
Imports mRemoteNG.My
Namespace Config.Putty
Public MustInherit Class Provider
#Region "Public Methods"
Private _rootTreeNode As TreeNode
Public ReadOnly Property RootTreeNode As TreeNode
Get
If _rootTreeNode Is Nothing Then _rootTreeNode = CreateRootTreeNode()
Return _rootTreeNode
End Get
End Property
Private _rootInfo As Root.PuttySessions.Info
Public ReadOnly Property RootInfo() As Root.PuttySessions.Info
Get
If _rootInfo Is Nothing Then _rootInfo = CreateRootInfo()
Return _rootInfo
End Get
End Property
Public MustOverride Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
Public MustOverride Function GetSession(ByVal sessionName As String) As Connection.PuttySession.Info
Public Overridable Function GetSessions() As Connection.PuttySession.Info()
Dim sessionList As New List(Of Connection.PuttySession.Info)
Dim sessionInfo As Connection.Info
For Each sessionName As String In GetSessionNames(True)
sessionInfo = GetSession(sessionName)
If sessionInfo Is Nothing OrElse String.IsNullOrEmpty(sessionInfo.Hostname) Then Continue For
sessionList.Add(sessionInfo)
Next
Return sessionList.ToArray()
End Function
Public Overridable Sub StartWatcher()
End Sub
Public Overridable Sub StopWatcher()
End Sub
#End Region
#Region "Public Events"
Public Event SessionChanged(ByVal sender As Object, ByVal e As SessionChangedEventArgs)
#End Region
#Region "Public Classes"
Public Class SessionChangedEventArgs
Inherits EventArgs
End Class
#End Region
#Region "Protected Methods"
Private Delegate Function CreateRootTreeNodeDelegate() As TreeNode
Protected Overridable Function CreateRootTreeNode() As TreeNode
Dim treeView As TreeView = Tree.Node.TreeView
If treeView Is Nothing Then Return Nothing
If treeView.InvokeRequired Then
Return treeView.Invoke(New CreateRootTreeNodeDelegate(AddressOf CreateRootTreeNode))
End If
Dim newTreeNode As New TreeNode
RootInfo.TreeNode = newTreeNode
newTreeNode.Name = _rootInfo.Name
newTreeNode.Text = _rootInfo.Name
newTreeNode.Tag = _rootInfo
newTreeNode.ImageIndex = Images.Enums.TreeImage.PuttySessions
newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.PuttySessions
Return newTreeNode
End Function
Protected Overridable Function CreateRootInfo() As Root.PuttySessions.Info
Dim newRootInfo As New Root.PuttySessions.Info
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsName) Then
newRootInfo.Name = Language.strPuttySavedSessionsRootName
Else
newRootInfo.Name = My.Settings.PuttySavedSessionsName
End If
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsPanel) Then
newRootInfo.Panel = Language.strGeneral
Else
newRootInfo.Panel = My.Settings.PuttySavedSessionsPanel
End If
Return newRootInfo
End Function
Protected Overridable Sub OnSessionChanged(ByVal e As SessionChangedEventArgs)
RaiseEvent SessionChanged(Me, New SessionChangedEventArgs())
End Sub
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,121 @@
Imports System.Management
Imports mRemoteNG.App
Imports mRemoteNG.Messages
Imports Microsoft.Win32
Imports mRemoteNG.Connection.Protocol
Imports System.Security.Principal
Namespace Config.Putty
Public Class RegistryProvider
Inherits Provider
#Region "Public Methods"
Public Overrides Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
Dim sessionsKey As RegistryKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey)
If sessionsKey Is Nothing Then Return New String() {}
Dim sessionNames As New List(Of String)
For Each sessionName As String In sessionsKey.GetSubKeyNames()
If raw Then
sessionNames.Add(sessionName)
Else
sessionNames.Add(Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")))
End If
Next
If raw Then
If Not sessionNames.Contains("Default%20Settings") Then ' Do not localize
sessionNames.Insert(0, "Default%20Settings")
End If
Else
If Not sessionNames.Contains("Default Settings") Then
sessionNames.Insert(0, "Default Settings")
End If
End If
Return sessionNames.ToArray()
End Function
Public Overrides Function GetSession(ByVal sessionName As String) As Connection.PuttySession.Info
Dim sessionsKey As RegistryKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey)
If sessionsKey Is Nothing Then Return Nothing
Dim sessionKey As RegistryKey = sessionsKey.OpenSubKey(sessionName)
If sessionKey Is Nothing Then Return Nothing
sessionName = Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B"))
Dim sessionInfo As New Connection.PuttySession.Info
With sessionInfo
.PuttySession = sessionName
.Name = sessionName
.Hostname = sessionKey.GetValue("HostName")
.Username = sessionKey.GetValue("UserName")
Dim protocol As String = sessionKey.GetValue("Protocol")
If protocol Is Nothing Then protocol = "ssh"
Select Case protocol.ToLowerInvariant()
Case "raw"
.Protocol = Protocols.RAW
Case "rlogin"
.Protocol = Protocols.Rlogin
Case "serial"
Return Nothing
Case "ssh"
Dim sshVersionObject As Object = sessionKey.GetValue("SshProt")
If sshVersionObject IsNot Nothing Then
Dim sshVersion As Integer = CType(sshVersionObject, Integer)
If sshVersion >= 2 Then
.Protocol = Protocols.SSH2
Else
.Protocol = Protocols.SSH1
End If
Else
.Protocol = Protocols.SSH2
End If
Case "telnet"
.Protocol = Protocols.Telnet
Case Else
Return Nothing
End Select
.Port = sessionKey.GetValue("PortNumber")
End With
Return sessionInfo
End Function
Public Overrides Sub StartWatcher()
If _eventWatcher IsNot Nothing Then Return
Try
Dim currentUserSid As String = WindowsIdentity.GetCurrent().User.Value
Dim key As String = String.Join("\", {currentUserSid, PuttySessionsKey}).Replace("\", "\\")
Dim query As New WqlEventQuery(String.Format("SELECT * FROM RegistryTreeChangeEvent WHERE Hive = 'HKEY_USERS' AND RootPath = '{0}'", key))
_eventWatcher = New ManagementEventWatcher(query)
AddHandler _eventWatcher.EventArrived, AddressOf OnManagementEventArrived
_eventWatcher.Start()
Catch ex As Exception
Runtime.MessageCollector.AddExceptionMessage("PuttySessions.Watcher.StartWatching() failed.", ex, MessageClass.WarningMsg, True)
End Try
End Sub
Public Overrides Sub StopWatcher()
If _eventWatcher Is Nothing Then Return
_eventWatcher.Stop()
_eventWatcher.Dispose()
_eventWatcher = Nothing
End Sub
#End Region
#Region "Private Fields"
Private Const PuttySessionsKey As String = "Software\SimonTatham\PuTTY\Sessions"
Private Shared _eventWatcher As ManagementEventWatcher
#End Region
#Region "Private Methods"
Private Sub OnManagementEventArrived(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
OnSessionChanged(New SessionChangedEventArgs())
End Sub
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,168 @@
Imports System.ComponentModel
Imports mRemoteNG.Tools
Namespace Config.Putty
Public Class Sessions
#Region "Public Methods"
Private Delegate Sub AddSessionsToTreeDelegate()
Public Shared Sub AddSessionsToTree()
Dim treeView As TreeView = Tree.Node.TreeView
If treeView Is Nothing Then Return
If treeView.InvokeRequired Then
treeView.Invoke(New AddSessionsToTreeDelegate(AddressOf AddSessionsToTree))
Return
End If
For Each provider As Provider In Providers
Dim rootTreeNode As TreeNode = provider.RootTreeNode
Dim inUpdate As Boolean = False
Dim savedSessions As New List(Of Connection.Info)(provider.GetSessions())
If Not IsProviderEnabled(provider) Or savedSessions Is Nothing OrElse savedSessions.Count = 0 Then
If rootTreeNode IsNot Nothing AndAlso treeView.Nodes.Contains(rootTreeNode) Then
treeView.BeginUpdate()
treeView.Nodes.Remove(rootTreeNode)
treeView.EndUpdate()
End If
Continue For
End If
If Not treeView.Nodes.Contains(rootTreeNode) Then
If Not inUpdate Then
treeView.BeginUpdate()
inUpdate = True
End If
treeView.Nodes.Add(rootTreeNode)
End If
Dim newTreeNodes As New List(Of TreeNode)
For Each sessionInfo As Connection.PuttySession.Info In savedSessions
Dim treeNode As TreeNode
Dim isNewNode As Boolean
If rootTreeNode.Nodes.ContainsKey(sessionInfo.Name) Then
treeNode = rootTreeNode.Nodes.Item(sessionInfo.Name)
isNewNode = False
Else
treeNode = Tree.Node.AddNode(Tree.Node.Type.PuttySession, sessionInfo.Name)
If treeNode Is Nothing Then Continue For
treeNode.Name = treeNode.Text
treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed
isNewNode = True
End If
sessionInfo.RootPuttySessionsInfo = provider.RootInfo
sessionInfo.TreeNode = treeNode
sessionInfo.Inherit.TurnOffInheritanceCompletely()
treeNode.Tag = sessionInfo
If isNewNode Then newTreeNodes.Add(treeNode)
Next
For Each treeNode As TreeNode In rootTreeNode.Nodes
If Not savedSessions.Contains(treeNode.Tag) Then
If Not inUpdate Then
treeView.BeginUpdate()
inUpdate = True
End If
rootTreeNode.Nodes.Remove(treeNode)
End If
Next
If Not newTreeNodes.Count = 0 Then
If Not inUpdate Then
treeView.BeginUpdate()
inUpdate = True
End If
rootTreeNode.Nodes.AddRange(newTreeNodes.ToArray())
End If
If inUpdate Then
Tree.Node.Sort(rootTreeNode, SortOrder.Ascending)
rootTreeNode.Expand()
treeView.EndUpdate()
End If
Next
End Sub
Public Shared Sub StartWatcher()
For Each provider As Provider In Providers
provider.StartWatcher()
AddHandler provider.SessionChanged, AddressOf SessionChanged
Next
End Sub
Public Shared Sub StopWatcher()
For Each provider As Provider In Providers
provider.StopWatcher()
RemoveHandler provider.SessionChanged, AddressOf SessionChanged
Next
End Sub
Public Shared Sub SessionChanged(ByVal sender As Object, ByVal e As Provider.SessionChangedEventArgs)
AddSessionsToTree()
End Sub
#End Region
#Region "Private Methods"
Private Shared _providers As List(Of Provider)
Private Shared ReadOnly Property Providers() As List(Of Provider)
Get
If _providers Is Nothing OrElse _providers.Count = 0 Then AddProviders()
Return _providers
End Get
End Property
Private Shared Sub AddProviders()
_providers = New List(Of Provider)()
_providers.Add(New RegistryProvider())
_providers.Add(New XmingProvider())
End Sub
Private Shared Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
Dim sessionNames As New List(Of String)
For Each provider As Provider In Providers
If Not IsProviderEnabled(provider) Then Continue For
sessionNames.AddRange(provider.GetSessionNames(raw))
Next
Return sessionNames.ToArray()
End Function
Private Shared Function IsProviderEnabled(ByVal provider As Provider) As Boolean
Dim enabled As Boolean = True
Select Case PuttyTypeDetector.GetPuttyType()
Case PuttyTypeDetector.PuttyType.Xming
If TypeOf (provider) Is RegistryProvider Then enabled = False
Case Else
If TypeOf (provider) Is XmingProvider Then enabled = False
End Select
Return enabled
End Function
#End Region
#Region "Public Classes"
Public Class SessionList
Inherits StringConverter
Public Shared ReadOnly Property Names() As String()
Get
Return GetSessionNames()
End Get
End Property
Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
Return New StandardValuesCollection(Names)
End Function
Public Overloads Overrides Function GetStandardValuesExclusive(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean
Return True
End Function
End Class
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,259 @@
Imports System.IO
Imports mRemoteNG.App
Imports mRemoteNG.Messages
Imports mRemoteNG.Connection.Protocol
Imports System.Text.RegularExpressions
Namespace Config.Putty
Public Class XmingProvider
Inherits Provider
#Region "Public Methods"
Public Overrides Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
Dim sessionsFolderPath As String = GetSessionsFolderPath()
If Not Directory.Exists(sessionsFolderPath) Then Return New String() {}
Dim sessionNames As New List(Of String)
For Each sessionName As String In Directory.GetFiles(sessionsFolderPath)
sessionName = Path.GetFileName(sessionName)
If raw Then
sessionNames.Add(sessionName)
Else
sessionNames.Add(Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")))
End If
Next
If raw Then
If Not sessionNames.Contains("Default%20Settings") Then ' Do not localize
sessionNames.Insert(0, "Default%20Settings")
End If
Else
If Not sessionNames.Contains("Default Settings") Then
sessionNames.Insert(0, "Default Settings")
End If
End If
Dim registrySessionNames As New List(Of String)
For Each sessionName As String In RegistryProvider.GetSessionNames(raw)
registrySessionNames.Add(String.Format(RegistrySessionNameFormat, sessionName))
Next
sessionNames.AddRange(registrySessionNames)
sessionNames.Sort()
Return sessionNames.ToArray()
End Function
Public Overrides Function GetSession(ByVal sessionName As String) As Connection.PuttySession.Info
Dim registrySessionName As String = GetRegistrySessionName(sessionName)
If Not String.IsNullOrEmpty(registrySessionName) Then
Return ModifyRegistrySessionInfo(RegistryProvider.GetSession(registrySessionName))
End If
Dim sessionsFolderPath As String = GetSessionsFolderPath()
If Not Directory.Exists(sessionsFolderPath) Then Return Nothing
Dim sessionFile As String = Path.Combine(sessionsFolderPath, sessionName)
If Not File.Exists(sessionFile) Then Return Nothing
sessionName = Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B"))
Dim sessionFileReader As New SessionFileReader(sessionFile)
Dim sessionInfo As New Connection.PuttySession.Info
With sessionInfo
.PuttySession = sessionName
.Name = sessionName
.Hostname = sessionFileReader.GetValue("HostName")
.Username = sessionFileReader.GetValue("UserName")
Dim protocol As String = sessionFileReader.GetValue("Protocol")
If protocol Is Nothing Then protocol = "ssh"
Select Case protocol.ToLowerInvariant()
Case "raw"
.Protocol = Protocols.RAW
Case "rlogin"
.Protocol = Protocols.Rlogin
Case "serial"
Return Nothing
Case "ssh"
Dim sshVersionObject As Object = sessionFileReader.GetValue("SshProt")
If sshVersionObject IsNot Nothing Then
Dim sshVersion As Integer = CType(sshVersionObject, Integer)
If sshVersion >= 2 Then
.Protocol = Protocols.SSH2
Else
.Protocol = Protocols.SSH1
End If
Else
.Protocol = Protocols.SSH2
End If
Case "telnet"
.Protocol = Protocols.Telnet
Case Else
Return Nothing
End Select
.Port = sessionFileReader.GetValue("PortNumber")
End With
Return sessionInfo
End Function
Public Overrides Sub StartWatcher()
RegistryProvider.StartWatcher()
AddHandler RegistryProvider.SessionChanged, AddressOf OnRegistrySessionChanged
If _eventWatcher IsNot Nothing Then Return
Try
_eventWatcher = New FileSystemWatcher(GetSessionsFolderPath())
_eventWatcher.NotifyFilter = (NotifyFilters.FileName Or NotifyFilters.LastWrite)
AddHandler _eventWatcher.Changed, AddressOf OnFileSystemEventArrived
AddHandler _eventWatcher.Created, AddressOf OnFileSystemEventArrived
AddHandler _eventWatcher.Deleted, AddressOf OnFileSystemEventArrived
AddHandler _eventWatcher.Renamed, AddressOf OnFileSystemEventArrived
_eventWatcher.EnableRaisingEvents = True
Catch ex As Exception
Runtime.MessageCollector.AddExceptionMessage("XmingPortablePuttySessions.Watcher.StartWatching() failed.", ex, MessageClass.WarningMsg, True)
End Try
End Sub
Public Overrides Sub StopWatcher()
RegistryProvider.StopWatcher()
RemoveHandler RegistryProvider.SessionChanged, AddressOf OnRegistrySessionChanged
If _eventWatcher Is Nothing Then Return
_eventWatcher.EnableRaisingEvents = False
_eventWatcher.Dispose()
_eventWatcher = Nothing
End Sub
#End Region
#Region "Private Fields"
Private Const RegistrySessionNameFormat As String = "{0} [registry]"
Private Const RegistrySessionNamePattern As String = "(.*)\ \[registry\]"
Private Shared ReadOnly RegistryProvider As New RegistryProvider
Private Shared _eventWatcher As FileSystemWatcher
#End Region
#Region "Private Methods"
Private Shared Function GetPuttyConfPath() As String
Dim puttyPath As String
If My.Settings.UseCustomPuttyPath Then
puttyPath = My.Settings.CustomPuttyPath
Else
puttyPath = Info.General.PuttyPath
End If
Return Path.Combine(Path.GetDirectoryName(puttyPath), "putty.conf")
End Function
Private Shared Function GetSessionsFolderPath() As String
Dim puttyConfPath As String = GetPuttyConfPath()
Dim sessionFileReader As New PuttyConfFileReader(puttyConfPath)
Dim basePath As String = Environment.ExpandEnvironmentVariables(sessionFileReader.GetValue("sshk&sess"))
Return Path.Combine(basePath, "sessions")
End Function
Private Shared Function GetRegistrySessionName(ByVal sessionName As String) As String
Dim regex As New Regex(RegistrySessionNamePattern)
Dim matches As MatchCollection = regex.Matches(sessionName)
If matches.Count < 1 Then Return String.Empty
Dim groups As GroupCollection = matches(0).Groups
If groups.Count < 1 Then Return String.Empty ' This should always include at least one item, but check anyway
Return groups(1).Value
End Function
Private Shared Function ModifyRegistrySessionInfo(ByVal sessionInfo As Connection.PuttySession.Info) As Connection.PuttySession.Info
sessionInfo.Name = String.Format(RegistrySessionNameFormat, sessionInfo.Name)
sessionInfo.PuttySession = String.Format(RegistrySessionNameFormat, sessionInfo.PuttySession)
Return sessionInfo
End Function
Private Sub OnFileSystemEventArrived(ByVal sender As Object, ByVal e As FileSystemEventArgs)
OnSessionChanged(New SessionChangedEventArgs())
End Sub
Private Sub OnRegistrySessionChanged(ByVal sender As Object, ByVal e As SessionChangedEventArgs)
OnSessionChanged(New SessionChangedEventArgs())
End Sub
#End Region
#Region "Private Classes"
Private Class PuttyConfFileReader
Public Sub New(ByVal puttyConfFile As String)
_puttyConfFile = puttyConfFile
End Sub
Private ReadOnly _puttyConfFile As String
Private _configurationLoaded As Boolean = False
Private ReadOnly _configuration As New Dictionary(Of String, String)
Private Sub LoadConfiguration()
_configurationLoaded = True
Try
If Not File.Exists(_puttyConfFile) Then Return
Using streamReader As New StreamReader(_puttyConfFile)
Dim line As String
Do
line = streamReader.ReadLine()
If line Is Nothing Then Exit Do
line = line.Trim()
If line = String.Empty Then Continue Do ' Blank line
If line.Substring(0, 1) = ";" Then Continue Do ' Comment
Dim parts() As String = line.Split(New Char() {"="}, 2)
If parts.Length < 2 Then Continue Do
If _configuration.ContainsKey(parts(0)) Then Continue Do ' As per http://www.straightrunning.com/XmingNotes/portableputty.php only first entry is used
_configuration.Add(parts(0), parts(1))
Loop
End Using
Catch ex As Exception
Runtime.MessageCollector.AddExceptionMessage("PuttyConfFileReader.LoadConfiguration() failed.", ex, MessageClass.ErrorMsg, True)
End Try
End Sub
Public Function GetValue(ByVal setting As String) As String
If Not _configurationLoaded Then LoadConfiguration()
If Not _configuration.ContainsKey(setting) Then Return String.Empty
Return _configuration(setting)
End Function
End Class
Private Class SessionFileReader
Public Sub New(ByVal sessionFile As String)
_sessionFile = sessionFile
End Sub
Private ReadOnly _sessionFile As String
Private _sessionInfoLoaded As Boolean = False
Private ReadOnly _sessionInfo As New Dictionary(Of String, String)
Private Sub LoadSessionInfo()
_sessionInfoLoaded = True
Try
If Not File.Exists(_sessionFile) Then Return
Using streamReader As New StreamReader(_sessionFile)
Dim line As String
Do
line = streamReader.ReadLine()
If line Is Nothing Then Exit Do
Dim parts() As String = line.Split(New Char() {"\"})
If parts.Length < 2 Then Continue Do
_sessionInfo.Add(parts(0), parts(1))
Loop
End Using
Catch ex As Exception
Runtime.MessageCollector.AddExceptionMessage("SessionFileReader.LoadSessionInfo() failed.", ex, MessageClass.ErrorMsg, True)
End Try
End Sub
Public Function GetValue(ByVal setting As String) As String
If Not _sessionInfoLoaded Then LoadSessionInfo()
If Not _sessionInfo.ContainsKey(setting) Then Return String.Empty
Return _sessionInfo(setting)
End Function
End Class
#End Region
End Class
End Namespace

View File

@@ -1,243 +0,0 @@
Imports System.ComponentModel
Imports System.Management
Imports mRemoteNG.Messages
Imports Microsoft.Win32
Imports mRemoteNG.Connection.Protocol
Imports mRemoteNG.My
Imports mRemoteNG.App.Runtime
Imports System.Security.Principal
Namespace Config
Public Class PuttySessions
Private Const PuttySessionsKey As String = "Software\SimonTatham\PuTTY\Sessions"
Private Shared _rootTreeNode As TreeNode
Private Shared _eventWatcher As ManagementEventWatcher
Private Delegate Sub AddSessionsToTreeDelegate()
Public Shared Sub AddSessionsToTree()
Dim treeView As TreeView = Tree.Node.TreeView
If treeView Is Nothing Then Return
If treeView.InvokeRequired Then
treeView.Invoke(New AddSessionsToTreeDelegate(AddressOf AddSessionsToTree))
Return
End If
Dim savedSessions As New List(Of Connection.Info)(LoadSessions())
If savedSessions Is Nothing OrElse savedSessions.Count = 0 Then Return
Dim puttyRootInfo As New Root.PuttySessions.Info()
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsName) Then
puttyRootInfo.Name = Language.strPuttySavedSessionsRootName
Else
puttyRootInfo.Name = My.Settings.PuttySavedSessionsName
End If
If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsPanel) Then
puttyRootInfo.Panel = Language.strGeneral
Else
puttyRootInfo.Panel = My.Settings.PuttySavedSessionsPanel
End If
Dim inUpdate As Boolean = False
If _rootTreeNode Is Nothing Then
_rootTreeNode = New TreeNode
_rootTreeNode.Name = puttyRootInfo.Name
_rootTreeNode.Text = puttyRootInfo.Name
_rootTreeNode.Tag = puttyRootInfo
_rootTreeNode.ImageIndex = Images.Enums.TreeImage.PuttySessions
_rootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.PuttySessions
End If
If Not treeView.Nodes.Contains(_rootTreeNode) Then
If Not inUpdate Then
treeView.BeginUpdate()
inUpdate = True
End If
treeView.Nodes.Add(_rootTreeNode)
End If
puttyRootInfo.TreeNode = _rootTreeNode
Dim newTreeNodes As New List(Of TreeNode)
For Each sessionInfo As Connection.PuttySession.Info In savedSessions
Dim treeNode As TreeNode
Dim isNewNode As Boolean
If _rootTreeNode.Nodes.ContainsKey(sessionInfo.Name) Then
treeNode = _rootTreeNode.Nodes.Item(sessionInfo.Name)
isNewNode = False
Else
treeNode = Tree.Node.AddNode(Tree.Node.Type.PuttySession, sessionInfo.Name)
If treeNode Is Nothing Then Continue For
treeNode.Name = treeNode.Text
treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed
isNewNode = True
End If
sessionInfo.RootPuttySessionsInfo = puttyRootInfo
sessionInfo.TreeNode = treeNode
sessionInfo.Inherit.TurnOffInheritanceCompletely()
treeNode.Tag = sessionInfo
If isNewNode Then newTreeNodes.Add(treeNode)
Next
For Each treeNode As TreeNode In _rootTreeNode.Nodes
If Not savedSessions.Contains(treeNode.Tag) Then
If Not inUpdate Then
treeView.BeginUpdate()
inUpdate = True
End If
_rootTreeNode.Nodes.Remove(treeNode)
End If
Next
If Not newTreeNodes.Count = 0 Then
If Not inUpdate Then
treeView.BeginUpdate()
inUpdate = True
End If
_rootTreeNode.Nodes.AddRange(newTreeNodes.ToArray())
End If
If inUpdate Then
Tree.Node.Sort(_rootTreeNode, SortOrder.Ascending)
_rootTreeNode.Expand()
treeView.EndUpdate()
End If
End Sub
Protected Shared Function GetSessionNames(Optional ByVal raw As Boolean = False) As String()
Dim sessionsKey As RegistryKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey)
If sessionsKey Is Nothing Then Return New String() {}
Dim sessionNames As New List(Of String)
For Each sessionName As String In sessionsKey.GetSubKeyNames()
If raw Then
sessionNames.Add(sessionName)
Else
sessionNames.Add(Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")))
End If
Next
If raw Then
If Not sessionNames.Contains("Default%20Settings") Then ' Do not localize
sessionNames.Insert(0, "Default%20Settings")
End If
Else
If Not sessionNames.Contains("Default Settings") Then
sessionNames.Insert(0, "Default Settings")
End If
End If
Return sessionNames.ToArray()
End Function
Protected Shared Function LoadSessions() As Connection.PuttySession.Info()
Dim sessionList As New List(Of Connection.PuttySession.Info)
Dim sessionInfo As Connection.Info
For Each sessionName As String In GetSessionNames(True)
sessionInfo = SessionToConnectionInfo(sessionName)
If sessionInfo Is Nothing OrElse String.IsNullOrEmpty(sessionInfo.Hostname) Then Continue For
sessionList.Add(sessionInfo)
Next
Return sessionList.ToArray()
End Function
Protected Shared Function SessionToConnectionInfo(ByVal sessionName As String) As Connection.PuttySession.Info
Dim sessionsKey As RegistryKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey)
If sessionsKey Is Nothing Then Return Nothing
Dim sessionKey As RegistryKey = sessionsKey.OpenSubKey(sessionName)
If sessionKey Is Nothing Then Return Nothing
sessionName = Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B"))
Dim sessionInfo As New Connection.PuttySession.Info
With sessionInfo
.PuttySession = sessionName
.Name = sessionName
.Hostname = sessionKey.GetValue("HostName")
.Username = sessionKey.GetValue("UserName")
Dim protocol As String = sessionKey.GetValue("Protocol")
If protocol Is Nothing Then protocol = "ssh"
Select Case protocol.ToLowerInvariant()
Case "raw"
.Protocol = Protocols.RAW
Case "rlogin"
.Protocol = Protocols.Rlogin
Case "serial"
Return Nothing
Case "ssh"
Dim sshVersionObject As Object = sessionKey.GetValue("SshProt")
If sshVersionObject IsNot Nothing Then
Dim sshVersion As Integer = CType(sshVersionObject, Integer)
If sshVersion >= 2 Then
.Protocol = Protocols.SSH2
Else
.Protocol = Protocols.SSH1
End If
Else
.Protocol = Protocols.SSH2
End If
Case "telnet"
.Protocol = Protocols.Telnet
Case Else
Return Nothing
End Select
.Port = sessionKey.GetValue("PortNumber")
End With
Return sessionInfo
End Function
Public Shared Sub StartWatcher()
If _eventWatcher IsNot Nothing Then Return
Try
Dim currentUserSid As String = WindowsIdentity.GetCurrent().User.Value
Dim key As String = String.Join("\", {currentUserSid, PuttySessionsKey}).Replace("\", "\\")
Dim query As New WqlEventQuery(String.Format("SELECT * FROM RegistryTreeChangeEvent WHERE Hive = 'HKEY_USERS' AND RootPath = '{0}'", key))
_eventWatcher = New ManagementEventWatcher(query)
AddHandler _eventWatcher.EventArrived, AddressOf OnManagementEventArrived
_eventWatcher.Start()
Catch ex As Exception
MessageCollector.AddExceptionMessage("PuttySessions.Watcher.StartWatching() failed.", ex, MessageClass.WarningMsg, True)
End Try
End Sub
Public Shared Sub StopWatcher()
If _eventWatcher Is Nothing Then Return
_eventWatcher.Stop()
_eventWatcher.Dispose()
_eventWatcher = Nothing
End Sub
Private Shared Sub OnManagementEventArrived(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
AddSessionsToTree()
End Sub
Public Class SessionList
Inherits StringConverter
Public Shared ReadOnly Property Names() As String()
Get
Return GetSessionNames()
End Get
End Property
Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
Return New StandardValuesCollection(Names)
End Function
Public Overloads Overrides Function GetStandardValuesExclusive(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean
Return True
End Function
End Class
End Class
End Namespace

View File

@@ -0,0 +1,449 @@
Imports System.ComponentModel
Imports mRemoteNG.Tools.LocalizedAttributes
Namespace Connection
Partial Public Class Info
Public Class Inheritance
#Region "Public Properties"
#Region "General"
<LocalizedCategory("strCategoryGeneral", 1), _
LocalizedDisplayNameInheritAttribute("strPropertyNameAll"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionAll"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property EverythingInherited() As Boolean
Get
If CacheBitmaps And Colors And Description And DisplayThemes And DisplayWallpaper _
And EnableFontSmoothing And EnableDesktopComposition And Domain And Icon And Password _
And Port And Protocol And PuttySession And RedirectDiskDrives And RedirectKeys _
And RedirectPorts And RedirectPrinters And RedirectSmartCards And RedirectSound And Resolution _
And AutomaticResize And UseConsoleSession And UseCredSsp And RenderingEngine And UserField _
And ExtApp And Username And Panel And ICAEncryption And RDPAuthenticationLevel _
And LoadBalanceInfo And PreExtApp And PostExtApp And MacAddress And VNCAuthMode _
And VNCColors And VNCCompression And VNCEncoding And VNCProxyIP And VNCProxyPassword _
And VNCProxyPort And VNCProxyType And VNCProxyUsername Then
Return True
Else
Return False
End If
End Get
Set(ByVal value As Boolean)
SetAllValues(value)
End Set
End Property
#End Region
#Region "Display"
<LocalizedCategory("strCategoryDisplay", 2), _
LocalizedDisplayNameInheritAttribute("strPropertyNameDescription"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionDescription"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Description() As Boolean = My.Settings.InhDefaultDescription
<LocalizedCategory("strCategoryDisplay", 2), _
LocalizedDisplayNameInheritAttribute("strPropertyNameIcon"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionIcon"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Icon() As Boolean = My.Settings.InhDefaultIcon
<LocalizedCategory("strCategoryDisplay", 2), _
LocalizedDisplayNameInheritAttribute("strPropertyNamePanel"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionPanel"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Panel() As Boolean = My.Settings.InhDefaultPanel
#End Region
#Region "Connection"
<LocalizedCategory("strCategoryConnection", 3), _
LocalizedDisplayNameInheritAttribute("strPropertyNameUsername"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionUsername"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Username() As Boolean = My.Settings.InhDefaultUsername
<LocalizedCategory("strCategoryConnection", 3), _
LocalizedDisplayNameInheritAttribute("strPropertyNamePassword"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionPassword"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Password() As Boolean = My.Settings.InhDefaultPassword
<LocalizedCategory("strCategoryConnection", 3), _
LocalizedDisplayNameInheritAttribute("strPropertyNameDomain"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionDomain"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Domain() As Boolean = My.Settings.InhDefaultDomain
#End Region
#Region "Protocol"
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameProtocol"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionProtocol"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Protocol() As Boolean = My.Settings.InhDefaultProtocol
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameExternalTool"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionExternalTool"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property ExtApp() As Boolean = My.Settings.InhDefaultExtApp
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNamePort"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionPort"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Port() As Boolean = My.Settings.InhDefaultPort
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNamePuttySession"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionPuttySession"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property PuttySession() As Boolean = My.Settings.InhDefaultPuttySession
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameEncryptionStrength"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionEncryptionStrength"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property ICAEncryption() As Boolean = My.Settings.InhDefaultICAEncryptionStrength
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameAuthenticationLevel"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionAuthenticationLevel"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RDPAuthenticationLevel() As Boolean = My.Settings.InhDefaultRDPAuthenticationLevel
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameLoadBalanceInfo"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionLoadBalanceInfo"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property LoadBalanceInfo() As Boolean = My.Settings.InhDefaultLoadBalanceInfo
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRenderingEngine"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRenderingEngine"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RenderingEngine() As Boolean = My.Settings.InhDefaultRenderingEngine
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameUseConsoleSession"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionUseConsoleSession"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property UseConsoleSession() As Boolean = My.Settings.InhDefaultUseConsoleSession
<LocalizedCategory("strCategoryProtocol", 4), _
LocalizedDisplayNameInheritAttribute("strPropertyNameUseCredSsp"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionUseCredSsp"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property UseCredSsp() As Boolean = My.Settings.InhDefaultUseCredSsp
#End Region
#Region "RD Gateway"
<LocalizedCategory("strCategoryGateway", 5), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRDGatewayUsageMethod"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRDGatewayUsageMethod"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RDGatewayUsageMethod() As Boolean = My.Settings.InhDefaultRDGatewayUsageMethod
<LocalizedCategory("strCategoryGateway", 5), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRDGatewayHostname"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRDGatewayHostname"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RDGatewayHostname() As Boolean = My.Settings.InhDefaultRDGatewayHostname
<LocalizedCategory("strCategoryGateway", 5), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRDGatewayUseConnectionCredentials"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRDGatewayUseConnectionCredentials"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RDGatewayUseConnectionCredentials() As Boolean = My.Settings.InhDefaultRDGatewayUseConnectionCredentials
<LocalizedCategory("strCategoryGateway", 5), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRDGatewayUsername"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRDGatewayUsername"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RDGatewayUsername() As Boolean = My.Settings.InhDefaultRDGatewayUsername
<LocalizedCategory("strCategoryGateway", 5), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRDGatewayPassword"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRDGatewayPassword"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RDGatewayPassword() As Boolean = My.Settings.InhDefaultRDGatewayPassword
<LocalizedCategory("strCategoryGateway", 5), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRDGatewayDomain"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRDGatewayDomain"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RDGatewayDomain() As Boolean = My.Settings.InhDefaultRDGatewayDomain
#End Region
#Region "Appearance"
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameResolution"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionResolution"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Resolution() As Boolean = My.Settings.InhDefaultResolution
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameAutomaticResize"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionAutomaticResize"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property AutomaticResize() As Boolean = My.Settings.InhDefaultAutomaticResize
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameColors"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionColors"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property Colors() As Boolean = My.Settings.InhDefaultColors
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameCacheBitmaps"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionCacheBitmaps"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property CacheBitmaps() As Boolean = My.Settings.InhDefaultCacheBitmaps
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameDisplayWallpaper"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionDisplayWallpaper"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property DisplayWallpaper() As Boolean = My.Settings.InhDefaultDisplayWallpaper
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameDisplayThemes"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionDisplayThemes"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property DisplayThemes() As Boolean = My.Settings.InhDefaultDisplayThemes
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameEnableFontSmoothing"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionEnableFontSmoothing"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property EnableFontSmoothing() As Boolean = My.Settings.InhDefaultEnableFontSmoothing
<LocalizedCategory("strCategoryAppearance", 6), _
LocalizedDisplayNameInheritAttribute("strPropertyNameEnableDesktopComposition"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionEnableEnableDesktopComposition"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property EnableDesktopComposition() As Boolean = My.Settings.InhDefaultEnableDesktopComposition
#End Region
#Region "Redirect"
<LocalizedCategory("strCategoryRedirect", 7), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRedirectKeys"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRedirectKeys"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RedirectKeys() As Boolean = My.Settings.InhDefaultRedirectKeys
<LocalizedCategory("strCategoryRedirect", 7), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRedirectDrives"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRedirectDrives"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RedirectDiskDrives() As Boolean = My.Settings.InhDefaultRedirectDiskDrives
<LocalizedCategory("strCategoryRedirect", 7), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRedirectPrinters"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRedirectPrinters"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RedirectPrinters() As Boolean = My.Settings.InhDefaultRedirectPrinters
<LocalizedCategory("strCategoryRedirect", 7), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRedirectPorts"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRedirectPorts"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RedirectPorts() As Boolean = My.Settings.InhDefaultRedirectPorts
<LocalizedCategory("strCategoryRedirect", 7), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRedirectSmartCards"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRedirectSmartCards"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RedirectSmartCards() As Boolean = My.Settings.InhDefaultRedirectSmartCards
<LocalizedCategory("strCategoryRedirect", 7), _
LocalizedDisplayNameInheritAttribute("strPropertyNameRedirectSounds"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionRedirectSounds"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property RedirectSound() As Boolean = My.Settings.InhDefaultRedirectSound
#End Region
#Region "Misc"
<LocalizedCategory("strCategoryMiscellaneous", 8), _
LocalizedDisplayNameInheritAttribute("strPropertyNameExternalToolBefore"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionExternalToolBefore"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property PreExtApp() As Boolean = My.Settings.InhDefaultPreExtApp
<LocalizedCategory("strCategoryMiscellaneous", 8), _
LocalizedDisplayNameInheritAttribute("strPropertyNameExternalToolAfter"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionExternalToolAfter"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property PostExtApp() As Boolean = My.Settings.InhDefaultPostExtApp
<LocalizedCategory("strCategoryMiscellaneous", 8), _
LocalizedDisplayNameInheritAttribute("strPropertyNameMACAddress"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionMACAddress"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property MacAddress() As Boolean = My.Settings.InhDefaultMacAddress
<LocalizedCategory("strCategoryMiscellaneous", 8), _
LocalizedDisplayNameInheritAttribute("strPropertyNameUser1"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionUser1"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property UserField() As Boolean = My.Settings.InhDefaultUserField
#End Region
#Region "VNC"
<LocalizedCategory("strCategoryAppearance", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameCompression"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionCompression"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCCompression() As Boolean = My.Settings.InhDefaultVNCCompression
<LocalizedCategory("strCategoryAppearance", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameEncoding"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionEncoding"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCEncoding() As Boolean = My.Settings.InhDefaultVNCEncoding
<LocalizedCategory("strCategoryConnection", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameAuthenticationMode"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionAuthenticationMode"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCAuthMode() As Boolean = My.Settings.InhDefaultVNCAuthMode
<LocalizedCategory("strCategoryMiscellaneous", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameVNCProxyType"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionVNCProxyType"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCProxyType() As Boolean = My.Settings.InhDefaultVNCProxyType
<LocalizedCategory("strCategoryMiscellaneous", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameVNCProxyAddress"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionVNCProxyAddress"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCProxyIP() As Boolean = My.Settings.InhDefaultVNCProxyIP
<LocalizedCategory("strCategoryMiscellaneous", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameVNCProxyPort"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionVNCProxyPort"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCProxyPort() As Boolean = My.Settings.InhDefaultVNCProxyPort
<LocalizedCategory("strCategoryMiscellaneous", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameVNCProxyUsername"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionVNCProxyUsername"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCProxyUsername() As Boolean = My.Settings.InhDefaultVNCProxyUsername
<LocalizedCategory("strCategoryMiscellaneous", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameVNCProxyPassword"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionVNCProxyPassword"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCProxyPassword() As Boolean = My.Settings.InhDefaultVNCProxyPassword
<LocalizedCategory("strCategoryAppearance", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameColors"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionColors"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCColors() As Boolean = My.Settings.InhDefaultVNCColors
<LocalizedCategory("strCategoryAppearance", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameSmartSizeMode"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionSmartSizeMode"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCSmartSizeMode() As Boolean = My.Settings.InhDefaultVNCSmartSizeMode
<LocalizedCategory("strCategoryAppearance", 9), _
LocalizedDisplayNameInheritAttribute("strPropertyNameViewOnly"), _
LocalizedDescriptionInheritAttribute("strPropertyDescriptionViewOnly"), _
TypeConverter(GetType(Tools.Misc.YesNoTypeConverter))> _
Public Property VNCViewOnly() As Boolean = My.Settings.InhDefaultVNCViewOnly
#End Region
<Browsable(False)> _
Public Property Parent() As Object
<Browsable(False)> _
Public Property IsDefault() As Boolean
#End Region
#Region "Constructors"
Public Sub New(ByVal parent As Object, Optional ByVal inheritEverything As Boolean = False)
Me.Parent = parent
If inheritEverything Then TurnOnInheritanceCompletely()
End Sub
#End Region
#Region "Public Methods"
Public Function Copy() As Inheritance
Return MemberwiseClone()
End Function
Public Sub TurnOnInheritanceCompletely()
SetAllValues(True)
End Sub
Public Sub TurnOffInheritanceCompletely()
SetAllValues(False)
End Sub
#End Region
#Region "Private Methods"
Private Sub SetAllValues(ByVal value As Boolean)
' Display
Description = value
Icon = value
Panel = value
' Connection
Username = value
Password = value
Domain = value
' Protocol
Protocol = value
ExtApp = value
Port = value
PuttySession = value
ICAEncryption = value
RDPAuthenticationLevel = value
LoadBalanceInfo = value
RenderingEngine = value
UseConsoleSession = value
UseCredSsp = value
' RD Gateway
RDGatewayUsageMethod = value
RDGatewayHostname = value
RDGatewayUseConnectionCredentials = value
RDGatewayUsername = value
RDGatewayPassword = value
RDGatewayDomain = value
' Appearance
Resolution = value
AutomaticResize = value
Colors = value
CacheBitmaps = value
DisplayWallpaper = value
DisplayThemes = value
EnableFontSmoothing = value
EnableDesktopComposition = value
' Redirect
RedirectKeys = value
RedirectDiskDrives = value
RedirectPrinters = value
RedirectPorts = value
RedirectSmartCards = value
RedirectSound = value
' Misc
PreExtApp = value
PostExtApp = value
MacAddress = value
UserField = value
' VNC
VNCCompression = value
VNCEncoding = value
VNCAuthMode = value
VNCProxyType = value
VNCProxyIP = value
VNCProxyPort = value
VNCProxyUsername = value
VNCProxyPassword = value
VNCColors = value
VNCSmartSizeMode = value
VNCViewOnly = value
End Sub
#End Region
End Class
End Class
End Namespace

File diff suppressed because it is too large Load Diff

View File

@@ -74,7 +74,7 @@ Namespace Connection
Dim strHost As String = Me.InterfaceControl.Info.Hostname
Dim strAuth As String = ""
If Me.InterfaceControl.Info.Username <> "" And Me.InterfaceControl.Info.Password <> "" Then
If Not ((Force And Info.Force.NoCredentials) = Info.Force.NoCredentials) And Not String.IsNullOrEmpty(InterfaceControl.Info.Username) And Not String.IsNullOrEmpty(InterfaceControl.Info.Password) Then
strAuth = "Authorization: Basic " + Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(Me.InterfaceControl.Info.Username & ":" & Me.InterfaceControl.Info.Password)) & vbNewLine
End If

View File

@@ -97,6 +97,8 @@ Namespace Connection
#Region "Private Methods"
Private Sub SetCredentials()
Try
If (Force And Info.Force.NoCredentials) = Info.Force.NoCredentials Then Return
Dim _user As String = Me.Info.Username
Dim _pass As String = Me.Info.Password
Dim _dom As String = Me.Info.Domain

View File

@@ -1,186 +0,0 @@
Imports mRemoteNG.App.Native
Imports System.Threading
Imports mRemoteNG.App.Runtime
Imports mRemoteNG.Tools
Namespace Connection
Namespace Protocol
Public Class IntApp
Inherits Connection.Protocol.Base
#Region "Private Properties"
Private IntAppProcessStartInfo As New ProcessStartInfo()
Private Arguments As String
Private ExtApp As Tools.ExternalTool
#End Region
#Region "Public Properties"
Private _IntAppHandle As IntPtr
Public Property IntAppHandle() As IntPtr
Get
Return Me._IntAppHandle
End Get
Set(ByVal value As IntPtr)
Me._IntAppHandle = value
End Set
End Property
Private _IntAppProcess As Process
Public Property IntAppProcess() As Process
Get
Return Me._IntAppProcess
End Get
Set(ByVal value As Process)
Me._IntAppProcess = value
End Set
End Property
Private _IntAppPath As String
Public Property IntAppPath() As String
Get
Return _IntAppPath
End Get
Set(ByVal value As String)
_IntAppPath = value
End Set
End Property
Public ReadOnly Property Focused() As Boolean
Get
If GetForegroundWindow() = IntAppHandle Then
Return True
Else
Return False
End If
End Get
End Property
#End Region
#Region "Private Events & Handlers"
Private Sub ProcessExited(ByVal sender As Object, ByVal e As System.EventArgs)
MyBase.Event_Closed(Me)
End Sub
#End Region
#Region "Public Methods"
Public Sub New()
End Sub
Public Overrides Function SetProps() As Boolean
ExtApp = App.Runtime.GetExtAppByName(InterfaceControl.Info.ExtApp)
If InterfaceControl.Info IsNot Nothing Then
ExtApp.ConnectionInfo = InterfaceControl.Info
End If
_IntAppPath = ExtApp.ParseText(ExtApp.FileName)
Arguments = ExtApp.ParseText(ExtApp.Arguments)
Return MyBase.SetProps()
End Function
Public Overrides Function Connect() As Boolean
Try
If ExtApp.TryIntegrate = False Then
ExtApp.Start(Me.InterfaceControl.Info)
Me.Close()
Return Nothing
End If
IntAppProcessStartInfo.UseShellExecute = False
IntAppProcessStartInfo.FileName = _IntAppPath
IntAppProcessStartInfo.Arguments = CommandLineArguments.EscapeBackslashes(Arguments)
IntAppProcess = Process.Start(IntAppProcessStartInfo)
IntAppProcess.EnableRaisingEvents = True
IntAppProcess.WaitForInputIdle()
AddHandler IntAppProcess.Exited, AddressOf ProcessExited
Dim TryCount As Integer = 0
Do Until IntAppProcess.MainWindowHandle <> IntPtr.Zero And Me.InterfaceControl.Handle <> IntPtr.Zero And Me.IntAppProcess.MainWindowTitle <> "Default IME"
If TryCount >= My.Settings.MaxPuttyWaitTime * 2 Then
Exit Do
End If
IntAppProcess.Refresh()
Thread.Sleep(500)
TryCount += 1
Loop
IntAppHandle = IntAppProcess.MainWindowHandle
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strIntAppStuff, True)
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strIntAppHandle, IntAppHandle.ToString), True)
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strIntAppTitle, IntAppProcess.MainWindowTitle), True)
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strIntAppParentHandle, Me.InterfaceControl.Parent.Handle.ToString), True)
SetParent(Me.IntAppHandle, Me.InterfaceControl.Parent.Handle)
SetWindowLong(Me.IntAppHandle, 0, WS_VISIBLE)
ShowWindow(Me.IntAppHandle, SW_SHOWMAXIMIZED)
Resize(Me, New EventArgs)
MyBase.Connect()
Return True
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIntAppConnectionFailed & vbNewLine & ex.Message)
Return False
End Try
End Function
Public Overrides Sub Focus()
Try
SetForegroundWindow(IntAppHandle)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIntAppFocusFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Public Overrides Sub Resize(ByVal sender As Object, ByVal e As EventArgs)
Try
If InterfaceControl.Size = Size.Empty Then Return
MoveWindow(IntAppHandle, -SystemInformation.FrameBorderSize.Width, -(SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height), Me.InterfaceControl.Width + (SystemInformation.FrameBorderSize.Width * 2), Me.InterfaceControl.Height + SystemInformation.CaptionHeight + (SystemInformation.FrameBorderSize.Height * 2), True)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIntAppResizeFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Public Overrides Sub Close()
Try
If IntAppProcess.HasExited = False Then
IntAppProcess.Kill()
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIntAppKillFailed & vbNewLine & ex.Message, True)
End Try
Try
If IntAppProcess.HasExited = False Then
IntAppProcess.Dispose()
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIntAppDisposeFailed & vbNewLine & ex.Message, True)
End Try
MyBase.Close()
End Sub
#End Region
#Region "Public Shared Methods"
#End Region
#Region "Enums"
Public Enum Defaults
Port = 0
End Enum
#End Region
End Class
End Namespace
End Namespace

View File

@@ -0,0 +1,121 @@
Imports mRemoteNG.App.Native
Imports System.Threading
Imports mRemoteNG.App.Runtime
Imports mRemoteNG.Tools
Namespace Connection
Namespace Protocol
Public Class IntegratedProgram
Inherits Base
#Region "Public Methods"
Public Overrides Function SetProps() As Boolean
If InterfaceControl.Info IsNot Nothing Then
_externalTool = GetExtAppByName(InterfaceControl.Info.ExtApp)
_externalTool.ConnectionInfo = InterfaceControl.Info
End If
Return MyBase.SetProps()
End Function
Public Overrides Function Connect() As Boolean
Try
If _externalTool.TryIntegrate = False Then
_externalTool.Start(InterfaceControl.Info)
Close()
Return Nothing
End If
_process = New Process()
With _process.StartInfo
.UseShellExecute = True
.FileName = _externalTool.ParseArguments(_externalTool.FileName)
.Arguments = _externalTool.ParseArguments(_externalTool.Arguments)
End With
_process.EnableRaisingEvents = True
AddHandler _process.Exited, AddressOf ProcessExited
_process.Start()
_process.WaitForInputIdle(My.Settings.MaxPuttyWaitTime * 1000)
Dim startTicks As Integer = Environment.TickCount
While _handle.ToInt32 = 0 And Environment.TickCount < startTicks + (My.Settings.MaxPuttyWaitTime * 1000)
_process.Refresh()
If Not _process.MainWindowTitle = "Default IME" Then _handle = _process.MainWindowHandle
If _handle.ToInt32 = 0 Then Thread.Sleep(0)
End While
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(Me, New EventArgs)
MyBase.Connect()
Return True
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strIntAppConnectionFailed, ex)
Return False
End Try
End Function
Public Overrides Sub Focus()
Try
If ConnectionWindow.InTabDrag Then Return
SetForegroundWindow(_handle)
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strIntAppFocusFailed, ex, , True)
End Try
End Sub
Public Overrides Sub Resize(ByVal sender As Object, ByVal e As EventArgs)
Try
If InterfaceControl.Size = Size.Empty Then Return
MoveWindow(_handle, -SystemInformation.FrameBorderSize.Width, -(SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height), InterfaceControl.Width + (SystemInformation.FrameBorderSize.Width * 2), InterfaceControl.Height + SystemInformation.CaptionHeight + (SystemInformation.FrameBorderSize.Height * 2), True)
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strIntAppResizeFailed, ex, , True)
End Try
End Sub
Public Overrides Sub Close()
Try
If Not _process.HasExited Then _process.Kill()
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strIntAppKillFailed, ex, , True)
End Try
Try
If Not _process.HasExited Then _process.Dispose()
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strIntAppDisposeFailed, ex, , True)
End Try
MyBase.Close()
End Sub
#End Region
#Region "Private Fields"
Private _externalTool As ExternalTool
Private _handle As IntPtr
Private _process As Process
#End Region
#Region "Private Methods"
Private Sub ProcessExited(ByVal sender As Object, ByVal e As EventArgs)
Event_Closed(Me)
End Sub
#End Region
#Region "Enumerations"
Public Enum Defaults
Port = 0
End Enum
#End Region
End Class
End Namespace
End Namespace

View File

@@ -1,8 +1,21 @@
Imports System.ComponentModel
Imports mRemoteNG.Tools.LocalizedAttributes
Namespace Connection
Namespace Protocol
Public Class Converter
Public Shared Function ProtocolToString(ByVal protocol As Protocols) As String
Return protocol.ToString()
End Function
Public Shared Function StringToProtocol(ByVal protocol As String) As Protocols
Try
Return [Enum].Parse(GetType(Protocols), protocol, True)
Catch ex As Exception
Return Protocols.RDP
End Try
End Function
End Class
Public Enum Protocols
<LocalizedDescription("strRDP")> _
RDP = 0
@@ -26,8 +39,6 @@ Namespace Connection
ICA = 9
<LocalizedDescription("strExtApp")> _
IntApp = 20
<Browsable(False)> _
NONE = 999
End Enum
End Namespace
End Namespace

View File

@@ -97,7 +97,7 @@ Namespace Connection
Public Overrides Function Connect() As Boolean
Try
_isPuttyNg = IsFilePuttyNg(PuttyPath)
_isPuttyNg = (PuttyTypeDetector.GetPuttyType() = PuttyTypeDetector.PuttyType.PuttyNg)
PuttyProcess = New Process
With PuttyProcess.StartInfo
@@ -135,11 +135,14 @@ Namespace Connection
End If
arguments.Add("-" & _PuttySSHVersion)
If Not String.IsNullOrEmpty(username) Then
arguments.Add("-l", username)
End If
If Not String.IsNullOrEmpty(password) Then
arguments.Add("-pw", password)
If Not ((Force And Info.Force.NoCredentials) = Info.Force.NoCredentials) Then
If Not String.IsNullOrEmpty(username) Then
arguments.Add("-l", username)
End If
If Not String.IsNullOrEmpty(password) Then
arguments.Add("-pw", password)
End If
End If
End If
@@ -237,18 +240,6 @@ Namespace Connection
End Sub
#End Region
#Region "Public Shared Methods"
Public Shared Function IsFilePuttyNg(file As String) As Boolean
Dim isPuttyNg As Boolean
Try
isPuttyNg = FileVersionInfo.GetVersionInfo(file).InternalName.Contains("PuTTYNG")
Catch
isPuttyNg = False
End Try
Return isPuttyNg
End Function
#End Region
#Region "Enums"
Public Enum Putty_Protocol
ssh = 0

View File

@@ -238,8 +238,13 @@ Namespace Connection
Private Sub SetRdGateway()
Try
If _rdpClient.TransportSettings.GatewayIsSupported = 0 Then Return
MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayIsSupported, True)
If _rdpClient.TransportSettings.GatewayIsSupported = 0 Then
MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayNotSupported, True)
Return
Else
MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayIsSupported, True)
End If
If Not _connectionInfo.RDGatewayUsageMethod = RDGatewayUsageMethod.Never Then
_rdpClient.TransportSettings.GatewayUsageMethod = _connectionInfo.RDGatewayUsageMethod
_rdpClient.TransportSettings.GatewayHostname = _connectionInfo.RDGatewayHostname
@@ -247,7 +252,7 @@ Namespace Connection
If _connectionInfo.RDGatewayUseConnectionCredentials = RDGatewayUseConnectionCredentials.SmartCard Then
_rdpClient.TransportSettings.GatewayCredsSource = 1 ' TSC_PROXY_CREDS_MODE_SMARTCARD
End If
If _rdpVersion >= Versions.RDC61 Then
If _rdpVersion >= Versions.RDC61 And Not ((Force And Info.Force.NoCredentials) = Info.Force.NoCredentials) Then
If _connectionInfo.RDGatewayUseConnectionCredentials = RDGatewayUseConnectionCredentials.Yes Then
_rdpClient.TransportSettings2.GatewayUsername = _connectionInfo.Username
_rdpClient.TransportSettings2.GatewayPassword = _connectionInfo.Password
@@ -261,8 +266,6 @@ Namespace Connection
_rdpClient.TransportSettings2.GatewayCredSharing = 0
End If
End If
Else
MessageCollector.AddMessage(MessageClass.InformationMsg, My.Language.strRdpGatewayNotSupported, True)
End If
Catch ex As Exception
MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strRdpSetGatewayFailed & vbNewLine & ex.Message, True)
@@ -295,6 +298,8 @@ Namespace Connection
Private Sub SetCredentials()
Try
If (Force And Info.Force.NoCredentials) = Info.Force.NoCredentials Then Return
Dim userName As String = _connectionInfo.Username
Dim password As String = _connectionInfo.Password
Dim domain As String = _connectionInfo.Domain
@@ -635,77 +640,91 @@ Namespace Connection
#Region "Terminal Sessions"
Public Class TerminalSessions
Dim oWTSCOM As New WTSCOM
Dim oWTSSessions As New WTSSessions
Dim oWTSSession As New WTSSession
Public ServerHandle As Long
Private ReadOnly _wtsCom As WTSCOM
Public Function OpenConnection(ByVal SrvName As String) As Boolean
Public Sub New()
Try
ServerHandle = oWTSCOM.WTSOpenServer(SrvName)
If ServerHandle <> 0 Then
Return True
End If
_wtsCom = New WTSCOM
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpOpenConnectionFailed & vbNewLine & ex.Message, True)
End Try
Return False
End Function
Public Sub CloseConnection(ByVal SrvHandle As Long)
Try
oWTSCOM.WTSCloseServer(ServerHandle)
ServerHandle = 0
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpCloseConnectionFailed & vbNewLine & ex.Message, True)
MessageCollector.AddExceptionMessage("TerminalSessions.New() failed.", ex, MessageClass.ErrorMsg, True)
End Try
End Sub
Public Function GetSessions() As Sessions
Dim colSessions As New Sessions
Public Function OpenConnection(ByVal hostname As String) As Long
If _wtsCom Is Nothing Then Return 0
Try
oWTSSessions = oWTSCOM.WTSEnumerateSessions(ServerHandle)
Return _wtsCom.WTSOpenServer(hostname)
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strRdpOpenConnectionFailed, ex, MessageClass.ErrorMsg, True)
End Try
End Function
Dim SessionID As Long
Dim SessionUser As String
Dim SessionState As Long
Dim SessionName As String
Public Sub CloseConnection(ByVal serverHandle As Long)
If _wtsCom Is Nothing Then Return
For Each oWTSSession In oWTSSessions
SessionID = oWTSSession.SessionId
SessionUser = oWTSCOM.WTSQuerySessionInformation(ServerHandle, oWTSSession.SessionId, 5) 'WFUsername = 5
SessionState = oWTSSession.State & vbCrLf
SessionName = oWTSSession.WinStationName & vbCrLf
Try
_wtsCom.WTSCloseServer(serverHandle)
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strRdpCloseConnectionFailed, ex, MessageClass.ErrorMsg, True)
End Try
End Sub
If SessionUser <> "" Then
If SessionState = 0 Then
colSessions.Add(SessionID, My.Language.strActive, SessionUser, SessionName)
Public Function GetSessions(ByVal serverHandle As Long) As SessionsCollection
If _wtsCom Is Nothing Then Return New SessionsCollection()
Dim sessions As New SessionsCollection()
Try
Dim wtsSessions As WTSSessions = _wtsCom.WTSEnumerateSessions(serverHandle)
Dim sessionId As Long
Dim sessionUser As String
Dim sessionState As Long
Dim sessionName As String
For Each wtsSession As WTSSession In wtsSessions
sessionId = wtsSession.SessionId
sessionUser = _wtsCom.WTSQuerySessionInformation(serverHandle, wtsSession.SessionId, 5) ' WFUsername = 5
sessionState = wtsSession.State & vbCrLf
sessionName = wtsSession.WinStationName & vbCrLf
If Not String.IsNullOrEmpty(sessionUser) Then
If sessionState = 0 Then
sessions.Add(sessionId, My.Language.strActive, sessionUser, sessionName)
Else
colSessions.Add(SessionID, My.Language.strInactive, SessionUser, SessionName)
sessions.Add(sessionId, My.Language.strInactive, sessionUser, sessionName)
End If
End If
Next
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpGetSessionsFailed & vbNewLine & ex.Message, True)
MessageCollector.AddExceptionMessage(My.Language.strRdpGetSessionsFailed, ex, MessageClass.ErrorMsg, True)
End Try
Return colSessions
Return sessions
End Function
Public Function KillSession(ByVal SessionID As Long) As Boolean
Return oWTSCOM.WTSLogoffSession(ServerHandle, SessionID, True)
Public Function KillSession(ByVal serverHandle As Long, ByVal sessionId As Long) As Boolean
If _wtsCom Is Nothing Then Return False
Dim result As Boolean = False
Try
result = _wtsCom.WTSLogoffSession(serverHandle, sessionId, True)
Catch ex As Exception
MessageCollector.AddExceptionMessage("TerminalSessions.KillSession() failed.", ex, MessageClass.ErrorMsg, True)
End Try
Return result
End Function
End Class
Public Class Sessions
Public Class SessionsCollection
Inherits CollectionBase
Default Public ReadOnly Property Items(ByVal Index As Integer) As Session
Default Public ReadOnly Property Items(ByVal index As Integer) As Session
Get
Return CType(List.Item(Index), Session)
Return CType(List.Item(index), Session)
End Get
End Property
@@ -715,23 +734,23 @@ Namespace Connection
End Get
End Property
Public Function Add(ByVal SessionID As Long, ByVal SessionState As String, ByVal SessionUser As String, ByVal SessionName As String) As Session
Dim newSes As New Session
Public Overloads Function Add(ByVal sessionId As Long, ByVal sessionState As String, ByVal sessionUser As String, ByVal sessionName As String) As Session
Dim newSession As New Session
Try
With newSes
.SessionID = SessionID
.SessionState = SessionState
.SessionUser = SessionUser
.SessionName = SessionName
With newSession
.SessionId = sessionId
.SessionState = sessionState
.SessionUser = sessionUser
.SessionName = sessionName
End With
List.Add(newSes)
List.Add(newSession)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpAddSessionFailed & vbNewLine & ex.Message, True)
MessageCollector.AddExceptionMessage(My.Language.strRdpAddSessionFailed, ex, MessageClass.ErrorMsg, True)
End Try
Return newSes
Return newSession
End Function
Public Sub ClearSessions()
@@ -742,45 +761,10 @@ Namespace Connection
Public Class Session
Inherits CollectionBase
Private lngSessionID As Long
Public Property SessionID() As Long
Get
Return lngSessionID
End Get
Set(ByVal Value As Long)
lngSessionID = Value
End Set
End Property
Private lngSessionState As String
Public Property SessionId() As Long
Public Property SessionState() As String
Get
Return lngSessionState
End Get
Set(ByVal Value As String)
lngSessionState = Value
End Set
End Property
Private strSessionUser As String
Public Property SessionUser() As String
Get
Return strSessionUser
End Get
Set(ByVal Value As String)
strSessionUser = Value
End Set
End Property
Private strSessionName As String
Public Property SessionName() As String
Get
Return strSessionName
End Get
Set(ByVal Value As String)
strSessionName = Value
End Set
End Property
End Class
#End Region

View File

@@ -208,7 +208,7 @@ Namespace Connection
AddHandler VNC.ConnectComplete, AddressOf VNCEvent_Connected
AddHandler VNC.ConnectionLost, AddressOf VNCEvent_Disconnected
AddHandler mRemoteNG.frmMain.clipboardchange, AddressOf VNCEvent_ClipboardChanged
If Not String.IsNullOrEmpty(Info.Password) Then
If Not ((Force And Info.Force.NoCredentials) = Info.Force.NoCredentials) And Not String.IsNullOrEmpty(Info.Password) Then
VNC.GetPassword = AddressOf VNCEvent_Authenticate
End If
Catch ex As Exception

View File

@@ -1,31 +0,0 @@
Imports mRemoteNG.App.Runtime
Namespace Connection
Public Class QuickConnect
Private Shared qBox As ToolStripComboBox = frmMain.cmbQuickConnect
Public Class History
Public Shared Function Exists(ByVal Text As String) As Boolean
Try
For i As Integer = 0 To qBox.Items.Count - 1
If qBox.Items(i) = Text Then
Return True
End If
Next
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strQuickConnectHistoryExistsFailed & vbNewLine & ex.Message, True)
End Try
Return False
End Function
Public Shared Sub Add(ByVal Text As String)
Try
qBox.Items.Insert(0, Text)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strQuickConnectAddFailed & vbNewLine & ex.Message, True)
End Try
End Sub
End Class
End Class
End Namespace

View File

@@ -100,6 +100,7 @@ Namespace Connection
#End Region
#Region "IComponent"
<Browsable(False)> _
Public Property Site() As ISite Implements IComponent.Site
Get
Return New PropertyGridCommandSite(Me)

View File

@@ -0,0 +1,180 @@
Imports System.ComponentModel
Namespace Controls
Public Class ListView
Inherits Windows.Forms.ListView
#Region "Public Properties"
<Category("Appearance"),
DefaultValue(GetType(Color), "HighlightText")> _
Public Property HighlightForeColor As Color = SystemColors.HighlightText
<Category("Appearance"),
DefaultValue(GetType(Color), "Highlight")> _
Public Property HighlightBackColor As Color = SystemColors.Highlight
<Category("Appearance"),
DefaultValue(GetType(Color), "HotTrack")> _
Public Property HighlightBorderColor As Color = SystemColors.HotTrack
<Category("Appearance"),
DefaultValue(GetType(Color), "ControlText")> _
Public Property InactiveHighlightForeColor As Color = SystemColors.ControlText
<Category("Appearance"),
DefaultValue(GetType(Color), "Control")> _
Public Property InactiveHighlightBackColor As Color = SystemColors.Control
<Category("Appearance"),
DefaultValue(GetType(Color), "ControlDark")> _
Public Property InactiveHighlightBorderColor As Color = SystemColors.ControlDark
<Category("Appearance"),
DefaultValue(True)> _
Public Overloads Property ShowFocusCues As Boolean = True
<Category("Appearance")> _
Public Property LabelAlignment As New Alignment(VerticalAlignment.Top, HorizontalAlignment.Left)
#End Region
#Region "Constructors"
Public Sub New()
OwnerDraw = True
End Sub
#End Region
#Region "Protected Methods"
Protected Overrides Sub OnDrawItem(e As DrawListViewItemEventArgs)
If Not View = View.Tile Then MyBase.OnDrawItem(e)
If e.ItemIndex < 0 Then MyBase.OnDrawItem(e)
Dim foreColorBrush As Brush = Nothing
Dim backColorBrush As Brush = Nothing
Dim borderPen As Pen = Nothing
Try
If Focused Then
borderPen = New Pen(HighlightBorderColor)
Else
borderPen = New Pen(InactiveHighlightBorderColor)
End If
If e.Item.Selected Then
If Focused Then
foreColorBrush = New SolidBrush(HighlightForeColor)
backColorBrush = New SolidBrush(HighlightBackColor)
Else
foreColorBrush = New SolidBrush(InactiveHighlightForeColor)
backColorBrush = New SolidBrush(InactiveHighlightBackColor)
End If
Else
foreColorBrush = New SolidBrush(e.Item.ForeColor)
backColorBrush = New SolidBrush(BackColor)
End If
e.Graphics.FillRectangle(backColorBrush, e.Bounds)
If Focused And ShowFocusCues Then
e.DrawFocusRectangle()
ElseIf e.Item.Selected Then
e.Graphics.DrawRectangle(borderPen, e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1)
End If
Dim imageBounds As New Rectangle(e.Bounds.X + 2, e.Bounds.Y + 6, 16, 16)
Dim textBounds As Rectangle = e.Bounds
If e.Item.ImageList IsNot Nothing Then
Dim image As Image = Nothing
If Not String.IsNullOrEmpty(e.Item.ImageKey) And e.Item.ImageList.Images.ContainsKey(e.Item.ImageKey) Then
image = e.Item.ImageList.Images.Item(e.Item.ImageKey)
ElseIf Not e.Item.ImageIndex < 0 And e.Item.ImageList.Images.Count > e.Item.ImageIndex Then
image = e.Item.ImageList.Images(e.Item.ImageIndex)
End If
If image IsNot Nothing Then
e.Graphics.DrawImageUnscaledAndClipped(image, imageBounds)
textBounds.X = textBounds.Left + 20
textBounds.Width = textBounds.Width - 20
End If
End If
e.Graphics.DrawString(e.Item.Text, e.Item.Font, foreColorBrush, textBounds, GetStringFormat())
Finally
If foreColorBrush IsNot Nothing Then foreColorBrush.Dispose()
If backColorBrush IsNot Nothing Then backColorBrush.Dispose()
If borderPen IsNot Nothing Then borderPen.Dispose()
End Try
End Sub
#End Region
#Region "Private Methods"
Private Function GetStringFormat() As StringFormat
Dim format As StringFormat = StringFormat.GenericDefault
Select Case LabelAlignment.Vertical
Case VerticalAlignment.Top
format.LineAlignment = StringAlignment.Near
Case VerticalAlignment.Middle
format.LineAlignment = StringAlignment.Center
Case VerticalAlignment.Bottom
format.LineAlignment = StringAlignment.Far
End Select
Select Case LabelAlignment.Horizontal
Case HorizontalAlignment.Left
format.Alignment = StringAlignment.Near
Case HorizontalAlignment.Center
format.Alignment = StringAlignment.Center
Case HorizontalAlignment.Right
format.Alignment = StringAlignment.Far
End Select
If RightToLeft Then
format.FormatFlags = format.FormatFlags Or StringFormatFlags.DirectionRightToLeft
End If
If LabelWrap Then
format.FormatFlags = format.FormatFlags And Not StringFormatFlags.NoWrap
Else
format.FormatFlags = format.FormatFlags Or StringFormatFlags.NoWrap
End If
Return format
End Function
#End Region
End Class
<TypeConverter(GetType(ExpandableObjectConverter))> _
Public Class Alignment
Public Sub New()
End Sub
Public Sub New(ByVal verticalAlignment As VerticalAlignment, ByVal horizontalAlignment As HorizontalAlignment)
Vertical = verticalAlignment
Horizontal = horizontalAlignment
End Sub
<NotifyParentProperty(True),
DefaultValue(VerticalAlignment.Top)> _
Public Property Vertical As VerticalAlignment = VerticalAlignment.Top
<NotifyParentProperty(True),
DefaultValue(HorizontalAlignment.Left)> _
Public Property Horizontal As HorizontalAlignment = HorizontalAlignment.Left
Public Overrides Function ToString() As String
Return String.Format("{0}, {1}", Vertical, Horizontal)
End Function
End Class
Public Enum VerticalAlignment As Integer
Top
Middle
Bottom
End Enum
Public Enum HorizontalAlignment As Integer
Left
Center
Right
End Enum
End Namespace

View File

@@ -0,0 +1,165 @@
Imports mRemoteNG.App.Runtime
Namespace Controls
Public Class QuickConnectComboBox
Inherits ToolStripComboBox
Private WithEvents _comboBox As ComboBox
Private _ignoreEnter As Boolean = False
Public Sub New()
_comboBox = ComboBox
_comboBox.DrawMode = DrawMode.OwnerDrawFixed
' This makes it so that _ignoreEnter works correctly before any items are added to the combo box
_comboBox.Items.Clear()
End Sub
Private Sub ComboBox_PreviewKeyDown(ByVal sender As Object, ByVal e As PreviewKeyDownEventArgs) Handles _comboBox.PreviewKeyDown
If e.KeyCode = Keys.Enter And _comboBox.DroppedDown Then _ignoreEnter = True
End Sub
Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)
MyBase.OnKeyDown(e)
If e.KeyCode = Keys.Enter Then
' Only connect if Enter was not pressed while the combo box was dropped down
If Not _ignoreEnter Then OnConnectRequested(New ConnectRequestedEventArgs(_comboBox.Text))
_ignoreEnter = False
e.Handled = True
ElseIf e.KeyCode = Keys.Delete And _comboBox.DroppedDown Then
If Not _comboBox.SelectedIndex = -1 Then
' Items can't be removed from the ComboBox while it is dropped down without possibly causing
' an exception so we must close it, delete the item, and then drop it down again. When we
' close it programmatically, the SelectedItem may revert to Nothing, so we must save it first.
Dim item As Object = _comboBox.SelectedItem
_comboBox.DroppedDown = False
_comboBox.Items.Remove(item)
_comboBox.SelectedIndex = -1
If Not _comboBox.Items.Count = 0 Then
_comboBox.DroppedDown = True
End If
End If
e.Handled = True
End If
End Sub
Private Sub ComboBox_SelectedIndexChanged(sender As System.Object, e As EventArgs) Handles _comboBox.SelectedIndexChanged
If Not TypeOf _comboBox.SelectedItem Is HistoryItem Then Return
Dim historyItem As HistoryItem = CType(_comboBox.SelectedItem, HistoryItem)
OnProtocolChanged(New ProtocolChangedEventArgs(historyItem.ConnectionInfo.Protocol))
End Sub
Private Shared Sub ComboBox_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles _comboBox.DrawItem
Dim comboBox As ComboBox = TryCast(sender, ComboBox)
If comboBox Is Nothing Then Return
Dim drawItem As Object = comboBox.Items(e.Index)
Dim drawString As String
If TypeOf drawItem Is HistoryItem Then
Dim historyItem As HistoryItem = CType(drawItem, HistoryItem)
drawString = historyItem.ToString(includeProtocol:=True)
Else
drawString = drawItem.ToString()
End If
e.DrawBackground()
e.Graphics.DrawString(drawString, e.Font, New SolidBrush(e.ForeColor), New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height))
e.DrawFocusRectangle()
End Sub
Private Structure HistoryItem
Implements IEquatable(Of HistoryItem)
Public Property ConnectionInfo As Connection.Info
Public Overloads Function Equals(other As HistoryItem) As Boolean Implements IEquatable(Of HistoryItem).Equals
If Not ConnectionInfo.Hostname = other.ConnectionInfo.Hostname Then Return False
If Not ConnectionInfo.Port = other.ConnectionInfo.Port Then Return False
If Not ConnectionInfo.Protocol = other.ConnectionInfo.Protocol Then Return False
Return True
End Function
Public Overrides Function ToString() As String
Return ToString(False)
End Function
Public Overloads Function ToString(ByVal includeProtocol As Boolean) As String
Dim port As String = String.Empty
If Not ConnectionInfo.Port = ConnectionInfo.GetDefaultPort() Then
port = String.Format(":{0}", ConnectionInfo.Port)
End If
If includeProtocol Then
Return String.Format("{0}{1} ({2})", ConnectionInfo.Hostname, port, ConnectionInfo.Protocol)
Else
Return String.Format("{0}{1}", ConnectionInfo.Hostname, port)
End If
End Function
End Structure
Private Function Exists(ByVal searchItem As HistoryItem) As Boolean
For Each item As Object In _comboBox.Items
If Not TypeOf item Is HistoryItem Then Continue For
Dim historyItem As HistoryItem = CType(item, HistoryItem)
If historyItem.Equals(searchItem) Then Return True
Next
Return False
End Function
Public Sub Add(ByVal connectionInfo As Connection.Info)
Try
Dim historyItem As New HistoryItem
historyItem.ConnectionInfo = connectionInfo
If Not Exists(historyItem) Then _comboBox.Items.Insert(0, historyItem)
Catch ex As Exception
MessageCollector.AddExceptionMessage(My.Language.strQuickConnectAddFailed, ex, Messages.MessageClass.ErrorMsg, True)
End Try
End Sub
#Region "Events"
Public Class ConnectRequestedEventArgs
Inherits EventArgs
Public Sub New(ByVal connectionString As String)
_connectionString = connectionString
End Sub
Private ReadOnly _connectionString As String
Public ReadOnly Property ConnectionString As String
Get
Return _connectionString
End Get
End Property
End Class
Public Event ConnectRequested(ByVal sender As Object, ByVal e As ConnectRequestedEventArgs)
Protected Overridable Sub OnConnectRequested(ByVal e As ConnectRequestedEventArgs)
RaiseEvent ConnectRequested(Me, New ConnectRequestedEventArgs(e.ConnectionString))
End Sub
Public Class ProtocolChangedEventArgs
Inherits EventArgs
Public Sub New(ByVal protocol As Connection.Protocol.Protocols)
_protocol = protocol
End Sub
Private ReadOnly _protocol As Connection.Protocol.Protocols
Public ReadOnly Property Protocol As Connection.Protocol.Protocols
Get
Return _protocol
End Get
End Property
End Class
Public Event ProtocolChanged(ByVal sender As Object, ByVal e As ProtocolChangedEventArgs)
Protected Overridable Sub OnProtocolChanged(ByVal e As ProtocolChangedEventArgs)
RaiseEvent ProtocolChanged(Me, New ProtocolChangedEventArgs(e.Protocol))
End Sub
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,45 @@
Imports System.ComponentModel
' Adapted from http://stackoverflow.com/a/3678888/2101395
Namespace Controls
Public Class TextBox
Inherits Windows.Forms.TextBox
#Region "Public Properties"
<Category("Behavior"),
DefaultValue(False)> _
Public Property SelectAllOnFocus As Boolean = False
#End Region
#Region "Protected Methods"
Protected Overrides Sub OnEnter(ByVal e As EventArgs)
MyBase.OnEnter(e)
If MouseButtons = MouseButtons.None Then
SelectAll()
_focusHandled = True
End If
End Sub
Protected Overrides Sub OnLeave(ByVal e As EventArgs)
MyBase.OnLeave(e)
_focusHandled = False
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
MyBase.OnMouseUp(e)
If Not _focusHandled Then
If SelectionLength = 0 Then SelectAll()
_focusHandled = True
End If
End Sub
#End Region
#Region "Private Fields"
Private _focusHandled As Boolean = False
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,42 @@
Namespace Controls
Public Class ToolStripSplitButton
Inherits Windows.Forms.ToolStripSplitButton
Public Overloads Property DropDown As ToolStripDropDown
Get
Return MyBase.DropDown
End Get
Set(value As ToolStripDropDown)
If MyBase.DropDown IsNot value Then
MyBase.DropDown = value
AddHandler MyBase.DropDown.Closing, AddressOf DropDown_Closing
End If
End Set
End Property
Private Sub DropDown_Closing(ByVal sender As Object, e As ToolStripDropDownClosingEventArgs)
If Not e.CloseReason = ToolStripDropDownCloseReason.AppClicked Then Return
Dim dropDownButtonBoundsClient As Rectangle = DropDownButtonBounds ' Relative to the ToolStripSplitButton
dropDownButtonBoundsClient.Offset(Bounds.Location) ' Relative to the parent of the ToolStripSplitButton
Dim dropDownButtonBoundsScreen As Rectangle = GetCurrentParent().RectangleToScreen(dropDownButtonBoundsClient) ' Relative to the screen
If dropDownButtonBoundsScreen.Contains(Control.MousePosition) Then e.Cancel = True
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
_dropDownVisibleOnMouseDown = DropDown.Visible
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
If _dropDownVisibleOnMouseDown Then
DropDown.Close()
Else
MyBase.OnMouseUp(e)
End If
End Sub
Private _dropDownVisibleOnMouseDown As Boolean = False
End Class
End Namespace

294
mRemoteV1/Forms/ExportForm.Designer.vb generated Normal file
View File

@@ -0,0 +1,294 @@
Namespace Forms
Partial Public Class ExportForm
Inherits Form
#Region " Windows Form Designer generated code "
Private Sub InitializeComponent()
Me.btnCancel = New System.Windows.Forms.Button()
Me.btnOK = New System.Windows.Forms.Button()
Me.lblUncheckProperties = New System.Windows.Forms.Label()
Me.chkUsername = New System.Windows.Forms.CheckBox()
Me.chkPassword = New System.Windows.Forms.CheckBox()
Me.chkDomain = New System.Windows.Forms.CheckBox()
Me.chkInheritance = New System.Windows.Forms.CheckBox()
Me.txtFileName = New System.Windows.Forms.TextBox()
Me.btnBrowse = New System.Windows.Forms.Button()
Me.grpProperties = New System.Windows.Forms.GroupBox()
Me.grpFile = New System.Windows.Forms.GroupBox()
Me.lblFileFormat = New System.Windows.Forms.Label()
Me.lblFileName = New System.Windows.Forms.Label()
Me.cboFileFormat = New System.Windows.Forms.ComboBox()
Me.grpItems = New System.Windows.Forms.GroupBox()
Me.lblSelectedConnection = New System.Windows.Forms.Label()
Me.lblSelectedFolder = New System.Windows.Forms.Label()
Me.rdoExportSelectedConnection = New System.Windows.Forms.RadioButton()
Me.rdoExportSelectedFolder = New System.Windows.Forms.RadioButton()
Me.rdoExportEverything = New System.Windows.Forms.RadioButton()
Me.grpProperties.SuspendLayout()
Me.grpFile.SuspendLayout()
Me.grpItems.SuspendLayout()
Me.SuspendLayout()
'
'btnCancel
'
Me.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.btnCancel.Location = New System.Drawing.Point(447, 473)
Me.btnCancel.Name = "btnCancel"
Me.btnCancel.Size = New System.Drawing.Size(75, 23)
Me.btnCancel.TabIndex = 3
Me.btnCancel.Text = "&Cancel"
Me.btnCancel.UseVisualStyleBackColor = True
'
'btnOK
'
Me.btnOK.Location = New System.Drawing.Point(366, 473)
Me.btnOK.Name = "btnOK"
Me.btnOK.Size = New System.Drawing.Size(75, 23)
Me.btnOK.TabIndex = 2
Me.btnOK.Text = "&OK"
Me.btnOK.UseVisualStyleBackColor = True
'
'lblUncheckProperties
'
Me.lblUncheckProperties.AutoSize = True
Me.lblUncheckProperties.Location = New System.Drawing.Point(12, 134)
Me.lblUncheckProperties.Name = "lblUncheckProperties"
Me.lblUncheckProperties.Size = New System.Drawing.Size(244, 13)
Me.lblUncheckProperties.TabIndex = 4
Me.lblUncheckProperties.Text = "Uncheck the properties you want not to be saved!"
'
'chkUsername
'
Me.chkUsername.AutoSize = True
Me.chkUsername.Checked = True
Me.chkUsername.CheckState = System.Windows.Forms.CheckState.Checked
Me.chkUsername.Location = New System.Drawing.Point(15, 32)
Me.chkUsername.Name = "chkUsername"
Me.chkUsername.Size = New System.Drawing.Size(74, 17)
Me.chkUsername.TabIndex = 0
Me.chkUsername.Text = "Username"
Me.chkUsername.UseVisualStyleBackColor = True
'
'chkPassword
'
Me.chkPassword.AutoSize = True
Me.chkPassword.Checked = True
Me.chkPassword.CheckState = System.Windows.Forms.CheckState.Checked
Me.chkPassword.Location = New System.Drawing.Point(15, 55)
Me.chkPassword.Name = "chkPassword"
Me.chkPassword.Size = New System.Drawing.Size(72, 17)
Me.chkPassword.TabIndex = 1
Me.chkPassword.Text = "Password"
Me.chkPassword.UseVisualStyleBackColor = True
'
'chkDomain
'
Me.chkDomain.AutoSize = True
Me.chkDomain.Checked = True
Me.chkDomain.CheckState = System.Windows.Forms.CheckState.Checked
Me.chkDomain.Location = New System.Drawing.Point(15, 78)
Me.chkDomain.Name = "chkDomain"
Me.chkDomain.Size = New System.Drawing.Size(62, 17)
Me.chkDomain.TabIndex = 2
Me.chkDomain.Text = "Domain"
Me.chkDomain.UseVisualStyleBackColor = True
'
'chkInheritance
'
Me.chkInheritance.AutoSize = True
Me.chkInheritance.Checked = True
Me.chkInheritance.CheckState = System.Windows.Forms.CheckState.Checked
Me.chkInheritance.Location = New System.Drawing.Point(15, 101)
Me.chkInheritance.Name = "chkInheritance"
Me.chkInheritance.Size = New System.Drawing.Size(79, 17)
Me.chkInheritance.TabIndex = 3
Me.chkInheritance.Text = "Inheritance"
Me.chkInheritance.UseVisualStyleBackColor = True
'
'txtFileName
'
Me.txtFileName.Location = New System.Drawing.Point(15, 48)
Me.txtFileName.Name = "txtFileName"
Me.txtFileName.Size = New System.Drawing.Size(396, 20)
Me.txtFileName.TabIndex = 1
'
'btnBrowse
'
Me.btnBrowse.Location = New System.Drawing.Point(417, 46)
Me.btnBrowse.Name = "btnBrowse"
Me.btnBrowse.Size = New System.Drawing.Size(75, 23)
Me.btnBrowse.TabIndex = 2
Me.btnBrowse.Text = "&Browse"
Me.btnBrowse.UseVisualStyleBackColor = True
'
'grpProperties
'
Me.grpProperties.Controls.Add(Me.lblUncheckProperties)
Me.grpProperties.Controls.Add(Me.chkInheritance)
Me.grpProperties.Controls.Add(Me.chkUsername)
Me.grpProperties.Controls.Add(Me.chkDomain)
Me.grpProperties.Controls.Add(Me.chkPassword)
Me.grpProperties.Location = New System.Drawing.Point(12, 304)
Me.grpProperties.Name = "grpProperties"
Me.grpProperties.Size = New System.Drawing.Size(510, 163)
Me.grpProperties.TabIndex = 1
Me.grpProperties.TabStop = False
Me.grpProperties.Text = "Export Properties"
'
'grpFile
'
Me.grpFile.Controls.Add(Me.lblFileFormat)
Me.grpFile.Controls.Add(Me.lblFileName)
Me.grpFile.Controls.Add(Me.cboFileFormat)
Me.grpFile.Controls.Add(Me.txtFileName)
Me.grpFile.Controls.Add(Me.btnBrowse)
Me.grpFile.Location = New System.Drawing.Point(12, 12)
Me.grpFile.Name = "grpFile"
Me.grpFile.Size = New System.Drawing.Size(510, 140)
Me.grpFile.TabIndex = 0
Me.grpFile.TabStop = False
Me.grpFile.Text = "Export File"
'
'lblFileFormat
'
Me.lblFileFormat.AutoSize = True
Me.lblFileFormat.Location = New System.Drawing.Point(12, 84)
Me.lblFileFormat.Name = "lblFileFormat"
Me.lblFileFormat.Size = New System.Drawing.Size(61, 13)
Me.lblFileFormat.TabIndex = 3
Me.lblFileFormat.Text = "File &Format:"
'
'lblFileName
'
Me.lblFileName.AutoSize = True
Me.lblFileName.Location = New System.Drawing.Point(12, 32)
Me.lblFileName.Name = "lblFileName"
Me.lblFileName.Size = New System.Drawing.Size(52, 13)
Me.lblFileName.TabIndex = 0
Me.lblFileName.Text = "Filename:"
'
'cboFileFormat
'
Me.cboFileFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.cboFileFormat.FormattingEnabled = True
Me.cboFileFormat.Location = New System.Drawing.Point(15, 100)
Me.cboFileFormat.Name = "cboFileFormat"
Me.cboFileFormat.Size = New System.Drawing.Size(294, 21)
Me.cboFileFormat.TabIndex = 4
'
'grpItems
'
Me.grpItems.Controls.Add(Me.lblSelectedConnection)
Me.grpItems.Controls.Add(Me.lblSelectedFolder)
Me.grpItems.Controls.Add(Me.rdoExportSelectedConnection)
Me.grpItems.Controls.Add(Me.rdoExportSelectedFolder)
Me.grpItems.Controls.Add(Me.rdoExportEverything)
Me.grpItems.Location = New System.Drawing.Point(12, 158)
Me.grpItems.Name = "grpItems"
Me.grpItems.Size = New System.Drawing.Size(510, 140)
Me.grpItems.TabIndex = 4
Me.grpItems.TabStop = False
Me.grpItems.Text = "Export Items"
'
'lblSelectedConnection
'
Me.lblSelectedConnection.AutoSize = True
Me.lblSelectedConnection.Location = New System.Drawing.Point(48, 111)
Me.lblSelectedConnection.Name = "lblSelectedConnection"
Me.lblSelectedConnection.Size = New System.Drawing.Size(92, 13)
Me.lblSelectedConnection.TabIndex = 4
Me.lblSelectedConnection.Text = "Connection Name"
'
'lblSelectedFolder
'
Me.lblSelectedFolder.AutoSize = True
Me.lblSelectedFolder.Location = New System.Drawing.Point(48, 75)
Me.lblSelectedFolder.Name = "lblSelectedFolder"
Me.lblSelectedFolder.Size = New System.Drawing.Size(67, 13)
Me.lblSelectedFolder.TabIndex = 3
Me.lblSelectedFolder.Text = "Folder Name"
'
'rdoExportSelectedConnection
'
Me.rdoExportSelectedConnection.AutoSize = True
Me.rdoExportSelectedConnection.Location = New System.Drawing.Point(15, 91)
Me.rdoExportSelectedConnection.Name = "rdoExportSelectedConnection"
Me.rdoExportSelectedConnection.Size = New System.Drawing.Size(215, 17)
Me.rdoExportSelectedConnection.TabIndex = 2
Me.rdoExportSelectedConnection.TabStop = True
Me.rdoExportSelectedConnection.Text = "Export the currently selected connection"
Me.rdoExportSelectedConnection.UseVisualStyleBackColor = True
'
'rdoExportSelectedFolder
'
Me.rdoExportSelectedFolder.AutoSize = True
Me.rdoExportSelectedFolder.Location = New System.Drawing.Point(15, 55)
Me.rdoExportSelectedFolder.Name = "rdoExportSelectedFolder"
Me.rdoExportSelectedFolder.Size = New System.Drawing.Size(188, 17)
Me.rdoExportSelectedFolder.TabIndex = 1
Me.rdoExportSelectedFolder.TabStop = True
Me.rdoExportSelectedFolder.Text = "Export the currently selected folder"
Me.rdoExportSelectedFolder.UseVisualStyleBackColor = True
'
'rdoExportEverything
'
Me.rdoExportEverything.AutoSize = True
Me.rdoExportEverything.Checked = True
Me.rdoExportEverything.Location = New System.Drawing.Point(15, 32)
Me.rdoExportEverything.Name = "rdoExportEverything"
Me.rdoExportEverything.Size = New System.Drawing.Size(107, 17)
Me.rdoExportEverything.TabIndex = 0
Me.rdoExportEverything.TabStop = True
Me.rdoExportEverything.Text = "Export everything"
Me.rdoExportEverything.UseVisualStyleBackColor = True
'
'ExportForm
'
Me.AcceptButton = Me.btnOK
Me.CancelButton = Me.btnCancel
Me.ClientSize = New System.Drawing.Size(534, 508)
Me.Controls.Add(Me.grpItems)
Me.Controls.Add(Me.grpFile)
Me.Controls.Add(Me.grpProperties)
Me.Controls.Add(Me.btnCancel)
Me.Controls.Add(Me.btnOK)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
Me.Icon = Global.mRemoteNG.My.Resources.Resources.Connections_SaveAs_Icon
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "ExportForm"
Me.ShowInTaskbar = False
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
Me.Text = "Export Connections"
Me.grpProperties.ResumeLayout(False)
Me.grpProperties.PerformLayout()
Me.grpFile.ResumeLayout(False)
Me.grpFile.PerformLayout()
Me.grpItems.ResumeLayout(False)
Me.grpItems.PerformLayout()
Me.ResumeLayout(False)
End Sub
Private WithEvents btnCancel As System.Windows.Forms.Button
Private WithEvents btnOK As System.Windows.Forms.Button
Private WithEvents lblUncheckProperties As System.Windows.Forms.Label
Private WithEvents chkUsername As System.Windows.Forms.CheckBox
Private WithEvents chkPassword As System.Windows.Forms.CheckBox
Private WithEvents chkDomain As System.Windows.Forms.CheckBox
Private WithEvents chkInheritance As System.Windows.Forms.CheckBox
Private WithEvents txtFileName As System.Windows.Forms.TextBox
Private WithEvents btnBrowse As System.Windows.Forms.Button
Private WithEvents grpProperties As System.Windows.Forms.GroupBox
Private WithEvents grpFile As System.Windows.Forms.GroupBox
Private WithEvents lblFileFormat As System.Windows.Forms.Label
Private WithEvents lblFileName As System.Windows.Forms.Label
Private WithEvents cboFileFormat As System.Windows.Forms.ComboBox
Private WithEvents grpItems As System.Windows.Forms.GroupBox
Private WithEvents lblSelectedConnection As System.Windows.Forms.Label
Private WithEvents lblSelectedFolder As System.Windows.Forms.Label
Private WithEvents rdoExportSelectedConnection As System.Windows.Forms.RadioButton
Private WithEvents rdoExportSelectedFolder As System.Windows.Forms.RadioButton
Private WithEvents rdoExportEverything As System.Windows.Forms.RadioButton
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,260 @@
Imports System.ComponentModel
Imports mRemoteNG.Config.Connections
Imports mRemoteNG.App
Imports mRemoteNG.My
Namespace Forms
Public Class ExportForm
Inherits Form
#Region "Public Properties"
Public Property FileName As String
Get
Return txtFileName.Text
End Get
Set(value As String)
txtFileName.Text = value
End Set
End Property
Public Property SaveFormat As Config.Connections.Save.Format
Get
Dim exportFormat As ExportFormat = TryCast(cboFileFormat.SelectedItem, ExportFormat)
If exportFormat Is Nothing Then
Return Config.Connections.Save.Format.mRXML
Else
Return exportFormat.Format
End If
End Get
Set(value As Config.Connections.Save.Format)
For Each item As Object In cboFileFormat.Items
Dim exportFormat As ExportFormat = TryCast(item, ExportFormat)
If exportFormat Is Nothing Then Continue For
If exportFormat.Format = value Then
cboFileFormat.SelectedItem = item
Exit For
End If
Next
End Set
End Property
Public Property Scope As ExportScope
Get
If rdoExportSelectedFolder.Checked Then
Return ExportScope.SelectedFolder
ElseIf rdoExportSelectedConnection.Checked Then
Return ExportScope.SelectedConnection
Else
Return ExportScope.Everything
End If
End Get
Set(value As ExportScope)
Select Case value
Case ExportScope.Everything
rdoExportEverything.Checked = True
Case ExportScope.SelectedFolder
rdoExportSelectedFolder.Checked = True
Case ExportScope.SelectedConnection
rdoExportSelectedConnection.Checked = True
End Select
End Set
End Property
Private _selectedFolder As TreeNode
Public Property SelectedFolder As TreeNode
Get
Return _selectedFolder
End Get
Set(value As TreeNode)
_selectedFolder = value
If value Is Nothing Then
lblSelectedFolder.Text = String.Empty
Else
lblSelectedFolder.Text = value.Text
End If
rdoExportSelectedFolder.Enabled = (value IsNot Nothing)
End Set
End Property
Private _selectedConnection As TreeNode
Public Property SelectedConnection As TreeNode
Get
Return _selectedConnection
End Get
Set(value As TreeNode)
_selectedConnection = value
If value Is Nothing Then
lblSelectedConnection.Text = String.Empty
Else
lblSelectedConnection.Text = value.Text
End If
rdoExportSelectedConnection.Enabled = (value IsNot Nothing)
End Set
End Property
Public Property IncludeUsername As Boolean
Get
Return chkUsername.Checked
End Get
Set(value As Boolean)
chkUsername.Checked = value
End Set
End Property
Public Property IncludePassword As Boolean
Get
Return chkPassword.Checked
End Get
Set(value As Boolean)
chkPassword.Checked = value
End Set
End Property
Public Property IncludeDomain As Boolean
Get
Return chkDomain.Checked
End Get
Set(value As Boolean)
chkDomain.Checked = value
End Set
End Property
Public Property IncludeInheritance As Boolean
Get
Return chkInheritance.Checked
End Get
Set(value As Boolean)
chkInheritance.Checked = value
End Set
End Property
#End Region
#Region "Constructors"
Public Sub New()
InitializeComponent()
Runtime.FontOverride(Me)
SelectedFolder = Nothing
SelectedConnection = Nothing
btnOK.Enabled = False
End Sub
#End Region
#Region "Private Methods"
#Region "Event Handlers"
Private Sub ExportForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
cboFileFormat.Items.Clear()
cboFileFormat.Items.Add(New ExportFormat(Save.Format.mRXML))
cboFileFormat.Items.Add(New ExportFormat(Save.Format.mRCSV))
cboFileFormat.Items.Add(New ExportFormat(Save.Format.vRDCSV))
cboFileFormat.SelectedIndex = 0
ApplyLanguage()
End Sub
Private Sub txtFileName_TextChanged(sender As System.Object, e As EventArgs) Handles txtFileName.TextChanged
btnOK.Enabled = Not String.IsNullOrEmpty(txtFileName.Text)
End Sub
Private Sub btnBrowse_Click(sender As System.Object, e As EventArgs) Handles btnBrowse.Click
Using saveFileDialog As New SaveFileDialog()
With saveFileDialog
.CheckPathExists = True
.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
.OverwritePrompt = True
Dim fileTypes As New List(Of String)
fileTypes.AddRange({Language.strFiltermRemoteXML, "*.xml"})
fileTypes.AddRange({Language.strFiltermRemoteCSV, "*.csv"})
fileTypes.AddRange({Language.strFiltervRD2008CSV, "*.csv"})
fileTypes.AddRange({Language.strFilterAll, "*.*"})
.Filter = String.Join("|", fileTypes.ToArray())
End With
If Not saveFileDialog.ShowDialog(Me) = DialogResult.OK Then Return
txtFileName.Text = saveFileDialog.FileName
End Using
End Sub
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles btnOK.Click
DialogResult = DialogResult.OK
End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles btnCancel.Click
DialogResult = DialogResult.Cancel
End Sub
#End Region
Private Sub ApplyLanguage()
Text = Language.strExport
grpFile.Text = Language.strExportFile
lblFileName.Text = Language.strLabelFilename
btnBrowse.Text = Language.strButtonBrowse
lblFileFormat.Text = Language.strFileFormatLabel
grpItems.Text = Language.strExportItems
rdoExportEverything.Text = Language.strExportEverything
rdoExportSelectedFolder.Text = Language.strExportSelectedFolder
rdoExportSelectedConnection.Text = Language.strExportSelectedConnection
grpProperties.Text = Language.strExportProperties
chkUsername.Text = Language.strCheckboxUsername
chkPassword.Text = Language.strCheckboxPassword
chkDomain.Text = Language.strCheckboxDomain
chkInheritance.Text = Language.strCheckboxInheritance
lblUncheckProperties.Text = Language.strUncheckProperties
btnOK.Text = Language.strButtonOK
btnCancel.Text = Language.strButtonCancel
End Sub
#End Region
#Region "Public Enumerations"
Public Enum ExportScope As Integer
Everything
SelectedFolder
SelectedConnection
End Enum
#End Region
#Region "Private Classes"
<ImmutableObject(True)> _
Private Class ExportFormat
#Region "Public Properties"
Private ReadOnly _format As Config.Connections.Save.Format
Public ReadOnly Property Format As Config.Connections.Save.Format
Get
Return _format
End Get
End Property
#End Region
#Region "Constructors"
Public Sub New(ByVal format As Config.Connections.Save.Format)
_format = format
End Sub
#End Region
#Region "Public Methods"
Public Overrides Function ToString() As String
Select Case Format
Case Config.Connections.Save.Format.mRXML
Return Language.strMremoteNgXml
Case Config.Connections.Save.Format.mRCSV
Return Language.strMremoteNgCsv
Case Config.Connections.Save.Format.vRDCSV
Return Language.strVisionAppRemoteDesktopCsv
Case Else
Return Format.ToString()
End Select
End Function
#End Region
End Class
#End Region
End Class
End Namespace

92
mRemoteV1/Forms/OptionsForm.Designer.vb generated Normal file
View File

@@ -0,0 +1,92 @@
Namespace Forms
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class OptionsForm
Inherits System.Windows.Forms.Form
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(OptionsForm))
Dim Alignment2 As mRemoteNG.Controls.Alignment = New mRemoteNG.Controls.Alignment()
Me.PagePanel = New System.Windows.Forms.Panel()
Me.OkButton = New System.Windows.Forms.Button()
Me.CancelButtonControl = New System.Windows.Forms.Button()
Me.PageListView = New mRemoteNG.Controls.ListView()
Me.SuspendLayout()
'
'PagePanel
'
resources.ApplyResources(Me.PagePanel, "PagePanel")
Me.PagePanel.Name = "PagePanel"
'
'OkButton
'
resources.ApplyResources(Me.OkButton, "OkButton")
Me.OkButton.Name = "OkButton"
Me.OkButton.UseVisualStyleBackColor = True
'
'CancelButtonControl
'
Me.CancelButtonControl.DialogResult = System.Windows.Forms.DialogResult.Cancel
resources.ApplyResources(Me.CancelButtonControl, "CancelButtonControl")
Me.CancelButtonControl.Name = "CancelButtonControl"
Me.CancelButtonControl.UseVisualStyleBackColor = True
'
'PageListView
'
Me.PageListView.InactiveHighlightBackColor = System.Drawing.SystemColors.Highlight
Me.PageListView.InactiveHighlightBorderColor = System.Drawing.SystemColors.HotTrack
Me.PageListView.InactiveHighlightForeColor = System.Drawing.SystemColors.HighlightText
Alignment2.Horizontal = mRemoteNG.Controls.HorizontalAlignment.Left
Alignment2.Vertical = mRemoteNG.Controls.VerticalAlignment.Middle
Me.PageListView.LabelAlignment = Alignment2
resources.ApplyResources(Me.PageListView, "PageListView")
Me.PageListView.MultiSelect = False
Me.PageListView.Name = "PageListView"
Me.PageListView.OwnerDraw = True
Me.PageListView.ShowFocusCues = False
Me.PageListView.TileSize = New System.Drawing.Size(150, 30)
Me.PageListView.UseCompatibleStateImageBehavior = False
Me.PageListView.View = System.Windows.Forms.View.Tile
'
'OptionsForm
'
Me.AcceptButton = Me.OkButton
resources.ApplyResources(Me, "$this")
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.CancelButton = Me.CancelButtonControl
Me.Controls.Add(Me.CancelButtonControl)
Me.Controls.Add(Me.OkButton)
Me.Controls.Add(Me.PagePanel)
Me.Controls.Add(Me.PageListView)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "OptionsForm"
Me.ShowInTaskbar = False
Me.ResumeLayout(False)
End Sub
Friend WithEvents PageListView As mRemoteNG.Controls.ListView
Friend WithEvents PagePanel As System.Windows.Forms.Panel
Friend WithEvents OkButton As System.Windows.Forms.Button
Friend WithEvents CancelButtonControl As System.Windows.Forms.Button
End Class
End Namespace

View File

@@ -0,0 +1,264 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="PagePanel.Location" type="System.Drawing.Point, System.Drawing">
<value>172, 12</value>
</data>
<data name="PagePanel.Size" type="System.Drawing.Size, System.Drawing">
<value>610, 489</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="PagePanel.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;PagePanel.Name" xml:space="preserve">
<value>PagePanel</value>
</data>
<data name="&gt;&gt;PagePanel.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;PagePanel.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;PagePanel.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="OkButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="OkButton.Location" type="System.Drawing.Point, System.Drawing">
<value>626, 507</value>
</data>
<data name="OkButton.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="OkButton.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="OkButton.Text" xml:space="preserve">
<value>&amp;OK</value>
</data>
<data name="&gt;&gt;OkButton.Name" xml:space="preserve">
<value>OkButton</value>
</data>
<data name="&gt;&gt;OkButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;OkButton.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;OkButton.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="CancelButtonControl.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="CancelButtonControl.Location" type="System.Drawing.Point, System.Drawing">
<value>707, 507</value>
</data>
<data name="CancelButtonControl.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="CancelButtonControl.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="CancelButtonControl.Text" xml:space="preserve">
<value>&amp;Cancel</value>
</data>
<data name="&gt;&gt;CancelButtonControl.Name" xml:space="preserve">
<value>CancelButtonControl</value>
</data>
<data name="&gt;&gt;CancelButtonControl.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CancelButtonControl.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;CancelButtonControl.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="PageListView.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 12</value>
</data>
<data name="PageListView.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 489</value>
</data>
<data name="PageListView.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;PageListView.Name" xml:space="preserve">
<value>PageListView</value>
</data>
<data name="&gt;&gt;PageListView.Type" xml:space="preserve">
<value>mRemoteNG.Controls.ListView, mRemoteNG, Version=1.72.5056.42837, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;PageListView.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;PageListView.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>794, 542</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA1YZW1dWCUP/RfEr/0XhErwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA2ZBkzN+jgP/qwar/6r+n/9yYcP/RekavAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAANuWbv/tyLL/57ea/+azl//qwqr/3pty/9F8SK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADdnnj/7cy2/+i8ov/ksJH/5rWZ/+rCq//em3P/035MrAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA36R+kuayk//uzLf/6b2k/+Wyk//mtpr/6sOs/96dd//TgE6sAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfpIKS5rOX/+7Nuf/pvqT/5bOV/+e4nP/rxa3/3p54/9WC
UKoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOGmhJLmtpj/7s66/+m/pv/ovKL/7Miy/9+j
gP/SiFzJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4aiGkua2m//vz7v/7s65/+Kt
i//Smnr/h4eH94WFhSMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhqIiS57ib/+a1
l//YqIv/0tLS/7S0tP+IiIj+hoaG+4SEhPuCgoLWgICAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOOs
ipLapofPkZGR+8fHx//MzMz/x8fH/8XFxf/CwsL/v7+//4ODg/WBgYFwAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJSUlEiSkpL+1NTU/8jIyP+7u7v/ubm5/8HBwf/Dw8P/hISE1gAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAlZWV/N3d3f/ExMT/jo6OwYyMjMOrq6v/19fX/4aGhvsAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJeXl/vk5OT/z8/P/5GRkcIAAAAAjY2N/4uLi/+JiYn7AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACamprW4uLi/+fn5/+4uLj/kpKS/wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnJyccJqamvXk5OT/7u7u/5WVlf8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdnZ1wm5ub1pqamvuYmJj7AAAAAAAA
AAAAAAAAh/+cQQP/nEEB/5xBAP+cQQB/nEGAP5xBwD+cQeAfnEHwAZxB+ACcQf4AnEH/AJxB/wicQf8H
nEH/B5xB/4ecQQ==
</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterParent</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Options</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>OptionsForm</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@@ -0,0 +1,195 @@
Imports mRemoteNG.Forms.OptionsPages
Imports mRemoteNG.App.Runtime
Imports mRemoteNG.My
Namespace Forms
Public Class OptionsForm
#Region "Constructors"
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
FontOverride(Me)
_pages.Add(New 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(GetType(StartupExitPage))
_pageIconImageList.ColorDepth = ColorDepth.Depth32Bit
PageListView.LargeImageList = _pageIconImageList
End Sub
#End Region
#Region "Public Methods"
Public Overloads Function ShowDialog(ByVal ownerWindow As IWin32Window, ByVal pageType As Type) As DialogResult
_startPage = GetPageFromType(pageType)
Return ShowDialog(ownerWindow)
End Function
#End Region
#Region "Private Fields"
Private ReadOnly _pages As New Dictionary(Of OptionsPage, PageInfo)
Private ReadOnly _pageIconImageList As New ImageList
Private _startPage As OptionsPage
Private _selectedPage As OptionsPage = Nothing
#End Region
#Region "Private Methods"
#Region "Event Handlers"
Private Sub OptionsForm_Load(sender As System.Object, e As EventArgs) Handles MyBase.Load
For Each keyValuePair As KeyValuePair(Of OptionsPage, PageInfo) In _pages
Dim page As OptionsPage = keyValuePair.Key
Dim pageInfo As PageInfo = keyValuePair.Value
_pageIconImageList.Images.Add(pageInfo.IconKey, page.PageIcon)
pageInfo.ListViewItem = PageListView.Items.Add(page.PageName, pageInfo.IconKey)
Next
ApplyLanguage()
LoadSettings()
ShowPage(_startPage)
End Sub
Private Sub OptionsForm_FormClosing(sender As System.Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
If DialogResult = DialogResult.OK Then
SaveSettings()
Else
RevertSettings()
End If
End Sub
Private Sub PageListView_ItemSelectionChanged(sender As System.Object, e As ListViewItemSelectionChangedEventArgs) Handles PageListView.ItemSelectionChanged
If Not e.IsSelected Then Return
If _pages.Count < 1 Then Return
Dim page As OptionsPage = GetPageFromListViewItem(e.Item)
If _selectedPage IsNot page Then
ShowPage(page)
End If
SelectNextControl(PageListView, True, True, True, True)
End Sub
Private Sub PageListView_MouseUp(sender As System.Object, e As MouseEventArgs) Handles PageListView.MouseUp
If PageListView.SelectedIndices.Count = 0 Then
Dim pageInfo As PageInfo = _pages(_selectedPage)
pageInfo.ListViewItem.Selected = True
End If
SelectNextControl(PageListView, True, True, True, True)
End Sub
Private Sub OkButton_Click(sender As System.Object, e As EventArgs) Handles OkButton.Click
DialogResult = DialogResult.OK
Close()
End Sub
Private Sub CancelButtonControl_Click(sender As System.Object, e As EventArgs) Handles CancelButtonControl.Click
DialogResult = DialogResult.Cancel
Close()
End Sub
#End Region
Private Sub ApplyLanguage()
Text = Language.strMenuOptions
OkButton.Text = Language.strButtonOK
CancelButtonControl.Text = Language.strButtonCancel
For Each page As OptionsPage In _pages.Keys
Try
page.ApplyLanguage()
Catch ex As Exception
MessageCollector.AddExceptionMessage(String.Format("OptionsPage.ApplyLanguage() failed for page {0}.", page.PageName), ex, , True)
End Try
Next
End Sub
Private Sub LoadSettings()
For Each page As OptionsPage In _pages.Keys
Try
page.LoadSettings()
Catch ex As Exception
MessageCollector.AddExceptionMessage(String.Format("OptionsPage.LoadSettings() failed for page {0}.", page.PageName), ex, , True)
End Try
Next
End Sub
Private Sub SaveSettings()
For Each page As OptionsPage In _pages.Keys
Try
page.SaveSettings()
Catch ex As Exception
MessageCollector.AddExceptionMessage(String.Format("OptionsPage.SaveSettings() failed for page {0}.", page.PageName), ex, , True)
End Try
Next
End Sub
Private Sub RevertSettings()
For Each page As OptionsPage In _pages.Keys
Try
page.RevertSettings()
Catch ex As Exception
MessageCollector.AddExceptionMessage(String.Format("OptionsPage.RevertSettings() failed for page {0}.", page.PageName), ex, , True)
End Try
Next
End Sub
Private Function GetPageFromType(ByVal pageType As Type) As OptionsPage
For Each page As OptionsPage In _pages.Keys
If page.GetType() Is pageType Then Return page
Next
Return Nothing
End Function
Private Function GetPageFromListViewItem(ByVal listViewItem As ListViewItem) As OptionsPage
For Each keyValuePair As KeyValuePair(Of OptionsPage, PageInfo) In _pages
Dim page As OptionsPage = keyValuePair.Key
Dim pageInfo As PageInfo = keyValuePair.Value
If pageInfo.ListViewItem Is listViewItem Then Return page
Next
Return Nothing
End Function
Private Sub ShowPage(ByVal newPage As OptionsPage)
If _selectedPage IsNot Nothing Then
Dim oldPage As OptionsPage = _selectedPage
oldPage.Visible = False
If _pages.ContainsKey(oldPage) Then
Dim oldPageInfo As PageInfo = _pages(oldPage)
oldPageInfo.ListViewItem.Selected = False
End If
End If
_selectedPage = newPage
If newPage IsNot Nothing Then
newPage.Parent = PagePanel
newPage.Dock = DockStyle.Fill
newPage.Visible = True
If _pages.ContainsKey(newPage) Then
Dim newPageInfo As PageInfo = _pages(newPage)
newPageInfo.ListViewItem.Selected = True
End If
End If
End Sub
#End Region
#Region "Private Classes"
Private Class PageInfo
Public Property IconKey As String
Public Property ListViewItem As ListViewItem
Public Sub New()
IconKey = Guid.NewGuid.ToString()
End Sub
End Class
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,262 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class AdvancedPage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(AdvancedPage))
Me.chkWriteLogFile = New System.Windows.Forms.CheckBox()
Me.chkAutomaticallyGetSessionInfo = New System.Windows.Forms.CheckBox()
Me.lblXulRunnerPath = New System.Windows.Forms.Label()
Me.lblMaximumPuttyWaitTime = New System.Windows.Forms.Label()
Me.chkEncryptCompleteFile = New System.Windows.Forms.CheckBox()
Me.chkAutomaticReconnect = New System.Windows.Forms.CheckBox()
Me.btnBrowseXulRunnerPath = New System.Windows.Forms.Button()
Me.numPuttyWaitTime = New System.Windows.Forms.NumericUpDown()
Me.chkUseCustomPuttyPath = New System.Windows.Forms.CheckBox()
Me.lblConfigurePuttySessions = New System.Windows.Forms.Label()
Me.txtXULrunnerPath = New System.Windows.Forms.TextBox()
Me.numUVNCSCPort = New System.Windows.Forms.NumericUpDown()
Me.txtCustomPuttyPath = New System.Windows.Forms.TextBox()
Me.btnLaunchPutty = New System.Windows.Forms.Button()
Me.lblUVNCSCPort = New System.Windows.Forms.Label()
Me.lblSeconds = New System.Windows.Forms.Label()
Me.btnBrowseCustomPuttyPath = New System.Windows.Forms.Button()
CType(Me.numPuttyWaitTime, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.numUVNCSCPort, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'chkWriteLogFile
'
Me.chkWriteLogFile.AutoSize = True
Me.chkWriteLogFile.Location = New System.Drawing.Point(3, 0)
Me.chkWriteLogFile.Name = "chkWriteLogFile"
Me.chkWriteLogFile.Size = New System.Drawing.Size(171, 17)
Me.chkWriteLogFile.TabIndex = 17
Me.chkWriteLogFile.Text = "Write log file (mRemoteNG.log)"
Me.chkWriteLogFile.UseVisualStyleBackColor = True
'
'chkAutomaticallyGetSessionInfo
'
Me.chkAutomaticallyGetSessionInfo.AutoSize = True
Me.chkAutomaticallyGetSessionInfo.Location = New System.Drawing.Point(3, 46)
Me.chkAutomaticallyGetSessionInfo.Name = "chkAutomaticallyGetSessionInfo"
Me.chkAutomaticallyGetSessionInfo.Size = New System.Drawing.Size(198, 17)
Me.chkAutomaticallyGetSessionInfo.TabIndex = 19
Me.chkAutomaticallyGetSessionInfo.Text = "Automatically get session information"
Me.chkAutomaticallyGetSessionInfo.UseVisualStyleBackColor = True
'
'lblXulRunnerPath
'
Me.lblXulRunnerPath.AutoSize = True
Me.lblXulRunnerPath.Location = New System.Drawing.Point(3, 217)
Me.lblXulRunnerPath.Name = "lblXulRunnerPath"
Me.lblXulRunnerPath.Size = New System.Drawing.Size(85, 13)
Me.lblXulRunnerPath.TabIndex = 29
Me.lblXulRunnerPath.Text = "XULrunner path:"
'
'lblMaximumPuttyWaitTime
'
Me.lblMaximumPuttyWaitTime.Location = New System.Drawing.Point(3, 185)
Me.lblMaximumPuttyWaitTime.Name = "lblMaximumPuttyWaitTime"
Me.lblMaximumPuttyWaitTime.Size = New System.Drawing.Size(364, 13)
Me.lblMaximumPuttyWaitTime.TabIndex = 26
Me.lblMaximumPuttyWaitTime.Text = "Maximum PuTTY wait time:"
Me.lblMaximumPuttyWaitTime.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'chkEncryptCompleteFile
'
Me.chkEncryptCompleteFile.AutoSize = True
Me.chkEncryptCompleteFile.Location = New System.Drawing.Point(3, 23)
Me.chkEncryptCompleteFile.Name = "chkEncryptCompleteFile"
Me.chkEncryptCompleteFile.Size = New System.Drawing.Size(180, 17)
Me.chkEncryptCompleteFile.TabIndex = 18
Me.chkEncryptCompleteFile.Text = "Encrypt complete connection file"
Me.chkEncryptCompleteFile.UseVisualStyleBackColor = True
'
'chkAutomaticReconnect
'
Me.chkAutomaticReconnect.AutoSize = True
Me.chkAutomaticReconnect.Location = New System.Drawing.Point(3, 69)
Me.chkAutomaticReconnect.Name = "chkAutomaticReconnect"
Me.chkAutomaticReconnect.Size = New System.Drawing.Size(399, 17)
Me.chkAutomaticReconnect.TabIndex = 20
Me.chkAutomaticReconnect.Text = "Automatically try to reconnect when disconnected from server (RDP && ICA only)"
Me.chkAutomaticReconnect.UseVisualStyleBackColor = True
'
'btnBrowseXulRunnerPath
'
Me.btnBrowseXulRunnerPath.Location = New System.Drawing.Point(373, 233)
Me.btnBrowseXulRunnerPath.Name = "btnBrowseXulRunnerPath"
Me.btnBrowseXulRunnerPath.Size = New System.Drawing.Size(75, 23)
Me.btnBrowseXulRunnerPath.TabIndex = 31
Me.btnBrowseXulRunnerPath.Text = "Browse..."
Me.btnBrowseXulRunnerPath.UseVisualStyleBackColor = True
'
'numPuttyWaitTime
'
Me.numPuttyWaitTime.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.numPuttyWaitTime.Location = New System.Drawing.Point(373, 183)
Me.numPuttyWaitTime.Maximum = New Decimal(New Integer() {999, 0, 0, 0})
Me.numPuttyWaitTime.Name = "numPuttyWaitTime"
Me.numPuttyWaitTime.Size = New System.Drawing.Size(49, 20)
Me.numPuttyWaitTime.TabIndex = 27
Me.numPuttyWaitTime.Value = New Decimal(New Integer() {5, 0, 0, 0})
'
'chkUseCustomPuttyPath
'
Me.chkUseCustomPuttyPath.AutoSize = True
Me.chkUseCustomPuttyPath.Location = New System.Drawing.Point(3, 92)
Me.chkUseCustomPuttyPath.Name = "chkUseCustomPuttyPath"
Me.chkUseCustomPuttyPath.Size = New System.Drawing.Size(146, 17)
Me.chkUseCustomPuttyPath.TabIndex = 21
Me.chkUseCustomPuttyPath.Text = "Use custom PuTTY path:"
Me.chkUseCustomPuttyPath.UseVisualStyleBackColor = True
'
'lblConfigurePuttySessions
'
Me.lblConfigurePuttySessions.Location = New System.Drawing.Point(3, 154)
Me.lblConfigurePuttySessions.Name = "lblConfigurePuttySessions"
Me.lblConfigurePuttySessions.Size = New System.Drawing.Size(364, 13)
Me.lblConfigurePuttySessions.TabIndex = 24
Me.lblConfigurePuttySessions.Text = "To configure PuTTY sessions click this button:"
Me.lblConfigurePuttySessions.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'txtXULrunnerPath
'
Me.txtXULrunnerPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtXULrunnerPath.Location = New System.Drawing.Point(21, 235)
Me.txtXULrunnerPath.Name = "txtXULrunnerPath"
Me.txtXULrunnerPath.Size = New System.Drawing.Size(346, 20)
Me.txtXULrunnerPath.TabIndex = 30
'
'numUVNCSCPort
'
Me.numUVNCSCPort.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.numUVNCSCPort.Location = New System.Drawing.Point(373, 276)
Me.numUVNCSCPort.Maximum = New Decimal(New Integer() {65535, 0, 0, 0})
Me.numUVNCSCPort.Name = "numUVNCSCPort"
Me.numUVNCSCPort.Size = New System.Drawing.Size(72, 20)
Me.numUVNCSCPort.TabIndex = 33
Me.numUVNCSCPort.Value = New Decimal(New Integer() {5500, 0, 0, 0})
Me.numUVNCSCPort.Visible = False
'
'txtCustomPuttyPath
'
Me.txtCustomPuttyPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtCustomPuttyPath.Enabled = False
Me.txtCustomPuttyPath.Location = New System.Drawing.Point(21, 115)
Me.txtCustomPuttyPath.Name = "txtCustomPuttyPath"
Me.txtCustomPuttyPath.Size = New System.Drawing.Size(346, 20)
Me.txtCustomPuttyPath.TabIndex = 22
'
'btnLaunchPutty
'
Me.btnLaunchPutty.Image = Global.mRemoteNG.My.Resources.Resources.PuttyConfig
Me.btnLaunchPutty.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft
Me.btnLaunchPutty.Location = New System.Drawing.Point(373, 149)
Me.btnLaunchPutty.Name = "btnLaunchPutty"
Me.btnLaunchPutty.Size = New System.Drawing.Size(110, 23)
Me.btnLaunchPutty.TabIndex = 25
Me.btnLaunchPutty.Text = "Launch PuTTY"
Me.btnLaunchPutty.TextAlign = System.Drawing.ContentAlignment.MiddleRight
Me.btnLaunchPutty.UseVisualStyleBackColor = True
'
'lblUVNCSCPort
'
Me.lblUVNCSCPort.Location = New System.Drawing.Point(3, 278)
Me.lblUVNCSCPort.Name = "lblUVNCSCPort"
Me.lblUVNCSCPort.Size = New System.Drawing.Size(364, 13)
Me.lblUVNCSCPort.TabIndex = 32
Me.lblUVNCSCPort.Text = "UltraVNC SingleClick Listening Port:"
Me.lblUVNCSCPort.TextAlign = System.Drawing.ContentAlignment.TopRight
Me.lblUVNCSCPort.Visible = False
'
'lblSeconds
'
Me.lblSeconds.AutoSize = True
Me.lblSeconds.Location = New System.Drawing.Point(428, 185)
Me.lblSeconds.Name = "lblSeconds"
Me.lblSeconds.Size = New System.Drawing.Size(47, 13)
Me.lblSeconds.TabIndex = 28
Me.lblSeconds.Text = "seconds"
'
'btnBrowseCustomPuttyPath
'
Me.btnBrowseCustomPuttyPath.Enabled = False
Me.btnBrowseCustomPuttyPath.Location = New System.Drawing.Point(373, 113)
Me.btnBrowseCustomPuttyPath.Name = "btnBrowseCustomPuttyPath"
Me.btnBrowseCustomPuttyPath.Size = New System.Drawing.Size(75, 23)
Me.btnBrowseCustomPuttyPath.TabIndex = 23
Me.btnBrowseCustomPuttyPath.Text = "Browse..."
Me.btnBrowseCustomPuttyPath.UseVisualStyleBackColor = True
'
'AdvancedPage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.chkWriteLogFile)
Me.Controls.Add(Me.chkAutomaticallyGetSessionInfo)
Me.Controls.Add(Me.lblXulRunnerPath)
Me.Controls.Add(Me.lblMaximumPuttyWaitTime)
Me.Controls.Add(Me.chkEncryptCompleteFile)
Me.Controls.Add(Me.chkAutomaticReconnect)
Me.Controls.Add(Me.btnBrowseXulRunnerPath)
Me.Controls.Add(Me.numPuttyWaitTime)
Me.Controls.Add(Me.chkUseCustomPuttyPath)
Me.Controls.Add(Me.lblConfigurePuttySessions)
Me.Controls.Add(Me.txtXULrunnerPath)
Me.Controls.Add(Me.numUVNCSCPort)
Me.Controls.Add(Me.txtCustomPuttyPath)
Me.Controls.Add(Me.btnLaunchPutty)
Me.Controls.Add(Me.lblUVNCSCPort)
Me.Controls.Add(Me.lblSeconds)
Me.Controls.Add(Me.btnBrowseCustomPuttyPath)
Me.Name = "AdvancedPage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
CType(Me.numPuttyWaitTime, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.numUVNCSCPort, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents chkWriteLogFile As System.Windows.Forms.CheckBox
Friend WithEvents chkAutomaticallyGetSessionInfo As System.Windows.Forms.CheckBox
Friend WithEvents lblXulRunnerPath As System.Windows.Forms.Label
Friend WithEvents lblMaximumPuttyWaitTime As System.Windows.Forms.Label
Friend WithEvents chkEncryptCompleteFile As System.Windows.Forms.CheckBox
Friend WithEvents chkAutomaticReconnect As System.Windows.Forms.CheckBox
Friend WithEvents btnBrowseXulRunnerPath As System.Windows.Forms.Button
Friend WithEvents numPuttyWaitTime As System.Windows.Forms.NumericUpDown
Friend WithEvents chkUseCustomPuttyPath As System.Windows.Forms.CheckBox
Friend WithEvents lblConfigurePuttySessions As System.Windows.Forms.Label
Friend WithEvents txtXULrunnerPath As System.Windows.Forms.TextBox
Friend WithEvents numUVNCSCPort As System.Windows.Forms.NumericUpDown
Friend WithEvents txtCustomPuttyPath As System.Windows.Forms.TextBox
Friend WithEvents btnLaunchPutty As System.Windows.Forms.Button
Friend WithEvents lblUVNCSCPort As System.Windows.Forms.Label
Friend WithEvents lblSeconds As System.Windows.Forms.Label
Friend WithEvents btnBrowseCustomPuttyPath As System.Windows.Forms.Button
End Class
End Namespace

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
@@ -117,4 +117,29 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsbGxjWFhYv1FRUb9SUlJjAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAb29vKW1tbQ5/f38CgICA6r29vf+ysrL/W1tb6n9/fwJbW1sOUFBQKQAA
AAAAAAAAAAAAAAAAAAAAAAAAgICAm25ubv1kZGTnenp6GYODg+fLy8v/x8fH/2JiYudbW1sZWFhY501N
Tf1ISEibAAAAAAAAAAAAAAAAo6Oje7y8vP/e3t7/pqam/4KCgvSEhIT+xMTE/8LCwv9tbW3+bW1t9Kam
pv/S0tL/gICA/1JSUnsAAAAAAAAAAKurq32lpaX+1dXV/8XFxf/Ly8v/0dHR/8nJyf/Hx8f/zMzM/8XF
xf+9vb3/y8vL/25ubv5lZWV9AAAAAAAAAAAAAAAArKyshcXFxf/BwcH/xcXF/8fHx/+qqqr/p6en/8HB
wf++vr7/tbW1/6qqqv9paWmFAAAAAAAAAACioqLNjo6O45+fn+7Pz8//xsbG/8zMzP+enp7GmZmZRJKS
kkSOjo7GwcHB/7y8vP+5ubn/Y2Nj7ldXV+NTU1PNv7+//eLi4v/S0tL/xsbG/83Nzf+xsbH/kpKSRAAA
AAAAAAAAlpaWRKioqP/CwsL/t7e3/8DAwP/S0tL/YGBg/cPDw/3p6en/1tbW/8nJyf/Ozs7/paWl/4OD
g0QAAAAAAAAAAJmZmUSsrKz/xMTE/7q6uv/Gxsb/3d3d/2pqav3IyMjNw8PD47+/v+7Y2Nj/zc3N/7y8
vP+CgoLGeHh4RH9/f0SOjo7Gw8PD/8LCwv/Nzc3/jIyM7oaGhuOCgoLNAAAAAAAAAADFxcWF1NTU/8zM
zP/Jycn/urq6/5ycnP+hoaH/wsLC/8bGxv/BwcH/t7e3/4iIiIUAAAAAAAAAAAAAAADJycl9w8PD/tzc
3P/U1NT/2dnZ/9vb2//W1tb/1NTU/9nZ2f/S0tL/y8vL/8jIyP95eXn+cHBwfQAAAAAAAAAAz8/Pe9zc
3P/t7e3/29vb/8LCwvS9vb3+1tbW/9TU1P+vr6/+rKys9MvLy//n5+f/t7e3/4qKinsAAAAAAAAAAAAA
AADQ0NCbzc3N/crKyufBwcEZwsLC597e3v/d3d3/sbGx562trRmsrKznp6en/aKiopsAAAAAAAAAAAAA
AAAAAAAAAAAAANPT0ynIyMgO////AsfHx+rl5eX/5OTk/6ysrOp/f38Ctra2Dq6urikAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLy8tjxsbGv8TExL++vr5jAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/n8AAPw/AADEIwAAwAMAAMADAADAAwAAAYAAAAPAAAADwAAAAYAAAMADAADAAwAAwAMAAMQj
AAD8PwAA/n8AAA==
</value>
</data>
</root>

View File

@@ -0,0 +1,171 @@
Imports System.IO
Imports mRemoteNG.App.Info
Imports mRemoteNG.My
Imports mRemoteNG.Connection.Protocol
Imports mRemoteNG.Tools
Imports PSTaskDialog
Namespace Forms.OptionsPages
Public Class AdvancedPage
#Region "Public Methods"
Public Overrides Property PageName() As String
Get
Return Language.strTabAdvanced
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
lblSeconds.Text = Language.strLabelSeconds
lblMaximumPuttyWaitTime.Text = Language.strLabelPuttyTimeout
chkAutomaticReconnect.Text = Language.strCheckboxAutomaticReconnect
lblConfigurePuttySessions.Text = Language.strLabelPuttySessionsConfig
btnLaunchPutty.Text = Language.strButtonLaunchPutty
btnBrowseCustomPuttyPath.Text = Language.strButtonBrowse
chkUseCustomPuttyPath.Text = Language.strCheckboxPuttyPath
chkAutomaticallyGetSessionInfo.Text = Language.strAutomaticallyGetSessionInfo
chkWriteLogFile.Text = Language.strWriteLogFile
lblUVNCSCPort.Text = Language.strUltraVNCSCListeningPort
lblXulRunnerPath.Text = Language.strXULrunnerPath
btnBrowseXulRunnerPath.Text = Language.strButtonBrowse
chkEncryptCompleteFile.Text = Language.strEncryptCompleteConnectionFile
End Sub
Public Overrides Sub LoadSettings()
MyBase.SaveSettings()
chkWriteLogFile.Checked = My.Settings.WriteLogFile
chkEncryptCompleteFile.Checked = My.Settings.EncryptCompleteConnectionsFile
chkAutomaticallyGetSessionInfo.Checked = My.Settings.AutomaticallyGetSessionInfo
chkAutomaticReconnect.Checked = My.Settings.ReconnectOnDisconnect
numPuttyWaitTime.Value = My.Settings.MaxPuttyWaitTime
chkUseCustomPuttyPath.Checked = MySettingsProperty.Settings.UseCustomPuttyPath
txtCustomPuttyPath.Text = MySettingsProperty.Settings.CustomPuttyPath
SetPuttyLaunchButtonEnabled()
numUVNCSCPort.Value = My.Settings.UVNCSCPort
txtXULrunnerPath.Text = My.Settings.XULRunnerPath
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
My.Settings.WriteLogFile = chkWriteLogFile.Checked
My.Settings.EncryptCompleteConnectionsFile = chkEncryptCompleteFile.Checked
My.Settings.AutomaticallyGetSessionInfo = chkAutomaticallyGetSessionInfo.Checked
My.Settings.ReconnectOnDisconnect = chkAutomaticReconnect.Checked
Dim puttyPathChanged As Boolean = False
If Not MySettingsProperty.Settings.CustomPuttyPath = txtCustomPuttyPath.Text Then
puttyPathChanged = True
MySettingsProperty.Settings.CustomPuttyPath = txtCustomPuttyPath.Text
End If
If Not MySettingsProperty.Settings.UseCustomPuttyPath = chkUseCustomPuttyPath.Checked Then
puttyPathChanged = True
MySettingsProperty.Settings.UseCustomPuttyPath = chkUseCustomPuttyPath.Checked
End If
If puttyPathChanged Then
If MySettingsProperty.Settings.UseCustomPuttyPath Then
PuttyBase.PuttyPath = MySettingsProperty.Settings.CustomPuttyPath
Else
PuttyBase.PuttyPath = General.PuttyPath
End If
Config.Putty.Sessions.AddSessionsToTree()
End If
My.Settings.MaxPuttyWaitTime = numPuttyWaitTime.Value
My.Settings.UVNCSCPort = numUVNCSCPort.Value
My.Settings.XULRunnerPath = txtXULrunnerPath.Text
End Sub
#End Region
#Region "Private Methods"
#Region "Event Handlers"
Private Sub chkUseCustomPuttyPath_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles chkUseCustomPuttyPath.CheckedChanged
txtCustomPuttyPath.Enabled = chkUseCustomPuttyPath.Checked
btnBrowseCustomPuttyPath.Enabled = chkUseCustomPuttyPath.Checked
SetPuttyLaunchButtonEnabled()
End Sub
Private Sub txtCustomPuttyPath_TextChanged(sender As Object, e As EventArgs) Handles txtCustomPuttyPath.TextChanged
SetPuttyLaunchButtonEnabled()
End Sub
Private Sub btnBrowseCustomPuttyPath_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnBrowseCustomPuttyPath.Click
Using openFileDialog As New OpenFileDialog()
With openFileDialog
.Filter = String.Format("{0}|*.exe|{1}|*.*", Language.strFilterApplication, Language.strFilterAll)
.FileName = Path.GetFileName(General.PuttyPath)
.CheckFileExists = True
.Multiselect = False
If .ShowDialog = DialogResult.OK Then
txtCustomPuttyPath.Text = .FileName
SetPuttyLaunchButtonEnabled()
End If
End With
End Using
End Sub
Private Sub btnLaunchPutty_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLaunchPutty.Click
Try
Dim puttyProcess As New PuttyProcessController
Dim fileName As String
If chkUseCustomPuttyPath.Checked Then
fileName = txtCustomPuttyPath.Text
Else
fileName = General.PuttyPath
End If
puttyProcess.Start(fileName)
puttyProcess.SetControlText("Button", "&Cancel", "&Close")
puttyProcess.SetControlVisible("Button", "&Open", False)
puttyProcess.WaitForExit()
Catch ex As Exception
cTaskDialog.MessageBox(Application.Info.ProductName, Language.strErrorCouldNotLaunchPutty, "", ex.Message, "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
End Try
End Sub
Private Sub btnBrowseXulRunnerPath_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnBrowseXulRunnerPath.Click
Dim oDlg As New FolderBrowserDialog
oDlg.ShowNewFolderButton = False
If oDlg.ShowDialog = DialogResult.OK Then
txtXULrunnerPath.Text = oDlg.SelectedPath
End If
oDlg.Dispose()
End Sub
#End Region
Private Sub SetPuttyLaunchButtonEnabled()
Dim puttyPath As String
If chkUseCustomPuttyPath.Checked Then
puttyPath = txtCustomPuttyPath.Text
Else
puttyPath = General.PuttyPath
End If
Dim exists As Boolean = False
Try
exists = File.Exists(puttyPath)
Catch
End Try
If exists Then
lblConfigurePuttySessions.Enabled = True
btnLaunchPutty.Enabled = True
Else
lblConfigurePuttySessions.Enabled = False
btnLaunchPutty.Enabled = False
End If
End Sub
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,130 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class AppearancePage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(AppearancePage))
Me.lblLanguageRestartRequired = New System.Windows.Forms.Label()
Me.cboLanguage = New System.Windows.Forms.ComboBox()
Me.lblLanguage = New System.Windows.Forms.Label()
Me.chkShowFullConnectionsFilePathInTitle = New System.Windows.Forms.CheckBox()
Me.chkShowDescriptionTooltipsInTree = New System.Windows.Forms.CheckBox()
Me.chkShowSystemTrayIcon = New System.Windows.Forms.CheckBox()
Me.chkMinimizeToSystemTray = New System.Windows.Forms.CheckBox()
Me.SuspendLayout()
'
'lblLanguageRestartRequired
'
Me.lblLanguageRestartRequired.AutoSize = True
Me.lblLanguageRestartRequired.Location = New System.Drawing.Point(3, 56)
Me.lblLanguageRestartRequired.Name = "lblLanguageRestartRequired"
Me.lblLanguageRestartRequired.Size = New System.Drawing.Size(380, 13)
Me.lblLanguageRestartRequired.TabIndex = 9
Me.lblLanguageRestartRequired.Text = "mRemoteNG must be restarted before changes to the language will take effect."
'
'cboLanguage
'
Me.cboLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.cboLanguage.FormattingEnabled = True
Me.cboLanguage.Location = New System.Drawing.Point(3, 24)
Me.cboLanguage.Name = "cboLanguage"
Me.cboLanguage.Size = New System.Drawing.Size(304, 21)
Me.cboLanguage.Sorted = True
Me.cboLanguage.TabIndex = 8
'
'lblLanguage
'
Me.lblLanguage.AutoSize = True
Me.lblLanguage.Location = New System.Drawing.Point(3, 0)
Me.lblLanguage.Name = "lblLanguage"
Me.lblLanguage.Size = New System.Drawing.Size(55, 13)
Me.lblLanguage.TabIndex = 7
Me.lblLanguage.Text = "Language"
'
'chkShowFullConnectionsFilePathInTitle
'
Me.chkShowFullConnectionsFilePathInTitle.AutoSize = True
Me.chkShowFullConnectionsFilePathInTitle.Location = New System.Drawing.Point(3, 141)
Me.chkShowFullConnectionsFilePathInTitle.Name = "chkShowFullConnectionsFilePathInTitle"
Me.chkShowFullConnectionsFilePathInTitle.Size = New System.Drawing.Size(239, 17)
Me.chkShowFullConnectionsFilePathInTitle.TabIndex = 11
Me.chkShowFullConnectionsFilePathInTitle.Text = "Show full connections file path in window title"
Me.chkShowFullConnectionsFilePathInTitle.UseVisualStyleBackColor = True
'
'chkShowDescriptionTooltipsInTree
'
Me.chkShowDescriptionTooltipsInTree.AutoSize = True
Me.chkShowDescriptionTooltipsInTree.Location = New System.Drawing.Point(3, 118)
Me.chkShowDescriptionTooltipsInTree.Name = "chkShowDescriptionTooltipsInTree"
Me.chkShowDescriptionTooltipsInTree.Size = New System.Drawing.Size(231, 17)
Me.chkShowDescriptionTooltipsInTree.TabIndex = 10
Me.chkShowDescriptionTooltipsInTree.Text = "Show description tooltips in connection tree"
Me.chkShowDescriptionTooltipsInTree.UseVisualStyleBackColor = True
'
'chkShowSystemTrayIcon
'
Me.chkShowSystemTrayIcon.AutoSize = True
Me.chkShowSystemTrayIcon.Location = New System.Drawing.Point(3, 187)
Me.chkShowSystemTrayIcon.Name = "chkShowSystemTrayIcon"
Me.chkShowSystemTrayIcon.Size = New System.Drawing.Size(172, 17)
Me.chkShowSystemTrayIcon.TabIndex = 12
Me.chkShowSystemTrayIcon.Text = "Always show System Tray Icon"
Me.chkShowSystemTrayIcon.UseVisualStyleBackColor = True
'
'chkMinimizeToSystemTray
'
Me.chkMinimizeToSystemTray.AutoSize = True
Me.chkMinimizeToSystemTray.Location = New System.Drawing.Point(3, 210)
Me.chkMinimizeToSystemTray.Name = "chkMinimizeToSystemTray"
Me.chkMinimizeToSystemTray.Size = New System.Drawing.Size(139, 17)
Me.chkMinimizeToSystemTray.TabIndex = 13
Me.chkMinimizeToSystemTray.Text = "Minimize to System Tray"
Me.chkMinimizeToSystemTray.UseVisualStyleBackColor = True
'
'AppearancePage
'
Me.Controls.Add(Me.lblLanguageRestartRequired)
Me.Controls.Add(Me.cboLanguage)
Me.Controls.Add(Me.lblLanguage)
Me.Controls.Add(Me.chkShowFullConnectionsFilePathInTitle)
Me.Controls.Add(Me.chkShowDescriptionTooltipsInTree)
Me.Controls.Add(Me.chkShowSystemTrayIcon)
Me.Controls.Add(Me.chkMinimizeToSystemTray)
Me.Name = "AppearancePage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents lblLanguageRestartRequired As System.Windows.Forms.Label
Friend WithEvents cboLanguage As System.Windows.Forms.ComboBox
Friend WithEvents lblLanguage As System.Windows.Forms.Label
Friend WithEvents chkShowFullConnectionsFilePathInTitle As System.Windows.Forms.CheckBox
Friend WithEvents chkShowDescriptionTooltipsInTree As System.Windows.Forms.CheckBox
Friend WithEvents chkShowSystemTrayIcon As System.Windows.Forms.CheckBox
Friend WithEvents chkMinimizeToSystemTray As System.Windows.Forms.CheckBox
End Class
End Namespace

View File

@@ -0,0 +1,188 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAQAEBAQAAEABAAoAQAARgAAABAQAAABAAgAaAUAAG4BAAAQEAAAAQAYAGgDAADWBgAAEBAAAAEA
IABoBAAAPgoAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr2guAK90
TwA+kkMASp9QAHDJegC+gVkAuY51AMiKWgDLlGcA1KR7ANSpiQDhvJ0A7MKaAP369wD///8AAAAAAAAA
AAAMpiIiIiIicAn///////8gBvER9ERDPyAG8aH0VVU/IAjxofRVVT8gCPGh9FVVPyAI8qH0VVVPIAj2
IvRERE9gCP///////2AJ/d3d3d3fYAn93d3d3d9gCv3d3d3d35AM////////sADKmZiZmbuwAAAAAAAA
AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMAB
AAD//wAAKAAAABAAAAAgAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsYyoArmYrALFr
LQCzbTIAtXI3ALZ1PwCmbUwAp3BOAKpwTgCscU4AsHNPALl7SQC5fEsAqHVVAKt3WACydVAAtXZRALh5
UgC7flMAu31UAD2SQgA/k0QAQJRFAEOXSABDmEgARZpLAEabTABJnk8AS6BRAEyhUgBOo1QAT6RVAFCl
VgBRp1gAVapcAG3HdwBuyHkAcMl7AHLKfAC9gFYAv4JdALmOdQDAglcAw4VZAMWGWQDJiloAy41cAMyP
XgDNkV4Axo5kAMePagDLkGAAzZFgAM+WZwDOlGgAzZ5zAM2fdADVonYA0KR9ANenfgDPoYQA0aWCANSn
ggDWqokA2K2KANm1nwDhvJ0A7cOaAOPBpAD02sAA////ABH/WwAx/3EAUf+HAHH/nQCR/7IAsf/JANH/
3wD///8AAAAAAAIvAAAEUAAABnAAAAiQAAAKsAAAC88AAA7wAAAg/xIAPf8xAFv/UQB5/3EAmP+RALX/
sQDU/9EA////AAAAAAAULwAAIlAAADBwAAA9kAAATLAAAFnPAABn8AAAeP8RAIr/MQCc/1EArv9xAMD/
kQDS/7EA5P/RAP///wAAAAAAJi8AAEBQAABacAAAdJAAAI6wAACpzwAAwvAAANH/EQDY/zEA3v9RAOP/
cQDp/5EA7/+xAPb/0QD///8AAAAAAC8mAABQQQAAcFsAAJB0AACwjgAAz6kAAPDDAAD/0hEA/9gxAP/d
UQD/5HEA/+qRAP/wsQD/9tEA////AAAAAAAvFAAAUCIAAHAwAACQPgAAsE0AAM9bAADwaQAA/3kRAP+K
MQD/nVEA/69xAP/BkQD/0rEA/+XRAP///wAAAAAALwMAAFAEAABwBgAAkAkAALAKAADPDAAA8A4AAP8g
EgD/PjEA/1xRAP96cQD/l5EA/7axAP/U0QD///8AAAAAAC8ADgBQABcAcAAhAJAAKwCwADYAzwBAAPAA
SQD/EVoA/zFwAP9RhgD/cZwA/5GyAP+xyAD/0d8A////AAAAAAAvACAAUAA2AHAATACQAGIAsAB4AM8A
jgDwAKQA/xGzAP8xvgD/UccA/3HRAP+R3AD/seUA/9HwAP///wAAAAAALAAvAEsAUABpAHAAhwCQAKUA
sADEAM8A4QDwAPAR/wDyMf8A9FH/APZx/wD3kf8A+bH/APvR/wD///8AAAAAABsALwAtAFAAPwBwAFIA
kABjALAAdgDPAIgA8ACZEf8ApjH/ALRR/wDCcf8Az5H/ANyx/wDr0f8A////AAAAAAAIAC8ADgBQABUA
cAAbAJAAIQCwACYAzwAsAPAAPhH/AFgx/wBxUf8AjHH/AKaR/wC/sf8A2tH/AP///wAAAAAAAAAAAAAA
AAAAAAAAAEI9KRIREAsKCQcHBw4qAAAzR0dHR0dHR0dHR0dHDwAAK0cCAQFHIyEdGxgWRwcAACxHAjgB
RxwmJiUkFUcIAAAsRwI5AUceJycmJRdHCgAALUcEOwNHICcnJiYZRxAAAC5HBj4FRyInJyYmG0cRAAAu
RxMNDEcaIiEfHhxHEgAAL0dHR0dHR0dHR0dHRxQAADVHREREREREREREREcoAAA2R0RGRkZGRkZGRkRH
KwAAOkdERERERERERERERzIAAENHR0dHR0dHR0dHR0dAAAAARTwxMTEwNTU0Nz9BQAAAAAAAAAAAAAAA
AAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
AADAAQAA//8AACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZtZ/PoYS/gl25eFK1dlCzdVCw
c0+scU6pcE6nbk2mbUylbUyodVW5jnUAAAAAAADHj2r/////////////////////////////////////
//////////+rd1gAAAAAAADBgVf///+uZiusYyqsYyr///9VqlxQpVZLoFFGm0tDl0g/k0T///+mbk0A
AAAAAADDhVn///+uZivNnnOsYyr///9Knk9vyXpvyXpuyHltx3c9kkL///+ncE4AAAAAAADEhVr///+u
ZivNn3SsYyr///9NolNyynxxynxwyXtuyHlAlEX///+rcU8AAAAAAADHh1n///+zbTLQpH2xay3///9P
pFVzy31yy3xxyntvyXpDmEj///+xdVAAAAAAAADIiVr///+2dT/RpYK1cjf///9Rp1hyy3xyy3xxyntv
yXpGm0z///+1d1IAAAAAAADKi1v///+7flO5fEu5e0n///9FmktSp1hQpVZOo1RMoVJJnk////+4e1MA
AAAAAADLjVz///////////////////////////////////////////////+7fVQAAAAAAADNkWD////t
w5rtw5rtw5rtw5rtw5rtw5rtw5rtw5rtw5rtw5r///+9gFYAAAAAAADPlmf////tw5v02sD02sD028H0
28H028H028H028H028Htw5r////Ag1cAAAAAAADVonb////tw5vtw5vtw5vtw5rtw5rtw5rtw5rtw5rt
w5rtw5r////GjmQAAAAAAADhvJ3////////////////////////////////////////////////WqYgA
AAAAAAAAAADjwaTXp37Okl7Nkl7NkV7Mj17NkWDNkmLLkGDOlGjUp4LYrYrXq4oAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//5xBgAGcQYABnEGAAZxBgAGcQYAB
nEGAAZxBgAGcQYABnEGAAZxBgAGcQYABnEGAAZxBgAGcQcABnEH//5xBKAAAABAAAAAgAAAAAQAgAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvXxUj7x7U7W7elLuuXhS/7V2UP+zdVD/sHNP/6xx
Tv+pcE7/p25N/6ZtTP+lbUz+o21M8aVtTMQAAAAAAAAAAL9/VN7/////////////////////////////
//////////////////////////////////+lbUztAAAAAAAAAADBgVf+/////65mK/+sYyr/rGMq////
//9Vqlz/UKVW/0ugUf9Gm0v/Q5dI/z+TRP//////pm5N/gAAAAAAAAAAw4VZ//////+uZiv/zZ5z/6xj
Kv//////Sp5P/2/Jev9vyXr/bsh5/23Hd/89kkL//////6dwTv8AAAAAAAAAAMSFWv//////rmYr/82f
dP+sYyr//////02iU/9yynz/ccp8/3DJe/9uyHn/QJRF//////+rcU//AAAAAAAAAADHh1n//////7Nt
Mv/QpH3/sWst//////9PpFX/c8t9/3LLfP9xynv/b8l6/0OYSP//////sXVQ/wAAAAAAAAAAyIla////
//+2dT//0aWC/7VyN///////UadY/3LLfP9yy3z/ccp7/2/Jev9Gm0z//////7V3Uv8AAAAAAAAAAMqL
W///////u35T/7l8S/+5e0n//////0WaS/9Sp1j/UKVW/06jVP9MoVL/SZ5P//////+4e1P/AAAAAAAA
AADLjVz+////////////////////////////////////////////////////////////////u31U/wAA
AAAAAAAAzI9d+v/////tw5r/7cOa/+3Dmv/tw5r/7cOa/+3Dmv/tw5r/7cOa/+3Dmv/tw5r//////72A
Vv8AAAAAAAAAAM2QXvD/////7cOb//TawP/02sD/9NvB//Tbwf/028H/9NvB//Tbwf/028H/7cOa////
///Ag1f+AAAAAAAAAADOkl7Y/////+3Dm//tw5v/7cOb/+3Dmv/tw5r/7cOa/+3Dmv/tw5r/7cOa/+3D
mv//////xYtg+AAAAAAAAAAAzpJem///////////////////////////////////////////////////
/////////////9apiP8AAAAAAAAAAM6SXnHOkl6QzpJezM6SXv/Nkl7+zZFe/8yPXv/NkWD/zZJi/8uQ
YP/LjV7vypFjy9itiv/Xq4r/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//5xBgAGcQYABnEGAAZxBgAGcQYABnEGAAZxBgAGcQYAB
nEGAAZxBgAGcQYABnEGAAZxBgAGcQYABnEH//5xB
</value>
</data>
</root>

View File

@@ -0,0 +1,75 @@
Imports mRemoteNG.App
Imports mRemoteNG.My
Namespace Forms.OptionsPages
Public Class AppearancePage
Public Overrides Property PageName() As String
Get
Return Language.strTabAppearance
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
lblLanguage.Text = Language.strLanguage
lblLanguageRestartRequired.Text = String.Format(Language.strLanguageRestartRequired, Application.Info.ProductName)
chkShowDescriptionTooltipsInTree.Text = Language.strShowDescriptionTooltips
chkShowFullConnectionsFilePathInTitle.Text = Language.strShowFullConsFilePath
chkShowSystemTrayIcon.Text = Language.strAlwaysShowSysTrayIcon
chkMinimizeToSystemTray.Text = Language.strMinimizeToSysTray
End Sub
Public Overrides Sub LoadSettings()
MyBase.SaveSettings()
cboLanguage.Items.Clear()
cboLanguage.Items.Add(Language.strLanguageDefault)
For Each nativeName As String In SupportedCultures.CultureNativeNames
cboLanguage.Items.Add(nativeName)
Next
If Not String.IsNullOrEmpty(Settings.OverrideUICulture) AndAlso SupportedCultures.IsNameSupported(Settings.OverrideUICulture) Then
cboLanguage.SelectedItem = SupportedCultures.CultureNativeName(Settings.OverrideUICulture)
End If
If cboLanguage.SelectedIndex = -1 Then
cboLanguage.SelectedIndex = 0
End If
chkShowDescriptionTooltipsInTree.Checked = Settings.ShowDescriptionTooltipsInTree
chkShowFullConnectionsFilePathInTitle.Checked = Settings.ShowCompleteConsPathInTitle
chkShowSystemTrayIcon.Checked = Settings.ShowSystemTrayIcon
chkMinimizeToSystemTray.Checked = Settings.MinimizeToTray
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
If cboLanguage.SelectedIndex > 0 And SupportedCultures.IsNativeNameSupported(cboLanguage.SelectedItem) Then
Settings.OverrideUICulture = SupportedCultures.CultureName(cboLanguage.SelectedItem)
Else
Settings.OverrideUICulture = String.Empty
End If
Settings.ShowDescriptionTooltipsInTree = chkShowDescriptionTooltipsInTree.Checked
Settings.ShowCompleteConsPathInTitle = chkShowFullConnectionsFilePathInTitle.Checked
frmMain.ShowFullPathInTitle = chkShowFullConnectionsFilePathInTitle.Checked
Settings.ShowSystemTrayIcon = chkShowSystemTrayIcon.Checked
If Settings.ShowSystemTrayIcon Then
If Runtime.NotificationAreaIcon Is Nothing Then
Runtime.NotificationAreaIcon = New Tools.Controls.NotificationAreaIcon
End If
Else
If Runtime.NotificationAreaIcon IsNot Nothing Then
Runtime.NotificationAreaIcon.Dispose()
Runtime.NotificationAreaIcon = Nothing
End If
End If
Settings.MinimizeToTray = chkMinimizeToSystemTray.Checked
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,394 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class ConnectionsPage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(ConnectionsPage))
Me.pnlRdpReconnectionCount = New System.Windows.Forms.Panel()
Me.lblRdpReconnectionCount = New System.Windows.Forms.Label()
Me.numRdpReconnectionCount = New System.Windows.Forms.NumericUpDown()
Me.chkSingleClickOnConnectionOpensIt = New System.Windows.Forms.CheckBox()
Me.chkHostnameLikeDisplayName = New System.Windows.Forms.CheckBox()
Me.pnlDefaultCredentials = New System.Windows.Forms.Panel()
Me.radCredentialsCustom = New System.Windows.Forms.RadioButton()
Me.lblDefaultCredentials = New System.Windows.Forms.Label()
Me.radCredentialsNoInfo = New System.Windows.Forms.RadioButton()
Me.radCredentialsWindows = New System.Windows.Forms.RadioButton()
Me.txtCredentialsDomain = New System.Windows.Forms.TextBox()
Me.lblCredentialsUsername = New System.Windows.Forms.Label()
Me.txtCredentialsPassword = New System.Windows.Forms.TextBox()
Me.lblCredentialsPassword = New System.Windows.Forms.Label()
Me.txtCredentialsUsername = New System.Windows.Forms.TextBox()
Me.lblCredentialsDomain = New System.Windows.Forms.Label()
Me.chkSingleClickOnOpenedConnectionSwitchesToIt = New System.Windows.Forms.CheckBox()
Me.pnlAutoSave = New System.Windows.Forms.Panel()
Me.lblAutoSave1 = New System.Windows.Forms.Label()
Me.numAutoSave = New System.Windows.Forms.NumericUpDown()
Me.lblAutoSave2 = New System.Windows.Forms.Label()
Me.pnlConfirmCloseConnection = New System.Windows.Forms.Panel()
Me.lblClosingConnections = New System.Windows.Forms.Label()
Me.radCloseWarnAll = New System.Windows.Forms.RadioButton()
Me.radCloseWarnMultiple = New System.Windows.Forms.RadioButton()
Me.radCloseWarnExit = New System.Windows.Forms.RadioButton()
Me.radCloseWarnNever = New System.Windows.Forms.RadioButton()
Me.pnlRdpReconnectionCount.SuspendLayout()
CType(Me.numRdpReconnectionCount, System.ComponentModel.ISupportInitialize).BeginInit()
Me.pnlDefaultCredentials.SuspendLayout()
Me.pnlAutoSave.SuspendLayout()
CType(Me.numAutoSave, System.ComponentModel.ISupportInitialize).BeginInit()
Me.pnlConfirmCloseConnection.SuspendLayout()
Me.SuspendLayout()
'
'pnlRdpReconnectionCount
'
Me.pnlRdpReconnectionCount.Controls.Add(Me.lblRdpReconnectionCount)
Me.pnlRdpReconnectionCount.Controls.Add(Me.numRdpReconnectionCount)
Me.pnlRdpReconnectionCount.Location = New System.Drawing.Point(3, 69)
Me.pnlRdpReconnectionCount.Name = "pnlRdpReconnectionCount"
Me.pnlRdpReconnectionCount.Size = New System.Drawing.Size(596, 29)
Me.pnlRdpReconnectionCount.TabIndex = 10
'
'lblRdpReconnectionCount
'
Me.lblRdpReconnectionCount.Location = New System.Drawing.Point(6, 9)
Me.lblRdpReconnectionCount.Name = "lblRdpReconnectionCount"
Me.lblRdpReconnectionCount.Size = New System.Drawing.Size(288, 13)
Me.lblRdpReconnectionCount.TabIndex = 0
Me.lblRdpReconnectionCount.Text = "RDP Reconnection Count"
Me.lblRdpReconnectionCount.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'numRdpReconnectionCount
'
Me.numRdpReconnectionCount.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.numRdpReconnectionCount.Location = New System.Drawing.Point(300, 7)
Me.numRdpReconnectionCount.Maximum = New Decimal(New Integer() {20, 0, 0, 0})
Me.numRdpReconnectionCount.Name = "numRdpReconnectionCount"
Me.numRdpReconnectionCount.Size = New System.Drawing.Size(53, 20)
Me.numRdpReconnectionCount.TabIndex = 1
Me.numRdpReconnectionCount.Value = New Decimal(New Integer() {5, 0, 0, 0})
'
'chkSingleClickOnConnectionOpensIt
'
Me.chkSingleClickOnConnectionOpensIt.AutoSize = True
Me.chkSingleClickOnConnectionOpensIt.Location = New System.Drawing.Point(3, 0)
Me.chkSingleClickOnConnectionOpensIt.Name = "chkSingleClickOnConnectionOpensIt"
Me.chkSingleClickOnConnectionOpensIt.Size = New System.Drawing.Size(191, 17)
Me.chkSingleClickOnConnectionOpensIt.TabIndex = 7
Me.chkSingleClickOnConnectionOpensIt.Text = "Single click on connection opens it"
Me.chkSingleClickOnConnectionOpensIt.UseVisualStyleBackColor = True
'
'chkHostnameLikeDisplayName
'
Me.chkHostnameLikeDisplayName.AutoSize = True
Me.chkHostnameLikeDisplayName.Location = New System.Drawing.Point(3, 46)
Me.chkHostnameLikeDisplayName.Name = "chkHostnameLikeDisplayName"
Me.chkHostnameLikeDisplayName.Size = New System.Drawing.Size(328, 17)
Me.chkHostnameLikeDisplayName.TabIndex = 9
Me.chkHostnameLikeDisplayName.Text = "Set hostname like display name when creating new connections"
Me.chkHostnameLikeDisplayName.UseVisualStyleBackColor = True
'
'pnlDefaultCredentials
'
Me.pnlDefaultCredentials.Controls.Add(Me.radCredentialsCustom)
Me.pnlDefaultCredentials.Controls.Add(Me.lblDefaultCredentials)
Me.pnlDefaultCredentials.Controls.Add(Me.radCredentialsNoInfo)
Me.pnlDefaultCredentials.Controls.Add(Me.radCredentialsWindows)
Me.pnlDefaultCredentials.Controls.Add(Me.txtCredentialsDomain)
Me.pnlDefaultCredentials.Controls.Add(Me.lblCredentialsUsername)
Me.pnlDefaultCredentials.Controls.Add(Me.txtCredentialsPassword)
Me.pnlDefaultCredentials.Controls.Add(Me.lblCredentialsPassword)
Me.pnlDefaultCredentials.Controls.Add(Me.txtCredentialsUsername)
Me.pnlDefaultCredentials.Controls.Add(Me.lblCredentialsDomain)
Me.pnlDefaultCredentials.Location = New System.Drawing.Point(3, 139)
Me.pnlDefaultCredentials.Name = "pnlDefaultCredentials"
Me.pnlDefaultCredentials.Size = New System.Drawing.Size(596, 175)
Me.pnlDefaultCredentials.TabIndex = 12
'
'radCredentialsCustom
'
Me.radCredentialsCustom.AutoSize = True
Me.radCredentialsCustom.Location = New System.Drawing.Point(16, 69)
Me.radCredentialsCustom.Name = "radCredentialsCustom"
Me.radCredentialsCustom.Size = New System.Drawing.Size(87, 17)
Me.radCredentialsCustom.TabIndex = 3
Me.radCredentialsCustom.Text = "the following:"
Me.radCredentialsCustom.UseVisualStyleBackColor = True
'
'lblDefaultCredentials
'
Me.lblDefaultCredentials.AutoSize = True
Me.lblDefaultCredentials.Location = New System.Drawing.Point(3, 9)
Me.lblDefaultCredentials.Name = "lblDefaultCredentials"
Me.lblDefaultCredentials.Size = New System.Drawing.Size(257, 13)
Me.lblDefaultCredentials.TabIndex = 0
Me.lblDefaultCredentials.Text = "For empty Username, Password or Domain fields use:"
'
'radCredentialsNoInfo
'
Me.radCredentialsNoInfo.AutoSize = True
Me.radCredentialsNoInfo.Checked = True
Me.radCredentialsNoInfo.Location = New System.Drawing.Point(16, 31)
Me.radCredentialsNoInfo.Name = "radCredentialsNoInfo"
Me.radCredentialsNoInfo.Size = New System.Drawing.Size(91, 17)
Me.radCredentialsNoInfo.TabIndex = 1
Me.radCredentialsNoInfo.TabStop = True
Me.radCredentialsNoInfo.Text = "no information"
Me.radCredentialsNoInfo.UseVisualStyleBackColor = True
'
'radCredentialsWindows
'
Me.radCredentialsWindows.AutoSize = True
Me.radCredentialsWindows.Location = New System.Drawing.Point(16, 50)
Me.radCredentialsWindows.Name = "radCredentialsWindows"
Me.radCredentialsWindows.Size = New System.Drawing.Size(227, 17)
Me.radCredentialsWindows.TabIndex = 2
Me.radCredentialsWindows.Text = "my current credentials (windows logon info)"
Me.radCredentialsWindows.UseVisualStyleBackColor = True
'
'txtCredentialsDomain
'
Me.txtCredentialsDomain.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtCredentialsDomain.Enabled = False
Me.txtCredentialsDomain.Location = New System.Drawing.Point(140, 147)
Me.txtCredentialsDomain.Name = "txtCredentialsDomain"
Me.txtCredentialsDomain.Size = New System.Drawing.Size(150, 20)
Me.txtCredentialsDomain.TabIndex = 9
'
'lblCredentialsUsername
'
Me.lblCredentialsUsername.Enabled = False
Me.lblCredentialsUsername.Location = New System.Drawing.Point(37, 95)
Me.lblCredentialsUsername.Name = "lblCredentialsUsername"
Me.lblCredentialsUsername.Size = New System.Drawing.Size(97, 13)
Me.lblCredentialsUsername.TabIndex = 4
Me.lblCredentialsUsername.Text = "Username:"
Me.lblCredentialsUsername.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'txtCredentialsPassword
'
Me.txtCredentialsPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtCredentialsPassword.Enabled = False
Me.txtCredentialsPassword.Location = New System.Drawing.Point(140, 120)
Me.txtCredentialsPassword.Name = "txtCredentialsPassword"
Me.txtCredentialsPassword.Size = New System.Drawing.Size(150, 20)
Me.txtCredentialsPassword.TabIndex = 7
Me.txtCredentialsPassword.UseSystemPasswordChar = True
'
'lblCredentialsPassword
'
Me.lblCredentialsPassword.Enabled = False
Me.lblCredentialsPassword.Location = New System.Drawing.Point(34, 123)
Me.lblCredentialsPassword.Name = "lblCredentialsPassword"
Me.lblCredentialsPassword.Size = New System.Drawing.Size(100, 13)
Me.lblCredentialsPassword.TabIndex = 6
Me.lblCredentialsPassword.Text = "Password:"
Me.lblCredentialsPassword.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'txtCredentialsUsername
'
Me.txtCredentialsUsername.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtCredentialsUsername.Enabled = False
Me.txtCredentialsUsername.Location = New System.Drawing.Point(140, 93)
Me.txtCredentialsUsername.Name = "txtCredentialsUsername"
Me.txtCredentialsUsername.Size = New System.Drawing.Size(150, 20)
Me.txtCredentialsUsername.TabIndex = 5
'
'lblCredentialsDomain
'
Me.lblCredentialsDomain.Enabled = False
Me.lblCredentialsDomain.Location = New System.Drawing.Point(34, 150)
Me.lblCredentialsDomain.Name = "lblCredentialsDomain"
Me.lblCredentialsDomain.Size = New System.Drawing.Size(100, 13)
Me.lblCredentialsDomain.TabIndex = 8
Me.lblCredentialsDomain.Text = "Domain:"
Me.lblCredentialsDomain.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'chkSingleClickOnOpenedConnectionSwitchesToIt
'
Me.chkSingleClickOnOpenedConnectionSwitchesToIt.AutoSize = True
Me.chkSingleClickOnOpenedConnectionSwitchesToIt.Location = New System.Drawing.Point(3, 23)
Me.chkSingleClickOnOpenedConnectionSwitchesToIt.Name = "chkSingleClickOnOpenedConnectionSwitchesToIt"
Me.chkSingleClickOnOpenedConnectionSwitchesToIt.Size = New System.Drawing.Size(254, 17)
Me.chkSingleClickOnOpenedConnectionSwitchesToIt.TabIndex = 8
Me.chkSingleClickOnOpenedConnectionSwitchesToIt.Text = "Single click on opened connection switches to it"
Me.chkSingleClickOnOpenedConnectionSwitchesToIt.UseVisualStyleBackColor = True
'
'pnlAutoSave
'
Me.pnlAutoSave.Controls.Add(Me.lblAutoSave1)
Me.pnlAutoSave.Controls.Add(Me.numAutoSave)
Me.pnlAutoSave.Controls.Add(Me.lblAutoSave2)
Me.pnlAutoSave.Location = New System.Drawing.Point(3, 104)
Me.pnlAutoSave.Name = "pnlAutoSave"
Me.pnlAutoSave.Size = New System.Drawing.Size(596, 29)
Me.pnlAutoSave.TabIndex = 11
'
'lblAutoSave1
'
Me.lblAutoSave1.Location = New System.Drawing.Point(6, 9)
Me.lblAutoSave1.Name = "lblAutoSave1"
Me.lblAutoSave1.Size = New System.Drawing.Size(288, 13)
Me.lblAutoSave1.TabIndex = 0
Me.lblAutoSave1.Text = "Auto Save every:"
Me.lblAutoSave1.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'numAutoSave
'
Me.numAutoSave.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.numAutoSave.Location = New System.Drawing.Point(300, 7)
Me.numAutoSave.Maximum = New Decimal(New Integer() {9999, 0, 0, 0})
Me.numAutoSave.Name = "numAutoSave"
Me.numAutoSave.Size = New System.Drawing.Size(53, 20)
Me.numAutoSave.TabIndex = 1
'
'lblAutoSave2
'
Me.lblAutoSave2.AutoSize = True
Me.lblAutoSave2.Location = New System.Drawing.Point(359, 9)
Me.lblAutoSave2.Name = "lblAutoSave2"
Me.lblAutoSave2.Size = New System.Drawing.Size(135, 13)
Me.lblAutoSave2.TabIndex = 2
Me.lblAutoSave2.Text = "Minutes (0 means disabled)"
'
'pnlConfirmCloseConnection
'
Me.pnlConfirmCloseConnection.Controls.Add(Me.lblClosingConnections)
Me.pnlConfirmCloseConnection.Controls.Add(Me.radCloseWarnAll)
Me.pnlConfirmCloseConnection.Controls.Add(Me.radCloseWarnMultiple)
Me.pnlConfirmCloseConnection.Controls.Add(Me.radCloseWarnExit)
Me.pnlConfirmCloseConnection.Controls.Add(Me.radCloseWarnNever)
Me.pnlConfirmCloseConnection.Location = New System.Drawing.Point(3, 320)
Me.pnlConfirmCloseConnection.Name = "pnlConfirmCloseConnection"
Me.pnlConfirmCloseConnection.Size = New System.Drawing.Size(596, 137)
Me.pnlConfirmCloseConnection.TabIndex = 13
'
'lblClosingConnections
'
Me.lblClosingConnections.AutoSize = True
Me.lblClosingConnections.Location = New System.Drawing.Point(3, 9)
Me.lblClosingConnections.Name = "lblClosingConnections"
Me.lblClosingConnections.Size = New System.Drawing.Size(136, 13)
Me.lblClosingConnections.TabIndex = 0
Me.lblClosingConnections.Text = "When closing connections:"
'
'radCloseWarnAll
'
Me.radCloseWarnAll.AutoSize = True
Me.radCloseWarnAll.Location = New System.Drawing.Point(16, 31)
Me.radCloseWarnAll.Name = "radCloseWarnAll"
Me.radCloseWarnAll.Size = New System.Drawing.Size(194, 17)
Me.radCloseWarnAll.TabIndex = 1
Me.radCloseWarnAll.TabStop = True
Me.radCloseWarnAll.Text = "Warn me when closing connections"
Me.radCloseWarnAll.UseVisualStyleBackColor = True
'
'radCloseWarnMultiple
'
Me.radCloseWarnMultiple.AutoSize = True
Me.radCloseWarnMultiple.Location = New System.Drawing.Point(16, 54)
Me.radCloseWarnMultiple.Name = "radCloseWarnMultiple"
Me.radCloseWarnMultiple.Size = New System.Drawing.Size(254, 17)
Me.radCloseWarnMultiple.TabIndex = 2
Me.radCloseWarnMultiple.TabStop = True
Me.radCloseWarnMultiple.Text = "Warn me only when closing multiple connections"
Me.radCloseWarnMultiple.UseVisualStyleBackColor = True
'
'radCloseWarnExit
'
Me.radCloseWarnExit.AutoSize = True
Me.radCloseWarnExit.Location = New System.Drawing.Point(16, 77)
Me.radCloseWarnExit.Name = "radCloseWarnExit"
Me.radCloseWarnExit.Size = New System.Drawing.Size(216, 17)
Me.radCloseWarnExit.TabIndex = 3
Me.radCloseWarnExit.TabStop = True
Me.radCloseWarnExit.Text = "Warn me only when exiting mRemoteNG"
Me.radCloseWarnExit.UseVisualStyleBackColor = True
'
'radCloseWarnNever
'
Me.radCloseWarnNever.AutoSize = True
Me.radCloseWarnNever.Location = New System.Drawing.Point(16, 100)
Me.radCloseWarnNever.Name = "radCloseWarnNever"
Me.radCloseWarnNever.Size = New System.Drawing.Size(226, 17)
Me.radCloseWarnNever.TabIndex = 4
Me.radCloseWarnNever.TabStop = True
Me.radCloseWarnNever.Text = "Do not warn me when closing connections"
Me.radCloseWarnNever.UseVisualStyleBackColor = True
'
'ConnectionsPage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.pnlRdpReconnectionCount)
Me.Controls.Add(Me.chkSingleClickOnConnectionOpensIt)
Me.Controls.Add(Me.chkHostnameLikeDisplayName)
Me.Controls.Add(Me.pnlDefaultCredentials)
Me.Controls.Add(Me.chkSingleClickOnOpenedConnectionSwitchesToIt)
Me.Controls.Add(Me.pnlAutoSave)
Me.Controls.Add(Me.pnlConfirmCloseConnection)
Me.Name = "ConnectionsPage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.pnlRdpReconnectionCount.ResumeLayout(False)
CType(Me.numRdpReconnectionCount, System.ComponentModel.ISupportInitialize).EndInit()
Me.pnlDefaultCredentials.ResumeLayout(False)
Me.pnlDefaultCredentials.PerformLayout()
Me.pnlAutoSave.ResumeLayout(False)
Me.pnlAutoSave.PerformLayout()
CType(Me.numAutoSave, System.ComponentModel.ISupportInitialize).EndInit()
Me.pnlConfirmCloseConnection.ResumeLayout(False)
Me.pnlConfirmCloseConnection.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents pnlRdpReconnectionCount As System.Windows.Forms.Panel
Friend WithEvents lblRdpReconnectionCount As System.Windows.Forms.Label
Friend WithEvents numRdpReconnectionCount As System.Windows.Forms.NumericUpDown
Friend WithEvents chkSingleClickOnConnectionOpensIt As System.Windows.Forms.CheckBox
Friend WithEvents chkHostnameLikeDisplayName As System.Windows.Forms.CheckBox
Friend WithEvents pnlDefaultCredentials As System.Windows.Forms.Panel
Friend WithEvents radCredentialsCustom As System.Windows.Forms.RadioButton
Friend WithEvents lblDefaultCredentials As System.Windows.Forms.Label
Friend WithEvents radCredentialsNoInfo As System.Windows.Forms.RadioButton
Friend WithEvents radCredentialsWindows As System.Windows.Forms.RadioButton
Friend WithEvents txtCredentialsDomain As System.Windows.Forms.TextBox
Friend WithEvents lblCredentialsUsername As System.Windows.Forms.Label
Friend WithEvents txtCredentialsPassword As System.Windows.Forms.TextBox
Friend WithEvents lblCredentialsPassword As System.Windows.Forms.Label
Friend WithEvents txtCredentialsUsername As System.Windows.Forms.TextBox
Friend WithEvents lblCredentialsDomain As System.Windows.Forms.Label
Friend WithEvents chkSingleClickOnOpenedConnectionSwitchesToIt As System.Windows.Forms.CheckBox
Friend WithEvents pnlAutoSave As System.Windows.Forms.Panel
Friend WithEvents lblAutoSave1 As System.Windows.Forms.Label
Friend WithEvents numAutoSave As System.Windows.Forms.NumericUpDown
Friend WithEvents lblAutoSave2 As System.Windows.Forms.Label
Friend WithEvents pnlConfirmCloseConnection As System.Windows.Forms.Panel
Friend WithEvents lblClosingConnections As System.Windows.Forms.Label
Friend WithEvents radCloseWarnAll As System.Windows.Forms.RadioButton
Friend WithEvents radCloseWarnMultiple As System.Windows.Forms.RadioButton
Friend WithEvents radCloseWarnExit As System.Windows.Forms.RadioButton
Friend WithEvents radCloseWarnNever As System.Windows.Forms.RadioButton
End Class
End Namespace

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAA
AAAAAAAAAAAAAAAAAADVYQEFyk4AFcdXAC3JWAA/xVIAScNPAUi+TAA9v0sAK75KABTQTwAEAAAAAAAA
AAAAAAAAAAAAAAAAAADGXQAHv1YALMhbAGrAVgCjrUsAxKRHBNOoRgjTqUcEw7RKAKHBUgBmwV4AKM9X
AAYAAAAAAAAAAAAAAADCWgABuEcAGLFEAGuCOQHXejoP/KxNJP/hbUH/5H9V/9NrOf+jSxb9o00H2r9X
AGrKZAAUAAAAAAAAAAAAAAAAAAAAAKc/BSZPIwHSPScX/4pcRP/Khmb/9ryc//nMt//joHj/sXdd/3lT
NP+GRQjdv1sAKAAAAAAAAAAAAAAAAAAAAABvRSSlVDkh/3lkT/+PdmH/rIhr/8KjiP/BpY7/s5iB/5F2
YP90W0b/YzwZ/4U+ALEAAAAAAAAAAAAAAACqZztfdVU6/8Oxov+2nIP/pnlM/6h3Sf/DpIf/2Maw/72p
i/9/Xz//XDwd/1IuDP9ZMgr/eTYAUwAAAACuXisxYjYYsWc7Fv+qhV//snIw/61PAP+6bCT/6tW///38
+v/Wvqb/kF8s/2IwAP9jQB//XDwe/1QsBMVUKAAnYiQAR1YhAexiMAb/mU8G/7hnE//CYwL/yXUj/+a/
lP/s1Lb/zZxi/6hsLP+ZbUH/o4xy/39mT/9aNhT3UigCVX0vAV9qLgP9dDsG/65ZBf/AYQX/55ZG/+iy
ev/ksXr/0ok5/71mBv+oVAD/uI1d/9TDsv+YhG7/Wz0f/0olBmqWQARafTwH+oNGDP/LcBv/5Ys9//62
cv//48L/9LyF/9Z3Kf/FbhL/umMH/693Of+uiF3/lHZd/1w+Iv9CIwVms1oVOZFJEN6OThn/7J5T//6/
hf//zKH//9+7//7Cf//ijkn/04Q6/8p5LP+1cCr/l2En/4FeOf9YOx/sPyEESMlsHwypUxSOwG4t//+8
f//6zqf/+Nu+///ixv//vob/9Kx1/+zCmv/itYv/uHUz/51kLP+IZED/QSMHpTcZABUAAAAAx1wUGu5v
JPHYnnL/59PA//z17v//+Ov//+XC//a5gv/y0rj/7tK2/8KGTv+ndkf/bUYj+jcaACkAAAAAAAAAAAAA
AADrZRdXqWI0/8q4qP////////78///24v/7xaD/5LmV/9usff/Djlz/k2Q4/0wkAWoAAAAAAAAAAAAA
AAAAAAAAAAAAAOqsdVG0e1Hs0LKV/+zg2f/m1cT/07CU/9Omd//Lj1X/omUt8mUwBGAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/u/cF8aBSHqyayrFp2815aBnLeahXhvJpVkKg4A8Ah0AAAAAAAAAAAAA
AAAAAAAA4AcAAMADAACAAwAAwAMAAMADAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAMAD
AADgBwAA8A8AAA==
</value>
</data>
</root>

View File

@@ -0,0 +1,125 @@
Imports mRemoteNG.My
Imports mRemoteNG.Config
Imports mRemoteNG.App.Info
Imports mRemoteNG.Security
Namespace Forms.OptionsPages
Public Class ConnectionsPage
Public Overrides Property PageName() As String
Get
Return Language.strConnections
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
chkSingleClickOnConnectionOpensIt.Text = Language.strSingleClickOnConnectionOpensIt
chkSingleClickOnOpenedConnectionSwitchesToIt.Text = Language.strSingleClickOnOpenConnectionSwitchesToIt
chkHostnameLikeDisplayName.Text = Language.strSetHostnameLikeDisplayName
lblRdpReconnectionCount.Text = Language.strRdpReconnectCount
lblAutoSave1.Text = Language.strAutoSaveEvery
lblAutoSave2.Text = Language.strAutoSaveMins
lblDefaultCredentials.Text = Language.strEmptyUsernamePasswordDomainFields
radCredentialsNoInfo.Text = Language.strNoInformation
radCredentialsWindows.Text = Language.strMyCurrentWindowsCreds
radCredentialsCustom.Text = Language.strTheFollowing
lblCredentialsUsername.Text = Language.strLabelUsername
lblCredentialsPassword.Text = Language.strLabelPassword
lblCredentialsDomain.Text = Language.strLabelDomain
lblClosingConnections.Text = Language.strLabelClosingConnections
radCloseWarnAll.Text = Language.strRadioCloseWarnAll
radCloseWarnMultiple.Text = Language.strRadioCloseWarnMultiple
radCloseWarnExit.Text = Language.strRadioCloseWarnExit
radCloseWarnNever.Text = Language.strRadioCloseWarnNever
End Sub
Public Overrides Sub LoadSettings()
MyBase.SaveSettings()
chkSingleClickOnConnectionOpensIt.Checked = My.Settings.SingleClickOnConnectionOpensIt
chkSingleClickOnOpenedConnectionSwitchesToIt.Checked = My.Settings.SingleClickSwitchesToOpenConnection
chkHostnameLikeDisplayName.Checked = My.Settings.SetHostnameLikeDisplayName
numRdpReconnectionCount.Value = My.Settings.RdpReconnectionCount
numAutoSave.Value = My.Settings.AutoSaveEveryMinutes
Select Case My.Settings.EmptyCredentials
' ReSharper disable once StringLiteralTypo
Case "noinfo"
radCredentialsNoInfo.Checked = True
Case "windows"
radCredentialsWindows.Checked = True
Case "custom"
radCredentialsCustom.Checked = True
End Select
txtCredentialsUsername.Text = My.Settings.DefaultUsername
txtCredentialsPassword.Text = Crypt.Decrypt(My.Settings.DefaultPassword, General.EncryptionKey)
txtCredentialsDomain.Text = My.Settings.DefaultDomain
Select Case My.Settings.ConfirmCloseConnection
Case ConfirmClose.Never
radCloseWarnNever.Checked = True
Case ConfirmClose.Exit
radCloseWarnExit.Checked = True
Case ConfirmClose.Multiple
radCloseWarnMultiple.Checked = True
Case Else
radCloseWarnAll.Checked = True
End Select
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
My.Settings.SingleClickOnConnectionOpensIt = chkSingleClickOnConnectionOpensIt.Checked
My.Settings.SingleClickSwitchesToOpenConnection = chkSingleClickOnOpenedConnectionSwitchesToIt.Checked
My.Settings.SetHostnameLikeDisplayName = chkHostnameLikeDisplayName.Checked
My.Settings.RdpReconnectionCount = numRdpReconnectionCount.Value
My.Settings.AutoSaveEveryMinutes = numAutoSave.Value
If My.Settings.AutoSaveEveryMinutes > 0 Then
frmMain.tmrAutoSave.Interval = My.Settings.AutoSaveEveryMinutes * 60000
frmMain.tmrAutoSave.Enabled = True
Else
frmMain.tmrAutoSave.Enabled = False
End If
If radCredentialsNoInfo.Checked Then
' ReSharper disable once StringLiteralTypo
My.Settings.EmptyCredentials = "noinfo"
ElseIf radCredentialsWindows.Checked Then
My.Settings.EmptyCredentials = "windows"
ElseIf radCredentialsCustom.Checked Then
My.Settings.EmptyCredentials = "custom"
End If
My.Settings.DefaultUsername = txtCredentialsUsername.Text
My.Settings.DefaultPassword = Crypt.Encrypt(txtCredentialsPassword.Text, General.EncryptionKey)
My.Settings.DefaultDomain = txtCredentialsDomain.Text
If radCloseWarnAll.Checked Then My.Settings.ConfirmCloseConnection = ConfirmClose.All
If radCloseWarnMultiple.Checked Then My.Settings.ConfirmCloseConnection = ConfirmClose.Multiple
If radCloseWarnExit.Checked Then My.Settings.ConfirmCloseConnection = ConfirmClose.Exit
If radCloseWarnNever.Checked Then My.Settings.ConfirmCloseConnection = ConfirmClose.Never
End Sub
Private Sub radCredentialsCustom_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles radCredentialsCustom.CheckedChanged
lblCredentialsUsername.Enabled = radCredentialsCustom.Checked
lblCredentialsPassword.Enabled = radCredentialsCustom.Checked
lblCredentialsDomain.Enabled = radCredentialsCustom.Checked
txtCredentialsUsername.Enabled = radCredentialsCustom.Checked
txtCredentialsPassword.Enabled = radCredentialsCustom.Checked
txtCredentialsDomain.Enabled = radCredentialsCustom.Checked
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,190 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class KeyboardPage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim LineGroupBox As System.Windows.Forms.GroupBox
Dim Alignment1 As mRemoteNG.Controls.Alignment = New mRemoteNG.Controls.Alignment()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(KeyboardPage))
Me.btnDeleteKeyboardShortcut = New System.Windows.Forms.Button()
Me.btnNewKeyboardShortcut = New System.Windows.Forms.Button()
Me.grpModifyKeyboardShortcut = New System.Windows.Forms.GroupBox()
Me.hotModifyKeyboardShortcut = New SharedLibraryNG.HotkeyControl()
Me.btnResetAllKeyboardShortcuts = New System.Windows.Forms.Button()
Me.btnResetKeyboardShortcuts = New System.Windows.Forms.Button()
Me.lblKeyboardCommand = New System.Windows.Forms.Label()
Me.lstKeyboardShortcuts = New System.Windows.Forms.ListBox()
Me.lblKeyboardShortcuts = New System.Windows.Forms.Label()
Me.lvKeyboardCommands = New mRemoteNG.Controls.ListView()
LineGroupBox = New System.Windows.Forms.GroupBox()
Me.grpModifyKeyboardShortcut.SuspendLayout()
Me.SuspendLayout()
'
'LineGroupBox
'
LineGroupBox.Location = New System.Drawing.Point(212, 20)
LineGroupBox.Name = "LineGroupBox"
LineGroupBox.Size = New System.Drawing.Size(398, 3)
LineGroupBox.TabIndex = 19
LineGroupBox.TabStop = False
'
'btnDeleteKeyboardShortcut
'
Me.btnDeleteKeyboardShortcut.Location = New System.Drawing.Point(293, 151)
Me.btnDeleteKeyboardShortcut.Name = "btnDeleteKeyboardShortcut"
Me.btnDeleteKeyboardShortcut.Size = New System.Drawing.Size(75, 23)
Me.btnDeleteKeyboardShortcut.TabIndex = 15
Me.btnDeleteKeyboardShortcut.Text = "&Delete"
Me.btnDeleteKeyboardShortcut.UseVisualStyleBackColor = True
'
'btnNewKeyboardShortcut
'
Me.btnNewKeyboardShortcut.Location = New System.Drawing.Point(212, 151)
Me.btnNewKeyboardShortcut.Name = "btnNewKeyboardShortcut"
Me.btnNewKeyboardShortcut.Size = New System.Drawing.Size(75, 23)
Me.btnNewKeyboardShortcut.TabIndex = 14
Me.btnNewKeyboardShortcut.Text = "&New"
Me.btnNewKeyboardShortcut.UseVisualStyleBackColor = True
'
'grpModifyKeyboardShortcut
'
Me.grpModifyKeyboardShortcut.Controls.Add(Me.hotModifyKeyboardShortcut)
Me.grpModifyKeyboardShortcut.Location = New System.Drawing.Point(212, 180)
Me.grpModifyKeyboardShortcut.Name = "grpModifyKeyboardShortcut"
Me.grpModifyKeyboardShortcut.Size = New System.Drawing.Size(398, 103)
Me.grpModifyKeyboardShortcut.TabIndex = 17
Me.grpModifyKeyboardShortcut.TabStop = False
Me.grpModifyKeyboardShortcut.Text = "Modify Shortcut"
'
'hotModifyKeyboardShortcut
'
Me.hotModifyKeyboardShortcut.HotkeyModifiers = System.Windows.Forms.Keys.None
Me.hotModifyKeyboardShortcut.KeyCode = System.Windows.Forms.Keys.None
Me.hotModifyKeyboardShortcut.Location = New System.Drawing.Point(27, 41)
Me.hotModifyKeyboardShortcut.Name = "hotModifyKeyboardShortcut"
Me.hotModifyKeyboardShortcut.Size = New System.Drawing.Size(344, 20)
Me.hotModifyKeyboardShortcut.TabIndex = 0
Me.hotModifyKeyboardShortcut.Text = "None"
'
'btnResetAllKeyboardShortcuts
'
Me.btnResetAllKeyboardShortcuts.Location = New System.Drawing.Point(3, 466)
Me.btnResetAllKeyboardShortcuts.Name = "btnResetAllKeyboardShortcuts"
Me.btnResetAllKeyboardShortcuts.Size = New System.Drawing.Size(120, 23)
Me.btnResetAllKeyboardShortcuts.TabIndex = 18
Me.btnResetAllKeyboardShortcuts.Text = "Reset &All to Default"
Me.btnResetAllKeyboardShortcuts.UseVisualStyleBackColor = True
'
'btnResetKeyboardShortcuts
'
Me.btnResetKeyboardShortcuts.Location = New System.Drawing.Point(490, 151)
Me.btnResetKeyboardShortcuts.Name = "btnResetKeyboardShortcuts"
Me.btnResetKeyboardShortcuts.Size = New System.Drawing.Size(120, 23)
Me.btnResetKeyboardShortcuts.TabIndex = 16
Me.btnResetKeyboardShortcuts.Text = "&Reset to Default"
Me.btnResetKeyboardShortcuts.UseVisualStyleBackColor = True
'
'lblKeyboardCommand
'
Me.lblKeyboardCommand.AutoSize = True
Me.lblKeyboardCommand.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblKeyboardCommand.Location = New System.Drawing.Point(209, 0)
Me.lblKeyboardCommand.Name = "lblKeyboardCommand"
Me.lblKeyboardCommand.Size = New System.Drawing.Size(71, 17)
Me.lblKeyboardCommand.TabIndex = 11
Me.lblKeyboardCommand.Text = "Command"
'
'lstKeyboardShortcuts
'
Me.lstKeyboardShortcuts.FormattingEnabled = True
Me.lstKeyboardShortcuts.Location = New System.Drawing.Point(212, 50)
Me.lstKeyboardShortcuts.Name = "lstKeyboardShortcuts"
Me.lstKeyboardShortcuts.Size = New System.Drawing.Size(398, 95)
Me.lstKeyboardShortcuts.TabIndex = 13
'
'lblKeyboardShortcuts
'
Me.lblKeyboardShortcuts.AutoSize = True
Me.lblKeyboardShortcuts.Location = New System.Drawing.Point(209, 34)
Me.lblKeyboardShortcuts.Name = "lblKeyboardShortcuts"
Me.lblKeyboardShortcuts.Size = New System.Drawing.Size(100, 13)
Me.lblKeyboardShortcuts.TabIndex = 12
Me.lblKeyboardShortcuts.Text = "Keyboard Shortcuts"
'
'lvKeyboardCommands
'
Me.lvKeyboardCommands.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable
Me.lvKeyboardCommands.HideSelection = False
Me.lvKeyboardCommands.InactiveHighlightBackColor = System.Drawing.SystemColors.Highlight
Me.lvKeyboardCommands.InactiveHighlightBorderColor = System.Drawing.SystemColors.HotTrack
Me.lvKeyboardCommands.InactiveHighlightForeColor = System.Drawing.SystemColors.HighlightText
Alignment1.Horizontal = mRemoteNG.Controls.HorizontalAlignment.Left
Alignment1.Vertical = mRemoteNG.Controls.VerticalAlignment.Middle
Me.lvKeyboardCommands.LabelAlignment = Alignment1
Me.lvKeyboardCommands.LabelWrap = False
Me.lvKeyboardCommands.Location = New System.Drawing.Point(3, 0)
Me.lvKeyboardCommands.MultiSelect = False
Me.lvKeyboardCommands.Name = "lvKeyboardCommands"
Me.lvKeyboardCommands.OwnerDraw = True
Me.lvKeyboardCommands.Size = New System.Drawing.Size(200, 460)
Me.lvKeyboardCommands.TabIndex = 10
Me.lvKeyboardCommands.TileSize = New System.Drawing.Size(196, 20)
Me.lvKeyboardCommands.UseCompatibleStateImageBehavior = False
Me.lvKeyboardCommands.View = System.Windows.Forms.View.Tile
'
'KeyboardPage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(LineGroupBox)
Me.Controls.Add(Me.btnDeleteKeyboardShortcut)
Me.Controls.Add(Me.btnNewKeyboardShortcut)
Me.Controls.Add(Me.grpModifyKeyboardShortcut)
Me.Controls.Add(Me.btnResetAllKeyboardShortcuts)
Me.Controls.Add(Me.btnResetKeyboardShortcuts)
Me.Controls.Add(Me.lblKeyboardCommand)
Me.Controls.Add(Me.lstKeyboardShortcuts)
Me.Controls.Add(Me.lblKeyboardShortcuts)
Me.Controls.Add(Me.lvKeyboardCommands)
Me.Name = "KeyboardPage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.grpModifyKeyboardShortcut.ResumeLayout(False)
Me.grpModifyKeyboardShortcut.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents btnDeleteKeyboardShortcut As System.Windows.Forms.Button
Friend WithEvents btnNewKeyboardShortcut As System.Windows.Forms.Button
Friend WithEvents grpModifyKeyboardShortcut As System.Windows.Forms.GroupBox
Friend WithEvents hotModifyKeyboardShortcut As SharedLibraryNG.HotkeyControl
Friend WithEvents btnResetAllKeyboardShortcuts As System.Windows.Forms.Button
Friend WithEvents btnResetKeyboardShortcuts As System.Windows.Forms.Button
Friend WithEvents lblKeyboardCommand As System.Windows.Forms.Label
Friend WithEvents lstKeyboardShortcuts As System.Windows.Forms.ListBox
Friend WithEvents lblKeyboardShortcuts As System.Windows.Forms.Label
Friend WithEvents lvKeyboardCommands As mRemoteNG.Controls.ListView
End Class
End Namespace

View File

@@ -0,0 +1,148 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="LineGroupBox.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AOrFpOvnwJ//47ya/+C3lf/dso//2a6K/9aphf/TpX//0KB7/82cdv/KmXL/yJZu/8aT
a//EkGn/xJBo/8SQaOvuy6v/6NXI/+jUxf/n0sP/5dDB/+XOvv/jzLz/48q5/+LJt//hx7X/4MWz/9/E
sf/fxLD/3sKv/97Crv/EkGj/8tCx/+rYzP/8/Pz/2rqk//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
/P/8/Pz/zKGC//z8/P/fw7D/xZJq//XUtv/s3ND/3sOv/92/q//bvaf/2bqj/9i3n//WtJz/1bGX/9Ou
lP/Rq4//0KiM/8+miP/No4X/4MWz/8eVbv/42Lv/7d7U//z8/P/8/Pz/3sKu//z8/P/bvKb//Pz8/9i2
nv/8/Pz/1bCX//z8/P/8/Pz//Pz8/+HItv/KmXL/+ty//+7g1v/jy7r/4sm4/+DGtP/fxLH/3sKt/9y/
qv/avKb/2bmi/9e2nv/Ws5r/6dbK//z8/P/jy7r/zp13//zewf/v4tj//Pz8/+TMvP/8/Pz/4cm3//z8
/P/fw7D//Pz8/9y+qf/8/Pz/2bih//z8/P/38/D/5c6+/9Giff/83sH/7+LY/+/i2P/v4tj/7uHX/+7g
1v/u39T/7d3S/+zc0f/r2s7/6tjM/+rXyv/o1cf/59PF/+fRwv/VqIP//N7B4/zewf+7ubb/s7Gu//rb
vv/42Lv/9tW3//PSs//wzq7/7cmq/+rFpP/nwJ//47ya/+C3lf/dso//2a6K4////wD///8AxMTE/by8
vLSzs7MQ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ANDQ
0PjJycn4wsLCZ////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wDZ2dln1NTU9s/Pz+/IyMjlwMDA2Le3t8Ourq6TpKSkfZubm26RkZFJh4eHBP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A//+sQf//rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEHH/6xBx/+sQcAH
rEH//6xB//+sQQ==
</value>
</data>
</root>

View File

@@ -0,0 +1,198 @@
Imports mRemoteNG.Config
Imports mRemoteNG.My
Namespace Forms.OptionsPages
Public Class KeyboardPage
Public Overrides Property PageName() As String
Get
Return Language.strOptionsTabKeyboard
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
lblKeyboardShortcuts.Text = Language.strOptionsKeyboardLabelKeyboardShortcuts
btnNewKeyboardShortcut.Text = Language.strOptionsKeyboardButtonNew
btnDeleteKeyboardShortcut.Text = Language.strOptionsKeyboardButtonDelete
btnResetKeyboardShortcuts.Text = Language.strOptionsKeyboardButtonReset
grpModifyKeyboardShortcut.Text = Language.strOptionsKeyboardGroupModifyShortcut
btnResetAllKeyboardShortcuts.Text = Language.strOptionsKeyboardButtonResetAll
End Sub
Public Overrides Sub LoadSettings()
_tabsListViewGroup = New ListViewGroup(Language.strOptionsKeyboardCommandsGroupTabs)
_previousTabListViewItem = New ListViewItem(Language.strOptionsKeyboardCommandsPreviousTab, _tabsListViewGroup)
_nextTabListViewItem = New ListViewItem(Language.strOptionsKeyboardCommandsNextTab, _tabsListViewGroup)
_keyboardShortcutMap = KeyboardShortcuts.Map.Clone()
lvKeyboardCommands.Groups.Add(_tabsListViewGroup)
lvKeyboardCommands.Items.Add(_previousTabListViewItem)
lvKeyboardCommands.Items.Add(_nextTabListViewItem)
_previousTabListViewItem.Selected = True
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
If _keyboardShortcutMap IsNot Nothing Then
KeyboardShortcuts.Map = _keyboardShortcutMap
End If
End Sub
#Region "Private Fields"
Private _keyboardShortcutMap As KeyboardShortcutMap
Private _tabsListViewGroup As ListViewGroup
Private _previousTabListViewItem As ListViewItem
Private _nextTabListViewItem As ListViewItem
Private _ignoreKeyboardShortcutTextChanged As Boolean = False
#End Region
#Region "Private Methods"
#Region "Event Handlers"
Private Sub lvKeyboardCommands_SelectedIndexChanged(sender As System.Object, e As EventArgs) Handles lvKeyboardCommands.SelectedIndexChanged
Dim isItemSelected As Boolean = (lvKeyboardCommands.SelectedItems.Count = 1)
EnableKeyboardShortcutControls(isItemSelected)
If Not isItemSelected Then Return
Dim selectedItem As ListViewItem = lvKeyboardCommands.SelectedItems(0)
lblKeyboardCommand.Text = selectedItem.Text
lstKeyboardShortcuts.Items.Clear()
lstKeyboardShortcuts.Items.AddRange(_keyboardShortcutMap.GetShortcutKeys(GetSelectedShortcutCommand()))
If lstKeyboardShortcuts.Items.Count > 0 Then lstKeyboardShortcuts.SelectedIndex = 0
End Sub
Private Sub lstKeyboardShortcuts_SelectedIndexChanged(sender As System.Object, e As EventArgs) Handles lstKeyboardShortcuts.SelectedIndexChanged
Dim isItemSelected As Boolean = (lstKeyboardShortcuts.SelectedItems.Count = 1)
btnDeleteKeyboardShortcut.Enabled = isItemSelected
grpModifyKeyboardShortcut.Enabled = isItemSelected
hotModifyKeyboardShortcut.Enabled = isItemSelected
If Not isItemSelected Then
hotModifyKeyboardShortcut.Text = String.Empty
Return
End If
Dim selectedItem As Object = lstKeyboardShortcuts.SelectedItems(0)
Dim shortcutKey As ShortcutKey = TryCast(selectedItem, ShortcutKey)
If shortcutKey Is Nothing Then Return
Dim keysValue As Keys = shortcutKey
Dim keyCode As Keys = keysValue And Keys.KeyCode
Dim modifiers As Keys = keysValue And Keys.Modifiers
_ignoreKeyboardShortcutTextChanged = True
hotModifyKeyboardShortcut.KeyCode = keyCode
hotModifyKeyboardShortcut.HotkeyModifiers = modifiers
_ignoreKeyboardShortcutTextChanged = False
End Sub
Private Sub btnNewKeyboardShortcut_Click(sender As System.Object, e As EventArgs) Handles btnNewKeyboardShortcut.Click
For Each item As Object In lstKeyboardShortcuts.Items
Dim shortcutKey As ShortcutKey = TryCast(item, ShortcutKey)
If shortcutKey Is Nothing Then Continue For
If shortcutKey = 0 Then
lstKeyboardShortcuts.SelectedItem = item
Return
End If
Next
lstKeyboardShortcuts.SelectedIndex = lstKeyboardShortcuts.Items.Add(New ShortcutKey(Keys.None))
hotModifyKeyboardShortcut.Focus()
End Sub
Private Sub btnDeleteKeyboardShortcut_Click(sender As System.Object, e As EventArgs) Handles btnDeleteKeyboardShortcut.Click
Dim selectedIndex As Integer = lstKeyboardShortcuts.SelectedIndex
Dim command As ShortcutCommand = GetSelectedShortcutCommand()
Dim key As ShortcutKey = TryCast(lstKeyboardShortcuts.SelectedItem, ShortcutKey)
If Not command = ShortcutCommand.None And key IsNot Nothing Then
_keyboardShortcutMap.Remove(GetSelectedShortcutCommand(), key)
End If
lstKeyboardShortcuts.Items.Remove(lstKeyboardShortcuts.SelectedItem)
If selectedIndex >= lstKeyboardShortcuts.Items.Count Then selectedIndex = lstKeyboardShortcuts.Items.Count - 1
lstKeyboardShortcuts.SelectedIndex = selectedIndex
End Sub
Private Sub btnResetAllKeyboardShortcuts_Click(sender As System.Object, e As EventArgs) Handles btnResetAllKeyboardShortcuts.Click
_keyboardShortcutMap = KeyboardShortcuts.DefaultMap.Clone()
lvKeyboardCommands_SelectedIndexChanged(Me, New EventArgs())
End Sub
Private Sub btnResetKeyboardShortcuts_Click(sender As System.Object, e As EventArgs) Handles btnResetKeyboardShortcuts.Click
Dim command As ShortcutCommand = GetSelectedShortcutCommand()
If command = ShortcutCommand.None Then Return
_keyboardShortcutMap.SetShortcutKeys(command, KeyboardShortcuts.DefaultMap.GetShortcutKeys(command))
lvKeyboardCommands_SelectedIndexChanged(Me, New EventArgs())
End Sub
Private Sub hotModifyKeyboardShortcut_TextChanged(sender As System.Object, e As EventArgs) Handles hotModifyKeyboardShortcut.TextChanged
If _ignoreKeyboardShortcutTextChanged Or _
lstKeyboardShortcuts.SelectedIndex < 0 Or _
lstKeyboardShortcuts.SelectedIndex >= lstKeyboardShortcuts.Items.Count Then Return
Dim keysValue As Keys = (hotModifyKeyboardShortcut.KeyCode And Keys.KeyCode) Or _
(hotModifyKeyboardShortcut.HotkeyModifiers And Keys.Modifiers)
Dim hadFocus As Boolean = hotModifyKeyboardShortcut.ContainsFocus
Dim command As ShortcutCommand = GetSelectedShortcutCommand()
Dim newShortcutKey As New ShortcutKey(keysValue)
If Not command = ShortcutCommand.None Then
Dim oldShortcutKey As ShortcutKey = TryCast(lstKeyboardShortcuts.SelectedItem, ShortcutKey)
If oldShortcutKey IsNot Nothing Then
_keyboardShortcutMap.Remove(command, oldShortcutKey)
End If
_keyboardShortcutMap.Add(command, newShortcutKey)
End If
lstKeyboardShortcuts.Items(lstKeyboardShortcuts.SelectedIndex) = newShortcutKey
If hadFocus Then
hotModifyKeyboardShortcut.Focus()
hotModifyKeyboardShortcut.Select(hotModifyKeyboardShortcut.TextLength, 0)
End If
End Sub
#End Region
Private Function GetSelectedShortcutCommand() As ShortcutCommand
If Not (lvKeyboardCommands.SelectedItems.Count = 1) Then Return ShortcutCommand.None
Dim selectedItem As ListViewItem = lvKeyboardCommands.SelectedItems(0)
If selectedItem Is _previousTabListViewItem Then
Return ShortcutCommand.PreviousTab
ElseIf selectedItem Is _nextTabListViewItem Then
Return ShortcutCommand.NextTab
End If
End Function
Private Sub EnableKeyboardShortcutControls(Optional ByVal enable As Boolean = True)
lblKeyboardCommand.Visible = enable
lblKeyboardShortcuts.Enabled = enable
lstKeyboardShortcuts.Enabled = enable
btnNewKeyboardShortcut.Enabled = enable
btnResetKeyboardShortcuts.Enabled = enable
If Not enable Then
btnDeleteKeyboardShortcut.Enabled = False
grpModifyKeyboardShortcut.Enabled = False
hotModifyKeyboardShortcut.Enabled = False
lstKeyboardShortcuts.Items.Clear()
hotModifyKeyboardShortcut.Text = String.Empty
End If
End Sub
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,32 @@
Imports System.ComponentModel
Namespace Forms.OptionsPages
Public Class OptionsPage
Inherits UserControl
#Region "Public Properties"
<Browsable(False)> _
Public Overridable Property PageName() As String
Public Overridable Property PageIcon() As Icon
#End Region
#Region "Public Methods"
Public Overridable Sub ApplyLanguage()
End Sub
Public Overridable Sub LoadSettings()
End Sub
Public Overridable Sub SaveSettings()
End Sub
Public Overridable Sub RevertSettings()
End Sub
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,191 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class SqlServerPage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(SqlServerPage))
Me.lblSQLDatabaseName = New System.Windows.Forms.Label()
Me.txtSQLDatabaseName = New System.Windows.Forms.TextBox()
Me.lblExperimental = New System.Windows.Forms.Label()
Me.chkUseSQLServer = New System.Windows.Forms.CheckBox()
Me.lblSQLUsername = New System.Windows.Forms.Label()
Me.txtSQLPassword = New System.Windows.Forms.TextBox()
Me.lblSQLInfo = New System.Windows.Forms.Label()
Me.lblSQLServer = New System.Windows.Forms.Label()
Me.txtSQLUsername = New System.Windows.Forms.TextBox()
Me.txtSQLServer = New System.Windows.Forms.TextBox()
Me.lblSQLPassword = New System.Windows.Forms.Label()
Me.SuspendLayout()
'
'lblSQLDatabaseName
'
Me.lblSQLDatabaseName.Enabled = False
Me.lblSQLDatabaseName.Location = New System.Drawing.Point(23, 132)
Me.lblSQLDatabaseName.Name = "lblSQLDatabaseName"
Me.lblSQLDatabaseName.Size = New System.Drawing.Size(111, 13)
Me.lblSQLDatabaseName.TabIndex = 16
Me.lblSQLDatabaseName.Text = "Database:"
Me.lblSQLDatabaseName.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'txtSQLDatabaseName
'
Me.txtSQLDatabaseName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtSQLDatabaseName.Enabled = False
Me.txtSQLDatabaseName.Location = New System.Drawing.Point(140, 130)
Me.txtSQLDatabaseName.Name = "txtSQLDatabaseName"
Me.txtSQLDatabaseName.Size = New System.Drawing.Size(153, 20)
Me.txtSQLDatabaseName.TabIndex = 17
'
'lblExperimental
'
Me.lblExperimental.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lblExperimental.Font = New System.Drawing.Font("Segoe UI", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.World)
Me.lblExperimental.ForeColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer))
Me.lblExperimental.Location = New System.Drawing.Point(3, 0)
Me.lblExperimental.Name = "lblExperimental"
Me.lblExperimental.Size = New System.Drawing.Size(596, 25)
Me.lblExperimental.TabIndex = 11
Me.lblExperimental.Text = "EXPERIMENTAL"
Me.lblExperimental.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'chkUseSQLServer
'
Me.chkUseSQLServer.AutoSize = True
Me.chkUseSQLServer.Location = New System.Drawing.Point(3, 76)
Me.chkUseSQLServer.Name = "chkUseSQLServer"
Me.chkUseSQLServer.Size = New System.Drawing.Size(234, 17)
Me.chkUseSQLServer.TabIndex = 13
Me.chkUseSQLServer.Text = "Use SQL Server to load && save connections"
Me.chkUseSQLServer.UseVisualStyleBackColor = True
'
'lblSQLUsername
'
Me.lblSQLUsername.Enabled = False
Me.lblSQLUsername.Location = New System.Drawing.Point(23, 158)
Me.lblSQLUsername.Name = "lblSQLUsername"
Me.lblSQLUsername.Size = New System.Drawing.Size(111, 13)
Me.lblSQLUsername.TabIndex = 18
Me.lblSQLUsername.Text = "Username:"
Me.lblSQLUsername.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'txtSQLPassword
'
Me.txtSQLPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtSQLPassword.Enabled = False
Me.txtSQLPassword.Location = New System.Drawing.Point(140, 182)
Me.txtSQLPassword.Name = "txtSQLPassword"
Me.txtSQLPassword.Size = New System.Drawing.Size(153, 20)
Me.txtSQLPassword.TabIndex = 21
Me.txtSQLPassword.UseSystemPasswordChar = True
'
'lblSQLInfo
'
Me.lblSQLInfo.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lblSQLInfo.Font = New System.Drawing.Font("Segoe UI", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.World)
Me.lblSQLInfo.ForeColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer))
Me.lblSQLInfo.Location = New System.Drawing.Point(3, 25)
Me.lblSQLInfo.Name = "lblSQLInfo"
Me.lblSQLInfo.Size = New System.Drawing.Size(596, 25)
Me.lblSQLInfo.TabIndex = 12
Me.lblSQLInfo.Text = "Please see Help - Getting started - SQL Configuration for more Info!"
Me.lblSQLInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'lblSQLServer
'
Me.lblSQLServer.Enabled = False
Me.lblSQLServer.Location = New System.Drawing.Point(23, 106)
Me.lblSQLServer.Name = "lblSQLServer"
Me.lblSQLServer.Size = New System.Drawing.Size(111, 13)
Me.lblSQLServer.TabIndex = 14
Me.lblSQLServer.Text = "SQL Server:"
Me.lblSQLServer.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'txtSQLUsername
'
Me.txtSQLUsername.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtSQLUsername.Enabled = False
Me.txtSQLUsername.Location = New System.Drawing.Point(140, 156)
Me.txtSQLUsername.Name = "txtSQLUsername"
Me.txtSQLUsername.Size = New System.Drawing.Size(153, 20)
Me.txtSQLUsername.TabIndex = 19
'
'txtSQLServer
'
Me.txtSQLServer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtSQLServer.Enabled = False
Me.txtSQLServer.Location = New System.Drawing.Point(140, 103)
Me.txtSQLServer.Name = "txtSQLServer"
Me.txtSQLServer.Size = New System.Drawing.Size(153, 20)
Me.txtSQLServer.TabIndex = 15
'
'lblSQLPassword
'
Me.lblSQLPassword.Enabled = False
Me.lblSQLPassword.Location = New System.Drawing.Point(23, 184)
Me.lblSQLPassword.Name = "lblSQLPassword"
Me.lblSQLPassword.Size = New System.Drawing.Size(111, 13)
Me.lblSQLPassword.TabIndex = 20
Me.lblSQLPassword.Text = "Password:"
Me.lblSQLPassword.TextAlign = System.Drawing.ContentAlignment.TopRight
'
'SqlServerPage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.lblSQLDatabaseName)
Me.Controls.Add(Me.txtSQLDatabaseName)
Me.Controls.Add(Me.lblExperimental)
Me.Controls.Add(Me.chkUseSQLServer)
Me.Controls.Add(Me.lblSQLUsername)
Me.Controls.Add(Me.txtSQLPassword)
Me.Controls.Add(Me.lblSQLInfo)
Me.Controls.Add(Me.lblSQLServer)
Me.Controls.Add(Me.txtSQLUsername)
Me.Controls.Add(Me.txtSQLServer)
Me.Controls.Add(Me.lblSQLPassword)
Me.Name = "SqlServerPage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents lblSQLDatabaseName As System.Windows.Forms.Label
Friend WithEvents txtSQLDatabaseName As System.Windows.Forms.TextBox
Friend WithEvents lblExperimental As System.Windows.Forms.Label
Friend WithEvents chkUseSQLServer As System.Windows.Forms.CheckBox
Friend WithEvents lblSQLUsername As System.Windows.Forms.Label
Friend WithEvents txtSQLPassword As System.Windows.Forms.TextBox
Friend WithEvents lblSQLInfo As System.Windows.Forms.Label
Friend WithEvents lblSQLServer As System.Windows.Forms.Label
Friend WithEvents txtSQLUsername As System.Windows.Forms.TextBox
Friend WithEvents txtSQLServer As System.Windows.Forms.TextBox
Friend WithEvents lblSQLPassword As System.Windows.Forms.Label
End Class
End Namespace

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///8A////AP///wD///8A////AP///wCZmZkNlZWVMZGRkS+MjIwH////AP///wD///8A////AP//
/wD///8A////AP///wD///8Ao6OjIaGhoZ2fn5/woaGh/6urq/+np6f/lZWV/42NjeeJiYmKhoaGFv//
/wD///8A////AP///wD///8Ap6enSqWlpfTOzs7/7e3t//T09P/19fX/9PT0/+/v7//i4uL/urq6/4qK
iueGhoY1////AP///wD///8A////AKmpqere3t7/8/Pz/9vb2//S0tL/29vb/9bW1v/AwMD/ycnJ/+bm
5v/ExMT/i4uL6v///wD///8A////AP///wCsrKzq8PDw/97e3v/U1NT/0tLS/9vb2//W1tb/v7+//7Cw
sP+zs7P/3t7e/5CQkOr///8A////AP///wD///8Arq6u6vLy8v/i4uL/2NjY/9XV1f/c3Nz/2NjY/8DA
wP+zs7P/t7e3/+Dg4P+Wlpbq////AP///wD///8A////ALCwsOrz8/P/5+fn/93d3f/Z2dn/4ODg/9vb
2//ExMT/uLi4/7u7u//h4eH/m5ub6v///wD///8A////AP///wCysrLq9PT0/+rq6v/h4eH/3d3d/+Pj
4//e3t7/ycnJ/729vf+/v7//4uLi/56enur///8A////AP///wD///8AtLS06vX19f/u7u7/5ubm/+Li
4v/m5ub/4eHh/83Nzf/CwsL/wsLC/+Pj4/+goKDq////AP///wD///8A////ALW1ter29vb/6+vr/97e
3v/W1tb/1dXV/9HR0f/Dw8P/vLy8/8DAwP/l5eX/o6Oj6v///wD///8A////AP///wC3t7fq9/f3/+fn
5//v7+//9vb2//v7+//6+vr/8PDw/97e3v/Dw8P/5ubm/6Wlper///8A////AP///wD///8Aubm56vj4
+P/+/v7/////////////////////////////////+/v7/+rq6v+np6fq////AP///wD///8A////ALq6
ur/h4eH//v7+//////////////////////////////////v7+//Pz8//qampof///wD///8A////AP//
/wC8vLwqu7u70dDQ0P/o6Oj/8/Pz//39/f/8/Pz/7e3t/+Dg4P/CwsL/ra2tw6ysrBv///8A////AP//
/wD///8A////ALy8vAe7u7tVurq6rri4uNa3t7f7tra2+bS0tM2zs7OpsbGxRq+vrwP///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A/D+sQeAHrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcAD
rEHgB6xB//+sQQ==
</value>
</data>
</root>

View File

@@ -0,0 +1,66 @@
Imports mRemoteNG.My
Imports mRemoteNG.App
Imports mRemoteNG.App.Info
Imports mRemoteNG.Security
Namespace Forms.OptionsPages
Public Class SqlServerPage
Public Overrides Property PageName() As String
Get
Return Language.strSQLServer.TrimEnd(":")
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
lblExperimental.Text = Language.strExperimental.ToUpper
lblSQLInfo.Text = Language.strSQLInfo
chkUseSQLServer.Text = Language.strUseSQLServer
lblSQLServer.Text = Language.strLabelHostname
lblSQLDatabaseName.Text = Language.strLabelSQLServerDatabaseName
lblSQLUsername.Text = Language.strLabelUsername
lblSQLPassword.Text = Language.strLabelPassword
End Sub
Public Overrides Sub LoadSettings()
MyBase.SaveSettings()
chkUseSQLServer.Checked = My.Settings.UseSQLServer
txtSQLServer.Text = My.Settings.SQLHost
txtSQLDatabaseName.Text = My.Settings.SQLDatabaseName
txtSQLUsername.Text = My.Settings.SQLUser
txtSQLPassword.Text = Crypt.Decrypt(My.Settings.SQLPass, General.EncryptionKey)
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
My.Settings.UseSQLServer = chkUseSQLServer.Checked
My.Settings.SQLHost = txtSQLServer.Text
My.Settings.SQLDatabaseName = txtSQLDatabaseName.Text
My.Settings.SQLUser = txtSQLUsername.Text
My.Settings.SQLPass = Crypt.Encrypt(txtSQLPassword.Text, General.EncryptionKey)
Runtime.Startup.DestroySQLUpdateHandlerAndStopTimer()
frmMain.UsingSqlServer = My.Settings.UseSQLServer
If My.Settings.UseSQLServer Then
Runtime.Startup.CreateSQLUpdateHandlerAndStartTimer()
End If
End Sub
Private Sub chkUseSQLServer_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles chkUseSQLServer.CheckedChanged
lblSQLServer.Enabled = chkUseSQLServer.Checked
lblSQLDatabaseName.Enabled = chkUseSQLServer.Checked
lblSQLUsername.Enabled = chkUseSQLServer.Checked
lblSQLPassword.Enabled = chkUseSQLServer.Checked
txtSQLServer.Enabled = chkUseSQLServer.Checked
txtSQLDatabaseName.Enabled = chkUseSQLServer.Checked
txtSQLUsername.Enabled = chkUseSQLServer.Checked
txtSQLPassword.Enabled = chkUseSQLServer.Checked
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,94 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class StartupExitPage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(StartupExitPage))
Me.chkReconnectOnStart = New System.Windows.Forms.CheckBox()
Me.chkSaveConsOnExit = New System.Windows.Forms.CheckBox()
Me.chkSingleInstance = New System.Windows.Forms.CheckBox()
Me.chkProperInstallationOfComponentsAtStartup = New System.Windows.Forms.CheckBox()
Me.SuspendLayout()
'
'chkReconnectOnStart
'
Me.chkReconnectOnStart.AutoSize = True
Me.chkReconnectOnStart.Location = New System.Drawing.Point(3, 24)
Me.chkReconnectOnStart.Name = "chkReconnectOnStart"
Me.chkReconnectOnStart.Size = New System.Drawing.Size(273, 17)
Me.chkReconnectOnStart.TabIndex = 7
Me.chkReconnectOnStart.Text = "Reconnect to previously opened sessions on startup"
Me.chkReconnectOnStart.UseVisualStyleBackColor = True
'
'chkSaveConsOnExit
'
Me.chkSaveConsOnExit.AutoSize = True
Me.chkSaveConsOnExit.Location = New System.Drawing.Point(3, 0)
Me.chkSaveConsOnExit.Name = "chkSaveConsOnExit"
Me.chkSaveConsOnExit.Size = New System.Drawing.Size(146, 17)
Me.chkSaveConsOnExit.TabIndex = 6
Me.chkSaveConsOnExit.Text = "Save connections on exit"
Me.chkSaveConsOnExit.UseVisualStyleBackColor = True
'
'chkSingleInstance
'
Me.chkSingleInstance.AutoSize = True
Me.chkSingleInstance.Location = New System.Drawing.Point(3, 48)
Me.chkSingleInstance.Name = "chkSingleInstance"
Me.chkSingleInstance.Size = New System.Drawing.Size(366, 17)
Me.chkSingleInstance.TabIndex = 8
Me.chkSingleInstance.Text = "Allow only a single instance of the application (mRemote restart required)"
Me.chkSingleInstance.UseVisualStyleBackColor = True
'
'chkProperInstallationOfComponentsAtStartup
'
Me.chkProperInstallationOfComponentsAtStartup.AutoSize = True
Me.chkProperInstallationOfComponentsAtStartup.Location = New System.Drawing.Point(3, 72)
Me.chkProperInstallationOfComponentsAtStartup.Name = "chkProperInstallationOfComponentsAtStartup"
Me.chkProperInstallationOfComponentsAtStartup.Size = New System.Drawing.Size(262, 17)
Me.chkProperInstallationOfComponentsAtStartup.TabIndex = 9
Me.chkProperInstallationOfComponentsAtStartup.Text = "Check proper installation of components at startup"
Me.chkProperInstallationOfComponentsAtStartup.UseVisualStyleBackColor = True
'
'StartupExitPage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.chkReconnectOnStart)
Me.Controls.Add(Me.chkSaveConsOnExit)
Me.Controls.Add(Me.chkSingleInstance)
Me.Controls.Add(Me.chkProperInstallationOfComponentsAtStartup)
Me.Name = "StartupExitPage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents chkReconnectOnStart As System.Windows.Forms.CheckBox
Friend WithEvents chkSaveConsOnExit As System.Windows.Forms.CheckBox
Friend WithEvents chkSingleInstance As System.Windows.Forms.CheckBox
Friend WithEvents chkProperInstallationOfComponentsAtStartup As System.Windows.Forms.CheckBox
End Class
End Namespace

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAeRUXA3seswB9IawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAALe3t/+cqJ7/EndS/zySdP8Oe1L/JGig/yFmnv8dY5v/GmGZ/xdfl/8UXJT/EVuT/2xs
bP9sbGz/AAAAAAAAAAAAeRkdAH0fokGVeP+Cvqr/UKWC/zGXav80mW//OJlz/zydeP92qtL/dKjR/xVd
lf8AAAAAAAAAAAAAAAAAeRsiAH0hpEilZrNtrJ//dLee/367rP9+u67/f7uw/4C8s/83mnv/VJXH/3er
0/8ZYJj/AAAAAAAAAAAAAAAAAH8lsTygXLODwpizXKSR/2+2m/9ospv/arKe/2yzof+Fv7b/Pp6C/1mZ
yf97rdT/HmSc/wAAAAAAAAAAAAAAAAGDLQsHhzWyRqVos3ayqP99vaf/h8G1/4bBtv+Hwbf/iMG5/0Si
iP9enMv/f7DV/yNnn/8AAAAAAAAAAAAAAAAAAAAAEYs9CBePRbJPoIr/k8m6/1+vl/9EooP/RaOH/0ek
i/9GqpL/VMLt/4G01/8oa6P/AAAAAAAAAAAAAAAAAAAAAAAAAAAflU8GNZR3/265nv9Jpon/ebHV/3Wt
1P9xq9L/X7rk/xiZaf8njlj/KnCa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFiOxP9SrIv/T6qP/361
2P96stb/d6/V/3Os0/8kkGL/WaiE/xN4U/8AeRkbAAAAAAAAAAAAAAAAAAAAAAAAAABekcn/pMzk/4e7
2/8/oXr/OZx0/zSacP8vlmr/S6OB/4TAq/9Clnn/AH0fogB5GR0AAAAAAAAAAAAAAAAAAAAAY5XN/6jP
5f+Mv93/RaWB/43FuP+Jw7T/hsGx/4S/r/93uZ//bq2g/0ilZrMAfSGkAHkbIgAAAAAAAAAAAAAAAGeY
0P+r0ef/kMLf/0ypiP+Rybv/drql/3K4of9utp7/crid/12lkv+DwpizPKBcswB/JbEAAAAAAAAAAAAA
AABrm9P/rtTo/6vT6P9ZsZD/m87A/5nNvf+Wy7v/lcq5/4C/qP93s6n/RqVosweHNbIBgy0LAAAAAAAA
AAAAAAAAbp3V/2yb0/9pmtL/SaGM/0Sfiv9BnYX/PZmA/1alkv9/uLH/UKGL/xePRbIRiz0IAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxn2OsWrOBsyiYV7MflU8GAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6NrrDGfZbMtnV8GAAAAAAAA
AAAAAAAA4/+cQYABnEGAB5xBAAecQQAHnEEAB5xBgAecQcAHnEHgA5xB4AGcQeAAnEHgAJxB4ACcQeAB
nEH/w5xB/8ecQQ==
</value>
</data>
</root>

View File

@@ -0,0 +1,38 @@
Imports mRemoteNG.My
Namespace Forms.OptionsPages
Public Class StartupExitPage
Public Overrides Property PageName() As String
Get
Return Language.strStartupExit
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
chkSaveConsOnExit.Text = Language.strSaveConsOnExit
chkReconnectOnStart.Text = Language.strReconnectAtStartup
chkSingleInstance.Text = Language.strAllowOnlySingleInstance
chkProperInstallationOfComponentsAtStartup.Text = Language.strCheckProperInstallationOfComponentsAtStartup
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
Settings.SaveConsOnExit = chkSaveConsOnExit.Checked
Settings.OpenConsFromLastSession = chkReconnectOnStart.Checked
Settings.SingleInstance = chkSingleInstance.Checked
Settings.StartupComponentsCheck = chkProperInstallationOfComponentsAtStartup.Checked
End Sub
Private Sub StartupExitPage_Load(sender As System.Object, e As EventArgs) Handles MyBase.Load
chkSaveConsOnExit.Checked = Settings.SaveConsOnExit
chkReconnectOnStart.Checked = Settings.OpenConsFromLastSession
chkSingleInstance.Checked = Settings.SingleInstance
chkProperInstallationOfComponentsAtStartup.Checked = Settings.StartupComponentsCheck
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,201 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Public Class TabsPanelsPage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(TabsPanelsPage))
Me.chkAlwaysShowPanelTabs = New System.Windows.Forms.CheckBox()
Me.chkIdentifyQuickConnectTabs = New System.Windows.Forms.CheckBox()
Me.chkUseOnlyErrorsAndInfosPanel = New System.Windows.Forms.CheckBox()
Me.chkOpenNewTabRightOfSelected = New System.Windows.Forms.CheckBox()
Me.lblSwitchToErrorsAndInfos = New System.Windows.Forms.Label()
Me.chkAlwaysShowPanelSelectionDlg = New System.Windows.Forms.CheckBox()
Me.chkMCInformation = New System.Windows.Forms.CheckBox()
Me.chkShowLogonInfoOnTabs = New System.Windows.Forms.CheckBox()
Me.chkMCErrors = New System.Windows.Forms.CheckBox()
Me.chkDoubleClickClosesTab = New System.Windows.Forms.CheckBox()
Me.chkMCWarnings = New System.Windows.Forms.CheckBox()
Me.chkShowProtocolOnTabs = New System.Windows.Forms.CheckBox()
Me.SuspendLayout()
'
'chkAlwaysShowPanelTabs
'
Me.chkAlwaysShowPanelTabs.AutoSize = True
Me.chkAlwaysShowPanelTabs.Location = New System.Drawing.Point(3, 0)
Me.chkAlwaysShowPanelTabs.Name = "chkAlwaysShowPanelTabs"
Me.chkAlwaysShowPanelTabs.Size = New System.Drawing.Size(139, 17)
Me.chkAlwaysShowPanelTabs.TabIndex = 12
Me.chkAlwaysShowPanelTabs.Text = "Always show panel tabs"
Me.chkAlwaysShowPanelTabs.UseVisualStyleBackColor = True
'
'chkIdentifyQuickConnectTabs
'
Me.chkIdentifyQuickConnectTabs.AutoSize = True
Me.chkIdentifyQuickConnectTabs.Location = New System.Drawing.Point(3, 92)
Me.chkIdentifyQuickConnectTabs.Name = "chkIdentifyQuickConnectTabs"
Me.chkIdentifyQuickConnectTabs.Size = New System.Drawing.Size(293, 17)
Me.chkIdentifyQuickConnectTabs.TabIndex = 16
Me.chkIdentifyQuickConnectTabs.Text = Global.mRemoteNG.My.Language.strIdentifyQuickConnectTabs
Me.chkIdentifyQuickConnectTabs.UseVisualStyleBackColor = True
'
'chkUseOnlyErrorsAndInfosPanel
'
Me.chkUseOnlyErrorsAndInfosPanel.AutoSize = True
Me.chkUseOnlyErrorsAndInfosPanel.Location = New System.Drawing.Point(3, 185)
Me.chkUseOnlyErrorsAndInfosPanel.Name = "chkUseOnlyErrorsAndInfosPanel"
Me.chkUseOnlyErrorsAndInfosPanel.Size = New System.Drawing.Size(278, 17)
Me.chkUseOnlyErrorsAndInfosPanel.TabIndex = 19
Me.chkUseOnlyErrorsAndInfosPanel.Text = "Use only Notifications panel (no messagebox popups)"
Me.chkUseOnlyErrorsAndInfosPanel.UseVisualStyleBackColor = True
'
'chkOpenNewTabRightOfSelected
'
Me.chkOpenNewTabRightOfSelected.AutoSize = True
Me.chkOpenNewTabRightOfSelected.Location = New System.Drawing.Point(3, 23)
Me.chkOpenNewTabRightOfSelected.Name = "chkOpenNewTabRightOfSelected"
Me.chkOpenNewTabRightOfSelected.Size = New System.Drawing.Size(280, 17)
Me.chkOpenNewTabRightOfSelected.TabIndex = 13
Me.chkOpenNewTabRightOfSelected.Text = "Open new tab to the right of the currently selected tab"
Me.chkOpenNewTabRightOfSelected.UseVisualStyleBackColor = True
'
'lblSwitchToErrorsAndInfos
'
Me.lblSwitchToErrorsAndInfos.AutoSize = True
Me.lblSwitchToErrorsAndInfos.Location = New System.Drawing.Point(3, 210)
Me.lblSwitchToErrorsAndInfos.Name = "lblSwitchToErrorsAndInfos"
Me.lblSwitchToErrorsAndInfos.Size = New System.Drawing.Size(159, 13)
Me.lblSwitchToErrorsAndInfos.TabIndex = 20
Me.lblSwitchToErrorsAndInfos.Text = "Switch to Notifications panel on:"
'
'chkAlwaysShowPanelSelectionDlg
'
Me.chkAlwaysShowPanelSelectionDlg.AutoSize = True
Me.chkAlwaysShowPanelSelectionDlg.Location = New System.Drawing.Point(3, 138)
Me.chkAlwaysShowPanelSelectionDlg.Name = "chkAlwaysShowPanelSelectionDlg"
Me.chkAlwaysShowPanelSelectionDlg.Size = New System.Drawing.Size(317, 17)
Me.chkAlwaysShowPanelSelectionDlg.TabIndex = 18
Me.chkAlwaysShowPanelSelectionDlg.Text = "Always show panel selection dialog when opening connectins"
Me.chkAlwaysShowPanelSelectionDlg.UseVisualStyleBackColor = True
'
'chkMCInformation
'
Me.chkMCInformation.AutoSize = True
Me.chkMCInformation.Enabled = False
Me.chkMCInformation.Location = New System.Drawing.Point(19, 230)
Me.chkMCInformation.Name = "chkMCInformation"
Me.chkMCInformation.Size = New System.Drawing.Size(83, 17)
Me.chkMCInformation.TabIndex = 21
Me.chkMCInformation.Text = "Informations"
Me.chkMCInformation.UseVisualStyleBackColor = True
'
'chkShowLogonInfoOnTabs
'
Me.chkShowLogonInfoOnTabs.AutoSize = True
Me.chkShowLogonInfoOnTabs.Location = New System.Drawing.Point(3, 46)
Me.chkShowLogonInfoOnTabs.Name = "chkShowLogonInfoOnTabs"
Me.chkShowLogonInfoOnTabs.Size = New System.Drawing.Size(203, 17)
Me.chkShowLogonInfoOnTabs.TabIndex = 14
Me.chkShowLogonInfoOnTabs.Text = "Show logon information on tab names"
Me.chkShowLogonInfoOnTabs.UseVisualStyleBackColor = True
'
'chkMCErrors
'
Me.chkMCErrors.AutoSize = True
Me.chkMCErrors.Enabled = False
Me.chkMCErrors.Location = New System.Drawing.Point(19, 276)
Me.chkMCErrors.Name = "chkMCErrors"
Me.chkMCErrors.Size = New System.Drawing.Size(53, 17)
Me.chkMCErrors.TabIndex = 23
Me.chkMCErrors.Text = "Errors"
Me.chkMCErrors.UseVisualStyleBackColor = True
'
'chkDoubleClickClosesTab
'
Me.chkDoubleClickClosesTab.AutoSize = True
Me.chkDoubleClickClosesTab.Location = New System.Drawing.Point(3, 115)
Me.chkDoubleClickClosesTab.Name = "chkDoubleClickClosesTab"
Me.chkDoubleClickClosesTab.Size = New System.Drawing.Size(159, 17)
Me.chkDoubleClickClosesTab.TabIndex = 17
Me.chkDoubleClickClosesTab.Text = "Double click on tab closes it"
Me.chkDoubleClickClosesTab.UseVisualStyleBackColor = True
'
'chkMCWarnings
'
Me.chkMCWarnings.AutoSize = True
Me.chkMCWarnings.Enabled = False
Me.chkMCWarnings.Location = New System.Drawing.Point(19, 253)
Me.chkMCWarnings.Name = "chkMCWarnings"
Me.chkMCWarnings.Size = New System.Drawing.Size(71, 17)
Me.chkMCWarnings.TabIndex = 22
Me.chkMCWarnings.Text = "Warnings"
Me.chkMCWarnings.UseVisualStyleBackColor = True
'
'chkShowProtocolOnTabs
'
Me.chkShowProtocolOnTabs.AutoSize = True
Me.chkShowProtocolOnTabs.Location = New System.Drawing.Point(3, 69)
Me.chkShowProtocolOnTabs.Name = "chkShowProtocolOnTabs"
Me.chkShowProtocolOnTabs.Size = New System.Drawing.Size(166, 17)
Me.chkShowProtocolOnTabs.TabIndex = 15
Me.chkShowProtocolOnTabs.Text = "Show protocols on tab names"
Me.chkShowProtocolOnTabs.UseVisualStyleBackColor = True
'
'TabsPanelsPage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.chkAlwaysShowPanelTabs)
Me.Controls.Add(Me.chkIdentifyQuickConnectTabs)
Me.Controls.Add(Me.chkUseOnlyErrorsAndInfosPanel)
Me.Controls.Add(Me.chkOpenNewTabRightOfSelected)
Me.Controls.Add(Me.lblSwitchToErrorsAndInfos)
Me.Controls.Add(Me.chkAlwaysShowPanelSelectionDlg)
Me.Controls.Add(Me.chkMCInformation)
Me.Controls.Add(Me.chkShowLogonInfoOnTabs)
Me.Controls.Add(Me.chkMCErrors)
Me.Controls.Add(Me.chkDoubleClickClosesTab)
Me.Controls.Add(Me.chkMCWarnings)
Me.Controls.Add(Me.chkShowProtocolOnTabs)
Me.Name = "TabsPanelsPage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents chkAlwaysShowPanelTabs As System.Windows.Forms.CheckBox
Friend WithEvents chkIdentifyQuickConnectTabs As System.Windows.Forms.CheckBox
Friend WithEvents chkUseOnlyErrorsAndInfosPanel As System.Windows.Forms.CheckBox
Friend WithEvents chkOpenNewTabRightOfSelected As System.Windows.Forms.CheckBox
Friend WithEvents lblSwitchToErrorsAndInfos As System.Windows.Forms.Label
Friend WithEvents chkAlwaysShowPanelSelectionDlg As System.Windows.Forms.CheckBox
Friend WithEvents chkMCInformation As System.Windows.Forms.CheckBox
Friend WithEvents chkShowLogonInfoOnTabs As System.Windows.Forms.CheckBox
Friend WithEvents chkMCErrors As System.Windows.Forms.CheckBox
Friend WithEvents chkDoubleClickClosesTab As System.Windows.Forms.CheckBox
Friend WithEvents chkMCWarnings As System.Windows.Forms.CheckBox
Friend WithEvents chkShowProtocolOnTabs As System.Windows.Forms.CheckBox
End Class
End Namespace

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+6vb3/5uzs/+bt7f/n7e3/6O7u/+nv7//p7+//6u/v/+rw
8P/r8PD/6/Hx/+zx8f/s8fH/vb+//52dnf8AAAAAnZ2d6tvi4v/Nz8//y8vL/8zMzP/Ozs7/z8/P/9DQ
0P/S0tL/09PT/9XV1f/X2Nj/5+zs/52dnfcAAAAAAAAAAJ2dnerZ4eH/y8zM/8fHx//IyMj/ysrK/8vL
y//Nzc3/zs7O/9DQ0P/R0dH/09TU/+Xr6/+dnZ33AAAAAAAAAACdnZ3q19/f/8fJyf/CwsL/xMTE/8XF
xf/IyMj/ycnJ/8rKyv/MzMz/zc3N/9DR0f/j6ur/nZ2d9wAAAAAAAAAAnZ2d6tbf3//DxcX/wMDA/8DA
wP/CwsL/w8PD/8TExP/FxcX/yMjI/8nJyf/Nzc3/4Ojo/52dnfcAAAAAAAAAAJ2dndbHzc3/2+Tk/9vk
5P/b5eX/3OXl/9zl5f/d5ub/3ebm/97n5//f6Oj/4Ojo/83T0/+dnZ3jAAAAAAAAAACdnZ1DnZ2dyJ2d
nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3dnZ2dTgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA//+cQf//nEH//5xB//+cQQAAnEEAAJxBgAGcQYABnEGAAZxBgAGcQYABnEGAAZxB//+cQf//
nEH//5xB//+cQQ==
</value>
</data>
</root>

View File

@@ -0,0 +1,73 @@
Imports mRemoteNG.My
Namespace Forms.OptionsPages
Public Class TabsPanelsPage
Public Overrides Property PageName() As String
Get
Return Language.strTabsAndPanels.Replace("&&", "&")
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
chkAlwaysShowPanelTabs.Text = Language.strAlwaysShowPanelTabs
chkOpenNewTabRightOfSelected.Text = Language.strOpenNewTabRight
chkShowLogonInfoOnTabs.Text = Language.strShowLogonInfoOnTabs
chkShowProtocolOnTabs.Text = Language.strShowProtocolOnTabs
chkIdentifyQuickConnectTabs.Text = Language.strIdentifyQuickConnectTabs
chkDoubleClickClosesTab.Text = Language.strDoubleClickTabClosesIt
chkAlwaysShowPanelSelectionDlg.Text = Language.strAlwaysShowPanelSelection
chkUseOnlyErrorsAndInfosPanel.Text = Language.strUseOnlyErrorsAndInfosPanel
lblSwitchToErrorsAndInfos.Text = Language.strSwitchToErrorsAndInfos
chkMCInformation.Text = Language.strInformations
chkMCWarnings.Text = Language.strWarnings
chkMCErrors.Text = Language.strErrors
End Sub
Public Overrides Sub LoadSettings()
MyBase.SaveSettings()
chkAlwaysShowPanelTabs.Checked = Settings.AlwaysShowPanelTabs
chkOpenNewTabRightOfSelected.Checked = Settings.OpenTabsRightOfSelected
chkShowLogonInfoOnTabs.Checked = Settings.ShowLogonInfoOnTabs
chkShowProtocolOnTabs.Checked = Settings.ShowProtocolOnTabs
chkIdentifyQuickConnectTabs.Checked = Settings.IdentifyQuickConnectTabs
chkDoubleClickClosesTab.Checked = Settings.DoubleClickOnTabClosesIt
chkAlwaysShowPanelSelectionDlg.Checked = Settings.AlwaysShowPanelSelectionDlg
chkUseOnlyErrorsAndInfosPanel.Checked = Settings.ShowNoMessageBoxes
chkMCInformation.Checked = Settings.SwitchToMCOnInformation
chkMCWarnings.Checked = Settings.SwitchToMCOnWarning
chkMCErrors.Checked = Settings.SwitchToMCOnError
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
Settings.AlwaysShowPanelTabs = chkAlwaysShowPanelTabs.Checked
frmMain.ShowHidePanelTabs()
Settings.OpenTabsRightOfSelected = chkOpenNewTabRightOfSelected.Checked
Settings.ShowLogonInfoOnTabs = chkShowLogonInfoOnTabs.Checked
Settings.ShowProtocolOnTabs = chkShowProtocolOnTabs.Checked
Settings.IdentifyQuickConnectTabs = chkIdentifyQuickConnectTabs.Checked
Settings.DoubleClickOnTabClosesIt = chkDoubleClickClosesTab.Checked
Settings.AlwaysShowPanelSelectionDlg = chkAlwaysShowPanelSelectionDlg.Checked
Settings.ShowNoMessageBoxes = chkUseOnlyErrorsAndInfosPanel.Checked
Settings.SwitchToMCOnInformation = chkMCInformation.Checked
Settings.SwitchToMCOnWarning = chkMCWarnings.Checked
Settings.SwitchToMCOnError = chkMCErrors.Checked
End Sub
Private Sub chkUseOnlyErrorsAndInfosPanel_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles chkUseOnlyErrorsAndInfosPanel.CheckedChanged
chkMCInformation.Enabled = chkUseOnlyErrorsAndInfosPanel.Checked
chkMCWarnings.Enabled = chkUseOnlyErrorsAndInfosPanel.Checked
chkMCErrors.Enabled = chkUseOnlyErrorsAndInfosPanel.Checked
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,90 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class ThemePage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(ThemePage))
Me.btnThemeDelete = New System.Windows.Forms.Button()
Me.btnThemeNew = New System.Windows.Forms.Button()
Me.cboTheme = New System.Windows.Forms.ComboBox()
Me.ThemePropertyGrid = New System.Windows.Forms.PropertyGrid()
Me.SuspendLayout()
'
'btnThemeDelete
'
Me.btnThemeDelete.Location = New System.Drawing.Point(535, 0)
Me.btnThemeDelete.Name = "btnThemeDelete"
Me.btnThemeDelete.Size = New System.Drawing.Size(75, 23)
Me.btnThemeDelete.TabIndex = 6
Me.btnThemeDelete.Text = "&Delete"
Me.btnThemeDelete.UseVisualStyleBackColor = True
'
'btnThemeNew
'
Me.btnThemeNew.Location = New System.Drawing.Point(454, 0)
Me.btnThemeNew.Name = "btnThemeNew"
Me.btnThemeNew.Size = New System.Drawing.Size(75, 23)
Me.btnThemeNew.TabIndex = 5
Me.btnThemeNew.Text = "&New"
Me.btnThemeNew.UseVisualStyleBackColor = True
'
'cboTheme
'
Me.cboTheme.FormattingEnabled = True
Me.cboTheme.Location = New System.Drawing.Point(3, 1)
Me.cboTheme.Name = "cboTheme"
Me.cboTheme.Size = New System.Drawing.Size(445, 21)
Me.cboTheme.TabIndex = 4
'
'ThemePropertyGrid
'
Me.ThemePropertyGrid.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.ThemePropertyGrid.Location = New System.Drawing.Point(3, 29)
Me.ThemePropertyGrid.Name = "ThemePropertyGrid"
Me.ThemePropertyGrid.Size = New System.Drawing.Size(607, 460)
Me.ThemePropertyGrid.TabIndex = 7
Me.ThemePropertyGrid.UseCompatibleTextRendering = True
'
'ThemePage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.btnThemeDelete)
Me.Controls.Add(Me.btnThemeNew)
Me.Controls.Add(Me.cboTheme)
Me.Controls.Add(Me.ThemePropertyGrid)
Me.Name = "ThemePage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.ResumeLayout(False)
End Sub
Friend WithEvents btnThemeDelete As System.Windows.Forms.Button
Friend WithEvents btnThemeNew As System.Windows.Forms.Button
Friend WithEvents cboTheme As System.Windows.Forms.ComboBox
Friend WithEvents ThemePropertyGrid As System.Windows.Forms.PropertyGrid
End Class
End Namespace

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGaichxkn/MZYp3PFmCakBNemDMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGyoMCRqpfyGreH/fqjc/1+Syf8wcqv/FF+ZsRNd
ly0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACxvrKttndH/mbzr/3Gg4/+Wuer/lLjq/2CT
yv8VX5n8E12XeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADV2sy0xc7D8nb/s/2mc4v9bk9//WJHf/1+U
4P+VuOr/hq3h/0mDu/8TXpiQAAAAAAAAAABFgb9CQX68hD58ubc6ebfzdqTX/6HC7f+fwO3/nb/t/3Sj
5P9akt//WJDe/3un5v+Stuj/Q3+3/xRfmVpOh8eTZJfP/3uo2f+NtOL/o8Tt/6fH7v9kl83/NHWy/1+T
yf+fwO3/eJaj/56WSP98lJH/jbPp/3ml2P8YYZzYUorL9q7N8P+wz/D/mL/s/36u5/+qyu//PXu4/wAA
AAA1drP/osPt/6iXMf/EtVr/rJcm/1uT3/+Yu+v/HGSf/1eNzt6oye3/hKft/1hq7f9qjun/rc3w/22d
0v8+fLn/Z5nO/6XF7v+Vmmn/rZcm/52XTf9mm+L/mLvq/yFnovZbkNGckrnl/2509v+BhPX/QEDw/5C7
6/+uzfD/rMzw/6rK8P+Fsun/XqnB/0Szjf9WqLb/cKHk/5e66P8laqbtX5PVM1yR0vySpPX/WVr2/1GG
9P87pvv/XKvy/36v5/97ref/eKrm/z+2gP9gyJf/O7d6/32s5/+PteP/Km6q1QAAAABgk9WHhq/h/7nX
8/8ypv7/bL///yuj//9mvvD/Os77/1q+8f9Ss6D/O7d5/0ezkP+nyO7/d6XW/y9xrpwAAAAAY5bYBmGU
1p+FruH/WrL5/yuj//9Aqfv/MNP+/2zi//8r1f//f7Do/3yt5/+pyu//pcXt/zd3tfw0dbIwAAAAAAAA
AAAAAAAAYZXXdV+T1faOtuP/udfz/13V+/8q1f//QdH7/7PS8v+x0PH/krji/2KVzP89e7iKAAAAAAAA
AAAAAAAAAAAAAAAAAABildceYJPVrnaj3P+RuOT/qMrs/6XH7P+NteL/aJrS/0mDwttFgb9OAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhlNZCXpLUkFuQ0dJYjs/PVIzMmVGJykUAAAAAAAAAAAAA
AAAAAAAA//+cQfwfnEH4B5xB+AOcQfABnEGAAJxBAACcQQEAnEEAAJxBAACcQQAAnEGAAJxBgACcQeAB
nEHwA5xB/A+cQQ==
</value>
</data>
</root>

View File

@@ -0,0 +1,100 @@
Imports System.ComponentModel
Imports mRemoteNG.My
Imports mRemoteNG.Themes
Namespace Forms.OptionsPages
Public Class ThemePage
Public Overrides Property PageName() As String
Get
Return Language.strOptionsTabTheme
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
btnThemeDelete.Text = Language.strOptionsThemeButtonDelete
btnThemeNew.Text = Language.strOptionsThemeButtonNew
End Sub
Public Overrides Sub LoadSettings()
MyBase.SaveSettings()
_themeList = New BindingList(Of ThemeInfo)(ThemeManager.LoadThemes())
cboTheme.DataSource = _themeList
cboTheme.SelectedItem = ThemeManager.ActiveTheme
cboTheme_SelectionChangeCommitted(Me, New EventArgs())
ThemePropertyGrid.PropertySort = PropertySort.Categorized
_originalTheme = ThemeManager.ActiveTheme
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
ThemeManager.SaveThemes(_themeList)
Settings.ThemeName = ThemeManager.ActiveTheme.Name
End Sub
Public Overrides Sub RevertSettings()
ThemeManager.ActiveTheme = _originalTheme
End Sub
#Region "Private Fields"
Private _themeList As BindingList(Of ThemeInfo)
Private _originalTheme As ThemeInfo
#End Region
#Region "Private Methods"
#Region "Event Handlers"
Private Sub cboTheme_DropDown(ByVal sender As Object, ByVal e As EventArgs) Handles cboTheme.DropDown
If ThemeManager.ActiveTheme Is ThemeManager.DefaultTheme Then Return
ThemeManager.ActiveTheme.Name = cboTheme.Text
End Sub
Private Sub cboTheme_SelectionChangeCommitted(ByVal sender As Object, ByVal e As EventArgs) Handles cboTheme.SelectionChangeCommitted
If cboTheme.SelectedItem Is Nothing Then cboTheme.SelectedItem = ThemeManager.DefaultTheme
If cboTheme.SelectedItem Is ThemeManager.DefaultTheme Then
cboTheme.DropDownStyle = ComboBoxStyle.DropDownList
btnThemeDelete.Enabled = False
ThemePropertyGrid.Enabled = False
Else
cboTheme.DropDownStyle = ComboBoxStyle.DropDown
btnThemeDelete.Enabled = True
ThemePropertyGrid.Enabled = True
End If
ThemeManager.ActiveTheme = cboTheme.SelectedItem
ThemePropertyGrid.SelectedObject = ThemeManager.ActiveTheme
ThemePropertyGrid.Refresh()
End Sub
Private Sub btnThemeNew_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnThemeNew.Click
Dim newTheme As ThemeInfo = ThemeManager.ActiveTheme.Clone()
newTheme.Name = Language.strUnnamedTheme
_themeList.Add(newTheme)
cboTheme.SelectedItem = newTheme
cboTheme_SelectionChangeCommitted(Me, New EventArgs())
cboTheme.Focus()
End Sub
Private Sub btnThemeDelete_Click(sender As Object, e As EventArgs) Handles btnThemeDelete.Click
Dim theme As ThemeInfo = cboTheme.SelectedItem
If theme Is Nothing Then Return
_themeList.Remove(theme)
cboTheme.SelectedItem = ThemeManager.DefaultTheme
cboTheme_SelectionChangeCommitted(Me, New EventArgs())
End Sub
#End Region
#End Region
End Class
End Namespace

View File

@@ -0,0 +1,281 @@
Namespace Forms.OptionsPages
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class UpdatesPage
Inherits OptionsPage
'UserControl overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(UpdatesPage))
Me.lblUpdatesExplanation = New System.Windows.Forms.Label()
Me.pnlUpdateCheck = New System.Windows.Forms.Panel()
Me.btnUpdateCheckNow = New System.Windows.Forms.Button()
Me.chkCheckForUpdatesOnStartup = New System.Windows.Forms.CheckBox()
Me.cboUpdateCheckFrequency = New System.Windows.Forms.ComboBox()
Me.pnlProxy = New System.Windows.Forms.Panel()
Me.pnlProxyBasic = New System.Windows.Forms.Panel()
Me.lblProxyAddress = New System.Windows.Forms.Label()
Me.txtProxyAddress = New System.Windows.Forms.TextBox()
Me.lblProxyPort = New System.Windows.Forms.Label()
Me.numProxyPort = New System.Windows.Forms.NumericUpDown()
Me.chkUseProxyForAutomaticUpdates = New System.Windows.Forms.CheckBox()
Me.chkUseProxyAuthentication = New System.Windows.Forms.CheckBox()
Me.pnlProxyAuthentication = New System.Windows.Forms.Panel()
Me.lblProxyUsername = New System.Windows.Forms.Label()
Me.txtProxyUsername = New System.Windows.Forms.TextBox()
Me.lblProxyPassword = New System.Windows.Forms.Label()
Me.txtProxyPassword = New System.Windows.Forms.TextBox()
Me.btnTestProxy = New System.Windows.Forms.Button()
Me.pnlUpdateCheck.SuspendLayout()
Me.pnlProxy.SuspendLayout()
Me.pnlProxyBasic.SuspendLayout()
CType(Me.numProxyPort, System.ComponentModel.ISupportInitialize).BeginInit()
Me.pnlProxyAuthentication.SuspendLayout()
Me.SuspendLayout()
'
'lblUpdatesExplanation
'
Me.lblUpdatesExplanation.Location = New System.Drawing.Point(3, 0)
Me.lblUpdatesExplanation.Name = "lblUpdatesExplanation"
Me.lblUpdatesExplanation.Size = New System.Drawing.Size(536, 40)
Me.lblUpdatesExplanation.TabIndex = 3
Me.lblUpdatesExplanation.Text = "mRemoteNG can periodically connect to the mRemoteNG website to check for updates " & _
"and product announcements."
'
'pnlUpdateCheck
'
Me.pnlUpdateCheck.Controls.Add(Me.btnUpdateCheckNow)
Me.pnlUpdateCheck.Controls.Add(Me.chkCheckForUpdatesOnStartup)
Me.pnlUpdateCheck.Controls.Add(Me.cboUpdateCheckFrequency)
Me.pnlUpdateCheck.Location = New System.Drawing.Point(0, 48)
Me.pnlUpdateCheck.Name = "pnlUpdateCheck"
Me.pnlUpdateCheck.Size = New System.Drawing.Size(610, 120)
Me.pnlUpdateCheck.TabIndex = 4
'
'btnUpdateCheckNow
'
Me.btnUpdateCheckNow.Location = New System.Drawing.Point(3, 80)
Me.btnUpdateCheckNow.Name = "btnUpdateCheckNow"
Me.btnUpdateCheckNow.Size = New System.Drawing.Size(120, 32)
Me.btnUpdateCheckNow.TabIndex = 2
Me.btnUpdateCheckNow.Text = "Check Now"
Me.btnUpdateCheckNow.UseVisualStyleBackColor = True
'
'chkCheckForUpdatesOnStartup
'
Me.chkCheckForUpdatesOnStartup.AutoSize = True
Me.chkCheckForUpdatesOnStartup.Location = New System.Drawing.Point(3, 8)
Me.chkCheckForUpdatesOnStartup.Name = "chkCheckForUpdatesOnStartup"
Me.chkCheckForUpdatesOnStartup.Size = New System.Drawing.Size(213, 17)
Me.chkCheckForUpdatesOnStartup.TabIndex = 0
Me.chkCheckForUpdatesOnStartup.Text = "Check for updates and announcements"
Me.chkCheckForUpdatesOnStartup.UseVisualStyleBackColor = True
'
'cboUpdateCheckFrequency
'
Me.cboUpdateCheckFrequency.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.cboUpdateCheckFrequency.FormattingEnabled = True
Me.cboUpdateCheckFrequency.Location = New System.Drawing.Point(48, 40)
Me.cboUpdateCheckFrequency.Name = "cboUpdateCheckFrequency"
Me.cboUpdateCheckFrequency.Size = New System.Drawing.Size(128, 21)
Me.cboUpdateCheckFrequency.TabIndex = 1
'
'pnlProxy
'
Me.pnlProxy.Controls.Add(Me.pnlProxyBasic)
Me.pnlProxy.Controls.Add(Me.chkUseProxyForAutomaticUpdates)
Me.pnlProxy.Controls.Add(Me.chkUseProxyAuthentication)
Me.pnlProxy.Controls.Add(Me.pnlProxyAuthentication)
Me.pnlProxy.Controls.Add(Me.btnTestProxy)
Me.pnlProxy.Location = New System.Drawing.Point(0, 200)
Me.pnlProxy.Name = "pnlProxy"
Me.pnlProxy.Size = New System.Drawing.Size(610, 224)
Me.pnlProxy.TabIndex = 5
'
'pnlProxyBasic
'
Me.pnlProxyBasic.Controls.Add(Me.lblProxyAddress)
Me.pnlProxyBasic.Controls.Add(Me.txtProxyAddress)
Me.pnlProxyBasic.Controls.Add(Me.lblProxyPort)
Me.pnlProxyBasic.Controls.Add(Me.numProxyPort)
Me.pnlProxyBasic.Enabled = False
Me.pnlProxyBasic.Location = New System.Drawing.Point(3, 32)
Me.pnlProxyBasic.Name = "pnlProxyBasic"
Me.pnlProxyBasic.Size = New System.Drawing.Size(604, 40)
Me.pnlProxyBasic.TabIndex = 1
'
'lblProxyAddress
'
Me.lblProxyAddress.Location = New System.Drawing.Point(8, 4)
Me.lblProxyAddress.Name = "lblProxyAddress"
Me.lblProxyAddress.Size = New System.Drawing.Size(96, 24)
Me.lblProxyAddress.TabIndex = 0
Me.lblProxyAddress.Text = "Address:"
Me.lblProxyAddress.TextAlign = System.Drawing.ContentAlignment.MiddleRight
'
'txtProxyAddress
'
Me.txtProxyAddress.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtProxyAddress.Location = New System.Drawing.Point(104, 8)
Me.txtProxyAddress.Name = "txtProxyAddress"
Me.txtProxyAddress.Size = New System.Drawing.Size(240, 20)
Me.txtProxyAddress.TabIndex = 1
'
'lblProxyPort
'
Me.lblProxyPort.Location = New System.Drawing.Point(350, 5)
Me.lblProxyPort.Name = "lblProxyPort"
Me.lblProxyPort.Size = New System.Drawing.Size(64, 23)
Me.lblProxyPort.TabIndex = 2
Me.lblProxyPort.Text = "Port:"
Me.lblProxyPort.TextAlign = System.Drawing.ContentAlignment.MiddleRight
'
'numProxyPort
'
Me.numProxyPort.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.numProxyPort.Location = New System.Drawing.Point(420, 8)
Me.numProxyPort.Maximum = New Decimal(New Integer() {65535, 0, 0, 0})
Me.numProxyPort.Minimum = New Decimal(New Integer() {1, 0, 0, 0})
Me.numProxyPort.Name = "numProxyPort"
Me.numProxyPort.Size = New System.Drawing.Size(64, 20)
Me.numProxyPort.TabIndex = 3
Me.numProxyPort.Value = New Decimal(New Integer() {80, 0, 0, 0})
'
'chkUseProxyForAutomaticUpdates
'
Me.chkUseProxyForAutomaticUpdates.AutoSize = True
Me.chkUseProxyForAutomaticUpdates.Location = New System.Drawing.Point(3, 8)
Me.chkUseProxyForAutomaticUpdates.Name = "chkUseProxyForAutomaticUpdates"
Me.chkUseProxyForAutomaticUpdates.Size = New System.Drawing.Size(168, 17)
Me.chkUseProxyForAutomaticUpdates.TabIndex = 0
Me.chkUseProxyForAutomaticUpdates.Text = "Use a proxy server to connect"
Me.chkUseProxyForAutomaticUpdates.UseVisualStyleBackColor = True
'
'chkUseProxyAuthentication
'
Me.chkUseProxyAuthentication.AutoSize = True
Me.chkUseProxyAuthentication.Enabled = False
Me.chkUseProxyAuthentication.Location = New System.Drawing.Point(27, 80)
Me.chkUseProxyAuthentication.Name = "chkUseProxyAuthentication"
Me.chkUseProxyAuthentication.Size = New System.Drawing.Size(216, 17)
Me.chkUseProxyAuthentication.TabIndex = 2
Me.chkUseProxyAuthentication.Text = "This proxy server requires authentication"
Me.chkUseProxyAuthentication.UseVisualStyleBackColor = True
'
'pnlProxyAuthentication
'
Me.pnlProxyAuthentication.Controls.Add(Me.lblProxyUsername)
Me.pnlProxyAuthentication.Controls.Add(Me.txtProxyUsername)
Me.pnlProxyAuthentication.Controls.Add(Me.lblProxyPassword)
Me.pnlProxyAuthentication.Controls.Add(Me.txtProxyPassword)
Me.pnlProxyAuthentication.Enabled = False
Me.pnlProxyAuthentication.Location = New System.Drawing.Point(3, 104)
Me.pnlProxyAuthentication.Name = "pnlProxyAuthentication"
Me.pnlProxyAuthentication.Size = New System.Drawing.Size(604, 72)
Me.pnlProxyAuthentication.TabIndex = 3
'
'lblProxyUsername
'
Me.lblProxyUsername.Location = New System.Drawing.Point(8, 4)
Me.lblProxyUsername.Name = "lblProxyUsername"
Me.lblProxyUsername.Size = New System.Drawing.Size(96, 24)
Me.lblProxyUsername.TabIndex = 0
Me.lblProxyUsername.Text = "Username:"
Me.lblProxyUsername.TextAlign = System.Drawing.ContentAlignment.MiddleRight
'
'txtProxyUsername
'
Me.txtProxyUsername.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtProxyUsername.Location = New System.Drawing.Point(104, 8)
Me.txtProxyUsername.Name = "txtProxyUsername"
Me.txtProxyUsername.Size = New System.Drawing.Size(240, 20)
Me.txtProxyUsername.TabIndex = 1
'
'lblProxyPassword
'
Me.lblProxyPassword.Location = New System.Drawing.Point(8, 36)
Me.lblProxyPassword.Name = "lblProxyPassword"
Me.lblProxyPassword.Size = New System.Drawing.Size(96, 24)
Me.lblProxyPassword.TabIndex = 2
Me.lblProxyPassword.Text = "Password:"
Me.lblProxyPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight
'
'txtProxyPassword
'
Me.txtProxyPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtProxyPassword.Location = New System.Drawing.Point(104, 40)
Me.txtProxyPassword.Name = "txtProxyPassword"
Me.txtProxyPassword.Size = New System.Drawing.Size(240, 20)
Me.txtProxyPassword.TabIndex = 3
Me.txtProxyPassword.UseSystemPasswordChar = True
'
'btnTestProxy
'
Me.btnTestProxy.Location = New System.Drawing.Point(3, 184)
Me.btnTestProxy.Name = "btnTestProxy"
Me.btnTestProxy.Size = New System.Drawing.Size(120, 32)
Me.btnTestProxy.TabIndex = 4
Me.btnTestProxy.Text = "Test Proxy"
Me.btnTestProxy.UseVisualStyleBackColor = True
'
'UpdatesPage
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.lblUpdatesExplanation)
Me.Controls.Add(Me.pnlUpdateCheck)
Me.Controls.Add(Me.pnlProxy)
Me.Name = "UpdatesPage"
Me.PageIcon = CType(resources.GetObject("$this.PageIcon"), System.Drawing.Icon)
Me.Size = New System.Drawing.Size(610, 489)
Me.pnlUpdateCheck.ResumeLayout(False)
Me.pnlUpdateCheck.PerformLayout()
Me.pnlProxy.ResumeLayout(False)
Me.pnlProxy.PerformLayout()
Me.pnlProxyBasic.ResumeLayout(False)
Me.pnlProxyBasic.PerformLayout()
CType(Me.numProxyPort, System.ComponentModel.ISupportInitialize).EndInit()
Me.pnlProxyAuthentication.ResumeLayout(False)
Me.pnlProxyAuthentication.PerformLayout()
Me.ResumeLayout(False)
End Sub
Friend WithEvents lblUpdatesExplanation As System.Windows.Forms.Label
Friend WithEvents pnlUpdateCheck As System.Windows.Forms.Panel
Friend WithEvents btnUpdateCheckNow As System.Windows.Forms.Button
Friend WithEvents chkCheckForUpdatesOnStartup As System.Windows.Forms.CheckBox
Friend WithEvents cboUpdateCheckFrequency As System.Windows.Forms.ComboBox
Friend WithEvents pnlProxy As System.Windows.Forms.Panel
Friend WithEvents pnlProxyBasic As System.Windows.Forms.Panel
Friend WithEvents lblProxyAddress As System.Windows.Forms.Label
Friend WithEvents txtProxyAddress As System.Windows.Forms.TextBox
Friend WithEvents lblProxyPort As System.Windows.Forms.Label
Friend WithEvents numProxyPort As System.Windows.Forms.NumericUpDown
Friend WithEvents chkUseProxyForAutomaticUpdates As System.Windows.Forms.CheckBox
Friend WithEvents chkUseProxyAuthentication As System.Windows.Forms.CheckBox
Friend WithEvents pnlProxyAuthentication As System.Windows.Forms.Panel
Friend WithEvents lblProxyUsername As System.Windows.Forms.Label
Friend WithEvents txtProxyUsername As System.Windows.Forms.TextBox
Friend WithEvents lblProxyPassword As System.Windows.Forms.Label
Friend WithEvents txtProxyPassword As System.Windows.Forms.TextBox
Friend WithEvents btnTestProxy As System.Windows.Forms.Button
End Class
End Namespace

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACjo6O3n5+f/5qamv+Wlpb/kZGR/42Njf+JiYn/hISE/4CAgP98fHz/eHh4/3R0dP9xcXH/bW1t/2pq
av9nZ2e3qKio/+np6f/T09P/0tLS/9HR0f/Q0ND/zs7O/83Nzf/Nzc3/y8vL/8vLy//Kysr/ycnJ/8jI
yP/i4uL/ampq/62trf/W1tb/urq6/7i4uP+1tbX/s7Oz/7Gxsf+wsLD/ra2t/6urq/+qqqr/qKio/6en
p/+mpqb/yMjI/25ubv+xsbH/2dnZ/729vf+6urr/uLi4/7a2tv+1tbX/s7Oz/7CwsP+vr6//ra2t/6ur
q/+pqan/qKio/8rKyv9ycnL/tra2/93d3f/BwcH/vb29/7y8vP+6urr/uLi4/7W1tf+0tLT/srKy/7Cw
sP+tra3/rKys/6ysrP/Pz8//dnZ2/7q6ur3a2tr/yMjI/8DAwP+/v7//vb29/7q6uv+4uLj/t7e3/7W1
tf+zs7P/sLCw/6+vr/+zs7P/wsLC/3t7e72+vr694+Pj/+fn5//h4eH/4ODg/+Dg4P/f39//39/f/97e
3v/d3d3/3d3d/9zc3P/b29v/4ODg/9DQ0P9/f3+9w8PDP87Ozv/s7Oz/3t7e/9jY2P/S0tL/zMzM/8jI
yP/Hx8f/yMjI/8vLy//Q0ND/3d3d/+jo6P+kpKT/hISEQgAAAADDw8O94+Pj/9vb2//i4uL/t9C4/2St
aP92qmT/cK9o/1alYv+sxaz/wsLC/9HR0f/T09P/jY2NvQAAAAAAAAAAyMjIP9HR0f/z8/P/x97K/2TJ
hf+z3KT/58d8/9y/c/92zI//T61o/7jQuP/x8fH/r6+v/5KSkkIAAAAAAAAAAAAAAADIyMi9xMTE/3bO
i/+Z5Kv/sMVd/+q1SP/hojn/pZ1A/4LFj/9Jmlb/oKCg/5ubm70AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACI46n8oumV/9bPaf/is0f/0btP/8KuQv+CvWz/Xbh4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAj+Ws/KLwn//Y7a//3sVo/7TiZf9g5zn/a9dr/2i8gPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAG7Xh9zI99T/2PbK/+fjqf/bz2z/r9xo/53qq/9OrF/gAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABbw2hFkuau+tv46f/n8tj/7eWz/9/Zpv+F1I/7QqNOUAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFvDaEdz2IrZmuKl/Jvdmvxw0n/dUbddUAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACcQQAAnEEAAJxBAACcQQAAnEEAAJxBAACcQQAAnEGAAZxBgAGcQcADnEHwD5xB8A+cQfAP
nEHwD5xB+B+cQQ==
</value>
</data>
</root>

View File

@@ -0,0 +1,192 @@
Imports System.ComponentModel
Imports mRemoteNG.My
Imports mRemoteNG.App
Imports mRemoteNG.App.Info
Imports mRemoteNG.Security
Imports mRemoteNG.Tools
Imports mRemoteNG.UI.Window
Imports PSTaskDialog
Namespace Forms.OptionsPages
Public Class UpdatesPage
#Region "Public Methods"
Public Overrides Property PageName() As String
Get
Return Language.strTabUpdates
End Get
Set(value As String)
End Set
End Property
Public Overrides Sub ApplyLanguage()
MyBase.ApplyLanguage()
#If Not PORTABLE Then
lblUpdatesExplanation.Text = Language.strUpdateCheck
#Else
lblUpdatesExplanation.Text = Language.strUpdateCheckPortableEdition
#End If
chkCheckForUpdatesOnStartup.Text = Language.strCheckForUpdatesOnStartup
btnUpdateCheckNow.Text = Language.strCheckNow
chkUseProxyForAutomaticUpdates.Text = Language.strCheckboxUpdateUseProxy
lblProxyAddress.Text = Language.strLabelAddress
lblProxyPort.Text = Language.strLabelPort
chkUseProxyAuthentication.Text = Language.strCheckboxProxyAuthentication
lblProxyUsername.Text = Language.strLabelUsername
lblProxyPassword.Text = Language.strLabelPassword
btnTestProxy.Text = Language.strButtonTestProxy
End Sub
Public Overrides Sub LoadSettings()
MyBase.SaveSettings()
chkCheckForUpdatesOnStartup.Checked = My.Settings.CheckForUpdatesOnStartup
cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked
cboUpdateCheckFrequency.Items.Clear()
Dim nDaily As Integer = cboUpdateCheckFrequency.Items.Add(Language.strUpdateFrequencyDaily)
Dim nWeekly As Integer = cboUpdateCheckFrequency.Items.Add(Language.strUpdateFrequencyWeekly)
Dim nMonthly As Integer = cboUpdateCheckFrequency.Items.Add(Language.strUpdateFrequencyMonthly)
Select Case My.Settings.CheckForUpdatesFrequencyDays
Case Is < 1
chkCheckForUpdatesOnStartup.Checked = False
cboUpdateCheckFrequency.SelectedIndex = nDaily
Case 1 ' Daily
cboUpdateCheckFrequency.SelectedIndex = nDaily
Case 7 ' Weekly
cboUpdateCheckFrequency.SelectedIndex = nWeekly
Case 31 ' Monthly
cboUpdateCheckFrequency.SelectedIndex = nMonthly
Case Else
Dim nCustom As Integer = cboUpdateCheckFrequency.Items.Add(String.Format(Language.strUpdateFrequencyCustom, My.Settings.CheckForUpdatesFrequencyDays))
cboUpdateCheckFrequency.SelectedIndex = nCustom
End Select
chkUseProxyForAutomaticUpdates.Checked = My.Settings.UpdateUseProxy
pnlProxyBasic.Enabled = My.Settings.UpdateUseProxy
txtProxyAddress.Text = My.Settings.UpdateProxyAddress
numProxyPort.Value = My.Settings.UpdateProxyPort
chkUseProxyAuthentication.Checked = My.Settings.UpdateProxyUseAuthentication
pnlProxyAuthentication.Enabled = My.Settings.UpdateProxyUseAuthentication
txtProxyUsername.Text = My.Settings.UpdateProxyAuthUser
txtProxyPassword.Text = Crypt.Decrypt(My.Settings.UpdateProxyAuthPass, General.EncryptionKey)
btnTestProxy.Enabled = My.Settings.UpdateUseProxy
#If PORTABLE Then
For Each Control As Control In Controls
If Control IsNot lblUpdatesExplanation Then
Control.Visible = False
End If
Next
#End If
End Sub
Public Overrides Sub SaveSettings()
MyBase.SaveSettings()
My.Settings.CheckForUpdatesOnStartup = chkCheckForUpdatesOnStartup.Checked
Select Case cboUpdateCheckFrequency.SelectedItem.ToString()
Case Language.strUpdateFrequencyDaily
My.Settings.CheckForUpdatesFrequencyDays = 1
Case Language.strUpdateFrequencyWeekly
My.Settings.CheckForUpdatesFrequencyDays = 7
Case Language.strUpdateFrequencyMonthly
My.Settings.CheckForUpdatesFrequencyDays = 31
End Select
My.Settings.UpdateUseProxy = chkUseProxyForAutomaticUpdates.Checked
My.Settings.UpdateProxyAddress = txtProxyAddress.Text
My.Settings.UpdateProxyPort = numProxyPort.Value
My.Settings.UpdateProxyUseAuthentication = chkUseProxyAuthentication.Checked
My.Settings.UpdateProxyAuthUser = txtProxyUsername.Text
My.Settings.UpdateProxyAuthPass = Crypt.Encrypt(txtProxyPassword.Text, General.EncryptionKey)
End Sub
#End Region
#Region "Private Fields"
Private _appUpdate As App.Update
#End Region
#Region "Private Methods"
#Region "Event Handlers"
Private Sub chkCheckForUpdatesOnStartup_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles chkCheckForUpdatesOnStartup.CheckedChanged
cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked
End Sub
Private Sub btnUpdateCheckNow_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnUpdateCheckNow.Click
Runtime.Windows.Show(Type.Update)
End Sub
Private Sub chkUseProxyForAutomaticUpdates_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles chkUseProxyForAutomaticUpdates.CheckedChanged
pnlProxyBasic.Enabled = chkUseProxyForAutomaticUpdates.Checked
btnTestProxy.Enabled = chkUseProxyForAutomaticUpdates.Checked
If chkUseProxyForAutomaticUpdates.Checked Then
chkUseProxyAuthentication.Enabled = True
If chkUseProxyAuthentication.Checked Then
pnlProxyAuthentication.Enabled = True
End If
Else
chkUseProxyAuthentication.Enabled = False
pnlProxyAuthentication.Enabled = False
End If
End Sub
Private Sub btnTestProxy_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTestProxy.Click
If _appUpdate IsNot Nothing Then
If _appUpdate.IsGetUpdateInfoRunning Then Return
End If
_appUpdate = New App.Update
_appUpdate.SetProxySettings(chkUseProxyForAutomaticUpdates.Checked, txtProxyAddress.Text, numProxyPort.Value, chkUseProxyAuthentication.Checked, txtProxyUsername.Text, txtProxyPassword.Text)
btnTestProxy.Enabled = False
btnTestProxy.Text = Language.strOptionsProxyTesting
AddHandler _appUpdate.GetUpdateInfoCompletedEvent, AddressOf GetUpdateInfoCompleted
_appUpdate.GetUpdateInfoAsync()
End Sub
Private Sub chkUseProxyAuthentication_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles chkUseProxyAuthentication.CheckedChanged
If chkUseProxyForAutomaticUpdates.Checked Then
If chkUseProxyAuthentication.Checked Then
pnlProxyAuthentication.Enabled = True
Else
pnlProxyAuthentication.Enabled = False
End If
End If
End Sub
#End Region
Private Sub GetUpdateInfoCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
If InvokeRequired Then
Dim myDelegate As New AsyncCompletedEventHandler(AddressOf GetUpdateInfoCompleted)
Invoke(myDelegate, New Object() {sender, e})
Return
End If
Try
RemoveHandler _appUpdate.GetUpdateInfoCompletedEvent, AddressOf GetUpdateInfoCompleted
btnTestProxy.Enabled = True
btnTestProxy.Text = Language.strButtonTestProxy
If e.Cancelled Then Return
If e.Error IsNot Nothing Then Throw e.Error
cTaskDialog.ShowCommandBox(Me, Application.Info.ProductName, Language.strProxyTestSucceeded, "", Language.strButtonOK, False)
Catch ex As Exception
cTaskDialog.ShowCommandBox(Me, Application.Info.ProductName, Language.strProxyTestFailed, Misc.GetExceptionMessageRecursive(ex), "", "", "", Language.strButtonOK, False, eSysIcons.Error, 0)
End Try
End Sub
#End Region
End Class
End Namespace

159
mRemoteV1/Forms/PasswordForm.Designer.vb generated Normal file
View File

@@ -0,0 +1,159 @@
Namespace Forms
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class PasswordForm
Inherits System.Windows.Forms.Form
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.lblPassword = New System.Windows.Forms.Label()
Me.lblVerify = New System.Windows.Forms.Label()
Me.btnOK = New System.Windows.Forms.Button()
Me.btnCancel = New System.Windows.Forms.Button()
Me.lblStatus = New System.Windows.Forms.Label()
Me.pbLock = New System.Windows.Forms.PictureBox()
Me.txtVerify = New mRemoteNG.Controls.TextBox()
Me.txtPassword = New mRemoteNG.Controls.TextBox()
CType(Me.pbLock, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'lblPassword
'
Me.lblPassword.AutoSize = True
Me.lblPassword.Location = New System.Drawing.Point(82, 12)
Me.lblPassword.Name = "lblPassword"
Me.lblPassword.Size = New System.Drawing.Size(56, 13)
Me.lblPassword.TabIndex = 1
Me.lblPassword.Text = "Password:"
'
'lblVerify
'
Me.lblVerify.AutoSize = True
Me.lblVerify.Location = New System.Drawing.Point(82, 51)
Me.lblVerify.Name = "lblVerify"
Me.lblVerify.Size = New System.Drawing.Size(36, 13)
Me.lblVerify.TabIndex = 3
Me.lblVerify.Text = "Verify:"
'
'btnOK
'
Me.btnOK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.btnOK.Location = New System.Drawing.Point(291, 119)
Me.btnOK.Name = "btnOK"
Me.btnOK.Size = New System.Drawing.Size(75, 23)
Me.btnOK.TabIndex = 7
Me.btnOK.Text = Global.mRemoteNG.My.Language.strButtonOK
Me.btnOK.UseVisualStyleBackColor = True
'
'btnCancel
'
Me.btnCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.btnCancel.Location = New System.Drawing.Point(210, 119)
Me.btnCancel.Name = "btnCancel"
Me.btnCancel.Size = New System.Drawing.Size(75, 23)
Me.btnCancel.TabIndex = 6
Me.btnCancel.Text = Global.mRemoteNG.My.Language.strButtonCancel
Me.btnCancel.UseVisualStyleBackColor = True
'
'lblStatus
'
Me.lblStatus.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lblStatus.ForeColor = System.Drawing.Color.Red
Me.lblStatus.Location = New System.Drawing.Point(85, 90)
Me.lblStatus.Name = "lblStatus"
Me.lblStatus.Size = New System.Drawing.Size(281, 13)
Me.lblStatus.TabIndex = 5
Me.lblStatus.Text = "Status"
Me.lblStatus.TextAlign = System.Drawing.ContentAlignment.TopRight
Me.lblStatus.Visible = False
'
'pbLock
'
Me.pbLock.Image = Global.mRemoteNG.My.Resources.Resources.Lock
Me.pbLock.Location = New System.Drawing.Point(12, 12)
Me.pbLock.Name = "pbLock"
Me.pbLock.Size = New System.Drawing.Size(64, 64)
Me.pbLock.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
Me.pbLock.TabIndex = 7
Me.pbLock.TabStop = False
'
'txtVerify
'
Me.txtVerify.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtVerify.Location = New System.Drawing.Point(85, 67)
Me.txtVerify.Name = "txtVerify"
Me.txtVerify.SelectAllOnFocus = True
Me.txtVerify.Size = New System.Drawing.Size(281, 20)
Me.txtVerify.TabIndex = 4
Me.txtVerify.UseSystemPasswordChar = True
'
'txtPassword
'
Me.txtPassword.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtPassword.Location = New System.Drawing.Point(85, 28)
Me.txtPassword.Name = "txtPassword"
Me.txtPassword.SelectAllOnFocus = True
Me.txtPassword.Size = New System.Drawing.Size(281, 20)
Me.txtPassword.TabIndex = 2
Me.txtPassword.UseSystemPasswordChar = True
'
'frmPassword
'
Me.AcceptButton = Me.btnOK
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.CancelButton = Me.btnCancel
Me.ClientSize = New System.Drawing.Size(378, 154)
Me.ControlBox = False
Me.Controls.Add(Me.pbLock)
Me.Controls.Add(Me.txtVerify)
Me.Controls.Add(Me.txtPassword)
Me.Controls.Add(Me.lblStatus)
Me.Controls.Add(Me.lblVerify)
Me.Controls.Add(Me.lblPassword)
Me.Controls.Add(Me.btnCancel)
Me.Controls.Add(Me.btnOK)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "PasswordForm"
Me.ShowIcon = False
Me.ShowInTaskbar = False
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
Me.Text = "Password"
CType(Me.pbLock, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Private WithEvents txtPassword As Controls.TextBox
Private WithEvents txtVerify As Controls.TextBox
Private WithEvents lblPassword As System.Windows.Forms.Label
Private WithEvents lblVerify As System.Windows.Forms.Label
Private WithEvents btnOK As System.Windows.Forms.Button
Private WithEvents btnCancel As System.Windows.Forms.Button
Private WithEvents lblStatus As System.Windows.Forms.Label
Private WithEvents pbLock As System.Windows.Forms.PictureBox
End Class
End Namespace

View File

@@ -0,0 +1,102 @@
Imports mRemoteNG.My
Namespace Forms
Public Class PasswordForm
#Region "Public Properties"
Public Property Verify As Boolean = True
Public ReadOnly Property Password As String
Get
If Verify Then
Return txtVerify.Text
Else
Return txtPassword.Text
End If
End Get
End Property
#End Region
#Region "Constructors"
Public Sub New(Optional ByVal passwordName As String = Nothing, Optional ByVal verify As Boolean = True)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
_passwordName = passwordName
Me.Verify = verify
End Sub
#End Region
#Region "Event Handlers"
Private Sub frmPassword_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
ApplyLanguage()
If Not Verify Then
Height = Height - (txtVerify.Top - txtPassword.Top)
lblVerify.Visible = False
txtVerify.Visible = False
End If
End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles btnCancel.Click
DialogResult = DialogResult.Cancel
End Sub
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles btnOK.Click
If Verify Then
If VerifyPassword() Then DialogResult = DialogResult.OK
Else
DialogResult = DialogResult.OK
End If
End Sub
Private Sub txtPassword_TextChanged(sender As System.Object, e As EventArgs) Handles txtPassword.TextChanged, txtVerify.TextChanged
HideStatus()
End Sub
#End Region
#Region "Private Fields"
Private ReadOnly _passwordName As String
#End Region
#Region "Private Methods"
Private Sub ApplyLanguage()
If String.IsNullOrEmpty(_passwordName) Then
Text = Language.strTitlePassword
Else
Text = String.Format(Language.strTitlePasswordWithName, _passwordName)
End If
lblPassword.Text = Language.strLabelPassword
lblVerify.Text = Language.strLabelVerify
btnCancel.Text = Language.strButtonCancel
btnOK.Text = Language.strButtonOK
End Sub
Private Function VerifyPassword() As Boolean
If txtPassword.Text.Length >= 3 Then
If txtPassword.Text = txtVerify.Text Then
Return True
Else
ShowStatus(Language.strPasswordStatusMustMatch)
Return False
End If
Else
ShowStatus(Language.strPasswordStatusTooShort)
Return False
End If
End Function
Private Sub ShowStatus(ByVal status As String)
lblStatus.Visible = True
lblStatus.Text = status
End Sub
Private Sub HideStatus()
lblStatus.Visible = False
End Sub
#End Region
End Class
End Namespace

View File

@@ -22,111 +22,111 @@ Partial Class frmMain
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Dim DockPanelSkin1 As WeifenLuo.WinFormsUI.Docking.DockPanelSkin = New WeifenLuo.WinFormsUI.Docking.DockPanelSkin
Dim AutoHideStripSkin1 As WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin = New WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin
Dim DockPanelGradient1 As WeifenLuo.WinFormsUI.Docking.DockPanelGradient = New WeifenLuo.WinFormsUI.Docking.DockPanelGradient
Dim TabGradient1 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient
Dim DockPaneStripSkin1 As WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin = New WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin
Dim DockPaneStripGradient1 As WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient = New WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient
Dim TabGradient2 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient
Dim DockPanelGradient2 As WeifenLuo.WinFormsUI.Docking.DockPanelGradient = New WeifenLuo.WinFormsUI.Docking.DockPanelGradient
Dim TabGradient3 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient
Dim DockPaneStripToolWindowGradient1 As WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient = New WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient
Dim TabGradient4 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient
Dim TabGradient5 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient
Dim DockPanelGradient3 As WeifenLuo.WinFormsUI.Docking.DockPanelGradient = New WeifenLuo.WinFormsUI.Docking.DockPanelGradient
Dim TabGradient6 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient
Dim TabGradient7 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient
Me.components = New System.ComponentModel.Container()
Dim DockPanelSkin2 As WeifenLuo.WinFormsUI.Docking.DockPanelSkin = New WeifenLuo.WinFormsUI.Docking.DockPanelSkin()
Dim AutoHideStripSkin2 As WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin = New WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin()
Dim DockPanelGradient4 As WeifenLuo.WinFormsUI.Docking.DockPanelGradient = New WeifenLuo.WinFormsUI.Docking.DockPanelGradient()
Dim TabGradient8 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient()
Dim DockPaneStripSkin2 As WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin = New WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin()
Dim DockPaneStripGradient2 As WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient = New WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient()
Dim TabGradient9 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient()
Dim DockPanelGradient5 As WeifenLuo.WinFormsUI.Docking.DockPanelGradient = New WeifenLuo.WinFormsUI.Docking.DockPanelGradient()
Dim TabGradient10 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient()
Dim DockPaneStripToolWindowGradient2 As WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient = New WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient()
Dim TabGradient11 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient()
Dim TabGradient12 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient()
Dim DockPanelGradient6 As WeifenLuo.WinFormsUI.Docking.DockPanelGradient = New WeifenLuo.WinFormsUI.Docking.DockPanelGradient()
Dim TabGradient13 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient()
Dim TabGradient14 As WeifenLuo.WinFormsUI.Docking.TabGradient = New WeifenLuo.WinFormsUI.Docking.TabGradient()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain))
Me.pnlDock = New WeifenLuo.WinFormsUI.Docking.DockPanel
Me.msMain = New System.Windows.Forms.MenuStrip
Me.mMenFile = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileNewConnection = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileNewFolder = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileSep1 = New System.Windows.Forms.ToolStripSeparator
Me.mMenFileNew = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileLoad = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileSave = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileSaveAs = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileSep2 = New System.Windows.Forms.ToolStripSeparator
Me.mMenFileImportExport = New System.Windows.Forms.ToolStripMenuItem
Me.ImportFromXMLFileToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
Me.ImportFromRDPFileToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
Me.ImportFromActiveDirectoryToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
Me.ImportFromPortScanToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
Me.ToolStripSeparator6 = New System.Windows.Forms.ToolStripSeparator
Me.ExportToXMLFileToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileSep3 = New System.Windows.Forms.ToolStripSeparator
Me.mMenFileDelete = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileRename = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileDuplicate = New System.Windows.Forms.ToolStripMenuItem
Me.mMenFileSep4 = New System.Windows.Forms.ToolStripSeparator
Me.mMenFileExit = New System.Windows.Forms.ToolStripMenuItem
Me.mMenView = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewAddConnectionPanel = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewConnectionPanels = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewSep1 = New System.Windows.Forms.ToolStripSeparator
Me.mMenViewConnections = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewConfig = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewSessions = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewErrorsAndInfos = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewScreenshotManager = New System.Windows.Forms.ToolStripMenuItem
Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator
Me.mMenViewJumpTo = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewJumpToConnectionsConfig = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewJumpToSessionsScreenshots = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewJumpToErrorsInfos = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewResetLayout = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewSep2 = New System.Windows.Forms.ToolStripSeparator
Me.mMenViewQuickConnectToolbar = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewExtAppsToolbar = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewSep3 = New System.Windows.Forms.ToolStripSeparator
Me.mMenViewFullscreen = New System.Windows.Forms.ToolStripMenuItem
Me.mMenTools = New System.Windows.Forms.ToolStripMenuItem
Me.mMenToolsSSHTransfer = New System.Windows.Forms.ToolStripMenuItem
Me.mMenToolsUVNCSC = New System.Windows.Forms.ToolStripMenuItem
Me.mMenToolsExternalApps = New System.Windows.Forms.ToolStripMenuItem
Me.mMenToolsPortScan = New System.Windows.Forms.ToolStripMenuItem
Me.mMenToolsSep1 = New System.Windows.Forms.ToolStripSeparator
Me.mMenToolsComponentsCheck = New System.Windows.Forms.ToolStripMenuItem
Me.mMenToolsOptions = New System.Windows.Forms.ToolStripMenuItem
Me.mMenInfo = New System.Windows.Forms.ToolStripMenuItem
Me.mMenInfoHelp = New System.Windows.Forms.ToolStripMenuItem
Me.mMenInfoSep1 = New System.Windows.Forms.ToolStripSeparator
Me.mMenInfoWebsite = New System.Windows.Forms.ToolStripMenuItem
Me.mMenInfoDonate = New System.Windows.Forms.ToolStripMenuItem
Me.mMenInfoForum = New System.Windows.Forms.ToolStripMenuItem
Me.mMenInfoBugReport = New System.Windows.Forms.ToolStripMenuItem
Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator
Me.mMenInfoAnnouncements = New System.Windows.Forms.ToolStripMenuItem
Me.mMenToolsUpdate = New System.Windows.Forms.ToolStripMenuItem
Me.mMenInfoSep2 = New System.Windows.Forms.ToolStripSeparator
Me.mMenInfoAbout = New System.Windows.Forms.ToolStripMenuItem
Me.mMenSep3 = New System.Windows.Forms.ToolStripSeparator
Me.lblQuickConnect = New System.Windows.Forms.ToolStripLabel
Me.cmbQuickConnect = New System.Windows.Forms.ToolStripComboBox
Me.tsContainer = New System.Windows.Forms.ToolStripContainer
Me.tsExternalTools = New System.Windows.Forms.ToolStrip
Me.pnlDock = New WeifenLuo.WinFormsUI.Docking.DockPanel()
Me.msMain = New System.Windows.Forms.MenuStrip()
Me.mMenFile = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileNewConnection = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileNewFolder = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileSep1 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenFileNew = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileLoad = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileSave = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileSaveAs = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileSep2 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenFileImport = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileImportFromFile = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileImportFromActiveDirectory = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileImportFromPortScan = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileExport = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileSep3 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenFileDelete = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileRename = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileDuplicate = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenFileSep4 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenFileExit = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenView = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewAddConnectionPanel = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewConnectionPanels = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewSep1 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenViewConnections = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewConfig = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewSessions = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewErrorsAndInfos = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewScreenshotManager = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenViewJumpTo = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewJumpToConnectionsConfig = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewJumpToSessionsScreenshots = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewJumpToErrorsInfos = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewResetLayout = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewSep2 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenViewQuickConnectToolbar = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewExtAppsToolbar = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewSep3 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenViewFullscreen = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenTools = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenToolsSSHTransfer = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenToolsUVNCSC = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenToolsExternalApps = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenToolsPortScan = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenToolsSep1 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenToolsComponentsCheck = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenToolsOptions = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenInfo = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenInfoHelp = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenInfoSep1 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenInfoWebsite = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenInfoDonate = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenInfoForum = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenInfoBugReport = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenInfoAnnouncements = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenToolsUpdate = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenInfoSep2 = New System.Windows.Forms.ToolStripSeparator()
Me.mMenInfoAbout = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenSep3 = New System.Windows.Forms.ToolStripSeparator()
Me.lblQuickConnect = New System.Windows.Forms.ToolStripLabel()
Me.cmbQuickConnect = New mRemoteNG.Controls.QuickConnectComboBox()
Me.tsContainer = New System.Windows.Forms.ToolStripContainer()
Me.tsQuickConnect = New System.Windows.Forms.ToolStrip()
Me.btnQuickConnect = New mRemoteNG.Controls.ToolStripSplitButton()
Me.mnuQuickConnectProtocol = New System.Windows.Forms.ContextMenuStrip(Me.components)
Me.btnConnections = New System.Windows.Forms.ToolStripDropDownButton()
Me.mnuConnections = New System.Windows.Forms.ContextMenuStrip(Me.components)
Me.tsExternalTools = New System.Windows.Forms.ToolStrip()
Me.cMenExtAppsToolbar = New System.Windows.Forms.ContextMenuStrip(Me.components)
Me.cMenToolbarShowText = New System.Windows.Forms.ToolStripMenuItem
Me.tsQuickConnect = New System.Windows.Forms.ToolStrip
Me.btnQuickyPlay = New System.Windows.Forms.ToolStripSplitButton
Me.mMenQuickyCon = New System.Windows.Forms.ToolStripMenuItem
Me.ToolStrip1 = New System.Windows.Forms.ToolStrip
Me.ToolStripButton1 = New System.Windows.Forms.ToolStripButton
Me.ToolStripButton2 = New System.Windows.Forms.ToolStripButton
Me.ToolStripButton3 = New System.Windows.Forms.ToolStripButton
Me.ToolStripSplitButton1 = New System.Windows.Forms.ToolStripDropDownButton
Me.ToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem
Me.ToolStripMenuItem2 = New System.Windows.Forms.ToolStripMenuItem
Me.cMenToolbarShowText = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStrip1 = New System.Windows.Forms.ToolStrip()
Me.ToolStripButton1 = New System.Windows.Forms.ToolStripButton()
Me.ToolStripButton2 = New System.Windows.Forms.ToolStripButton()
Me.ToolStripButton3 = New System.Windows.Forms.ToolStripButton()
Me.ToolStripSplitButton1 = New System.Windows.Forms.ToolStripDropDownButton()
Me.ToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStripMenuItem2 = New System.Windows.Forms.ToolStripMenuItem()
Me.tmrAutoSave = New System.Windows.Forms.Timer(Me.components)
Me.msMain.SuspendLayout()
Me.tsContainer.ContentPanel.SuspendLayout()
Me.tsContainer.TopToolStripPanel.SuspendLayout()
Me.tsContainer.SuspendLayout()
Me.cMenExtAppsToolbar.SuspendLayout()
Me.tsQuickConnect.SuspendLayout()
Me.cMenExtAppsToolbar.SuspendLayout()
Me.ToolStrip1.SuspendLayout()
Me.SuspendLayout()
'
@@ -135,56 +135,58 @@ Partial Class frmMain
Me.pnlDock.ActiveAutoHideContent = Nothing
Me.pnlDock.Dock = System.Windows.Forms.DockStyle.Fill
Me.pnlDock.DockBackColor = System.Drawing.SystemColors.Control
Me.pnlDock.DockLeftPortion = 230
Me.pnlDock.DockRightPortion = 230
Me.pnlDock.DockLeftPortion = 230.0R
Me.pnlDock.DockRightPortion = 230.0R
Me.pnlDock.DocumentStyle = WeifenLuo.WinFormsUI.Docking.DocumentStyle.DockingSdi
Me.pnlDock.Location = New System.Drawing.Point(0, 0)
Me.pnlDock.Name = "pnlDock"
Me.pnlDock.Size = New System.Drawing.Size(842, 424)
DockPanelGradient1.EndColor = System.Drawing.SystemColors.ControlLight
DockPanelGradient1.StartColor = System.Drawing.SystemColors.ControlLight
AutoHideStripSkin1.DockStripGradient = DockPanelGradient1
TabGradient1.EndColor = System.Drawing.SystemColors.Control
TabGradient1.StartColor = System.Drawing.SystemColors.Control
TabGradient1.TextColor = System.Drawing.SystemColors.ControlDarkDark
AutoHideStripSkin1.TabGradient = TabGradient1
DockPanelSkin1.AutoHideStripSkin = AutoHideStripSkin1
TabGradient2.EndColor = System.Drawing.SystemColors.ControlLightLight
TabGradient2.StartColor = System.Drawing.SystemColors.ControlLightLight
TabGradient2.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripGradient1.ActiveTabGradient = TabGradient2
DockPanelGradient2.EndColor = System.Drawing.SystemColors.Control
DockPanelGradient2.StartColor = System.Drawing.SystemColors.Control
DockPaneStripGradient1.DockStripGradient = DockPanelGradient2
TabGradient3.EndColor = System.Drawing.SystemColors.ControlLight
TabGradient3.StartColor = System.Drawing.SystemColors.ControlLight
TabGradient3.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripGradient1.InactiveTabGradient = TabGradient3
DockPaneStripSkin1.DocumentGradient = DockPaneStripGradient1
TabGradient4.EndColor = System.Drawing.SystemColors.ActiveCaption
TabGradient4.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical
TabGradient4.StartColor = System.Drawing.SystemColors.GradientActiveCaption
TabGradient4.TextColor = System.Drawing.SystemColors.ActiveCaptionText
DockPaneStripToolWindowGradient1.ActiveCaptionGradient = TabGradient4
TabGradient5.EndColor = System.Drawing.SystemColors.Control
TabGradient5.StartColor = System.Drawing.SystemColors.Control
TabGradient5.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripToolWindowGradient1.ActiveTabGradient = TabGradient5
DockPanelGradient3.EndColor = System.Drawing.SystemColors.ControlLight
DockPanelGradient3.StartColor = System.Drawing.SystemColors.ControlLight
DockPaneStripToolWindowGradient1.DockStripGradient = DockPanelGradient3
TabGradient6.EndColor = System.Drawing.SystemColors.GradientInactiveCaption
TabGradient6.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical
TabGradient6.StartColor = System.Drawing.SystemColors.GradientInactiveCaption
TabGradient6.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripToolWindowGradient1.InactiveCaptionGradient = TabGradient6
TabGradient7.EndColor = System.Drawing.Color.Transparent
TabGradient7.StartColor = System.Drawing.Color.Transparent
TabGradient7.TextColor = System.Drawing.SystemColors.ControlDarkDark
DockPaneStripToolWindowGradient1.InactiveTabGradient = TabGradient7
DockPaneStripSkin1.ToolWindowGradient = DockPaneStripToolWindowGradient1
DockPanelSkin1.DockPaneStripSkin = DockPaneStripSkin1
Me.pnlDock.Skin = DockPanelSkin1
Me.pnlDock.Size = New System.Drawing.Size(842, 449)
DockPanelGradient4.EndColor = System.Drawing.SystemColors.ControlLight
DockPanelGradient4.StartColor = System.Drawing.SystemColors.ControlLight
AutoHideStripSkin2.DockStripGradient = DockPanelGradient4
TabGradient8.EndColor = System.Drawing.SystemColors.Control
TabGradient8.StartColor = System.Drawing.SystemColors.Control
TabGradient8.TextColor = System.Drawing.SystemColors.ControlDarkDark
AutoHideStripSkin2.TabGradient = TabGradient8
AutoHideStripSkin2.TextFont = New System.Drawing.Font("Segoe UI", 9.0!)
DockPanelSkin2.AutoHideStripSkin = AutoHideStripSkin2
TabGradient9.EndColor = System.Drawing.SystemColors.ControlLightLight
TabGradient9.StartColor = System.Drawing.SystemColors.ControlLightLight
TabGradient9.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripGradient2.ActiveTabGradient = TabGradient9
DockPanelGradient5.EndColor = System.Drawing.SystemColors.Control
DockPanelGradient5.StartColor = System.Drawing.SystemColors.Control
DockPaneStripGradient2.DockStripGradient = DockPanelGradient5
TabGradient10.EndColor = System.Drawing.SystemColors.ControlLight
TabGradient10.StartColor = System.Drawing.SystemColors.ControlLight
TabGradient10.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripGradient2.InactiveTabGradient = TabGradient10
DockPaneStripSkin2.DocumentGradient = DockPaneStripGradient2
DockPaneStripSkin2.TextFont = New System.Drawing.Font("Segoe UI", 9.0!)
TabGradient11.EndColor = System.Drawing.SystemColors.ActiveCaption
TabGradient11.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical
TabGradient11.StartColor = System.Drawing.SystemColors.GradientActiveCaption
TabGradient11.TextColor = System.Drawing.SystemColors.ActiveCaptionText
DockPaneStripToolWindowGradient2.ActiveCaptionGradient = TabGradient11
TabGradient12.EndColor = System.Drawing.SystemColors.Control
TabGradient12.StartColor = System.Drawing.SystemColors.Control
TabGradient12.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripToolWindowGradient2.ActiveTabGradient = TabGradient12
DockPanelGradient6.EndColor = System.Drawing.SystemColors.ControlLight
DockPanelGradient6.StartColor = System.Drawing.SystemColors.ControlLight
DockPaneStripToolWindowGradient2.DockStripGradient = DockPanelGradient6
TabGradient13.EndColor = System.Drawing.SystemColors.GradientInactiveCaption
TabGradient13.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical
TabGradient13.StartColor = System.Drawing.SystemColors.GradientInactiveCaption
TabGradient13.TextColor = System.Drawing.SystemColors.ControlText
DockPaneStripToolWindowGradient2.InactiveCaptionGradient = TabGradient13
TabGradient14.EndColor = System.Drawing.Color.Transparent
TabGradient14.StartColor = System.Drawing.Color.Transparent
TabGradient14.TextColor = System.Drawing.SystemColors.ControlDarkDark
DockPaneStripToolWindowGradient2.InactiveTabGradient = TabGradient14
DockPaneStripSkin2.ToolWindowGradient = DockPaneStripToolWindowGradient2
DockPanelSkin2.DockPaneStripSkin = DockPaneStripSkin2
Me.pnlDock.Skin = DockPanelSkin2
Me.pnlDock.TabIndex = 13
'
'msMain
@@ -203,7 +205,7 @@ Partial Class frmMain
'
'mMenFile
'
Me.mMenFile.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mMenFileNewConnection, Me.mMenFileNewFolder, Me.mMenFileSep1, Me.mMenFileNew, Me.mMenFileLoad, Me.mMenFileSave, Me.mMenFileSaveAs, Me.mMenFileSep2, Me.mMenFileImportExport, Me.mMenFileSep3, Me.mMenFileDelete, Me.mMenFileRename, Me.mMenFileDuplicate, Me.mMenFileSep4, Me.mMenFileExit})
Me.mMenFile.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mMenFileNewConnection, Me.mMenFileNewFolder, Me.mMenFileSep1, Me.mMenFileNew, Me.mMenFileLoad, Me.mMenFileSave, Me.mMenFileSaveAs, Me.mMenFileSep2, Me.mMenFileDelete, Me.mMenFileRename, Me.mMenFileDuplicate, Me.mMenFileSep3, Me.mMenFileImport, Me.mMenFileExport, Me.mMenFileSep4, Me.mMenFileExit})
Me.mMenFile.Name = "mMenFile"
Me.mMenFile.Size = New System.Drawing.Size(37, 20)
Me.mMenFile.Text = "&File"
@@ -212,29 +214,29 @@ Partial Class frmMain
'
Me.mMenFileNewConnection.Image = Global.mRemoteNG.My.Resources.Resources.Connection_Add
Me.mMenFileNewConnection.Name = "mMenFileNewConnection"
Me.mMenFileNewConnection.ShortcutKeys = CType((System.Windows.Forms.Keys.Shift Or System.Windows.Forms.Keys.F4), System.Windows.Forms.Keys)
Me.mMenFileNewConnection.Size = New System.Drawing.Size(334, 22)
Me.mMenFileNewConnection.ShortcutKeys = CType((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.N), System.Windows.Forms.Keys)
Me.mMenFileNewConnection.Size = New System.Drawing.Size(281, 22)
Me.mMenFileNewConnection.Text = "New Connection"
'
'mMenFileNewFolder
'
Me.mMenFileNewFolder.Image = Global.mRemoteNG.My.Resources.Resources.Folder_Add
Me.mMenFileNewFolder.Name = "mMenFileNewFolder"
Me.mMenFileNewFolder.ShortcutKeys = System.Windows.Forms.Keys.F7
Me.mMenFileNewFolder.Size = New System.Drawing.Size(334, 22)
Me.mMenFileNewFolder.ShortcutKeys = CType(((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.Shift) _
Or System.Windows.Forms.Keys.N), System.Windows.Forms.Keys)
Me.mMenFileNewFolder.Size = New System.Drawing.Size(281, 22)
Me.mMenFileNewFolder.Text = "New Folder"
'
'mMenFileSep1
'
Me.mMenFileSep1.Name = "mMenFileSep1"
Me.mMenFileSep1.Size = New System.Drawing.Size(331, 6)
Me.mMenFileSep1.Size = New System.Drawing.Size(278, 6)
'
'mMenFileNew
'
Me.mMenFileNew.Image = Global.mRemoteNG.My.Resources.Resources.Connections_New
Me.mMenFileNew.Name = "mMenFileNew"
Me.mMenFileNew.ShortcutKeys = CType((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.N), System.Windows.Forms.Keys)
Me.mMenFileNew.Size = New System.Drawing.Size(334, 22)
Me.mMenFileNew.Size = New System.Drawing.Size(281, 22)
Me.mMenFileNew.Text = "New Connection File"
'
'mMenFileLoad
@@ -242,7 +244,7 @@ Partial Class frmMain
Me.mMenFileLoad.Image = Global.mRemoteNG.My.Resources.Resources.Connections_Load
Me.mMenFileLoad.Name = "mMenFileLoad"
Me.mMenFileLoad.ShortcutKeys = CType((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.O), System.Windows.Forms.Keys)
Me.mMenFileLoad.Size = New System.Drawing.Size(334, 22)
Me.mMenFileLoad.Size = New System.Drawing.Size(281, 22)
Me.mMenFileLoad.Text = "Open Connection File..."
'
'mMenFileSave
@@ -250,7 +252,7 @@ Partial Class frmMain
Me.mMenFileSave.Image = Global.mRemoteNG.My.Resources.Resources.Connections_Save
Me.mMenFileSave.Name = "mMenFileSave"
Me.mMenFileSave.ShortcutKeys = CType((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.S), System.Windows.Forms.Keys)
Me.mMenFileSave.Size = New System.Drawing.Size(334, 22)
Me.mMenFileSave.Size = New System.Drawing.Size(281, 22)
Me.mMenFileSave.Text = "Save Connection File"
'
'mMenFileSaveAs
@@ -258,96 +260,83 @@ Partial Class frmMain
Me.mMenFileSaveAs.Image = Global.mRemoteNG.My.Resources.Resources.Connections_SaveAs
Me.mMenFileSaveAs.Name = "mMenFileSaveAs"
Me.mMenFileSaveAs.ShortcutKeys = CType(((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.Shift) _
Or System.Windows.Forms.Keys.S), System.Windows.Forms.Keys)
Me.mMenFileSaveAs.Size = New System.Drawing.Size(334, 22)
Or System.Windows.Forms.Keys.S), System.Windows.Forms.Keys)
Me.mMenFileSaveAs.Size = New System.Drawing.Size(281, 22)
Me.mMenFileSaveAs.Text = "Save Connection File As..."
'
'mMenFileSep2
'
Me.mMenFileSep2.Name = "mMenFileSep2"
Me.mMenFileSep2.Size = New System.Drawing.Size(331, 6)
Me.mMenFileSep2.Size = New System.Drawing.Size(278, 6)
'
'mMenFileImportExport
'mMenFileImport
'
Me.mMenFileImportExport.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ImportFromXMLFileToolStripMenuItem, Me.ImportFromRDPFileToolStripMenuItem, Me.ImportFromActiveDirectoryToolStripMenuItem, Me.ImportFromPortScanToolStripMenuItem, Me.ToolStripSeparator6, Me.ExportToXMLFileToolStripMenuItem})
Me.mMenFileImportExport.Name = "mMenFileImportExport"
Me.mMenFileImportExport.Size = New System.Drawing.Size(334, 22)
Me.mMenFileImportExport.Text = "Import/Export Folder"
Me.mMenFileImportExport.Visible = False
Me.mMenFileImport.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mMenFileImportFromFile, Me.mMenFileImportFromActiveDirectory, Me.mMenFileImportFromPortScan})
Me.mMenFileImport.Name = "mMenFileImport"
Me.mMenFileImport.Size = New System.Drawing.Size(281, 22)
Me.mMenFileImport.Text = "&Import"
'
'ImportFromXMLFileToolStripMenuItem
'mMenFileImportFromFile
'
Me.ImportFromXMLFileToolStripMenuItem.Name = "ImportFromXMLFileToolStripMenuItem"
Me.ImportFromXMLFileToolStripMenuItem.Size = New System.Drawing.Size(235, 22)
Me.ImportFromXMLFileToolStripMenuItem.Text = "Import from XML File..."
Me.mMenFileImportFromFile.Name = "mMenFileImportFromFile"
Me.mMenFileImportFromFile.Size = New System.Drawing.Size(235, 22)
Me.mMenFileImportFromFile.Text = "Import from &File..."
'
'ImportFromRDPFileToolStripMenuItem
'mMenFileImportFromActiveDirectory
'
Me.ImportFromRDPFileToolStripMenuItem.Name = "ImportFromRDPFileToolStripMenuItem"
Me.ImportFromRDPFileToolStripMenuItem.Size = New System.Drawing.Size(235, 22)
Me.ImportFromRDPFileToolStripMenuItem.Text = "Import from RDP File..."
Me.mMenFileImportFromActiveDirectory.Name = "mMenFileImportFromActiveDirectory"
Me.mMenFileImportFromActiveDirectory.Size = New System.Drawing.Size(235, 22)
Me.mMenFileImportFromActiveDirectory.Text = "Import from &Active Directory..."
'
'ImportFromActiveDirectoryToolStripMenuItem
'mMenFileImportFromPortScan
'
Me.ImportFromActiveDirectoryToolStripMenuItem.Name = "ImportFromActiveDirectoryToolStripMenuItem"
Me.ImportFromActiveDirectoryToolStripMenuItem.Size = New System.Drawing.Size(235, 22)
Me.ImportFromActiveDirectoryToolStripMenuItem.Text = "Import from Active Directory..."
Me.mMenFileImportFromPortScan.Name = "mMenFileImportFromPortScan"
Me.mMenFileImportFromPortScan.Size = New System.Drawing.Size(235, 22)
Me.mMenFileImportFromPortScan.Text = "Import from &Port Scan..."
'
'ImportFromPortScanToolStripMenuItem
'mMenFileExport
'
Me.ImportFromPortScanToolStripMenuItem.Name = "ImportFromPortScanToolStripMenuItem"
Me.ImportFromPortScanToolStripMenuItem.Size = New System.Drawing.Size(235, 22)
Me.ImportFromPortScanToolStripMenuItem.Text = "Import from Port Scan..."
'
'ToolStripSeparator6
'
Me.ToolStripSeparator6.Name = "ToolStripSeparator6"
Me.ToolStripSeparator6.Size = New System.Drawing.Size(232, 6)
'
'ExportToXMLFileToolStripMenuItem
'
Me.ExportToXMLFileToolStripMenuItem.Name = "ExportToXMLFileToolStripMenuItem"
Me.ExportToXMLFileToolStripMenuItem.Size = New System.Drawing.Size(235, 22)
Me.ExportToXMLFileToolStripMenuItem.Text = "Export to XML File..."
Me.mMenFileExport.Name = "mMenFileExport"
Me.mMenFileExport.Size = New System.Drawing.Size(281, 22)
Me.mMenFileExport.Text = "&Export to File..."
'
'mMenFileSep3
'
Me.mMenFileSep3.Name = "mMenFileSep3"
Me.mMenFileSep3.Size = New System.Drawing.Size(331, 6)
Me.mMenFileSep3.Visible = False
Me.mMenFileSep3.Size = New System.Drawing.Size(278, 6)
'
'mMenFileDelete
'
Me.mMenFileDelete.Image = Global.mRemoteNG.My.Resources.Resources.Delete
Me.mMenFileDelete.Name = "mMenFileDelete"
Me.mMenFileDelete.Size = New System.Drawing.Size(334, 22)
Me.mMenFileDelete.Size = New System.Drawing.Size(281, 22)
Me.mMenFileDelete.Text = "Delete..."
'
'mMenFileRename
'
Me.mMenFileRename.Image = Global.mRemoteNG.My.Resources.Resources.Rename
Me.mMenFileRename.Name = "mMenFileRename"
Me.mMenFileRename.Size = New System.Drawing.Size(334, 22)
Me.mMenFileRename.Size = New System.Drawing.Size(281, 22)
Me.mMenFileRename.Text = "Rename"
'
'mMenFileDuplicate
'
Me.mMenFileDuplicate.Image = Global.mRemoteNG.My.Resources.Resources.Connection_Duplicate
Me.mMenFileDuplicate.Image = Global.mRemoteNG.My.Resources.Resources.page_copy
Me.mMenFileDuplicate.Name = "mMenFileDuplicate"
Me.mMenFileDuplicate.Size = New System.Drawing.Size(334, 22)
Me.mMenFileDuplicate.Size = New System.Drawing.Size(281, 22)
Me.mMenFileDuplicate.Text = "Duplicate"
'
'mMenFileSep4
'
Me.mMenFileSep4.Name = "mMenFileSep4"
Me.mMenFileSep4.Size = New System.Drawing.Size(331, 6)
Me.mMenFileSep4.Size = New System.Drawing.Size(278, 6)
'
'mMenFileExit
'
Me.mMenFileExit.Image = Global.mRemoteNG.My.Resources.Resources.Quit
Me.mMenFileExit.Name = "mMenFileExit"
Me.mMenFileExit.ShortcutKeys = CType((System.Windows.Forms.Keys.Alt Or System.Windows.Forms.Keys.F4), System.Windows.Forms.Keys)
Me.mMenFileExit.Size = New System.Drawing.Size(334, 22)
Me.mMenFileExit.Size = New System.Drawing.Size(281, 22)
Me.mMenFileExit.Text = "Exit"
'
'mMenView
@@ -389,7 +378,7 @@ Partial Class frmMain
'
Me.mMenViewConfig.Checked = True
Me.mMenViewConfig.CheckState = System.Windows.Forms.CheckState.Checked
Me.mMenViewConfig.Image = CType(resources.GetObject("mMenViewConfig.Image"), System.Drawing.Image)
Me.mMenViewConfig.Image = Global.mRemoteNG.My.Resources.Resources.cog
Me.mMenViewConfig.Name = "mMenViewConfig"
Me.mMenViewConfig.Size = New System.Drawing.Size(228, 22)
Me.mMenViewConfig.Text = "Config"
@@ -434,30 +423,34 @@ Partial Class frmMain
'
'mMenViewJumpToConnectionsConfig
'
Me.mMenViewJumpToConnectionsConfig.Image = Global.mRemoteNG.My.Resources.Resources.Root
Me.mMenViewJumpToConnectionsConfig.Name = "mMenViewJumpToConnectionsConfig"
Me.mMenViewJumpToConnectionsConfig.ShortcutKeys = CType(((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.Alt) _
Or System.Windows.Forms.Keys.C), System.Windows.Forms.Keys)
Me.mMenViewJumpToConnectionsConfig.Size = New System.Drawing.Size(262, 22)
Or System.Windows.Forms.Keys.C), System.Windows.Forms.Keys)
Me.mMenViewJumpToConnectionsConfig.Size = New System.Drawing.Size(260, 22)
Me.mMenViewJumpToConnectionsConfig.Text = "Connections && Config"
'
'mMenViewJumpToSessionsScreenshots
'
Me.mMenViewJumpToSessionsScreenshots.Image = Global.mRemoteNG.My.Resources.Resources.Sessions
Me.mMenViewJumpToSessionsScreenshots.Name = "mMenViewJumpToSessionsScreenshots"
Me.mMenViewJumpToSessionsScreenshots.ShortcutKeys = CType(((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.Alt) _
Or System.Windows.Forms.Keys.S), System.Windows.Forms.Keys)
Me.mMenViewJumpToSessionsScreenshots.Size = New System.Drawing.Size(262, 22)
Or System.Windows.Forms.Keys.S), System.Windows.Forms.Keys)
Me.mMenViewJumpToSessionsScreenshots.Size = New System.Drawing.Size(260, 22)
Me.mMenViewJumpToSessionsScreenshots.Text = "Sessions && Screenshots"
'
'mMenViewJumpToErrorsInfos
'
Me.mMenViewJumpToErrorsInfos.Image = Global.mRemoteNG.My.Resources.Resources.InformationSmall
Me.mMenViewJumpToErrorsInfos.Name = "mMenViewJumpToErrorsInfos"
Me.mMenViewJumpToErrorsInfos.ShortcutKeys = CType(((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.Alt) _
Or System.Windows.Forms.Keys.E), System.Windows.Forms.Keys)
Me.mMenViewJumpToErrorsInfos.Size = New System.Drawing.Size(262, 22)
Or System.Windows.Forms.Keys.E), System.Windows.Forms.Keys)
Me.mMenViewJumpToErrorsInfos.Size = New System.Drawing.Size(260, 22)
Me.mMenViewJumpToErrorsInfos.Text = "Errors && Infos"
'
'mMenViewResetLayout
'
Me.mMenViewResetLayout.Image = Global.mRemoteNG.My.Resources.Resources.application_side_tree
Me.mMenViewResetLayout.Name = "mMenViewResetLayout"
Me.mMenViewResetLayout.Size = New System.Drawing.Size(228, 22)
Me.mMenViewResetLayout.Text = "Reset Layout"
@@ -476,7 +469,7 @@ Partial Class frmMain
'
'mMenViewExtAppsToolbar
'
Me.mMenViewExtAppsToolbar.Image = CType(resources.GetObject("mMenViewExtAppsToolbar.Image"), System.Drawing.Image)
Me.mMenViewExtAppsToolbar.Image = Global.mRemoteNG.My.Resources.Resources.ExtApp
Me.mMenViewExtAppsToolbar.Name = "mMenViewExtAppsToolbar"
Me.mMenViewExtAppsToolbar.Size = New System.Drawing.Size(228, 22)
Me.mMenViewExtAppsToolbar.Text = "External Applications Toolbar"
@@ -488,7 +481,7 @@ Partial Class frmMain
'
'mMenViewFullscreen
'
Me.mMenViewFullscreen.Image = Global.mRemoteNG.My.Resources.Resources.Fullscreen
Me.mMenViewFullscreen.Image = Global.mRemoteNG.My.Resources.Resources.arrow_out
Me.mMenViewFullscreen.Name = "mMenViewFullscreen"
Me.mMenViewFullscreen.ShortcutKeys = System.Windows.Forms.Keys.F11
Me.mMenViewFullscreen.Size = New System.Drawing.Size(228, 22)
@@ -518,7 +511,7 @@ Partial Class frmMain
'
'mMenToolsExternalApps
'
Me.mMenToolsExternalApps.Image = CType(resources.GetObject("mMenToolsExternalApps.Image"), System.Drawing.Image)
Me.mMenToolsExternalApps.Image = Global.mRemoteNG.My.Resources.Resources.ExtApp
Me.mMenToolsExternalApps.Name = "mMenToolsExternalApps"
Me.mMenToolsExternalApps.Size = New System.Drawing.Size(184, 22)
Me.mMenToolsExternalApps.Text = "External Applications"
@@ -537,7 +530,7 @@ Partial Class frmMain
'
'mMenToolsComponentsCheck
'
Me.mMenToolsComponentsCheck.Image = Global.mRemoteNG.My.Resources.Resources.ComponentsCheck
Me.mMenToolsComponentsCheck.Image = Global.mRemoteNG.My.Resources.Resources.cog_error
Me.mMenToolsComponentsCheck.Name = "mMenToolsComponentsCheck"
Me.mMenToolsComponentsCheck.Size = New System.Drawing.Size(184, 22)
Me.mMenToolsComponentsCheck.Text = "Components Check"
@@ -586,6 +579,7 @@ Partial Class frmMain
'
'mMenInfoForum
'
Me.mMenInfoForum.Image = Global.mRemoteNG.My.Resources.Resources.user_comment
Me.mMenInfoForum.Name = "mMenInfoForum"
Me.mMenInfoForum.Size = New System.Drawing.Size(190, 22)
Me.mMenInfoForum.Text = "Support Forum"
@@ -643,6 +637,7 @@ Partial Class frmMain
'
Me.cmbQuickConnect.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend
Me.cmbQuickConnect.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems
Me.cmbQuickConnect.Margin = New System.Windows.Forms.Padding(1, 0, 3, 0)
Me.cmbQuickConnect.Name = "cmbQuickConnect"
Me.cmbQuickConnect.Size = New System.Drawing.Size(200, 25)
'
@@ -657,7 +652,7 @@ Partial Class frmMain
'
Me.tsContainer.ContentPanel.Controls.Add(Me.pnlDock)
Me.tsContainer.ContentPanel.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional
Me.tsContainer.ContentPanel.Size = New System.Drawing.Size(842, 424)
Me.tsContainer.ContentPanel.Size = New System.Drawing.Size(842, 449)
Me.tsContainer.Dock = System.Windows.Forms.DockStyle.Fill
'
'tsContainer.LeftToolStripPanel
@@ -681,14 +676,59 @@ Partial Class frmMain
Me.tsContainer.TopToolStripPanel.Controls.Add(Me.ToolStrip1)
Me.tsContainer.TopToolStripPanel.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional
'
'tsExtAppsToolbar
'tsQuickConnect
'
Me.tsQuickConnect.Dock = System.Windows.Forms.DockStyle.None
Me.tsQuickConnect.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.lblQuickConnect, Me.cmbQuickConnect, Me.btnQuickConnect, Me.btnConnections})
Me.tsQuickConnect.Location = New System.Drawing.Point(3, 24)
Me.tsQuickConnect.MaximumSize = New System.Drawing.Size(0, 25)
Me.tsQuickConnect.Name = "tsQuickConnect"
Me.tsQuickConnect.Size = New System.Drawing.Size(387, 25)
Me.tsQuickConnect.TabIndex = 18
'
'btnQuickConnect
'
Me.btnQuickConnect.DropDown = Me.mnuQuickConnectProtocol
Me.btnQuickConnect.Image = Global.mRemoteNG.My.Resources.Resources.Play_Quick
Me.btnQuickConnect.ImageTransparentColor = System.Drawing.Color.Magenta
Me.btnQuickConnect.Margin = New System.Windows.Forms.Padding(0, 1, 3, 2)
Me.btnQuickConnect.Name = "btnQuickConnect"
Me.btnQuickConnect.Size = New System.Drawing.Size(84, 22)
Me.btnQuickConnect.Text = "Connect"
'
'mnuQuickConnectProtocol
'
Me.mnuQuickConnectProtocol.Name = "mnuQuickConnectProtocol"
Me.mnuQuickConnectProtocol.OwnerItem = Me.btnQuickConnect
Me.mnuQuickConnectProtocol.ShowCheckMargin = True
Me.mnuQuickConnectProtocol.ShowImageMargin = False
Me.mnuQuickConnectProtocol.Size = New System.Drawing.Size(61, 4)
'
'btnConnections
'
Me.btnConnections.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.btnConnections.DropDown = Me.mnuConnections
Me.btnConnections.Image = Global.mRemoteNG.My.Resources.Resources.Root
Me.btnConnections.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None
Me.btnConnections.ImageTransparentColor = System.Drawing.Color.Magenta
Me.btnConnections.Name = "btnConnections"
Me.btnConnections.Size = New System.Drawing.Size(29, 22)
Me.btnConnections.Text = "Connections"
'
'mnuConnections
'
Me.mnuConnections.Name = "mnuConnections"
Me.mnuConnections.OwnerItem = Me.btnConnections
Me.mnuConnections.Size = New System.Drawing.Size(61, 4)
'
'tsExternalTools
'
Me.tsExternalTools.ContextMenuStrip = Me.cMenExtAppsToolbar
Me.tsExternalTools.Dock = System.Windows.Forms.DockStyle.None
Me.tsExternalTools.Location = New System.Drawing.Point(39, 49)
Me.tsExternalTools.Name = "tsExtAppsToolbar"
Me.tsExternalTools.Size = New System.Drawing.Size(111, 25)
Me.tsExternalTools.MaximumSize = New System.Drawing.Size(0, 25)
Me.tsExternalTools.Name = "tsExternalTools"
Me.tsExternalTools.Size = New System.Drawing.Size(111, 25)
Me.tsExternalTools.TabIndex = 17
'
'cMenExtAppsToolbar
@@ -705,44 +745,14 @@ Partial Class frmMain
Me.cMenToolbarShowText.Size = New System.Drawing.Size(128, 22)
Me.cMenToolbarShowText.Text = "Show Text"
'
'tsQuickConnect
'
Me.tsQuickConnect.Dock = System.Windows.Forms.DockStyle.None
Me.tsQuickConnect.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.lblQuickConnect, Me.cmbQuickConnect, Me.btnQuickyPlay, Me.mMenQuickyCon})
Me.tsQuickConnect.Location = New System.Drawing.Point(3, 24)
Me.tsQuickConnect.Name = "tsQuickConnect"
Me.tsQuickConnect.Size = New System.Drawing.Size(331, 25)
Me.tsQuickConnect.MaximumSize = New System.Drawing.Size(0, 25)
Me.tsQuickConnect.TabIndex = 18
'
'btnQuickyPlay
'
Me.btnQuickyPlay.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.btnQuickyPlay.Image = Global.mRemoteNG.My.Resources.Resources.Play_Quick
Me.btnQuickyPlay.ImageTransparentColor = System.Drawing.Color.Magenta
Me.btnQuickyPlay.Name = "btnQuickyPlay"
Me.btnQuickyPlay.Size = New System.Drawing.Size(32, 22)
Me.btnQuickyPlay.Text = "Connect"
'
'mMenQuickyCon
'
Me.mMenQuickyCon.AutoSize = False
Me.mMenQuickyCon.AutoToolTip = True
Me.mMenQuickyCon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.mMenQuickyCon.Image = Global.mRemoteNG.My.Resources.Resources.Root
Me.mMenQuickyCon.ImageTransparentColor = System.Drawing.Color.Magenta
Me.mMenQuickyCon.Name = "mMenQuickyCon"
Me.mMenQuickyCon.Size = New System.Drawing.Size(30, 22)
Me.mMenQuickyCon.Text = "Connections"
'
'ToolStrip1
'
Me.ToolStrip1.Dock = System.Windows.Forms.DockStyle.None
Me.ToolStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripButton1, Me.ToolStripButton2, Me.ToolStripButton3, Me.ToolStripSplitButton1})
Me.ToolStrip1.Location = New System.Drawing.Point(3, 74)
Me.ToolStrip1.Name = "ToolStrip1"
Me.ToolStrip1.Size = New System.Drawing.Size(264, 25)
Me.ToolStrip1.MaximumSize = New System.Drawing.Size(0, 25)
Me.ToolStrip1.Name = "ToolStrip1"
Me.ToolStrip1.Size = New System.Drawing.Size(0, 25)
Me.ToolStrip1.TabIndex = 19
Me.ToolStrip1.Visible = False
'
@@ -805,7 +815,7 @@ Partial Class frmMain
Me.Icon = Global.mRemoteNG.My.Resources.Resources.mRemote_Icon
Me.MainMenuStrip = Me.msMain
Me.Name = "frmMain"
Me.Opacity = 0
Me.Opacity = 0.0R
Me.Text = "mRemoteNG"
Me.msMain.ResumeLayout(False)
Me.msMain.PerformLayout()
@@ -814,9 +824,9 @@ Partial Class frmMain
Me.tsContainer.TopToolStripPanel.PerformLayout()
Me.tsContainer.ResumeLayout(False)
Me.tsContainer.PerformLayout()
Me.cMenExtAppsToolbar.ResumeLayout(False)
Me.tsQuickConnect.ResumeLayout(False)
Me.tsQuickConnect.PerformLayout()
Me.cMenExtAppsToolbar.ResumeLayout(False)
Me.ToolStrip1.ResumeLayout(False)
Me.ToolStrip1.PerformLayout()
Me.ResumeLayout(False)
@@ -849,7 +859,7 @@ Partial Class frmMain
Friend WithEvents mMenViewErrorsAndInfos As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenViewScreenshotManager As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenViewAddConnectionPanel As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents cmbQuickConnect As System.Windows.Forms.ToolStripComboBox
Friend WithEvents cmbQuickConnect As Controls.QuickConnectComboBox
Friend WithEvents mMenViewSep2 As System.Windows.Forms.ToolStripSeparator
Friend WithEvents mMenViewFullscreen As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenToolsSSHTransfer As System.Windows.Forms.ToolStripMenuItem
@@ -866,8 +876,7 @@ Partial Class frmMain
Friend WithEvents mMenSep3 As System.Windows.Forms.ToolStripSeparator
Friend WithEvents mMenInfoDonate As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenViewSep3 As System.Windows.Forms.ToolStripSeparator
Friend WithEvents btnQuickyPlay As System.Windows.Forms.ToolStripSplitButton
Friend WithEvents mMenQuickyCon As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents btnQuickConnect As Controls.ToolStripSplitButton
Friend WithEvents mMenViewJumpTo As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenViewJumpToConnectionsConfig As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenViewJumpToSessionsScreenshots As System.Windows.Forms.ToolStripMenuItem
@@ -886,13 +895,6 @@ Partial Class frmMain
Friend WithEvents mMenFileSep2 As System.Windows.Forms.ToolStripSeparator
Friend WithEvents mMenFileNewConnection As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileNewFolder As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileImportExport As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents ImportFromXMLFileToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents ImportFromRDPFileToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents ImportFromActiveDirectoryToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents ImportFromPortScanToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents ToolStripSeparator6 As System.Windows.Forms.ToolStripSeparator
Friend WithEvents ExportToXMLFileToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileSep3 As System.Windows.Forms.ToolStripSeparator
Friend WithEvents mMenFileDelete As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileRename As System.Windows.Forms.ToolStripMenuItem
@@ -904,5 +906,13 @@ Partial Class frmMain
Friend WithEvents ToolStripSplitButton1 As System.Windows.Forms.ToolStripDropDownButton
Friend WithEvents ToolStripMenuItem1 As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents ToolStripMenuItem2 As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuQuickConnectProtocol As System.Windows.Forms.ContextMenuStrip
Friend WithEvents btnConnections As System.Windows.Forms.ToolStripDropDownButton
Friend WithEvents mnuConnections As System.Windows.Forms.ContextMenuStrip
Friend WithEvents mMenFileExport As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileImportFromFile As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileImportFromActiveDirectory As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileImportFromPortScan As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents mMenFileImport As System.Windows.Forms.ToolStripMenuItem
End Class

View File

@@ -118,168 +118,121 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="msMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
<value>150, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="mMenViewConfig.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
Cv8BNGKaggAAArhJREFUOE91U91LU3EYnt0GjUYSgv+EoDeCgXkhiuBAL7swoTWUEryYF2JXQlebTIlK
pA1bmfODND+DpqUzt5Vfm7NtZx9n52xnui9zm/m5p9/vlINcHnjhnPf83ud5n/d9fhIAkv9FQ0NDrU6n
29fr9cnS0tKqq87lFQ8MDNxqaWm5oVKpjPFEEql0Gp2dnYb29vbrGo3m9mWgHIDBYGh7PzmZ1en1gtE4
kgoLEYTCAmLxOE5OTzExMXHw2mAQTCZT9vmLF8oLIBFAJpNde/N2iGP5EOKJhBh70SjYIAchEsHu3h4O
UimkMxkcHZ9geHjY/w8A/airq9MGSAHj88EfYGGzfcOXpWWsra/DS3LJ/X0xMoeHqK6ufpoHoO3tXfOR
QueOC7OzcyKI3e44D3L8OS1aWFxEZPdPJ5qeHksOQKlU1mq12qjL7T5jvD5YrTaEQmEQvaxUKpUXFhbe
m5ufj8aILNoVnYuHYc76+vqi5eXlVZLKyruqSDSGHZcbm3YHls0rYBgf6uvlTy5YHigU/R7GC/PKKplL
EH6WJcNNoKLiTpukrKzsEcfz2Hb+wMbmFpaWzYjG4lCr1R8vAF7pdN/pVqamZ2DfdiLAEpBAACUlJQoJ
eaRNTU3TZHUC0Yv1jU1xWOPj4xgaevfTaDQejIyOituw2mzw+gPQDw7ytIbW5nxAnPcsnTkET/R/Mi2I
a9wikhyEkSWMH6am4HDukPaDqKmpUedtobu7W/h1fIxEMgm3xwOLxYqVVQu+/g0LYafgQeKVrq6uUB6A
qqPDTJLURFnivmxYEES9lJX6gzBnibHOw5FdtLa2fs4DoHoaGxvHioqK7hcXFz8mXRzRdqkfGK83RfIP
SV4hl8vH6Nk8gMuX5GV/v4sn2+E4Ds3NzTnGKy/T5R8FBQUyMukZGuT95lXX+Tf6O+vwZDVeqgAAAABJ
RU5ErkJggg==
</value>
</data>
<data name="mMenViewSessions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
Cv8BNGKaggAAA4RJREFUOE9lk21MU3cUh/9L5pxabCoz2YsmLiwbDp0TddMU1sLo7e3LtZTSQim2ILft
ENoKtIVSXksEKRStwwoVDSZGCGPIyDbYCG5s02TZFudCtiDIjNFszjiWrFmZWf3tln2Z8uHJOV/Oc345
ySEAyP9hd24gcUo4zKmJrzRlJk6HVIJol4IfrcsQ3M1LfaaUShE8KdnKJ3EeGY6LatIEy7iFG/i+DP6V
EPMUAsrVCKr5aFcKYN2bEMnf94KqlE4mVurllYJgFo/EOZ6xZkso+zl80KDExVoanqxE2IU8FO5YjSbd
a63DzTpywZu9UtCbm0jidCvXbRryMLG/Fi7j/mdBjHexuNTrxIcnnRiuTPV9f8ZMvu0pIuQdtvg/zAef
sBYZ9LXSF282ini/udN49xyKbX/PTPYjcm0ID2aGsTQ7jltjdQ+LNVo2WX2WbFefIKSs5MAypezB3dW6
9LmANgl+ZiP8uVtwSLge9SUy3JnowB9fdGPx02b4bfro2j1HLeszz5C1oh5CnPLty1TJdtQ1MUmopzbC
q9iMcm64QvI8lMlPo9XnQEeXD6G+MPq/iuF17dSNVXtPv80Tc4IKYQKpFK4jZXtWeZsL0zB5qgrvt5rg
L34Dvc5sWCRJqPr4KgyfAzljQMs0cPyjJbykGFngi04IiUm+m2jpdMJKtllmhpqwND+JpR+G8PvlMKKz
E5jqMsHcP4eCwYfQnI2BOgmYTy9i4lwYAxXUdULJFGSf1EB2ifMV75ZLIn9eCSE2y61a+AS/TgXgtmqg
Cf+C/POAbgAoHOSS1F7FdF8LbnXs+ofI5XIikyuS00RZl+q9NTGvy4732krQXWNAjasCNpsdstJ25Pbd
Rt6F+xAf+RlC5tSd8XrpN7P9RS4iZXI2HbI5plX798PpdIE1WzA6OopQKIQDRhMchw8jT6fDm7LKyFbF
+dubqZEf03Xhsi+72WfnB8rXEK8pcyQcaISv5Qj0ej0KCgoQDAbR3u6HUqmEWq2Gy12NYw1lcOtF5x7/
HXI3sBPfDTaisroOnZ2dXGQbGIYBTdOwWq1wubhUFivujTdgoTnlwQrBXI/m4piXQo6+CB6PB21tbcvV
aDTC7/fDbrdDSsvw9VEKP/Xkc2d89HvJ/KAtYaLTkPJWlszHHfSmVqtdVKlUUa6PajSaiFgsvkHTcvZa
2Pjq9QFHwuOCfwHdFSeIQMKMzwAAAABJRU5ErkJggg==
Cv8BNGKaggAAA31JREFUOE9lkm1MU3cUh/9L5pxabCozmU4TF5YNh86JumkKa2H09vblWkppoRRbkNt2
CG0F2kIpryWCFIrWYYWKBhMjhDFkZBtsBDfcNFnm4lzIFgSZMZrNGceSNSszq7/ddZ+UD0/O+XKe88vJ
IQCegN25Lk4Jhzk18bWmzMTpkEoQ7VLwo3UZgvt5qS+UUimCZyVb+eQ/lglq0gRx3MJ1fF8G/2qIeQ4B
5UoE1Xy0KwWw7k2I5O97SVVKJxMr9epyQTCLF+d4xqotoewN+KhBiYu1NDxZibALeSjcsRJNujdah5t1
5II3e7mgNzcxTrdyzaYhDxP7a+EKHn4RxHgXi0u9Tnx80onhylTf92fM5FpPESHvscX/Yz74jLXIoK+V
vny7UcT7zZ3Ge+BQbPt7ZrIfkRtDeDQzjKXZcdwZq3tcrNGyyeqzZLv6BCFlJQfilLIHd1fr0ucC2iT4
mfXw527BIeFa1JfIcG+iA39c7sbi583w2/TR1XuOWtZmniGrRT2EOOXb41TJdtQ1MUmop9bDq9iMcm64
QrIRyuTn0epzoKPLh1BfGP1fx/CmdurWir2n3+WJOUGFMIFUCteQsj0rvM2FaZg8VYUPW03wF7+FXmc2
LJIkVH16HYYvgZwxoGUaOP7JEl5RjCzwRSeExCTfTbR0OmEl2ywzQ01Ymp/E0g9D+P1KGNHZCUx1mWDu
n0PB4GNozsZAnQTMpxcxcS6MgQrqJqFkCrJPaiC7xPmK98slkT+vhhCb5VYtfIZfpwJwWzXQhH9B/nlA
NwAUDnJJaq9juq8Fdzp2/UPkcjmRyRXJaaKsS/XempjXZccHbSXorjGgxlUBm80OWWk7cvvuIu/CQ4iP
/Awhc+reeL3029n+IheRMjmbDtkc06r9++F0usCaLRgdHUUoFMIBowmOw4eRp9PhbVllZKvi/N3N1MiP
6bpw2Vfd7IvzA+WriNeUORIONMLXcgR6vR4FBQUIBoNob/dDqVRCrVbD5a7GsYYyuPWic08/Hrkf2Inv
BhtRWV2Hzs5OLrINDMOApmlYrVa4XFwqixUPxhuw0JzyaJlgrkdzccxLIUdfBI/Hg7a2tng1Go3w+/2w
2+2Q0jJ8c5TCTz353BmfEswP2hImOg0p72TJfNxBb2u12kWVShXl+qhGo4mIxeJbNC1nb4SNr98ccCQ8
KQD5F90VJ4irTWosAAAAAElFTkSuQmCC
</value>
</data>
<data name="mMenViewScreenshotManager.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAjpJREFUOE+lk91P
UnEYx/2numu9bF21Vps1ZxfRGjEXtVrLpcNMROcxiRc9CgoSkQUKJSWKJmEFo2TKW241nbWaxcsAzwGO
HK/69jvngkBYXXjx3X5vz+f57nmeXxOApsNIDLZ5ohrrq1h6zBVhtY4GspOzKtHOCGt2R3RCrAiwzsUy
2Vzud4njwO3x/1SuxCPDFGF8EWUqACFzscRhbH4Hmvk4lAszsK3TcCb6YY+rMBpQ49ojE+5YguiwfEa2
yGPUFWMrAB2xLWQ2LuyAWlyCbY3G9Kd2mNfaYFyVYjwsh9rXB/nEMyisX5BhGwCKBDCx+BNK7xQcJOt4
WIbhD5egDlwE9b4V2sBtXB55iO4nm0izZeIgWuuAJQDz0i/0eGx4HOmGPiQB9a4FvSvNuP+mGZT/BiT6
B+h9uoUUs1cPYDgeltdJUB4v6MAgdCEplCvnoVg+hx5/K+697ITcMIV+xzZSuw0c7JLqWn0p0N4EOp1W
UHO3MOSXgfJdQZfrOq7Sw8R+CIMzX+sBQu/zpLI2f1qEjHjiuKuSYEB7CpT6JJR9LVDZP0I7+x3q59+Q
POhAAOQKPBTOs+iYPoN2+2mYuo5gw3oBCSL3wHG0mU5ANn4MUsPReoDGvs7mCSCw/bai0IYb4dVJJNw3
EdxcrrlL5sugnVVd0IqAcs2jatjBdTLP1wIMrsiPPFNAgRSywO2DFcWDJXumTvvIiqMc+zvKk+7okGk2
FhSGQ7D2P5F/wJIYfWWUD/Od/wAx6RUqGJsn2QAAAABJRU5ErkJggg==
</value>
</data>
<data name="mMenViewExtAppsToolbar.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAmlJREFUOE+lVN1L
k1EcPv9Ft06mzOF0m27qdHOb040cRpubc3PEyKQhTktbVuJAWkUKUr5FkWXSh5pObKTmJK1WYFdjBnVR
7MXogwIvkurCi552DpwoCBK8eC6f3/PFOQQA2Q3IjVv3ri6vJrdXn61h5ekaEo+fYz7xBPcXHmE6voQ7
M/MYm5jDlZvTuHjtLgYvjSM6PIq+s8J2e3d/iGTJP1/u24t3sT0wzxnw6s3Gf/H67QY+fdlE6NTgCFlN
vsDX5Yf48V7Agw9xfPy8uSNsffuO4PEzAqGWVSoV1Go1SkpKUFpaCo1GA61Wi7KyMlRUVKCyshJVVVXQ
6/Worq6GyWRCTU0NWrsiAllaSTJSTk4OJBIJcnNzIZVKkZeXh/z8fMhkMsjlchQWFkKhUKC4uJgJ1tXV
oTsyLBBaGD+QSqUwOTm54wPZDgQSX1xhNrliJpNBT0/PP1VpTB6xvr4eh8NRgczEEyxbQUEB0uk0YrEY
ioqKflvlJN5JeXk5dDodGhoacLCzXyATswswm82MoFQqWT5eJiVRcBItk4pROBwOHGjvFcj4VBxWq/Uv
Em+fKvEFDAYDW8BoNLIVXC4XfG3dAhm9PQuah6rQLijpz8n4bNQlhcViQW1tLZqamuAOhARyeWyK5eHW
uBJVoQS6NyfR6ShsNhu8Xi+c/qBAzo9c36J5nE4nGhsbmTW3280UKDweD5qbmxnB5/OhpaWFwe/3w+4O
DJHO3oHOvuiF9b7oiBgeGBaP9g+JHSfOicFjp8VDXREx0HFS9AfDorf1iJi1LGZVxf3eNtHuCqxb7C7j
rp4y/QZ+AXhAQe1Sf9VzAAAAAElFTkSuQmCC
</value>
</data>
<data name="mMenToolsExternalApps.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAmlJREFUOE+lVN1L
k1EcPv9Ft06mzOF0m27qdHOb040cRpubc3PEyKQhTktbVuJAWkUKUr5FkWXSh5pObKTmJK1WYFdjBnVR
7MXogwIvkurCi552DpwoCBK8eC6f3/PFOQQA2Q3IjVv3ri6vJrdXn61h5ekaEo+fYz7xBPcXHmE6voQ7
M/MYm5jDlZvTuHjtLgYvjSM6PIq+s8J2e3d/iGTJP1/u24t3sT0wzxnw6s3Gf/H67QY+fdlE6NTgCFlN
vsDX5Yf48V7Agw9xfPy8uSNsffuO4PEzAqGWVSoV1Go1SkpKUFpaCo1GA61Wi7KyMlRUVKCyshJVVVXQ
6/Worq6GyWRCTU0NWrsiAllaSTJSTk4OJBIJcnNzIZVKkZeXh/z8fMhkMsjlchQWFkKhUKC4uJgJ1tXV
oTsyLBBaGD+QSqUwOTm54wPZDgQSX1xhNrliJpNBT0/PP1VpTB6xvr4eh8NRgczEEyxbQUEB0uk0YrEY
ioqKflvlJN5JeXk5dDodGhoacLCzXyATswswm82MoFQqWT5eJiVRcBItk4pROBwOHGjvFcj4VBxWq/Uv
Em+fKvEFDAYDW8BoNLIVXC4XfG3dAhm9PQuah6rQLijpz8n4bNQlhcViQW1tLZqamuAOhARyeWyK5eHW
uBJVoQS6NyfR6ShsNhu8Xi+c/qBAzo9c36J5nE4nGhsbmTW3280UKDweD5qbmxnB5/OhpaWFwe/3w+4O
DJHO3oHOvuiF9b7oiBgeGBaP9g+JHSfOicFjp8VDXREx0HFS9AfDorf1iJi1LGZVxf3eNtHuCqxb7C7j
rp4y/QZ+AXhAQe1Sf9VzAAAAAElFTkSuQmCC
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi9JREFUOE+lk+9P
UlEYx/2netf6sfmqtdqsOXsRrRFzUas1XTrMRHRek/ihVwFBupEFCiUliiZhBaNkChdyq+ms1Sx+DPBe
4Mr1Vd8OvKAYzLZ68Tnb2Tnn8zznOc9pAvBfVAabJ6phXrCpCVeE1zoaYK+FdkZ4izuiqwqYeTadyWZ/
FgUBwr54KNmiiDRXgPFZlKsKypELRQETC7vQLMSgXJyFbYOGMz4Ie0yF8YAaVx+Y0WENosv6EZmCiHEX
y1cFOpJm2W5c3AW1tAzbOo2ZD52wrLfDuCaFKSyH2jcA+eQTKJhPSPMNBAUimFz6DqV3Gg4S1RSWYfTd
RagDF0C9bYM2cAuXxu6j99EWUnyJCKK1Ap4ILMs/0Oex4WGkF/qQBNSbVvSvtuDuqxZQ/uuQ6O+h//E2
ktx+vYATRFhfJkB5vKADw9CFpFCunoNi5Sz6/G2487wbcsM0Bh07SO41yGCPVJfxJUF74+h2MqDmb2LE
LwPlu4we1zVcoUdJ+iEMz36uF5TfOkcqa/OnKpIxTwy3VRIMaZtBqU9COdAKlf09tHNfoX76BYlGgmxe
hMJ5Bl0zp9FpPwVzzxFsMucRJ7iHjqPdfAIy0zFIDUfrBRr7Bp8jgsDO6yqhTTfCa1OIu28guLVSs5bI
lUA7/8ygIijVbDqMRE6sFRhckW85Lo88KWReOABfQQRP5lwdB8hUWpn93cpT7uiIeY4Nlu9VNv8N8g94
ckZfFfw7aPoFMekVKhSu/5wAAAAASUVORK5CYII=
</value>
</data>
<data name="mMenToolsOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAftJREFUOE+Vk81v
0mAcx/lf/FuMGmOMJ08ePYvRg2RZllKgFAvEMrDYwg664BybMQw3KmpteTOpklVefINlyEDQ1dPioWbf
PeUwNW50Hppe+vn8vr/v89QFwOX0pNNptyRJLVEUrWQyaf35vSOcSqXcBNzr9/swTROJRILwv4c6Cgjc
6vV6GA6HKBQKiMVi/ycQBMGyp9frdfA8r9rTI5EIOI5DKBSyHBOQyL86nQ7K5TKi0eircDisZbNZtNtt
MAwzXRCPx8+SyPuNRgO1Wg3FYhGyLENVVZRKJfj9/taRCW6vfOGDmY91EtmqVqvQdR32u1KpQNM0KIoC
n8+35/V63f8I2KVtXioMITwdgFt6D8MwkM/nwbLsvh2ZTLVomm5RFOW2+/hLwNjw+gDF+g/Ib01wqz3M
iAaCweDPQCBw6qj7cijwZ7b5JIGfETCjjHD/+Vfkat9BPdjCFdZ4fdxlmwjoxS1eWBtAfmNi8eUIibUd
pMgaq5Vv8Cx0cYluPjpWMEfg+dwAGzqBX4wwn9uBSJKslMa4le7iIvUuO+2quzwLHazru5PI/JM+7pHy
stoYN6UuLsxNhyclXrv7iey6C3GDNE/WWCbwDQKfm9187PSTTQRX73zQ7aKW1TEeKmNcT37GmZmTwYfH
eJlpNklROD+7idOek8O24AByavlRgSfdiAAAAABJRU5ErkJggg==
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgRJREFUOE+NkEtv
EmEUhue/+FuMGmOMK1cuXYvRhaRpmuE+lEscCoIz0IU2WEtrDKUtiIoMN5PRSZGLN2iKFAQtrhoXY/r2
DAl2qJPaxfPN5JzzfN85hwHwX2KxmEkUxYYgCGokElH1ualCI6LRqInEg263i9FohFAoROHj/FSxESQ3
Op0O+v0+0uk0AoEAhY/zU8VGhMNhVXtdURTwPJ/XYj6fDx6PB263WzWU9FDLf1qtForFIvx+/xuv1ysl
Egk0m004nc7TLwgGgxep5cNarYZKpYJsNotMJoN8Po9CoQC73d4wFOdXv/Gu+GeFWlbL5TJkWYb2LZVK
kCQJuVwONpvtwGKxmP6RueVdXkz3Ed7owbP8EdVqFalUChzHHWot06uq1WptsCxr0uqnZKcmb/aQVX4h
834Ez1oHM0IVLpfrt8PhOKevnfD3xx7f5SMkvyAxnhvg0cvvSFZ+gn28gxtc9a1e0jM+rEs7fHi9h8y7
EZZeDxBa30OUxlgr/YB5sY1r1vrTk+IEZo7khWQPWzLJrwZYSO5BoE5WC0Pci7Vxlf2QMBInMObFFjbl
/XHL/PMuHtLyEtIQd8U2rsydLmswtx58oVn3IWzR5mmMFZLvkHxpdvuZkXAS5ub9T7K2qJX8EE9yQ9yO
fMWFmbPJGuPjurNep0Xh8uw2zpvPLgNgjgByavlR+3PXTAAAAABJRU5ErkJggg==
</value>
</data>
<data name="mMenInfoHelp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAq5JREFUOE+lk99P
UmEcxv1b9E9oreZq1Wrd1da46KILp+ZPoKnlahksZ+kwp1lSamY6FdTUORUFTgIiiCaKgCBwMJFfyoGB
cOCo2faELCGrdVEXn7v3+bx73vf7zQKQ9T/8FtaQhzlqxwFPZdsnFRsM/ckSp2VmmpwxRnlThr2cXy87
JVDaGNasNeF3Bg6xucvA4aNTOHcSsHoTGFkM+ocWAqyfJWkBsR5nSU2x+Ba1j7UvYYjnPBCM2VA/soEu
YhM6axB2P40PCk+8i9hOS1ICyVo0e3I14tsMMFiwhVCbDHUSTnhCDNyhBMYWvagRmyBf9cPijqJ1kvQ1
j9uzj7MpwehSkL/uiWPFGQF/0IKHPWtIHBwl+faDI9QOGlHTb8C8hYJ6nUKd2MRPC/rm/KQ92bWb2EJ1
jwFV3SvwBBOYWvZCad4Bk5QpzT6w2zVonbLC5ArjUbeeTAs6ZC7G4YuBLzKi8r0enE5d8rAW03o3wvQB
dsMMemftKG1To/KdFlb3HjhCLZMWtIzbGbs3hscDRrA7tCh/q0HZGw1izFdsUzS4QjWKWhS4m4QrVMHi
iSC/SZkRPBObSfN2BEKJHZx2HcqE8yh5PYfil8oUhS8IFDbKUNAoRb14GXonhdt10kyFZB++TO+F1kqh
skOXDoai+6D2GOQJZlIUCiQgVt0QJevcqJnIPCJXuJBd/mret2SjIF/xgN2mQkGTHG3jhhTH4fyGCQyr
HFAZvbhePea7en80843Hj5EnmGXdaSDiGssOlCYfnouWUNIsRVHjNJ72aiHXu6BY8+Byxcf4xXtDpwfp
ZDRv8SWsm08m/X3EBj47AjC6QikWbbvokpiRyxH7z5eL/jzKJ5JrD0ZzrlSN8C5VDJMXuIN0LltMnysb
IM+W9vPOFPf9fZn+Za2/A9evBaJ0QokTAAAAAElFTkSuQmCC
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAqtJREFUOE+lk+1P
klEYxv1b9E9oreZq1Wp9q63xoQ99cGq+Ak0tV8tgOUuHOc2SUjPTqaCmzqko8CQggmiiCAgCDybypjww
EB541Gy7QpaQ1dpaH35n5z67r2u7zrlPFoD/4rcDDXmYo3Yc8FS2fVKxwdCfLHFaZqbJGWOUN2XYy/m1
/1ShtDGsWWvC7wwcYnOXgcNHp3DuJGD1JjCyGPQPLQRYP2vSG2I9zpKaYvEtah9rX8IQz3kgGLOhfmQD
XcQmdNYg7H4aHxSeeBexnTZJLZK1aPbkasS3GWCwYAuhNinqJJzwhBi4QwmMLXpRIzZBvuqHxR1F6yTp
ax63Z6cNRpeC/HVPHCvOCPiDFjzsWUPi4CjJtx8coXbQiJp+A+YtFNTrFOrEJn7aoG/OT9qTWbuJLVT3
GFDVvQJPMIGpZS+U5h0wSQOl2Qd2uwatU1aYXGE86taTaYMOmYtx+GLgi4yofK8Hp1OXbNZiWu9GmD7A
bphB76wdpW1qVL7TwureA0eoZdIGLeN2xu6N4fGAEewOLcrfalD2RoMY8xXbFA2uUI2iFgXuJuEKVbB4
IshvUmYMnonNpHk7AqHEDk67DmXCeZS8nkPxS2WKwhcEChtlKGiUol68DL2Twu06aSZCMg9fpvdCa6VQ
2aFLC0PRfVB7DPIEMykKBRIQq26IknFu1ExkLpErXMgufzXvW7JRkK94wG5ToaBJjrZxQ4pjcX7DBIZV
DqiMXlyvHvNdvT+aecZj8gSzrDsNRFxj2YHS5MNz0RJKmqUoapzG014t5HoXFGseXK74GL94b+j0IJ1w
iy9h3Xwy6e8jNvDZEYDRFUqxaNtFl8SMXI7Yf75c9OdRPuHag9GcK1UjvEsVw+QF7iCdyxbT58oGyLOl
/bwzxX1//0z/DrK+A9evBaLmuZREAAAAAElFTkSuQmCC
</value>
</data>
<data name="mMenInfoWebsite.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2ZJREFUOE9dk91P
k2cYxptsO5vZf8GxZvEAAzYUV6HQMcSImPEpbQPtCynNCmWx6ksXKlhGiRsTJypYsEApYItfLdBarBX6
trUtLRRah26DbqzGCSxz8fLpm2imB7/kyp37/j0n18MBwPk/Da7qbMIIIUF4SfiHsEmYopxVeR/uvzsm
Cx8TrqcP7v1iwGLyLmaezMOyMo+JiB1jkSHUzZS/Et89MV0zXfrpWxErIEefEFwD0fPY2PZiZSuE4BYD
c8IHa3wJA6EQrvkZjPhd0HvaUW4uCZSNFH2Wvn0rMFyNtCP+Yg5LL9wIp8LwbfoxFAtjNL6Kbm8MnQ8j
6HJ4YA7boXe3omRQMM0KyMtZhH/X/56DJWXF2HMrbm05cOtpCD9Hl/FDcAWU1QvqphuaBSv6Ehfg/d0M
4SX+f/k/8orSApM1/hMW/7BiODUJ418eeJIB6HxhdC4sQ2zxQmKzQb7UB0Wchny1FYN+Pa4/1CL3++w7
acH64z9vYmD9EnTJy+T1ENxJPxru+CCeXMQ3ngVIYkoIl8UQRkQoD8qgvqeAM2bAQW3mb2nB9urzGbRF
z4KKNaPv11kMJxZRfuMRZHYnOlduoyo6BG6gGXx/Pb6ylUE2ehLMsylk0vt3ONT9qp211AxOBRSQBbrR
/8SGimE3KiaCKLn4AA22B2gNmEG5LKg0mlFq/BaSwRNgnk5iv3rfLqd+tuKZb3MC3aE2dKzO4vS8HZXa
K6C1nejv74fyzHcoPGPCYXqCZA0707S3oXdIi8+b925ySDGmzJEeWOJX0XifRu05JfR6PTY2NrC2tgaH
w4FWTQcaT3cgHImyM5eL9IHs8Cpy1jnVlmN8UoxXwaQVVfrjUDQrwASDKKNaUFAohEgkQk9PD1QqFZsL
CgugVDewkiZF0zZbpNIbX07q5pSg1NWgNTQrqDM4kHOID7vdDoZh4HQ6YTKZkPsFDyqDmBXQNL3LCo5c
y99DihGoVh8F1ShlBZVUE3i5h8Dn81FcXMySzrxcHgRf52+nBRKJJPXuMx2+kLMnW5XpLDgmeN2l74Jx
bBTj4+Po7e2FXC5HS0sLm9Mz44gxpdPpUkKhMPLeV87IyPgoS3KgKa8ob6dGVPO6TlqHemk9cmTc1MHG
LIbkXalUultbW/tSIBAkuFzu3jfA3LOfi8khbAAAAABJRU5ErkJggg==
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2BJREFUOE9dkt9P
Wmccxkm63bXZf+F1l6UXLloidlRRZp1Lnc38OYEoHA2SoriMdkcWqQ4rpqur3VyrRYuKqAW7tqBCsZQp
BxggKAqt7TalczRd1WZd+uw956Jpd/FJnnzzPp/35uEBeIsmT20uYYyQIjwnvCBsE2Yod03B/9+/WXyH
cI0t3HlownL6NuYeLMK2toipmBMTsRE0zFW+lN4+NVs3W37wLQEpvUvwDMW/xdauH2s7EYR3GFhTAdiT
KxiKRHA1yGAs6IHR14lKa1moYqzkvTcFpiuxTiSfLWDlmRfRTBSB7SBGElGMJ9fR60+g+34MPS4frFEn
jN52lA2LZjkBKecQ/tn8ewG2jB0TT+24uePCzUcR/BBfxXfhNVB2P6gbXuiW7BhIXYD/DyvEl4X/Fl4U
lLACiz35PZaf2DGamYb5Lx986RAMgSi6l1YhtfkhczigXBmAKklDud6O4aAR1+7rkX8+9xYr2Pz1zxsY
2rwMQ/pH8nsE3nQQTbcCkE4v47RvCbKEGuJVKcQxCSrDCmjvqOBOmHBUn/07K9hdfzqHjvjXoBKtGPht
HqOpZVRe/wUKpxvdaz+jJj4CfqgVwmAjTjgqoBj/AszjGWTTR/Z41N2avY3MHL4KqaAI9WLwgQNVo15U
TYVRdukemhz30B6ygvLYUG22otz8JWTDp8A8msYR7fv7vMb5qseB7Sn0RjrQtT6PM4tOVOt/Aq3vxuDg
INRnv0HxWQuO01Mk67ibrrMD/SN6fNB6eJtHhjFjjfXBlryC5rs06s+pYTQasbW1hY2NDbhcLrTrutB8
pgvRWJy7eTxkD+SNoCpvk1drOykkw3gZTttRY/wMqlYVmHAYFVQbiorFkEgk6Ovrg0aj4XJRcRHU2iZO
0qJq2eWGVH7942nDghqUtha0juYEDSYX8o4J4XQ6wTAM3G43LBYL8j8SQGOScgKapvc5wSdXCw+RYYRq
tZ+CapZzgmqqBYL8YxAKhSgtLeVgsyBfANHnhbusQCaTZTgBy/ELeYdyNdnuopOiVz3GHpgnxjE5OYn+
/n4olUq0tbVxmb2Zx8wZg8GQEYvFsdcClqysrAM5sg9bCkoK9uokda8a5A1olDciT8HPHG3OYUjel8vl
+/X19c9FIlGKz+cf/g/A3LOff0xp0AAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="tsQuickConnect.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>521, 17</value>
<value>367, 17</value>
</metadata>
<metadata name="tsExtAppsToolbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>374, 17</value>
<metadata name="tsExternalTools.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="cMenExtAppsToolbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 56</value>
<value>504, 17</value>
</metadata>
<metadata name="ToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>184, 56</value>
<value>671, 17</value>
</metadata>
<metadata name="mnuQuickConnectProtocol.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>778, 17</value>
</metadata>
<metadata name="mnuConnections.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 56</value>
</metadata>
<metadata name="tmrAutoSave.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>252, 17</value>
<value>245, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>155</value>

View File

@@ -1,3 +1,8 @@
Imports System.IO
Imports mRemoteNG.App
Imports mRemoteNG.My
Imports SharedLibraryNG
Imports System.Text
Imports WeifenLuo.WinFormsUI.Docking
Imports mRemoteNG.App.Runtime
Imports System.Reflection
@@ -28,6 +33,54 @@ Public Class frmMain
Return _isClosing
End Get
End Property
Private _usingSqlServer As Boolean = False
Public Property UsingSqlServer As Boolean
Get
Return _usingSqlServer
End Get
Set(value As Boolean)
If _usingSqlServer = value Then Return
_usingSqlServer = value
UpdateWindowTitle()
End Set
End Property
Private _connectionsFileName As String = Nothing
Public Property ConnectionsFileName As String
Get
Return _connectionsFileName
End Get
Set(value As String)
If _connectionsFileName = value Then Return
_connectionsFileName = value
UpdateWindowTitle()
End Set
End Property
Private _showFullPathInTitle As Boolean = My.Settings.ShowCompleteConsPathInTitle
Public Property ShowFullPathInTitle As Boolean
Get
Return _showFullPathInTitle
End Get
Set(value As Boolean)
If _showFullPathInTitle = value Then Return
_showFullPathInTitle = value
UpdateWindowTitle()
End Set
End Property
Private _selectedConnection As Connection.Info = Nothing
Public Property SelectedConnection As Connection.Info
Get
Return _selectedConnection
End Get
Set(value As Connection.Info)
If _selectedConnection Is value Then Return
_selectedConnection = value
UpdateWindowTitle()
End Set
End Property
#End Region
#Region "Startup & Shutdown"
@@ -49,6 +102,7 @@ Public Class frmMain
Startup.ParseCommandLineArgs()
ApplyLanguage()
PopulateQuickConnectProtocolMenu()
AddHandler ThemeManager.ThemeChanged, AddressOf ApplyThemes
ApplyThemes()
@@ -62,19 +116,24 @@ Public Class frmMain
Tools.IeBrowserEmulation.Register()
Startup.GetConnectionIcons()
GetExtApps()
Windows.treePanel.Focus()
Tree.Node.TreeView = Windows.treeForm.tvConnections
If My.Settings.FirstStart And _
Not My.Settings.LoadConsFromCustomLocation And _
Not IO.File.Exists(GetStartupConnectionFileName()) Then
NewConnections(GetStartupConnectionFileName())
End If
'LoadCredentials()
LoadConnections()
If Not IsConnectionsFileLoaded Then
Application.Exit()
System.Windows.Forms.Application.Exit()
Return
End If
PuttySessions.StartWatcher()
Putty.Sessions.StartWatcher()
If My.Settings.StartupComponentsCheck Then
Windows.Show(UI.Window.Type.ComponentsCheck)
@@ -92,6 +151,8 @@ Public Class frmMain
AddHandler Microsoft.Win32.SystemEvents.DisplaySettingsChanged, AddressOf DisplayChanged
Me.Opacity = 1
KeyboardShortcuts.RequestKeyNotifications(Handle)
End Sub
Private Sub ApplyLanguage()
@@ -102,12 +163,11 @@ Public Class frmMain
mMenFileLoad.Text = My.Language.strMenuOpenConnectionFile
mMenFileSave.Text = My.Language.strMenuSaveConnectionFile
mMenFileSaveAs.Text = My.Language.strMenuSaveConnectionFileAs
mMenFileImportExport.Text = My.Language.strImportExport
ImportFromActiveDirectoryToolStripMenuItem.Text = My.Language.strImportAD
ImportFromPortScanToolStripMenuItem.Text = My.Language.strImportPortScan
ImportFromRDPFileToolStripMenuItem.Text = My.Language.strImportRDPFiles
ImportFromXMLFileToolStripMenuItem.Text = My.Language.strImportmRemoteXML
ExportToXMLFileToolStripMenuItem.Text = My.Language.strExportmRemoteXML
mMenFileImport.Text = Language.strImportMenuItem
mMenFileImportFromFile.Text = Language.strImportFromFileMenuItem
mMenFileImportFromActiveDirectory.Text = Language.strImportAD
mMenFileImportFromPortScan.Text = Language.strImportPortScan
mMenFileExport.Text = Language.strExportToFileMenuItem
mMenFileExit.Text = My.Language.strMenuExit
mMenView.Text = My.Language.strMenuView
@@ -145,8 +205,8 @@ Public Class frmMain
mMenInfoAnnouncements.Text = My.Language.strMenuAnnouncements
lblQuickConnect.Text = My.Language.strLabelConnect
btnQuickyPlay.Text = My.Language.strMenuConnect
mMenQuickyCon.Text = My.Language.strMenuConnections
btnQuickConnect.Text = My.Language.strMenuConnect
btnConnections.Text = My.Language.strMenuConnections
cMenToolbarShowText.Text = My.Language.strMenuShowText
@@ -200,7 +260,9 @@ Public Class frmMain
End Sub
Private Sub frmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown
#If Not PORTABLE Then
#If PORTABLE Then
Return
#End If
If Not My.Settings.CheckForUpdatesAsked Then
Dim commandButtons() As String = {My.Language.strAskUpdatesCommandRecommended, My.Language.strAskUpdatesCommandCustom, My.Language.strAskUpdatesCommandAskLater}
cTaskDialog.ShowTaskDialogBox(Me, My.Application.Info.ProductName, My.Language.strAskUpdatesMainInstruction, String.Format(My.Language.strAskUpdatesContent, My.Application.Info.ProductName), "", "", "", "", String.Join("|", commandButtons), eTaskDialogButtons.None, eSysIcons.Question, eSysIcons.Question)
@@ -210,15 +272,17 @@ Public Class frmMain
If cTaskDialog.CommandButtonResult = 1 Then
Windows.ShowUpdatesTab()
End If
Return
End If
If Not My.Settings.CheckForUpdatesOnStartup Then Return
Dim nextUpdateCheck As Date = My.Settings.CheckForUpdatesLastCheck.Add(TimeSpan.FromDays(My.Settings.CheckForUpdatesFrequencyDays))
If My.Settings.UpdatePending Or Date.UtcNow > nextUpdateCheck Then
If Not IsHandleCreated Then CreateHandle() ' Make sure the handle is created so that InvokeRequired returns the correct result
Startup.CheckForUpdate()
Startup.CheckForAnnouncement()
End If
#End If
End Sub
Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
@@ -338,7 +402,6 @@ Public Class frmMain
Case Tree.Node.Type.Root
mMenFileNewConnection.Enabled = True
mMenFileNewFolder.Enabled = True
mMenFileImportExport.Enabled = True
mMenFileDelete.Enabled = False
mMenFileRename.Enabled = True
mMenFileDuplicate.Enabled = False
@@ -348,7 +411,6 @@ Public Class frmMain
Case Tree.Node.Type.Container
mMenFileNewConnection.Enabled = True
mMenFileNewFolder.Enabled = True
mMenFileImportExport.Enabled = True
mMenFileDelete.Enabled = True
mMenFileRename.Enabled = True
mMenFileDuplicate.Enabled = True
@@ -358,7 +420,6 @@ Public Class frmMain
Case Tree.Node.Type.Connection
mMenFileNewConnection.Enabled = True
mMenFileNewFolder.Enabled = True
mMenFileImportExport.Enabled = False
mMenFileDelete.Enabled = True
mMenFileRename.Enabled = True
mMenFileDuplicate.Enabled = True
@@ -368,7 +429,6 @@ Public Class frmMain
Case Tree.Node.Type.PuttyRoot, Tree.Node.Type.PuttySession
mMenFileNewConnection.Enabled = False
mMenFileNewFolder.Enabled = False
mMenFileImportExport.Enabled = False
mMenFileDelete.Enabled = False
mMenFileRename.Enabled = False
mMenFileDuplicate.Enabled = False
@@ -378,7 +438,6 @@ Public Class frmMain
Case Else
mMenFileNewConnection.Enabled = True
mMenFileNewFolder.Enabled = True
mMenFileImportExport.Enabled = False
mMenFileDelete.Enabled = False
mMenFileRename.Enabled = False
mMenFileDuplicate.Enabled = False
@@ -388,64 +447,78 @@ Public Class frmMain
End Select
End Sub
Private Sub mMenFileNewConnection_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileNewConnection.Click
App.Runtime.Windows.treeForm.AddConnection()
Private Shared Sub mMenFileNewConnection_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileNewConnection.Click
Windows.treeForm.AddConnection()
SaveConnectionsBG()
End Sub
Private Sub mMenFileNewFolder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileNewFolder.Click
App.Runtime.Windows.treeForm.AddFolder()
Private Shared Sub mMenFileNewFolder_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileNewFolder.Click
Windows.treeForm.AddFolder()
SaveConnectionsBG()
End Sub
Private Sub mMenFileNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileNew.Click
Dim lD As SaveFileDialog = Tools.Controls.ConnectionsSaveAsDialog
If lD.ShowDialog = System.Windows.Forms.DialogResult.OK Then
NewConnections(lD.FileName)
Else
Exit Sub
End If
Private Shared Sub mMenFileNew_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileNew.Click
Dim saveFileDialog As SaveFileDialog = Tools.Controls.ConnectionsSaveAsDialog
If Not saveFileDialog.ShowDialog() = DialogResult.OK Then Return
NewConnections(saveFileDialog.FileName)
End Sub
Private Sub mMenFileLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileLoad.Click
If App.Runtime.IsConnectionsFileLoaded Then
Select Case MsgBox(My.Language.strSaveConnectionsFileBeforeOpeningAnother, MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question)
Private Shared Sub mMenFileLoad_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileLoad.Click
If IsConnectionsFileLoaded Then
Select Case MsgBox(Language.strSaveConnectionsFileBeforeOpeningAnother, MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question)
Case MsgBoxResult.Yes
App.Runtime.SaveConnections()
SaveConnections()
Case MsgBoxResult.Cancel
Exit Sub
Return
End Select
End If
LoadConnections(True)
End Sub
Private Sub mMenFileSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileSave.Click
Private Shared Sub mMenFileSave_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileSave.Click
SaveConnections()
End Sub
Private Sub mMenFileSaveAs_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileSaveAs.Click
Private Shared Sub mMenFileSaveAs_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileSaveAs.Click
SaveConnectionsAs()
End Sub
Private Sub mMenFileExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileExit.Click
App.Runtime.Shutdown.Quit()
End Sub
Private Sub mMenFileDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileDelete.Click
Private Shared Sub mMenFileDelete_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileDelete.Click
Tree.Node.DeleteSelectedNode()
SaveConnectionsBG()
End Sub
Private Sub mMenFileRename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileRename.Click
Private Shared Sub mMenFileRename_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileRename.Click
Tree.Node.StartRenameSelectedNode()
SaveConnectionsBG()
End Sub
Private Sub mMenFileDuplicate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFileDuplicate.Click
Private Shared Sub mMenFileDuplicate_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileDuplicate.Click
Tree.Node.CloneNode(Tree.Node.SelectedNode)
SaveConnectionsBG()
End Sub
Private Shared Sub mMenFileImportFromFile_Click(sender As System.Object, e As EventArgs) Handles mMenFileImportFromFile.Click
Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes(0), Windows.treeForm.tvConnections.SelectedNode)
End Sub
Private Shared Sub mMenFileImportFromActiveDirectory_Click(sender As System.Object, e As EventArgs) Handles mMenFileImportFromActiveDirectory.Click
Windows.Show(UI.Window.Type.ActiveDirectoryImport)
End Sub
Private Shared Sub mMenFileImportFromPortScan_Click(sender As System.Object, e As EventArgs) Handles mMenFileImportFromPortScan.Click
Windows.Show(UI.Window.Type.PortScan, True)
End Sub
Private Shared Sub mMenFileExport_Click(sender As System.Object, e As EventArgs) Handles mMenFileExport.Click
Export.ExportToFile(Windows.treeForm.tvConnections.Nodes(0), Windows.treeForm.tvConnections.SelectedNode)
End Sub
Private Shared Sub mMenFileExit_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenFileExit.Click
Shutdown.Quit()
End Sub
#End Region
#Region "View"
@@ -604,8 +677,8 @@ Public Class frmMain
App.Runtime.Windows.Show(UI.Window.Type.ExternalApps)
End Sub
Private Sub mMenToolsPortScan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenToolsPortScan.Click
App.Runtime.Windows.Show(UI.Window.Type.PortScan, Tools.PortScan.PortScanMode.Normal)
Private Sub mMenToolsPortScan_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenToolsPortScan.Click
App.Runtime.Windows.Show(UI.Window.Type.PortScan, False)
End Sub
Private Sub mMenToolsComponentsCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenToolsComponentsCheck.Click
@@ -618,75 +691,67 @@ Public Class frmMain
#End Region
#Region "Quick Connect"
Private Sub btnQuickyPlay_ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnQuickyPlay.ButtonClick
CreateQuicky(QuickyText)
End Sub
Private Sub btnQuickyPlay_DropDownOpening(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnQuickyPlay.DropDownOpening
CreateQuickyButtons()
End Sub
Private Sub CreateQuickyButtons()
Private Sub PopulateQuickConnectProtocolMenu()
Try
btnQuickyPlay.DropDownItems.Clear()
For Each fI As FieldInfo In GetType(mRemoteNG.Connection.Protocol.Protocols).GetFields
If fI.Name <> "value__" And fI.Name <> "NONE" And fI.Name <> "IntApp" Then
Dim nBtn As New ToolStripMenuItem
nBtn.Text = fI.Name
btnQuickyPlay.DropDownItems.Add(nBtn)
AddHandler nBtn.Click, AddressOf QuickyProtocolButton_Click
mnuQuickConnectProtocol.Items.Clear()
For Each fieldInfo As FieldInfo In GetType(Connection.Protocol.Protocols).GetFields
If Not (fieldInfo.Name = "value__" Or fieldInfo.Name = "IntApp") Then
Dim menuItem As New ToolStripMenuItem(fieldInfo.Name)
If fieldInfo.Name = My.Settings.QuickConnectProtocol Then
menuItem.Checked = True
btnQuickConnect.Text = My.Settings.QuickConnectProtocol
End If
mnuQuickConnectProtocol.Items.Add(menuItem)
End If
Next
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "CreateButtons (frmMain) failed" & vbNewLine & ex.Message, True)
MessageCollector.AddExceptionMessage("PopulateQuickConnectProtocolMenu() failed.", ex, Messages.MessageClass.ErrorMsg, True)
End Try
End Sub
Private Sub QuickyProtocolButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Private Sub lblQuickConnect_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles lblQuickConnect.Click
cmbQuickConnect.Focus()
End Sub
Private Sub cmbQuickConnect_ConnectRequested(ByVal sender As Object, ByVal e As Controls.QuickConnectComboBox.ConnectRequestedEventArgs) Handles cmbQuickConnect.ConnectRequested
btnQuickConnect_ButtonClick(sender, e)
End Sub
Private Sub btnQuickConnect_ButtonClick(ByVal sender As Object, ByVal e As EventArgs) Handles btnQuickConnect.ButtonClick
Try
Dim conI As Connection.Info = CreateQuicky(QuickyText, Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.Protocols), sender.Text))
If conI.Port = 0 Then
conI.SetDefaultPort()
If mRemoteNG.Connection.QuickConnect.History.Exists(conI.Hostname) = False Then
mRemoteNG.Connection.QuickConnect.History.Add(conI.Hostname)
End If
Else
If mRemoteNG.Connection.QuickConnect.History.Exists(conI.Hostname) = False Then
mRemoteNG.Connection.QuickConnect.History.Add(conI.Hostname & ":" & conI.Port)
End If
Dim connectionInfo As Connection.Info = CreateQuickConnect(cmbQuickConnect.Text.Trim(), Connection.Protocol.Converter.StringToProtocol(My.Settings.QuickConnectProtocol))
If connectionInfo Is Nothing Then
cmbQuickConnect.Focus()
Return
End If
App.Runtime.OpenConnection(conI, mRemoteNG.Connection.Info.Force.DoNotJump)
cmbQuickConnect.Add(connectionInfo)
OpenConnection(connectionInfo, Connection.Info.Force.DoNotJump)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "QuickyProtocolButton_Click (frmMain) failed" & vbNewLine & ex.Message, True)
MessageCollector.AddExceptionMessage("btnQuickConnect_ButtonClick() failed.", ex, Messages.MessageClass.ErrorMsg, True)
End Try
End Sub
Private Sub cmbQuickConnect_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles cmbQuickConnect.KeyDown
If e.KeyCode = Keys.Enter Then
CreateQuicky(QuickyText)
End If
Private Sub cmbQuickConnect_ProtocolChanged(ByVal sender As Object, ByVal e As Controls.QuickConnectComboBox.ProtocolChangedEventArgs) Handles cmbQuickConnect.ProtocolChanged
SetQuickConnectProtocol(Connection.Protocol.Converter.ProtocolToString(e.Protocol))
End Sub
Private Sub lblQuickConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblQuickConnect.Click
Me.cmbQuickConnect.Focus()
Private Sub btnQuickConnect_DropDownItemClicked(sender As System.Object, e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles btnQuickConnect.DropDownItemClicked
SetQuickConnectProtocol(e.ClickedItem.Text)
End Sub
Private Function QuickyText() As String
Dim txt As String
txt = cmbQuickConnect.Text
If txt.StartsWith(" ") Or txt.EndsWith(" ") Then
txt = txt.Replace(" ", "")
cmbQuickConnect.Text = txt
End If
Return txt
End Function
Private Sub SetQuickConnectProtocol(ByVal protocol As String)
My.Settings.QuickConnectProtocol = protocol
btnQuickConnect.Text = protocol
For Each menuItem As ToolStripMenuItem In mnuQuickConnectProtocol.Items
If menuItem.Text = protocol Then
menuItem.Checked = True
Else
menuItem.Checked = False
End If
Next
End Sub
#End Region
#Region "Info"
@@ -721,43 +786,43 @@ Public Class frmMain
#End Region
#Region "Connections DropDown"
Private Sub mMenQuickyCon_DropDownOpening(ByVal sender As Object, ByVal e As System.EventArgs) Handles mMenQuickyCon.DropDownOpening
mMenQuickyCon.DropDownItems.Clear()
Private Sub btnConnections_DropDownOpening(ByVal sender As Object, ByVal e As EventArgs) Handles btnConnections.DropDownOpening
btnConnections.DropDownItems.Clear()
For Each tNode As TreeNode In App.Runtime.Windows.treeForm.tvConnections.Nodes
AddNodeToMenu(tNode.Nodes, mMenQuickyCon)
For Each treeNode As TreeNode In Windows.treeForm.tvConnections.Nodes
AddNodeToMenu(treeNode.Nodes, btnConnections)
Next
End Sub
Private Shared Sub AddNodeToMenu(ByVal tnc As TreeNodeCollection, ByVal menToolStrip As ToolStripMenuItem)
Private Shared Sub AddNodeToMenu(ByVal treeNodeCollection As TreeNodeCollection, ByVal toolStripMenuItem As ToolStripDropDownItem)
Try
For Each tNode As TreeNode In tnc
Dim tMenItem As New ToolStripMenuItem()
tMenItem.Text = tNode.Text
tMenItem.Tag = tNode
For Each treeNode As TreeNode In treeNodeCollection
Dim menuItem As New ToolStripMenuItem()
menuItem.Text = treeNode.Text
menuItem.Tag = treeNode
If Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Container Then
tMenItem.Image = My.Resources.Folder
tMenItem.Tag = tNode.Tag
If Tree.Node.GetNodeType(treeNode) = Tree.Node.Type.Container Then
menuItem.Image = My.Resources.Folder
menuItem.Tag = treeNode.Tag
menToolStrip.DropDownItems.Add(tMenItem)
AddNodeToMenu(tNode.Nodes, tMenItem)
ElseIf Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Connection Or _
Tree.Node.GetNodeType(tNode) = Tree.Node.Type.PuttySession Then
tMenItem.Image = Windows.treeForm.imgListTree.Images(tNode.ImageIndex)
tMenItem.Tag = tNode.Tag
toolStripMenuItem.DropDownItems.Add(menuItem)
AddNodeToMenu(treeNode.Nodes, menuItem)
ElseIf Tree.Node.GetNodeType(treeNode) = Tree.Node.Type.Connection Or _
Tree.Node.GetNodeType(treeNode) = Tree.Node.Type.PuttySession Then
menuItem.Image = Windows.treeForm.imgListTree.Images(treeNode.ImageIndex)
menuItem.Tag = treeNode.Tag
menToolStrip.DropDownItems.Add(tMenItem)
toolStripMenuItem.DropDownItems.Add(menuItem)
End If
AddHandler tMenItem.MouseUp, AddressOf ConMenItem_MouseUp
AddHandler menuItem.MouseUp, AddressOf ConnectionsMenuItem_MouseUp
Next
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddNodeToMenu failed" & vbNewLine & ex.Message, True)
MessageCollector.AddExceptionMessage("frmMain.AddNodeToMenu() failed", ex, Messages.MessageClass.ErrorMsg, True)
End Try
End Sub
Private Shared Sub ConMenItem_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Private Shared Sub ConnectionsMenuItem_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = MouseButtons.Left Then
If TypeOf sender.Tag Is Connection.Info Then
App.Runtime.OpenConnection(sender.Tag)
@@ -842,6 +907,15 @@ Public Class frmMain
'Send to the next window
SendMessage(fpChainedWindowHandle, m.Msg, m.LParam, m.WParam)
fpChainedWindowHandle = m.LParam
Case KeyboardHook.HookKeyMsg
If Not m.WParam.ToInt32() = Win32.WM_KEYDOWN Then Exit Select
Select Case KeyboardShortcuts.CommandFromHookKeyMessage(m)
Case ShortcutCommand.PreviousTab
SelectTabRelative(-1)
Case ShortcutCommand.NextTab
SelectTabRelative(1)
End Select
End Select
Catch ex As Exception
End Try
@@ -861,8 +935,43 @@ Public Class frmMain
End If
End Sub
Private Sub pnlDock_ActiveDocumentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles pnlDock.ActiveDocumentChanged
Private Sub pnlDock_ActiveDocumentChanged(ByVal sender As Object, ByVal e As EventArgs) Handles pnlDock.ActiveDocumentChanged
ActivateConnection()
Dim connectionWindow As UI.Window.Connection = TryCast(pnlDock.ActiveDocument, UI.Window.Connection)
If connectionWindow IsNot Nothing Then connectionWindow.UpdateSelectedConnection()
End Sub
Private Sub UpdateWindowTitle()
If InvokeRequired Then
Invoke(New MethodInvoker(AddressOf UpdateWindowTitle))
Return
End If
Dim titleBuilder As New StringBuilder(Application.Info.ProductName)
Const separator As String = " - "
If IsConnectionsFileLoaded Then
If UsingSqlServer Then
titleBuilder.Append(separator)
titleBuilder.Append(Language.strSQLServer.TrimEnd(":"))
Else
If Not String.IsNullOrEmpty(ConnectionsFileName) Then
titleBuilder.Append(separator)
If My.Settings.ShowCompleteConsPathInTitle Then
titleBuilder.Append(ConnectionsFileName)
Else
titleBuilder.Append(Path.GetFileName(ConnectionsFileName))
End If
End If
End If
End If
If Not (SelectedConnection Is Nothing OrElse String.IsNullOrEmpty(SelectedConnection.Name)) Then
titleBuilder.Append(separator)
titleBuilder.Append(SelectedConnection.Name)
End If
Text = titleBuilder.ToString()
End Sub
Public Sub ShowHidePanelTabs(Optional closingDocument As DockContent = Nothing)
@@ -890,6 +999,21 @@ Public Class frmMain
pnlDock.Size = New Size(1, 1)
End If
End Sub
Private Sub SelectTabRelative(ByVal relativeIndex As Integer)
If Not TypeOf pnlDock.ActiveDocument Is UI.Window.Connection Then Return
Dim connectionWindow As UI.Window.Connection = pnlDock.ActiveDocument
Dim tabController As Magic.Controls.TabControl = connectionWindow.TabController
Dim newIndex As Integer = tabController.SelectedIndex + relativeIndex
While newIndex < 0 Or newIndex >= tabController.TabPages.Count
If newIndex < 0 Then newIndex = tabController.TabPages.Count + newIndex
If newIndex >= tabController.TabPages.Count Then newIndex = newIndex - tabController.TabPages.Count
End While
tabController.SelectedIndex = newIndex
End Sub
#End Region
#Region "Screen Stuff"

View File

@@ -1,300 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="imgListPages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="imgListPages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD+
JgAAAk1TRnQBSQFMAgEBCAEAAVABAQFQAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABMAMAAQEBAAEgBgABMP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8ALgAB4gHvAfQB/wGo
AckB1wH/AWcBpAG2Af8BSgGGAZwB/wE1AVwBigH/ATABVwGHAf8BMAFhAZUB/wFDAY4BqwH/AY8BtwHN
Af8B3QHqAfEB/wwAA1cBtwOfAf8DmgH/A5YB/wORAf8DjQH/A4kB/wOEAf8DgAH/A1IB/wNOAf8DSgH/
A0cB/wNDAf8DQAH/A1cBtxgAAw0BEgNWAbYDVgG2Aw0BEWAAAa0BzwHfAf8BQgGRAa0B/wFHAaMBvwH/
AWMBwAHUAf8BlQHZAeYB/wGBAdsB8AH/ATsBxgHsAf8BDwGqAd0B/wEBAZIBxwH/AQ0BgAGsAf8BJAFc
AZIB/wGdAb8B0QH/CAADqAH/A+kB/wPTAf8D0gH/A9EB/wPQAf8DzgH/A80B/wPNAf8DywH/A8sB/wPK
Af8DyQH/A8gB/wPiAf8DQAH/GAADXgHZA+QB/wPjAf8DWAHBMAADQQFyAUwCXwHzAVkCXAHPAUsCTAGQ
AyMBMxwAAUUBhAGbAf8BLwG9AecB/wFSAdMB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/ATsBygHw
Af8BCQG2Ae0B/wEAAacB6AH/AQABoQHhAf8BAAGWAdIB/wEoAUkBZQH/CAADrQH/A9YB/wO6Af8DuAH/
A7UB/wOzAf8DsQH/A7AB/wOtAf8DqwH/A6oB/wOoAf8DpwH/A6YB/wPIAf8DRAH/CAADCwEPA1QBrQM6
AWEDPwFuA2cB+AHiAeEB3wH/AeEB4AHfAf8DXwHzAzwBZwM8AWYDUwGtAwsBDxwAAyEBMAIrAWIB/AGG
Aa0B4QH/AVQBqAHcAf8BNQGSAckB/wEGAUgBqwH/AVUCVgGxAx8BLRQAAUgBhwGeAf8BLgHEAfAB/wFU
AdQB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/ATsBygHwAf8BCQG2Ae0B/wEAAagB6AH/AQABoQHh
Af8BAAGcAdoB/wEpAUoBZwH/CAADsQH/A9kB/wO9Af8DugH/A7gB/wO2Af8DtQH/A7MB/wOwAf8DrwH/
A60B/wOrAf8DqQH/A6gB/wPKAf8DSAH/CAADWgHFBP8ChAGDAf4CgwGCAf4C5wHmAf8B1gHVAdMB/wHX
AdYB1AH/AeMB4gHgAf8DfwH+A6gB/QHpAegB5gH/A1gBwRwAAVQCVgGrAUMBnQHRAf8BmQG8AesB/wFH
AaAB4wH/AZYBuQHqAf8BlAG4AeoB/wE2AZMBygH/AisBXgH8A0MBeBAAAUoBiQGgAf8BLgHEAe8B/wFT
AdQB8QH/AY0B4wH0Af8BogHrAfYB/wGCAd8B8wH/ATwBygHwAf8BCQG2Ae0B/wEAAagB6AH/AQABoQHh
Af8BAAGcAdoB/wErAU0BaQH/CAADtgH/A90B/wPBAf8DvQH/A7wB/wO6Af8DuAH/A7UB/wO0Af8DsgH/
A7AB/wOtAf8DrAH/A6wB/wPPAf8DTAH/CAADZAHnAvkB9wH/Au8B7gH/AtsB2gH/AcoCyQH/AckByAHG
Af8ByQHIAccB/wHJAcgBxwH/AssByQH/AeYB5QHkAf8B5QHkAeIB/wNlAeUYAAMfAS0BKwE2AWYB/AGd
Ab8B7AH/AT8BnAHiAf8BMQGTAd8B/wEuAZEB3wH/ATUBlAHgAf8BlQG4AeoB/wGGAa0B4QH/AR8BgwG7
Af8BSwJMAZAMAAFMAYwBogH/ATABxgHwAf8BVQHUAfEB/wGMAeMB9AH/AaIB6wH2Af8BggHfAfQB/wE8
AcoB8AH/AQkBtgHtAf8BAAGoAegB/wEAAaIB4gH/AQABmwHbAf8BLQFQAYAB/wgAA1oBvQPaAf8DyAH/
A8AB/wO/Af8DvQH/A7oB/wO4Af8DtwH/A7UB/wOzAf8DsAH/A68B/wOzAf8DwgH/A1oBvQgAA04BlQH2
AfUB9AH/AeYB5QHkAf8BvwG+Ab0B/wLrAeoB/wHUAdMB0gH/AdYB1QHUAf8B4gLhAf8CtAGzAf8B1wHW
AdQB/wHiAeEB3wH/A0oBjQwAAysBQgNIAYQBVQJXAbcBTAJfAfMBTAGkAdcB/wGhAcIB7QH/AZ8BwAHt
Af8BnQG/Ae0B/wFKAaMB5AH/ATABkgHfAf8BLgGQAd4B/wFRAacB5gH/AZIBtgHoAf8BGQFVAbcB/wM3
AVoIAAFPAY8BpQH/ATEBxgHwAf8BVQHUAfIB/wGNAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wE7AcoB8AH/
AQkBtgHtAf8BAAGnAegB/wEAAaEB4gH/AQABnAHbAf8BLwFTAYMB/wgAA1oBvQPjAf8D5wH/A+EB/wPg
Af8D4AH/A98B/wPfAf8D3gH/A90B/wPdAf8D3AH/A9sB/wPgAf8D0AH/A1oBvQMLAQ8DVQG1A2QB5wHk
AeMB4gH/AdEB0AHPAf8C8AHvAf8DrgH/A2QB8QNnAfICrAGrAf8C6AHnAf8CywHKAf8B4AHfAd0B/wNh
AeQDVQG1AwsBDwNMAZMBOgGXAc8B/wFRAagB2QH/AY0BtAHiAf8BowHEAe0B/wGnAccB7gH/AToBlwHN
Af8BCgFLAbIB/wE1AZMByQH/AZ8BwAHtAf8BTgGWAaMB/wGeAZYBHgH/AVIBlAGRAf8BjQGzAekB/wFP
AaUB2AH/AVoCXgHYCAABUAGSAagB/wExAcUB8AH/AVYB1AHyAf8BjQHjAfQB/wGiAesB9gH/AYIB3wH0
Af8BOwHKAfAB/wEJAbYB7QH/AQABpwHoAf8BAAGhAeEB/wEAAZwB2wH/ATEBVgGGAf8IAAMpAT8DzgH/
A+wB/wPeAf8D2AH/A9IB/wPMAf8DyAH/A8cB/wPIAf8DywH/A9AB/wPdAf8D6AH/A6QB/wMrAUIDPwFt
AuQB4wH/AdgB1gHVAf8B0gHRAdAB/wHFAcQBwwH/Ae0B7AHrAf8DVwG6CAADXAHNAegB5wHmAf8BtgG1
AbQB/wHWAdUB0wH/AeIB4QHgAf8C4AHfAf8DPAFmAUgCYgH2Aa4BzQHwAf8BsAHPAfAB/wGYAb8B7AH/
AVQBrgHnAf8BqgHKAe8B/wETAVEBuAH/BAABCwFMAbMB/wGiAcMB7QH/AagBlwEHAf8BxAG1ATAB/wGs
AZcBAAH/ATEBkwHfAf8BmAG7AesB/wEAAToBnwH/CAABUwGVAasB/wExAcUB8AH/AVYB1AHyAf8BjQHj
AfQB/wGiAesB9gH/AYMB3wH0Af8BPAHLAfAB/wEJAbUB7QH/AQABpwHoAf8BAAGhAeIB/wEAAZwB2gH/
ATQBWQGIAf8MAANaAb0D4wH/A9sB/wPiAf8BtwHQAbgB/wE6Aa0BPgH/AUwBqgE6Af8BRgGvAT4B/wEs
AaUBOAH/AawBxQGsAf8DwgH/A9EB/wPTAf8DWgG9BAADQgF2AewB6wHoAf8B2gHZAdcB/wHUAdMB0QH/
AcYBxQHEAf8B3gLcAf8DRgF+CAADUAGaAd0B3AHbAf8ByAHGAcUB/wLiAeEB/wLhAd8B/wHuAe0B7AH/
Az8BbwFaAmAB3gGoAckB7QH/AYQBpwHtAf8BLgFAAe0B/wFAAY4B6QH/Aa0BzQHwAf8BQwGdAdIB/wEU
AVIBuQH/AT0BmQHOAf8BpQHFAe4B/wGVAZoBPwH/Aa0BlwEAAf8BnQGXASMB/wE8AZsB4gH/AZgBuwHq
Af8BSAJiAfYIAAFVAZgBrgH/ATEBxQHwAf8BVgHUAfEB/wGNAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wE8
AcoB8AH/AQkBtgHtAf8BAAGoAekB/wEAAaEB4QH/AQABnAHaAf8BNgFbAYoB/wwAAykBPwPRAf8D8wH/
AccB3gHKAf8BOgHJAYUB/wGzAdwBpAH/AecBxwFSAf8B3AG/AUkB/wFMAcwBjwH/ASUBrQE+Af8BuAHQ
AbgB/wPxAf8DrwH/AysBQgQAAy8BSgNgAesDcgH8Ad4B3QHcAf8BywLKAf8B5gLlAf8DYQHhAzIBUAM4
AVwDYAHrAu4B7AH/AcwCywH/AecB5gHlAf8DcgH8A2AB6wMsAUMDUQGcAZIBuQHlAf8BRAFKAfYB/wGB
AYQB9QH/AhYB8AH/AZABuwHrAf8BrgHNAfAB/wGsAcwB8AH/AaoBygHwAf8BhQGyAekB/wE0AakBwQH/
ARoBswGNAf8BLAGoAbYB/wFGAaEB5AH/AZcBugHoAf8DXQHtCAABWAGbAbAB/wEwAcYB8AH/AVYB1AHy
Af8BjQHjAfQB/wGiAesB9gH/AYMB3wH0Af8BPAHKAfAB/wEJAbYB7QH/AQABqAHoAf8BAAGhAeEB/wEA
AZwB2gH/ATkBXwGOAf8QAANaAb0DxAH/AUwBzgGLAf8BmQHkAasB/wGwAcUBMwH/AeoBtQEeAf8B4QGi
AQ8B/wGlAZ0BFgH/AYIBxQGPAf8BHwGaASwB/wOgAf8DWgG9EAADXgHOAeEB4AHeAf8B2QHXAdYB/wG4
ArcB/wHhAeAB3wH/A6gB/QOoAf0C9gH1Af8CwAG/Af8B6gHpAegB/wLzAfIB/wNcAckIAAMjATMBKwFb
AXEB/AGSAaQB9QH/AS8BMAH2Af8BJwGGAfQB/wERAaYB+wH/ATIBqwHyAf8BVAGvAecB/wFRAa0B5wH/
AU4BqgHmAf8BFQG2AYAB/wE2AcgBlwH/AREBtwFQAf8BUwGsAecB/wGPAbUB4wH/AVoCXgHVCAABWwGf
AbMB/wEwAcYB8AH/AVQB1AHxAf8BjAHjAfQB/wGiAesB9gH/AYMB3wH0Af8BPAHKAfAB/wEJAbYB7QH/
AQABpwHoAf8BAAGhAeEB/wEAAZsB2gH/ATsBYgGQAf8YAAFYAXQBYwH8AaIB6QGVAf8B1gHPAT8B/wHi
AbMBHQH/AdEBuwElAf8BwgGuARgB/wGCAb0BQgH/ASsBaQFAAfwYAANMAZEB4wHiAeAB/wLeAdwB/wHh
AeAB3wH/AcwCywH/AcQBwwHCAf8CzwHOAf8C3gHdAf8C8AHvAf8C8AHvAf8C9gH1Af8DSAGHDAADSQGH
AYYBrwHhAf8BuQHXAfMB/wEIAaYB/gH/AUIBvwL/AQEBowL/ATwBvgHwAf8BEAHOAfsB/wEwAb4B8QH/
ASgBswGgAf8BEQG3AU8B/wEdAbMBkAH/AacByAHuAf8BTQGlAdYB/wFPAlEBnAgAAVwBoQG1Af8BVgHV
AfQB/wGaAegB9wH/AbUB8wH6Af8BwgH4AfwB/wHDAfgB/QH/AcEB9wH9Af8BrwHwAfsB/wGPAeIB9wH/
AVUB0AHwAf8BKQG4AeUB/wE+AWUBkwH/GAABWgF0AWQB/AGiAfABnwH/AdgB7QGvAf8B3gHFAT4B/wG0
AeIBOwH/ATYB5wEPAf8BQQHXAUEB/wErAWsBVQH8FAADAQECA18B4wHlAeQB4QH/Au4B7QH/Au4B7QH/
AusB6gH/AeMB4gHhAf8C6AHnAf8C6gHpAf8C8wHyAf8C9QH0Af8B+gH5AfgB/wNcAd8MAAMEAQYDUQGf
AYUBrgHhAf8BMAGyAfkB/wEBAaMC/wEWAakB+wH/AQYB0wH+Af8BQgHiAv8BAQHVAv8BVQGwAegB/wFS
Aa0B5wH/AakBygHvAf8BpQHFAe0B/wErAT4BaAH8AyEBMAgAAV8BowG4Af8BxQH5Af0B/wHFAfkB/QH/
AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5
Af0B/wFAAWgBlQH/GAADYQHcAcgB9wHUAf8B2AH2AcoB/wHnAeMBqQH/AdsBzwFCAf8BrwHcAT4B/wGd
AeoBqwH/A18B4BgAA0ABbwN/Af4DZAHnA18B8wHoAecB5gH/AecB5gHlAf8C7QHsAf8C+wH6Af8DZwHy
A2QB5wN/Af4DPQFoFAADQgF1AV8CYgH2AY4BtgHjAf8BuQHXAfMB/wEzAdUB+wH/AQAB1QL/ARcB0QH7
Af8BswHSAfIB/wGxAdAB8QH/AZIBuAHiAf8BOAGVAcwB/wNKAYoMAAG3AdcB4QH/AYwBvQHMAf8BnQHP
AdsB/wGtAd8B6AH/AbkB7AHzAf8BwgH1AfoB/wHCAfUB+gH/AbgB6wHxAf8BqQHaAeMB/wGUAcQB0QH/
AWYBqAG4Af8BqQHFAdEB/xgAAy0BRQFNAXABZwH6AdsB+AHpAf8B5wHyAdgB/wHtAeUBswH/Ad8B2QGm
Af8BXwF/AV8B+wMyAVAgAAMPARQDCgEOA1MBqgHvAe4B7QH/AvQB8wH/A1IBpAMIAQsDEQEXIAADFgEe
A1QBrgFMAaMB3AH/AZEBuAHkAf8BqAHKAewB/wGlAccB7AH/AY0BtQHiAf8BPgGaAdIB/wFaAl8B2wMx
AU4QAAL+Av8B4wHxAfQB/wG5AdcB4QH/AZUBvgHMAf8BZgGoAbsB/wFZAZsBsAH/AVUBmAGtAf8BXgGh
AbMB/wGMAbIBwgH/AbEBzQHXAf8B3wHrAe8B/wP+Af8cAAMuAUcDXgHZAV4BdAFiAfwBXgFzAV4B/ANe
Ad0DMgFQLAADLwFKA10B8ANiAe8DLAFDMAADKwFCA0wBkAFbAl0B0gFZAlwBzwNOAZkDLQFFHAADEQEX
A1YBswFTAVQBUwGstAADBAEFAxABFQMfAS0DKQE/Ay8BSQMuAUgDKAE9Ax4BKwMPARQDAwEEEAADtwH/
AZwBqAGeAf8BAAFNASgB/wESAZIBSgH/AQABUQEoAf8BAAE+AaAB/wEAATwBngH/AQABOQGbAf8BAAE3
AZkB/wEAATUBlwH/AQABMgGUAf8BAAExAZMB/wNCAf8DQgH/CAABVwFQAU0BjwFwAWABVQG1AaQBcgFU
Ae4BuQF2AVAB/wG1AXQBTgH/AbMBcwFOAf8BsAFxAU0B/wGsAW8BTAH/AakBbgFMAf8BpwFsAUsB/wGm
AWsBSgH/AaABbQFMAf4BlQFoAVEB8QF1AWEBVAHETAADBQEHAx8BLAI+AT0BagJSAVABowFbAlkBxAFd
AloB0wFdAloB0wFbAlkBwwFSAlEBoQM8AWYDHAEoAwQBBgwAAxUBHQNRAaIBFwGVAU4B/wGCAb4BqgH/
ASYBpQGCAf8BBwGXAUAB/wEKAZkBRQH/AQ4BmQFJAf8BEgGdAU4B/wFMAaoB0gH/AUoBqAHRAf8BAAEz
AZUB/xAAAZYBcgFVAd4w/wGSAWkBUAHtSwABAQMSARgDPgFrAV0CWQHXAUYCKwH8AawBIwEAAf8B4QFD
ARcB/wHkAVUBKwH/AdMBQQEPAf8BowJAAf0BYQJeAdoCPgE9AWoDDwEUCAADGAEiAVABUgFQAaQDVgGz
AUMBrAGfAf8BSgG3AZ4B/wFUAbsBrAH/AVQBuwGuAf8BVQG7AbAB/wGAAbwBswH/AQ0BmgFRAf8BKgGV
AccB/wFNAasB0wH/AQABNgGYAf8QAAG8AX8BVwH+BP8BrgFkASkB/wGsAWEBKAH/AawBYQEoBf8BUwGq
AVoB/wFOAaUBVAH/AUkBoAFPAf8BRAGbAUkB/wFBAZcBRgH/AT0BkwFCBf8BoQFuAU0B/kwAAxsBJgNZ
AdIBEwIAAf8BigEyARoB/wHKAYYBPAH/AfYBvAGcAf8B+QHMAbcB/wHjAaABTgH/AbEBTQEzAf8BTwEp
AQoB/wFeAlgB3QMcASgIAAFVAVYBVQGxA1YBswNWAbMBMgGkAZEB/wFFAbYBmwH/AT4BsgGbAf8BQAGy
AZ4B/wFCAbMBoQH/AYUBvwG2Af8BFAGeAYIB/wEvAZkByQH/AVEBrQHUAf8BAAE6AZwB/xAAAcMBhQFX
Bf8BrgFkASkB/wHNAZ4BcQH/AawBYQEoBf8BSAGeAU0B/wFtAckBeAH/AW0ByQF4Af8BbAHIAXcB/wFr
AccBdQH/ATsBkgFABf8BpwFuAUwB/wQAA50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/
A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wgAAVMCTwGlASoBDwEAAf8BTwE6ASUB/wGPAUwBNwH/
AawBiAFBAf8BwgGjAYgB/wHBAaUBjgH/AbMBmAGBAf8BkQFMATYB/wFKATEBHAH/ATkBEgEAAf8BVgJV
AbEIAAMIAQsDVQGyA1YBswFMAbIBqAH/AVMBvQGnAf8BhwHBAbUB/wGGAcEBtgH/AYcBwQG3Af8BiAHB
AbkB/wEaAaIBiAH/ATQBnAHLAf8BVQGwAdUB/wEAAT0BnwH/EAABxAGFAVgF/wGuAWQBKQH/Ac0BnwFy
Af8BrAFhASgF/wFLAaIBUQH/AXABygF6Af8BbwHKAXoB/wFuAckBeQH/AWwByAF3Af8BPgGUAUMF/wGr
AW8BTQH/BAADnQH/AboCvQH/AeYC7AH/AeYC7QH/AecC7QH/AegC7gH/AekC7wH/AekC7wH/AeoC7wH/
AeoC8AH/AesC8AH/AesC8QH/AewC8QH/AewC8QH/Ab0CvwH/A50B/wQAAzkBXwFLASsBEAH/AcMBsQGi
Af8BtgGcAYMB/wGmAU8BIgH/AagBTQEfAf8BwwGkAYcB/wHYAcYBsAH/Ab0BqQGLAf8BVQE1ARUB/wEy
ARIBAAH/ASgBBAEAAf8BLwEIAQAB/wMzAVMIAAMGAQgDVQGyASUBoAGKAf8BkwHJAboB/wE1Aa8BlwH/
ARoBogGDAf8BGwGjAYcB/wEdAaQBiwH/ARwBqgGSAf8BKgHCAe0B/wGBAbQB1wH/AQABQQGjAf8QAAHH
AYcBVwX/AbMBawEwAf8B0AGkAXsB/wGxAWkBKwX/AU0BpAFTAf8BcQHLAXsB/wFwAcsBegH/AW8BygF5
Af8BbQHJAXgB/wFBAZgBRgX/AbEBcwFOAf8IAANcAeoB2wLiAf8BzQLPAf8DywH/A8wB/wPOAf8DzwH/
A9AB/wPSAf8D0wH/A9UB/wHXAtgB/wHnAuwB/wNtAfcEAAMiATEBVgJVAbEBPQERAQAB/wGqAYUBNQH/
AbIBSAEGAf8BrQElAQAB/wG6AUIBAAH/AeoB1QG/Af8B/QH8AfoB/wHWAb4BpgH/AZABNQECAf8BOAEG
AQAB/wE5ARYBAAH/ATIBEgEAAf8DVwHFAxwBJwgAAwQBBgELAZQBTQH/AUQBuQGeAf8BHwGmAYkB/wFP
AbEB1QH/AUsBrQHUAf8BRwGrAdIB/wE1AboB5AH/AQABmQE/Af8BAAGOAS4B/wEAAUYBmgH/EAAByAGJ
AVgF/wG2AXMBPQH/AdEBpQGCAf8BtQFwATUF/wFPAacBVgH/AXABywF6Af8BcAHLAXoB/wFvAcoBeQH/
AW0ByQF4Af8BRAGbAUoF/wG1AXUBUAH/CAADXAHqAdkC4QH/AcsCzAH/A8cB/wPIAf8DygH/A8sB/wPN
Af8DzgH/A9AB/wPRAf8B0wLUAf8B5QLrAf8DbQH3BAADLgFHA1kB7AE4AQYBAAH/AZkBJQEAAf8BuAE9
AQAB/wHCATkBAAH/AckBSwEAAf8B5gG/AZQB/wHsAdQBtgH/Ac0BnAE4Af8BqAFCAQIB/wGZAUMBFwH/
AaMBjAFIAf8BVQE8ASUB/wJRAT8B9wE1AjQBVQwAAS4BjgHEAf8BKAGsAYsB/wElAaoBjwH/AVQBtQHY
Af8BUAGyAdYB/wFNAa8B1QH/AUkBrAHTAf8BAAGQATgB/wEvAagBhAH/AQABTgEpAf8DFAEbDAABygGL
AVkF/wG7AXwBUQH/AbkBegFJAf8BuQF5AUcF/wFDAZoBSQH/AVABpwFWAf8BTgGlAVQB/wFMAaMBUgH/
AUoBoQFQAf8BRwGeAU0F/wG4AXkBUQH/CAADXAHqAdcC3wH/AccCyQH/A8IB/wPEAf8DxQH/A8gB/wPJ
Af8DygH/A8wB/wPNAf8B0ALRAf8B4wLqAf8DbQH3BAADOQFfAkABLQH9AUoBEQEAAf8BrgEvAQAB/wHA
ATcBAAH/AecBlgEcAf8B6AGyAVAB/wHkAbEBUAH/AdIBiQEPAf8BvQE8AQAB/wGoASoBAAH/AbgBjQEz
Af8B1AHDAbIB/wGYAYQBRAH/ATEBEwEAAf8BPgI9AWoMAAE0AZEByQH/AaQBzAHkAf8BhwG7AdsB/wEV
AaEBUAH/AQ8BnAFKAf8BCgGaAUYB/wEFAZYBQAH/ASEBowGBAf8BhAHAAasB/wEYAZYBTwH/A1EBogMV
AR0IAAHGAYgBXAH+MP8BuwF7AVIB/wgAA1wB6gHWAt8B/wHDAsUB/wPAAf8DwAH/A8IB/wPDAf8DxAH/
A8UB/wPIAf8DyQH/A80B/wHgAugB/wNtAfcEAAM3AVoCTQEoAfoBgwEcAQAB/wHLAUYBAAH/AeUBiwET
Af8B/gG2AUgC/wHjAcIB/wH0AbwBhQH/AdYBTQEAAf8BxQFEAQAB/wG6ATkBAAH/Aa8BTQEPAf8BrgGI
ATMB/wGUAUwBMwH/ATIBFAEAAf8DPAFmDAABOQGVAc0B/wGoAc8B5QH/AYwBvwHdAf8BGwGlAYEB/wGN
AcUBuAH/AYkBwwG0Af8BhgHBAbEB/wGEAb8BrwH/AU0BuQGfAf8BRAGtAaAB/wNWAbMBUAFSAVABpAMY
ASIEAAHBAYgBWAH6BP8B7QHDAZoB/wHtAcMBmgH/Ae0BwwGaAf8B7QHDAZoB/wHtAcMBmgH/Ae0BwwGa
Af8B7QHDAZoB/wHtAcMBmgH/Ae0BwwGaAf8B7QHDAZoF/wG9AYABVAH/CAADYAHWAccCzQH/AdsC5AH/
AdsC5AH/AdsC5QH/AdwC5QH/AdwC5QH/Ad0C5gH/Ad0C5gH/Ad4C5wH/Ad8C6AH/AeAC6AH/Ac0C0wH/
A18B4wQAAyYBOQFgAloB3gGOASQBAAH/AewBngEpAf8B/gG/AYUC/wHMAaEC/wHfAbsB/wH+AcIBVQH/
AeIBjgEfAf8B0wGEARAB/wHKAU8BAgH/AbUBRgEAAf8BlwE3AQAB/wGBATQBDwH/A1kB7AMuAUgMAAE9
AZgB0AH/AasB0QHnAf8BkAHCAd8B/wEiAakBiAH/AZEByQG7Af8BTAG6AaUB/wFIAbgBoQH/AUQBtgGe
Af8BSAG4AZ0B/wEzAaUBkgH/A1YBswNWAbMBVQFWAVUBsQQAAbYBhwFdAfAE/wHtAcMBmwH/AfQB2gHA
Af8B9AHaAcAB/wH0AdsBwQH/AfQB2wHBAf8B9AHbAcEB/wH0AdsBwQH/AfQB2wHBAf8B9AHbAcEB/wHt
AcMBmgX/AbsBfwFXAf4IAAMsAUMDWwHIA50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/
A50B/wNeAd0DMQFOBAADCQEMA0sBjgHAAUQBAwL/AbwBVQH/AfoBzgGnAf8B+AHbAb4C/wHiAcYC/wG+
AYYB/wH0AawBSwH/AewBwgGaAf8B4gG1AYsB/wG4AUsBCQH/AZ0BOgECAf8BiAE6ARYB/wNPAaUDEAEV
DAABQQGbAdMB/wGuAdQB6AH/AasB0wHoAf8BLwGxAZAB/wGbAc4BwAH/AZkBzQG9Af8BlgHLAbsB/wGV
AcoBuQH/AYABvwGoAf8BTQGzAakB/wNWAbMDVQGyAwgBCwQAAZcBegFeAdgE/wHtAcMBmwH/Ae0BwwGb
Af8B7QHDAZsB/wHtAcMBmgH/Ae0BwwGaAf8B7QHDAZoB/wHtAcMBmgH/Ae0BwwGaAf8B7QHDAZoB/wHt
AcMBmgX/AbsBhAFcAfhIAAMTARoCZAFTAfEB2AGeAUgB/wHnAdMBwAH/AfwB9QHuAv8B+AHrAv8B5QHC
Af8B9gG5AYIB/wHyAdIBuAH/Ae4B0gG2Af8BwgGGASQB/wGnAUwBHQH/Ak0BKQH6Ax0BKRAAAUQBnQHV
Af8BQgGbAdMB/wE/AZoB0gH/AR8BoQGMAf8BGgGfAYoB/wEXAZ0BhQH/ARMBmQGAAf8BLAGlAZIB/wFV
AbgBsQH/ASYBoQGLAf8DVQGyAwYBCAgAAWEBWQFSAZsw/wHWAakBiAH/TAADNQFXAakBOAEKAf8BygG4
AagG/wH+AfwC/wH2AeIB/wH7AcUBoAH/AeQBuQGVAf8B2wGsAVMB/wHDAY4BMgH/AZMBOgEOAf8BPgI9
AWowAAFTAlQBrANWAbMDVgGzAwQBBgwAAUYBQwFBAXEBWQFTAU4BkAGLAXMBXAHMAc4BkgFcAf8ByAGN
AV4B/gHNAZEBXAH/AcwBjwFcAf8BzQGRAV4B/wHNAZIBYAH/AcsBkAFeAf8BsAGDAVsB7wGJAXIBXgHL
AdgBrQGKAf8B1wGrAYoB/1AAAzIBUQJkAVkB7AHQAbIBlQH/AewB4AHZAf8B5gHVAcQB/wHTAbABlAH/
AdMBpgFNAf8BywGPASsB/wFnAWUBWQHyAToCOQFgNAABUwJUAawDVgGzAwQBBpwAAxEBFwNEAXoCWgFX
AcUCZQFeAeUCYQFYAeYCXAFZAckCSAFHAYMDFQEdEAABQgFNAT4HAAE+AwABKAMAAUADAAEwAwABAQEA
AQEFAAGAAQEWAAP/gQAB4AEHAgAB/AE/Av8BwAEDAgAB/AE/AfwBHwHAAQMCAAHAAQMB+AEHAcABAwIA
AcABAwH4AQMBwAEDAgABwAEDAfABAQHAAQMCAAHAAQMBgAEAAcABAwYAAcABAwIAAQEBgAEBAQABwAED
AYACAQGAAgABwAEDAYABAQQAAcABAwHAAQMBwAEDAgABwAEDAfABDwHAAQMBgAEAAcABAwHwAQ8BgAED
AYABAAHAAQMB8AEPAcABAwHgAQEBwAEDAfABDwHwAQ8B8AEDAcABAwH4AR8B/AE/AfwBDwHjBf8B4AEH
AYABAQGAAQEC/wHAAQMBgAEHAYABAQL/AYABAwEAAQcBgAEBAv8BwAEDAQABBwGAAQECAAHAAQMBAAEH
AYABAQIAAYABAQGAAQcBgAEBAYABAQIAAcABBwGAAQEBgAEBAgAB4AEDAYABAQGAAQECAAHgAQEBgAEB
AYABAQIAAeABAAGAAQEBgAEBAgAB4AEAAYABAQGAAQECAAHgAQABgAEBAv8BgAEBAeABAQGAAQEC/wHA
AQMB/wHDAYABAQL/AeABBwH/AccE/wHwAQ8L
</value>
</data>
<metadata name="dlgColor.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>140, 17</value>
</metadata>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -1,172 +0,0 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frmPassword
Inherits System.Windows.Forms.Form
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.txtPassword = New System.Windows.Forms.TextBox
Me.txtVerify = New System.Windows.Forms.TextBox
Me.lblPassword = New System.Windows.Forms.Label
Me.lblVerify = New System.Windows.Forms.Label
Me.btnOK = New System.Windows.Forms.Button
Me.btnCancel = New System.Windows.Forms.Button
Me.lblStatus = New System.Windows.Forms.Label
Me.pbLock = New System.Windows.Forms.PictureBox
Me.pnlImage = New System.Windows.Forms.Panel
CType(Me.pbLock, System.ComponentModel.ISupportInitialize).BeginInit()
Me.pnlImage.SuspendLayout()
Me.SuspendLayout()
'
'txtPassword
'
Me.txtPassword.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtPassword.Location = New System.Drawing.Point(95, 22)
Me.txtPassword.Name = "txtPassword"
Me.txtPassword.Size = New System.Drawing.Size(184, 20)
Me.txtPassword.TabIndex = 0
Me.txtPassword.UseSystemPasswordChar = True
'
'txtVerify
'
Me.txtVerify.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtVerify.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.txtVerify.Location = New System.Drawing.Point(95, 61)
Me.txtVerify.Name = "txtVerify"
Me.txtVerify.Size = New System.Drawing.Size(184, 20)
Me.txtVerify.TabIndex = 1
Me.txtVerify.UseSystemPasswordChar = True
'
'lblPassword
'
Me.lblPassword.AutoSize = True
Me.lblPassword.Location = New System.Drawing.Point(87, 6)
Me.lblPassword.Name = "lblPassword"
Me.lblPassword.Size = New System.Drawing.Size(56, 13)
Me.lblPassword.TabIndex = 2
Me.lblPassword.Text = My.Language.strLabelPassword
'
'lblVerify
'
Me.lblVerify.AutoSize = True
Me.lblVerify.Location = New System.Drawing.Point(87, 45)
Me.lblVerify.Name = "lblVerify"
Me.lblVerify.Size = New System.Drawing.Size(36, 13)
Me.lblVerify.TabIndex = 3
Me.lblVerify.Text = My.Language.strLabelVerify
'
'btnOK
'
Me.btnOK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.btnOK.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.btnOK.Location = New System.Drawing.Point(210, 101)
Me.btnOK.Name = "btnOK"
Me.btnOK.Size = New System.Drawing.Size(69, 23)
Me.btnOK.TabIndex = 4
Me.btnOK.Text = My.Language.strButtonOK
Me.btnOK.UseVisualStyleBackColor = True
'
'btnCancel
'
Me.btnCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.btnCancel.Location = New System.Drawing.Point(135, 101)
Me.btnCancel.Name = "btnCancel"
Me.btnCancel.Size = New System.Drawing.Size(69, 23)
Me.btnCancel.TabIndex = 5
Me.btnCancel.Text = My.Language.strButtonCancel
Me.btnCancel.UseVisualStyleBackColor = True
'
'lblStatus
'
Me.lblStatus.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lblStatus.ForeColor = System.Drawing.Color.OrangeRed
Me.lblStatus.Location = New System.Drawing.Point(90, 84)
Me.lblStatus.Name = "lblStatus"
Me.lblStatus.Size = New System.Drawing.Size(189, 14)
Me.lblStatus.TabIndex = 6
Me.lblStatus.Text = "Status"
Me.lblStatus.TextAlign = System.Drawing.ContentAlignment.TopRight
Me.lblStatus.Visible = False
'
'pbLock
'
Me.pbLock.Image = Global.mRemoteNG.My.Resources.Resources.Lock
Me.pbLock.Location = New System.Drawing.Point(7, 8)
Me.pbLock.Name = "pbLock"
Me.pbLock.Size = New System.Drawing.Size(64, 64)
Me.pbLock.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
Me.pbLock.TabIndex = 7
Me.pbLock.TabStop = False
'
'pnlImage
'
Me.pnlImage.Controls.Add(Me.pbLock)
Me.pnlImage.Location = New System.Drawing.Point(9, 6)
Me.pnlImage.Name = "pnlImage"
Me.pnlImage.Size = New System.Drawing.Size(100, 100)
Me.pnlImage.TabIndex = 8
'
'frmPassword
'
Me.AcceptButton = Me.btnOK
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.CancelButton = Me.btnCancel
Me.ClientSize = New System.Drawing.Size(289, 133)
Me.ControlBox = False
Me.Controls.Add(Me.txtVerify)
Me.Controls.Add(Me.txtPassword)
Me.Controls.Add(Me.lblStatus)
Me.Controls.Add(Me.lblVerify)
Me.Controls.Add(Me.lblPassword)
Me.Controls.Add(Me.pnlImage)
Me.Controls.Add(Me.btnCancel)
Me.Controls.Add(Me.btnOK)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "frmPassword"
Me.ShowIcon = False
Me.ShowInTaskbar = False
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
Me.Text = My.Language.strTitlePassword
CType(Me.pbLock, System.ComponentModel.ISupportInitialize).EndInit()
Me.pnlImage.ResumeLayout(False)
Me.pnlImage.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents txtPassword As System.Windows.Forms.TextBox
Friend WithEvents txtVerify As System.Windows.Forms.TextBox
Friend WithEvents lblPassword As System.Windows.Forms.Label
Friend WithEvents lblVerify As System.Windows.Forms.Label
Friend WithEvents btnOK As System.Windows.Forms.Button
Friend WithEvents btnCancel As System.Windows.Forms.Button
Friend WithEvents lblStatus As System.Windows.Forms.Label
Friend WithEvents pbLock As System.Windows.Forms.PictureBox
Friend WithEvents pnlImage As System.Windows.Forms.Panel
End Class

View File

@@ -1,110 +0,0 @@
Public Class frmPassword
Public ReadOnly Property Username() As String
Get
Return txtPassword.Text
End Get
End Property
Public ReadOnly Property Password() As String
Get
If _Verify = True Then
Return txtVerify.Text
Else
Return txtPassword.Text
End If
End Get
End Property
Private _Verify As Boolean = True
Public Property Verify() As Boolean
Get
Return _Verify
End Get
Set(ByVal value As Boolean)
_Verify = value
End Set
End Property
Private _UserAndPass As Boolean = False
Public Sub New(Optional ByVal UserAndPass As Boolean = False, Optional ByVal title As String = "Security")
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Me.Text = title
If UserAndPass = True Then
_UserAndPass = True
lblPassword.Text = "Username:"
lblVerify.Text = "Password:"
txtPassword.UseSystemPasswordChar = False
txtVerify.UseSystemPasswordChar = True
End If
End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
Me.DialogResult = Windows.Forms.DialogResult.Cancel
End Sub
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
If Verify = True And _UserAndPass = False Then
If VerifyOK() Then
Me.DialogResult = Windows.Forms.DialogResult.OK
End If
Else
Me.DialogResult = Windows.Forms.DialogResult.OK
End If
End Sub
Private Function VerifyOK() As Boolean
If txtPassword.Text.Length >= 3 Then
If txtPassword.Text = txtVerify.Text Then
Return True
Else
lblStatus.Visible = True
lblStatus.Text = "Passwords don't match!"
Return False
End If
Else
lblStatus.Visible = True
lblStatus.Text = "3 characters is minimum!"
Return False
End If
End Function
Private Sub frmPassword_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ApplyLanguage()
If Verify = False Then
Me.Height = 124
Me.lblVerify.Visible = False
Me.txtVerify.Visible = False
End If
End Sub
Private Sub ApplyLanguage()
lblPassword.Text = My.Language.strLabelPassword
lblVerify.Text = My.Language.strLabelVerify
btnOK.Text = My.Language.strButtonOK
btnCancel.Text = My.Language.strButtonCancel
lblStatus.Text = "Status"
Text = My.Language.strTitlePassword
End Sub
Private Sub txtPassword_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtPassword.GotFocus
If Me.txtPassword.TextLength > 0 Then
Me.txtPassword.SelectionStart = 0
Me.txtPassword.SelectionLength = Me.txtPassword.TextLength
End If
End Sub
Private Sub txtVerify_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtVerify.GotFocus
If Me.txtVerify.TextLength > 0 Then
Me.txtVerify.SelectionStart = 0
Me.txtVerify.SelectionLength = Me.txtVerify.TextLength
End If
End Sub
End Class

View File

@@ -1,113 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>External Applications</title>
<link href="Main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<p>
<span class="heading1">Introduction to External Applications</span></p>
<p>
External applications can help you get things done that can&#39;t be done in
mRemote.<br />
You can for example start a CMD Console or launch your favorite FTP tool from
within mRemote.<br />
This wouldn&#39;t make much sense by itself because you can already launch your
applications by using the Windows Start Menu, Quick Launch or whatever you
prefer to use
to start your apps.</p>
<p>
But there&#39;s more!</p>
<p>
In mRemote you can launch applications and tell them what to do with the use of
arguments (parameters) and variables of the currently selected Connection.<br />
You can for example select your home router&#39;s SSH Connection entry and do a
traceroute (tracert) on that host.</p>
<p>
This is much more comfortable and powerful than opening the console and typing
tracert YourHost.</p>
<p class="heading4">
Notes:</p>
<ul>
<li>Throught this document I will refer to External Applications as Ext. apps or
Ext. app.</li>
<li>Ext. apps are stored in c:\documents and settings\username\local
settings\application data\Felix_Deimel\mRemote\extApps.xml</li>
</ul>
<p>
<span class="heading1">Variables</span></p>
<p>
Variables and arguments can be used to tell the ext. app what to do.<br />
Here&#39;s a list of variables currently supported by mRemote:</p>
<ul>
<li>%Name%</li>
<li>%Hostname%</li>
<li>%Port%</li>
<li>%Username%</li>
<li>%Password%</li>
<li>%Domain%</li>
<li>%Description%</li>
<li>%MacAddress%</li>
<li>%UserField%</li>
</ul>
<p>
The variables always refer to the currently selected Connection.</p>
<p>
<span class="heading1">Example</span></p>
<p>
First of all start the Ext. Apps management interface. To do this click Tools in the main menu and
select External Applications.<br />
You will see a screen like on the following screenshot.</p>
<p>
<img alt="" src="Screenshots/External%20Apps/01.png" /></p>
<p>
The fields below the list are greyed out because you haven&#39;t created a Ext. App
entry yet.<br />
To create one right click the blank area in the list and select Add like in the
screenshot below.</p>
<p>
<img alt="" src="Screenshots/External%20Apps/02.png" /></p>
<p>
This is what you&#39;ll get:</p>
<p>
<img alt="" src="Screenshots/External%20Apps/03.png" /></p>
<p>
So the three fields are now available and need to be filled.<br />
The Display Name is simply the name you will see when you want to launch that
application, so give it a descriptive name.<br />
I named mine Traceroute as I will create a Ext. App launcher that will do a
tracert command in the console.</p>
<p>
<img alt="" src="Screenshots/External%20Apps/04.png" /></p>
<p>
Ok, the next thing we&#39;ll need is a filename. This is the application that we
want to be executed.<br />
I simply type in cmd for a windows cmd console.</p>
<p>
<img alt="" src="Screenshots/External%20Apps/05.png" /></p>
<p>
Now the fun part comes in - the arguments.<br />
The windows cmd has a command line argument that tells the console to launch the
command followed by that argument and stay open.<br />
It&#39;s /K. (There&#39;s also /C, this is useful when you want the console to close
after the command was executed)<br />
In this case I&#39;ll use /K as I want to scan through the result when the command
completes.<br />
After that I just type tracert %HostName%. This tells the console to do a
traceroute on the hostname of the currently selected Connection.</p>
<p>
<img alt="" src="Screenshots/External%20Apps/06.png" /></p>
<p>
Alright! That&#39;s all we&#39;ll need.<br />
Now right click one of you connections, click Tools, External Applications
and select Traceroute.</p>
<p>
<img alt="" src="Screenshots/External%20Apps/07.png" /></p>
<p>
Voil<69>! A console window will popup and execute your tracert command.</p>
<p>
<img alt="" src="Screenshots/External%20Apps/08.png" /></p>
</body>
</html>

View File

@@ -0,0 +1,245 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>External Tools</title>
<link href="Main.css" rel="stylesheet" type="text/css" />
<style type="text/css">
.style1
{
white-space: nowrap;
font-family: 'Courier New', monospace;
height: 25px;
}
</style>
</head>
<body>
<p>
<span class="heading1">Introduction to External Tools</span></p>
<p>
External Tools can help you get things done that can&#39;t be done in
mRemoteNG.<br />
You can for example start a command prompt or launch your favorite FTP tool from
within mRemoteNG.<br />
This wouldn&#39;t make much sense by itself because you can already launch your
applications by using the Windows Start Menu, Quick Launch or whatever you
prefer to use
to start your apps.</p>
<p>
But there&#39;s more!</p>
<p>
In mRemoteNG, you can launch applications and tell them what to do with the use of
arguments (parameters) and variables of the currently selected Connection.
You can, for example, select your home router&#39;s SSH Connection entry and do a
traceroute (tracert) on that host.
This is much quicker and more powerful than opening the console and typing
&quot;tracert yourhost&quot;.</p>
<p>
The external tools configuration is stored in %APPDATA%\mRemoteNG\extApps.xml</p>
<p>
<span class="heading1">Variables</span>
</p>
<p>
Variables and arguments can be used to tell the external tool what to do.</p>
<p>
This is the list of variables supported by mRemoteNG:
</p>
<ul>
<li>%NAME%</li>
<li>%HOSTNAME%</li>
<li>%PORT%</li>
<li>%USERNAME%</li>
<li>%PASSWORD%</li>
<li>%DOMAIN%</li>
<li>%DESCRIPTION%</li>
<li>%MACADDRESS%</li>
<li>%USERFIELD%</li>
</ul>
<p>
Variables always refer to the currently selected connection. Variable names are case-insensitive.
Variables can be used in both the Filename and Arguments fields.</p>
<p>
mRemoteNG will also expand environment variables such as %PATH% and
%USERPROFILE%.
If you need to use an environment variable with the same name as an mRemoteNG
variable, use \% instead of %. The most common use of this is for the USERNAME
environment variable. %USERNAME% will be expanded to the username set in the
currently selected connection. \%USERNAME\% will be expanded to the value set in
the USERNAME environment variable.</p>
<p>If you need to send a variable name to a program without mRemoteNG expanding it,
use ^% instead of %. mRemoteNG will remove the caret (^) and leave the rest
unchanged. For example, ^%USERNAME^% will be sent to the program as %USERNAME%
and will not be expanded.</p>
<p>
<span class="heading1">Special Character Escaping</span>
</p>
<p>
Expanded variables will be escaped using the rules below. There are two levels
of escaping that are done. The first is escaping for standard argument splitting
(C/C++ argv, CommandLineToArgvW, etc). The second is escaping shell
metacharacters for ShellExecute.</p>
<p>
<span class="heading2">Argument splitting escaping:</span></p>
<ul>
<li>Each quotation mark will be escaped by a backslash.</li>
<li>One or more backslashes (\) followed by a quotation mark ("):
<ul>
<li>Each backslash will be escaped by another backslash.</li>
<li>The quotation mark will be escaped by a backslash.</li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the connection's user field contains
&quot;This&quot; is a \"test\&quot;.<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Then %USERFIELD% is replaced with
\&quot;This\&quot; is a \\\&quot;test\\\&quot;.
</ul>
</li>
<li>A variable name followed by a quotation mark (for example, %USERFIELD%&quot;) with
a value ending in one or more backslashes:
<ul>
<li>Each backslash will be escaped by another backslash.</li>
<li>Example:</li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the connection's user field contains c:\Example\<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Then "%USERFIELD%" is replaced with "c:\Example\\"
</ul>
</li>
</ul>
<p>
To disable
argument splitting escaping for a variable, precede its name with a minus (-)
sign. For example, %-USERFIELD%.</p>
<p>
<span class="heading2">Shell metacharacter escaping:</span></p>
<ul>
<li>The shell metacharacters are ( ) % ! ^ &quot; &lt; &gt; &amp; |</li>
<li>Each shell metacharacter will be escaped by a caret (^).</li>
</ul>
<p>
To disable both argument splitting and shell metacharacter escaping for a
variable, precede its name with an exclamation point (!). For example,
%!USERFIELD%. This is not recommended and may cause unexpected results.</p>
<p>
Only variables that have been expanded will be escaped. It is up to you to
escape the rest of the arguments.</p>
<p>
<span class="heading1">Variable Examples</span></p>
<table>
<tr><th>Arguments</th><th>User Field</th><th>Result</th></tr>
<tr>
<td class='monospace'>%USERFIELD%</td><td class='monospace'>&quot;Example&quot; Text</td><td class='monospace'>
\^&quot;Example\^&quot; Text</td>
</tr>
<tr>
<td class='monospace'>%-USERFIELD%</td><td class='monospace'>&quot;Example&quot; Text</td><td class='monospace'>
^&quot;Example^&quot; Text</td>
</tr>
<tr>
<td class='monospace'>%!USERFIELD%</td><td class='monospace'>&quot;Example&quot; Text</td><td class='monospace'>
&quot;Example&quot; Text</td>
</tr>
<tr>
<td class='style1'>^%USERFIELD^%</td><td class='style1'>&quot;Example&quot; Text</td>
<td class='style1'>%USERFIELD%</td>
</tr>
<tr>
<td class='monospace'>^^%USERFIELD^^%</td><td class='monospace'>&quot;Example&quot; Text</td><td class='monospace'>
^%USERFIELD^%</td>
</tr>
<tr>
<td class='monospace'>-d &quot;%USERFIELD%&quot;</td><td class='monospace'>c:\Example\</td><td class='monospace'>-d &quot;c:\Example\\&quot;</td>
</tr>
<tr>
<td class='monospace'>-d &quot;%-USERFIELD%&quot;</td><td class='monospace'>c:\Example\</td><td class='monospace'>-d &quot;c:\Example\&quot;</td>
</tr>
<tr>
<td class='monospace'>-d &quot;%USERFIELD%&quot;</td><td class='monospace'>Left
&amp; Right</td><td class='monospace'>-d &quot;Left ^&amp; Right&quot;</td>
</tr>
<tr>
<td class='monospace'>-d &quot;%!USERFIELD%&quot;</td><td class='monospace'>Left
&amp; Right</td><td class='monospace'>-d &quot;Left &amp; Right&quot;</td>
</tr>
<tr>
<td class='monospace'>%WINDIR%</td><td>N/A</td><td class='monospace'>c:\Windows\</td>
</tr>
<tr>
<td class='monospace'>\%WINDIR\%</td><td>N/A</td><td class='monospace'>c:\Windows\</td>
</tr>
<tr>
<td class='monospace'>\^%WINDIR\^%</td><td>N/A</td><td class='monospace'>
\%WINDIR\%</td>
</tr>
<tr>
<td class='monospace'>\\%WINDIR\\%</td><td>N/A</td><td class='monospace'>\\%WINDIR\\%</td>
</tr>
</table>
<p>
<span class="heading1">Example</span></p>
<p>
First of all, start the external tools editor. To do this, click Tools in the main menu and
select External Tools.<br />
You will see a screen like on the following screenshot.</p>
<p>
<img alt="" src="Screenshots/External Tools/01.png" /></p>
<p>
The fields below the list are greyed out because you haven&#39;t created an external tool
entry yet.<br />
To create one, right click the blank area in the list and select Add, as in the
screenshot below.</p>
<p>
<img alt="" src="Screenshots/External Tools/02.png" /></p>
<p>
This is what you&#39;ll get:</p>
<p>
<img alt="" src="Screenshots/External Tools/03.png" /></p>
<p>
So the three fields are now available and need to be filled.<br />
The Display Name is simply the name you will see when you want to launch that
tool, so give it a descriptive name.<br />
I named mine Traceroute as I will create a external tool that will start the
tracert command in the console.</p>
<p>
<img alt="" src="Screenshots/External Tools/04.png" /></p>
<p>
Ok, the next thing we&#39;ll need is a filename. This is the program that we
want to be executed.<br />
I simply type in cmd for a Windows cmd console.</p>
<p>
<img alt="" src="Screenshots/External Tools/05.png" /></p>
<p>
Now the fun part comes in&mdash;the arguments.<br />
The Windows cmd has a command line argument that tells the console to launch the
command followed by that argument and stay open.<br />
It&#39;s /K. (There&#39;s also /C, this is useful when you want the console to close
after the command was executed)<br />
In this case, I&#39;ll use /K as I want to look through the result when the command
completes.<br />
After that, I just type tracert %HostName%. This tells the console to do a
traceroute on the hostname of the currently selected Connection.</p>
<p>
<img alt="" src="Screenshots/External Tools/06.png" /></p>
<p>
Alright! That&#39;s all we&#39;ll need.<br />
Now right click one of you connections, click Tools, External Tools
and select Traceroute.</p>
<p>
<img alt="" src="Screenshots/External Tools/07.png" /></p>
<p>
Voil<69>! A console window will popup and execute your tracert command.</p>
<p>
<img alt="" src="Screenshots/External Tools/08.png" /></p>
</body>
</html>

View File

@@ -30,7 +30,7 @@
<li><a href="SSHFileTransfer.htm">SSH File Transfer</a></li>
<li><a href="QuickConnect.htm">Quick Connect</a></li>
<li><a href="ImportFromAD.htm">Import from Active Directory</a></li>
<li><a href="ExternalApps.htm">External Applications</a></li>
<li><a href="ExternalTools.htm">External Tools</a></li>
<li><a href="PortScan.htm">Port Scan</a></li>
</ul>
<p><a href="QuickReference.htm">Quick Reference</a></p>

View File

@@ -107,6 +107,25 @@ a:hover
/* TABLES */
table {
border-collapse: collapse;
}
table, th, td {
border: 1px solid black;
}
th,td {
padding: 5px;
}
th {
background-color: lightgrey;
text-align: left;
}
/* MISC STYLES */
@@ -117,4 +136,13 @@ a:hover
color: #000000;
font-family: 'Courier New' , Monospace;
background-color: #C1C1C1;
}
}
.monospace {
white-space: nowrap;
font-family: 'Courier New', monospace;
}
.nowrap {
white-space: nowrap
}

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Some files were not shown because too many files have changed in this diff Show More