Пример #1
0
        public StreamID Reference(StreamID streamID)
        {
            LocalStreamHeader targetHeader;

            if (_headers.TryGetValue(streamID, out targetHeader) && (targetHeader.Stream != null) && targetHeader.Stream.Modified)
            {
                StreamID localStreamID = Allocate();
                Stream   stream        = Open(localStreamID, LockMode.Exclusive);
                try
                {
                    Stream targetStream = new CoverStream(targetHeader.Stream);
                    try
                    {
                        StreamUtility.CopyStream(targetStream, stream);
                        return(localStreamID);
                    }
                    finally
                    {
                        targetStream.Close();
                    }
                }
                finally
                {
                    stream.Close();
                    Close(localStreamID);
                }
            }
            else
            {
                StreamID          localStreamID = _sourceStreamManager.Reference(streamID);
                LocalStreamHeader header        = new LocalStreamHeader(localStreamID);
                _headers.Add(header);
                return(localStreamID);
            }
        }
Пример #2
0
        // IStreamManager
        public StreamID Allocate()
        {
            // Allocates a new stream in the source stream manager, and saves the header and local cache for it locally
            StreamID          streamID = _sourceStreamManager.Allocate();
            LocalStreamHeader header   = new LocalStreamHeader(streamID);

            _headers.Add(header);
            return(streamID);
        }
Пример #3
0
        public Stream Open(StreamID streamID, LockMode mode)
        {
            // Ensures that the given stream is supported by a local cache and returns a stream accessing it
            LocalStreamHeader header;

            if (!_headers.TryGetValue(streamID, out header))
            {
                header = new LocalStreamHeader(streamID, new LocalStream(this, streamID, mode));                 //FSourceStreamManager.Open(AStreamID, AMode)));
                _headers.Add(header);
            }
            else if (header.Stream == null)
            {
                header.Stream = new LocalStream(this, streamID, mode);                 //, FSourceStreamManager.Open(AStreamID, AMode));
            }
            return(new CoverStream(header.Stream));
        }