/// <summary>
        /// Generate barcode, the generated barcode image will be saved on provided disk location
        /// </summary>
        /// <param name="text">The code text</param>
        /// <param name="type">Barcode type</param>
        /// <param name="format">Result format</param>
        /// <param name="enableChecksum">Sets if checksum will be generated</param>
        /// <param name="localPathWithFileNameAndExtension">Local disk path with filename and extension to save the generated barcode image. It will overwrite the file if it already exists</param>
        /// <param name="resolutionX">Horizontal resolution in DPI. Default is 96</param>
        /// <param name="resolutionY">Vertical resolution in DPI. Default is 96</param>
        /// <param name="dimensionX">Smallest width of barcode unit (bar or space). Default is 0.7</param>
        /// <param name="dimensionY">Smallest height of barcode unit (for 2D barcodes). Default is 2</param>
        public void GenerateBarCode(string text, BarCodeType type, BarCodeImageFormat format, string localPathWithFileNameAndExtension,
                                    EnableChecksum enableChecksum = EnableChecksum.No, float resolutionX = 96, float resolutionY = 96, double dimensionX = 0.7, float dimensionY = 2)
        {
            // GET barcode/generate?appSid={appSid}&text={text}&type={type}&format={format}&resolutionX={resolutionX}
            //                                &resolutionY={resolutionY}&dimensionX={dimensionX}&dimensionY={dimensionY}&enableChecksum={enableChecksum} 

            string apiUrl = string.Format(@"barcode/generate?text={0}&type={1}&format={2}&resolutionX={3}&resolutionY={4}&dimensionX={5}&dimensionY={6}&enableChecksum={7}",
                                            text, type, format, resolutionX, resolutionY, dimensionX, dimensionY, enableChecksum);

            using (Stream responseStream = ServiceController.GetStream(apiUrl, AppSid, AppKey))
            using (Stream file = File.OpenWrite(localPathWithFileNameAndExtension))
            {
                ServiceController.CopyStream(responseStream, file);
            }
        }
Пример #2
0
        /// <summary>
        /// Generate barcode, the generated barcode image will be saved on provided disk location
        /// </summary>
        /// <param name="text">The code text</param>
        /// <param name="type">Barcode type</param>
        /// <param name="format">Result format</param>
        /// <param name="enableChecksum">Sets if checksum will be generated</param>
        /// <param name="localPathWithFileNameAndExtension">Local disk path with filename and extension to save the generated barcode image. It will overwrite the file if it already exists</param>
        /// <param name="resolutionX">Horizontal resolution in DPI. Default is 96</param>
        /// <param name="resolutionY">Vertical resolution in DPI. Default is 96</param>
        /// <param name="dimensionX">Smallest width of barcode unit (bar or space). Default is 0.7</param>
        /// <param name="dimensionY">Smallest height of barcode unit (for 2D barcodes). Default is 2</param>
        public void GenerateBarCode(string text, BarCodeType type, BarCodeImageFormat format, string localPathWithFileNameAndExtension,
                                    EnableChecksum enableChecksum = EnableChecksum.No, float resolutionX = 96, float resolutionY = 96, double dimensionX = 0.7, float dimensionY = 2)
        {
            // GET barcode/generate?appSid={appSid}&text={text}&type={type}&format={format}&resolutionX={resolutionX}
            //                                &resolutionY={resolutionY}&dimensionX={dimensionX}&dimensionY={dimensionY}&enableChecksum={enableChecksum}

            string apiUrl = string.Format(@"barcode/generate?text={0}&type={1}&format={2}&resolutionX={3}&resolutionY={4}&dimensionX={5}&dimensionY={6}&enableChecksum={7}",
                                          text, type, format, resolutionX, resolutionY, dimensionX, dimensionY, enableChecksum);

            using (Stream responseStream = ServiceController.GetStream(apiUrl, AppSid, AppKey))
                using (Stream file = File.OpenWrite(localPathWithFileNameAndExtension))
                {
                    ServiceController.CopyStream(responseStream, file);
                }
        }
        /// <summary>
        ///  Generate barcode and save on server
        /// </summary>
        /// <param name="name">The image name.</param>
        /// <param name="text">Barcode's text.</param>
        /// <param name="type">The barcode type.</param>
        /// <param name="format">The image format.</param>
        /// <param name="codeLocation">Property of the barcode.</param>
        /// <param name="grUnit">Measurement of barcode properties.</param>
        /// <param name="autoSize">Sets if barcode size will be updated automatically.</param>
        /// <param name="barHeight">Height of the bar.</param>
        /// <param name="imageHeight">Height of the image.</param>
        /// <param name="imageWidth">Width of the image.</param>
        /// <param name="imageQuality">Determines quality of the barcode image.</param>
        /// <param name="rotAngle">Angle of barcode orientation.</param>
        /// <param name="topMargin">Top margin.</param>
        /// <param name="bottomMargin">Bottom margin.</param>
        /// <param name="leftMargin">Left margin.</param>
        /// <param name="rightMargin">Right margin.</param>
        /// <param name="enableChecksum">Sets if checksum will be generated.</param>
        /// <param name="storage">Image's storage.</param>
        /// <param name="folder">Image's folder.</param>
        /// <param name="resolutionX">Horizontal resolution in DPI. Default is 96</param>
        /// <param name="resolutionY">Vertical resolution in DPI. Default is 96</param>
        /// <param name="dimensionX">Smallest width of barcode unit (bar or space). Default is 0.7</param>
        /// <param name="dimensionY">Smallest height of barcode unit (for 2D barcodes). Default is 2</param>
        public void GenerateBarCodeAndSaveOnServer(string name, string text, BarCodeType type,
                                                   float barHeight, float imageHeight, float imageWidth, float rotAngle,
                                                   float topMargin, float bottomMargin, float leftMargin, float rightMargin, string storage,
                                                   string folder,
                                                   BarCodeImageFormat format = BarCodeImageFormat.PNG, CodeLocation codeLocation = CodeLocation.Below, GrUnit grUnit = GrUnit.MM,
                                                   bool autoSize = true, ImageQuality imageQuality = ImageQuality.Default, EnableChecksum enableChecksum = EnableChecksum.No,
                                                   float resolutionX = 96, float resolutionY = 96, double dimensionX = 0.7, float dimensionY = 2)
        {
            // PUT 	barcode/{name}/generate?appSid={appSid}&text={text}&type={type}&format={format}&resolutionX={resolutionX}&resolutionY={resolutionY}&dimensionX={dimensionX}&dimensionY={dimensionY}&codeLocation={codeLocation}&grUnit={grUnit}&autoSize={autoSize}&barHeight={barHeight}&imageHeight={imageHeight}&imageWidth={imageWidth}&imageQuality={imageQuality}&rotAngle={rotAngle}&topMargin={topMargin}&bottomMargin={bottomMargin}&leftMargin={leftMargin}&rightMargin={rightMargin}&enableChecksum={enableChecksum}&storage={storage}&folder={folder}

            string apiUrl = string.Format(@"barcode/{0}/generate?text={1}&type={2}&format={3}&resolutionX={4}&resolutionY={5}&dimensionX={6}&dimensionY={7}&codeLocation={8}&grUnit={9}&autoSize={10}&barHeight={11}&imageHeight={12}&imageWidth={13}&imageQuality={14}&rotAngle={15}&topMargin={16}&bottomMargin={17}&leftMargin={18}&rightMargin={19}&enableChecksum={20}&storage={21}&folder={22}",
                                            name, text, type, format, resolutionX, resolutionY, dimensionX, dimensionY, codeLocation, grUnit, autoSize, barHeight,
                                            imageHeight, imageWidth, imageQuality, rotAngle, topMargin, bottomMargin, leftMargin, rightMargin, enableChecksum,
                                            storage, folder);

            ServiceController.Put(apiUrl, AppSid, AppKey);
        }
Пример #4
0
        public static int Invoke(bool debug, bool verbose, bool adler32, bool crc16, bool crc32, bool crc64,
                                 bool fletcher16, bool fletcher32, bool md5, bool sha1, bool sha256, bool sha384,
                                 bool sha512, bool spamSum, string imagePath, bool separatedTracks, bool wholeDisc)
        {
            MainClass.PrintCopyright();

            if (debug)
            {
                AaruConsole.DebugWriteLineEvent += System.Console.Error.WriteLine;
            }

            if (verbose)
            {
                AaruConsole.VerboseWriteLineEvent += System.Console.WriteLine;
            }

            Statistics.AddCommand("checksum");

            AaruConsole.DebugWriteLine("Checksum command", "--adler32={0}", adler32);
            AaruConsole.DebugWriteLine("Checksum command", "--crc16={0}", crc16);
            AaruConsole.DebugWriteLine("Checksum command", "--crc32={0}", crc32);
            AaruConsole.DebugWriteLine("Checksum command", "--crc64={0}", crc64);
            AaruConsole.DebugWriteLine("Checksum command", "--debug={0}", debug);
            AaruConsole.DebugWriteLine("Checksum command", "--fletcher16={0}", fletcher16);
            AaruConsole.DebugWriteLine("Checksum command", "--fletcher32={0}", fletcher32);
            AaruConsole.DebugWriteLine("Checksum command", "--input={0}", imagePath);
            AaruConsole.DebugWriteLine("Checksum command", "--md5={0}", md5);
            AaruConsole.DebugWriteLine("Checksum command", "--separated-tracks={0}", separatedTracks);
            AaruConsole.DebugWriteLine("Checksum command", "--sha1={0}", sha1);
            AaruConsole.DebugWriteLine("Checksum command", "--sha256={0}", sha256);
            AaruConsole.DebugWriteLine("Checksum command", "--sha384={0}", sha384);
            AaruConsole.DebugWriteLine("Checksum command", "--sha512={0}", sha512);
            AaruConsole.DebugWriteLine("Checksum command", "--spamsum={0}", spamSum);
            AaruConsole.DebugWriteLine("Checksum command", "--verbose={0}", verbose);
            AaruConsole.DebugWriteLine("Checksum command", "--whole-disc={0}", wholeDisc);

            var     filtersList = new FiltersList();
            IFilter inputFilter = filtersList.GetFilter(imagePath);

            if (inputFilter == null)
            {
                AaruConsole.ErrorWriteLine("Cannot open specified file.");

                return((int)ErrorNumber.CannotOpenFile);
            }

            IMediaImage inputFormat = ImageFormat.Detect(inputFilter);

            if (inputFormat == null)
            {
                AaruConsole.ErrorWriteLine("Unable to recognize image format, not checksumming");

                return((int)ErrorNumber.UnrecognizedFormat);
            }

            inputFormat.Open(inputFilter);
            Statistics.AddMediaFormat(inputFormat.Format);
            Statistics.AddMedia(inputFormat.Info.MediaType, false);
            Statistics.AddFilter(inputFilter.Name);
            var enabledChecksums = new EnableChecksum();

            if (adler32)
            {
                enabledChecksums |= EnableChecksum.Adler32;
            }

            if (crc16)
            {
                enabledChecksums |= EnableChecksum.Crc16;
            }

            if (crc32)
            {
                enabledChecksums |= EnableChecksum.Crc32;
            }

            if (crc64)
            {
                enabledChecksums |= EnableChecksum.Crc64;
            }

            if (md5)
            {
                enabledChecksums |= EnableChecksum.Md5;
            }

            if (sha1)
            {
                enabledChecksums |= EnableChecksum.Sha1;
            }

            if (sha256)
            {
                enabledChecksums |= EnableChecksum.Sha256;
            }

            if (sha384)
            {
                enabledChecksums |= EnableChecksum.Sha384;
            }

            if (sha512)
            {
                enabledChecksums |= EnableChecksum.Sha512;
            }

            if (spamSum)
            {
                enabledChecksums |= EnableChecksum.SpamSum;
            }

            if (fletcher16)
            {
                enabledChecksums |= EnableChecksum.Fletcher16;
            }

            if (fletcher32)
            {
                enabledChecksums |= EnableChecksum.Fletcher32;
            }

            Checksum mediaChecksum = null;

            switch (inputFormat)
            {
            case IOpticalMediaImage opticalInput when opticalInput.Tracks != null:
                try
                {
                    Checksum trackChecksum = null;

                    if (wholeDisc)
                    {
                        mediaChecksum = new Checksum(enabledChecksums);
                    }

                    ulong previousTrackEnd = 0;

                    List <Track> inputTracks = opticalInput.Tracks;

                    foreach (Track currentTrack in inputTracks)
                    {
                        /*
                         * if(currentTrack.TrackStartSector - previousTrackEnd != 0 && wholeDisc)
                         *  for(ulong i = previousTrackEnd + 1; i < currentTrack.TrackStartSector; i++)
                         *  {
                         *      AaruConsole.Write("\rHashing track-less sector {0}", i);
                         *
                         *      byte[] hiddenSector = inputFormat.ReadSector(i);
                         *
                         *      mediaChecksum?.Update(hiddenSector);
                         *  }
                         */

                        AaruConsole.DebugWriteLine("Checksum command",
                                                   "Track {0} starts at sector {1} and ends at sector {2}",
                                                   currentTrack.TrackSequence, currentTrack.TrackStartSector,
                                                   currentTrack.TrackEndSector);

                        if (separatedTracks)
                        {
                            trackChecksum = new Checksum(enabledChecksums);
                        }

                        ulong sectors     = (currentTrack.TrackEndSector - currentTrack.TrackStartSector) + 1;
                        ulong doneSectors = 0;
                        AaruConsole.WriteLine("Track {0} has {1} sectors", currentTrack.TrackSequence, sectors);

                        while (doneSectors < sectors)
                        {
                            byte[] sector;

                            if (sectors - doneSectors >= SECTORS_TO_READ)
                            {
                                sector = opticalInput.ReadSectors(doneSectors, SECTORS_TO_READ,
                                                                  currentTrack.TrackSequence);

                                AaruConsole.Write("\rHashing sectors {0} to {2} of track {1}", doneSectors,
                                                  currentTrack.TrackSequence, doneSectors + SECTORS_TO_READ);

                                doneSectors += SECTORS_TO_READ;
                            }
                            else
                            {
                                sector = opticalInput.ReadSectors(doneSectors, (uint)(sectors - doneSectors),
                                                                  currentTrack.TrackSequence);

                                AaruConsole.Write("\rHashing sectors {0} to {2} of track {1}", doneSectors,
                                                  currentTrack.TrackSequence,
                                                  doneSectors + (sectors - doneSectors));

                                doneSectors += sectors - doneSectors;
                            }

                            if (wholeDisc)
                            {
                                mediaChecksum?.Update(sector);
                            }

                            if (separatedTracks)
                            {
                                trackChecksum?.Update(sector);
                            }
                        }

                        AaruConsole.WriteLine();

                        if (separatedTracks)
                        {
                            if (trackChecksum != null)
                            {
                                foreach (ChecksumType chk in trackChecksum.End())
                                {
                                    AaruConsole.WriteLine("Track {0}'s {1}: {2}", currentTrack.TrackSequence,
                                                          chk.type, chk.Value);
                                }
                            }
                        }

                        previousTrackEnd = currentTrack.TrackEndSector;
                    }

                    /*
                     * if(opticalInput.Info.Sectors - previousTrackEnd != 0 && wholeDisc)
                     *  for(ulong i = previousTrackEnd + 1; i < opticalInput.Info.Sectors; i++)
                     *  {
                     *      AaruConsole.Write("\rHashing track-less sector {0}", i);
                     *
                     *      byte[] hiddenSector = inputFormat.ReadSector(i);
                     *      mediaChecksum?.Update(hiddenSector);
                     *  }
                     */

                    if (wholeDisc)
                    {
                        if (mediaChecksum != null)
                        {
                            foreach (ChecksumType chk in mediaChecksum.End())
                            {
                                AaruConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (debug)
                    {
                        AaruConsole.DebugWriteLine("Could not get tracks because {0}", ex.Message);
                    }
                    else
                    {
                        AaruConsole.WriteLine("Unable to get separate tracks, not checksumming them");
                    }
                }

                break;

            case ITapeImage tapeImage when tapeImage.IsTape && tapeImage.Files?.Count > 0:
            {
                Checksum trackChecksum = null;

                if (wholeDisc)
                {
                    mediaChecksum = new Checksum(enabledChecksums);
                }

                ulong previousTrackEnd = 0;

                foreach (TapeFile currentFile in tapeImage.Files)
                {
                    if (currentFile.FirstBlock - previousTrackEnd != 0 && wholeDisc)
                    {
                        for (ulong i = previousTrackEnd + 1; i < currentFile.FirstBlock; i++)
                        {
                            AaruConsole.Write("\rHashing file-less block {0}", i);

                            byte[] hiddenSector = inputFormat.ReadSector(i);

                            mediaChecksum?.Update(hiddenSector);
                        }
                    }

                    AaruConsole.DebugWriteLine("Checksum command",
                                               "Track {0} starts at sector {1} and ends at block {2}",
                                               currentFile.File, currentFile.FirstBlock, currentFile.LastBlock);

                    if (separatedTracks)
                    {
                        trackChecksum = new Checksum(enabledChecksums);
                    }

                    ulong sectors     = (currentFile.LastBlock - currentFile.FirstBlock) + 1;
                    ulong doneSectors = 0;
                    AaruConsole.WriteLine("File {0} has {1} sectors", currentFile.File, sectors);

                    while (doneSectors < sectors)
                    {
                        byte[] sector;

                        if (sectors - doneSectors >= SECTORS_TO_READ)
                        {
                            sector = tapeImage.ReadSectors(doneSectors + currentFile.FirstBlock, SECTORS_TO_READ);

                            AaruConsole.Write("\rHashing blocks {0} to {2} of file {1}", doneSectors,
                                              currentFile.File, doneSectors + SECTORS_TO_READ);

                            doneSectors += SECTORS_TO_READ;
                        }
                        else
                        {
                            sector = tapeImage.ReadSectors(doneSectors + currentFile.FirstBlock,
                                                           (uint)(sectors - doneSectors));

                            AaruConsole.Write("\rHashing blocks {0} to {2} of file {1}", doneSectors,
                                              currentFile.File, doneSectors + (sectors - doneSectors));

                            doneSectors += sectors - doneSectors;
                        }

                        if (wholeDisc)
                        {
                            mediaChecksum?.Update(sector);
                        }

                        if (separatedTracks)
                        {
                            trackChecksum?.Update(sector);
                        }
                    }

                    AaruConsole.WriteLine();

                    if (separatedTracks)
                    {
                        if (trackChecksum != null)
                        {
                            foreach (ChecksumType chk in trackChecksum.End())
                            {
                                AaruConsole.WriteLine("File {0}'s {1}: {2}", currentFile.File, chk.type, chk.Value);
                            }
                        }
                    }

                    previousTrackEnd = currentFile.LastBlock;
                }

                if (tapeImage.Info.Sectors - previousTrackEnd != 0 && wholeDisc)
                {
                    for (ulong i = previousTrackEnd + 1; i < tapeImage.Info.Sectors; i++)
                    {
                        AaruConsole.Write("\rHashing file-less sector {0}", i);

                        byte[] hiddenSector = inputFormat.ReadSector(i);
                        mediaChecksum?.Update(hiddenSector);
                    }
                }

                if (wholeDisc)
                {
                    if (mediaChecksum != null)
                    {
                        foreach (ChecksumType chk in mediaChecksum.End())
                        {
                            AaruConsole.WriteLine("Tape's {0}: {1}", chk.type, chk.Value);
                        }
                    }
                }

                break;
            }

            default:
            {
                mediaChecksum = new Checksum(enabledChecksums);

                ulong sectors = inputFormat.Info.Sectors;
                AaruConsole.WriteLine("Sectors {0}", sectors);
                ulong doneSectors = 0;

                while (doneSectors < sectors)
                {
                    byte[] sector;

                    if (sectors - doneSectors >= SECTORS_TO_READ)
                    {
                        sector = inputFormat.ReadSectors(doneSectors, SECTORS_TO_READ);

                        AaruConsole.Write("\rHashing sectors {0} to {1}", doneSectors,
                                          doneSectors + SECTORS_TO_READ);

                        doneSectors += SECTORS_TO_READ;
                    }
                    else
                    {
                        sector = inputFormat.ReadSectors(doneSectors, (uint)(sectors - doneSectors));

                        AaruConsole.Write("\rHashing sectors {0} to {1}", doneSectors,
                                          doneSectors + (sectors - doneSectors));

                        doneSectors += sectors - doneSectors;
                    }

                    mediaChecksum.Update(sector);
                }

                AaruConsole.WriteLine();

                foreach (ChecksumType chk in mediaChecksum.End())
                {
                    AaruConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
                }

                break;
            }
            }

            return((int)ErrorNumber.NoError);
        }
Пример #5
0
        public Checksum(EnableChecksum enabled = EnableChecksum.All)
        {
            _enabled = enabled;

            if (enabled.HasFlag(EnableChecksum.Adler32))
            {
                _adler32Ctx = new Adler32Context();

                _adlerPkt = new HashPacket
                {
                    Context = _adler32Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Crc16))
            {
                _crc16Ctx = new CRC16IBMContext();

                _crc16Pkt = new HashPacket
                {
                    Context = _crc16Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Crc32))
            {
                _crc32Ctx = new Crc32Context();

                _crc32Pkt = new HashPacket
                {
                    Context = _crc32Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Crc64))
            {
                _crc64Ctx = new Crc64Context();

                _crc64Pkt = new HashPacket
                {
                    Context = _crc64Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Md5))
            {
                _md5Ctx = new Md5Context();

                _md5Pkt = new HashPacket
                {
                    Context = _md5Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Sha1))
            {
                _sha1Ctx = new Sha1Context();

                _sha1Pkt = new HashPacket
                {
                    Context = _sha1Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Sha256))
            {
                _sha256Ctx = new Sha256Context();

                _sha256Pkt = new HashPacket
                {
                    Context = _sha256Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Sha384))
            {
                _sha384Ctx = new Sha384Context();

                _sha384Pkt = new HashPacket
                {
                    Context = _sha384Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Sha512))
            {
                _sha512Ctx = new Sha512Context();

                _sha512Pkt = new HashPacket
                {
                    Context = _sha512Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.SpamSum))
            {
                _ssCtx = new SpamSumContext();

                _spamsumPkt = new HashPacket
                {
                    Context = _ssCtx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher16))
            {
                _f16Ctx = new Fletcher16Context();

                _f16Pkt = new HashPacket
                {
                    Context = _f16Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher32))
            {
                _f32Ctx = new Fletcher32Context();

                _f32Pkt = new HashPacket
                {
                    Context = _f32Ctx
                };
            }

            _adlerThread   = new Thread(UpdateHash);
            _crc16Thread   = new Thread(UpdateHash);
            _crc32Thread   = new Thread(UpdateHash);
            _crc64Thread   = new Thread(UpdateHash);
            _md5Thread     = new Thread(UpdateHash);
            _sha1Thread    = new Thread(UpdateHash);
            _sha256Thread  = new Thread(UpdateHash);
            _sha384Thread  = new Thread(UpdateHash);
            _sha512Thread  = new Thread(UpdateHash);
            _spamsumThread = new Thread(UpdateHash);
            _f16Thread     = new Thread(UpdateHash);
            _f32Thread     = new Thread(UpdateHash);
        }
Пример #6
0
        internal static List <ChecksumType> GetChecksums(byte[] data, EnableChecksum enabled = EnableChecksum.All)
        {
            IChecksum adler32CtxData = null;
            IChecksum crc16CtxData   = null;
            IChecksum crc32CtxData   = null;
            IChecksum crc64CtxData   = null;
            IChecksum md5CtxData     = null;
            IChecksum sha1CtxData    = null;
            IChecksum sha256CtxData  = null;
            IChecksum sha384CtxData  = null;
            IChecksum sha512CtxData  = null;
            IChecksum ssctxData      = null;
            IChecksum f16CtxData     = null;
            IChecksum f32CtxData     = null;

            var adlerThreadData   = new Thread(UpdateHash);
            var crc16ThreadData   = new Thread(UpdateHash);
            var crc32ThreadData   = new Thread(UpdateHash);
            var crc64ThreadData   = new Thread(UpdateHash);
            var md5ThreadData     = new Thread(UpdateHash);
            var sha1ThreadData    = new Thread(UpdateHash);
            var sha256ThreadData  = new Thread(UpdateHash);
            var sha384ThreadData  = new Thread(UpdateHash);
            var sha512ThreadData  = new Thread(UpdateHash);
            var spamsumThreadData = new Thread(UpdateHash);
            var f16ThreadData     = new Thread(UpdateHash);
            var f32ThreadData     = new Thread(UpdateHash);

            if (enabled.HasFlag(EnableChecksum.Adler32))
            {
                adler32CtxData = new Adler32Context();

                var adlerPktData = new HashPacket
                {
                    Context = adler32CtxData,
                    Data    = data
                };

                adlerThreadData.Start(adlerPktData);
            }

            if (enabled.HasFlag(EnableChecksum.Crc16))
            {
                crc16CtxData = new CRC16IBMContext();

                var crc16PktData = new HashPacket
                {
                    Context = crc16CtxData,
                    Data    = data
                };

                crc16ThreadData.Start(crc16PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Crc32))
            {
                crc32CtxData = new Crc32Context();

                var crc32PktData = new HashPacket
                {
                    Context = crc32CtxData,
                    Data    = data
                };

                crc32ThreadData.Start(crc32PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Crc64))
            {
                crc64CtxData = new Crc64Context();

                var crc64PktData = new HashPacket
                {
                    Context = crc64CtxData,
                    Data    = data
                };

                crc64ThreadData.Start(crc64PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Md5))
            {
                md5CtxData = new Md5Context();

                var md5PktData = new HashPacket
                {
                    Context = md5CtxData,
                    Data    = data
                };

                md5ThreadData.Start(md5PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Sha1))
            {
                sha1CtxData = new Sha1Context();

                var sha1PktData = new HashPacket
                {
                    Context = sha1CtxData,
                    Data    = data
                };

                sha1ThreadData.Start(sha1PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Sha256))
            {
                sha256CtxData = new Sha256Context();

                var sha256PktData = new HashPacket
                {
                    Context = sha256CtxData,
                    Data    = data
                };

                sha256ThreadData.Start(sha256PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Sha384))
            {
                sha384CtxData = new Sha384Context();

                var sha384PktData = new HashPacket
                {
                    Context = sha384CtxData,
                    Data    = data
                };

                sha384ThreadData.Start(sha384PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Sha512))
            {
                sha512CtxData = new Sha512Context();

                var sha512PktData = new HashPacket
                {
                    Context = sha512CtxData,
                    Data    = data
                };

                sha512ThreadData.Start(sha512PktData);
            }

            if (enabled.HasFlag(EnableChecksum.SpamSum))
            {
                ssctxData = new SpamSumContext();

                var spamsumPktData = new HashPacket
                {
                    Context = ssctxData,
                    Data    = data
                };

                spamsumThreadData.Start(spamsumPktData);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher16))
            {
                f16CtxData = new Fletcher16Context();

                var f16PktData = new HashPacket
                {
                    Context = f16CtxData,
                    Data    = data
                };

                f16ThreadData.Start(f16PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher32))
            {
                f32CtxData = new Fletcher32Context();

                var f32PktData = new HashPacket
                {
                    Context = f32CtxData,
                    Data    = data
                };

                f32ThreadData.Start(f32PktData);
            }

            while (adlerThreadData.IsAlive ||
                   crc16ThreadData.IsAlive ||
                   crc32ThreadData.IsAlive ||
                   crc64ThreadData.IsAlive ||
                   md5ThreadData.IsAlive ||
                   sha1ThreadData.IsAlive ||
                   sha256ThreadData.IsAlive ||
                   sha384ThreadData.IsAlive ||
                   sha512ThreadData.IsAlive ||
                   spamsumThreadData.IsAlive ||
                   f16ThreadData.IsAlive ||
                   f32ThreadData.IsAlive)
            {
            }

            List <ChecksumType> dataChecksums = new List <ChecksumType>();
            ChecksumType        chk;

            if (enabled.HasFlag(EnableChecksum.Adler32))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.adler32,
                    Value = adler32CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Crc16))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.crc16,
                    Value = crc16CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Crc32))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.crc32,
                    Value = crc32CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Crc64))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.crc64,
                    Value = crc64CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Md5))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.md5,
                    Value = md5CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Sha1))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.sha1,
                    Value = sha1CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Sha256))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.sha256,
                    Value = sha256CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Sha384))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.sha384,
                    Value = sha384CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Sha512))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.sha512,
                    Value = sha512CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.SpamSum))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.spamsum,
                    Value = ssctxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher16))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.fletcher16,
                    Value = f16CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher32))
            {
                chk = new ChecksumType
                {
                    type  = ChecksumTypeType.fletcher32,
                    Value = f32CtxData.End()
                };

                dataChecksums.Add(chk);
            }

            return(dataChecksums);
        }
        void DoWork()
        {
            IOpticalMediaImage opticalMediaImage = inputFormat as IOpticalMediaImage;
            bool formatHasTracks = false;

            if (opticalMediaImage != null)
            {
                try { formatHasTracks = opticalMediaImage.Tracks?.Count > 0; }
                catch { formatHasTracks = false; }
            }

            // Setup progress bars
            Application.Instance.Invoke(() =>
            {
                stkProgress.Visible   = true;
                prgProgress.MaxValue  = 1;
                prgProgress2.MaxValue = (int)(inputFormat.Info.Sectors / SECTORS_TO_READ);

                if (formatHasTracks && chkChecksumTracks.Checked == true && opticalMediaImage != null)
                {
                    prgProgress.MaxValue += opticalMediaImage.Tracks.Count;
                }
                else
                {
                    prgProgress.MaxValue = 2;
                    prgProgress2.Visible = false;
                    lblProgress2.Visible = false;
                }
            });

            EnableChecksum enabledChecksums = new EnableChecksum();

            if (chkAdler32.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Adler32;
            }
            if (chkCrc16.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Crc16;
            }
            if (chkCrc32.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Crc32;
            }
            if (chkCrc64.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Crc64;
            }
            if (chkMd5.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Md5;
            }
            if (chkSha1.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Sha1;
            }
            if (chkSha256.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Sha256;
            }
            if (chkSha384.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Sha384;
            }
            if (chkSha512.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Sha512;
            }
            if (chkSpamsum.Checked == true)
            {
                enabledChecksums |= EnableChecksum.SpamSum;
            }
            if (chkFletcher16.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Fletcher16;
            }
            if (chkFletcher32.Checked == true)
            {
                enabledChecksums |= EnableChecksum.Fletcher32;
            }

            Checksum mediaChecksum = null;

            TreeGridItemCollection trackHashes = new TreeGridItemCollection();
            TreeGridItemCollection mediaHashes = new TreeGridItemCollection();

            if (opticalMediaImage != null)
            {
                try
                {
                    Checksum trackChecksum = null;

                    if (chkChecksumMedia.Checked == true)
                    {
                        mediaChecksum = new Checksum(enabledChecksums);
                    }

                    ulong previousTrackEnd = 0;

                    foreach (Track currentTrack in opticalMediaImage.Tracks)
                    {
                        Application.Instance.Invoke(() =>
                        {
                            lblProgress.Text =
                                $"Hashing track {currentTrack.TrackSequence} of {opticalMediaImage.Tracks.Count}";
                            prgProgress.Value++;
                        });

                        if (currentTrack.TrackStartSector - previousTrackEnd != 0 && chkChecksumMedia.Checked == true)
                        {
                            for (ulong i = previousTrackEnd + 1; i < currentTrack.TrackStartSector; i++)
                            {
                                ulong sector = i;
                                Application.Instance.Invoke(() =>
                                {
                                    prgProgress2.Value = (int)(sector / SECTORS_TO_READ);
                                    lblProgress2.Text  = $"Hashing track-less sector {sector}";
                                });

                                byte[] hiddenSector = opticalMediaImage.ReadSector(i);

                                mediaChecksum?.Update(hiddenSector);
                            }
                        }

                        DicConsole.DebugWriteLine("Checksum command",
                                                  "Track {0} starts at sector {1} and ends at sector {2}",
                                                  currentTrack.TrackSequence, currentTrack.TrackStartSector,
                                                  currentTrack.TrackEndSector);

                        if (chkChecksumTracks.Checked == true)
                        {
                            trackChecksum = new Checksum(enabledChecksums);
                        }

                        ulong sectors     = currentTrack.TrackEndSector - currentTrack.TrackStartSector + 1;
                        ulong doneSectors = 0;

                        while (doneSectors < sectors)
                        {
                            if (cancel)
                            {
                                Application.Instance.Invoke(() =>
                                {
                                    btnClose.Visible = true;
                                    btnStart.Visible = false;
                                    btnStop.Visible  = false;
                                });
                                return;
                            }

                            byte[] sector;

                            if (sectors - doneSectors >= SECTORS_TO_READ)
                            {
                                sector = opticalMediaImage.ReadSectors(doneSectors, SECTORS_TO_READ,
                                                                       currentTrack.TrackSequence);

                                ulong doneSectorsToInvoke = doneSectors;
                                Application.Instance.Invoke(() =>
                                {
                                    prgProgress2.Value = (int)(doneSectorsToInvoke / SECTORS_TO_READ);
                                    lblProgress2.Text  =
                                        $"Hashings sectors {doneSectorsToInvoke} to {doneSectorsToInvoke + SECTORS_TO_READ} of track {currentTrack.TrackSequence}";
                                });

                                doneSectors += SECTORS_TO_READ;
                            }
                            else
                            {
                                sector = opticalMediaImage.ReadSectors(doneSectors, (uint)(sectors - doneSectors),
                                                                       currentTrack.TrackSequence);

                                ulong doneSectorsToInvoke = doneSectors;
                                Application.Instance.Invoke(() =>
                                {
                                    prgProgress2.Value = (int)(doneSectorsToInvoke / SECTORS_TO_READ);
                                    lblProgress2.Text  =
                                        $"Hashings sectors {doneSectorsToInvoke} to {doneSectorsToInvoke + (sectors - doneSectorsToInvoke)} of track {currentTrack.TrackSequence}";
                                });

                                doneSectors += sectors - doneSectors;
                            }

                            if (chkChecksumMedia.Checked == true)
                            {
                                mediaChecksum?.Update(sector);
                            }

                            if (chkChecksumTracks.Checked == true)
                            {
                                trackChecksum?.Update(sector);
                            }
                        }

                        if (chkChecksumTracks.Checked == true)
                        {
                            if (trackChecksum != null)
                            {
                                foreach (ChecksumType chk in trackChecksum.End())
                                {
                                    trackHashes.Add(new TreeGridItem
                                    {
                                        Values = new object[]
                                        {
                                            currentTrack.TrackSequence, chk.type, chk.Value
                                        }
                                    });
                                }
                            }
                        }

                        previousTrackEnd = currentTrack.TrackEndSector;
                    }

                    if (opticalMediaImage.Info.Sectors - previousTrackEnd != 0 && chkChecksumMedia.Checked == true)
                    {
                        for (ulong i = previousTrackEnd + 1; i < opticalMediaImage.Info.Sectors; i++)
                        {
                            ulong sector = i;
                            Application.Instance.Invoke(() =>
                            {
                                prgProgress2.Value = (int)(sector / SECTORS_TO_READ);
                                lblProgress2.Text  = $"Hashing track-less sector {sector}";
                            });

                            byte[] hiddenSector = opticalMediaImage.ReadSector(i);
                            mediaChecksum?.Update(hiddenSector);
                        }
                    }

                    if (chkChecksumMedia.Checked == true)
                    {
                        if (mediaChecksum != null)
                        {
                            foreach (ChecksumType chk in mediaChecksum.End())
                            {
                                mediaHashes.Add(new TreeGridItem {
                                    Values = new object[] { chk.type, chk.Value }
                                });
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    DicConsole.DebugWriteLine("Could not get tracks because {0}", ex.Message);
                    DicConsole.WriteLine("Unable to get separate tracks, not checksumming them");
                }
            }
            else
            {
                Application.Instance.Invoke(() => { stkProgress1.Visible = false; });
                mediaChecksum = new Checksum(enabledChecksums);

                ulong doneSectors = 0;

                while (doneSectors < inputFormat.Info.Sectors)
                {
                    if (cancel)
                    {
                        Application.Instance.Invoke(() =>
                        {
                            btnClose.Visible = true;
                            btnStart.Visible = false;
                            btnStop.Visible  = false;
                        });
                        return;
                    }

                    byte[] sector;

                    if (inputFormat.Info.Sectors - doneSectors >= SECTORS_TO_READ)
                    {
                        sector = inputFormat.ReadSectors(doneSectors, SECTORS_TO_READ);

                        ulong doneSectorsToInvoke = doneSectors;
                        Application.Instance.Invoke(() =>
                        {
                            prgProgress2.Value = (int)(doneSectorsToInvoke / SECTORS_TO_READ);
                            lblProgress2.Text  =
                                $"Hashings sectors {doneSectorsToInvoke} to {doneSectorsToInvoke + SECTORS_TO_READ}";
                        });
                        doneSectors += SECTORS_TO_READ;
                    }
                    else
                    {
                        sector = inputFormat.ReadSectors(doneSectors, (uint)(inputFormat.Info.Sectors - doneSectors));
                        ulong doneSectorsToInvoke = doneSectors;
                        Application.Instance.Invoke(() =>
                        {
                            prgProgress2.Value = (int)(doneSectorsToInvoke / SECTORS_TO_READ);
                            lblProgress2.Text  =
                                $"Hashings sectors {doneSectorsToInvoke} to {doneSectorsToInvoke + (inputFormat.Info.Sectors - doneSectorsToInvoke)}";
                        });
                        doneSectors += inputFormat.Info.Sectors - doneSectors;
                    }

                    mediaChecksum.Update(sector);
                }

                foreach (ChecksumType chk in mediaChecksum.End())
                {
                    mediaHashes.Add(new TreeGridItem {
                        Values = new object[] { chk.type, chk.Value }
                    });
                }
            }

            if (chkChecksumTracks.Checked == true)
            {
                Application.Instance.Invoke(() =>
                {
                    grpTrackChecksums.Text    = "Track checksums:";
                    stkTrackChecksums.Visible = true;

                    treeTrackChecksums.Columns.Add(new GridColumn
                    {
                        HeaderText = "Track", DataCell = new TextBoxCell(0)
                    });
                    treeTrackChecksums.Columns.Add(new GridColumn
                    {
                        HeaderText = "Algorithm", DataCell = new TextBoxCell(1)
                    });
                    treeTrackChecksums.Columns.Add(new GridColumn {
                        HeaderText = "Hash", DataCell = new TextBoxCell(2)
                    });

                    treeTrackChecksums.AllowMultipleSelection = false;
                    treeTrackChecksums.ShowHeader             = true;
                    treeTrackChecksums.DataStore = trackHashes;
                });
            }

            if (chkChecksumMedia.Checked == true)
            {
                Application.Instance.Invoke(() =>
                {
                    grpMediaChecksums.Text    = "Media checksums:";
                    stkMediaChecksums.Visible = true;

                    treeMediaChecksums.Columns.Add(new GridColumn
                    {
                        HeaderText = "Algorithm", DataCell = new TextBoxCell(0)
                    });
                    treeMediaChecksums.Columns.Add(new GridColumn {
                        HeaderText = "Hash", DataCell = new TextBoxCell(1)
                    });

                    treeMediaChecksums.AllowMultipleSelection = false;
                    treeMediaChecksums.ShowHeader             = true;
                    treeMediaChecksums.DataStore = mediaHashes;
                });
            }

            Statistics.AddCommand("checksum");

            Application.Instance.Invoke(() =>
            {
                stkOptions.Visible  = false;
                stkResults.Visible  = true;
                stkProgress.Visible = false;
                btnStart.Visible    = false;
                btnStop.Visible     = false;
                btnClose.Visible    = true;
            });
        }
Пример #8
0
        internal static List <ChecksumType> GetChecksums(byte[] data, EnableChecksum enabled = EnableChecksum.All)
        {
            IChecksum adler32CtxData = null;
            IChecksum crc16CtxData   = null;
            IChecksum crc32CtxData   = null;
            IChecksum crc64CtxData   = null;
            IChecksum md5CtxData     = null;

            #if !NETSTANDARD2_0
            IChecksum ripemd160CtxData = null;
            #endif
            IChecksum sha1CtxData   = null;
            IChecksum sha256CtxData = null;
            IChecksum sha384CtxData = null;
            IChecksum sha512CtxData = null;
            IChecksum ssctxData     = null;
            IChecksum f16CtxData    = null;
            IChecksum f32CtxData    = null;

            Thread adlerThreadData = new Thread(UpdateHash);
            Thread crc16ThreadData = new Thread(UpdateHash);
            Thread crc32ThreadData = new Thread(UpdateHash);
            Thread crc64ThreadData = new Thread(UpdateHash);
            Thread md5ThreadData   = new Thread(UpdateHash);
            #if !NETSTANDARD2_0
            Thread ripemd160ThreadData = new Thread(UpdateHash);
            #endif
            Thread sha1ThreadData    = new Thread(UpdateHash);
            Thread sha256ThreadData  = new Thread(UpdateHash);
            Thread sha384ThreadData  = new Thread(UpdateHash);
            Thread sha512ThreadData  = new Thread(UpdateHash);
            Thread spamsumThreadData = new Thread(UpdateHash);
            Thread f16ThreadData     = new Thread(UpdateHash);
            Thread f32ThreadData     = new Thread(UpdateHash);

            if (enabled.HasFlag(EnableChecksum.Adler32))
            {
                adler32CtxData = new Adler32Context();
                HashPacket adlerPktData = new HashPacket {
                    Context = adler32CtxData, Data = data
                };
                adlerThreadData.Start(adlerPktData);
            }

            if (enabled.HasFlag(EnableChecksum.Crc16))
            {
                crc16CtxData = new Crc16Context();
                HashPacket crc16PktData = new HashPacket {
                    Context = crc16CtxData, Data = data
                };
                crc16ThreadData.Start(crc16PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Crc32))
            {
                crc32CtxData = new Crc32Context();
                HashPacket crc32PktData = new HashPacket {
                    Context = crc32CtxData, Data = data
                };
                crc32ThreadData.Start(crc32PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Crc64))
            {
                crc64CtxData = new Crc64Context();
                HashPacket crc64PktData = new HashPacket {
                    Context = crc64CtxData, Data = data
                };
                crc64ThreadData.Start(crc64PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Md5))
            {
                md5CtxData = new Md5Context();
                HashPacket md5PktData = new HashPacket {
                    Context = md5CtxData, Data = data
                };
                md5ThreadData.Start(md5PktData);
            }

            #if !NETSTANDARD2_0
            if (enabled.HasFlag(EnableChecksum.Ripemd160))
            {
                ripemd160CtxData = new Ripemd160Context();
                HashPacket ripemd160PktData = new HashPacket {
                    Context = ripemd160CtxData, Data = data
                };
                ripemd160ThreadData.Start(ripemd160PktData);
            }
            #endif

            if (enabled.HasFlag(EnableChecksum.Sha1))
            {
                sha1CtxData = new Sha1Context();
                HashPacket sha1PktData = new HashPacket {
                    Context = sha1CtxData, Data = data
                };
                sha1ThreadData.Start(sha1PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Sha256))
            {
                sha256CtxData = new Sha256Context();
                HashPacket sha256PktData = new HashPacket {
                    Context = sha256CtxData, Data = data
                };
                sha256ThreadData.Start(sha256PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Sha384))
            {
                sha384CtxData = new Sha384Context();
                HashPacket sha384PktData = new HashPacket {
                    Context = sha384CtxData, Data = data
                };
                sha384ThreadData.Start(sha384PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Sha512))
            {
                sha512CtxData = new Sha512Context();
                HashPacket sha512PktData = new HashPacket {
                    Context = sha512CtxData, Data = data
                };
                sha512ThreadData.Start(sha512PktData);
            }

            if (enabled.HasFlag(EnableChecksum.SpamSum))
            {
                ssctxData = new SpamSumContext();
                HashPacket spamsumPktData = new HashPacket {
                    Context = ssctxData, Data = data
                };
                spamsumThreadData.Start(spamsumPktData);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher16))
            {
                f16CtxData = new Fletcher16Context();
                HashPacket f16PktData = new HashPacket {
                    Context = f16CtxData, Data = data
                };
                f16ThreadData.Start(f16PktData);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher32))
            {
                f32CtxData = new Fletcher32Context();
                HashPacket f32PktData = new HashPacket {
                    Context = f32CtxData, Data = data
                };
                f32ThreadData.Start(f32PktData);
            }

            while (adlerThreadData.IsAlive || crc16ThreadData.IsAlive || crc32ThreadData.IsAlive ||
                   crc64ThreadData.IsAlive || md5ThreadData.IsAlive ||
                  #if !NETSTANDARD2_0
                   ripemd160ThreadData.IsAlive ||
                  #endif
                   sha1ThreadData.IsAlive || sha256ThreadData.IsAlive || sha384ThreadData.IsAlive ||
                   sha512ThreadData.IsAlive || spamsumThreadData.IsAlive || f16ThreadData.IsAlive ||
                   f32ThreadData.IsAlive)
            {
            }

            List <ChecksumType> dataChecksums = new List <ChecksumType>();
            ChecksumType        chk;

            if (enabled.HasFlag(EnableChecksum.Adler32))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.adler32, Value = adler32CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Crc16))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.crc16, Value = crc16CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Crc32))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.crc32, Value = crc32CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Crc64))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.crc64, Value = crc64CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Md5))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.md5, Value = md5CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            #if !NETSTANDARD2_0
            if (enabled.HasFlag(EnableChecksum.Ripemd160))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.ripemd160, Value = ripemd160CtxData.End()
                };
                dataChecksums.Add(chk);
            }
            #endif

            if (enabled.HasFlag(EnableChecksum.Sha1))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.sha1, Value = sha1CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Sha256))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.sha256, Value = sha256CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Sha384))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.sha384, Value = sha384CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Sha512))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.sha512, Value = sha512CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.SpamSum))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.spamsum, Value = ssctxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher16))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.fletcher16, Value = f16CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher32))
            {
                chk = new ChecksumType {
                    type = ChecksumTypeType.fletcher32, Value = f32CtxData.End()
                };
                dataChecksums.Add(chk);
            }

            return(dataChecksums);
        }
Пример #9
0
        public Checksum(EnableChecksum enabled = EnableChecksum.All)
        {
            this.enabled = enabled;

            if (enabled.HasFlag(EnableChecksum.Adler32))
            {
                adler32Ctx = new Adler32Context();
                adlerPkt   = new HashPacket {
                    Context = adler32Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Crc16))
            {
                crc16Ctx = new Crc16Context();
                crc16Pkt = new HashPacket {
                    Context = crc16Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Crc32))
            {
                crc32Ctx = new Crc32Context();
                crc32Pkt = new HashPacket {
                    Context = crc32Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Crc64))
            {
                crc64Ctx = new Crc64Context();
                crc64Pkt = new HashPacket {
                    Context = crc64Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Md5))
            {
                md5Ctx = new Md5Context();
                md5Pkt = new HashPacket {
                    Context = md5Ctx
                };
            }

            #if !NETSTANDARD2_0
            if (enabled.HasFlag(EnableChecksum.Ripemd160))
            {
                ripemd160Ctx = new Ripemd160Context();
                ripemd160Pkt = new HashPacket {
                    Context = ripemd160Ctx
                };
            }
            #endif

            if (enabled.HasFlag(EnableChecksum.Sha1))
            {
                sha1Ctx = new Sha1Context();
                sha1Pkt = new HashPacket {
                    Context = sha1Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Sha256))
            {
                sha256Ctx = new Sha256Context();
                sha256Pkt = new HashPacket {
                    Context = sha256Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Sha384))
            {
                sha384Ctx = new Sha384Context();
                sha384Pkt = new HashPacket {
                    Context = sha384Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Sha512))
            {
                sha512Ctx = new Sha512Context();
                sha512Pkt = new HashPacket {
                    Context = sha512Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.SpamSum))
            {
                ssctx      = new SpamSumContext();
                spamsumPkt = new HashPacket {
                    Context = ssctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher16))
            {
                f16Ctx = new Fletcher16Context();
                f16Pkt = new HashPacket {
                    Context = f16Ctx
                };
            }

            if (enabled.HasFlag(EnableChecksum.Fletcher32))
            {
                f32Ctx = new Fletcher32Context();
                f32Pkt = new HashPacket {
                    Context = f32Ctx
                };
            }

            adlerThread = new Thread(UpdateHash);
            crc16Thread = new Thread(UpdateHash);
            crc32Thread = new Thread(UpdateHash);
            crc64Thread = new Thread(UpdateHash);
            md5Thread   = new Thread(UpdateHash);
            #if !NETSTANDARD2_0
            ripemd160Thread = new Thread(UpdateHash);
            #endif
            sha1Thread    = new Thread(UpdateHash);
            sha256Thread  = new Thread(UpdateHash);
            sha384Thread  = new Thread(UpdateHash);
            sha512Thread  = new Thread(UpdateHash);
            spamsumThread = new Thread(UpdateHash);
            f16Thread     = new Thread(UpdateHash);
            f32Thread     = new Thread(UpdateHash);
        }
Пример #10
0
        internal static void DoChecksum(ChecksumOptions options)
        {
            DicConsole.DebugWriteLine("Checksum command", "--debug={0}", options.Debug);
            DicConsole.DebugWriteLine("Checksum command", "--verbose={0}", options.Verbose);
            DicConsole.DebugWriteLine("Checksum command", "--separated-tracks={0}", options.SeparatedTracks);
            DicConsole.DebugWriteLine("Checksum command", "--whole-disc={0}", options.WholeDisc);
            DicConsole.DebugWriteLine("Checksum command", "--input={0}", options.InputFile);
            DicConsole.DebugWriteLine("Checksum command", "--adler32={0}", options.DoAdler32);
            DicConsole.DebugWriteLine("Checksum command", "--crc16={0}", options.DoCrc16);
            DicConsole.DebugWriteLine("Checksum command", "--crc32={0}", options.DoCrc32);
            DicConsole.DebugWriteLine("Checksum command", "--crc64={0}", options.DoCrc64);
            DicConsole.DebugWriteLine("Checksum command", "--md5={0}", options.DoMd5);
            DicConsole.DebugWriteLine("Checksum command", "--ripemd160={0}", options.DoRipemd160);
            DicConsole.DebugWriteLine("Checksum command", "--sha1={0}", options.DoSha1);
            DicConsole.DebugWriteLine("Checksum command", "--sha256={0}", options.DoSha256);
            DicConsole.DebugWriteLine("Checksum command", "--sha384={0}", options.DoSha384);
            DicConsole.DebugWriteLine("Checksum command", "--sha512={0}", options.DoSha512);
            DicConsole.DebugWriteLine("Checksum command", "--spamsum={0}", options.DoSpamSum);
            DicConsole.DebugWriteLine("Checksum command", "--fletcher16={0}", options.DoFletcher16);
            DicConsole.DebugWriteLine("Checksum command", "--fletcher32={0}", options.DoFletcher32);

            FiltersList filtersList = new FiltersList();
            IFilter     inputFilter = filtersList.GetFilter(options.InputFile);

            if (inputFilter == null)
            {
                DicConsole.ErrorWriteLine("Cannot open specified file.");
                return;
            }

            IMediaImage inputFormat = ImageFormat.Detect(inputFilter);

            if (inputFormat == null)
            {
                DicConsole.ErrorWriteLine("Unable to recognize image format, not checksumming");
                return;
            }

            inputFormat.Open(inputFilter);
            Core.Statistics.AddMediaFormat(inputFormat.Format);
            Core.Statistics.AddMedia(inputFormat.Info.MediaType, false);
            Core.Statistics.AddFilter(inputFilter.Name);
            EnableChecksum enabledChecksums = new EnableChecksum();

            if (options.DoAdler32)
            {
                enabledChecksums |= EnableChecksum.Adler32;
            }
            if (options.DoCrc16)
            {
                enabledChecksums |= EnableChecksum.Crc16;
            }
            if (options.DoCrc32)
            {
                enabledChecksums |= EnableChecksum.Crc32;
            }
            if (options.DoCrc64)
            {
                enabledChecksums |= EnableChecksum.Crc64;
            }
            if (options.DoMd5)
            {
                enabledChecksums |= EnableChecksum.Md5;
            }
            if (options.DoRipemd160)
            {
                enabledChecksums |= EnableChecksum.Ripemd160;
            }
            if (options.DoSha1)
            {
                enabledChecksums |= EnableChecksum.Sha1;
            }
            if (options.DoSha256)
            {
                enabledChecksums |= EnableChecksum.Sha256;
            }
            if (options.DoSha384)
            {
                enabledChecksums |= EnableChecksum.Sha384;
            }
            if (options.DoSha512)
            {
                enabledChecksums |= EnableChecksum.Sha512;
            }
            if (options.DoSpamSum)
            {
                enabledChecksums |= EnableChecksum.SpamSum;
            }
            if (options.DoFletcher16)
            {
                enabledChecksums |= EnableChecksum.Fletcher16;
            }
            if (options.DoFletcher32)
            {
                enabledChecksums |= EnableChecksum.Fletcher32;
            }

            Core.Checksum mediaChecksum = null;

            if (inputFormat.Info.HasPartitions)
            {
                try
                {
                    Core.Checksum trackChecksum = null;

                    if (options.WholeDisc)
                    {
                        mediaChecksum = new Core.Checksum(enabledChecksums);
                    }

                    ulong previousTrackEnd = 0;

                    List <Track> inputTracks = inputFormat.Tracks;
                    foreach (Track currentTrack in inputTracks)
                    {
                        if (currentTrack.TrackStartSector - previousTrackEnd != 0 && options.WholeDisc)
                        {
                            for (ulong i = previousTrackEnd + 1; i < currentTrack.TrackStartSector; i++)
                            {
                                DicConsole.Write("\rHashing track-less sector {0}", i);

                                byte[] hiddenSector = inputFormat.ReadSector(i);

                                mediaChecksum?.Update(hiddenSector);
                            }
                        }

                        DicConsole.DebugWriteLine("Checksum command",
                                                  "Track {0} starts at sector {1} and ends at sector {2}",
                                                  currentTrack.TrackSequence, currentTrack.TrackStartSector,
                                                  currentTrack.TrackEndSector);

                        if (options.SeparatedTracks)
                        {
                            trackChecksum = new Core.Checksum(enabledChecksums);
                        }

                        ulong sectors     = currentTrack.TrackEndSector - currentTrack.TrackStartSector + 1;
                        ulong doneSectors = 0;
                        DicConsole.WriteLine("Track {0} has {1} sectors", currentTrack.TrackSequence, sectors);

                        while (doneSectors < sectors)
                        {
                            byte[] sector;

                            if (sectors - doneSectors >= SECTORS_TO_READ)
                            {
                                sector = inputFormat.ReadSectors(doneSectors, SECTORS_TO_READ,
                                                                 currentTrack.TrackSequence);
                                DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
                                                 currentTrack.TrackSequence, doneSectors + SECTORS_TO_READ);
                                doneSectors += SECTORS_TO_READ;
                            }
                            else
                            {
                                sector = inputFormat.ReadSectors(doneSectors, (uint)(sectors - doneSectors),
                                                                 currentTrack.TrackSequence);
                                DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
                                                 currentTrack.TrackSequence, doneSectors + (sectors - doneSectors));
                                doneSectors += sectors - doneSectors;
                            }

                            if (options.WholeDisc)
                            {
                                mediaChecksum?.Update(sector);
                            }

                            if (options.SeparatedTracks)
                            {
                                trackChecksum?.Update(sector);
                            }
                        }

                        DicConsole.WriteLine();

                        if (options.SeparatedTracks)
                        {
                            if (trackChecksum != null)
                            {
                                foreach (ChecksumType chk in trackChecksum.End())
                                {
                                    DicConsole.WriteLine("Track {0}'s {1}: {2}", currentTrack.TrackSequence, chk.type,
                                                         chk.Value);
                                }
                            }
                        }

                        previousTrackEnd = currentTrack.TrackEndSector;
                    }

                    if (inputFormat.Info.Sectors - previousTrackEnd != 0 && options.WholeDisc)
                    {
                        for (ulong i = previousTrackEnd + 1; i < inputFormat.Info.Sectors; i++)
                        {
                            DicConsole.Write("\rHashing track-less sector {0}", i);

                            byte[] hiddenSector = inputFormat.ReadSector(i);
                            mediaChecksum?.Update(hiddenSector);
                        }
                    }

                    if (options.WholeDisc)
                    {
                        if (mediaChecksum != null)
                        {
                            foreach (ChecksumType chk in mediaChecksum.End())
                            {
                                DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (options.Debug)
                    {
                        DicConsole.DebugWriteLine("Could not get tracks because {0}", ex.Message);
                    }
                    else
                    {
                        DicConsole.WriteLine("Unable to get separate tracks, not checksumming them");
                    }
                }
            }
            else
            {
                mediaChecksum = new Core.Checksum(enabledChecksums);

                ulong sectors = inputFormat.Info.Sectors;
                DicConsole.WriteLine("Sectors {0}", sectors);
                ulong doneSectors = 0;

                while (doneSectors < sectors)
                {
                    byte[] sector;

                    if (sectors - doneSectors >= SECTORS_TO_READ)
                    {
                        sector = inputFormat.ReadSectors(doneSectors, SECTORS_TO_READ);
                        DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors, doneSectors + SECTORS_TO_READ);
                        doneSectors += SECTORS_TO_READ;
                    }
                    else
                    {
                        sector = inputFormat.ReadSectors(doneSectors, (uint)(sectors - doneSectors));
                        DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors,
                                         doneSectors + (sectors - doneSectors));
                        doneSectors += sectors - doneSectors;
                    }

                    mediaChecksum.Update(sector);
                }

                DicConsole.WriteLine();

                foreach (ChecksumType chk in mediaChecksum.End())
                {
                    DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
                }
            }

            Core.Statistics.AddCommand("checksum");
        }
Пример #11
0
        /// <summary>
        ///  Generate barcode and save on server
        /// </summary>
        /// <param name="name">The image name.</param>
        /// <param name="text">Barcode's text.</param>
        /// <param name="type">The barcode type.</param>
        /// <param name="format">The image format.</param>
        /// <param name="codeLocation">Property of the barcode.</param>
        /// <param name="grUnit">Measurement of barcode properties.</param>
        /// <param name="autoSize">Sets if barcode size will be updated automatically.</param>
        /// <param name="barHeight">Height of the bar.</param>
        /// <param name="imageHeight">Height of the image.</param>
        /// <param name="imageWidth">Width of the image.</param>
        /// <param name="imageQuality">Determines quality of the barcode image.</param>
        /// <param name="rotAngle">Angle of barcode orientation.</param>
        /// <param name="topMargin">Top margin.</param>
        /// <param name="bottomMargin">Bottom margin.</param>
        /// <param name="leftMargin">Left margin.</param>
        /// <param name="rightMargin">Right margin.</param>
        /// <param name="enableChecksum">Sets if checksum will be generated.</param>
        /// <param name="storage">Image's storage.</param>
        /// <param name="folder">Image's folder.</param>
        /// <param name="resolutionX">Horizontal resolution in DPI. Default is 96</param>
        /// <param name="resolutionY">Vertical resolution in DPI. Default is 96</param>
        /// <param name="dimensionX">Smallest width of barcode unit (bar or space). Default is 0.7</param>
        /// <param name="dimensionY">Smallest height of barcode unit (for 2D barcodes). Default is 2</param>
        public void GenerateBarCodeAndSaveOnServer(string name, string text, BarCodeType type,
                                                   float barHeight, float imageHeight, float imageWidth, float rotAngle,
                                                   float topMargin, float bottomMargin, float leftMargin, float rightMargin, string storage,
                                                   string folder,
                                                   BarCodeImageFormat format = BarCodeImageFormat.PNG, CodeLocation codeLocation = CodeLocation.Below, GrUnit grUnit = GrUnit.MM,
                                                   bool autoSize             = true, ImageQuality imageQuality = ImageQuality.Default, EnableChecksum enableChecksum = EnableChecksum.No,
                                                   float resolutionX         = 96, float resolutionY           = 96, double dimensionX = 0.7, float dimensionY = 2)
        {
            // PUT  barcode/{name}/generate?appSid={appSid}&text={text}&type={type}&format={format}&resolutionX={resolutionX}&resolutionY={resolutionY}&dimensionX={dimensionX}&dimensionY={dimensionY}&codeLocation={codeLocation}&grUnit={grUnit}&autoSize={autoSize}&barHeight={barHeight}&imageHeight={imageHeight}&imageWidth={imageWidth}&imageQuality={imageQuality}&rotAngle={rotAngle}&topMargin={topMargin}&bottomMargin={bottomMargin}&leftMargin={leftMargin}&rightMargin={rightMargin}&enableChecksum={enableChecksum}&storage={storage}&folder={folder}

            string apiUrl = string.Format(@"barcode/{0}/generate?text={1}&type={2}&format={3}&resolutionX={4}&resolutionY={5}&dimensionX={6}&dimensionY={7}&codeLocation={8}&grUnit={9}&autoSize={10}&barHeight={11}&imageHeight={12}&imageWidth={13}&imageQuality={14}&rotAngle={15}&topMargin={16}&bottomMargin={17}&leftMargin={18}&rightMargin={19}&enableChecksum={20}&storage={21}&folder={22}",
                                          name, text, type, format, resolutionX, resolutionY, dimensionX, dimensionY, codeLocation, grUnit, autoSize, barHeight,
                                          imageHeight, imageWidth, imageQuality, rotAngle, topMargin, bottomMargin, leftMargin, rightMargin, enableChecksum,
                                          storage, folder);

            ServiceController.Put(apiUrl, AppSid, AppKey);
        }
Пример #12
0
        public override int Invoke(IEnumerable <string> arguments)
        {
            List <string> extra = Options.Parse(arguments);

            if (showHelp)
            {
                Options.WriteOptionDescriptions(CommandSet.Out);
                return((int)ErrorNumber.HelpRequested);
            }

            MainClass.PrintCopyright();
            if (MainClass.Debug)
            {
                DicConsole.DebugWriteLineEvent += System.Console.Error.WriteLine;
            }
            if (MainClass.Verbose)
            {
                DicConsole.VerboseWriteLineEvent += System.Console.WriteLine;
            }
            Statistics.AddCommand("checksum");

            if (extra.Count > 1)
            {
                DicConsole.ErrorWriteLine("Too many arguments.");
                return((int)ErrorNumber.UnexpectedArgumentCount);
            }

            if (extra.Count == 0)
            {
                DicConsole.ErrorWriteLine("Missing input image.");
                return((int)ErrorNumber.MissingArgument);
            }

            inputFile = extra[0];

            DicConsole.DebugWriteLine("Checksum command", "--adler32={0}", doAdler32);
            DicConsole.DebugWriteLine("Checksum command", "--crc16={0}", doCrc16);
            DicConsole.DebugWriteLine("Checksum command", "--crc32={0}", doCrc32);
            DicConsole.DebugWriteLine("Checksum command", "--crc64={0}", doCrc64);
            DicConsole.DebugWriteLine("Checksum command", "--debug={0}", MainClass.Debug);
            DicConsole.DebugWriteLine("Checksum command", "--fletcher16={0}", doFletcher16);
            DicConsole.DebugWriteLine("Checksum command", "--fletcher32={0}", doFletcher32);
            DicConsole.DebugWriteLine("Checksum command", "--input={0}", inputFile);
            DicConsole.DebugWriteLine("Checksum command", "--md5={0}", doMd5);
            DicConsole.DebugWriteLine("Checksum command", "--separated-tracks={0}", separatedTracks);
            DicConsole.DebugWriteLine("Checksum command", "--sha1={0}", doSha1);
            DicConsole.DebugWriteLine("Checksum command", "--sha256={0}", doSha256);
            DicConsole.DebugWriteLine("Checksum command", "--sha384={0}", doSha384);
            DicConsole.DebugWriteLine("Checksum command", "--sha512={0}", doSha512);
            DicConsole.DebugWriteLine("Checksum command", "--spamsum={0}", doSpamSum);
            DicConsole.DebugWriteLine("Checksum command", "--verbose={0}", MainClass.Verbose);
            DicConsole.DebugWriteLine("Checksum command", "--whole-disc={0}", wholeDisc);

            FiltersList filtersList = new FiltersList();
            IFilter     inputFilter = filtersList.GetFilter(inputFile);

            if (inputFilter == null)
            {
                DicConsole.ErrorWriteLine("Cannot open specified file.");
                return((int)ErrorNumber.CannotOpenFile);
            }

            IMediaImage inputFormat = ImageFormat.Detect(inputFilter);

            if (inputFormat == null)
            {
                DicConsole.ErrorWriteLine("Unable to recognize image format, not checksumming");
                return((int)ErrorNumber.UnrecognizedFormat);
            }

            inputFormat.Open(inputFilter);
            Statistics.AddMediaFormat(inputFormat.Format);
            Statistics.AddMedia(inputFormat.Info.MediaType, false);
            Statistics.AddFilter(inputFilter.Name);
            EnableChecksum enabledChecksums = new EnableChecksum();

            if (doAdler32)
            {
                enabledChecksums |= EnableChecksum.Adler32;
            }
            if (doCrc16)
            {
                enabledChecksums |= EnableChecksum.Crc16;
            }
            if (doCrc32)
            {
                enabledChecksums |= EnableChecksum.Crc32;
            }
            if (doCrc64)
            {
                enabledChecksums |= EnableChecksum.Crc64;
            }
            if (doMd5)
            {
                enabledChecksums |= EnableChecksum.Md5;
            }
            if (doSha1)
            {
                enabledChecksums |= EnableChecksum.Sha1;
            }
            if (doSha256)
            {
                enabledChecksums |= EnableChecksum.Sha256;
            }
            if (doSha384)
            {
                enabledChecksums |= EnableChecksum.Sha384;
            }
            if (doSha512)
            {
                enabledChecksums |= EnableChecksum.Sha512;
            }
            if (doSpamSum)
            {
                enabledChecksums |= EnableChecksum.SpamSum;
            }
            if (doFletcher16)
            {
                enabledChecksums |= EnableChecksum.Fletcher16;
            }
            if (doFletcher32)
            {
                enabledChecksums |= EnableChecksum.Fletcher32;
            }

            Checksum mediaChecksum = null;

            switch (inputFormat)
            {
            case IOpticalMediaImage opticalInput when opticalInput.Tracks != null:
                try
                {
                    Checksum trackChecksum = null;

                    if (wholeDisc)
                    {
                        mediaChecksum = new Checksum(enabledChecksums);
                    }

                    ulong previousTrackEnd = 0;

                    List <Track> inputTracks = opticalInput.Tracks;
                    foreach (Track currentTrack in inputTracks)
                    {
                        if (currentTrack.TrackStartSector - previousTrackEnd != 0 && wholeDisc)
                        {
                            for (ulong i = previousTrackEnd + 1; i < currentTrack.TrackStartSector; i++)
                            {
                                DicConsole.Write("\rHashing track-less sector {0}", i);

                                byte[] hiddenSector = inputFormat.ReadSector(i);

                                mediaChecksum?.Update(hiddenSector);
                            }
                        }

                        DicConsole.DebugWriteLine("Checksum command",
                                                  "Track {0} starts at sector {1} and ends at sector {2}",
                                                  currentTrack.TrackSequence, currentTrack.TrackStartSector,
                                                  currentTrack.TrackEndSector);

                        if (separatedTracks)
                        {
                            trackChecksum = new Checksum(enabledChecksums);
                        }

                        ulong sectors     = currentTrack.TrackEndSector - currentTrack.TrackStartSector + 1;
                        ulong doneSectors = 0;
                        DicConsole.WriteLine("Track {0} has {1} sectors", currentTrack.TrackSequence, sectors);

                        while (doneSectors < sectors)
                        {
                            byte[] sector;

                            if (sectors - doneSectors >= SECTORS_TO_READ)
                            {
                                sector = opticalInput.ReadSectors(doneSectors, SECTORS_TO_READ,
                                                                  currentTrack.TrackSequence);
                                DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
                                                 currentTrack.TrackSequence, doneSectors + SECTORS_TO_READ);
                                doneSectors += SECTORS_TO_READ;
                            }
                            else
                            {
                                sector = opticalInput.ReadSectors(doneSectors, (uint)(sectors - doneSectors),
                                                                  currentTrack.TrackSequence);
                                DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
                                                 currentTrack.TrackSequence, doneSectors + (sectors - doneSectors));
                                doneSectors += sectors - doneSectors;
                            }

                            if (wholeDisc)
                            {
                                mediaChecksum?.Update(sector);
                            }

                            if (separatedTracks)
                            {
                                trackChecksum?.Update(sector);
                            }
                        }

                        DicConsole.WriteLine();

                        if (separatedTracks)
                        {
                            if (trackChecksum != null)
                            {
                                foreach (ChecksumType chk in trackChecksum.End())
                                {
                                    DicConsole.WriteLine("Track {0}'s {1}: {2}", currentTrack.TrackSequence,
                                                         chk.type, chk.Value);
                                }
                            }
                        }

                        previousTrackEnd = currentTrack.TrackEndSector;
                    }

                    if (opticalInput.Info.Sectors - previousTrackEnd != 0 && wholeDisc)
                    {
                        for (ulong i = previousTrackEnd + 1; i < opticalInput.Info.Sectors; i++)
                        {
                            DicConsole.Write("\rHashing track-less sector {0}", i);

                            byte[] hiddenSector = inputFormat.ReadSector(i);
                            mediaChecksum?.Update(hiddenSector);
                        }
                    }

                    if (wholeDisc)
                    {
                        if (mediaChecksum != null)
                        {
                            foreach (ChecksumType chk in mediaChecksum.End())
                            {
                                DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (MainClass.Debug)
                    {
                        DicConsole.DebugWriteLine("Could not get tracks because {0}", ex.Message);
                    }
                    else
                    {
                        DicConsole.WriteLine("Unable to get separate tracks, not checksumming them");
                    }
                }

                break;

            case ITapeImage tapeImage when tapeImage.IsTape && tapeImage.Files?.Count > 0:
            {
                Checksum trackChecksum = null;

                if (wholeDisc)
                {
                    mediaChecksum = new Checksum(enabledChecksums);
                }

                ulong previousTrackEnd = 0;

                foreach (TapeFile currentFile in tapeImage.Files)
                {
                    if (currentFile.FirstBlock - previousTrackEnd != 0 && wholeDisc)
                    {
                        for (ulong i = previousTrackEnd + 1; i < currentFile.FirstBlock; i++)
                        {
                            DicConsole.Write("\rHashing file-less block {0}", i);

                            byte[] hiddenSector = inputFormat.ReadSector(i);

                            mediaChecksum?.Update(hiddenSector);
                        }
                    }

                    DicConsole.DebugWriteLine("Checksum command",
                                              "Track {0} starts at sector {1} and ends at block {2}",
                                              currentFile.File, currentFile.FirstBlock, currentFile.LastBlock);

                    if (separatedTracks)
                    {
                        trackChecksum = new Checksum(enabledChecksums);
                    }

                    ulong sectors     = currentFile.LastBlock - currentFile.FirstBlock + 1;
                    ulong doneSectors = 0;
                    DicConsole.WriteLine("File {0} has {1} sectors", currentFile.File, sectors);

                    while (doneSectors < sectors)
                    {
                        byte[] sector;

                        if (sectors - doneSectors >= SECTORS_TO_READ)
                        {
                            sector = tapeImage.ReadSectors(doneSectors + currentFile.FirstBlock, SECTORS_TO_READ);
                            DicConsole.Write("\rHashings blocks {0} to {2} of file {1}", doneSectors,
                                             currentFile.File, doneSectors + SECTORS_TO_READ);
                            doneSectors += SECTORS_TO_READ;
                        }
                        else
                        {
                            sector = tapeImage.ReadSectors(doneSectors + currentFile.FirstBlock,
                                                           (uint)(sectors - doneSectors));
                            DicConsole.Write("\rHashings blocks {0} to {2} of file {1}", doneSectors,
                                             currentFile.File, doneSectors + (sectors - doneSectors));
                            doneSectors += sectors - doneSectors;
                        }

                        if (wholeDisc)
                        {
                            mediaChecksum?.Update(sector);
                        }

                        if (separatedTracks)
                        {
                            trackChecksum?.Update(sector);
                        }
                    }

                    DicConsole.WriteLine();

                    if (separatedTracks)
                    {
                        if (trackChecksum != null)
                        {
                            foreach (ChecksumType chk in trackChecksum.End())
                            {
                                DicConsole.WriteLine("File {0}'s {1}: {2}", currentFile.File, chk.type, chk.Value);
                            }
                        }
                    }

                    previousTrackEnd = currentFile.LastBlock;
                }

                if (tapeImage.Info.Sectors - previousTrackEnd != 0 && wholeDisc)
                {
                    for (ulong i = previousTrackEnd + 1; i < tapeImage.Info.Sectors; i++)
                    {
                        DicConsole.Write("\rHashing file-less sector {0}", i);

                        byte[] hiddenSector = inputFormat.ReadSector(i);
                        mediaChecksum?.Update(hiddenSector);
                    }
                }

                if (wholeDisc)
                {
                    if (mediaChecksum != null)
                    {
                        foreach (ChecksumType chk in mediaChecksum.End())
                        {
                            DicConsole.WriteLine("Tape's {0}: {1}", chk.type, chk.Value);
                        }
                    }
                }
                break;
            }

            default:
            {
                mediaChecksum = new Checksum(enabledChecksums);

                ulong sectors = inputFormat.Info.Sectors;
                DicConsole.WriteLine("Sectors {0}", sectors);
                ulong doneSectors = 0;

                while (doneSectors < sectors)
                {
                    byte[] sector;

                    if (sectors - doneSectors >= SECTORS_TO_READ)
                    {
                        sector = inputFormat.ReadSectors(doneSectors, SECTORS_TO_READ);
                        DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors,
                                         doneSectors + SECTORS_TO_READ);
                        doneSectors += SECTORS_TO_READ;
                    }
                    else
                    {
                        sector = inputFormat.ReadSectors(doneSectors, (uint)(sectors - doneSectors));
                        DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors,
                                         doneSectors + (sectors - doneSectors));
                        doneSectors += sectors - doneSectors;
                    }

                    mediaChecksum.Update(sector);
                }

                DicConsole.WriteLine();

                foreach (ChecksumType chk in mediaChecksum.End())
                {
                    DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
                }
                break;
            }
            }

            return((int)ErrorNumber.NoError);
        }