From 378c3db1f535557a8890f3c4e4bd5a195fa1d3ab Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 13 Dec 2020 22:16:03 +0000 Subject: [PATCH] Implement remote command for re-opening device. --- Aaru.Devices/Remote/Enums.cs | 6 ++- Aaru.Devices/Remote/Remote.cs | 90 +++++++++++++++++++++++++++++++++- Aaru.Devices/Remote/Structs.cs | 6 +++ 3 files changed, 99 insertions(+), 3 deletions(-) diff --git a/Aaru.Devices/Remote/Enums.cs b/Aaru.Devices/Remote/Enums.cs index 22410eccd..8ba518e04 100644 --- a/Aaru.Devices/Remote/Enums.cs +++ b/Aaru.Devices/Remote/Enums.cs @@ -43,12 +43,14 @@ namespace Aaru.Devices.Remote ResponseGetSdhciRegisters = 18, CommandGetUsbData = 19, ResponseGetUsbData = 20, CommandGetFireWireData = 21, ResponseGetFireWireData = 22, CommandGetPcmciaData = 23, ResponseGetPcmciaData = 24, CommandCloseDevice = 25, CommandAmIRoot = 26, - ResponseAmIRoot = 27, MultiCommandSdhci = 28, ResponseMultiSdhci = 29 + ResponseAmIRoot = 27, MultiCommandSdhci = 28, ResponseMultiSdhci = 29, + CommandReOpenDevice = 30 } public enum AaruNopReason : byte { OutOfOrder = 0, NotImplemented = 1, NotRecognized = 2, - ErrorListDevices = 3, OpenOk = 4, OpenError = 5 + ErrorListDevices = 3, OpenOk = 4, OpenError = 5, + ReOpenOk = 6, CloseError = 7 } } \ No newline at end of file diff --git a/Aaru.Devices/Remote/Remote.cs b/Aaru.Devices/Remote/Remote.cs index c37445248..9eb7e6944 100644 --- a/Aaru.Devices/Remote/Remote.cs +++ b/Aaru.Devices/Remote/Remote.cs @@ -1617,7 +1617,95 @@ namespace Aaru.Devices.Remote return error; } - public bool ReOpen() => throw new NotImplementedException(); + public bool ReOpen() + { + var cmdPkt = new AaruPacketCmdReOpen + { + hdr = new AaruPacketHeader + { + remote_id = Consts.REMOTE_ID, + packet_id = Consts.PACKET_ID, + len = (uint)Marshal.SizeOf(), + version = Consts.PACKET_VERSION, + packetType = AaruPacketType.CommandReOpenDevice + } + }; + + byte[] buf = Marshal.StructureToByteArrayLittleEndian(cmdPkt); + + int len = _socket.Send(buf, SocketFlags.None); + + if(len != buf.Length) + { + AaruConsole.ErrorWriteLine("Could not write to the network..."); + + return false; + } + + byte[] hdrBuf = new byte[Marshal.SizeOf()]; + + len = Receive(_socket, hdrBuf, hdrBuf.Length, SocketFlags.Peek); + + if(len < hdrBuf.Length) + { + AaruConsole.ErrorWriteLine("Could not read from the network..."); + + return false; + } + + AaruPacketHeader hdr = Marshal.ByteArrayToStructureLittleEndian(hdrBuf); + + if(hdr.remote_id != Consts.REMOTE_ID || + hdr.packet_id != Consts.PACKET_ID) + { + AaruConsole.ErrorWriteLine("Received data is not an Aaru Remote Packet..."); + + return false; + } + + if(hdr.packetType != AaruPacketType.Nop) + { + AaruConsole.ErrorWriteLine("Expected List Devices Response Packet, got packet type {0}...", + hdr.packetType); + + return false; + } + + if(hdr.version != Consts.PACKET_VERSION) + { + AaruConsole.ErrorWriteLine("Unrecognized packet version..."); + + return false; + } + + buf = new byte[hdr.len]; + len = Receive(_socket, buf, buf.Length, SocketFlags.None); + + if(len < buf.Length) + { + AaruConsole.ErrorWriteLine("Could not read from the network..."); + + return false; + } + + AaruPacketNop nop = Marshal.ByteArrayToStructureLittleEndian(buf); + + switch(nop.reasonCode) + { + case AaruNopReason.ReOpenOk: return true; + case AaruNopReason.CloseError: + case AaruNopReason.OpenError: + AaruConsole.ErrorWriteLine("ReOpen error closing device..."); + + break; + default: + AaruConsole.ErrorWriteLine("ReOpen error {0} with reason: {1}...", nop.errno, nop.reason); + + break; + } + + return false; + } public bool BufferedOsRead(out byte[] buffer, long offset, uint length, out double duration) => throw new NotImplementedException(); diff --git a/Aaru.Devices/Remote/Structs.cs b/Aaru.Devices/Remote/Structs.cs index 894029dbf..30ac2b40d 100644 --- a/Aaru.Devices/Remote/Structs.cs +++ b/Aaru.Devices/Remote/Structs.cs @@ -392,4 +392,10 @@ namespace Aaru.Devices.Remote public AaruPacketHeader hdr; public ulong cmd_count; } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct AaruPacketCmdReOpen + { + public AaruPacketHeader hdr; + } } \ No newline at end of file