2017-05-19 20:28:49 +01:00
// /***************************************************************************
2015-12-05 17:21:47 +00:00
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : CreateSidecar.cs
2016-07-28 18:13:49 +01:00
// Author(s) : Natalia Portillo <claunia@claunia.com>
2015-12-05 17:21:47 +00:00
//
2016-07-28 18:13:49 +01:00
// Component : Verbs.
2015-12-05 17:21:47 +00:00
//
// --[ Description ] ----------------------------------------------------------
//
2016-07-28 18:13:49 +01:00
// Implements the 'create-sidecar' verb.
2015-12-05 17:21:47 +00:00
//
// --[ License ] --------------------------------------------------------------
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
2018-12-29 17:34:38 +00:00
// Copyright © 2011-2019 Natalia Portillo
2015-12-05 17:21:47 +00:00
// ****************************************************************************/
2016-07-28 18:13:49 +01:00
2015-12-05 17:21:47 +00:00
using System ;
2017-08-08 21:15:14 +01:00
using System.Collections.Generic ;
2015-12-06 05:09:31 +00:00
using System.IO ;
2017-12-21 07:08:26 +00:00
using System.Linq ;
2017-10-12 23:54:02 +01:00
using System.Text ;
2017-12-21 14:30:38 +00:00
using System.Xml.Serialization ;
2018-06-25 19:08:16 +01:00
using DiscImageChef.CommonTypes ;
using DiscImageChef.CommonTypes.Interfaces ;
2017-05-27 20:24:06 +01:00
using DiscImageChef.Console ;
2017-05-27 14:54:15 +01:00
using DiscImageChef.Core ;
2019-01-05 16:59:23 +00:00
using Mono.Options ;
2017-05-27 20:24:06 +01:00
using Schemas ;
2015-12-05 17:21:47 +00:00
namespace DiscImageChef.Commands
{
2019-01-05 16:59:23 +00:00
class CreateSidecarCommand : Command
2015-12-05 17:21:47 +00:00
{
2019-01-05 16:59:23 +00:00
int blockSize ;
string encodingName ;
string inputFile ;
bool showHelp ;
bool tape ;
public CreateSidecarCommand ( ) : base ( "create-sidecar" , "Creates CICM Metadata XML sidecar." )
2015-12-05 17:21:47 +00:00
{
2019-01-05 16:59:23 +00:00
Options = new OptionSet
{
$"{MainClass.AssemblyTitle} {MainClass.AssemblyVersion?.InformationalVersion}" ,
$"{MainClass.AssemblyCopyright}" ,
"" ,
$"usage: DiscImageChef {Name} [OPTIONS] input" ,
"" ,
Help ,
{
"block-size|b=" ,
"Only used for tapes, indicates block size. Files in the folder whose size is not a multiple of this value will simply be ignored." ,
( int i ) = > blockSize = i
} ,
{ "encoding|e=" , "Name of character encoding to use." , s = > encodingName = s } ,
{
"tape|t" ,
"When used indicates that input is a folder containing alphabetically sorted files extracted from a linear block-based tape with fixed block size (e.g. a SCSI tape device)." ,
b = > tape = b ! = null
} ,
{ "help|h|?" , "Show this message and exit." , v = > showHelp = v ! = null }
} ;
}
public override int Invoke ( IEnumerable < string > arguments )
{
List < string > extra = Options . Parse ( arguments ) ;
if ( showHelp )
{
Options . WriteOptionDescriptions ( CommandSet . Out ) ;
return 0 ;
}
MainClass . PrintCopyright ( ) ;
if ( MainClass . Debug ) DicConsole . DebugWriteLineEvent + = System . Console . Error . WriteLine ;
if ( MainClass . Verbose ) DicConsole . VerboseWriteLineEvent + = System . Console . WriteLine ;
if ( extra . Count > 1 )
{
DicConsole . ErrorWriteLine ( "Too many arguments." ) ;
return 1 ;
}
if ( extra . Count = = 0 )
{
DicConsole . ErrorWriteLine ( "Missing input image." ) ;
return 1 ;
}
inputFile = extra [ 0 ] ;
DicConsole . DebugWriteLine ( "Create sidecar command" , "--block-size={0}" , blockSize ) ;
DicConsole . DebugWriteLine ( "Create sidecar command" , "--debug={0}" , MainClass . Debug ) ;
DicConsole . DebugWriteLine ( "Create sidecar command" , "--encoding={0}" , encodingName ) ;
DicConsole . DebugWriteLine ( "Create sidecar command" , "--input={0}" , inputFile ) ;
DicConsole . DebugWriteLine ( "Create sidecar command" , "--tape={0}" , tape ) ;
DicConsole . DebugWriteLine ( "Create sidecar command" , "--verbose={0}" , MainClass . Verbose ) ;
2018-01-28 20:29:46 +00:00
Sidecar . InitProgressEvent + = Progress . InitProgress ;
Sidecar . UpdateProgressEvent + = Progress . UpdateProgress ;
Sidecar . EndProgressEvent + = Progress . EndProgress ;
Sidecar . InitProgressEvent2 + = Progress . InitProgress2 ;
2017-08-08 21:15:14 +01:00
Sidecar . UpdateProgressEvent2 + = Progress . UpdateProgress2 ;
2018-01-28 20:29:46 +00:00
Sidecar . EndProgressEvent2 + = Progress . EndProgress2 ;
Sidecar . UpdateStatusEvent + = Progress . UpdateStatus ;
2017-08-08 21:15:14 +01:00
2017-10-12 23:54:02 +01:00
Encoding encoding = null ;
2019-01-05 16:59:23 +00:00
if ( encodingName ! = null )
2017-10-12 23:54:02 +01:00
try
{
2019-01-05 16:59:23 +00:00
encoding = Claunia . Encoding . Encoding . GetEncoding ( encodingName ) ;
if ( MainClass . Verbose ) DicConsole . VerboseWriteLine ( "Using encoding for {0}." , encoding . EncodingName ) ;
2017-10-12 23:54:02 +01:00
}
catch ( ArgumentException )
{
DicConsole . ErrorWriteLine ( "Specified encoding is not supported." ) ;
2019-01-05 16:59:23 +00:00
return 1 ;
2017-10-12 23:54:02 +01:00
}
2019-01-05 16:59:23 +00:00
if ( File . Exists ( inputFile ) )
2015-12-06 05:09:31 +00:00
{
2019-01-05 16:59:23 +00:00
if ( tape )
2015-12-06 05:09:31 +00:00
{
2017-08-08 21:15:14 +01:00
DicConsole . ErrorWriteLine ( "You cannot use --tape option when input is a file." ) ;
2019-01-05 16:59:23 +00:00
return 2 ;
2015-12-06 05:09:31 +00:00
}
2017-08-08 21:15:14 +01:00
FiltersList filtersList = new FiltersList ( ) ;
2019-01-05 16:59:23 +00:00
IFilter inputFilter = filtersList . GetFilter ( inputFile ) ;
2017-08-08 21:15:14 +01:00
if ( inputFilter = = null )
2015-12-06 05:09:31 +00:00
{
2017-08-08 21:15:14 +01:00
DicConsole . ErrorWriteLine ( "Cannot open specified file." ) ;
2019-01-05 16:59:23 +00:00
return 3 ;
2015-12-06 05:09:31 +00:00
}
try
{
2017-12-26 06:05:12 +00:00
IMediaImage imageFormat = ImageFormat . Detect ( inputFilter ) ;
2017-08-08 21:15:14 +01:00
2017-12-20 17:15:26 +00:00
if ( imageFormat = = null )
2015-12-06 05:09:31 +00:00
{
2017-08-08 21:15:14 +01:00
DicConsole . WriteLine ( "Image format not identified, not proceeding with analysis." ) ;
2019-01-05 16:59:23 +00:00
return 4 ;
2015-12-06 05:09:31 +00:00
}
2017-12-21 02:57:32 +00:00
2019-01-05 16:59:23 +00:00
if ( MainClass . Verbose )
2017-12-21 02:57:32 +00:00
DicConsole . VerboseWriteLine ( "Image format identified by {0} ({1})." , imageFormat . Name ,
2017-12-26 06:05:12 +00:00
imageFormat . Id ) ;
2017-12-21 02:57:32 +00:00
else DicConsole . WriteLine ( "Image format identified by {0}." , imageFormat . Name ) ;
2015-12-06 05:09:31 +00:00
2017-08-08 21:15:14 +01:00
try
{
2017-12-28 19:56:36 +00:00
if ( ! imageFormat . Open ( inputFilter ) )
2017-08-08 21:15:14 +01:00
{
DicConsole . WriteLine ( "Unable to open image format" ) ;
DicConsole . WriteLine ( "No error given" ) ;
2019-01-05 16:59:23 +00:00
return 5 ;
2017-08-08 21:15:14 +01:00
}
DicConsole . DebugWriteLine ( "Analyze command" , "Correctly opened image file." ) ;
}
catch ( Exception ex )
{
DicConsole . ErrorWriteLine ( "Unable to open image format" ) ;
DicConsole . ErrorWriteLine ( "Error: {0}" , ex . Message ) ;
2019-01-05 16:59:23 +00:00
return 6 ;
2017-08-08 21:15:14 +01:00
}
2019-01-05 16:59:23 +00:00
Statistics . AddMediaFormat ( imageFormat . Format ) ;
Statistics . AddFilter ( inputFilter . Name ) ;
2017-08-08 21:15:14 +01:00
2019-01-05 16:59:23 +00:00
CICMMetadataType sidecar = Sidecar . Create ( imageFormat , inputFile , inputFilter . Id , encoding ) ;
2017-08-08 21:15:14 +01:00
DicConsole . WriteLine ( "Writing metadata sidecar" ) ;
2017-12-19 20:33:03 +00:00
FileStream xmlFs =
new
2019-01-05 16:59:23 +00:00
FileStream ( Path . Combine ( Path . GetDirectoryName ( inputFile ) ? ? throw new InvalidOperationException ( ) , Path . GetFileNameWithoutExtension ( inputFile ) + ".cicm.xml" ) ,
2017-12-19 20:33:03 +00:00
FileMode . CreateNew ) ;
2017-08-08 21:15:14 +01:00
2017-12-23 04:48:17 +00:00
XmlSerializer xmlSer = new XmlSerializer ( typeof ( CICMMetadataType ) ) ;
2017-08-08 21:15:14 +01:00
xmlSer . Serialize ( xmlFs , sidecar ) ;
xmlFs . Close ( ) ;
2019-01-05 16:59:23 +00:00
Statistics . AddCommand ( "create-sidecar" ) ;
2015-12-06 05:09:31 +00:00
}
2016-04-19 02:11:47 +01:00
catch ( Exception ex )
2015-12-06 05:09:31 +00:00
{
2017-12-21 17:58:51 +00:00
DicConsole . ErrorWriteLine ( $"Error reading file: {ex.Message}" ) ;
2017-08-08 21:15:14 +01:00
DicConsole . DebugWriteLine ( "Analyze command" , ex . StackTrace ) ;
}
}
2019-01-05 16:59:23 +00:00
else if ( Directory . Exists ( inputFile ) )
2017-08-08 21:15:14 +01:00
{
2019-01-05 16:59:23 +00:00
if ( ! tape )
2017-08-08 21:15:14 +01:00
{
DicConsole . ErrorWriteLine ( "Cannot create a sidecar from a directory." ) ;
2019-01-05 16:59:23 +00:00
return 7 ;
2015-12-06 05:09:31 +00:00
}
2019-01-05 16:59:23 +00:00
string [ ] contents = Directory . GetFiles ( inputFile , "*" , SearchOption . TopDirectoryOnly ) ;
List < string > files = contents . Where ( file = > new FileInfo ( file ) . Length % blockSize = = 0 ) . ToList ( ) ;
* commandline:
* DiscImageChef.Settings/Settings.cs:
* DiscImageChef.Settings/docs/README.txt:
* DiscImageChef.Settings/packages.config:
* DiscImageChef.Settings/docs/LICENSE.txt:
* DiscImageChef.Settings/docs/ChangeLog.txt:
* DiscImageChef.Settings/docs/mono/index.xml:
* DiscImageChef.Settings/docs/html/index.html:
* DiscImageChef.Settings/Properties/AssemblyInfo.cs:
* DiscImageChef.Settings/DiscImageChef.Settings.csproj:
* DiscImageChef.Settings/docs/mono/ns-Claunia.PropertyList.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/UID.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/UID.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSSet.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/index.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSSet.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDate.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSData.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDate.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSData.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSArray.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSNumber.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSString.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSObject.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSArray.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSNumber.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSString.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSObject.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDictionary.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDictionary.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/XmlPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/XmlPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/ASCIIPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/ASCIIPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListParser.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListWriter.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListWriter.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListFormatException.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListFormatException.html:
Added supports for settings
* DiscImageChef/Commands/Configure.cs:
Added support for settings.
* DiscImageChef/Core/Statistics.cs:
* DiscImageChef/Commands/Verify.cs:
* DiscImageChef/Commands/Entropy.cs:
* DiscImageChef/Commands/Formats.cs:
* DiscImageChef/Commands/PrintHex.cs:
* DiscImageChef/Commands/MediaInfo.cs:
* DiscImageChef/Commands/Statistics.cs:
Added statistics.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
Corrected bug on inquiry decoding.
* DiscImageChef.Decoders/SCSI/Modes.cs:
Corrected bug on decoding mode page 2Ah without write
performance descriptors.
Corrected bug when there is a vendor page 0 in mode sense
decoding.
* DiscImageChef.Devices/Device/Constructor.cs:
Corrected detecting USB or FireWire attached CD/DVD/BD and
tape drives.
Try ATA identify on USB or FireWire that don't have SCSI
INQUIRY.
* DiscImageChef.DiscImages/CDRWin.cs:
Corrected CD-ROM XA vs CD-ROM detection.
* DiscImageChef.Partitions/AppleMap.cs:
Corrected big endian working.
Added debug output.
* DiscImageChef.sln:
Added supports for settings.
* DiscImageChef/Commands/Decode.cs:
* DiscImageChef/Commands/Analyze.cs:
* DiscImageChef/Commands/Compare.cs:
* DiscImageChef/Commands/Checksum.cs:
* DiscImageChef/Commands/Benchmark.cs:
* DiscImageChef/Commands/DeviceInfo.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Added statistics.
* DiscImageChef/Commands/DeviceReport.cs:
Added statistics.
Correct handling empty inquiry string fields.
Suppose it is not removable, til proved wrong.
Corrected MODE SENSE (6/10) detection and calling order.
If device is MMC type but reports neither mode page 2Ah
neither GET CONFIGURATION, try all CDs (old drives work like
that).
Try reading Lead-In and Lead-Out in Audio CD using Audio READ
CD commands.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Added support for DVD raw block (37856 bytes).
Check READ LONG up to 36 times the cooked block size. That
should be enough to detect huge blocked media (like DVD and
BD) without taking ages.
If READ LONG size had to be bruteforced, and debug is
activated, save the result.
* DiscImageChef/Commands/DumpMedia.cs:
Added statistics.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/Commands/MediaScan.cs:
Added statistics.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/DiscImageChef.csproj:
Added support for settings.
Added statistics.
* DiscImageChef/Main.cs:
* DiscImageChef/Options.cs:
Added support for settings.
Added statistics.
2016-02-03 18:58:11 +00:00
2017-08-08 21:15:14 +01:00
files . Sort ( StringComparer . CurrentCultureIgnoreCase ) ;
2019-01-05 16:59:23 +00:00
CICMMetadataType sidecar = Sidecar . Create ( Path . GetFileName ( inputFile ) , files , blockSize ) ;
2015-12-06 05:09:31 +00:00
DicConsole . WriteLine ( "Writing metadata sidecar" ) ;
2017-12-19 20:33:03 +00:00
FileStream xmlFs =
new
2019-01-05 16:59:23 +00:00
FileStream ( Path . Combine ( Path . GetDirectoryName ( inputFile ) ? ? throw new InvalidOperationException ( ) , Path . GetFileNameWithoutExtension ( inputFile ) + ".cicm.xml" ) ,
2017-12-19 20:33:03 +00:00
FileMode . CreateNew ) ;
2015-12-06 05:09:31 +00:00
2017-12-23 04:48:17 +00:00
XmlSerializer xmlSer = new XmlSerializer ( typeof ( CICMMetadataType ) ) ;
2015-12-06 05:09:31 +00:00
xmlSer . Serialize ( xmlFs , sidecar ) ;
xmlFs . Close ( ) ;
* commandline:
* DiscImageChef.Settings/Settings.cs:
* DiscImageChef.Settings/docs/README.txt:
* DiscImageChef.Settings/packages.config:
* DiscImageChef.Settings/docs/LICENSE.txt:
* DiscImageChef.Settings/docs/ChangeLog.txt:
* DiscImageChef.Settings/docs/mono/index.xml:
* DiscImageChef.Settings/docs/html/index.html:
* DiscImageChef.Settings/Properties/AssemblyInfo.cs:
* DiscImageChef.Settings/DiscImageChef.Settings.csproj:
* DiscImageChef.Settings/docs/mono/ns-Claunia.PropertyList.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/UID.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/UID.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSSet.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/index.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSSet.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDate.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSData.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDate.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSData.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSArray.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSNumber.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSString.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSObject.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSArray.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSNumber.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSString.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSObject.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDictionary.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDictionary.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/XmlPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/XmlPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/ASCIIPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/ASCIIPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListParser.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListWriter.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListWriter.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListFormatException.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListFormatException.html:
Added supports for settings
* DiscImageChef/Commands/Configure.cs:
Added support for settings.
* DiscImageChef/Core/Statistics.cs:
* DiscImageChef/Commands/Verify.cs:
* DiscImageChef/Commands/Entropy.cs:
* DiscImageChef/Commands/Formats.cs:
* DiscImageChef/Commands/PrintHex.cs:
* DiscImageChef/Commands/MediaInfo.cs:
* DiscImageChef/Commands/Statistics.cs:
Added statistics.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
Corrected bug on inquiry decoding.
* DiscImageChef.Decoders/SCSI/Modes.cs:
Corrected bug on decoding mode page 2Ah without write
performance descriptors.
Corrected bug when there is a vendor page 0 in mode sense
decoding.
* DiscImageChef.Devices/Device/Constructor.cs:
Corrected detecting USB or FireWire attached CD/DVD/BD and
tape drives.
Try ATA identify on USB or FireWire that don't have SCSI
INQUIRY.
* DiscImageChef.DiscImages/CDRWin.cs:
Corrected CD-ROM XA vs CD-ROM detection.
* DiscImageChef.Partitions/AppleMap.cs:
Corrected big endian working.
Added debug output.
* DiscImageChef.sln:
Added supports for settings.
* DiscImageChef/Commands/Decode.cs:
* DiscImageChef/Commands/Analyze.cs:
* DiscImageChef/Commands/Compare.cs:
* DiscImageChef/Commands/Checksum.cs:
* DiscImageChef/Commands/Benchmark.cs:
* DiscImageChef/Commands/DeviceInfo.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Added statistics.
* DiscImageChef/Commands/DeviceReport.cs:
Added statistics.
Correct handling empty inquiry string fields.
Suppose it is not removable, til proved wrong.
Corrected MODE SENSE (6/10) detection and calling order.
If device is MMC type but reports neither mode page 2Ah
neither GET CONFIGURATION, try all CDs (old drives work like
that).
Try reading Lead-In and Lead-Out in Audio CD using Audio READ
CD commands.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Added support for DVD raw block (37856 bytes).
Check READ LONG up to 36 times the cooked block size. That
should be enough to detect huge blocked media (like DVD and
BD) without taking ages.
If READ LONG size had to be bruteforced, and debug is
activated, save the result.
* DiscImageChef/Commands/DumpMedia.cs:
Added statistics.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/Commands/MediaScan.cs:
Added statistics.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/DiscImageChef.csproj:
Added support for settings.
Added statistics.
* DiscImageChef/Main.cs:
* DiscImageChef/Options.cs:
Added support for settings.
Added statistics.
2016-02-03 18:58:11 +00:00
2019-01-05 16:59:23 +00:00
Statistics . AddCommand ( "create-sidecar" ) ;
2015-12-06 05:09:31 +00:00
}
2018-06-22 08:08:38 +01:00
else DicConsole . ErrorWriteLine ( "The specified input file cannot be found." ) ;
2019-01-05 16:59:23 +00:00
return 0 ;
2015-12-05 17:21:47 +00:00
}
}
2017-12-19 20:33:03 +00:00
}