diff --git a/DiscImageChef.CommonTypes/ChangeLog b/DiscImageChef.CommonTypes/ChangeLog index a5a978ef..b592da80 100644 --- a/DiscImageChef.CommonTypes/ChangeLog +++ b/DiscImageChef.CommonTypes/ChangeLog @@ -1,3 +1,7 @@ +2016-08-02 Natalia Portillo + + * MediaType.cs: Added Priam DataTower. + 2016-08-01 Natalia Portillo * AssemblyInfo.cs: diff --git a/DiscImageChef.CommonTypes/MediaType.cs b/DiscImageChef.CommonTypes/MediaType.cs index ffccbfb5..8b553739 100644 --- a/DiscImageChef.CommonTypes/MediaType.cs +++ b/DiscImageChef.CommonTypes/MediaType.cs @@ -779,6 +779,7 @@ namespace DiscImageChef.CommonTypes #region Generic hard disks Microdrive, + PriamDataTower, RDX, /// Imation 320Gb RDX RDX320, diff --git a/DiscImageChef.DiscImages/Apple2MG.cs b/DiscImageChef.DiscImages/Apple2MG.cs index f1cc1b4c..e165ee17 100644 --- a/DiscImageChef.DiscImages/Apple2MG.cs +++ b/DiscImageChef.DiscImages/Apple2MG.cs @@ -148,6 +148,10 @@ namespace DiscImageChef.ImagePlugins /// Disk image created by XGS, "XGS!" /// public const uint CreatorXGS = 0x21534758; + /// + /// Disk image created by CiderPress, "CdrP" + /// + public const uint CreatorCider = 0x50726443; public const uint DOSSectorOrder = 0x00000000; public const uint ProDOSSectorOrder = 0x00000001; @@ -330,6 +334,9 @@ namespace DiscImageChef.ImagePlugins case CreatorXGS: ImageInfo.imageApplication = "XGS"; break; + case CreatorCider: + ImageInfo.imageApplication = "CiderPress"; + break; default: ImageInfo.imageApplication = string.Format("Unknown creator code \"{0}\"", Encoding.ASCII.GetString(creator)); break; diff --git a/DiscImageChef.DiscImages/BLU.cs b/DiscImageChef.DiscImages/BLU.cs new file mode 100644 index 00000000..ef067fc7 --- /dev/null +++ b/DiscImageChef.DiscImages/BLU.cs @@ -0,0 +1,541 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : BLU.cs +// Author(s) : Natalia Portillo +// +// Component : Disc image plugins. +// +// --[ Description ] ---------------------------------------------------------- +// +// Manages Basic Lisa Utility disc images. +// +// --[ 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 . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2016 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using DiscImageChef.Console; +using DiscImageChef.CommonTypes; + +namespace DiscImageChef.ImagePlugins +{ + public class BLU : ImagePlugin + { + #region Internal Structures + struct BLUHeader + { + public byte[] deviceName; + public uint deviceType; + public uint deviceBlocks; + public ushort bytesPerBlock; + } + #endregion Internal Structures + + #region Internal Constants + const string profileName = "PROFILE "; + const string profile10Name = "PROFILE 10 "; + const string widgetName = "WIDGET-10 "; + const string priamName = "PRIAMDTATOWER"; + #endregion Internal Constants + + #region Internal variables + + BLUHeader ImageHeader; + string bluImagePath; + int bptag; + + #endregion Internal variables + + #region Public methods + public BLU() + { + Name = "Basic Lisa Utility"; + PluginUUID = new Guid("A153E2F8-4235-432D-9A7F-20807B0BCD74"); + ImageInfo = new ImageInfo(); + ImageInfo.readableSectorTags = new List(); + ImageInfo.readableMediaTags = new List(); + ImageInfo.imageHasPartitions = false; + ImageInfo.imageHasSessions = false; + ImageInfo.imageVersion = null; + ImageInfo.imageApplication = null; + ImageInfo.imageApplicationVersion = null; + ImageInfo.imageCreator = null; + ImageInfo.imageComments = null; + ImageInfo.mediaManufacturer = null; + ImageInfo.mediaModel = null; + ImageInfo.mediaSerialNumber = null; + ImageInfo.mediaBarcode = null; + ImageInfo.mediaPartNumber = null; + ImageInfo.mediaSequence = 0; + ImageInfo.lastMediaSequence = 0; + ImageInfo.driveManufacturer = null; + ImageInfo.driveModel = null; + ImageInfo.driveSerialNumber = null; + } + + public override bool IdentifyImage(string imagePath) + { + FileStream stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read); + stream.Seek(0, SeekOrigin.Begin); + + if(stream.Length < 0x200) + return false; + + byte[] header = new byte[0x17]; + stream.Read(header, 0, 0x17); + + BLUHeader tmpHdr = new BLUHeader(); + tmpHdr.deviceName = new byte[0x0D]; + BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; + + Array.Copy(header, 0, tmpHdr.deviceName, 0, 0x0D); + tmpHdr.deviceType = BigEndianBitConverter.ToUInt32(header, 0x0C) & 0x00FFFFFF; + tmpHdr.deviceBlocks = BigEndianBitConverter.ToUInt32(header, 0x11) & 0x00FFFFFF; + tmpHdr.bytesPerBlock = BigEndianBitConverter.ToUInt16(header, 0x15); + + for(int i = 0; i < 0xD; i++) + { + if(tmpHdr.deviceName[i] < 0x20) + return false; + } + + if((tmpHdr.bytesPerBlock & 0xFE00) != 0x200) + return false; + + return true; + } + + public override bool OpenImage(string imagePath) + { + FileStream stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read); + stream.Seek(0, SeekOrigin.Begin); + + ImageHeader = new BLUHeader(); + ImageHeader.deviceName = new byte[0x0D]; + BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; + + byte[] header = new byte[0x17]; + stream.Read(header, 0, 0x17); + Array.Copy(header, 0, ImageHeader.deviceName, 0, 0x0D); + ImageHeader.deviceType = BigEndianBitConverter.ToUInt32(header, 0x0C) & 0x00FFFFFF; + ImageHeader.deviceBlocks = BigEndianBitConverter.ToUInt32(header, 0x11) & 0x00FFFFFF; + ImageHeader.bytesPerBlock = BigEndianBitConverter.ToUInt16(header, 0x15); + + DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.deviceName = \"{0}\"", StringHandlers.CToString(ImageHeader.deviceName)); + DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.deviceType = {0}", ImageHeader.deviceType); + DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.deviceBlock = {0}", ImageHeader.deviceBlocks); + DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.bytesPerBlock = {0}", ImageHeader.bytesPerBlock); + + for(int i = 0; i < 0xD; i++) + { + if(ImageHeader.deviceName[i] < 0x20) + return false; + } + + if((ImageHeader.bytesPerBlock & 0xFE00) != 0x200) + return false; + + stream.Seek(0, SeekOrigin.Begin); + header = new byte[ImageHeader.bytesPerBlock]; + stream.Read(header, 0, ImageHeader.bytesPerBlock); + + + ImageInfo.sectorSize = 0x200; + + ImageInfo.sectors = ImageHeader.deviceBlocks; + ImageInfo.imageSize = ImageHeader.deviceBlocks * ImageHeader.bytesPerBlock; + bptag = ImageHeader.bytesPerBlock - 0x200; + byte[] hdrTag = new byte[bptag]; + Array.Copy(header, 0x200, hdrTag, 0, bptag); + + switch(StringHandlers.CToString(ImageHeader.deviceName)) + { + case profileName: + if(ImageInfo.sectors == 0x2600) + ImageInfo.mediaType = MediaType.AppleProfile; + else + ImageInfo.mediaType = MediaType.GENERIC_HDD; + break; + case profile10Name: + if(ImageInfo.sectors == 0x4C00) + ImageInfo.mediaType = MediaType.AppleProfile; + else + ImageInfo.mediaType = MediaType.GENERIC_HDD; + break; + case widgetName: + if(ImageInfo.sectors == 0x4C00) + ImageInfo.mediaType = MediaType.AppleWidget; + else + ImageInfo.mediaType = MediaType.GENERIC_HDD; + break; + case priamName: + if(ImageInfo.sectors == 0x022C7C) + ImageInfo.mediaType = MediaType.PriamDataTower; + else + ImageInfo.mediaType = MediaType.GENERIC_HDD; + break; + default: + ImageInfo.mediaType = MediaType.GENERIC_HDD; + break; + } + + ImageInfo.imageApplication = StringHandlers.CToString(hdrTag); + + FileInfo fi = new FileInfo(imagePath); + ImageInfo.imageCreationTime = fi.CreationTimeUtc; + ImageInfo.imageLastModificationTime = fi.LastWriteTimeUtc; + ImageInfo.imageName = Path.GetFileNameWithoutExtension(imagePath); + + stream.Close(); + + bluImagePath = imagePath; + + ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; + + if(bptag > 0) + ImageInfo.readableSectorTags.Add(SectorTagType.AppleSectorTag); + + return true; + } + + #region Verification, should add tag checksum checks + public override bool? VerifySector(ulong sectorAddress) + { + return null; + } + + public override bool? VerifySector(ulong sectorAddress, uint track) + { + return null; + } + + public override bool? VerifySectors(ulong sectorAddress, uint length, out List FailingLBAs, out List UnknownLBAs) + { + FailingLBAs = new List(); + UnknownLBAs = new List(); + + for(ulong i = sectorAddress; i < sectorAddress + length; i++) + UnknownLBAs.Add(i); + + return null; + } + + public override bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List FailingLBAs, out List UnknownLBAs) + { + FailingLBAs = new List(); + UnknownLBAs = new List(); + + for(ulong i = sectorAddress; i < sectorAddress + length; i++) + UnknownLBAs.Add(i); + + return null; + } + + public override bool? VerifyMediaImage() + { + return null; + } + #endregion Verification, should add tag checksum checks + + public override bool ImageHasPartitions() + { + return ImageInfo.imageHasPartitions; + } + + public override ulong GetImageSize() + { + return ImageInfo.imageSize; + } + + public override ulong GetSectors() + { + return ImageInfo.sectors; + } + + public override uint GetSectorSize() + { + return ImageInfo.sectorSize; + } + + public override byte[] ReadSector(ulong sectorAddress) + { + return ReadSectors(sectorAddress, 1); + } + + public override byte[] ReadSectorTag(ulong sectorAddress, SectorTagType tag) + { + return ReadSectorsTag(sectorAddress, 1, tag); + } + + public override byte[] ReadSectors(ulong sectorAddress, uint length) + { + if(sectorAddress > ImageInfo.sectors - 1) + throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); + + if(sectorAddress + length > ImageInfo.sectors) + throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than available"); + + MemoryStream buffer = new MemoryStream(); + int seek = 0; + int read = 0x200; + int skip = bptag; + + FileStream stream = new FileStream(bluImagePath, FileMode.Open, FileAccess.Read); + stream.Seek((long)((sectorAddress + 1) * ImageHeader.bytesPerBlock), SeekOrigin.Begin); + + for(int i = 0; i < length; i++) + { + stream.Seek(seek, SeekOrigin.Current); + byte[] sector = new byte[read]; + stream.Read(sector, 0, read); + buffer.Write(sector, 0, read); + stream.Seek(skip, SeekOrigin.Current); + } + + stream.Close(); + return buffer.ToArray(); + } + + public override byte[] ReadSectorsTag(ulong sectorAddress, uint length, SectorTagType tag) + { + if(tag != SectorTagType.AppleSectorTag) + throw new FeatureUnsupportedImageException(string.Format("Tag {0} not supported by image format", tag)); + + if(bptag == 0) + throw new FeatureNotPresentImageException("Disk image does not have tags"); + + if(sectorAddress > ImageInfo.sectors - 1) + throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); + + if(sectorAddress + length > ImageInfo.sectors) + throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than available"); + + MemoryStream buffer = new MemoryStream(); + int seek = 0x200; + int read = bptag; + int skip = 0; + + FileStream stream = new FileStream(bluImagePath, FileMode.Open, FileAccess.Read); + stream.Seek((long)((sectorAddress + 1) * ImageHeader.bytesPerBlock), SeekOrigin.Begin); + + for(int i = 0; i < length; i++) + { + stream.Seek(seek, SeekOrigin.Current); + byte[] sector = new byte[read]; + stream.Read(sector, 0, read); + buffer.Write(sector, 0, read); + stream.Seek(skip, SeekOrigin.Current); + } + + stream.Close(); + return buffer.ToArray(); + } + + public override byte[] ReadSectorLong(ulong sectorAddress) + { + return ReadSectorsLong(sectorAddress, 1); + } + + public override byte[] ReadSectorsLong(ulong sectorAddress, uint length) + { + if(sectorAddress > ImageInfo.sectors - 1) + throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); + + if(sectorAddress + length > ImageInfo.sectors) + throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than available"); + + byte[] buffer = new byte[length * ImageHeader.bytesPerBlock]; + FileStream stream = new FileStream(bluImagePath, FileMode.Open, FileAccess.Read); + stream.Seek((long)((sectorAddress + 1) * ImageHeader.bytesPerBlock), SeekOrigin.Begin); + stream.Read(buffer, 0, buffer.Length); + stream.Close(); + + return buffer; + } + + public override string GetImageFormat() + { + return "Basic Lisa Utility"; + } + + public override string GetImageVersion() + { + return ImageInfo.imageVersion; + } + + public override string GetImageApplication() + { + return ImageInfo.imageApplication; + } + + public override string GetImageApplicationVersion() + { + return ImageInfo.imageApplicationVersion; + } + + public override DateTime GetImageCreationTime() + { + return ImageInfo.imageCreationTime; + } + + public override DateTime GetImageLastModificationTime() + { + return ImageInfo.imageLastModificationTime; + } + + public override string GetImageName() + { + return ImageInfo.imageName; + } + + public override MediaType GetMediaType() + { + return ImageInfo.mediaType; + } + #endregion Public methods + + #region Unsupported features + + public override byte[] ReadDiskTag(MediaTagType tag) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override string GetImageCreator() + { + return ImageInfo.imageCreator; + } + + public override string GetImageComments() + { + return ImageInfo.imageComments; + } + + public override string GetMediaManufacturer() + { + return ImageInfo.mediaManufacturer; + } + + public override string GetMediaModel() + { + return ImageInfo.mediaModel; + } + + public override string GetMediaSerialNumber() + { + return ImageInfo.mediaSerialNumber; + } + + public override string GetMediaBarcode() + { + return ImageInfo.mediaBarcode; + } + + public override string GetMediaPartNumber() + { + return ImageInfo.mediaPartNumber; + } + + public override int GetMediaSequence() + { + return ImageInfo.mediaSequence; + } + + public override int GetLastDiskSequence() + { + return ImageInfo.lastMediaSequence; + } + + public override string GetDriveManufacturer() + { + return ImageInfo.driveManufacturer; + } + + public override string GetDriveModel() + { + return ImageInfo.driveModel; + } + + public override string GetDriveSerialNumber() + { + return ImageInfo.driveSerialNumber; + } + + public override List GetPartitions() + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override List GetTracks() + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override List GetSessionTracks(Session session) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override List GetSessionTracks(ushort session) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override List GetSessions() + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override byte[] ReadSector(ulong sectorAddress, uint track) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override byte[] ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override byte[] ReadSectors(ulong sectorAddress, uint length, uint track) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override byte[] ReadSectorLong(ulong sectorAddress, uint track) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + public override byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + { + throw new FeatureUnsupportedImageException("Feature not supported by image format"); + } + + #endregion Unsupported features + + } +} diff --git a/DiscImageChef.DiscImages/CDRWin.cs b/DiscImageChef.DiscImages/CDRWin.cs index a3f252f6..f93ff5a8 100644 --- a/DiscImageChef.DiscImages/CDRWin.cs +++ b/DiscImageChef.DiscImages/CDRWin.cs @@ -255,29 +255,29 @@ namespace DiscImageChef.ImagePlugins #region Parsing regexs - const string SessionRegEx = "REM\\s+SESSION\\s+(?\\d+).*$"; - const string DiskTypeRegEx = "REM\\s+ORIGINAL MEDIA-TYPE:\\s+(?.+)$"; - const string LeadOutRegEx = "REM\\s+LEAD-OUT\\s+(?[\\d]+:[\\d]+:[\\d]+)$"; + const string SessionRegEx = "\\bREM\\s+SESSION\\s+(?\\d+).*$"; + const string DiskTypeRegEx = "\\bREM\\s+ORIGINAL MEDIA-TYPE:\\s+(?.+)$"; + const string LeadOutRegEx = "\\bREM\\s+LEAD-OUT\\s+(?[\\d]+:[\\d]+:[\\d]+)$"; // Not checked - const string LBARegEx = "REM MSF:\\s+(?[\\d]+:[\\d]+:[\\d]+)\\s+=\\s+LBA:\\s+(?[\\d]+)$"; - const string DiskIDRegEx = "DISC_ID\\s+(?[\\da-f]{8})$"; - const string BarCodeRegEx = "UPC_EAN\\s+(?[\\d]{12,13})$"; - const string CommentRegEx = "REM\\s+(?.+)$"; - const string CDTextRegEx = "CDTEXTFILE\\s+(?.+)$"; - const string MCNRegEx = "CATALOG\\s+(?\\d{13})$"; - const string TitleRegEx = "TITLE\\s+(?.+)$"; - const string GenreRegEx = "GENRE\\s+(?<genre>.+)$"; - const string ArrangerRegEx = "ARRANGER\\s+(?<arranger>.+)$"; - const string ComposerRegEx = "COMPOSER\\s+(?<composer>.+)$"; - const string PerformerRegEx = "PERFORMER\\s+(?<performer>.+)$"; - const string SongWriterRegEx = "SONGWRITER\\s+(?<songwriter>.+)$"; - const string FileRegEx = "FILE\\s+(?<filename>.+)\\s+(?<type>\\S+)$"; - const string TrackRegEx = "TRACK\\s+(?<number>\\d+)\\s+(?<type>\\S+)$"; - const string ISRCRegEx = "ISRC\\s+(?<isrc>\\w{12})$"; - const string IndexRegEx = "INDEX\\s+(?<index>\\d+)\\s+(?<msf>[\\d]+:[\\d]+:[\\d]+)$"; - const string PregapRegEx = "PREGAP\\s+(?<msf>[\\d]+:[\\d]+:[\\d]+)$"; - const string PostgapRegex = "POSTGAP\\s+(?<msf>[\\d]+:[\\d]+:[\\d]+)$"; - const string FlagsRegEx = "FLAGS\\s+(((?<dcp>DCP)|(?<quad>4CH)|(?<pre>PRE)|(?<scms>SCMS))\\s*)+$"; + const string LBARegEx = "\\bREM MSF:\\s+(?<msf>[\\d]+:[\\d]+:[\\d]+)\\s+=\\s+LBA:\\s+(?<lba>[\\d]+)$"; + const string DiskIDRegEx = "\\bDISC_ID\\s+(?<diskid>[\\da-f]{8})$"; + const string BarCodeRegEx = "\\bUPC_EAN\\s+(?<barcode>[\\d]{12,13})$"; + const string CommentRegEx = "\\bREM\\s+(?<comment>.+)$"; + const string CDTextRegEx = "\\bCDTEXTFILE\\s+(?<filename>.+)$"; + const string MCNRegEx = "\\bCATALOG\\s+(?<catalog>\\d{13})$"; + const string TitleRegEx = "\\bTITLE\\s+(?<title>.+)$"; + const string GenreRegEx = "\\bGENRE\\s+(?<genre>.+)$"; + const string ArrangerRegEx = "\\bARRANGER\\s+(?<arranger>.+)$"; + const string ComposerRegEx = "\\bCOMPOSER\\s+(?<composer>.+)$"; + const string PerformerRegEx = "\\bPERFORMER\\s+(?<performer>.+)$"; + const string SongWriterRegEx = "\\bSONGWRITER\\s+(?<songwriter>.+)$"; + const string FileRegEx = "\\bFILE\\s+(?<filename>.+)\\s+(?<type>\\S+)$"; + const string TrackRegEx = "\\bTRACK\\s+(?<number>\\d+)\\s+(?<type>\\S+)$"; + const string ISRCRegEx = "\\bISRC\\s+(?<isrc>\\w{12})$"; + const string IndexRegEx = "\\bINDEX\\s+(?<index>\\d+)\\s+(?<msf>[\\d]+:[\\d]+:[\\d]+)$"; + const string PregapRegEx = "\\bPREGAP\\s+(?<msf>[\\d]+:[\\d]+:[\\d]+)$"; + const string PostgapRegex = "\\bPOSTGAP\\s+(?<msf>[\\d]+:[\\d]+:[\\d]+)$"; + const string FlagsRegEx = "\\bFLAGS\\s+(((?<dcp>DCP)|(?<quad>4CH)|(?<pre>PRE)|(?<scms>SCMS))\\s*)+$"; #endregion diff --git a/DiscImageChef.DiscImages/ChangeLog b/DiscImageChef.DiscImages/ChangeLog index a649a552..773f764a 100644 --- a/DiscImageChef.DiscImages/ChangeLog +++ b/DiscImageChef.DiscImages/ChangeLog @@ -1,3 +1,13 @@ +2016-08-02 Natalia Portillo <claunia@claunia.com> + + * BLU.cs: + * DiscImageChef.DiscImages.csproj: Added support for Basic + Lisa Utility. + + * Apple2MG.cs: Added CiderPress creator. + + * CDRWin.cs: Changed RegExs so words must be exact. + 2016-08-01 Natalia Portillo <claunia@claunia.com> * AssemblyInfo.cs: diff --git a/DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj b/DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj index f91739d1..4e8553d5 100644 --- a/DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj +++ b/DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj @@ -45,6 +45,7 @@ <Compile Include="ZZZRawImage.cs" /> <Compile Include="CDRDAO.cs" /> <Compile Include="GDI.cs" /> + <Compile Include="BLU.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <ItemGroup> diff --git a/DiscImageChef.Metadata/ChangeLog b/DiscImageChef.Metadata/ChangeLog index b7f67a4f..3a8bc72d 100644 --- a/DiscImageChef.Metadata/ChangeLog +++ b/DiscImageChef.Metadata/ChangeLog @@ -1,3 +1,7 @@ +2016-08-02 Natalia Portillo <claunia@claunia.com> + + * MediaType.cs: Added Priam DataTower. + 2016-08-01 Natalia Portillo <claunia@claunia.com> * AssemblyInfo.cs: diff --git a/DiscImageChef.Metadata/MediaType.cs b/DiscImageChef.Metadata/MediaType.cs index de191e55..fd078c22 100644 --- a/DiscImageChef.Metadata/MediaType.cs +++ b/DiscImageChef.Metadata/MediaType.cs @@ -670,6 +670,10 @@ namespace DiscImageChef.Metadata DiscType = "HDD"; DiscSubType = "Apple HD20"; break; + case CommonTypes.MediaType.PriamDataTower: + DiscType = "HDD"; + DiscSubType = "Priam DataTower"; + break; default: DiscType = "Unknown"; DiscSubType = "Unknown";