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); } }
// 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); }
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)); }