namespace Pithos.Interfaces
{
[DebuggerDisplay("Name {Name}")]
- public class ObjectInfo:DynamicObject
+ public class ObjectInfo//:DynamicObject
{
private readonly List<string> _knownContainers= new List<string>{"trash"};
public string Name { get; set; }
-
-
+
+ public string ETag { get; set; }
+
public string Hash { get; set; }
public string X_Object_Hash { get { return Hash; } set { Hash = value; } }
get
{
var relativeUrl=String.Format("{0}/{1}/{2}",Account, Container,Name);
- return new Uri(StorageUri,relativeUrl);
+ return StorageUri==null
+ ? new Uri(relativeUrl,UriKind.Relative)
+ : new Uri(StorageUri, relativeUrl);
}
}
Hash = String.Empty,
Bytes = 0,
Content_Type = String.Empty,
- Last_Modified = DateTime.MinValue
+ Last_Modified = DateTime.MinValue,
+ Exists=false
};
-
+ private bool _exists=true;
+
+ public bool Exists
+ {
+ get {
+ return _exists;
+ }
+ set {
+ _exists = value;
+ }
+ }
+
public string RelativeUrlToFilePath(string currentAccount)
{
return finalPath;
}
+/*
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (binder.Name.StartsWith("x_object_meta"))
}
return false;
}
+*/
public string GetPermissionString()
{
throw new InvalidOperationException();
Contract.EndContractBlock();
+ if (Permissions.Count == 0)
+ return "~";
var permissionBuilder = new StringBuilder();
- var groupings = Permissions.GroupBy(pair => pair.Value, pair => pair.Key);
+ var groupings = Permissions.GroupBy(pair => pair.Value.Trim(), pair => pair.Key.Trim());
foreach (var grouping in groupings)
{
permissionBuilder.AppendFormat("{0}={1};", grouping.Key, String.Join(",", grouping));
}
- var permissions = permissionBuilder.ToString().Trim(';');
+ var permissions = Uri.EscapeDataString(permissionBuilder.ToString().Trim(';'));
return permissions;
}
{
if (String.IsNullOrWhiteSpace(permissions))
return;
-
- var permDict=new Dictionary<string, string>();
- var perms=permissions.Split(';');
- foreach (var perm in perms)
- {
- var permPairs=perm.Split('=');
- var right = permPairs[0];
- var users= permPairs[1].Split(new[]{','},StringSplitOptions.RemoveEmptyEntries);
- foreach (var user in users)
- {
- permDict[user] = right;
- }
- }
- Permissions = permDict;
+
+ Permissions = PermissionConverter.ParsePermissions(permissions);
}
//The previous values that correspond to a NoModification object
&& other.Container == this.Container
&& (this.Name == null || other.Name.StartsWith(this.Name));
}
+
+ public bool IsWritable(string account)
+ {
+ //If the Allowed To header has no value, try to determine the Share permissions
+ if (AllowedTo == null)
+ {
+ //If this file has no permissions defined, we can probably write it
+ //This case should occur only when the info comes from a listing of the user's own files
+ if (Permissions == null || Permissions.Count == 0)
+ return true;
+ string perms;
+
+ //Do we have an explicit write share to this account?
+ return Permissions.TryGetValue(account, out perms)
+ && perms.Equals("write",StringComparison.InvariantCultureIgnoreCase);
+
+ }
+ //Otherwise return the permissions specified by AllowedTo
+ return AllowedTo.Equals("write",StringComparison.InvariantCultureIgnoreCase) ;
+ }
+
+ public ObjectInfo Previous { get; private set; }
+
+ public bool IsDirectory
+ {
+ get
+ {
+ if (Content_Type == null)
+ return false;
+ if (Content_Type.StartsWith(@"application/directory",StringComparison.InvariantCultureIgnoreCase))
+ return true;
+ if (Content_Type.StartsWith(@"application/folder",StringComparison.InvariantCultureIgnoreCase))
+ return true;
+ return false;
+ }
+ }
+
+ public Uri AccountKey
+ {
+ get { return new Uri(StorageUri,"../" + Account); }
+ }
+
+ public ObjectInfo SetPrevious(ObjectInfo previous)
+ {
+ Previous = previous;
+ PreviousHash = previous.Hash;
+ return this;
+ }
+
+ public bool? IsShared
+ {
+ get
+ {
+ if (Uri == null || StorageUri == null)
+ return null;
+ var isShared = !Uri.ToString().StartsWith(StorageUri.ToString());
+ return isShared;
+ }
+ }
}
}
\ No newline at end of file