Compare commits

...

240 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
62feba1691 Update CHANGELOG.TXT for 1.71 RC2. 2013-10-16 17:08:10 -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
3cb8784996 Minor code cleanup. 2013-10-14 22:48:10 -05:00
Riley McArdle
81d150f80a Fix duplicated folders possibly being named "New Connection" instead of the original folder's name 2013-10-14 22:47:48 -05:00
Riley McArdle
9ebce266ec Fix issue MR-565 - Double Folder keep heritage on the initial Folder 2013-10-14 22:42:34 -05:00
Riley McArdle
42bcf8db31 Fix typo in Portuguese translation. 2013-10-14 18:31:31 -05:00
Riley McArdle
ff2bbcf650 Fix issue MR-566 - Typo in German UI Automatic Update Settings 2013-10-14 18:30:55 -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
ba55958327 Fix issue MR-560 - Cannot Auto-Update With Open Connections: Unable to find an entry point named 'TaskDialogIndirect' in DLL 'ComCtl32' 2013-10-02 14:38:58 -05:00
Riley McArdle
2a67f493f6 Always use debug update channel for debug builds. 2013-10-02 13:56:04 -05:00
Riley McArdle
00647e4963 Start adding support for hotkeys to switch tabs. 2013-10-01 23:27:22 -05:00
Riley McArdle
06892deedf Update CHANGELOG.TXT for release. 2013-10-01 19:58:36 -05:00
Riley McArdle
d12ea40845 Add missing variable type. 2013-10-01 19:57:34 -05:00
Riley McArdle
3f21151331 Add new translations to project file. Add code signing of DLLs for new translations to BUILD.CMD. 2013-10-01 19:56:53 -05:00
Riley McArdle
c91f5e5cba Remove Beta VERSIONTAG from BUILD.CMD. Fix encoding of CHANGELOG.TXT. 2013-10-01 19:45:54 -05:00
Riley McArdle
9e90d17d80 Fix AnnouncementAddress for release version. 2013-10-01 19:41:16 -05:00
Riley McArdle
2e67bbf6a1 Add Chinese (Traditional) translation. Add partial Greek and Hungarian translations. 2013-10-01 19:17:21 -05:00
Riley McArdle
ceec9749b9 Update translations from Crowdin. 2013-10-01 19:16:31 -05:00
Riley McArdle
f674b5bfeb Fix issue MR-542 - Wrapped putty has security flaw
Update PuTTY to version 0.63.
2013-10-01 17:23:12 -05:00
Riley McArdle
b3e541c627 Add missing punctuation in CHANGELOG.TXT. 2013-09-30 22:09:43 -05:00
Riley McArdle
3389a152be Fix PuTTY Saved Sessions not showing after loading a new connections file 2013-09-30 22:09:04 -05:00
Riley McArdle
662fcfa318 Fix possible cross-thread operation exception when loading connections from SQL 2013-09-30 22:08:05 -05:00
Riley McArdle
06baec9c55 Fix issue MR-535 - SQL error saving Connections 2013-09-30 22:07:39 -05:00
Riley McArdle
270699c26b Fix issue MR-538 - RDP loses connection when hiding config or connections pane 2013-09-27 23:01:14 -05:00
Riley McArdle
bc699a04ec Fix issue MR-525 - Could not start on windows 7 64bit 2013-09-27 22:15:40 -05:00
Riley McArdle
3639e75f5b Fix issue MR-514 - Window Proxy test failed without close button 2013-09-27 21:04:26 -05:00
Riley McArdle
eef14ebc29 Fix issue MR-521 - Right-Clicking in "Sessions" panel crashes mRemoteNG 2013-09-27 01:39:43 -05:00
Riley McArdle
2568d2b750 Fix issue MR-495 - Having a negative range in port scan creates memory exhaustion.
Make minor improvements to the port scan functionality.
2013-09-27 01:29:35 -05:00
Riley McArdle
58a57d7a7d Improve reliability of BUILD.CMD. 2013-07-03 02:07:51 -05:00
Riley McArdle
8ddb71758e Update CHANGELOG.TXT for 1.71 Beta 5. 2013-06-09 15:48:22 -05:00
Riley McArdle
54f19eaeb6 Fix typo in SQL queries. 2013-06-08 00:00:10 -05:00
Riley McArdle
960096273b Fix issue MR-499 - TS Gateway is not working in latest release 1.71 2013-06-07 23:30:07 -05:00
Riley McArdle
b360902bd9 Improve SetRdGateway(). 2013-06-03 15:40:52 -05:00
Riley McArdle
8006bb49ca Fix issue MR-491 - Could not start RDP Connection 2013-06-03 14:20:34 -05:00
Riley McArdle
ac65468233 Update CHANGELOG.TXT for release of 1.71 Beta 4. 2013-05-28 15:37:34 -05:00
Riley McArdle
8992cb29da Add nb-NO and pt-BR language DLLs to list to be signed in BUILD.CMD. 2013-05-28 15:31:13 -05:00
Riley McArdle
b5f5f43b4c Sign PuTTYNG.exe. 2013-05-28 15:20:38 -05:00
Riley McArdle
8a814d9016 Update VncSharpNG to 1.3.4896.25007. 2013-05-28 14:56:02 -05:00
Riley McArdle
4ff4a365e1 Fix issue MR-487 - Initiate connections on MouseUp event 2013-05-28 13:48:07 -05:00
Riley McArdle
905b6bb92a Update translations. Add Norwegian (Bokmål) and Portuguese (Brazil) translations. 2013-05-22 13:38:05 -05:00
Riley McArdle
88d06c8ef2 Add Spanish installer translation from Marlon Montoya Torres. 2013-05-22 12:55:36 -05:00
Riley McArdle
102987dac7 Fix list of files to sign with code signing certificate. 2013-05-22 12:53:39 -05:00
Riley McArdle
54cf76444e Update BUILD.CMD with new code signing certificate information. 2013-05-22 12:53:07 -05:00
Riley McArdle
f595c1d446 Fix issue MR-470 - Quick Connect to Linux server uses invalid credentials 2013-05-13 13:04:39 -05:00
Riley McArdle
9cf06c44e8 Improve loading time of large connection files. 2013-05-08 21:08:29 -05:00
Riley McArdle
5d63ec6d2a Fix issue MR-459 - Maximized -> Minimized -> Restored results in mangled active display
Fix issue MR-463 - Add support for LoadBalanceInfo to RDP
2013-05-08 19:17:51 -05:00
Riley McArdle
0544b61138 Code cleanup. 2013-05-08 17:52:52 -05:00
Riley McArdle
ceb6f70b4d Improve the PuTTY Saved Sessions list to update automatically when any changes are made. 2013-05-06 00:28:23 -05:00
Riley McArdle
f3075f4c51 Hide PuTTY sessions from PuTTY Saved Sessions if no host is set. Show "Default Settings" if host is set. Default to SSH2 if "Protocol" or "SshProt" are not set (matching behavior of PuTTY). 2013-05-05 19:55:52 -05:00
Riley McArdle
7b850892ae Improve changes made in commit 5737d78. Improve RDP components check and failure text. 2013-05-05 00:24:17 -05:00
Riley McArdle
6a3ca9c9de Fix issue MR-443 - Instructions for eolwtscom.dll registration for Portable version are inaccurate 2013-05-04 23:54:41 -05:00
Riley McArdle
d69d948963 Fix issue MR-446 - Putty saved sessions show in connection panel 2013-05-04 23:08:38 -05:00
Riley McArdle
aa6061d7b6 Fix issue MR-471 - PuTTY Saved Sessions disappears from connection list 2013-05-04 22:56:40 -05:00
Riley McArdle
ba667475bf Fix issue MR-440 - RDP import with non-standard port 2013-05-04 22:43:14 -05:00
Riley McArdle
5737d78f78 Fix issue MR-255 - The version of the RDP AX client should be updated to 7 2013-05-04 19:53:33 -05:00
Riley McArdle
079fe000bb Fix issue MR-439 - MRemoteNG 1.70 does not start 2013-05-02 18:21:17 -05:00
Riley McArdle
29865c69ab Sort language files. 2013-04-30 22:06:30 -05:00
Riley McArdle
f2e9cce248 Make "Sort Language Files.cmd" actually do something. 2013-04-30 22:06:08 -05:00
Riley McArdle
6a16656f03 Code cleanup. 2013-04-30 22:05:09 -05:00
Riley McArdle
7f4d3605c0 Added feature MR-435 - Add digital signature check to updater
Refactor update and announcement handling.
2013-04-30 22:04:07 -05:00
Riley McArdle
d97ad31cc3 Change PuTTY saved sessions to only send session name command line parameter. 2013-03-25 19:34:41 -05:00
Riley McArdle
a49ebf17bf Add PuTTY Session Settings command to the Config panel for PuTTY Saved Sessions.
Fix handling of the plus (+) character in PuTTY session names.
2013-03-25 19:29:20 -05:00
Riley McArdle
903a9dd5cc Start adding "Edit in PuTTY" command to property grid for PuTTY Saved Sessions. 2013-03-25 00:52:27 -05:00
Riley McArdle
5d8db1ade6 Change the "Launch PuTTY" button in the "Options" dialog to open PuTTY from the path the user has currently set, instead of what was previously saved. 2013-03-24 23:29:16 -05:00
Riley McArdle
423a89fdaa Change Internet Explorer to no longer force IE7 compatibility mode. 2013-03-23 19:21:11 -05:00
Riley McArdle
85d78fd4ae Remove unused BorderSize property from Connection.Protocol.PuttyBase. 2013-03-23 18:21:16 -05:00
Riley McArdle
725269e914 Fix issue MR-424 - Import of a few Linux SSH2 hosts discovered via the port scan tool results in a UE 2013-03-23 15:03:54 -05:00
Riley McArdle
9d3beaffbb Additional fix for MR-392. 2013-03-23 14:08:56 -05:00
Riley McArdle
7f36b7926b Fix issue MR-392 - Sessions Panel - context menu entries need to be context aware
Refactor UI.Window.Sessions.
2013-03-23 13:58:39 -05:00
Riley McArdle
f4bb268e27 Fix issue MR-422 - Gives error Object reference not set to an instance of an object. 2013-03-22 22:03:41 -05:00
Riley McArdle
e1329348d1 Remove intermediate debugging variables from Themes.ThemeSerializer.EncodeColorName(). 2013-03-20 22:26:10 -05:00
Riley McArdle
4f06a48d16 Fix an exception or crash when choosing unnamed colors for themes.
Fix possible error "Control does not support transparent background colors" when modifying themes.
Fix changes to the active theme not being saved reliably.
2013-03-20 22:20:58 -05:00
Riley McArdle
1dea64d2eb Improve SSH transfer error message. 2013-03-20 16:54:51 -05:00
Riley McArdle
375e737f02 Fix PuTTY saved sessions with spaces or special characters not being listed. 2013-03-20 16:25:51 -05:00
Riley McArdle
1032801f12 Fix the category names in the themes tab of the options dialog on Windows XP not showing correctly. 2013-03-20 16:09:32 -05:00
Riley McArdle
1002b8d32f Fix namespace problem in App.Runtime.vb. 2013-03-20 15:51:32 -05:00
Riley McArdle
36a72da71f Update CHANGELOG.TXT for 1.71 Beta 3 release. 2013-03-20 15:45:19 -05:00
Riley McArdle
a2b3a815e7 Fix issue MR-397 - Putty disappears from the screen
Fix issue MR-402 - scrollbar touch moves putty window
2013-03-20 15:36:30 -05:00
Riley McArdle
7820707e46 Fix issue MR-413 - Can't use aplication 2013-03-20 11:09:01 -05:00
Riley McArdle
c3f960cfe8 More small changes to fullscreen mode. 2013-03-20 00:17:06 -05:00
Riley McArdle
965f43a4c3 Fix issue MR-398 - Full Screen mode doesn't correctly make use of available space 2013-03-19 23:20:49 -05:00
Riley McArdle
317175bb03 Minor code cleanup. 2013-03-19 22:28:55 -05:00
Riley McArdle
1608d48495 Fix new connections having a globe icon. 2013-03-19 22:24:42 -05:00
Riley McArdle
08ddee1bda Fix issue MR-406 - Items disappear from External Tools toolbar when accessing External Tools panel 2013-03-19 22:22:49 -05:00
Riley McArdle
72756a2bb8 Fix issue MR-410 - Unhandled exception when clicking New button under Theme 2013-03-19 21:11:00 -05:00
Riley McArdle
38011a3546 Add missing line to CHANGELOG.TXT. 2013-03-19 13:15:18 -05:00
Riley McArdle
d72dbdace0 Update CHANGELOG.TXT for release of 1.71 Beta 2. 2013-03-19 13:14:34 -05:00
Riley McArdle
5c887b648f Update translations from Crowdin. 2013-03-18 23:38:08 -05:00
Riley McArdle
4de7167352 Add additional translators to CREDITS.TXT. 2013-03-18 22:58:43 -05:00
Riley McArdle
54825b353f Fix issue MR-401 - Checkbox misaligned 2013-03-17 17:51:13 -05:00
Riley McArdle
b23fb58977 RDP connections can now be switched to full screen mode when redirect key combinations is enabled. 2013-03-17 15:36:59 -05:00
Riley McArdle
7b831c6ab8 Add feature MR-351 - Import connections from PuTTY 2013-03-16 22:37:34 -05:00
Riley McArdle
167344bd14 Add translator Emanuel Silva to CREDITS.TXT. 2013-03-16 13:46:21 -05:00
Riley McArdle
14f31ba461 Fix COMException on WebBrowser controls. 2013-03-15 23:56:48 -05:00
Riley McArdle
13a82799b2 Correct a typo. 2013-03-15 22:14:09 -05:00
Riley McArdle
66fe33683e Fix issue MR-375 - Changing a connection's icon using the picture button should immediately update Icon field 2013-03-15 18:03:41 -05:00
Riley McArdle
8030c9a63d Add feature MR-346 - Option to show/hide the description box at the bottom of the Config panel 2013-03-15 17:50:17 -05:00
Riley McArdle
60630a5cab Remove debug message from Connection.Protocol.PuttyBase.vb. 2013-03-15 16:51:02 -05:00
Riley McArdle
d9ba8f81e2 Create Sort Language Files.cmd. 2013-03-14 22:01:14 -05:00
Riley McArdle
7fe56402fd Fix spelling of colour for English and add color to en-US. 2013-03-14 22:00:05 -05:00
Riley McArdle
634bce25cd Move theme related strings into Language.resx. 2013-03-14 21:41:12 -05:00
Riley McArdle
437ff003b0 More theme improvements. 2013-03-14 20:18:56 -05:00
Riley McArdle
9f09798da5 More theme improvements. 2013-03-14 19:46:06 -05:00
Riley McArdle
5da85b6a88 More additions to theming. 2013-03-12 22:41:59 -05:00
Riley McArdle
bb42a31486 Change theme settings file name to Themes.xml and moved it to a Const in App.Info.Settings. 2013-03-12 20:18:13 -05:00
Riley McArdle
7e5e1e6342 Hide theme properties that don't look good. Additional improvements to theming. 2013-03-12 20:01:35 -05:00
Riley McArdle
6f43bbf96e Start adding theme support. 2013-03-09 22:13:40 -06:00
Riley McArdle
8ea514643d Additional fix for MR-345. 2013-03-09 15:14:42 -06:00
Riley McArdle
f7e12c6e92 Fix issue MR-354 - Re-ordering tabs doesn't give good, reliable visual feedback 2013-03-08 20:32:54 -06:00
Riley McArdle
30f2cc9e28 Fix ArgumentNullException in Tools.CommandLineArguments. 2013-03-08 19:35:31 -06:00
Riley McArdle
45b9dddb4b Add feature MR-345 - Two separate options for confirming closure of Tabs and Connection Panels 2013-03-08 18:33:37 -06:00
Riley McArdle
650dc487db Fix issue MR-381 - Notifications panel - whitespace context menu allows Copy and Delete on nothing 2013-03-07 22:34:49 -06:00
Riley McArdle
5bc443707f Fix issue MR-377 - Several redundant panels can be opened 2013-03-07 21:14:00 -06:00
Riley McArdle
4510219300 Fix issue MR-379 - Connection variables not working with external tools 2013-03-07 20:26:02 -06:00
Riley McArdle
cd8601c7ff Correct CHANGELOG.TXT. 2013-03-07 20:25:41 -06:00
Riley McArdle
73c27069ee Change "Automatically get session information" to be disabled by default. 2013-03-07 19:50:35 -06:00
Riley McArdle
7dcad234f5 Hide the username and domain settings for VNC connections. 2013-03-07 18:52:15 -06:00
Riley McArdle
66281639b4 Merge branch 'release/1.70' into develop
Conflicts:
	CHANGELOG.TXT
2013-03-07 12:11:20 -06:00
Riley McArdle
1af6fde986 Prepare CHANGELOG.TXT for release of 1.70 RC3. 2013-03-07 12:07:01 -06:00
Riley McArdle
83ec9e50b8 Merge branch 'release/1.70' into develop 2013-03-06 23:04:55 -06:00
Riley McArdle
6d21c85d98 Fix issue MR-355 - Moving sub folders to top level causes property loss 2013-03-06 22:58:53 -06:00
Riley McArdle
0ff00e59ba Add setting for update channel. 2013-03-04 21:52:28 -06:00
Riley McArdle
850a342e38 Prepare CHANGELOG.TXT for release of 1.71 Beta 1. 2013-03-04 15:54:49 -06:00
Riley McArdle
1caba06aca Fix issue MR-362 - Rename 'Screenshot Manager' to 'Screenshots' on the View menu to match Panel name 2013-03-04 13:20:49 -06:00
Riley McArdle
a115196cee Disable Fullscreen item on tab context menu if redirect keys is enabled for RDP connection. Fix automatic RDP resize when redirect keys is enabled. Fix automatic RDP resize when SmartSize setting is changed. 2013-03-04 12:55:46 -06:00
Riley McArdle
5f451de94e Fix issue MR-352 - Passwords with " (quotation mark) and # (hash key) characters make mRemoteNG to open PuttyNG dialog 2013-03-02 01:41:00 -06:00
Riley McArdle
a4921fc564 Add automatic resizing of RDP connections when the window is resized or when toggling full screen mode. 2013-03-01 17:04:28 -06:00
Riley McArdle
7d1d03e8cd Fix connection bar being shown when connecting to an RDP connection with redirect key combinations enabled. 2013-02-28 22:46:07 -06:00
Riley McArdle
92c18a45ba Merge branch 'release/1.70' into develop 2013-02-28 14:57:41 -06:00
Riley McArdle
a61fb5c6d6 Fix issue MR-350 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long. 2013-02-28 14:56:51 -06:00
Riley McArdle
e1deaf73ea Fix issue MR-117 - Remote Session Info Window / Tab does not populate 2013-02-27 19:20:49 -06:00
Riley McArdle
7d6d602477 Merge branch 'release/1.70' into develop
Conflicts:
	CHANGELOG.TXT
2013-02-27 14:44:17 -06:00
Riley McArdle
b0439adee4 Fix issue MR-339 - Connection group collapses with just one click
(cherry picked from commit 0a7c88a853)

Conflicts:
	CHANGELOG.TXT
2013-02-27 14:41:53 -06:00
Riley McArdle
0a7c88a853 Fix issue MR-339 - Connection group collapses with just one click 2013-02-27 14:39:27 -06:00
Riley McArdle
b735e6d3e4 Fix tabs not closing on double-click when the active tab is a PuTTY connection.
(cherry picked from commit 960ecba12a)

Conflicts:
	CHANGELOG.TXT
2013-02-27 14:15:20 -06:00
Riley McArdle
960ecba12a Fix tabs not closing on double-click when the active tab is a PuTTY connection. 2013-02-27 14:12:49 -06:00
Riley McArdle
3988820db9 Fix issue MR-342 - Incorrect view in config pane of new connection after viewing default inheritance 2013-02-26 21:06:47 -06:00
Riley McArdle
22ea7055c9 Fix issue MR-142 - Start of mRemoteNG takes about one minute and consumes excessive CPU 2013-02-26 20:46:49 -06:00
Riley McArdle
edba3fbea0 Merge branch 'release/1.70' into develop
Conflicts:
	CHANGELOG.TXT
	mRemoteV1/Forms/frmOptions.resx
	mRemoteV1/Forms/frmOptions.vb
2013-02-26 20:02:18 -06:00
Riley McArdle
51e4bc7eae Move search prompt to resource string. 2013-02-26 16:19:06 -06:00
Riley McArdle
3e680235ee Improve appearance and discoverability of the connection search box. 2013-02-26 16:13:45 -06:00
Riley McArdle
d2459de700 Fix issue MR-344 - Move "Always show panel tabs" option 2013-02-26 15:16:00 -06:00
Riley McArdle
f9f265b409 Fix issue MR-340 - Object reference not set to an instance of an object. 2013-02-26 15:08:55 -06:00
Riley McArdle
c218f0362e Merge branch 'release/1.70' into develop
Conflicts:
	CHANGELOG.TXT
2013-02-25 18:47:20 -06:00
Riley McArdle
fb68ed099e Update CHANGELOG.TXT for release of 1.70 Release Candidate 2. 2013-02-25 18:33:34 -06:00
Riley McArdle
01133b3d9f Fix issue MR-338 - PuTTYNG crashing on fresh install of mRemoteNG 2013-02-25 18:32:54 -06:00
Riley McArdle
52461b758b Revert "Fixed issue MR-229 - Integrated PuTTY doesn't work in Windows 8 RP"
This reverts commit c29c5015d5.
2013-02-25 18:32:07 -06:00
Riley McArdle
3bc5ceede4 Fix issue MR-332 - Can't select different tab with one click after disconnecting existing tab
(cherry picked from commit 73f71050a0)

Conflicts:
	CHANGELOG.TXT
2013-02-25 18:16:22 -06:00
Riley McArdle
a3c9c667b4 Add detection of newer versions of connection files and database schemata and refuse to open them to avoid data loss. 2013-02-24 16:46:37 -06:00
Riley McArdle
73f71050a0 Fix issue MR-332 - Can't select different tab with one click after disconnecting existing tab 2013-02-24 16:02:04 -06:00
Riley McArdle
94d901ec4c Increment version to 1.71. 2013-02-24 15:40:19 -06:00
Riley McArdle
9e67f36615 Fix issue MR-330 - Portable version saves log to user's profile folder 2013-02-24 15:38:48 -06:00
Riley McArdle
bf6f166d8f Add feature MR-329 - Create Option to disable the "Quick: " prefix 2013-02-24 13:15:44 -06:00
Riley McArdle
1de5ab43d6 Fix issue MR-67 - Sort does not recursively sort 2013-02-24 12:49:38 -06:00
Riley McArdle
39dd75dbde Fix issue MR-121 - Config pane not sorting properties correctly when switching between alphabetical and categorized view 2013-02-24 00:04:45 -06:00
Riley McArdle
b509f75c17 Fix issue MR-130 - Issues duplicating folders 2013-02-23 23:38:16 -06:00
Riley McArdle
877649b80a Fix issue MR-158 - Password field not accepting Pipe 2013-02-23 22:14:48 -06:00
Riley McArdle
b5846f2286 Fix issue MR-333 - Unnecessary prompt for 'close all open connections?' 2013-02-23 21:34:48 -06:00
Riley McArdle
80dd98e7fb Merge branch 'release/1.70' into develop 2013-02-23 21:03:21 -06:00
Riley McArdle
7c3a349bd6 Fix typo in CHANGELOG.TXT. 2013-02-23 21:02:13 -06:00
Riley McArdle
84d3f7d30b Fixed KiTTY opening in a separate window when using a saved session. 2013-02-22 19:38:43 -06:00
Riley McArdle
c29c5015d5 Fixed issue MR-229 - Integrated PuTTY doesn't work in Windows 8 RP
Fixed issue MR-264 - Windows 8 support
2013-02-21 23:58:04 -06:00
Riley McArdle
1f776fb9bf Add timeout to WaitForInputIdle in Connection.Protocol.PuttyBase.Connect(). 2013-02-21 23:54:29 -06:00
Riley McArdle
f90eb94484 Fix issue MR-322 - Connection Button not listing servers 2013-02-21 22:23:58 -06:00
Riley McArdle
80f35cea71 Refactor Security.Crypt.Decrypt(). 2013-02-21 21:08:19 -06:00
Riley McArdle
a12978967a Change "Fix" to "Fixed" in CHANGELOG.TXT. 2013-02-21 19:46:50 -06:00
Riley McArdle
8cce811ce5 Fixed "Decryption failed. Padding is invalid and cannot be removed." notification. 2013-02-21 19:46:12 -06:00
Riley McArdle
adb45cec98 Change PuttyBase.Connect() to use MaxPuttyWaitTime setting instead of hard coded value. 2013-02-19 20:30:42 -06:00
Riley McArdle
c09ea26a3c Fix issue MR-183 - Error trying to save connections when using SQL - Invalid column name _parentConstantId 2013-02-19 19:51:20 -06:00
Riley McArdle
d71bf494df Fix issue MR-317 - Difficulty right-clicking on Tab
Fix issue MR-318 - Wrong tab gets selected when tab names overflow on the tab bar
2013-02-19 17:25:36 -06:00
Riley McArdle
e82a9c5228 Fix issue MR-225 - Tabs do not open in a panel until multiple panels are displayed.
Fix issue MR-321 - New connection panel doesn't get panel header if its the only one or is moved
Added option to always show panel tabs
2013-02-19 15:36:30 -06:00
220 changed files with 28837 additions and 11575 deletions

View File

@@ -8,7 +8,7 @@ set VCVARSALL="%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat
set DEVENV="devenv.exe"
set MAKENSIS="%ProgramFiles(x86)%\NSIS\Unicode\makensis.exe"
set RAR="%ProgramFiles%\WinRAR\WinRAR.exe"
set SIGNCMD=signtool.exe sign /n "Next Generation Software" /sha1 "c4ece717747eb7d0cac824f6c7431e5237138b02" /t http://timestamp.verisign.com/scripts/timstamp.dll
set SIGNCMD=signtool.exe sign /n "Astrospark Technologies, LLC" /sha1 "1cbd910dbd6e77f26506e7f600736972f700673f" /tr http://timestamp.comodoca.com/rfc3161
rem Windows Sysinternals Sigcheck from http://technet.microsoft.com/en-us/sysinternals/bb897441
set SIGCHECK="%ProgramFiles(x86)%\Sigcheck\sigcheck.exe"
@@ -18,6 +18,20 @@ call %VCVARSALL% x86
rmdir /s /q "%~dp0\mRemoteV1\bin" > nul 2>&1
rmdir /s /q "%~dp0\mRemoteV1\obj" > nul 2>&1
if exist "%~dp0\mRemoteV1\bin" goto ERROR_RMDIR
if exist "%~dp0\mRemoteV1\obj" goto ERROR_RMDIR
goto NOERROR_RMDIR
:ERROR_RMDIR
echo.
echo Could not clean output directories.
echo.
echo Build process failed.
echo.
goto END
:NOERROR_RMDIR
echo Building release version...
%DEVENV% "%~dp0\mRemoteV1.sln" /build "Release"
@@ -25,7 +39,58 @@ echo Building portable version...
%DEVENV% "%~dp0\mRemoteV1.sln" /build "Release Portable"
echo Signing binaries...
%SIGNCMD% "%~dp0\mRemoteV1\bin\Release\de\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release\en-US\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release\fr\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release\AxInterop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release\AxInterop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release\Interop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release\Interop.ShDocVw.dll" "%~dp0\mRemoteV1\bin\Release\Interop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release\mRemoteNG.exe" "%~dp0\mRemoteV1\bin\Release Portable\de\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release Portable\en-US\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release Portable\fr\mRemoteNG.resources.dll" "%~dp0\mRemoteV1\bin\Release Portable\AxInterop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release Portable\AxInterop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.WFICALib.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.ShDocVw.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.MSTSCLib.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release Portable\Interop.EOLWTSCOM.dll" "%~dp0\mRemoteV1\bin\Release Portable\mRemoteNG.exe"
%SIGNCMD% ^
"%~dp0\mRemoteV1\bin\Release\de\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\el\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\en-US\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\es\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\es-AR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\fr\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\hu\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\it\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\nb-NO\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\nl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\pl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\pt\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\pt-BR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\ru\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\uk\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\zh-CN\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\zh-TW\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\AxInterop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release\AxInterop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.EOLWTSCOM.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.ShDocVw.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release\mRemoteNG.exe" ^
"%~dp0\mRemoteV1\bin\Release Portable\de\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\el\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\en-US\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\es\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\es-AR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\fr\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\hu\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\it\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\nb-NO\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\nl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\pl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\pt\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\pt-BR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\ru\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\uk\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\zh-CN\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\zh-TW\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\AxInterop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\AxInterop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.EOLWTSCOM.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.ShDocVw.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\mRemoteNG.exe" ^
rem Do not remove the two blank lines above this line.
mkdir "%~dp0\Release" > nul 2>&1
@@ -79,4 +144,6 @@ del /f /q %PORTABLEZIP% > nul 2>&1
echo.
echo Build process complete.
echo.
:END
pause

View File

@@ -1,39 +1,209 @@
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.
1.71 Release Candidate 1 (2013-10-01):
Fixed issue MR-495 - Having a negative range in port scan creates memory exhaustion.
Fixed issue MR-514 - Window Proxy test failed without close button
Fixed issue MR-521 - Right-Clicking in "Sessions" panel crashes mRemoteNG
Fixed issue MR-525 - Could not start on windows 7 64bit
Fixed issue MR-535 - SQL error saving Connections
Fixed issue MR-538 - RDP loses connection when hiding config or connections pane
Fixed issue MR-542 - Wrapped putty has security flaw
Made minor improvements to the port scan functionality.
Fixed possible cross-thread operation exception when loading connections from SQL.
Fixed PuTTY Saved Sessions not showing after loading a new connections file.
Updated PuTTY to version 0.63.
Updated translations.
Added Chinese (Traditional) translation.
Added partial Greek and Hungarian translations.
1.71 Beta 5 (2013-06-09):
Fixed issue MR-491 - Could not start RDP Connection
Fixed issue MR-499 - TS Gateway is not working in latest release 1.71
Fixed typo in SQL queries.
1.71 Beta 4 (2013-05-28):
Added feature MR-435 - Add digital signature check to updater
Fixed issue MR-255 - The version of the RDP AX client should be updated to 7
Fixed issue MR-392 - Sessions Panel - context menu entries need to be context aware
Fixed issue MR-422 - Gives error Object reference not set to an instance of an object.
Fixed issue MR-424 - Import of a few Linux SSH2 hosts discovered via the port scan tool results in a UE
Fixed issue MR-439 - MRemoteNG 1.70 does not start
Fixed issue MR-440 - RDP import with non-standard port
Fixed issue MR-443 - Instructions for eolwtscom.dll registration for Portable version are inaccurate
Fixed issue MR-446 - Putty saved sessions show in connection panel
Fixed issue MR-459 - Maximized -> Minimized -> Restored results in mangled active display
Fixed issue MR-463 - Add support for LoadBalanceInfo to RDP
Fixed issue MR-470 - Quick Connect to Linux server uses invalid credentials
Fixed issue MR-471 - PuTTY Saved Sessions disappears from connection list
Fixed issue MR-487 - Initiate connections on MouseUp event
Added PuTTY Session Settings command to the Config panel for PuTTY Saved Sessions.
Updated translations.
Added Norwegian (Bokmal) and Portuguese (Brazil) translations.
Added Spanish translation to the installer.
Fixed an exception or crash when choosing unnamed colors for themes.
Fixed possible error "Control does not support transparent background colors" when modifying themes.
Fixed changes to the active theme not being saved reliably.
Fixed handling of the plus (+) character in PuTTY session names.
Changed Internet Explorer to no longer force IE7 compatibility mode.
Changed the "Launch PuTTY" button in the "Options" dialog to open PuTTY from the path the user has currently set, instead of what was previously saved.
Improved update and announcement checking.
Improved the PuTTY Saved Sessions list to update automatically when any changes are made.
Improved loading time of large connection files.
Lowered required version of RDC from 6.1 to 6.0.
Updated VncSharpNG to 1.3.4896.25007.
1.71 Beta 3 (2013-03-20):
Fixed issue MR-397 - Putty disappears from the screen
Fixed issue MR-398 - Full Screen mode doesn't correctly make use of available space
Fixed issue MR-402 - scrollbar touch moves putty window
Fixed issue MR-406 - Items disappear from External Tools toolbar when accessing External Tools panel
Fixed issue MR-410 - Unhandled exception when clicking New button under Theme
Fixed issue MR-413 - Can't use aplication
Fixed new connections having a globe icon.
Fixed the category names in the themes tab of the options dialog on Windows XP not showing correctly.
Fixed PuTTY saved sessions with spaces or special characters not being listed.
1.71 Beta 2 (2013-03-19):
Added feature MR-336 - Customizable background color for the windows/panels
Added feature MR-345 - Two separate options for confirming closure of Tabs and Connection Panels
Added feature MR-346 - Option to show/hide the description box at the bottom of the Config panel
Added feature MR-351 - Import connections from PuTTY
Fixed issue MR-354 - Re-ordering tabs doesn't give good, reliable visual feedback
Fixed issue MR-375 - Changing a connection's icon using the picture button should immediately update Icon field
Fixed issue MR-377 - Several redundant panels can be opened
Fixed issue MR-379 - Connection variables not working with external tools
Fixed issue MR-381 - Notifications panel - whitespace context menu allows Copy and Delete on nothing
Fixed issue MR-401 - Checkbox misaligned
The username and domain settings are now hidden for VNC connections since they are not supported.
Changed "Automatically get session information" to be disabled by default.
RDP connections can now be switched to full screen mode when redirect key combinations is enabled.
1.71 Beta 1 (2013-03-04):
Added feature MR-329 - Create Option to disable the "Quick: " prefix
Fixed issue MR-67 - Sort does not recursively sort
Fixed issue MR-117 - Remote Session Info Window / Tab does not populate
Fixed issue MR-121 - Config pane not sorting properties correctly when switching between alphabetical and categorized view
Fixed issue MR-130 - Issues duplicating folders
Fixed issue MR-142 - Start of mRemoteNG takes about one minute and consumes excessive CPU
Fixed issue MR-158 - Password field not accepting Pipe
Fixed issue MR-330 - Portable version saves log to user's profile folder
Fixed issue MR-333 - Unnecessary prompt for 'close all open connections?'
Fixed issue MR-342 - Incorrect view in config pane of new connection after viewing default inheritance
Fixed issue MR-352 - Passwords with " (quotation mark) and # (hash key) characters make mRemoteNG to open PuttyNG dialog
Fixed issue MR-362 - Rename 'Screenshot Manager' to 'Screenshots' on the View menu to match Panel name
Added detection of newer versions of connection files and database schemata. mRemoteNG will now refuse to open them to avoid data loss.
Improved appearance and discoverability of the connection search box.
If RDC 7.0 or higher is installed, the connection bar is no longer briefly shown when connecting to an RDP connection with redirect key combinations enabled.
If RDC 8.0 or higher is installed, RDP connections automatically adjust their size when the window is resized or when toggling full screen mode.
1.70 (2013-03-07):
Fixed issue MR-339 - Connection group collapses with just one click
Fixed issue MR-340 - Object reference not set to an instance of an object.
Fixed issue MR-344 - Move "Always show panel tabs" option
Fixed issue MR-350 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long.
Fixed issue MR-355 - Moving sub folders to top level causes property loss
Fixed tabs not closing on double-click when the active tab is a PuTTY connection.
1.70 Release Candidate 2 (2013-02-25):
Fixed issue MR-332 - Can't select different tab with one click after disconnecting existing tab
Fixed issue MR-338 - PuTTYNG crashing on fresh install of mRemoteNG
Re-enabled PuTTYNG integration enhancements on Windows 8
1.70 Release Candidate 1 (2013-02-22):
Fixed issue MR-183 - Error trying to save connections when using SQL - Invalid column name _parentConstantId
Fixed issue MR-225 - Tabs do not open in a panel until multiple panels are displayed.
Fixed issue MR-229 - Integrated PuTTY doesn't work in Windows 8 RP
Fixed issue MR-264 - Windows 8 support
Fixed issue MR-317 - Difficulty right-clicking on Tab
Fixed issue MR-318 - Wrong tab gets selected when tab names overflow on the tab bar
Fixed issue MR-321 - New connection panel doesn't get panel header if its the only one or is moved
Fixed issue MR-322 - Connection Button not listing servers
Added option to always show panel tabs.
Fixed "Decryption failed. Padding is invalid and cannot be removed." notification.
Fixed KiTTY opening in a separate window when using a saved session.
1.70 Beta 2 (2013-02-18):
Fix issue MR-47 - Silent Installation Prompts for Language
Fix issue MR-54 - Error When disconnecting from SSL channel RDP
Fix issue MR-58 - Bug when duplicating connection in connection view
Fix issue MR-68 - Config Window Loses Options
Fix issue MR-71 - Minimizing mRemoteNG causes temporary re-size of Putty sessions (windows)
Fix issue MR-80 - Reconnect previous sessions
Fix issue MR-81 - Problem Duplicating Folder w/ Sub-Folders
Fix issue MR-85 - Microsoft .NET Framework warning
Fix issue MR-86 - Citrix GDI+ Error when screen is locked
Fix issue MR-96 - When pressing SHIFT+F4 to create a new connection inside a folder, the new connections doesn't inherit any properties from its parent
Fix issue MR-101 - Collapse all folders causes a NullReferenceException
Fix issue MR-165 - Can't close About window if it is the last tab
Fix issue MR-166 - Inheritance button is disabled on some connections
Fix issue MR-167 - Name and description of properties not show in inheritance list
Fix issue MR-171 - Inherit configuration not showing friendly names for each inherit component
Fix issue MR-172 - RDGatewayPassword is unencrypted in confCons.xml file
Fix issue MR-174 - Trailing Space on a Hostname/IP will cause the connection not to happen.
Fix issue MR-175 - Problem with focus when 2 or more PuTTY sessions opened
Fix issue MR-176 - Del key while editing connection name triggers 'Delete Connection'
Fix issue MR-178 - 3 different panels crashes all connections
Fix issue MR-181 - Sessions on startup
Fix issue MR-190 - Can't click on tab/session
Fix issue MR-196 - Cannot export list without usernames and passwords
Fix issue MR-199 - when using screen inside putty, screen becomes dead when reduce mremoteNG
Fix issue MR-202 - The Connection "Tab" show Ampersands as underscores.
Fix issue MR-214 - Hostname/IP reset
Fix issue MR-224 - Session tabs become un-clickable after duplicating a tab or opening a new one in the same panel
Fix issue MR-233 - Backslash at end of password prevents success of putty invocation and corresponding auto-logon
Fix issue MR-235 - Config file gets corrupted when leaving the password entry box with ESC
Fix issue MR-264 - Windows 8 support
Fix issue MR-277 - Inheritance configuration button not appear in configuration tab
Fix issue MR-284 - SSH: Text not showing properly
Fix issue MR-299 - mRemoteNG crashes while using remotely (Windows XP remote desktop)
Fix issue MR-306 - Fatal .NET exception on program start
Fix issue MR-313 - PuTTY window not maximized when loading from saved session
Fixed issue MR-47 - Silent Installation Prompts for Language
Fixed issue MR-54 - Error When disconnecting from SSL channel RDP
Fixed issue MR-58 - Bug when duplicating connection in connection view
Fixed issue MR-68 - Config Window Loses Options
Fixed issue MR-71 - Minimizing mRemoteNG causes temporary re-size of Putty sessions (windows)
Fixed issue MR-80 - Reconnect previous sessions
Fixed issue MR-81 - Problem Duplicating Folder w/ Sub-Folders
Fixed issue MR-85 - Microsoft .NET Framework warning
Fixed issue MR-86 - Citrix GDI+ Error when screen is locked
Fixed issue MR-96 - When pressing SHIFT+F4 to create a new connection inside a folder, the new connections doesn't inherit any properties from its parent
Fixed issue MR-101 - Collapse all folders causes a NullReferenceException
Fixed issue MR-165 - Can't close About window if it is the last tab
Fixed issue MR-166 - Inheritance button is disabled on some connections
Fixed issue MR-167 - Name and description of properties not show in inheritance list
Fixed issue MR-171 - Inherit configuration not showing friendly names for each inherit component
Fixed issue MR-172 - RDGatewayPassword is unencrypted in confCons.xml file
Fixed issue MR-174 - Trailing Space on a Hostname/IP will cause the connection not to happen.
Fixed issue MR-175 - Problem with focus when 2 or more PuTTY sessions opened
Fixed issue MR-176 - Del key while editing connection name triggers 'Delete Connection'
Fixed issue MR-178 - 3 different panels crashes all connections
Fixed issue MR-181 - Sessions on startup
Fixed issue MR-190 - Can't click on tab/session
Fixed issue MR-196 - Cannot export list without usernames and passwords
Fixed issue MR-199 - when using screen inside putty, screen becomes dead when reduce mremoteNG
Fixed issue MR-202 - The Connection "Tab" show Ampersands as underscores.
Fixed issue MR-214 - Hostname/IP reset
Fixed issue MR-224 - Session tabs become un-clickable after duplicating a tab or opening a new one in the same panel
Fixed issue MR-233 - Backslash at end of password prevents success of putty invocation and corresponding auto-logon
Fixed issue MR-235 - Config file gets corrupted when leaving the password entry box with ESC
Fixed issue MR-264 - Windows 8 support
Fixed issue MR-277 - Inheritance configuration button not appear in configuration tab
Fixed issue MR-284 - SSH: Text not showing properly
Fixed issue MR-299 - mRemoteNG crashes while using remotely (Windows XP remote desktop)
Fixed issue MR-306 - Fatal .NET exception on program start
Fixed issue MR-313 - PuTTY window not maximized when loading from saved session
mRemoteNG now requires .NET Framework 3.0 instead of 2.0.
Updated translations.
Added translations for Spanish (Argentina), Italian, Polish, Portuguese, Chinese (Simplified).
@@ -41,14 +211,14 @@
Improved loading of XML files from older versions of mRemote/mRemoteNG.
1.70 Beta 1 (2012-02-27):
Fix issue MR-77 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long.
Fix issue MR-78 - Renaming Connections
Fix issue MR-79 - MoveUp/Down item doesn't work + Sort button broken
Fix issue MR-93 - Regional settings problem when using SQL connection in mRemoteNG
Fix issue MR-97 - Integrate Dutch translation
Fix issue MR-98 - Integrate Russian and Ukranian translations
Fix issue MR-99 - Integrate Spanish translation
Fix issue MR-131 - RD Gateway does not respect setting for use different credentials
Fixed issue MR-77 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long.
Fixed issue MR-78 - Renaming Connections
Fixed issue MR-79 - MoveUp/Down item doesn't work + Sort button broken
Fixed issue MR-93 - Regional settings problem when using SQL connection in mRemoteNG
Fixed issue MR-97 - Integrate Dutch translation
Fixed issue MR-98 - Integrate Russian and Ukranian translations
Fixed issue MR-99 - Integrate Spanish translation
Fixed issue MR-131 - RD Gateway does not respect setting for use different credentials
Added compatibility check for "Use FIPS compliant algorithms" security setting.
Improved reporting of errors when encrypting and decrypting connection files.
Added partial Polish translation.

View File

@@ -4,6 +4,7 @@ Contributors
Jason Barbier
Wiktor Beryt
Lionel Caignec
Ruben d'Arco
Felix Deimel
Holger Henke
Tom Hiller
@@ -13,6 +14,15 @@ Andreas Rehm
David Vidmar
Translators
===========
Eugenio "Ryo567" Mart<72>nez
Mathieu Pape
Emanuel Silva
Robert Siwiec
Included Source Code
====================
@@ -26,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
===================

Binary file not shown.

Binary file not shown.

View File

@@ -1,22 +1,22 @@
; Spanish installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_SPANISH} "mRemoteNG run SPANISH message"
LangString LaunchMremoteNow ${LANG_SPANISH} "Iniciando de mRemoteNG"
; Installer Language
LangString InstallerLanguage ${LANG_SPANISH} "Installer Language"
LangString InstallerLanguage ${LANG_SPANISH} "Lenguaje de Instalación"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_SPANISH} "Please select the language of the installer"
LangString SelectInstallerLanguage ${LANG_SPANISH} "Seleccione el lenguaje de instalación"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_SPANISH} "mRemoteNG requires Microsoft .NET Framework 3.0."
LangString RequiresNetFramework ${LANG_SPANISH} "mRemoteNG requiere Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_SPANISH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
LangString RequiresAdminUser ${LANG_SPANISH} "Debe ser miembro del grupo 'Administradores' para poder instalar mRemoteNG."
; Start Menu items
LangString CreditsLinkName ${LANG_SPANISH} "Credits"
LangString CopyingLinkName ${LANG_SPANISH} "License"
LangString UninstallLinkName ${LANG_SPANISH} "Uninstall"
LangString ChangeLogLinkName ${LANG_SPANISH} "Version History"
LangString CreditsLinkName ${LANG_SPANISH} "Créditos"
LangString CopyingLinkName ${LANG_SPANISH} "Licencia"
LangString UninstallLinkName ${LANG_SPANISH} "Desinstalar"
LangString ChangeLogLinkName ${LANG_SPANISH} "Historial de Versiones"

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

26
Sort Language Files.cmd Normal file
View File

@@ -0,0 +1,26 @@
@echo off
set TEMP_FOLDER="%TEMP%\Translations.tmp"
set SORTRESX="%~dp0\Tools\SortRESX.exe"
echo.
echo This script sorts the language files
echo.
choice /m "Would you like to continue?"
echo.
rmdir /s /q %TEMP_FOLDER%
mkdir %TEMP_FOLDER%
copy "%~dp0\mRemoteV1\Language\*.resx" %TEMP_FOLDER%
pushd %TEMP_FOLDER%
for %%f in (*) do %SORTRESX% %TEMP_FOLDER%\%%f "%~dp0\mRemoteV1\Language\%%f"
popd
rmdir /s /q %TEMP_FOLDER%
echo Done.
echo.
pause

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

@@ -28,13 +28,17 @@ mkdir %TEMP_FOLDER%
%RAR% x -o+ %ZIP_FILE% *.* %TEMP_FOLDER%
%SORTRESX% %TEMP_FOLDER%\ar\Language.ar.resx "%~dp0\mRemoteV1\Language\Language.ar.resx"
%SORTRESX% %TEMP_FOLDER%\bg\Language.bg.resx "%~dp0\mRemoteV1\Language\Language.bg.resx"
%SORTRESX% %TEMP_FOLDER%\de\Language.de.resx "%~dp0\mRemoteV1\Language\Language.de.resx"
%SORTRESX% %TEMP_FOLDER%\el\Language.el.resx "%~dp0\mRemoteV1\Language\Language.el.resx"
%SORTRESX% %TEMP_FOLDER%\en-US\Language.en.resx "%~dp0\mRemoteV1\Language\Language.en-US.resx"
%SORTRESX% %TEMP_FOLDER%\es-AR\Language.es.resx "%~dp0\mRemoteV1\Language\Language.es-AR.resx"
%SORTRESX% %TEMP_FOLDER%\es-ES\Language.es.resx "%~dp0\mRemoteV1\Language\Language.es.resx"
%SORTRESX% %TEMP_FOLDER%\fr\Language.fr.resx "%~dp0\mRemoteV1\Language\Language.fr.resx"
%SORTRESX% %TEMP_FOLDER%\he\Language.he.resx "%~dp0\mRemoteV1\Language\Language.he.resx"
%SORTRESX% %TEMP_FOLDER%\hu\Language.hu.resx "%~dp0\mRemoteV1\Language\Language.hu.resx"
%SORTRESX% %TEMP_FOLDER%\it\Language.it.resx "%~dp0\mRemoteV1\Language\Language.it.resx"
%SORTRESX% %TEMP_FOLDER%\nb\Language.nb.resx "%~dp0\mRemoteV1\Language\Language.nb-NO.resx"
%SORTRESX% %TEMP_FOLDER%\nl\Language.nl.resx "%~dp0\mRemoteV1\Language\Language.nl.resx"
%SORTRESX% %TEMP_FOLDER%\pl\Language.pl.resx "%~dp0\mRemoteV1\Language\Language.pl.resx"
%SORTRESX% %TEMP_FOLDER%\pt-BR\Language.pt.resx "%~dp0\mRemoteV1\Language\Language.pt-BR.resx"
@@ -42,6 +46,7 @@ mkdir %TEMP_FOLDER%
%SORTRESX% %TEMP_FOLDER%\ru\Language.ru.resx "%~dp0\mRemoteV1\Language\Language.ru.resx"
%SORTRESX% %TEMP_FOLDER%\uk\Language.uk.resx "%~dp0\mRemoteV1\Language\Language.uk.resx"
%SORTRESX% %TEMP_FOLDER%\zh-CN\Language.zh.resx "%~dp0\mRemoteV1\Language\Language.zh-CN.resx"
%SORTRESX% %TEMP_FOLDER%\zh-TW\Language.zh.resx "%~dp0\mRemoteV1\Language\Language.zh-TW.resx"
rmdir /s /q %TEMP_FOLDER%

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>

View File

@@ -1,181 +0,0 @@
Imports System.Net
Imports mRemoteNG.App.Runtime
Namespace App
Public Class Announcement
Implements IDisposable
#Region "Private Variables"
Private webClient As WebClient
Private webProxy As WebProxy
#End Region
#Region "Public Properties"
Private _currentAnnouncementInfo As Info
Public ReadOnly Property CurrentAnnouncementInfo() As Info
Get
Return _currentAnnouncementInfo
End Get
End Property
#End Region
#Region "Public Methods"
Public Function IsAnnouncementAvailable() As Boolean
Try
Dim aI As Info = GetAnnouncementInfo()
If aI.InfoOk = False Then
Return False
End If
If aI.Name <> My.Settings.LastAnnouncement Then
Return True
Else
Return False
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "IsAnnouncementAvailable failed" & vbNewLine & ex.Message, True)
Return False
End Try
End Function
Public Function GetAnnouncementInfo() As Info
Try
Dim strAnnouncement As String = GetAnnouncementFile()
CreateWebClient()
Dim aI As New Info()
If strAnnouncement <> "" Then
aI.InfoOk = True
Try
'get Name
Dim strName As String = strAnnouncement.Substring(strAnnouncement.IndexOf("Name: ") + 6, strAnnouncement.IndexOf(vbNewLine) - 6)
aI.Name = strName
strAnnouncement = strAnnouncement.Remove(0, strAnnouncement.IndexOf(vbNewLine) + 2)
'get Download URL
Dim strU As String = ""
strU = strAnnouncement.Substring(strAnnouncement.IndexOf("URL: ") + 5, strAnnouncement.IndexOf(vbNewLine) - 5)
aI.Url = strU
Catch ex As Exception
aI.InfoOk = False
End Try
Else
aI.InfoOk = False
End If
_currentAnnouncementInfo = aI
Return aI
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Getting Announcement info failed" & vbNewLine & ex.Message, True)
Return Nothing
End Try
End Function
Private Function GetAnnouncementFile() As String
Try
CreateWebClient()
Dim strTemp As String
Try
strTemp = webClient.DownloadString(App.Info.General.URLAnnouncement)
Catch ex As Exception
strTemp = ""
End Try
Return strTemp
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "GetAnnouncementFile failed" & vbNewLine & ex.Message, True)
Return ""
End Try
End Function
Private Sub CreateWebClient()
webClient = New WebClient()
If My.Settings.UpdateUseProxy Then
webProxy = New WebProxy(My.Settings.UpdateProxyAddress, My.Settings.UpdateProxyPort)
If My.Settings.UpdateProxyUseAuthentication Then
Dim cred As ICredentials
cred = New NetworkCredential(My.Settings.UpdateProxyAuthUser, Security.Crypt.Decrypt(My.Settings.UpdateProxyAuthPass, App.Info.General.EncryptionKey))
webProxy.Credentials = cred
End If
webClient.Proxy = webProxy
End If
End Sub
#End Region
Public Class Info
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _url As String
Public Property Url() As String
Get
Return _url
End Get
Set(ByVal value As String)
_url = value
End Set
End Property
Private _InfoOk As Boolean
Public Property InfoOk() As Boolean
Get
Return _InfoOk
End Get
Set(ByVal value As Boolean)
_InfoOk = value
End Set
End Property
End Class
#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
If webClient IsNot Nothing Then webClient.Dispose()
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
'Protected Overrides Sub Finalize()
' ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
End Namespace

View File

@@ -1,4 +1,5 @@
Imports System.Environment
Imports System.Threading
Namespace App
Namespace Info
@@ -7,10 +8,27 @@ Namespace App
Public Shared ReadOnly URLDonate As String = "http://donate.mremoteng.org/"
Public Shared ReadOnly URLForum As String = "http://forum.mremoteng.org/"
Public Shared ReadOnly URLBugs As String = "http://bugs.mremoteng.org/"
Public Shared ReadOnly URLAnnouncement As String = "http://update.mremoteng.org/announcement.txt"
Public Shared ReadOnly HomePath As String = My.Application.Info.DirectoryPath
Public Shared EncryptionKey As String = "mR3m"
Public Shared ReportingFilePath As String = ""
Public Shared ReadOnly PuttyPath As String = My.Application.Info.DirectoryPath & "\PuTTYNG.exe"
Public Shared ReadOnly Property UserAgent As String
Get
Dim details As New List(Of String)
details.Add("compatible")
If OSVersion.Platform = PlatformID.Win32NT Then
details.Add(String.Format("Windows NT {0}.{1}", OSVersion.Version.Major, OSVersion.Version.Minor))
Else
details.Add(OSVersion.VersionString)
End If
If Tools.EnvironmentInfo.IsWow64 Then details.Add("WOW64")
details.Add(Thread.CurrentThread.CurrentUICulture.Name)
details.Add(String.Format(".NET CLR {0}", Version.ToString()))
Dim detailsString As String = String.Join("; ", details.ToArray())
Return String.Format("Mozilla/4.0 ({0}) {1}/{2}", detailsString, Application.ProductName, Application.ProductVersion)
End Get
End Property
End Class
Public Class Settings
@@ -21,22 +39,32 @@ Namespace App
#End If
Public Shared ReadOnly LayoutFileName As String = "pnlLayout.xml"
Public Shared ReadOnly ExtAppsFilesName As String = "extApps.xml"
Public Const ThemesFileName As String = "Themes.xml"
End Class
Public Class Update
Public Shared ReadOnly URL As String = "http://update.mremoteng.org/"
Public Shared ReadOnly Property FileName As String
Get
#If DEBUG Then
Public Shared ReadOnly File As String = "update-debug.txt"
#Else
Public Shared ReadOnly File As String = "update.txt"
Return "update-debug.txt"
#End If
Select Case My.Settings.UpdateChannel.ToLowerInvariant()
Case "beta"
Return "update-beta.txt"
Case "debug"
Return "update-debug.txt"
Case Else
Return "update.txt"
End Select
End Get
End Property
End Class
Public Class Connections
Public Shared ReadOnly DefaultConnectionsPath As String = App.Info.Settings.SettingsPath
Public Shared ReadOnly DefaultConnectionsFile As String = "confCons.xml"
Public Shared ReadOnly DefaultConnectionsFileNew As String = "confConsNew.xml"
Public Shared ReadOnly ConnectionFileVersion As Double = 2.4
Public Shared ReadOnly ConnectionFileVersion As Double = 2.5
End Class
Public Class Credentials

File diff suppressed because it is too large Load Diff

View File

@@ -1,264 +1,431 @@
Imports System.IO
Imports System.Net
Imports mRemoteNG.App.Runtime
Imports System.ComponentModel
Imports System.Threading
Imports mRemoteNG.Tools
Imports System.Reflection
Namespace App
Public Class Update
Public Event DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
Public Event DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs, ByVal Success As Boolean)
#Region "Events"
Public Event GetUpdateInfoCompletedEvent As AsyncCompletedEventHandler
Public Event GetChangeLogCompletedEvent As AsyncCompletedEventHandler
Public Event GetAnnouncementInfoCompletedEvent As AsyncCompletedEventHandler
Public Event DownloadUpdateProgressChangedEvent As DownloadProgressChangedEventHandler
Public Event DownloadUpdateCompletedEvent As AsyncCompletedEventHandler
#End Region
#Region "Public Properties"
Private _curUI As Info
Public ReadOnly Property curUI() As Info
Private _currentUpdateInfo As UpdateInfo
Public ReadOnly Property CurrentUpdateInfo() As UpdateInfo
Get
Return _curUI
Return _currentUpdateInfo
End Get
End Property
Private _changeLog As String
Public ReadOnly Property ChangeLog() As String
Get
Return _changeLog
End Get
End Property
Private _currentAnnouncementInfo As AnnouncementInfo
Public ReadOnly Property CurrentAnnouncementInfo() As AnnouncementInfo
Get
Return _currentAnnouncementInfo
End Get
End Property
Public ReadOnly Property IsGetUpdateInfoRunning() As Boolean
Get
If _getUpdateInfoThread IsNot Nothing Then
If _getUpdateInfoThread.IsAlive Then Return True
End If
Return False
End Get
End Property
Public ReadOnly Property IsGetChangeLogRunning() As Boolean
Get
If _getChangeLogThread IsNot Nothing Then
If _getChangeLogThread.IsAlive Then Return True
End If
Return False
End Get
End Property
Public ReadOnly Property IsGetAnnouncementInfoRunning() As Boolean
Get
If _getAnnouncementInfoThread IsNot Nothing Then
If _getAnnouncementInfoThread.IsAlive Then Return True
End If
Return False
End Get
End Property
Public ReadOnly Property IsDownloadUpdateRunning() As Boolean
Get
Return (_downloadUpdateWebClient IsNot Nothing)
End Get
End Property
#End Region
#Region "Private Properties"
Private wCl As WebClient
Private wPr As WebProxy
#End Region
#Region "Public Methods"
Public Function IsProxyOK() As Boolean
Try
Dim uI As Info = GetUpdateInfo()
Public Sub New()
SetProxySettings()
End Sub
Return uI.InfoOk
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "IsProxyOK (App.Update) failed" & vbNewLine & ex.Message, False)
Return False
End Try
End Function
Public Sub SetProxySettings()
SetProxySettings(My.Settings.UpdateUseProxy, My.Settings.UpdateProxyAddress, My.Settings.UpdateProxyPort, My.Settings.UpdateProxyUseAuthentication, My.Settings.UpdateProxyAuthUser, Security.Crypt.Decrypt(My.Settings.UpdateProxyAuthPass, Info.General.EncryptionKey))
End Sub
Public Function IsUpdateAvailable() As Boolean
Try
Dim uI As Info = GetUpdateInfo()
If uI.InfoOk = False Then
Return False
End If
If uI.Version > My.Application.Info.Version Then
Return True
Public Sub SetProxySettings(ByVal useProxy As Boolean, ByVal address As String, ByVal port As Integer, ByVal useAuthentication As Boolean, ByVal username As String, ByVal password As String)
If useProxy And Not String.IsNullOrEmpty(address) Then
If Not port = 0 Then
_webProxy = New WebProxy(address, port)
Else
Return False
_webProxy = New WebProxy(address)
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "IsUpdateAvailable failed" & vbNewLine & ex.Message, True)
Return False
End Try
End Function
Public Function GetUpdateInfo() As Info
Try
Dim strUpdate As String = GetUpdateFile()
CreateWebClient()
Dim uI As New Info()
If strUpdate <> "" Then
uI.InfoOk = True
Try
'get Version
Dim strV As String = strUpdate.Substring(strUpdate.IndexOf("Version: ") + 9, strUpdate.IndexOf(vbNewLine) - 9)
uI.Version = New Version(strV)
strUpdate = strUpdate.Remove(0, strUpdate.IndexOf(vbNewLine) + 2)
'get Download URL
Dim strU As String = ""
strU = strUpdate.Substring(strUpdate.IndexOf("dURL: ") + 6, strUpdate.IndexOf(vbNewLine) - 6)
uI.DownloadUrl = strU
strUpdate = strUpdate.Remove(0, strUpdate.IndexOf(vbNewLine) + 2)
'get Change Log
Dim strClURL As String = strUpdate.Substring(strUpdate.IndexOf("clURL: ") + 7, strUpdate.IndexOf(vbNewLine) - 7)
Dim strCl As String = wCl.DownloadString(strClURL)
uI.ChangeLog = strCl
strUpdate = strUpdate.Remove(0, strUpdate.IndexOf(vbNewLine) + 2)
Try
'get Image
Dim strImgURL As String = strUpdate.Substring(strUpdate.IndexOf("imgURL: ") + 8, strUpdate.IndexOf(vbNewLine) - 8)
uI.ImageURL = strImgURL
strUpdate = strUpdate.Remove(0, strUpdate.IndexOf(vbNewLine) + 2)
'get Image Link
Dim strImgURLLink As String = strUpdate.Substring(strUpdate.IndexOf("imgURLLink: ") + 12, strUpdate.IndexOf(vbNewLine) - 12)
uI.ImageURLLink = strImgURLLink
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Update Image Info could not be read." & vbNewLine & ex.Message, True)
End Try
Catch ex As Exception
uI.InfoOk = False
End Try
If useAuthentication Then
_webProxy.Credentials = New NetworkCredential(username, password)
Else
uI.InfoOk = False
_webProxy.Credentials = Nothing
End If
_curUI = uI
Return uI
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Getting update info failed" & vbNewLine & ex.Message, True)
Return Nothing
End Try
End Function
Public Function DownloadUpdate(ByVal dURL As String) As Boolean
Try
CreateWebClient()
AddHandler wCl.DownloadProgressChanged, AddressOf DLProgressChanged
AddHandler wCl.DownloadFileCompleted, AddressOf DLCompleted
_curUI.UpdateLocation = My.Computer.FileSystem.SpecialDirectories.Temp & "\mRemote_Update.exe"
wCl.DownloadFileAsync(New Uri(dURL), _curUI.UpdateLocation)
Return True
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Update download failed" & vbNewLine & ex.Message, True)
Return False
End Try
End Function
#End Region
#Region "Private Methods"
Private Sub CreateWebClient()
wCl = New WebClient()
If My.Settings.UpdateUseProxy Then
wPr = New WebProxy(My.Settings.UpdateProxyAddress, My.Settings.UpdateProxyPort)
If My.Settings.UpdateProxyUseAuthentication Then
Dim cred As ICredentials
cred = New NetworkCredential(My.Settings.UpdateProxyAuthUser, Security.Crypt.Decrypt(My.Settings.UpdateProxyAuthPass, App.Info.General.EncryptionKey))
wPr.Credentials = cred
End If
wCl.Proxy = wPr
Else
_webProxy = Nothing
End If
End Sub
Private Function GetUpdateFile() As String
Try
CreateWebClient()
Public Function IsUpdateAvailable() As Boolean
If _currentUpdateInfo Is Nothing OrElse Not _currentUpdateInfo.IsValid Then Return False
Dim strTemp As String
Try
strTemp = wCl.DownloadString(App.Info.Update.URL & App.Info.Update.File)
Catch ex As Exception
strTemp = ""
End Try
Return strTemp
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "GetUpdateFile failed" & vbNewLine & ex.Message, True)
Return ""
End Try
Return _currentUpdateInfo.Version > My.Application.Info.Version
End Function
Private Sub DLProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
RaiseEvent DownloadProgressChanged(sender, e)
Public Function IsAnnouncementAvailable() As Boolean
If _currentAnnouncementInfo Is Nothing OrElse _
(Not _currentAnnouncementInfo.IsValid Or _
String.IsNullOrEmpty(_currentAnnouncementInfo.Name)) Then Return False
Return (Not _currentAnnouncementInfo.Name = My.Settings.LastAnnouncement)
End Function
Public Sub GetUpdateInfoAsync()
If IsGetUpdateInfoRunning Then _getUpdateInfoThread.Abort()
_getUpdateInfoThread = New Thread(AddressOf GetUpdateInfo)
With _getUpdateInfoThread
.SetApartmentState(ApartmentState.STA)
.IsBackground = True
.Start()
End With
End Sub
Private Sub DLCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
Try
Dim fInfo As New FileInfo(_curUI.UpdateLocation)
Public Sub GetChangeLogAsync()
If _currentUpdateInfo Is Nothing OrElse Not _currentUpdateInfo.IsValid Then
Throw New InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling GetChangeLogAsync().")
End If
If fInfo.Length > 0 Then
RaiseEvent DownloadCompleted(sender, e, True)
Else
fInfo.Delete()
RaiseEvent DownloadCompleted(sender, e, False)
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "DLCompleted failed" & vbNewLine & ex.Message, True)
End Try
If IsGetChangeLogRunning Then _getChangeLogThread.Abort()
_getChangeLogThread = New Thread(AddressOf GetChangeLog)
With _getChangeLogThread
.SetApartmentState(ApartmentState.STA)
.IsBackground = True
.Start()
End With
End Sub
Public Sub GetAnnouncementInfoAsync()
If IsGetAnnouncementInfoRunning Then _getAnnouncementInfoThread.Abort()
_getAnnouncementInfoThread = New Thread(AddressOf GetAnnouncementInfo)
With _getAnnouncementInfoThread
.SetApartmentState(ApartmentState.STA)
.IsBackground = True
.Start()
End With
End Sub
Public Sub DownloadUpdateAsync()
If _downloadUpdateWebClient IsNot Nothing Then
Throw New InvalidOperationException("A previous call to DownloadUpdateAsync() is still in progress.")
End If
If _currentUpdateInfo Is Nothing OrElse Not _currentUpdateInfo.IsValid Then
Throw New InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling DownloadUpdateAsync().")
End If
_currentUpdateInfo.UpdateFilePath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName, "exe"))
DownloadUpdateWebClient.DownloadFileAsync(CurrentUpdateInfo.DownloadAddress, _currentUpdateInfo.UpdateFilePath)
End Sub
#End Region
Public Class Info
Private _Version As Version
Public Property Version() As Version
Get
Return _Version
End Get
Set(ByVal value As Version)
_Version = value
End Set
End Property
#Region "Private Properties"
Private _downloadUpdateWebClient As WebClient
Private ReadOnly Property DownloadUpdateWebClient() As WebClient
Get
If _downloadUpdateWebClient IsNot Nothing Then Return _downloadUpdateWebClient
Private _DownloadUrl As String
Public Property DownloadUrl() As String
Get
Return _DownloadUrl
End Get
Set(ByVal value As String)
_DownloadUrl = value
End Set
End Property
_downloadUpdateWebClient = CreateWebClient()
Private _UpdateLocation As String
Public Property UpdateLocation() As String
Get
Return _UpdateLocation
End Get
Set(ByVal value As String)
_UpdateLocation = value
End Set
End Property
AddHandler _downloadUpdateWebClient.DownloadProgressChanged, AddressOf DownloadUpdateProgressChanged
AddHandler _downloadUpdateWebClient.DownloadFileCompleted, AddressOf DownloadUpdateCompleted
Private _ChangeLog As String
Public Property ChangeLog() As String
Get
Return _ChangeLog
End Get
Set(ByVal value As String)
_ChangeLog = value
End Set
End Property
Return _downloadUpdateWebClient
End Get
End Property
#End Region
Private _ImageURL As String
Public Property ImageURL() As String
Get
Return _ImageURL
End Get
Set(ByVal value As String)
_ImageURL = value
End Set
End Property
#Region "Private Fields"
Private _webProxy As WebProxy
Private _getUpdateInfoThread As Thread
Private _getChangeLogThread As Thread
Private _getAnnouncementInfoThread As Thread
#End Region
Private _ImageURLLink As String
Public Property ImageURLLink() As String
Get
Return _ImageURLLink
End Get
Set(ByVal value As String)
_ImageURLLink = value
End Set
End Property
#Region "Private Methods"
Private Function CreateWebClient() As WebClient
Dim webClient As New WebClient
webClient.Headers.Add("user-agent", Info.General.UserAgent)
webClient.Proxy = _webProxy
Return webClient
End Function
Private _InfoOk As Boolean
Public Property InfoOk() As Boolean
Get
Return _InfoOk
End Get
Set(ByVal value As Boolean)
_InfoOk = value
End Set
End Property
Private Shared Function NewDownloadStringCompletedEventArgs(ByVal result As String, ByVal exception As Exception, ByVal cancelled As Boolean, ByVal userToken As Object) As DownloadStringCompletedEventArgs
Dim type As Type = GetType(DownloadStringCompletedEventArgs)
Const bindingFlags As BindingFlags = bindingFlags.NonPublic Or bindingFlags.Instance
Dim argumentTypes() As Type = {GetType(String), GetType(Exception), GetType(Boolean), GetType(Object)}
Dim constructor As ConstructorInfo = type.GetConstructor(bindingFlags, Nothing, argumentTypes, Nothing)
Dim arguments() As Object = {result, exception, cancelled, userToken}
Return constructor.Invoke(arguments)
End Function
Private Function DownloadString(ByVal address As Uri) As DownloadStringCompletedEventArgs
Dim webClient As WebClient = CreateWebClient()
Dim result As String = String.Empty
Dim exception As Exception = Nothing
Dim cancelled As Boolean = False
Try
result = webClient.DownloadString(address)
Catch ex As ThreadAbortException
cancelled = True
Catch ex As Exception
exception = ex
End Try
Return NewDownloadStringCompletedEventArgs(result, exception, cancelled, Nothing)
End Function
Private Sub GetUpdateInfo()
Dim updateFileUri As New Uri(New Uri(My.Settings.UpdateAddress), New Uri(Info.Update.FileName, UriKind.Relative))
Dim e As DownloadStringCompletedEventArgs = DownloadString(updateFileUri)
If Not e.Cancelled And e.Error Is Nothing Then
_currentUpdateInfo = UpdateInfo.FromString(e.Result)
My.Settings.CheckForUpdatesLastCheck = Date.UtcNow
If Not My.Settings.UpdatePending Then
My.Settings.UpdatePending = IsUpdateAvailable()
End If
End If
RaiseEvent GetUpdateInfoCompletedEvent(Me, e)
End Sub
Private Sub GetChangeLog()
Dim e As DownloadStringCompletedEventArgs = DownloadString(_currentUpdateInfo.ChangeLogAddress)
If Not e.Cancelled And e.Error Is Nothing Then _changeLog = e.Result
RaiseEvent GetChangeLogCompletedEvent(Me, e)
End Sub
Private Sub GetAnnouncementInfo()
Dim announcementFileUri As New Uri(My.Settings.AnnouncementAddress)
Dim e As DownloadStringCompletedEventArgs = DownloadString(announcementFileUri)
If Not e.Cancelled And e.Error Is Nothing Then
_currentAnnouncementInfo = AnnouncementInfo.FromString(e.Result)
If Not String.IsNullOrEmpty(_currentAnnouncementInfo.Name) Then
My.Settings.LastAnnouncement = _currentAnnouncementInfo.Name
End If
End If
RaiseEvent GetAnnouncementInfoCompletedEvent(Me, e)
End Sub
Private Sub DownloadUpdateProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
RaiseEvent DownloadUpdateProgressChangedEvent(sender, e)
End Sub
Private Sub DownloadUpdateCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
Dim raiseEventArgs As AsyncCompletedEventArgs = e
If Not e.Cancelled And e.Error Is Nothing Then
Try
Dim updateAuthenticode As New Authenticode(_currentUpdateInfo.UpdateFilePath)
With updateAuthenticode
.RequireThumbprintMatch = True
.ThumbprintToMatch = _currentUpdateInfo.CertificateThumbprint
If Not .Verify() = Authenticode.StatusValue.Verified Then
If .Status = Authenticode.StatusValue.UnhandledException Then
Throw .Exception
Else
Throw New Exception(.StatusMessage)
End If
End If
End With
Catch ex As Exception
raiseEventArgs = New AsyncCompletedEventArgs(ex, False, Nothing)
End Try
End If
If raiseEventArgs.Cancelled Or raiseEventArgs.Error IsNot Nothing Then
File.Delete(_currentUpdateInfo.UpdateFilePath)
End If
RaiseEvent DownloadUpdateCompletedEvent(Me, raiseEventArgs)
_downloadUpdateWebClient.Dispose()
_downloadUpdateWebClient = Nothing
End Sub
#End Region
#Region "Public Classes"
Public Class UpdateInfo
#Region "Public Properties"
Public Property IsValid As Boolean
Public Property Version As Version
Public Property DownloadAddress As Uri
Public Property UpdateFilePath As String
Public Property ChangeLogAddress As Uri
Public Property ImageAddress As Uri
Public Property ImageLinkAddress As Uri
Public Property CertificateThumbprint As String
#End Region
#Region "Public Methods"
Public Shared Function FromString(ByVal input As String) As UpdateInfo
Dim newInfo As New UpdateInfo
With newInfo
If String.IsNullOrEmpty(input) Then
.IsValid = False
Else
Dim updateFile As New UpdateFile(input)
.Version = updateFile.GetVersion("Version")
.DownloadAddress = updateFile.GetUri("dURL")
.ChangeLogAddress = updateFile.GetUri("clURL")
.ImageAddress = updateFile.GetUri("imgURL")
.ImageLinkAddress = updateFile.GetUri("imgURLLink")
.CertificateThumbprint = updateFile.GetThumbprint("CertificateThumbprint")
.IsValid = True
End If
End With
Return newInfo
End Function
#End Region
End Class
Public Class AnnouncementInfo
#Region "Public Properties"
Public Property IsValid As Boolean
Public Property Name As String
Public Property Address As Uri
#End Region
#Region "Public Methods"
Public Shared Function FromString(ByVal input As String) As AnnouncementInfo
Dim newInfo As New AnnouncementInfo
With newInfo
If String.IsNullOrEmpty(input) Then
.IsValid = False
Else
Dim updateFile As New UpdateFile(input)
.Name = updateFile.GetString("Name")
.Address = updateFile.GetUri("URL")
.IsValid = True
End If
End With
Return newInfo
End Function
#End Region
End Class
#End Region
#Region "Private Classes"
Private Class UpdateFile
#Region "Public Properties"
Private ReadOnly _items As New Dictionary(Of String, String)(StringComparer.InvariantCultureIgnoreCase)
' ReSharper disable MemberCanBePrivate.Local
Public ReadOnly Property Items() As Dictionary(Of String, String)
' ReSharper restore MemberCanBePrivate.Local
Get
Return _items
End Get
End Property
#End Region
#Region "Public Methods"
Public Sub New(ByVal content As String)
FromString(content)
End Sub
' ReSharper disable MemberCanBePrivate.Local
Public Sub FromString(ByVal content As String)
' ReSharper restore MemberCanBePrivate.Local
If String.IsNullOrEmpty(content) Then
Else
Dim lineSeparators() As Char = New Char() {Chr(&HA), Chr(&HD)}
Dim keyValueSeparators() As Char = New Char() {":", "="}
Dim commentCharacters() As Char = New Char() {"#", ";", "'"}
Dim lines() As String = content.Split(lineSeparators, StringSplitOptions.RemoveEmptyEntries)
For Each line As String In lines
line = line.Trim()
If line.Length = 0 Then Continue For
If Not line.Substring(0, 1).IndexOfAny(commentCharacters) = -1 Then Continue For
Dim parts() As String = line.Split(keyValueSeparators, 2)
If Not parts.Length = 2 Then Continue For
Dim key As String = parts(0).Trim()
Dim value As String = parts(1).Trim()
_items.Add(key, value)
Next
End If
End Sub
' ReSharper disable MemberCanBePrivate.Local
Public Function GetString(ByVal key As String) As String
' ReSharper restore MemberCanBePrivate.Local
If Not Items.ContainsKey(key) Then Return String.Empty
Return Items(key)
End Function
Public Function GetVersion(ByVal key As String) As Version
Dim value As String = GetString(key)
If String.IsNullOrEmpty(value) Then Return Nothing
Return New Version(value)
End Function
Public Function GetUri(ByVal key As String) As Uri
Dim value As String = GetString(key)
If String.IsNullOrEmpty(value) Then Return Nothing
Return New Uri(value)
End Function
Public Function GetThumbprint(ByVal key As String) As String
Return GetString(key).Replace(" ", "").ToUpperInvariant()
End Function
#End Region
End Class
#End Region
End Class
End Namespace

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,8 @@ Imports mRemoteNG.App.Runtime
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports mRemoteNG.My
Imports PSTaskDialog
Namespace Config
Namespace Connections
@@ -18,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"
@@ -102,35 +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 _Import As Boolean
Public Property Import() As Boolean
Get
Return Me._Import
End Get
Set(ByVal value As Boolean)
Me._Import = 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
@@ -164,25 +140,32 @@ Namespace Config
#End Region
#Region "Public Methods"
Public Sub Load()
If _UseSQL = True Then
Public Sub Load(ByVal import As Boolean)
If UseSQL Then
LoadFromSQL()
SetMainFormText("SQL Server")
Else
Dim strCons As String = DecryptCompleteFile()
LoadFromXML(strCons)
Dim connections As String = DecryptCompleteFile()
LoadFromXML(connections, import)
End If
If Import = False Then
SetMainFormText(ConnectionFileName)
End If
frmMain.UsingSqlServer = UseSQL
frmMain.ConnectionsFileName = ConnectionFileName
If Not import Then Putty.Sessions.AddSessionsToTree()
End Sub
#End Region
#Region "SQL"
Private Delegate Sub LoadFromSqlDelegate()
Private Sub LoadFromSQL()
If Windows.treeForm Is Nothing OrElse Windows.treeForm.tvConnections Is Nothing Then Return
If Windows.treeForm.tvConnections.InvokeRequired Then
Windows.treeForm.tvConnections.Invoke(New LoadFromSqlDelegate(AddressOf LoadFromSQL))
Return
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)
@@ -198,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)
@@ -206,40 +189,40 @@ Namespace Config
sqlRd.Read()
End If
Me.confVersion = Convert.ToDouble(sqlRd.Item("confVersion"), CultureInfo.InvariantCulture)
confVersion = Convert.ToDouble(sqlRd.Item("confVersion"), CultureInfo.InvariantCulture)
Const maxSupportedSchemaVersion As Double = 2.5
If confVersion > maxSupportedSchemaVersion Then
cTaskDialog.ShowTaskDialogBox(frmMain, Application.ProductName, "Incompatible database schema", String.Format("The database schema on the server is not supported. Please upgrade to a newer version of {0}.", Application.ProductName), String.Format("Schema Version: {1}{0}Highest Supported Version: {2}", vbNewLine, confVersion.ToString(), maxSupportedSchemaVersion.ToString()), "", "", "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
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()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodesFromSQL(rootNode)
'AddNodeFromXml(xDom.DocumentElement, Me._RootTreeNode)
Windows.treeForm.tvConnections.BeginUpdate()
rootNode.Expand()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodesFromSQL(RootTreeNode)
RootTreeNode.Expand()
'expand containers
For Each contI As Container.Info In Me._ContainerList
@@ -248,53 +231,38 @@ Namespace Config
End If
Next
Windows.treeForm.tvConnections.EndUpdate()
'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()
sqlCon.Close()
IsConnectionsFileLoaded = True
Windows.treeForm.InitialRefresh()
SetSelectedNode(_selectedTreeNode)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLoadFromSqlFailed & vbNewLine & ex.Message, True)
Throw
Finally
If sqlCon IsNot Nothing Then
sqlCon.Close()
End If
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()
@@ -342,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
@@ -375,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
@@ -393,7 +361,10 @@ Namespace Config
tNode.SelectedImageIndex = Images.Enums.TreeImage.Container
End If
If sqlRd.Item("ParentID") <> 0 Then
Dim parentId As String = sqlRd.Item("ParentID").ToString().Trim()
If String.IsNullOrEmpty(parentId) Or parentId = "0" Then
baseNode.Nodes.Add(tNode)
Else
Dim pNode As TreeNode = Tree.Node.GetNodeFromConstantID(sqlRd.Item("ParentID"))
If pNode IsNot Nothing Then
@@ -407,8 +378,6 @@ Namespace Config
Else
baseNode.Nodes.Add(tNode)
End If
Else
baseNode.Nodes.Add(tNode)
End If
'AddNodesFromSQL(tNode)
@@ -564,6 +533,13 @@ Namespace Config
conI.Inherit.UseCredSsp = .Item("InheritUseCredSsp")
End If
If confVersion >= 2.5 Then
conI.LoadBalanceInfo = .Item("LoadBalanceInfo")
conI.AutomaticResize = .Item("AutomaticResize")
conI.Inherit.LoadBalanceInfo = .Item("InheritLoadBalanceInfo")
conI.Inherit.AutomaticResize = .Item("InheritAutomaticResize")
End If
If SQLUpdate = True Then
conI.PleaseConnect = .Item("Connected")
End If
@@ -626,9 +602,9 @@ Namespace Config
Return ""
End Function
Private Sub LoadFromXML(Optional ByVal cons As String = "")
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()
@@ -644,59 +620,67 @@ Namespace Config
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strOldConffile)
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)
Else
rootNode = New TreeNode(xDom.DocumentElement.Name)
Const maxSupportedConfVersion As Double = 2.5
If confVersion > maxSupportedConfVersion Then
cTaskDialog.ShowTaskDialogBox(frmMain, Application.ProductName, "Incompatible connection file format", String.Format("The format of this connection file is not supported. Please upgrade to a newer version of {0}.", Application.ProductName), String.Format("{1}{0}File Format Version: {2}{0}Highest Supported Version: {3}", vbNewLine, ConnectionFileName, confVersion.ToString(), maxSupportedConfVersion.ToString()), "", "", "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
Throw New Exception(String.Format("Incompatible connection file format (file format version {0}).", confVersion))
End If
Dim rInfo As New Root.Info(Root.Info.RootType.Connection)
rInfo.Name = rootNode.Text
rInfo.TreeNode = rootNode
' SECTION 2. Initialize the treeview control.
Dim rootInfo As Root.Info
If import Then
rootInfo = Nothing
Else
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
rootNode.Tag = rInfo
rootInfo = New Root.Info(Root.Info.RootType.Connection)
rootInfo.Name = RootTreeNode.Name
rootInfo.TreeNode = RootTreeNode
RootTreeNode.Tag = rootInfo
End If
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
End If
Dim imp As Boolean = False
If Me.confVersion > 0.9 Then '1.0
Dim isExportFile As Boolean = False
If confVersion >= 1.0 Then
If xDom.DocumentElement.Attributes("Export").Value = True Then
imp = True
isExportFile = True
End If
End If
If Me._Import = True And imp = False Then
If import And Not isExportFile Then
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strCannotImportNormalSessionFile)
Exit Sub
Return
End If
If imp = False Then
Me._RootTreeNode.Text = rootNode.Text
Me._RootTreeNode.Tag = rootNode.Tag
Me._RootTreeNode.ImageIndex = Images.Enums.TreeImage.Root
Me._RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
If Not isExportFile Then
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, Me._RootTreeNode)
AddNodeFromXml(xDom.DocumentElement, RootTreeNode)
Me._RootTreeNode.Expand()
RootTreeNode.Expand()
'expand containers
For Each contI As Container.Info In Me._ContainerList
@@ -705,20 +689,22 @@ Namespace Config
End If
Next
Windows.treeForm.tvConnections.EndUpdate()
'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)
@@ -734,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)
@@ -1037,6 +1023,13 @@ Namespace Config
conI.UseCredSsp = .Attributes("UseCredSsp").Value
conI.Inherit.UseCredSsp = .Attributes("InheritUseCredSsp").Value
End If
If confVersion >= 2.5 Then
conI.LoadBalanceInfo = .Attributes("LoadBalanceInfo").Value
conI.AutomaticResize = .Attributes("AutomaticResize").Value
conI.Inherit.LoadBalanceInfo = .Attributes("InheritLoadBalanceInfo").Value
conI.Inherit.AutomaticResize = .Attributes("InheritAutomaticResize").Value
End If
End With
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, String.Format(My.Language.strGetConnectionInfoFromXmlFailed, conI.Name, Me.ConnectionFileName, ex.Message), False)
@@ -1044,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
@@ -1055,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

@@ -5,7 +5,6 @@ Imports System.Globalization
Imports mRemoteNG.App.Runtime
Imports System.Data.SqlClient
Imports mRemoteNG.Tools.Misc
Imports mRemoteNG.My.Resources
Namespace Config
Namespace Connections
@@ -52,7 +51,6 @@ Namespace Config
Select Case SaveFormat
Case Format.SQL
SaveToSQL()
SetMainFormText("SQL Server")
Case Format.mRCSV
SaveTomRCSV()
Case Format.vRDvRE
@@ -64,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
@@ -80,7 +79,7 @@ Namespace Config
If (Not sqlDataReader.HasRows) Then Return True ' assume new empty database
sqlDataReader.Read()
databaseVersion = New System.Version(Convert.ToDouble(sqlDataReader.Item("confVersion"), CultureInfo.InvariantCulture))
databaseVersion = New Version(Convert.ToString(sqlDataReader.Item("confVersion"), CultureInfo.InvariantCulture))
sqlDataReader.Close()
@@ -98,7 +97,14 @@ Namespace Config
databaseVersion = New Version(2, 4)
End If
If databaseVersion.CompareTo(New System.Version(2, 4)) = 0 Then ' 2.4
If databaseVersion.CompareTo(New Version(2, 4)) = 0 Then ' 2.4
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format("Upgrading database from version {0} to version {1}.", databaseVersion.ToString, "2.5"))
sqlCommand = New SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection)
sqlCommand.ExecuteNonQuery()
databaseVersion = New Version(2, 5)
End If
If databaseVersion.CompareTo(New Version(2, 5)) = 0 Then ' 2.5
isVerified = True
End If
@@ -173,7 +179,7 @@ Namespace Config
Dim curConI As Connection.Info
_sqlQuery = New SqlCommand("INSERT INTO tblCons (Name, Type, Expanded, Description, Icon, Panel, Username, " & _
"DomainName, Password, Hostname, Protocol, PuttySession, " & _
"Port, ConnectToConsole, RenderingEngine, ICAEncryptionStrength, RDPAuthenticationLevel, Colors, Resolution, DisplayWallpaper, " & _
"Port, ConnectToConsole, RenderingEngine, ICAEncryptionStrength, RDPAuthenticationLevel, LoadBalanceInfo, Colors, Resolution, AutomaticResize, DisplayWallpaper, " & _
"DisplayThemes, EnableFontSmoothing, EnableDesktopComposition, CacheBitmaps, RedirectDiskDrives, RedirectPorts, " & _
"RedirectPrinters, RedirectSmartCards, RedirectSound, RedirectKeys, " & _
"Connected, PreExtApp, PostExtApp, MacAddress, UserField, ExtApp, VNCCompression, VNCEncoding, VNCAuthMode, " & _
@@ -186,15 +192,15 @@ Namespace Config
"InheritIcon, InheritPanel, InheritPassword, InheritPort, " & _
"InheritProtocol, InheritPuttySession, InheritRedirectDiskDrives, " & _
"InheritRedirectKeys, InheritRedirectPorts, InheritRedirectPrinters, " & _
"InheritRedirectSmartCards, InheritRedirectSound, InheritResolution, " & _
"InheritUseConsoleSession, InheritRenderingEngine, InheritUsername, InheritICAEncryptionStrength, InheritRDPAuthenticationLevel, " & _
"InheritRedirectSmartCards, InheritRedirectSound, InheritResolution, InheritAutomaticResize, " & _
"InheritUseConsoleSession, InheritRenderingEngine, InheritUsername, InheritICAEncryptionStrength, InheritRDPAuthenticationLevel, InheritLoadBalanceInfo, " & _
"InheritPreExtApp, InheritPostExtApp, InheritMacAddress, InheritUserField, InheritExtApp, InheritVNCCompression, InheritVNCEncoding, " & _
"InheritVNCAuthMode, InheritVNCProxyType, InheritVNCProxyIP, InheritVNCProxyPort, " & _
"InheritVNCProxyUsername, InheritVNCProxyPassword, InheritVNCColors, " & _
"InheritVNCSmartSizeMode, InheritVNCViewOnly, " & _
"InheritRDGatewayUsageMethod, InheritRDGatewayHostname, InheritRDGatewayUseConnectionCredentials, InheritRDGatewayUsername, InheritRDGatewayPassword, InheritRDGatewayDomain, " & _
"InheritUseCredSsp, " & _
"PositionID, _parentConstantId, ConstantID, LastChange)" & _
"PositionID, ParentID, ConstantID, LastChange)" & _
"VALUES (", _sqlConnection)
If Tree.Node.GetNodeType(node) = Tree.Node.Type.Connection Or Tree.Node.GetNodeType(node) = Tree.Node.Type.Container Then
@@ -260,8 +266,10 @@ Namespace Config
_sqlQuery.CommandText &= "'" & .RenderingEngine.ToString & "',"
_sqlQuery.CommandText &= "'" & .ICAEncryption.ToString & "',"
_sqlQuery.CommandText &= "'" & .RDPAuthenticationLevel.ToString & "',"
_sqlQuery.CommandText &= "'" & .LoadBalanceInfo & "',"
_sqlQuery.CommandText &= "'" & .Colors.ToString & "',"
_sqlQuery.CommandText &= "'" & .Resolution.ToString & "',"
_sqlQuery.CommandText &= "'" & .AutomaticResize & "',"
_sqlQuery.CommandText &= "'" & .DisplayWallpaper & "',"
_sqlQuery.CommandText &= "'" & .DisplayThemes & "',"
_sqlQuery.CommandText &= "'" & .EnableFontSmoothing & "',"
@@ -345,11 +353,13 @@ Namespace Config
_sqlQuery.CommandText &= "'" & .RedirectSmartCards & "',"
_sqlQuery.CommandText &= "'" & .RedirectSound & "',"
_sqlQuery.CommandText &= "'" & .Resolution & "',"
_sqlQuery.CommandText &= "'" & .AutomaticResize & "',"
_sqlQuery.CommandText &= "'" & .UseConsoleSession & "',"
_sqlQuery.CommandText &= "'" & .RenderingEngine & "',"
_sqlQuery.CommandText &= "'" & .Username & "',"
_sqlQuery.CommandText &= "'" & .ICAEncryption & "',"
_sqlQuery.CommandText &= "'" & .RDPAuthenticationLevel & "',"
_sqlQuery.CommandText &= "'" & .LoadBalanceInfo & "',"
_sqlQuery.CommandText &= "'" & .PreExtApp & "',"
_sqlQuery.CommandText &= "'" & .PostExtApp & "',"
_sqlQuery.CommandText &= "'" & .MacAddress & "',"
@@ -398,11 +408,15 @@ Namespace Config
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "'," ' .AutomaticResize
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "'," ' .LoadBalanceInfo
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
_sqlQuery.CommandText &= "'" & False & "',"
@@ -446,7 +460,7 @@ Namespace Config
End If
End If
_sqlQuery.CommandText &= _currentNodeIndex & "," & _parentConstantId & "," & .ConstantID & ",'" & Tools.Misc.DBDate(Now) & "')"
_sqlQuery.CommandText &= _currentNodeIndex & ",'" & _parentConstantId & "','" & .ConstantID & "','" & Tools.Misc.DBDate(Now) & "')"
End With
End Sub
#End Region
@@ -512,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
@@ -597,10 +615,14 @@ Namespace Config
_xmlTextWriter.WriteAttributeString("RDPAuthenticationLevel", "", curConI.RDPAuthenticationLevel.ToString)
_xmlTextWriter.WriteAttributeString("LoadBalanceInfo", "", curConI.LoadBalanceInfo)
_xmlTextWriter.WriteAttributeString("Colors", "", curConI.Colors.ToString)
_xmlTextWriter.WriteAttributeString("Resolution", "", curConI.Resolution.ToString)
_xmlTextWriter.WriteAttributeString("AutomaticResize", "", curConI.AutomaticResize)
_xmlTextWriter.WriteAttributeString("DisplayWallpaper", "", curConI.DisplayWallpaper)
_xmlTextWriter.WriteAttributeString("DisplayThemes", "", curConI.DisplayThemes)
@@ -692,12 +714,14 @@ Namespace Config
_xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", curConI.Inherit.RedirectSmartCards)
_xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", curConI.Inherit.RedirectSound)
_xmlTextWriter.WriteAttributeString("InheritResolution", "", curConI.Inherit.Resolution)
_xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", curConI.Inherit.AutomaticResize)
_xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", curConI.Inherit.UseConsoleSession)
_xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", curConI.Inherit.UseCredSsp)
_xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", curConI.Inherit.RenderingEngine)
_xmlTextWriter.WriteAttributeString("InheritUsername", "", curConI.Inherit.Username)
_xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", curConI.Inherit.ICAEncryption)
_xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", curConI.Inherit.RDPAuthenticationLevel)
_xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", curConI.Inherit.LoadBalanceInfo)
_xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", curConI.Inherit.PreExtApp)
_xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", curConI.Inherit.PostExtApp)
_xmlTextWriter.WriteAttributeString("InheritMacAddress", "", curConI.Inherit.MacAddress)
@@ -742,12 +766,14 @@ Namespace Config
_xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", False)
_xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", False)
_xmlTextWriter.WriteAttributeString("InheritResolution", "", False)
_xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", False)
_xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", False)
_xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", False)
_xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", False)
_xmlTextWriter.WriteAttributeString("InheritUsername", "", False)
_xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", False)
_xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", False)
_xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", False)
_xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", False)
_xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", False)
_xmlTextWriter.WriteAttributeString("InheritMacAddress", "", False)
@@ -809,10 +835,10 @@ Namespace Config
csvLn += "Domain;"
End If
csvLn += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;Colors;Resolution;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;"
csvLn += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;"
If SaveSecurity.Inheritance Then
csvLn += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain"
csvLn += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain"
End If
csvWr.WriteLine(csvLn)
@@ -863,10 +889,10 @@ Namespace Config
csvLn += con.Domain & ";"
End If
csvLn += con.Hostname & ";" & con.Protocol.ToString & ";" & con.PuttySession & ";" & con.Port & ";" & con.UseConsoleSession & ";" & con.UseCredSsp & ";" & con.RenderingEngine.ToString & ";" & con.ICAEncryption.ToString & ";" & con.RDPAuthenticationLevel.ToString & ";" & con.Colors.ToString & ";" & con.Resolution.ToString & ";" & con.DisplayWallpaper & ";" & con.DisplayThemes & ";" & con.EnableFontSmoothing & ";" & con.EnableDesktopComposition & ";" & con.CacheBitmaps & ";" & con.RedirectDiskDrives & ";" & con.RedirectPorts & ";" & con.RedirectPrinters & ";" & con.RedirectSmartCards & ";" & con.RedirectSound.ToString & ";" & con.RedirectKeys & ";" & con.PreExtApp & ";" & con.PostExtApp & ";" & con.MacAddress & ";" & con.UserField & ";" & con.ExtApp & ";" & con.VNCCompression.ToString & ";" & con.VNCEncoding.ToString & ";" & con.VNCAuthMode.ToString & ";" & con.VNCProxyType.ToString & ";" & con.VNCProxyIP & ";" & con.VNCProxyPort & ";" & con.VNCProxyUsername & ";" & con.VNCProxyPassword & ";" & con.VNCColors.ToString & ";" & con.VNCSmartSizeMode.ToString & ";" & con.VNCViewOnly & ";"
csvLn += con.Hostname & ";" & con.Protocol.ToString & ";" & con.PuttySession & ";" & con.Port & ";" & con.UseConsoleSession & ";" & con.UseCredSsp & ";" & con.RenderingEngine.ToString & ";" & con.ICAEncryption.ToString & ";" & con.RDPAuthenticationLevel.ToString & ";" & con.LoadBalanceInfo & ";" & con.Colors.ToString & ";" & con.Resolution.ToString & ";" & con.AutomaticResize & ";" & con.DisplayWallpaper & ";" & con.DisplayThemes & ";" & con.EnableFontSmoothing & ";" & con.EnableDesktopComposition & ";" & con.CacheBitmaps & ";" & con.RedirectDiskDrives & ";" & con.RedirectPorts & ";" & con.RedirectPrinters & ";" & con.RedirectSmartCards & ";" & con.RedirectSound.ToString & ";" & con.RedirectKeys & ";" & con.PreExtApp & ";" & con.PostExtApp & ";" & con.MacAddress & ";" & con.UserField & ";" & con.ExtApp & ";" & con.VNCCompression.ToString & ";" & con.VNCEncoding.ToString & ";" & con.VNCAuthMode.ToString & ";" & con.VNCProxyType.ToString & ";" & con.VNCProxyIP & ";" & con.VNCProxyPort & ";" & con.VNCProxyUsername & ";" & con.VNCProxyPassword & ";" & con.VNCColors.ToString & ";" & con.VNCSmartSizeMode.ToString & ";" & con.VNCViewOnly & ";"
If SaveSecurity.Inheritance Then
csvLn += con.Inherit.CacheBitmaps & ";" & con.Inherit.Colors & ";" & con.Inherit.Description & ";" & con.Inherit.DisplayThemes & ";" & con.Inherit.DisplayWallpaper & ";" & con.Inherit.EnableFontSmoothing & ";" & con.Inherit.EnableDesktopComposition & ";" & con.Inherit.Domain & ";" & con.Inherit.Icon & ";" & con.Inherit.Panel & ";" & con.Inherit.Password & ";" & con.Inherit.Port & ";" & con.Inherit.Protocol & ";" & con.Inherit.PuttySession & ";" & con.Inherit.RedirectDiskDrives & ";" & con.Inherit.RedirectKeys & ";" & con.Inherit.RedirectPorts & ";" & con.Inherit.RedirectPrinters & ";" & con.Inherit.RedirectSmartCards & ";" & con.Inherit.RedirectSound & ";" & con.Inherit.Resolution & ";" & con.Inherit.UseConsoleSession & ";" & con.Inherit.UseCredSsp & ";" & con.Inherit.RenderingEngine & ";" & con.Inherit.Username & ";" & con.Inherit.ICAEncryption & ";" & con.Inherit.RDPAuthenticationLevel & ";" & con.Inherit.PreExtApp & ";" & con.Inherit.PostExtApp & ";" & con.Inherit.MacAddress & ";" & con.Inherit.UserField & ";" & con.Inherit.ExtApp & ";" & con.Inherit.VNCCompression & ";" & con.Inherit.VNCEncoding & ";" & con.Inherit.VNCAuthMode & ";" & con.Inherit.VNCProxyType & ";" & con.Inherit.VNCProxyIP & ";" & con.Inherit.VNCProxyPort & ";" & con.Inherit.VNCProxyUsername & ";" & con.Inherit.VNCProxyPassword & ";" & con.Inherit.VNCColors & ";" & con.Inherit.VNCSmartSizeMode & ";" & con.Inherit.VNCViewOnly
csvLn += con.Inherit.CacheBitmaps & ";" & con.Inherit.Colors & ";" & con.Inherit.Description & ";" & con.Inherit.DisplayThemes & ";" & con.Inherit.DisplayWallpaper & ";" & con.Inherit.EnableFontSmoothing & ";" & con.Inherit.EnableDesktopComposition & ";" & con.Inherit.Domain & ";" & con.Inherit.Icon & ";" & con.Inherit.Panel & ";" & con.Inherit.Password & ";" & con.Inherit.Port & ";" & con.Inherit.Protocol & ";" & con.Inherit.PuttySession & ";" & con.Inherit.RedirectDiskDrives & ";" & con.Inherit.RedirectKeys & ";" & con.Inherit.RedirectPorts & ";" & con.Inherit.RedirectPrinters & ";" & con.Inherit.RedirectSmartCards & ";" & con.Inherit.RedirectSound & ";" & con.Inherit.Resolution & ";" & con.Inherit.AutomaticResize & ";" & con.Inherit.UseConsoleSession & ";" & con.Inherit.UseCredSsp & ";" & con.Inherit.RenderingEngine & ";" & con.Inherit.Username & ";" & con.Inherit.ICAEncryption & ";" & con.Inherit.RDPAuthenticationLevel & ";" & con.Inherit.LoadBalanceInfo & ";" & con.Inherit.PreExtApp & ";" & con.Inherit.PostExtApp & ";" & con.Inherit.MacAddress & ";" & con.Inherit.UserField & ";" & con.Inherit.ExtApp & ";" & con.Inherit.VNCCompression & ";" & con.Inherit.VNCEncoding & ";" & con.Inherit.VNCAuthMode & ";" & con.Inherit.VNCProxyType & ";" & con.Inherit.VNCProxyIP & ";" & con.Inherit.VNCProxyPort & ";" & con.Inherit.VNCProxyUsername & ";" & con.Inherit.VNCProxyPassword & ";" & con.Inherit.VNCColors & ";" & con.Inherit.VNCSmartSizeMode & ";" & con.Inherit.VNCViewOnly
End If
csvWr.WriteLine(csvLn)
@@ -1040,7 +1066,7 @@ Namespace Config
'Smart Size
_xmlTextWriter.WriteStartElement("AutoSize")
_xmlTextWriter.WriteValue(IIf(con.Resolution = Connection.Protocol.RDP.RDPResolutions.SmartSize, True, False))
_xmlTextWriter.WriteValue(con.Resolution = Connection.Protocol.RDP.RDPResolutions.SmartSize)
_xmlTextWriter.WriteEndElement()
'SeparateResolutionX
@@ -1053,26 +1079,18 @@ Namespace Config
_xmlTextWriter.WriteValue("768")
_xmlTextWriter.WriteEndElement()
Dim resolution As Rectangle = Connection.Protocol.RDP.GetResolutionRectangle(con.Resolution)
If resolution.Width = 0 Then resolution.Width = 1024
If resolution.Height = 0 Then resolution.Height = 768
'TabResolutionX
_xmlTextWriter.WriteStartElement("TabResolutionX")
If con.Resolution <> Connection.Protocol.RDP.RDPResolutions.FitToWindow And _
con.Resolution <> Connection.Protocol.RDP.RDPResolutions.Fullscreen And _
con.Resolution <> Connection.Protocol.RDP.RDPResolutions.SmartSize Then
_xmlTextWriter.WriteValue(con.Resolution.ToString.Remove(con.Resolution.ToString.IndexOf("x")))
Else
_xmlTextWriter.WriteValue("1024")
End If
_xmlTextWriter.WriteValue(resolution.Width)
_xmlTextWriter.WriteEndElement()
'TabResolutionY
_xmlTextWriter.WriteStartElement("TabResolutionY")
If con.Resolution <> Connection.Protocol.RDP.RDPResolutions.FitToWindow And _
con.Resolution <> Connection.Protocol.RDP.RDPResolutions.Fullscreen And _
con.Resolution <> Connection.Protocol.RDP.RDPResolutions.SmartSize Then
_xmlTextWriter.WriteValue(con.Resolution.ToString.Remove(0, con.Resolution.ToString.IndexOf("x")))
Else
_xmlTextWriter.WriteValue("768")
End If
_xmlTextWriter.WriteValue(resolution.Height)
_xmlTextWriter.WriteEndElement()
'RDPColorDepth

View File

@@ -29,7 +29,11 @@ Namespace Config
With Me._MainForm
' Migrate settings from previous version
If My.Settings.DoUpgrade Then
My.Settings.Upgrade()
Try
My.Settings.Upgrade()
Catch ex As Exception
Log.Error("My.Settings.Upgrade() failed" & vbNewLine & ex.Message)
End Try
My.Settings.DoUpgrade = False
' Clear pending update flag
@@ -44,6 +48,8 @@ Namespace Config
log.InfoFormat("Override Culture: {0}/{1}", Threading.Thread.CurrentThread.CurrentUICulture.Name, Threading.Thread.CurrentThread.CurrentUICulture.NativeName)
End If
Themes.ThemeManager.LoadTheme(My.Settings.ThemeName)
.WindowState = FormWindowState.Normal
If My.Settings.MainFormState = FormWindowState.Normal Then
If Not My.Settings.MainFormLocation.IsEmpty Then .Location = My.Settings.MainFormLocation
@@ -78,13 +84,14 @@ Namespace Config
.Location = newBounds.Location
If My.Settings.MainFormKiosk = True Then
Tools.Misc.Fullscreen.EnterFullscreen()
.Fullscreen.Value = True
.mMenViewFullscreen.Checked = True
End If
If My.Settings.UseCustomPuttyPath Then
Connection.Protocol.PuttyBase.PuttyPath = My.Settings.CustomPuttyPath
Else
Connection.Protocol.PuttyBase.PuttyPath = My.Application.Info.DirectoryPath & "\PuTTYNG.exe"
Connection.Protocol.PuttyBase.PuttyPath = App.Info.General.PuttyPath
End If
If My.Settings.ShowSystemTrayIcon Then
@@ -101,6 +108,10 @@ Namespace Config
Me.LoadPanelsFromXML()
Me.LoadExternalAppsFromXML()
If My.Settings.AlwaysShowPanelTabs Then
frmMain.pnlDock.DocumentStyle = DocumentStyle.DockingWindow
End If
If My.Settings.ResetToolbars = False Then
LoadToolbarsFromSettings()
Else
@@ -108,8 +119,7 @@ Namespace Config
End If
End With
Catch ex As Exception
App.Runtime.log.Error("Loading settings failed" & vbNewLine & ex.Message)
'mC.AddMessage(Messages.MessageClass.ErrorMsg, "Loading settings failed" & vbNewLine & ex.Message, True)
Log.Error("Loading settings failed" & vbNewLine & ex.Message)
End Try
End Sub
@@ -190,8 +200,7 @@ Namespace Config
End If
End With
Catch ex As Exception
App.Runtime.log.Error("LoadPanelsFromXML failed" & vbNewLine & ex.Message)
'mC.AddMessage(Messages.MessageClass.ErrorMsg, "LoadPanelsFromXML failed" & vbNewLine & ex.Message, True)
Log.Error("LoadPanelsFromXML failed" & vbNewLine & ex.Message)
End Try
End Sub
@@ -262,8 +271,7 @@ Namespace Config
Return Windows.screenshotPanel
End If
Catch ex As Exception
App.Runtime.log.Error("GetContentFromPersistString failed" & vbNewLine & ex.Message)
'mC.AddMessage(Messages.MessageClass.ErrorMsg, "GetContentFromPersistString failed" & vbNewLine & ex.Message, True)
Log.Error("GetContentFromPersistString failed" & vbNewLine & ex.Message)
End Try
Return Nothing

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)
@@ -25,7 +25,7 @@ Namespace Config
My.Settings.MainFormState = .WindowState
My.Settings.MainFormKiosk = Tools.Misc.Fullscreen.FullscreenActive
My.Settings.MainFormKiosk = .Fullscreen.Value
My.Settings.FirstStart = False
My.Settings.ResetPanels = False
@@ -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,9 @@
Namespace Config
Public Enum ConfirmClose
Unspecified = 0
Never = 1
[Exit] = 2
Multiple = 3
All = 4
End Enum
End Namespace

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

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

@@ -17,14 +17,24 @@ Namespace Connection
End Set
End Property
Private _InterfaceControl As Connection.InterfaceControl
Public Property InterfaceControl() As Connection.InterfaceControl
Private WithEvents _connectionWindow As UI.Window.Connection
Public Property ConnectionWindow As UI.Window.Connection
Get
Return Me._InterfaceControl
Return _connectionWindow
End Get
Set(ByVal value As Connection.InterfaceControl)
Me._InterfaceControl = value
Set(value As UI.Window.Connection)
_connectionWindow = value
End Set
End Property
Private _interfaceControl As InterfaceControl
Public Property InterfaceControl() As InterfaceControl
Get
Return _interfaceControl
End Get
Set(ByVal value As InterfaceControl)
_interfaceControl = value
ConnectionWindow = TryCast(_interfaceControl.GetContainerControl(), UI.Window.Connection)
End Set
End Property
@@ -62,17 +72,29 @@ Namespace Connection
End Try
End Sub
Public Overridable Sub ResizeBegin(ByVal sender As System.Object, ByVal e As EventArgs) Handles _connectionWindow.ResizeBegin
End Sub
Public Overridable Sub Resize(ByVal sender As System.Object, ByVal e As EventArgs) Handles _connectionWindow.Resize
End Sub
Public Overridable Sub ResizeEnd(ByVal sender As System.Object, ByVal e As EventArgs) Handles _connectionWindow.ResizeEnd
End Sub
Public Overridable Function SetProps() As Boolean
Try
Me._InterfaceControl.Parent.Tag = Me._InterfaceControl
Me._InterfaceControl.Show()
Me._interfaceControl.Parent.Tag = Me._interfaceControl
Me._interfaceControl.Show()
If Me._Control IsNot Nothing Then
Me._Control.Name = Me._Name
Me._Control.Parent = Me._InterfaceControl
Me._Control.Location = Me._InterfaceControl.Location
Me._Control.Parent = Me._interfaceControl
Me._Control.Location = Me._interfaceControl.Location
Me._Control.Size = Me.InterfaceControl.Size
Me._Control.Anchor = Me._InterfaceControl.Anchor
Me._Control.Anchor = Me._interfaceControl.Anchor
End If
Return True
@@ -92,10 +114,6 @@ Namespace Connection
Me.Close()
End Sub
Public Overridable Sub Resize()
End Sub
Public Overridable Sub Close()
Dim t As New Thread(AddressOf CloseBG)
t.SetApartmentState(Threading.ApartmentState.STA)

View File

@@ -55,9 +55,9 @@ Namespace Connection
Dim objWebBrowser As WebBrowser = TryCast(wBrowser, WebBrowser)
Dim objAxWebBrowser As SHDocVw.WebBrowser = DirectCast(objWebBrowser.ActiveXInstance, SHDocVw.WebBrowser)
objWebBrowser.AllowWebBrowserDrop = False
objWebBrowser.ScrollBarsEnabled = True
AddHandler objWebBrowser.Navigated, AddressOf wBrowser_Navigated
AddHandler objWebBrowser.DocumentTitleChanged, AddressOf wBrowser_DocumentTitleChanged
AddHandler objAxWebBrowser.NewWindow3, AddressOf wBrowser_NewWindow3
End If
@@ -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
@@ -118,8 +118,14 @@ Namespace Connection
#End Region
#Region "Events"
Private Sub gex_CreateWindow(ByVal sender As Object, ByVal e As Skybound.Gecko.GeckoCreateWindowEventArgs)
e.WebBrowser = Me.wBrowser
Private Sub wBrowser_Navigated(sender As Object, e As System.Windows.Forms.WebBrowserNavigatedEventArgs)
Dim objWebBrowser As WebBrowser = TryCast(wBrowser, WebBrowser)
If objWebBrowser Is Nothing Then Return
' This can only be set once the WebBrowser control is shown, it will throw a COM exception otherwise.
objWebBrowser.AllowWebBrowserDrop = False
RemoveHandler objWebBrowser.Navigated, AddressOf wBrowser_Navigated
End Sub
Private Sub wBrowser_NewWindow3(ByRef ppDisp As Object, ByRef Cancel As Boolean, ByVal dwFlags As Long, ByVal bstrUrlContext As String, ByVal bstrUrl As String)
@@ -177,6 +183,7 @@ Namespace Connection
End Enum
Private Enum NWMF
' ReSharper disable InconsistentNaming
NWMF_UNLOADING = &H1
NWMF_USERINITED = &H2
NWMF_FIRST = &H4
@@ -191,6 +198,7 @@ Namespace Connection
NWMF_SUGGESTWINDOW = &H40000
NWMF_SUGGESTTAB = &H80000
NWMF_INACTIVETAB = &H100000
' ReSharper restore InconsistentNaming
End Enum
#End Region
End Class

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
@@ -156,7 +158,8 @@ Namespace Connection
ICA.SetWindowSize(WFICALib.ICAWindowType.WindowTypeClient, Screen.FromControl(frmMain).Bounds.Width, Screen.FromControl(frmMain).Bounds.Height, 0)
ICA.FullScreenWindow()
Case Else
ICA.SetWindowSize(WFICALib.ICAWindowType.WindowTypeClient, RDP.Resolutions.Items(Int(Info.Resolution)).Width, RDP.Resolutions.Items(Int(Info.Resolution)).Height, 0)
Dim resolution As Rectangle = RDP.GetResolutionRectangle(Info.Resolution)
ICA.SetWindowSize(WFICALib.ICAWindowType.WindowTypeClient, resolution.Width, resolution.Height, 0)
End Select
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIcaSetResolutionFailed & vbNewLine & ex.Message, True)

View File

@@ -1,183 +0,0 @@
Imports mRemoteNG.App.Native
Imports System.Threading
Imports mRemoteNG.App.Runtime
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.FileName = _IntAppPath
IntAppProcessStartInfo.Arguments = 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()
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()
Try
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

@@ -6,6 +6,8 @@ Imports System.Threading
Imports Microsoft.Win32
Imports System.Drawing
Imports mRemoteNG.App.Runtime
Imports System.Text.RegularExpressions
Imports mRemoteNG.Tools
Namespace Connection
Namespace Protocol
@@ -71,18 +73,6 @@ Namespace Connection
End Set
End Property
'Private borderWidth As Integer = frmMain.Size.Width - frmMain.ClientSize.Width
'Private borderHeight As Integer = frmMain.Size.Height - frmMain.ClientSize.Height
Private Shared _BorderSize As Size
Public Shared Property BorderSize() As Size
Get
Return _BorderSize
End Get
Set(ByVal value As Size)
_BorderSize = value
End Set
End Property
Public ReadOnly Property Focused() As Boolean
Get
If GetForegroundWindow() = PuttyHandle Then
@@ -107,62 +97,78 @@ Namespace Connection
Public Overrides Function Connect() As Boolean
Try
_isPuttyNg = IsFilePuttyNg(PuttyPath)
_isPuttyNg = (PuttyTypeDetector.GetPuttyType() = PuttyTypeDetector.PuttyType.PuttyNg)
PuttyProcess = New Process
With PuttyProcess.StartInfo
.UseShellExecute = False
.FileName = _PuttyPath
Select Case _PuttyProtocol
Case Putty_Protocol.raw
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.rlogin
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.ssh
Dim userArgument As String = ""
Dim passwordArgument As String = ""
Dim arguments As New CommandLineArguments
arguments.EscapeForShell = False
If My.Settings.EmptyCredentials = "windows" Then
userArgument = " -l """ & Environment.UserName & """"
ElseIf My.Settings.EmptyCredentials = "custom" Then
userArgument = " -l """ & My.Settings.DefaultUsername & """"
passwordArgument = " -pw """ & PuttyEscapeArgument(Security.Crypt.Decrypt(My.Settings.DefaultPassword, App.Info.General.EncryptionKey)) & """"
arguments.Add("-load", InterfaceControl.Info.PuttySession)
If Not TypeOf InterfaceControl.Info Is PuttySession.Info Then
arguments.Add("-" & _PuttyProtocol.ToString)
If _PuttyProtocol = Putty_Protocol.ssh Then
Dim username As String = ""
Dim password As String = ""
If Not String.IsNullOrEmpty(InterfaceControl.Info.Username) Then
username = InterfaceControl.Info.Username
Else
If My.Settings.EmptyCredentials = "windows" Then
username = Environment.UserName
ElseIf My.Settings.EmptyCredentials = "custom" Then
username = My.Settings.DefaultUsername
End If
End If
If InterfaceControl.Info.Username <> "" Then
userArgument = " -l """ & InterfaceControl.Info.Username & """"
If Not String.IsNullOrEmpty(InterfaceControl.Info.Password) Then
password = InterfaceControl.Info.Password
Else
If My.Settings.EmptyCredentials = "custom" Then
password = Security.Crypt.Decrypt(My.Settings.DefaultPassword, App.Info.General.EncryptionKey)
End If
End If
If InterfaceControl.Info.Password <> "" Then
passwordArgument = " -pw """ & PuttyEscapeArgument(InterfaceControl.Info.Password) & """"
arguments.Add("-" & _PuttySSHVersion)
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
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -" & _PuttySSHVersion & userArgument & passwordArgument & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.telnet
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.serial
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
End Select
If _isPuttyNg Then
.Arguments = .Arguments & " -hwndparent " & InterfaceControl.Handle.ToString()
arguments.Add("-P", InterfaceControl.Info.Port.ToString)
arguments.Add(InterfaceControl.Info.Hostname)
End If
'REMOVE IN RELEASE!
'MessageCollector.AddMessage(MessageClass.InformationMsg, "PuTTY Arguments: " & .Arguments, True)
If _isPuttyNg Then
arguments.Add("-hwndparent", InterfaceControl.Handle.ToString())
End If
.Arguments = arguments.ToString
End With
PuttyProcess.EnableRaisingEvents = True
AddHandler PuttyProcess.Exited, AddressOf ProcessExited
PuttyProcess.Start()
PuttyProcess.WaitForInputIdle()
PuttyProcess.WaitForInputIdle(My.Settings.MaxPuttyWaitTime * 1000)
Dim startTicks As Integer = Environment.TickCount
While PuttyHandle.ToInt32 = 0 And Environment.TickCount < startTicks + 5000
While PuttyHandle.ToInt32 = 0 And Environment.TickCount < startTicks + (My.Settings.MaxPuttyWaitTime * 1000)
If _isPuttyNg Then
PuttyHandle = FindWindowEx(InterfaceControl.Handle, 0, vbNullString, vbNullString)
Else
PuttyProcess.Refresh()
PuttyHandle = PuttyProcess.MainWindowHandle
End If
If PuttyHandle.ToInt32 = 0 Then Thread.Sleep(0)
@@ -178,7 +184,7 @@ Namespace Connection
MessageCollector.AddMessage(MessageClass.InformationMsg, String.Format(My.Language.strPuttyTitle, PuttyProcess.MainWindowTitle), True)
MessageCollector.AddMessage(MessageClass.InformationMsg, String.Format(My.Language.strPuttyParentHandle, InterfaceControl.Parent.Handle.ToString), True)
Resize()
Resize(Me, New EventArgs)
MyBase.Connect()
Return True
@@ -188,26 +194,18 @@ Namespace Connection
End Try
End Function
' Due to the way PuTTY handles command line arguments, backslashes followed by a quotation mark will be removed.
' Since all the strings we send to PuTTY are surrounded by quotation marks, we need to escape any trailing
' backslashes by adding another. See split_into_argv() in WINDOWS\WINUTILS.C of the PuTTY source for more info.
Private Shared Function PuttyEscapeArgument(ByVal argument As String) As String
If argument.EndsWith("\") Then argument = argument & "\"
Return argument
End Function
Public Overrides Sub Focus()
Try
If ConnectionWindow.InTabDrag Then Return
SetForegroundWindow(PuttyHandle)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyFocusFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Public Overrides Sub Resize()
Public Overrides Sub Resize(ByVal sender As Object, ByVal e As EventArgs)
Try
If frmMain.WindowState = FormWindowState.Minimized Then Return
If InterfaceControl.Size = Size.Empty Then Return
MoveWindow(PuttyHandle, -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.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyResizeFailed & vbNewLine & ex.Message, True)
@@ -242,54 +240,6 @@ Namespace Connection
End Sub
#End Region
#Region "Public Shared Methods"
Public Shared Function GetSessions() As Array
Try
Dim regKey As RegistryKey
regKey = Registry.CurrentUser.OpenSubKey("Software\SimonTatham\PuTTY\Sessions")
Dim arrKeys() As String
arrKeys = regKey.GetSubKeyNames()
Array.Resize(arrKeys, arrKeys.Length + 1)
arrKeys(arrKeys.Length - 1) = "Default Settings"
For i As Integer = 0 To arrKeys.Length - 1
arrKeys(i) = System.Web.HttpUtility.UrlDecode(arrKeys(i))
Next
Return arrKeys
Catch ex As Exception
App.Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strPuttyGetSessionsFailed & vbNewLine & ex.Message, True)
Return Nothing
End Try
End Function
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
Public Shared Sub StartPutty()
Try
Dim p As Process
Dim pSI As New ProcessStartInfo
pSI.FileName = PuttyPath
p = Process.Start(pSI)
p.WaitForExit()
mRemoteNG.Connection.PuttySession.PuttySessions = GetSessions()
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyStartFailed & vbNewLine & ex.Message, True)
End Try
End Sub
#End Region
#Region "Enums"
Public Enum Putty_Protocol
ssh = 0

View File

@@ -3,100 +3,124 @@ Imports System.Threading
Imports AxMSTSCLib
Imports EOLWTSCOM
Imports System.ComponentModel
Imports mRemoteNG.Messages
Imports mRemoteNG.App.Runtime
Imports mRemoteNG.Tools.LocalizedAttributes
Imports MSTSCLib
Namespace Connection
Namespace Protocol
Public Class RDP
Inherits Connection.Protocol.Base
Inherits Base
#Region "Properties"
Private _SmartSize As Boolean
Public Property SmartSize() As Boolean
Get
Return Me.RDP.AdvancedSettings4.SmartSizing
Return _rdpClient.AdvancedSettings2.SmartSizing
End Get
Set(ByVal value As Boolean)
Me.RDP.AdvancedSettings4.SmartSizing = value
_rdpClient.AdvancedSettings2.SmartSizing = value
ReconnectForResize()
End Set
End Property
Private _Fullscreen As Boolean
Public Property Fullscreen() As Boolean
Get
Return Me.RDP.FullScreen
Return _rdpClient.FullScreen
End Get
Set(ByVal value As Boolean)
Me.RDP.FullScreen = value
_rdpClient.FullScreen = value
ReconnectForResize()
End Set
End Property
Private _redirectKeys As Boolean = False
Public Property RedirectKeys As Boolean
Get
Return _redirectKeys
End Get
Set(value As Boolean)
_redirectKeys = value
Try
If Not _redirectKeys Then Return
Debug.Assert(_rdpClient.SecuredSettingsEnabled)
Dim msRdpClientSecuredSettings As MSTSCLib.IMsRdpClientSecuredSettings = _rdpClient.SecuredSettings2
msRdpClientSecuredSettings.KeyboardHookMode = 1 ' Apply key combinations at the remote server.
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectKeysFailed & vbNewLine & ex.Message, True)
End Try
End Set
End Property
#End Region
#Region "Private Declarations"
Private RDP As AxMsRdpClient6NotSafeForScripting
Private Info As Connection.Info
Private RDPVersion As Version
Private _rdpClient As MsRdpClient5NotSafeForScripting
Private _rdpVersion As Version
Private _connectionInfo As Info
Private _loginComplete As Boolean
#End Region
#Region "Public Methods"
Public Sub New()
Me.Control = New AxMsRdpClient6NotSafeForScripting
Control = New AxMsRdpClient5NotSafeForScripting
End Sub
Public Overrides Function SetProps() As Boolean
MyBase.SetProps()
Try
RDP = Me.Control
Info = Me.InterfaceControl.Info
Control.CreateControl()
_connectionInfo = InterfaceControl.Info
Try
RDP.CreateControl()
Do Until Me.RDP.Created
Thread.Sleep(10)
Do Until Control.Created
Thread.Sleep(0)
System.Windows.Forms.Application.DoEvents()
Loop
Catch comEx As System.Runtime.InteropServices.COMException
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpControlCreationFailed & vbNewLine & vbNewLine & comEx.Message)
RDP.Dispose()
_rdpClient = CType(Control, AxMsRdpClient5NotSafeForScripting).GetOcx()
Catch ex As Runtime.InteropServices.COMException
MessageCollector.AddExceptionMessage(My.Language.strRdpControlCreationFailed, ex)
Control.Dispose()
Return False
End Try
Me.RDPVersion = New Version(RDP.Version)
_rdpVersion = New Version(_rdpClient.Version)
RDP.Server = Me.Info.Hostname
_rdpClient.Server = Me._connectionInfo.Hostname
Me.SetCredentials()
Me.SetResolution()
Me.RDP.FullScreenTitle = Me.Info.Name
Me._rdpClient.FullScreenTitle = Me._connectionInfo.Name
'not user changeable
RDP.AdvancedSettings2.GrabFocusOnConnect = True
RDP.AdvancedSettings3.EnableAutoReconnect = True
RDP.AdvancedSettings3.MaxReconnectAttempts = My.Settings.RdpReconnectionCount
RDP.AdvancedSettings2.keepAliveInterval = 60000 'in milliseconds (10.000 = 10 seconds)
RDP.AdvancedSettings5.AuthenticationLevel = 0
RDP.AdvancedSettings.EncryptionEnabled = 1
_rdpClient.AdvancedSettings2.GrabFocusOnConnect = True
_rdpClient.AdvancedSettings3.EnableAutoReconnect = True
_rdpClient.AdvancedSettings3.MaxReconnectAttempts = My.Settings.RdpReconnectionCount
_rdpClient.AdvancedSettings2.keepAliveInterval = 60000 'in milliseconds (10.000 = 10 seconds)
_rdpClient.AdvancedSettings5.AuthenticationLevel = 0
_rdpClient.AdvancedSettings2.EncryptionEnabled = 1
RDP.AdvancedSettings2.overallConnectionTimeout = 20
_rdpClient.AdvancedSettings2.overallConnectionTimeout = 20
RDP.AdvancedSettings2.BitmapPeristence = Me.Info.CacheBitmaps
RDP.AdvancedSettings7.EnableCredSspSupport = Info.UseCredSsp
_rdpClient.AdvancedSettings2.BitmapPeristence = Me._connectionInfo.CacheBitmaps
If _rdpVersion >= Versions.RDC61 Then
_rdpClient.AdvancedSettings7.EnableCredSspSupport = _connectionInfo.UseCredSsp
End If
Me.SetUseConsoleSession()
Me.SetPort()
Me.SetRedirectKeys()
RedirectKeys = _connectionInfo.RedirectKeys
Me.SetRedirection()
Me.SetAuthenticationLevel()
Me.SetRDGateway()
SetLoadBalanceInfo()
Me.SetRdGateway()
RDP.ColorDepth = Int(Me.Info.Colors)
_rdpClient.ColorDepth = Int(Me._connectionInfo.Colors)
Me.SetPerformanceFlags()
RDP.ConnectingText = My.Language.strConnecting
_rdpClient.ConnectingText = My.Language.strConnecting
Control.Anchor = AnchorStyles.None
@@ -108,10 +132,11 @@ Namespace Connection
End Function
Public Overrides Function Connect() As Boolean
Me.SetEventHandlers()
_loginComplete = False
SetEventHandlers()
Try
RDP.Connect()
_rdpClient.Connect()
MyBase.Connect()
Return True
Catch ex As Exception
@@ -123,7 +148,7 @@ Namespace Connection
Public Overrides Sub Disconnect()
Try
RDP.Disconnect()
_rdpClient.Disconnect()
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpDisconnectFailed & vbNewLine & ex.Message, True)
MyBase.Close()
@@ -148,121 +173,168 @@ Namespace Connection
Public Overrides Sub Focus()
Try
If RDP.ContainsFocus = False Then
RDP.Focus()
If Control.ContainsFocus = False Then
Control.Focus()
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpFocusFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Public Overrides Sub Resize()
Control.Location = InterfaceControl.Location
Control.Size = InterfaceControl.Size
MyBase.Resize()
Private _controlBeginningSize As New Size
Public Overrides Sub ResizeBegin(ByVal sender As Object, ByVal e As EventArgs)
_controlBeginningSize = Control.Size
End Sub
Public Overrides Sub Resize(ByVal sender As Object, ByVal e As EventArgs)
If DoResize() And _controlBeginningSize.IsEmpty Then
ReconnectForResize()
End If
MyBase.Resize(sender, e)
End Sub
Public Overrides Sub ResizeEnd(ByVal sender As Object, ByVal e As EventArgs)
DoResize()
If Not Control.Size = _controlBeginningSize Then
ReconnectForResize()
End If
_controlBeginningSize = Size.Empty
End Sub
#End Region
#Region "Private Methods"
Private Sub SetRDGateway()
Private Function DoResize() As Boolean
Control.Location = InterfaceControl.Location
If Not Control.Size = InterfaceControl.Size And Not InterfaceControl.Size = Size.Empty Then
Control.Size = InterfaceControl.Size
Return True
Else
Return False
End If
End Function
Private Sub ReconnectForResize()
If _rdpVersion < Versions.RDC80 Then Return
If Not _loginComplete Then Return
If Not InterfaceControl.Info.AutomaticResize Then Return
If Not (InterfaceControl.Info.Resolution = RDPResolutions.FitToWindow Or _
InterfaceControl.Info.Resolution = RDPResolutions.Fullscreen) Then Return
If SmartSize Then Return
Dim size As Size
If Not Fullscreen Then
size = Control.Size
Else
size = Screen.FromControl(Control).Bounds.Size
End If
Dim msRdpClient8 As IMsRdpClient8 = _rdpClient
msRdpClient8.Reconnect(size.Width, size.Height)
End Sub
Private Sub SetRdGateway()
Try
If RDP.TransportSettings.GatewayIsSupported = 1 Then
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strRdpGatewayIsSupported, True)
If Info.RDGatewayUsageMethod <> RDGatewayUsageMethod.Never Then
RDP.TransportSettings2.GatewayProfileUsageMethod = 1
RDP.TransportSettings.GatewayUsageMethod = Info.RDGatewayUsageMethod
RDP.TransportSettings.GatewayHostname = Info.RDGatewayHostname
If Info.RDGatewayUseConnectionCredentials = RDGatewayUseConnectionCredentials.Yes Then
RDP.TransportSettings.GatewayUsername = Info.Username
RDP.TransportSettings.GatewayPassword = Info.Password
RDP.TransportSettings.GatewayDomain = Info.Domain
ElseIf Info.RDGatewayUseConnectionCredentials = RDGatewayUseConnectionCredentials.SmartCard Then
RDP.TransportSettings2.GatewayCredsSource = 1 ' TSC_PROXY_CREDS_MODE_SMARTCARD
RDP.TransportSettings2.GatewayCredSharing = 0
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
_rdpClient.TransportSettings.GatewayProfileUsageMethod = 1 ' TSC_PROXY_PROFILE_MODE_EXPLICIT
If _connectionInfo.RDGatewayUseConnectionCredentials = RDGatewayUseConnectionCredentials.SmartCard Then
_rdpClient.TransportSettings.GatewayCredsSource = 1 ' TSC_PROXY_CREDS_MODE_SMARTCARD
End If
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
_rdpClient.TransportSettings2.GatewayDomain = _connectionInfo.Domain
ElseIf _connectionInfo.RDGatewayUseConnectionCredentials = RDGatewayUseConnectionCredentials.SmartCard Then
_rdpClient.TransportSettings2.GatewayCredSharing = 0
Else
RDP.TransportSettings.GatewayUsername = Info.RDGatewayUsername
RDP.TransportSettings.GatewayPassword = Info.RDGatewayPassword
RDP.TransportSettings.GatewayDomain = Info.RDGatewayDomain
RDP.TransportSettings2.GatewayCredSharing = 0
_rdpClient.TransportSettings2.GatewayUsername = _connectionInfo.RDGatewayUsername
_rdpClient.TransportSettings2.GatewayPassword = _connectionInfo.RDGatewayPassword
_rdpClient.TransportSettings2.GatewayDomain = _connectionInfo.RDGatewayDomain
_rdpClient.TransportSettings2.GatewayCredSharing = 0
End If
End If
Else
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strRdpGatewayNotSupported, True)
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetGatewayFailed & vbNewLine & ex.Message, True)
MessageCollector.AddMessage(MessageClass.ErrorMsg, My.Language.strRdpSetGatewayFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Private Sub SetUseConsoleSession()
Try
If (Me.Force And Connection.Info.Force.UseConsoleSession) = Connection.Info.Force.UseConsoleSession Then
If RDPVersion < Versions.RDC61 Then
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.0"), True)
RDP.AdvancedSettings2.ConnectToServerConsole = True
Else
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.1"), True)
RDP.AdvancedSettings6.ConnectToAdministerServer = True
End If
ElseIf (Me.Force And Connection.Info.Force.DontUseConsoleSession) = Connection.Info.Force.DontUseConsoleSession Then
If RDPVersion < Versions.RDC61 Then
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.0"), True)
RDP.AdvancedSettings2.ConnectToServerConsole = False
Else
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.1"), True)
RDP.AdvancedSettings6.ConnectToAdministerServer = False
End If
Dim value As Boolean
If (Force And Info.Force.UseConsoleSession) = Info.Force.UseConsoleSession Then
value = True
ElseIf (Force And Info.Force.DontUseConsoleSession) = Info.Force.DontUseConsoleSession Then
value = False
Else
If RDPVersion < Versions.RDC61 Then
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.0"), True)
RDP.AdvancedSettings2.ConnectToServerConsole = Me.Info.UseConsoleSession
Else
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.1"), True)
RDP.AdvancedSettings6.ConnectToAdministerServer = Me.Info.UseConsoleSession
End If
value = _connectionInfo.UseConsoleSession
End If
If _rdpVersion >= Versions.RDC61 Then
MessageCollector.AddMessage(MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.1"), True)
_rdpClient.AdvancedSettings7.ConnectToAdministerServer = value
Else
MessageCollector.AddMessage(MessageClass.InformationMsg, String.Format(My.Language.strRdpSetConsoleSwitch, "6.0"), True)
_rdpClient.AdvancedSettings2.ConnectToServerConsole = value
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetConsoleSessionFailed & vbNewLine & ex.Message, True)
MessageCollector.AddExceptionMessage(My.Language.strRdpSetConsoleSessionFailed, ex, MessageClass.ErrorMsg, True)
End Try
End Sub
Private Sub SetCredentials()
Try
Dim _user As String = Me.Info.Username
Dim _pass As String = Me.Info.Password
Dim _dom As String = Me.Info.Domain
If (Force And Info.Force.NoCredentials) = Info.Force.NoCredentials Then Return
If _user = "" Then
Dim userName As String = _connectionInfo.Username
Dim password As String = _connectionInfo.Password
Dim domain As String = _connectionInfo.Domain
If userName = "" Then
Select Case My.Settings.EmptyCredentials
Case "windows"
RDP.UserName = Environment.UserName
_rdpClient.UserName = Environment.UserName
Case "custom"
RDP.UserName = My.Settings.DefaultUsername
_rdpClient.UserName = My.Settings.DefaultUsername
End Select
Else
RDP.UserName = _user
_rdpClient.UserName = userName
End If
If _pass = "" Then
If password = "" Then
Select Case My.Settings.EmptyCredentials
Case "custom"
If My.Settings.DefaultPassword <> "" Then
RDP.AdvancedSettings2.ClearTextPassword = Security.Crypt.Decrypt(My.Settings.DefaultPassword, App.Info.General.EncryptionKey)
_rdpClient.AdvancedSettings2.ClearTextPassword = Security.Crypt.Decrypt(My.Settings.DefaultPassword, App.Info.General.EncryptionKey)
End If
End Select
Else
RDP.AdvancedSettings2.ClearTextPassword = _pass
_rdpClient.AdvancedSettings2.ClearTextPassword = password
End If
If _dom = "" Then
If domain = "" Then
Select Case My.Settings.EmptyCredentials
Case "windows"
RDP.Domain = Environment.UserDomainName
_rdpClient.Domain = Environment.UserDomainName
Case "custom"
RDP.Domain = My.Settings.DefaultDomain
_rdpClient.Domain = My.Settings.DefaultDomain
End Select
Else
RDP.Domain = _dom
_rdpClient.Domain = domain
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetCredentialsFailed & vbNewLine & ex.Message, True)
@@ -272,28 +344,25 @@ Namespace Connection
Private Sub SetResolution()
Try
If (Me.Force And Connection.Info.Force.Fullscreen) = Connection.Info.Force.Fullscreen Then
RDP.FullScreen = True
RDP.DesktopWidth = Screen.FromControl(frmMain).Bounds.Width
RDP.DesktopHeight = Screen.FromControl(frmMain).Bounds.Height
_rdpClient.FullScreen = True
_rdpClient.DesktopWidth = Screen.FromControl(frmMain).Bounds.Width
_rdpClient.DesktopHeight = Screen.FromControl(frmMain).Bounds.Height
Exit Sub
End If
Select Case Me.InterfaceControl.Info.Resolution
Case RDPResolutions.FitToWindow
RDP.DesktopWidth = Me.InterfaceControl.Size.Width
RDP.DesktopHeight = Me.InterfaceControl.Size.Height
Case RDPResolutions.SmartSize
RDP.AdvancedSettings.SmartSizing = True
RDP.DesktopWidth = Me.InterfaceControl.Size.Width
RDP.DesktopHeight = Me.InterfaceControl.Size.Height
Case RDPResolutions.FitToWindow, RDPResolutions.SmartSize
_rdpClient.DesktopWidth = InterfaceControl.Size.Width
_rdpClient.DesktopHeight = InterfaceControl.Size.Height
Case RDPResolutions.Fullscreen
RDP.FullScreen = True
RDP.DesktopWidth = Screen.FromControl(frmMain).Bounds.Width
RDP.DesktopHeight = Screen.FromControl(frmMain).Bounds.Height
_rdpClient.FullScreen = True
_rdpClient.DesktopWidth = Screen.FromControl(frmMain).Bounds.Width
_rdpClient.DesktopHeight = Screen.FromControl(frmMain).Bounds.Height
Case Else
RDP.DesktopWidth = Resolutions.Items(Int(Me.Info.Resolution)).Width
RDP.DesktopHeight = Resolutions.Items(Int(Me.Info.Resolution)).Height
Dim resolution As Rectangle = GetResolutionRectangle(_connectionInfo.Resolution)
_rdpClient.DesktopWidth = resolution.Width
_rdpClient.DesktopHeight = resolution.Height
End Select
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetResolutionFailed & vbNewLine & ex.Message, True)
@@ -302,34 +371,21 @@ Namespace Connection
Private Sub SetPort()
Try
If Me.Info.Port <> Connection.Protocol.RDP.Defaults.Port Then
RDP.AdvancedSettings2.RDPPort = Me.Info.Port
If _connectionInfo.Port <> Defaults.Port Then
_rdpClient.AdvancedSettings2.RDPPort = _connectionInfo.Port
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPortFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Private Sub SetRedirectKeys()
Try
If Me.Info.RedirectKeys Then
RDP.AdvancedSettings2.ContainerHandledFullScreen = 1
RDP.AdvancedSettings2.DisplayConnectionBar = False
RDP.AdvancedSettings2.PinConnectionBar = False
RDP.FullScreen = True
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectKeysFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Private Sub SetRedirection()
Try
RDP.AdvancedSettings2.RedirectDrives = Me.Info.RedirectDiskDrives
RDP.AdvancedSettings2.RedirectPorts = Me.Info.RedirectPorts
RDP.AdvancedSettings2.RedirectPrinters = Me.Info.RedirectPrinters
RDP.AdvancedSettings2.RedirectSmartCards = Me.Info.RedirectSmartCards
RDP.SecuredSettings2.AudioRedirectionMode = Int(Me.Info.RedirectSound)
_rdpClient.AdvancedSettings2.RedirectDrives = Me._connectionInfo.RedirectDiskDrives
_rdpClient.AdvancedSettings2.RedirectPorts = Me._connectionInfo.RedirectPorts
_rdpClient.AdvancedSettings2.RedirectPrinters = Me._connectionInfo.RedirectPrinters
_rdpClient.AdvancedSettings2.RedirectSmartCards = Me._connectionInfo.RedirectSmartCards
_rdpClient.SecuredSettings2.AudioRedirectionMode = Int(Me._connectionInfo.RedirectSound)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectionFailed & vbNewLine & ex.Message, True)
End Try
@@ -338,23 +394,23 @@ Namespace Connection
Private Sub SetPerformanceFlags()
Try
Dim pFlags As Integer
If Me.Info.DisplayThemes = False Then
If Me._connectionInfo.DisplayThemes = False Then
pFlags += Int(Connection.Protocol.RDP.RDPPerformanceFlags.DisableThemes)
End If
If Me.Info.DisplayWallpaper = False Then
If Me._connectionInfo.DisplayWallpaper = False Then
pFlags += Int(Connection.Protocol.RDP.RDPPerformanceFlags.DisableWallpaper)
End If
If Me.Info.EnableFontSmoothing Then
If Me._connectionInfo.EnableFontSmoothing Then
pFlags += Int(Connection.Protocol.RDP.RDPPerformanceFlags.EnableFontSmoothing)
End If
If Me.Info.EnableDesktopComposition Then
If Me._connectionInfo.EnableDesktopComposition Then
pFlags += Int(Connection.Protocol.RDP.RDPPerformanceFlags.EnableDesktopComposition)
End If
RDP.AdvancedSettings.PerformanceFlags = pFlags
_rdpClient.AdvancedSettings2.PerformanceFlags = pFlags
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetPerformanceFlagsFailed & vbNewLine & ex.Message, True)
End Try
@@ -362,19 +418,29 @@ Namespace Connection
Private Sub SetAuthenticationLevel()
Try
RDP.AdvancedSettings5.AuthenticationLevel = Me.Info.RDPAuthenticationLevel
_rdpClient.AdvancedSettings5.AuthenticationLevel = Me._connectionInfo.RDPAuthenticationLevel
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetAuthenticationLevelFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Private Sub SetLoadBalanceInfo()
If String.IsNullOrEmpty(_connectionInfo.LoadBalanceInfo) Then Return
Try
_rdpClient.AdvancedSettings2.LoadBalanceInfo = _connectionInfo.LoadBalanceInfo
Catch ex As Exception
MessageCollector.AddExceptionMessage("Unable to set load balance info.", ex)
End Try
End Sub
Private Sub SetEventHandlers()
Try
AddHandler RDP.OnConnecting, AddressOf RDPEvent_OnConnecting
AddHandler RDP.OnConnected, AddressOf RDPEvent_OnConnected
AddHandler RDP.OnFatalError, AddressOf RDPEvent_OnFatalError
AddHandler RDP.OnDisconnected, AddressOf RDPEvent_OnDisconnected
AddHandler RDP.OnLeaveFullScreenMode, AddressOf RDPEvent_OnLeaveFullscreenMode
AddHandler _rdpClient.OnConnecting, AddressOf RDPEvent_OnConnecting
AddHandler _rdpClient.OnConnected, AddressOf RDPEvent_OnConnected
AddHandler _rdpClient.OnLoginComplete, AddressOf RDPEvent_OnLoginComplete
AddHandler _rdpClient.OnFatalError, AddressOf RDPEvent_OnFatalError
AddHandler _rdpClient.OnDisconnected, AddressOf RDPEvent_OnDisconnected
AddHandler _rdpClient.OnLeaveFullScreenMode, AddressOf RDPEvent_OnLeaveFullscreenMode
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetEventHandlersFailed & vbNewLine & ex.Message, True)
End Try
@@ -382,15 +448,15 @@ Namespace Connection
#End Region
#Region "Private Events & Handlers"
Private Sub RDPEvent_OnFatalError(ByVal sender As Object, ByVal e As AxMSTSCLib.IMsTscAxEvents_OnFatalErrorEvent)
MyBase.Event_ErrorOccured(Me, e.errorCode)
Private Sub RDPEvent_OnFatalError(ByVal errorCode As Integer)
Event_ErrorOccured(Me, errorCode)
End Sub
Private Sub RDPEvent_OnDisconnected(ByVal sender As Object, ByVal e As IMsTscAxEvents_OnDisconnectedEvent)
Private Sub RDPEvent_OnDisconnected(ByVal discReason As Integer)
Const UI_ERR_NORMAL_DISCONNECT As Integer = &HB08
If Not e.discReason = UI_ERR_NORMAL_DISCONNECT Then
Dim reason As String = RDP.GetErrorDescription(e.discReason, RDP.ExtendedDisconnectReason)
Event_Disconnected(Me, e.discReason & vbCrLf & reason)
If Not discReason = UI_ERR_NORMAL_DISCONNECT Then
Dim reason As String = _rdpClient.GetErrorDescription(discReason, _rdpClient.ExtendedDisconnectReason)
Event_Disconnected(Me, discReason & vbCrLf & reason)
End If
If My.Settings.ReconnectOnDisconnect Then
@@ -405,16 +471,21 @@ Namespace Connection
End If
End Sub
Private Sub RDPEvent_OnConnecting(ByVal sender As Object, ByVal e As System.EventArgs)
MyBase.Event_Connecting(Me)
Private Sub RDPEvent_OnConnecting()
Event_Connecting(Me)
End Sub
Private Sub RDPEvent_OnConnected(ByVal sender As Object, ByVal e As System.EventArgs)
MyBase.Event_Connected(Me)
Private Sub RDPEvent_OnConnected()
Event_Connected(Me)
End Sub
Private Sub RDPEvent_OnLeaveFullscreenMode(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent LeaveFullscreen(Me, e)
Private Sub RDPEvent_OnLoginComplete()
_loginComplete = True
End Sub
Private Sub RDPEvent_OnLeaveFullscreenMode()
Fullscreen = False
RaiseEvent LeaveFullscreen(Me, New EventArgs())
End Sub
#End Region
@@ -545,162 +616,115 @@ Namespace Connection
#End Region
#Region "Resolution"
Public Class Resolution
Private _Width As Integer
Public Property Width() As Integer
Get
Return Me._Width
End Get
Set(ByVal value As Integer)
Me._Width = value
End Set
End Property
Private _Height As Integer
Public Property Height() As Integer
Get
Return Me._Height
End Get
Set(ByVal value As Integer)
Me._Height = value
End Set
End Property
Public Sub New(ByVal Width As Integer, ByVal Height As Integer)
Me._Width = Width
Me._Height = Height
End Sub
End Class
Public Class Resolutions
Public Shared List As New Collection
Public Shared Sub AddResolutions()
Try
For Each RDPResolution As RDPResolutions In [Enum].GetValues(GetType(RDPResolutions))
If RDPResolution = RDPResolutions.FitToWindow Or RDPResolution = RDPResolutions.SmartSize Or RDPResolution = RDPResolutions.Fullscreen Then
Resolutions.Add(New Resolution(0, 0))
Else
Dim ResSize() As String = Split([Enum].GetName(GetType(RDPResolutions), RDPResolution), "x")
Dim ResWidth As String = ResSize(0).Substring(3)
Dim ResHeight As String = ResSize(1)
Resolutions.Add(New Resolution(ResWidth, ResHeight))
End If
Next
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpAddResolutionsFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Public Shared ReadOnly Property Items(ByVal Index As Object) As Resolution
Get
If TypeOf Index Is Resolution Then
Return Index
Else
Return CType(List.Item(Index + 1), Resolution)
End If
End Get
End Property
Public Shared ReadOnly Property ItemsCount() As Integer
Get
Return List.Count
End Get
End Property
Public Shared Function Add(ByVal nRes As Resolution) As Resolution
Try
List.Add(nRes)
Return nRes
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpAddResolutionFailed & vbNewLine & ex.Message, True)
End Try
Return Nothing
End Function
End Class
Public Shared Function GetResolutionRectangle(ByVal resolution As RDPResolutions) As Rectangle
Dim resolutionParts() As String = Nothing
If Not resolution = RDPResolutions.FitToWindow And _
Not resolution = RDPResolutions.Fullscreen And _
Not resolution = RDPResolutions.SmartSize Then
resolutionParts = resolution.ToString.Replace("Res", "").Split("x")
End If
If resolutionParts Is Nothing OrElse Not resolutionParts.Length = 2 Then
Return New Rectangle(0, 0, 0, 0)
Else
Return New Rectangle(0, 0, resolutionParts(0), resolutionParts(1))
End If
End Function
#End Region
Public Class Versions
Public Shared RDC60 As New Version(6, 0, 6000)
Public Shared RDC61 As New Version(6, 0, 6001)
Public Shared RDC70 As New Version(6, 1, 7600)
Public Shared RDC80 As New Version(6, 2, 9200)
End Class
#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
@@ -710,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()
@@ -737,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
@@ -806,7 +795,7 @@ Namespace Connection
#Region "Reconnect Stuff"
Private Sub tmrReconnect_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmrReconnect.Elapsed
Dim srvReady As Boolean = Tools.PortScan.Scanner.IsPortOpen(Info.Hostname, Info.Port)
Dim srvReady As Boolean = Tools.PortScan.Scanner.IsPortOpen(_connectionInfo.Hostname, _connectionInfo.Port)
ReconnectGroup.ServerReady = srvReady
@@ -814,11 +803,10 @@ Namespace Connection
tmrReconnect.Enabled = False
ReconnectGroup.DisposeReconnectGroup()
'SetProps()
RDP.Connect()
_rdpClient.Connect()
End If
End Sub
#End Region
End Class
End Namespace
End Namespace

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,21 +0,0 @@
Imports System.ComponentModel
Namespace Connection
Public Class PuttySession
Inherits StringConverter
Public Shared PuttySessions As String() = New String() {}
Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
Return New StandardValuesCollection(PuttySessions)
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 Namespace

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

@@ -0,0 +1,122 @@
Imports System.ComponentModel
Imports mRemoteNG.Messages
Imports mRemoteNG.Tools.LocalizedAttributes
Imports mRemoteNG.My
Imports mRemoteNG.App.Runtime
Imports mRemoteNG.Tools
Namespace Connection
Namespace PuttySession
Public Class Info
Inherits Connection.Info
Implements IComponent
#Region "Commands"
<Command(),
LocalizedDisplayName("strPuttySessionSettings")> _
Public Sub SessionSettings()
Try
Dim puttyProcess As New PuttyProcessController
If Not puttyProcess.Start() Then Return
If puttyProcess.SelectListBoxItem(PuttySession) Then
puttyProcess.ClickButton("&Load")
End If
puttyProcess.SetControlText("Button", "&Cancel", "&Close")
puttyProcess.SetControlVisible("Button", "&Open", False)
puttyProcess.WaitForExit()
Catch ex As Exception
MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strErrorCouldNotLaunchPutty & vbNewLine & ex.Message, False)
End Try
End Sub
#End Region
#Region "Properties"
<Browsable(False)> _
Public Property RootPuttySessionsInfo() As Root.PuttySessions.Info
<[ReadOnly](True)> _
Public Overrides Property PuttySession() As String
<[ReadOnly](True)> _
Public Overrides Property Name() As String
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property Description() As String
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property Icon() As String
Get
Return "PuTTY"
End Get
Set(value As String)
End Set
End Property
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property Panel() As String
Get
Return RootPuttySessionsInfo.Panel
End Get
Set(value As String)
End Set
End Property
<[ReadOnly](True)> _
Public Overrides Property Hostname() As String
<[ReadOnly](True)> _
Public Overrides Property Username() As String
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property Password() As String
<[ReadOnly](True)> _
Public Overrides Property Protocol() As Protocol.Protocols
<[ReadOnly](True)> _
Public Overrides Property Port() As Integer
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property PreExtApp() As String
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property PostExtApp() As String
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property MacAddress() As String
<[ReadOnly](True), _
Browsable(False)> _
Public Overrides Property UserField() As String
#End Region
#Region "IComponent"
<Browsable(False)> _
Public Property Site() As ISite Implements IComponent.Site
Get
Return New PropertyGridCommandSite(Me)
End Get
Set(value As ISite)
Throw New NotImplementedException()
End Set
End Property
Public Sub Dispose() Implements IDisposable.Dispose
RaiseEvent Disposed(Me, EventArgs.Empty)
End Sub
Public Event Disposed As EventHandler Implements IComponent.Disposed
#End Region
End Class
End Namespace
End Namespace

View File

@@ -6,7 +6,6 @@ Namespace Container
<DefaultProperty("Name")> _
Public Class Info
#Region "Properties"
Private _Name As String = "New Container"
<LocalizedCategory("strCategoryDisplay", 1), _
Browsable(True), _
[ReadOnly](False), _
@@ -18,10 +17,10 @@ Namespace Container
Attributes.Container()> _
Public Property Name() As String
Get
Return Me._ConnectionInfo.Name
Return ConnectionInfo.Name
End Get
Set(ByVal value As String)
Me._ConnectionInfo.Name = value
ConnectionInfo.Name = value
End Set
End Property

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

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