2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
5 using System.Globalization;
7 using System.Text.RegularExpressions;
10 namespace Pithos.Interfaces
12 public class ObjectInfo:DynamicObject
14 private readonly List<string> _knownContainers= new List<string>{"trash"};
15 public string Name { get; set; }
16 public string Hash { get; set; }
17 public long Bytes { get; set; }
18 public string Content_Type { get; set; }
19 public DateTime Last_Modified { get; set; }
21 private Dictionary<string, string> _tags=new Dictionary<string, string>();
22 public Dictionary<string, string> Tags
25 set { _tags = value; }
28 private Dictionary<string, string> _extensions=new Dictionary<string, string>();
29 public Dictionary<string, string> Extensions
31 get { return _extensions; }
35 ExtractKnownExtensions();
40 private Dictionary<string, string> _permissions=new Dictionary<string, string>();
41 [JsonProperty("x_object_sharing")]
42 [JsonConverter(typeof(PermissionConverter))]
43 public Dictionary<string, string> Permissions
45 get { return _permissions; }
55 [JsonProperty("x_object_version")]
56 public long? Version { get; set; }
60 /// Shared object permissions can be Read or Write
62 [JsonProperty("x_object_allowed_to")]
63 public string AllowedTo { get; set; }
69 [JsonProperty("X_Object_Version_Timestamp"), JsonConverter(typeof(PithosDateTimeConverter))]
70 public DateTime? VersionTimestamp { get; set; }
72 [JsonProperty("X_Object_Modified_By")]
73 public string ModifiedBy { get; set; }
76 public Stream Stream { get; set; }
78 public string Account { get; set; }
80 public string Container { get; set; }
85 public ObjectInfo(string accountPath,string accountName,FileInfo fileInfo)
87 var relativeUrl = fileInfo.AsRelativeUrlTo(accountPath);
88 //The first part of the URL is the container
89 var slashIndex = relativeUrl.IndexOf('/');
90 var container = relativeUrl.Substring(0, slashIndex);
91 //The second is the file's url relative to the container
92 var fileUrl = relativeUrl.Substring(slashIndex + 1);
94 Account = accountName;
95 Container = container;
100 private void ExtractKnownExtensions()
102 Version=GetLong(KnownExtensions.X_Object_Version);
103 VersionTimestamp = GetTimestamp(KnownExtensions.X_Object_Version_Timestamp);
104 ModifiedBy = GetString(KnownExtensions.X_Object_Modified_By);
107 private string GetString(string name)
109 var value=String.Empty;
110 _extensions.TryGetValue(name, out value);
114 private long? GetLong(string name)
118 return _extensions.TryGetValue(name, out version) && long.TryParse(version, out value)
123 private DateTime? GetTimestamp(string name)
127 if (_extensions.TryGetValue(name, out version) &&
128 DateTime.TryParse(version,CultureInfo.InvariantCulture,DateTimeStyles.AdjustToUniversal, out value))
136 public static ObjectInfo Empty = new ObjectInfo
141 Content_Type = String.Empty,
142 Last_Modified = DateTime.MinValue
145 public string RelativeUrlToFilePath(string currentAccount)
148 throw new InvalidOperationException("Name can't be null");
149 if (String.IsNullOrWhiteSpace(currentAccount))
150 throw new ArgumentNullException("currentAccount");
151 Contract.EndContractBlock();
156 var unescaped = Uri.UnescapeDataString(Name);
157 var path = unescaped.Replace("/", "\\");
158 var pathParts=new Stack<string>();
159 pathParts.Push(path);
160 if (!String.IsNullOrWhiteSpace(Container) && !_knownContainers.Contains(Container))
161 pathParts.Push(Container);
162 if (!currentAccount.Equals(Account, StringComparison.InvariantCultureIgnoreCase))
166 pathParts.Push(Account);
167 pathParts.Push("others");
170 var finalPath=Path.Combine(pathParts.ToArray());
174 public override bool TrySetMember(SetMemberBinder binder, object value)
176 if (binder.Name.StartsWith("x_object_meta"))
178 Tags[binder.Name] = value.ToString();