From f9dc4f31a1ea3848ad5aad06647c9ac1749f8947 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 31 Dec 2015 16:33:20 +0000 Subject: [PATCH] Added support for FireWire devices. --- DiscImageChef.Devices/ChangeLog | 6 ++ DiscImageChef.Devices/Device/Constructor.cs | 82 +++++++++++++++++++++ DiscImageChef.Devices/Device/Variables.cs | 42 +++++++++++ DiscImageChef/ChangeLog | 5 ++ DiscImageChef/Commands/DeviceInfo.cs | 17 ++++- 5 files changed, 149 insertions(+), 3 deletions(-) diff --git a/DiscImageChef.Devices/ChangeLog b/DiscImageChef.Devices/ChangeLog index 1c3fc4c05..53753d3c6 100644 --- a/DiscImageChef.Devices/ChangeLog +++ b/DiscImageChef.Devices/ChangeLog @@ -1,3 +1,9 @@ +2015-12-31 Natalia Portillo + + * Device/Variables.cs: + * Device/Constructor.cs: + Added support for FireWire devices. + 2015-12-31 Natalia Portillo * Device/Constructor.cs: diff --git a/DiscImageChef.Devices/Device/Constructor.cs b/DiscImageChef.Devices/Device/Constructor.cs index 731337700..e04cb5362 100644 --- a/DiscImageChef.Devices/Device/Constructor.cs +++ b/DiscImageChef.Devices/Device/Constructor.cs @@ -176,6 +176,70 @@ namespace DiscImageChef.Devices usb = false; #endregion USB + #region FireWire + if(platformID == DiscImageChef.Interop.PlatformID.Linux) + { + if(devicePath.StartsWith("/dev/sd")) + { + string devPath = devicePath.Substring(5); + if(System.IO.Directory.Exists("/sys/block/" + devPath)) + { + string resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); + resolvedLink = "/sys" + resolvedLink.Substring(2); + if(!string.IsNullOrEmpty(resolvedLink)) + { + while(resolvedLink.Contains("firewire")) + { + resolvedLink = System.IO.Path.GetDirectoryName(resolvedLink); + if(System.IO.File.Exists(resolvedLink + "/model") && + System.IO.File.Exists(resolvedLink + "/vendor") && + System.IO.File.Exists(resolvedLink + "/guid")) + { + System.IO.StreamReader fwSr; + string fwTemp; + + fwSr = new System.IO.StreamReader(resolvedLink + "/model"); + fwTemp = fwSr.ReadToEnd(); + uint.TryParse(fwTemp, System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out firewireModel); + fwSr.Close(); + + fwSr = new System.IO.StreamReader(resolvedLink + "/vendor"); + fwTemp = fwSr.ReadToEnd(); + uint.TryParse(fwTemp, System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out firewireVendor); + fwSr.Close(); + + fwSr = new System.IO.StreamReader(resolvedLink + "/guid"); + fwTemp = fwSr.ReadToEnd(); + ulong.TryParse(fwTemp, System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out firewireGuid); + fwSr.Close(); + + if(System.IO.File.Exists(resolvedLink + "/model_name")) + { + fwSr = new System.IO.StreamReader(resolvedLink + "/model_name"); + firewireModelName = fwSr.ReadToEnd().Trim(); + fwSr.Close(); + } + + if(System.IO.File.Exists(resolvedLink + "/vendor_name")) + { + fwSr = new System.IO.StreamReader(resolvedLink + "/vendor_name"); + firewireVendorName = fwSr.ReadToEnd().Trim(); + fwSr.Close(); + } + + firewire = true; + break; + } + } + } + } + } + } + // TODO: Implement for other operating systems + else + firewire = false; + #endregion FireWire + if (!scsiSense) { Decoders.SCSI.Inquiry.SCSIInquiry? Inquiry = Decoders.SCSI.Inquiry.Decode(inqBuf); @@ -265,6 +329,24 @@ namespace DiscImageChef.Devices } } } + + if (firewire) + { + if (string.IsNullOrEmpty(manufacturer)) + manufacturer = firewireVendorName; + if (string.IsNullOrEmpty(model)) + model = firewireModelName; + if (string.IsNullOrEmpty(serial)) + serial = String.Format("{0:X16}", firewireGuid); + else + { + foreach (char c in serial) + { + if(Char.IsControl(c)) + serial = String.Format("{0:X16}", firewireGuid); + } + } + } } } } diff --git a/DiscImageChef.Devices/Device/Variables.cs b/DiscImageChef.Devices/Device/Variables.cs index e4fd65472..807e4698d 100644 --- a/DiscImageChef.Devices/Device/Variables.cs +++ b/DiscImageChef.Devices/Device/Variables.cs @@ -60,6 +60,12 @@ namespace DiscImageChef.Devices readonly string usbManufacturerString; readonly string usbProductString; readonly string usbSerialString; + readonly bool firewire; + readonly ulong firewireGuid; + readonly uint firewireModel; + readonly string firewireModelName; + readonly uint firewireVendor; + readonly string firewireVendorName; /// /// Gets the Platform ID for this device @@ -286,6 +292,42 @@ namespace DiscImageChef.Devices return usbSerialString; } } + + /// + /// Gets a value indicating whether this device is attached via FireWire. + /// + /// true if this device is attached via FireWire; otherwise, false. + public bool IsFireWire { get { return firewire; } } + + /// + /// Gets the FireWire GUID + /// + /// The FireWire GUID. + public ulong FireWireGUID { get { return firewireGuid; } } + + /// + /// Gets the FireWire model number + /// + /// The FireWire model. + public uint FireWireModel { get { return firewireModel; } } + + /// + /// Gets the FireWire model name. + /// + /// The FireWire model name. + public string FireWireModelName { get { return firewireModelName; } } + + /// + /// Gets the FireWire vendor number. + /// + /// The FireWire vendor number. + public uint FireWireVendor { get { return firewireVendor; } } + + /// + /// Gets the FireWire vendor name. + /// + /// The FireWire vendor name. + public string FireWireVendorName { get { return firewireVendorName; } } } } diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index 45d84545c..4881b2344 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,8 @@ +2015-12-31 Natalia Portillo + + * Commands/DeviceInfo.cs: + Added support for FireWire devices. + 2015-12-31 Natalia Portillo * Commands/DeviceInfo.cs: diff --git a/DiscImageChef/Commands/DeviceInfo.cs b/DiscImageChef/Commands/DeviceInfo.cs index 9de26aa57..9b29fa0a1 100644 --- a/DiscImageChef/Commands/DeviceInfo.cs +++ b/DiscImageChef/Commands/DeviceInfo.cs @@ -75,9 +75,20 @@ namespace DiscImageChef.Commands DicConsole.WriteLine("USB descriptor is {0} bytes", dev.USBDescriptors.Length); DicConsole.WriteLine("USB Vendor ID: {0:X4}", dev.USBVendorID); DicConsole.WriteLine("USB Product ID: {0:X4}", dev.USBProductID); - DicConsole.WriteLine("USB Manufacturer: {0:X4}", dev.USBManufacturerString); - DicConsole.WriteLine("USB Product: {0:X4}", dev.USBProductString); - DicConsole.WriteLine("USB Serial number: {0:X4}", dev.USBSerialString); + DicConsole.WriteLine("USB Manufacturer: {0}", dev.USBManufacturerString); + DicConsole.WriteLine("USB Product: {0}", dev.USBProductString); + DicConsole.WriteLine("USB Serial number: {0}", dev.USBSerialString); + DicConsole.WriteLine(); + } + + if (dev.IsFireWire) + { + DicConsole.WriteLine("FireWire device"); + DicConsole.WriteLine("FireWire Vendor ID: {0:X6}", dev.FireWireVendor); + DicConsole.WriteLine("FireWire Model ID: {0:X6}", dev.FireWireModel); + DicConsole.WriteLine("FireWire Manufacturer: {0}", dev.FireWireVendorName); + DicConsole.WriteLine("FireWire Model: {0}", dev.FireWireModelName); + DicConsole.WriteLine("FireWire GUID: {0:X16}", dev.FireWireGUID); DicConsole.WriteLine(); }