Implemente remote Get FireWire Data packet.

This commit is contained in:
2019-10-19 00:08:33 +01:00
parent 2cfcdf8842
commit b7f6170a1f
2 changed files with 142 additions and 56 deletions

View File

@@ -576,66 +576,80 @@ namespace DiscImageChef.Devices
#region FireWire #region FireWire
if (PlatformId == PlatformID.Linux) if (!(remote is null))
{ {
if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) || if (remote.GetFirewireData(out firewireVendor, out firewireModel,
devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) || out firewireGuid, out var remoteFireWireVendorName, out var remoteFireWireModelName))
devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
{ {
var devPath = devicePath.Substring(5); IsFireWire = true;
if (Directory.Exists("/sys/block/" + devPath)) FireWireVendorName = remoteFireWireVendorName;
{ FireWireModelName = remoteFireWireModelName;
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 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 #endregion FireWire

View File

@@ -632,7 +632,7 @@ namespace DiscImageChef.Devices.Remote
product = null; product = null;
serial = null; serial = null;
var cmdPkt = new DicPacketCmdGetSdhciRegisters var cmdPkt = new DicPacketCmdGetUsbData
{ {
hdr = new DicPacketHeader hdr = new DicPacketHeader
{ {
@@ -706,7 +706,79 @@ namespace DiscImageChef.Devices.Remote
public bool GetFirewireData(out uint idVendor, out uint idProduct, public bool GetFirewireData(out uint idVendor, out uint idProduct,
out ulong guid, out string vendor, out string model) 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<DicPacketCmdGetFireWireData>(),
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<DicPacketHeader>()];
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<DicPacketHeader>(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<DicPacketResGetFireWireData>(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) public bool GetPcmciaData(out byte[] cis)