// ----------------------------------------------------------------------- // // Copyright 2011-2012 GRNET S.A. All rights reserved. // // Redistribution and use in source and binary forms, with or // without modification, are permitted provided that the following // conditions are met: // // 1. Redistributions of source code must retain the above // copyright notice, this list of conditions and the following // disclaimer. // // 2. Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF // USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED // AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and // documentation are those of the authors and should not be // interpreted as representing official policies, either expressed // or implied, of GRNET S.A. // // ----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Text; using System.IO; using System.Text.RegularExpressions; using System.Threading.Tasks; using Pithos.Network; namespace Pithos.Core.Agents { static class BlockExtensions { public static int Read(this FileInfo fileInfo,byte[] buffer,int offset,int count) { //Open the stream only long enough to read a block using (var stream = fileInfo.OpenRead()) { stream.Seek(offset, SeekOrigin.Begin); return stream.Read(buffer, 0, count); } } public static string CalculateHash(this FileSystemInfo info,int blockSize,string algorithm) { if (info==null) throw new ArgumentNullException("info"); if (String.IsNullOrWhiteSpace(info.FullName)) throw new ArgumentException("info"); if (blockSize<=0) throw new ArgumentOutOfRangeException("blockSize",blockSize,"blockSize must be greater than 0"); if (String.IsNullOrWhiteSpace(algorithm)) throw new ArgumentNullException("algorithm"); Contract.EndContractBlock(); //The hash for directories is an empty string if (info is DirectoryInfo) return String.Empty; //The hash for non-existent files is an empty string if (!info.Exists) return String.Empty; var fileInfo = (FileInfo)info; if (fileInfo.Length <= blockSize) return Signature.CalculateMD5(info.FullName); else return Signature.CalculateTreeHash(info.FullName, blockSize, algorithm).TopHash.ToHashString(); } } }