Hi Robert,

> it would even work on NT 3.1: http://support.microsoft.com/kb/102988

I thought it would, thanks for confirming.

> Please add a null check for "subkey" after
>
> RegistryKey subkey =
> Registry.LocalMachine.OpenSubKey("HARDWARE\\DEVICEMAP\\SERIALCOMM");
>
> and consider the "using" pattern.

Done, attached. 

> Shouldn't be the default port name the first entry of this
> list? Your patch presets "COM1".

Yes i agree and have changed it to match. Anyone else got any thoughts on 
this?
I checked on MSDN and it does say that COM1 should be default but it should 
always be first on the list, if it exists. I left in the previous defaults if 
GetPortNames doesn't return anything as i don't think it is supposed to throw 
an exception at that stage.

Martin
Index: SerialPort.cs
===================================================================
--- SerialPort.cs	(revision 90526)
+++ SerialPort.cs	(working copy)
@@ -25,6 +25,7 @@
 using System.Diagnostics;
 using System.Text;
 using System.Runtime.InteropServices;
+using Microsoft.Win32;
 
 namespace System.IO.Ports
 {
@@ -59,8 +60,6 @@
 		object error_received = new object ();
 		object data_received = new object ();
 		object pin_changed = new object ();
-		
-		static string default_port_name = "ttyS0";
 
 		public SerialPort () : 
 			this (GetDefaultPortName (), DefaultBaudRate, DefaultParity, DefaultDataBits, DefaultStopBits)
@@ -103,7 +102,16 @@
 
 		static string GetDefaultPortName ()
 		{
-			return default_port_name;
+			string[] ports = GetPortNames();
+			if (ports.Length > 0) {
+				return ports[0];
+			} else {
+				int p = (int)Environment.OSVersion.Platform;
+				if (p == 4 || p == 128)
+					return "ttyS0"; // Default for Unix
+				else
+					return "COM1"; // Default for Windows
+			}
 		}
 
 		[Browsable (false)]
@@ -506,28 +514,32 @@
 			stream.DiscardOutBuffer ();
 		}
 
-		static Exception GetNotImplemented ()
-		{
-			return new NotImplementedException ("Detection of ports is not implemented for this platform yet.");
-		}
-
 		public static string [] GetPortNames ()
 		{
 			int p = (int) Environment.OSVersion.Platform;
+			List<string> serial_ports = new List<string>();
 			
 			// Are we on Unix?
-			if (p == 4 || p == 128){
-				string [] ttys = Directory.GetFiles ("/dev/", "tty*");
-				List<string> serial_ports = new List<string> ();
-				
-				foreach (string dev in ttys){
-					if (dev.StartsWith ("/dev/ttyS") || dev.StartsWith ("/dev/ttyUSB"))
-						serial_ports.Add (dev);
-						
+			if (p == 4 || p == 128) {
+				string[] ttys = Directory.GetFiles("/dev/", "tty*");
+				foreach (string dev in ttys) {
+					if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/ttyUSB"))
+						serial_ports.Add(dev);
 				}
-				return serial_ports.ToArray ();
+			} else {
+				using (RegistryKey subkey = Registry.LocalMachine.OpenSubKey("HARDWARE\\DEVICEMAP\\SERIALCOMM"))
+				{
+					if (subkey != null) {
+						string[] names = subkey.GetValueNames();
+						foreach (string value in names) {
+							string port = subkey.GetValue(value, "").ToString();
+							if (port != "")
+								serial_ports.Add(port);
+						}
+					}
+				}
 			}
-			throw GetNotImplemented ();
+			return serial_ports.ToArray();
 		}
 
 		static bool IsWindows {
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to