using System; using System.Collections.Generic; using System.IO; using LibGit2Sharp.Core.Handles; namespace LibGit2Sharp.Core { internal class RawContentStream : UnmanagedMemoryStream { private readonly GitObjectSafeHandle handle; private readonly ICollection linkedResources; internal unsafe RawContentStream( GitObjectSafeHandle handle, Func bytePtrProvider, Func sizeProvider, ICollection linkedResources = null) : base((byte*)Wrap(handle, bytePtrProvider, linkedResources).ToPointer(), Wrap(handle, sizeProvider, linkedResources)) { this.handle = handle; this.linkedResources = linkedResources; } private static T Wrap( GitObjectSafeHandle handle, Func provider, IEnumerable linkedResources) { T value; try { value = provider(handle); } catch { Dispose(handle, linkedResources); throw; } return value; } private static void Dispose( GitObjectSafeHandle handle, IEnumerable linkedResources) { handle.SafeDispose(); if (linkedResources == null) { return; } foreach (IDisposable linkedResource in linkedResources) { linkedResource.Dispose(); } } protected override void Dispose(bool disposing) { base.Dispose(disposing); Dispose(handle, linkedResources); } } }