Wraps a stream for all operations except Close and Dispose, which merely flush the stream and prevent further operations from being carried out using this wrapper.
Inheritance: Stream
        public TrackDetail GetTrackDetail(string songKey, string arrangmentName)
        {
            var sngEntry=_psarc.Entries.FirstOrDefault(x =>x.Name == @"songs/bin/generic/" + songKey + "_" + arrangmentName + ".sng");
            var jsonEntry = _psarc.Entries.FirstOrDefault(x => x.Name.StartsWith(@"manifests/songs") && x.Name.EndsWith("/" + songKey + "_" + arrangmentName + ".json"));
            if (sngEntry == null || jsonEntry == null)
            {
                return null;
            }

            Attributes2014 att;
            using (var wrappedStream = new NonClosingStreamWrapper(jsonEntry.Data))
            {
                using (var reader = new StreamReader(wrappedStream))
                {
                    var manifest = JsonConvert.DeserializeObject<Manifest2014<Attributes2014>>(reader.ReadToEnd());
                    att = manifest.Entries.ToArray()[0].Value.ToArray()[0].Value;
                }               
            }

            Sng2014File sngFile;
            using (var wrappedStream = new NonClosingStreamWrapper(sngEntry.Data))
            {
                var platform = _archiveFile.GetPlatform();
                sngFile = Sng2014File.ReadSng(wrappedStream, platform);
            }
            var sngObject = new Song2014(sngFile,att);
            return new TrackDetail() { RockSmithSong = sngObject };
        }
        //RockSmithTrack har flere levels, vi lager alphatab track utifra et bestemt level
        public IList<RSSongInfo> GetAllSongInfos()
        {
            var src = _psarc.Entries.Where(x => x.Name.StartsWith(@"manifests/songs") && x.Name.EndsWith(".json"))
                .OrderBy(x => x.Name);

            var retValue = new List<RSSongInfo>();
            RSSongInfo currentSongInfo = null;

            foreach (var entry in src)
            {
                var entryName = System.IO.Path.GetFileNameWithoutExtension(entry.Name);
                var splitPoint = entryName.LastIndexOf('_');
                var entrySongKey = entryName.Substring(0, splitPoint);
                var entryArrangmentName = entryName.Substring(splitPoint+1);

                if (currentSongInfo == null || entrySongKey != currentSongInfo.Key)
                {
                    string song_name, album_name, artist_name, song_year;
                    using (var wrappedStream = new NonClosingStreamWrapper(entry.Data))
                    {
                        using (var reader = new StreamReader(wrappedStream))
                        {
                            string json = reader.ReadToEnd();
                            JObject o = JObject.Parse(json);
                            var attributes = o["Entries"].First.Last["Attributes"];

                            song_name = attributes["SongName"].ToString();
                            album_name = attributes["AlbumName"].ToString();
                            artist_name = attributes["ArtistName"].ToString();
                            song_year = attributes["SongYear"].ToString();
                        }
                    }

                    currentSongInfo = new RSSongInfo() { Key = entrySongKey, TrackInfos = new List<RSTrackInfo>(), SongName = song_name, AlbumName = album_name, ArtistName = artist_name, SongYear = song_year };
                    retValue.Add(currentSongInfo);
                }
                var arrangmentInfo = new RSTrackInfo() { Name = entryArrangmentName, FileSize = entry.Length };
                currentSongInfo.TrackInfos.Add(arrangmentInfo);
            }

            return retValue;
        }