DocSpace-buildtools/thirdparty/AppLimit.CloudComputing.SharpBox/StorageProvider/BaseObjects/BaseDirectoryEntry.cs
2020-03-13 16:40:58 +03:00

170 lines
5.0 KiB
C#

using System;
using System.Collections.Generic;
using AppLimit.CloudComputing.SharpBox.Exceptions;
using AppLimit.CloudComputing.SharpBox.StorageProvider.API;
namespace AppLimit.CloudComputing.SharpBox.StorageProvider.BaseObjects
{
internal class BaseDirectoryEntry : BaseFileEntry, ICloudDirectoryEntry
{
private Dictionary<string, ICloudFileSystemEntry> _subDirectories = new Dictionary<string, ICloudFileSystemEntry>(StringComparer.OrdinalIgnoreCase);
private List<ICloudFileSystemEntry> _subDirectoriesByIndex = new List<ICloudFileSystemEntry>();
private bool _subDirectoriesRefreshedInitially;
public BaseDirectoryEntry(string name, long Length, DateTime modified, IStorageProviderService service, IStorageProviderSession session)
: base(name, Length, modified, service, session)
{
}
#region ICloudDirectoryEntry Members
public ICloudFileSystemEntry GetChild(string id)
{
return GetChild(id, true);
}
public ICloudFileSystemEntry GetChild(string id, bool bThrowException)
{
// refresh this item to ensure that the parents
// are valud
RefreshResource();
// query subitems
ICloudFileSystemEntry pe;
_subDirectories.TryGetValue(id, out pe);
// send the exception if needed
if (bThrowException && pe == null)
throw new SharpBoxException(SharpBoxErrorCodes.ErrorFileNotFound);
// go ahead
return pe;
}
public ICloudFileSystemEntry GetChild(int idx)
{
// refresh this item to ensure that the parents
// are valud
RefreshResource();
// request the information
return idx < _subDirectoriesByIndex.Count ? _subDirectoriesByIndex[idx] : null;
}
public int Count
{
get
{
// go ahead
return _subDirectories.Count;
}
}
#endregion
#region IEnumerable<ICloudFileSystemEntry> Members
public IEnumerator<ICloudFileSystemEntry> GetEnumerator()
{
// refresh this item to ensure that the parents
// are valud
RefreshResource();
// go ahead
return _subDirectories.Values.GetEnumerator();
}
internal IEnumerable<ICloudFileSystemEntry> GetSubdirectoriesWithoutRefresh()
{
// go ahead
return _subDirectories.Values;
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
public void AddChild(BaseFileEntry child)
{
// remove child if available
//RemoveChild(child);
//don't need to remove child if contains; it's must be up to date due ProviderService's
if (_subDirectories.ContainsKey(child.Id))
{
child.Parent = this;
return;
}
// add the new child
_subDirectories.Add(child.Id, child);
_subDirectoriesByIndex.Add(child);
// set the parent
child.Parent = this;
}
public void AddChilds(IEnumerable<BaseFileEntry> childs)
{
foreach (var entry in childs)
AddChild(entry);
}
public void RemoveChild(BaseFileEntry child)
{
RemoveChildById(child.Id);
}
public void RemoveChildById(string childId)
{
// check for replace
if (_subDirectories.ContainsKey(childId))
{
// get the old child
var oldChild = _subDirectories[childId];
// remove it
_subDirectories.Remove(childId);
_subDirectoriesByIndex.Remove(oldChild);
// remove parent link
oldChild.Parent = null;
}
}
public void ClearChilds()
{
_subDirectories.Clear();
_subDirectoriesByIndex.Clear();
}
public nChildState HasChildrens
{
get
{
if (_subDirectories.Count != 0)
return nChildState.HasChilds;
if (!_subDirectoriesRefreshedInitially)
return nChildState.HasNotEvaluated;
return nChildState.HasNoChilds;
}
}
private void RefreshResource()
{
// refresh the childs
_service.RefreshResource(_session, this);
// set the state
_subDirectoriesRefreshedInitially = true;
}
}
}