diff --git a/DiscImageChef.Devices/Device/Constructor.cs b/DiscImageChef.Devices/Device/Constructor.cs index e1d8ab5e9..29bacd027 100644 --- a/DiscImageChef.Devices/Device/Constructor.cs +++ b/DiscImageChef.Devices/Device/Constructor.cs @@ -576,66 +576,80 @@ namespace DiscImageChef.Devices #region FireWire - if (PlatformId == PlatformID.Linux) + if (!(remote is null)) { - if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) || - devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) || - devicePath.StartsWith("/dev/st", StringComparison.Ordinal)) + if (remote.GetFirewireData(out firewireVendor, out firewireModel, + out firewireGuid, out var remoteFireWireVendorName, out var remoteFireWireModelName)) { - var devPath = devicePath.Substring(5); - if (Directory.Exists("/sys/block/" + devPath)) - { - var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); - resolvedLink = "/sys" + resolvedLink.Substring(2); - if (!string.IsNullOrEmpty(resolvedLink)) - while (resolvedLink.Contains("firewire")) - { - resolvedLink = Path.GetDirectoryName(resolvedLink); - if (!File.Exists(resolvedLink + "/model") || !File.Exists(resolvedLink + "/vendor") || - !File.Exists(resolvedLink + "/guid")) continue; - - var fwSr = new StreamReader(resolvedLink + "/model"); - var fwTemp = fwSr.ReadToEnd(); - uint.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, - out firewireModel); - fwSr.Close(); - - fwSr = new StreamReader(resolvedLink + "/vendor"); - fwTemp = fwSr.ReadToEnd(); - uint.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, - out firewireVendor); - fwSr.Close(); - - fwSr = new StreamReader(resolvedLink + "/guid"); - fwTemp = fwSr.ReadToEnd(); - ulong.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, - out firewireGuid); - fwSr.Close(); - - if (File.Exists(resolvedLink + "/model_name")) - { - fwSr = new StreamReader(resolvedLink + "/model_name"); - FireWireModelName = fwSr.ReadToEnd().Trim(); - fwSr.Close(); - } - - if (File.Exists(resolvedLink + "/vendor_name")) - { - fwSr = new StreamReader(resolvedLink + "/vendor_name"); - FireWireVendorName = fwSr.ReadToEnd().Trim(); - fwSr.Close(); - } - - IsFireWire = true; - break; - } - } + IsFireWire = true; + FireWireVendorName = remoteFireWireVendorName; + FireWireModelName = remoteFireWireModelName; } } - // TODO: Implement for other operating systems else { - IsFireWire = false; + if (PlatformId == PlatformID.Linux) + { + if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) || + devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) || + devicePath.StartsWith("/dev/st", StringComparison.Ordinal)) + { + var devPath = devicePath.Substring(5); + if (Directory.Exists("/sys/block/" + devPath)) + { + var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); + resolvedLink = "/sys" + resolvedLink.Substring(2); + if (!string.IsNullOrEmpty(resolvedLink)) + while (resolvedLink.Contains("firewire")) + { + resolvedLink = Path.GetDirectoryName(resolvedLink); + if (!File.Exists(resolvedLink + "/model") || + !File.Exists(resolvedLink + "/vendor") || + !File.Exists(resolvedLink + "/guid")) continue; + + var fwSr = new StreamReader(resolvedLink + "/model"); + var fwTemp = fwSr.ReadToEnd(); + uint.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, + out firewireModel); + fwSr.Close(); + + fwSr = new StreamReader(resolvedLink + "/vendor"); + fwTemp = fwSr.ReadToEnd(); + uint.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, + out firewireVendor); + fwSr.Close(); + + fwSr = new StreamReader(resolvedLink + "/guid"); + fwTemp = fwSr.ReadToEnd(); + ulong.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, + out firewireGuid); + fwSr.Close(); + + if (File.Exists(resolvedLink + "/model_name")) + { + fwSr = new StreamReader(resolvedLink + "/model_name"); + FireWireModelName = fwSr.ReadToEnd().Trim(); + fwSr.Close(); + } + + if (File.Exists(resolvedLink + "/vendor_name")) + { + fwSr = new StreamReader(resolvedLink + "/vendor_name"); + FireWireVendorName = fwSr.ReadToEnd().Trim(); + fwSr.Close(); + } + + IsFireWire = true; + break; + } + } + } + } + // TODO: Implement for other operating systems + else + { + IsFireWire = false; + } } #endregion FireWire diff --git a/DiscImageChef.Devices/Remote/Remote.cs b/DiscImageChef.Devices/Remote/Remote.cs index be903222f..3ad677879 100644 --- a/DiscImageChef.Devices/Remote/Remote.cs +++ b/DiscImageChef.Devices/Remote/Remote.cs @@ -632,7 +632,7 @@ namespace DiscImageChef.Devices.Remote product = null; serial = null; - var cmdPkt = new DicPacketCmdGetSdhciRegisters + var cmdPkt = new DicPacketCmdGetUsbData { hdr = new DicPacketHeader { @@ -706,7 +706,79 @@ namespace DiscImageChef.Devices.Remote public bool GetFirewireData(out uint idVendor, out uint idProduct, out ulong guid, out string vendor, out string model) { - throw new NotImplementedException("Getting FireWire data not yet implemented..."); + idVendor = 0; + idProduct = 0; + guid = 0; + vendor = null; + model = null; + + var cmdPkt = new DicPacketCmdGetFireWireData + { + hdr = new DicPacketHeader + { + id = Consts.PacketId, + len = (uint) Marshal.SizeOf(), + version = Consts.PacketVersion, + packetType = DicPacketType.CommandGetFireWireData + } + }; + + var buf = Marshal.StructureToByteArrayLittleEndian(cmdPkt); + + var len = _socket.Send(buf, SocketFlags.None); + + if (len != buf.Length) + { + DicConsole.ErrorWriteLine("Could not write to the network..."); + return false; + } + + var hdrBuf = new byte[Marshal.SizeOf()]; + + len = _socket.Receive(hdrBuf, hdrBuf.Length, SocketFlags.Peek); + + if (len < hdrBuf.Length) + { + DicConsole.ErrorWriteLine("Could not read from the network..."); + return false; + } + + var hdr = Marshal.ByteArrayToStructureLittleEndian(hdrBuf); + + if (hdr.id != Consts.PacketId) + { + DicConsole.ErrorWriteLine("Received data is not a DIC Remote Packet..."); + return false; + } + + if (hdr.packetType != DicPacketType.ResponseGetUsbData) + { + DicConsole.ErrorWriteLine("Expected FireWire Data Response Packet, got packet type {0}...", + hdr.packetType); + return false; + } + + buf = new byte[hdr.len]; + len = _socket.Receive(buf, buf.Length, SocketFlags.None); + + if (len < buf.Length) + { + DicConsole.ErrorWriteLine("Could not read from the network..."); + return false; + } + + var res = Marshal.ByteArrayToStructureLittleEndian(buf); + + if (!res.isFireWire) + return false; + + idVendor = res.idVendor; + idProduct = res.idModel; + guid = res.guid; + vendor = res.vendor; + model = res.model; + + return true; } public bool GetPcmciaData(out byte[] cis)