2019-07-31 20:10:27 +01:00
|
|
|
// /***************************************************************************
|
2020-02-27 12:31:25 +00:00
|
|
|
// Aaru Data Preservation Suite
|
2019-07-31 20:10:27 +01:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// Filename : Mode2.cs
|
|
|
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
|
|
|
|
//
|
|
|
|
|
// Component : ISO9660 filesystem plugin.
|
|
|
|
|
//
|
|
|
|
|
// --[ Description ] ----------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// Handles reading sectors in MODE 0, 1 and 2.
|
|
|
|
|
//
|
|
|
|
|
// --[ License ] --------------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// This library is free software; you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU Lesser General Public License as
|
|
|
|
|
// published by the Free Software Foundation; either version 2.1 of the
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This library is distributed in the hope that it will be useful, but
|
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
// Lesser General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
//
|
|
|
|
|
// ----------------------------------------------------------------------------
|
2020-01-03 17:51:30 +00:00
|
|
|
// Copyright © 2011-2020 Natalia Portillo
|
2019-07-31 20:19:22 +01:00
|
|
|
// In the loving memory of Facunda "Tata" Suárez Domínguez, R.I.P. 2019/07/24
|
2019-07-31 20:10:27 +01:00
|
|
|
// ****************************************************************************/
|
|
|
|
|
|
2020-03-10 22:47:10 +00:00
|
|
|
using Aaru.Console;
|
2020-03-10 19:31:34 +00:00
|
|
|
using Aaru.Decoders.CD;
|
2019-07-31 17:02:50 +01:00
|
|
|
|
2020-07-20 15:43:52 +01:00
|
|
|
namespace Aaru.Filesystems
|
2019-07-31 17:02:50 +01:00
|
|
|
{
|
2020-07-22 13:20:25 +01:00
|
|
|
public sealed partial class ISO9660
|
2019-07-31 17:02:50 +01:00
|
|
|
{
|
2020-03-10 22:47:10 +00:00
|
|
|
byte[] ReadSector(ulong sector, bool interleaved = false, byte fileNumber = 0)
|
2019-07-31 17:02:50 +01:00
|
|
|
{
|
2020-03-10 19:31:34 +00:00
|
|
|
byte[] data;
|
2019-07-31 17:02:50 +01:00
|
|
|
|
2020-03-10 19:31:34 +00:00
|
|
|
// TODO: No more exceptions
|
|
|
|
|
try
|
2019-07-31 17:02:50 +01:00
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
data = _image.ReadSectorLong(sector);
|
2020-03-10 19:31:34 +00:00
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
data = _image.ReadSector(sector);
|
2019-07-31 17:02:50 +01:00
|
|
|
}
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
if(!_debug)
|
2020-03-10 22:47:10 +00:00
|
|
|
return Sector.GetUserData(data, interleaved, fileNumber);
|
|
|
|
|
|
|
|
|
|
switch(data.Length)
|
|
|
|
|
{
|
|
|
|
|
case 2048:
|
|
|
|
|
AaruConsole.DebugWriteLine("ISO9660 Plugin", "Sector {0}, Cooked, Mode 0/1 / Mode 2 Form 1",
|
|
|
|
|
sector);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case 2324:
|
|
|
|
|
AaruConsole.DebugWriteLine("ISO9660 Plugin", "Sector {0}, Cooked, Mode 2 Form 2", sector);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case 2336:
|
|
|
|
|
AaruConsole.DebugWriteLine("ISO9660 Plugin",
|
|
|
|
|
"Sector {0}, Cooked, Mode 2 Form {1}, File Number {2}, Channel Number {3}, Submode {4}, Coding Information {5}",
|
|
|
|
|
sector, ((Mode2Submode)data[2]).HasFlag(Mode2Submode.Form2) ? 2 : 1,
|
|
|
|
|
data[0], data[1], (Mode2Submode)data[2], data[3]);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case 2352 when data[0] != 0x00 || data[1] != 0xFF || data[2] != 0xFF || data[3] != 0xFF ||
|
|
|
|
|
data[4] != 0xFF || data[5] != 0xFF || data[6] != 0xFF || data[7] != 0xFF ||
|
|
|
|
|
data[8] != 0xFF || data[9] != 0xFF || data[10] != 0xFF || data[11] != 0x00:
|
|
|
|
|
AaruConsole.DebugWriteLine("ISO9660 Plugin", "Sector {0}, Raw, Audio", sector);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case 2352 when data[15] != 2:
|
|
|
|
|
AaruConsole.DebugWriteLine("ISO9660 Plugin", "Sector {0} ({1:X2}:{2:X2}:{3:X2}), Raw, Mode {4}",
|
|
|
|
|
sector, data[12], data[13], data[14], data[15]);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case 2352:
|
|
|
|
|
AaruConsole.DebugWriteLine("ISO9660 Plugin",
|
|
|
|
|
"Sector {0} ({1:X2}:{2:X2}:{3:X2}), Raw, Mode 2 Form {4}, File Number {5}, Channel Number {6}, Submode {7}, Coding Information {8}",
|
|
|
|
|
sector, data[12], data[13], data[14],
|
|
|
|
|
((Mode2Submode)data[18]).HasFlag(Mode2Submode.Form2) ? 2 : 1, data[16],
|
|
|
|
|
data[17], (Mode2Submode)data[18], data[19]);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Sector.GetUserData(data, interleaved, fileNumber);
|
2019-07-31 17:02:50 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|