using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; namespace MediaBrowser.Controller.Entities { /// <summary> /// Specialized folder that can have items added to it's children by external entities. /// Used for our RootFolder so plug-ins can add items. /// </summary> public class AggregateFolder : Folder { /// <summary> /// We don't support manual shortcuts /// </summary> protected override bool SupportsShortcutChildren { get { return false; } } /// <summary> /// The _virtual children /// </summary> private readonly ConcurrentBag<BaseItem> _virtualChildren = new ConcurrentBag<BaseItem>(); /// <summary> /// Gets the virtual children. /// </summary> /// <value>The virtual children.</value> public ConcurrentBag<BaseItem> VirtualChildren { get { return _virtualChildren; } } /// <summary> /// Adds the virtual child. /// </summary> /// <param name="child">The child.</param> /// <exception cref="System.ArgumentNullException"></exception> public void AddVirtualChild(BaseItem child) { if (child == null) { throw new ArgumentNullException(); } _virtualChildren.Add(child); } /// <summary> /// Get the children of this folder from the actual file system /// </summary> /// <returns>IEnumerable{BaseItem}.</returns> protected override IEnumerable<BaseItem> GetNonCachedChildren() { return base.GetNonCachedChildren().Concat(_virtualChildren); } /// <summary> /// Finds the virtual child. /// </summary> /// <param name="id">The id.</param> /// <returns>BaseItem.</returns> /// <exception cref="System.ArgumentNullException">id</exception> public BaseItem FindVirtualChild(Guid id) { if (id == Guid.Empty) { throw new ArgumentNullException("id"); } return _virtualChildren.FirstOrDefault(i => i.Id == id); } } }