2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
5 using System.Globalization;
11 namespace Pithos.Interfaces
13 public class ObjectInfo:DynamicObject
15 private readonly List<string> _knownContainers= new List<string>{"trash"};
16 public string Name { get; set; }
17 public string Hash { get; set; }
18 public long Bytes { get; set; }
19 public string Content_Type { get; set; }
20 public DateTime Last_Modified { get; set; }
22 private Dictionary<string, string> _tags=new Dictionary<string, string>();
23 public Dictionary<string, string> Tags
26 set { _tags = value; }
29 private Dictionary<string, string> _extensions=new Dictionary<string, string>();
30 public Dictionary<string, string> Extensions
32 get { return _extensions; }
36 ExtractKnownExtensions();
41 private Dictionary<string, string> _permissions=new Dictionary<string, string>();
42 [JsonProperty("x_object_sharing")]
43 [JsonConverter(typeof(PermissionConverter))]
44 public Dictionary<string, string> Permissions
46 get { return _permissions; }
56 [JsonProperty("x_object_version")]
57 public long? Version { get; set; }
61 /// Shared object permissions can be Read or Write
63 [JsonProperty("x_object_allowed_to")]
64 public string AllowedTo { get; set; }
70 [JsonProperty("X_Object_Version_Timestamp"), JsonConverter(typeof(PithosDateTimeConverter))]
71 public DateTime? VersionTimestamp { get; set; }
73 [JsonProperty("X_Object_Modified_By")]
74 public string ModifiedBy { get; set; }
77 public Stream Stream { get; set; }
79 public string Account { get; set; }
81 public string Container { get; set; }
83 public string ContendDisposition { get; set; }
85 public string ContentEncoding { get; set; }
87 public string Manifest { get; set; }
91 get { return !String.IsNullOrWhiteSpace(PublicUrl); }
96 else if (String.IsNullOrWhiteSpace(PublicUrl))
101 public string PublicUrl { get; set; }
106 public ObjectInfo(string accountPath,string accountName,FileInfo fileInfo)
108 var relativeUrl = fileInfo.AsRelativeUrlTo(accountPath);
109 //The first part of the URL is the container
110 var slashIndex = relativeUrl.IndexOf('/');
111 var container = relativeUrl.Substring(0, slashIndex);
112 //The second is the file's url relative to the container
113 var fileUrl = relativeUrl.Substring(slashIndex + 1);
115 Account = accountName;
116 Container = container;
121 private void ExtractKnownExtensions()
123 Version=GetLong(KnownExtensions.X_Object_Version);
124 VersionTimestamp = GetTimestamp(KnownExtensions.X_Object_Version_Timestamp);
125 ModifiedBy = GetString(KnownExtensions.X_Object_Modified_By);
128 private string GetString(string name)
131 _extensions.TryGetValue(name, out value);
135 private long? GetLong(string name)
139 return _extensions.TryGetValue(name, out version) && long.TryParse(version, out value)
144 private DateTime? GetTimestamp(string name)
148 if (_extensions.TryGetValue(name, out version) &&
149 DateTime.TryParse(version,CultureInfo.InvariantCulture,DateTimeStyles.AdjustToUniversal, out value))
157 public static ObjectInfo Empty = new ObjectInfo
162 Content_Type = String.Empty,
163 Last_Modified = DateTime.MinValue
166 public string RelativeUrlToFilePath(string currentAccount)
169 throw new InvalidOperationException("Name can't be null");
170 if (String.IsNullOrWhiteSpace(currentAccount))
171 throw new ArgumentNullException("currentAccount");
172 Contract.EndContractBlock();
177 var unescaped = Uri.UnescapeDataString(Name);
178 var path = unescaped.Replace("/", "\\");
179 var pathParts=new Stack<string>();
180 pathParts.Push(path);
181 if (!String.IsNullOrWhiteSpace(Container) && !_knownContainers.Contains(Container))
182 pathParts.Push(Container);
183 if (!currentAccount.Equals(Account, StringComparison.InvariantCultureIgnoreCase))
187 pathParts.Push(Account);
188 pathParts.Push("others");
191 var finalPath=Path.Combine(pathParts.ToArray());
195 public override bool TrySetMember(SetMemberBinder binder, object value)
197 if (binder.Name.StartsWith("x_object_meta"))
199 Tags[binder.Name] = value.ToString();
204 public string GetPermissionString()
206 if (Permissions==null)
207 throw new InvalidOperationException();
208 Contract.EndContractBlock();
210 var permissionBuilder = new StringBuilder();
211 var groupings = Permissions.GroupBy(pair => pair.Value, pair => pair.Key);
212 foreach (var grouping in groupings)
214 permissionBuilder.AppendFormat("{0}={1};", grouping.Key, String.Join(",", grouping));
216 var permissions = permissionBuilder.ToString().Trim(';');
220 public void SetPermissions(string permissions)
222 if (String.IsNullOrWhiteSpace(permissions))
225 var permDict=new Dictionary<string, string>();
226 var perms=permissions.Split(';');
227 foreach (var perm in perms)
229 var permPairs=perm.Split('=');
230 var right = permPairs[0];
231 var users= permPairs[1].Split(new[]{','},StringSplitOptions.RemoveEmptyEntries);
232 foreach (var user in users)
234 permDict[user] = right;
237 Permissions = permDict;