Example #1
0
        public async Task <Stream> CreateAsync(IDocument entry, CancellationToken ct)
        {
            int    i   = 0;
            Stream ret = null;

            for (; i < FileChain.Length; i++)
            {
                var v = await FileChain[i].TryCreateAsync(entry, ct);
                if (v.success || i >= FileChain.Length - 1)
                {
                    ret = v.result;
                    break;
                }
            }

            ret = new PushReadStream(ret);

            for (i--; i >= 0; i--)
            {
                await FileChain[i].TryCreateAsync_Bubbleup(entry, ret, ct);
            }

            await CacheManager.Flush_CreateAsync(entry);

            return(ret);
        }
 public DocumentCacheStreamListener(PushReadStream stream, DocumentCache cache, string cacheName) : this()
 {
     Stream    = stream;
     Cache     = cache;
     CacheName = cacheName;
     tmpCache  = new List <byte>(16);
     valid     = true;
 }
Example #3
0
        public async Task TryOpenReadAsync_Bubbleup(IDocument entry, Stream result, CancellationToken ct)
        {
            string name = entry.FullPath();

            if (!IgnoreIgnoreCache && RequestLockManager.GetStatus(name).Is(RequestStatus.IgnoreCache))
            {
                return;
            }

            if (result.CanSeek)
            {
                if (result is IDelayedDisposable)
                {
                    (result as IDelayedDisposable).OnDisposeAsync.Add(async() => {
                        result.Position = 0;
                        await Store.TryPut(name, result);
                    });
                }
                else
                {
                    await Store.TryPut(name, result);

                    result.Position = 0;
                }

                RequestLockManager.AddStatus(name, RequestStatus.Cached);
            }
            else if (result is PushReadStream &&
                     !RequestLockManager.GetStatus(name).Is(RequestStatus.IgnoreCache) &&
                     await Allocator.TryAllocate(name, () => Task.FromResult(entry), () => Task.FromResult(result))
                     )
            {
                PushReadStream prs = result as PushReadStream;
                prs.AddListener(new DocumentCacheStreamListener(prs, this, name));
                RequestLockManager.AddStatus(name, RequestStatus.Cached);
            }
        }