root / trunk / Pithos.Core / Agents / BlockExtensions.cs @ 255f5f86
History | View | Annotate | Download (3.6 kB)
1 | 255f5f86 | Panagiotis Kanavos | #region |
---|---|---|---|
2 | 255f5f86 | Panagiotis Kanavos | /* ----------------------------------------------------------------------- |
3 | 255f5f86 | Panagiotis Kanavos | * <copyright file="BlockExtensions.cs" company="GRNet"> |
4 | 255f5f86 | Panagiotis Kanavos | * |
5 | 255f5f86 | Panagiotis Kanavos | * Copyright 2011-2012 GRNET S.A. All rights reserved. |
6 | 255f5f86 | Panagiotis Kanavos | * |
7 | 255f5f86 | Panagiotis Kanavos | * Redistribution and use in source and binary forms, with or |
8 | 255f5f86 | Panagiotis Kanavos | * without modification, are permitted provided that the following |
9 | 255f5f86 | Panagiotis Kanavos | * conditions are met: |
10 | 255f5f86 | Panagiotis Kanavos | * |
11 | 255f5f86 | Panagiotis Kanavos | * 1. Redistributions of source code must retain the above |
12 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
13 | 255f5f86 | Panagiotis Kanavos | * disclaimer. |
14 | 255f5f86 | Panagiotis Kanavos | * |
15 | 255f5f86 | Panagiotis Kanavos | * 2. Redistributions in binary form must reproduce the above |
16 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
17 | 255f5f86 | Panagiotis Kanavos | * disclaimer in the documentation and/or other materials |
18 | 255f5f86 | Panagiotis Kanavos | * provided with the distribution. |
19 | 255f5f86 | Panagiotis Kanavos | * |
20 | 255f5f86 | Panagiotis Kanavos | * |
21 | 255f5f86 | Panagiotis Kanavos | * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
22 | 255f5f86 | Panagiotis Kanavos | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
23 | 255f5f86 | Panagiotis Kanavos | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | 255f5f86 | Panagiotis Kanavos | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
25 | 255f5f86 | Panagiotis Kanavos | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
26 | 255f5f86 | Panagiotis Kanavos | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
27 | 255f5f86 | Panagiotis Kanavos | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
28 | 255f5f86 | Panagiotis Kanavos | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
29 | 255f5f86 | Panagiotis Kanavos | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | 255f5f86 | Panagiotis Kanavos | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
31 | 255f5f86 | Panagiotis Kanavos | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
32 | 255f5f86 | Panagiotis Kanavos | * POSSIBILITY OF SUCH DAMAGE. |
33 | 255f5f86 | Panagiotis Kanavos | * |
34 | 255f5f86 | Panagiotis Kanavos | * The views and conclusions contained in the software and |
35 | 255f5f86 | Panagiotis Kanavos | * documentation are those of the authors and should not be |
36 | 255f5f86 | Panagiotis Kanavos | * interpreted as representing official policies, either expressed |
37 | 255f5f86 | Panagiotis Kanavos | * or implied, of GRNET S.A. |
38 | 255f5f86 | Panagiotis Kanavos | * </copyright> |
39 | 255f5f86 | Panagiotis Kanavos | * ----------------------------------------------------------------------- |
40 | 255f5f86 | Panagiotis Kanavos | */ |
41 | 255f5f86 | Panagiotis Kanavos | #endregion |
42 | f3d080df | Panagiotis Kanavos | using System; |
43 | 1caef52e | Panagiotis Kanavos | using System.Collections.Generic; |
44 | cfed7823 | Panagiotis Kanavos | using System.Diagnostics.Contracts; |
45 | 1caef52e | Panagiotis Kanavos | using System.Linq; |
46 | 1caef52e | Panagiotis Kanavos | using System.Text; |
47 | 1caef52e | Panagiotis Kanavos | using System.IO; |
48 | 1caef52e | Panagiotis Kanavos | using System.Text.RegularExpressions; |
49 | a27aa447 | Panagiotis Kanavos | using System.Threading.Tasks; |
50 | 0af3141d | Panagiotis Kanavos | using Pithos.Network; |
51 | 1caef52e | Panagiotis Kanavos | |
52 | 1caef52e | Panagiotis Kanavos | namespace Pithos.Core.Agents |
53 | 1caef52e | Panagiotis Kanavos | { |
54 | 540b8cf8 | Panagiotis Kanavos | static class BlockExtensions |
55 | 1caef52e | Panagiotis Kanavos | { |
56 | 27361404 | Panagiotis Kanavos | |
57 | cfed7823 | Panagiotis Kanavos | |
58 | a27aa447 | Panagiotis Kanavos | public static int Read(this FileInfo fileInfo,byte[] buffer,int offset,int count) |
59 | a27aa447 | Panagiotis Kanavos | { |
60 | a27aa447 | Panagiotis Kanavos | //Open the stream only long enough to read a block |
61 | a27aa447 | Panagiotis Kanavos | using (var stream = fileInfo.OpenRead()) |
62 | a27aa447 | Panagiotis Kanavos | { |
63 | a27aa447 | Panagiotis Kanavos | stream.Seek(offset, SeekOrigin.Begin); |
64 | a27aa447 | Panagiotis Kanavos | return stream.Read(buffer, 0, count); |
65 | a27aa447 | Panagiotis Kanavos | } |
66 | a27aa447 | Panagiotis Kanavos | } |
67 | a27aa447 | Panagiotis Kanavos | |
68 | 4f6d51d4 | Panagiotis Kanavos | public static string CalculateHash(this FileSystemInfo info,int blockSize,string algorithm) |
69 | 0af3141d | Panagiotis Kanavos | { |
70 | cfed7823 | Panagiotis Kanavos | if (info==null) |
71 | cfed7823 | Panagiotis Kanavos | throw new ArgumentNullException("info"); |
72 | cfed7823 | Panagiotis Kanavos | if (String.IsNullOrWhiteSpace(info.FullName)) |
73 | cfed7823 | Panagiotis Kanavos | throw new ArgumentException("info"); |
74 | cfed7823 | Panagiotis Kanavos | if (blockSize<=0) |
75 | cfed7823 | Panagiotis Kanavos | throw new ArgumentOutOfRangeException("blockSize",blockSize,"blockSize must be greater than 0"); |
76 | cfed7823 | Panagiotis Kanavos | if (String.IsNullOrWhiteSpace(algorithm)) |
77 | cfed7823 | Panagiotis Kanavos | throw new ArgumentNullException("algorithm"); |
78 | cfed7823 | Panagiotis Kanavos | Contract.EndContractBlock(); |
79 | cfed7823 | Panagiotis Kanavos | |
80 | 4f6d51d4 | Panagiotis Kanavos | //The hash for directories is an empty string |
81 | 4f6d51d4 | Panagiotis Kanavos | if (info is DirectoryInfo) |
82 | 4f6d51d4 | Panagiotis Kanavos | return String.Empty; |
83 | 7c4a9354 | Panagiotis Kanavos | //The hash for non-existent files is an empty string |
84 | 7c4a9354 | Panagiotis Kanavos | if (!info.Exists) |
85 | 7c4a9354 | Panagiotis Kanavos | return String.Empty; |
86 | 7c4a9354 | Panagiotis Kanavos | |
87 | 4f6d51d4 | Panagiotis Kanavos | var fileInfo = (FileInfo)info; |
88 | 4f6d51d4 | Panagiotis Kanavos | if (fileInfo.Length <= blockSize) |
89 | 0af3141d | Panagiotis Kanavos | return Signature.CalculateMD5(info.FullName); |
90 | 0af3141d | Panagiotis Kanavos | else |
91 | 0af3141d | Panagiotis Kanavos | return Signature.CalculateTreeHash(info.FullName, blockSize, algorithm).TopHash.ToHashString(); |
92 | 0af3141d | Panagiotis Kanavos | |
93 | 0af3141d | Panagiotis Kanavos | } |
94 | 1caef52e | Panagiotis Kanavos | } |
95 | 1caef52e | Panagiotis Kanavos | } |