Convert all url usages to use the Uri class instead of raw strings.
[pithos-ms-client] / trunk / Pithos.Core / Agents / StateTuple.cs
1 using System;\r
2 using System.Diagnostics;\r
3 using System.IO;\r
4 using Pithos.Interfaces;\r
5 using Pithos.Network;\r
6 \r
7 namespace Pithos.Core.Agents\r
8 {\r
9     [DebuggerDisplay("{FilePath} C:{C} L:{L} S:{S}")]\r
10     public class StateTuple\r
11     {\r
12         public string FilePath { get; private set; }\r
13 \r
14         public string MD5\r
15         {\r
16             get\r
17             {\r
18                 Debug.Assert(EmptyOrLength(_md5, 32));\r
19                 return _md5;\r
20             }\r
21             set\r
22             {\r
23                 if (!EmptyOrLength(value, 32))\r
24                     throw new ArgumentException("A proper MD5 hash value should have 32 characters");\r
25                 _md5 = value;\r
26             }\r
27         }\r
28 \r
29         private bool EmptyOrLength(string value, int length)\r
30         {\r
31             return String.IsNullOrWhiteSpace(value) || value.Length == length;\r
32         }\r
33 \r
34         public string L\r
35         {\r
36             get\r
37             {\r
38                 //For the change to Merkle Hash, we need to return the final Merkle Hash\r
39                 var hash = FileState.NullSafe(f => f.Checksum);\r
40 \r
41                 Debug.Assert(FileState==null || hash != null,"FileState without a checksum encountered");\r
42 \r
43                 //var hash = FileState.NullSafe(f => f.ETag);\r
44                 \r
45                 //Ensure the hash size matches SHA256\r
46                 Debug.Assert(EmptyOrLength(hash, 64));\r
47                 \r
48                 return String.IsNullOrWhiteSpace(hash) ? null : hash;\r
49             }\r
50         }\r
51 \r
52         private string _c;\r
53         public string C\r
54         {\r
55             get\r
56             {\r
57                 Debug.Assert(EmptyOrLength(_c, 64));\r
58                 return _c;\r
59             }\r
60             set {\r
61                 if (!EmptyOrLength(value, 64))\r
62                     throw new ArgumentException("A proper hash value should have 64 characters");\r
63                 _c = String.IsNullOrWhiteSpace(value) ? null : value;\r
64             }\r
65         }\r
66 \r
67         public string S\r
68         {\r
69             get\r
70             {\r
71                 //The Server hash will be the X-Object-Hash, not the ETag\r
72                 var hash= ObjectInfo.NullSafe(o => o.X_Object_Hash);\r
73 \r
74                 Debug.Assert(EmptyOrLength(hash, 64));\r
75                 \r
76                 return String.IsNullOrWhiteSpace(hash) ? null : hash;\r
77             }\r
78         }\r
79 \r
80         private FileSystemInfo _fileInfo;\r
81         private TreeHash _merkle;\r
82         private string _md5;\r
83 \r
84         public FileSystemInfo FileInfo\r
85         {\r
86             get { return _fileInfo; }\r
87             set\r
88             {\r
89                 _fileInfo = value;\r
90                 FilePath = value.FullName;\r
91             }\r
92         }\r
93 \r
94         public FileState FileState { get; set; }\r
95         public ObjectInfo ObjectInfo{ get; set; }\r
96 \r
97 \r
98         public TreeHash Merkle\r
99         {\r
100             get {\r
101                 return _merkle;\r
102             }\r
103             set {\r
104                 _merkle = value;\r
105                 C = _merkle.TopHash.ToHashString();\r
106             }\r
107         }\r
108 \r
109         public bool Locked { get; set; }\r
110 \r
111         public string NewFullPath { get; set; }\r
112 \r
113         public string OldMD5 { get; set; }\r
114 \r
115         public string OldFullPath { get; set; }\r
116 \r
117         public StateTuple() { }\r
118 \r
119         public StateTuple(FileSystemInfo info)\r
120         {\r
121             FileInfo = info;\r
122         }\r
123 \r
124         public bool HashesValid()\r
125         {\r
126             return (EmptyOrLength(C, 64)\r
127                   && EmptyOrLength(L, 64)\r
128                   && EmptyOrLength(S, 64)\r
129                 );\r
130         }\r
131     }\r
132 }