2007-12-03 Miguel de Icaza <miguel@novell.com>
authorMiguel de Icaza <miguel@gnome.org>
Mon, 3 Dec 2007 19:40:03 +0000 (19:40 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Mon, 3 Dec 2007 19:40:03 +0000 (19:40 -0000)
* SerialPort.cs: Apply patch from Martin Green
<martin@martsoft.co.uk> to support Serial Ports enumeration on
Windows.

svn path=/trunk/mcs/; revision=90583

mcs/class/System/System.IO.Ports/ChangeLog
mcs/class/System/System.IO.Ports/SerialPort.cs

index cea33d187bd7f9e5d97747607615c32dcc92eb7c..8ee2f029d6e0c747d14fd46a6780c2a7c53c2cb9 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-03  Miguel de Icaza  <miguel@novell.com>
+
+       * SerialPort.cs: Apply patch from Martin Green
+       <martin@martsoft.co.uk> to support Serial Ports enumeration on
+       Windows.
+
 2007-11-13  Atsushi Enomoto  <atsushi@ximian.com>
 
        * SerialPort.cs :
index 7ae1da7fad9ad715b9dbe29166b051438ec9f361..1c7b3c9d5a2fe7c56636ae7f269589983eac79b3 100644 (file)
@@ -25,6 +25,7 @@ using System.ComponentModel;
 using System.Diagnostics;
 using System.Text;
 using System.Runtime.InteropServices;
+using Microsoft.Win32;
 
 namespace System.IO.Ports
 {
@@ -59,8 +60,6 @@ namespace System.IO.Ports
                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 @@ namespace System.IO.Ports
 
                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 @@ namespace System.IO.Ports
                        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);
+                               }
+                       } 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);
+                                               }
+                                       }
                                }
-                               return serial_ports.ToArray ();
                        }
-                       throw GetNotImplemented ();
+                       return serial_ports.ToArray();
                }
 
                static bool IsWindows {