Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
MetadataReaderProvider.cs
Go to the documentation of this file.
2using System.IO;
5
7
9{
11
13
15
16 private readonly object _metadataReaderGuard = new object();
17
19 {
20 _lazyMetadataBlock = metadataBlock;
21 }
22
24 {
25 _blockProviderOpt = blockProvider;
26 }
27
28 public unsafe static MetadataReaderProvider FromPortablePdbImage(byte* start, int size)
29 {
30 return FromMetadataImage(start, size);
31 }
32
33 public unsafe static MetadataReaderProvider FromMetadataImage(byte* start, int size)
34 {
35 if (start == null)
36 {
37 throw new ArgumentNullException("start");
38 }
39 if (size < 0)
40 {
41 throw new ArgumentOutOfRangeException("size");
42 }
44 }
45
50
52 {
53 if (image.IsDefault)
54 {
55 throw new ArgumentNullException("image");
56 }
58 }
59
64
66 {
67 if (stream == null)
68 {
69 throw new ArgumentNullException("stream");
70 }
71 if (!stream.CanRead || !stream.CanSeek)
72 {
74 }
75 if (!options.IsValid())
76 {
77 throw new ArgumentOutOfRangeException("options");
78 }
79 long position = stream.Position;
80 int andValidateSize = StreamExtensions.GetAndValidateSize(stream, size, "stream");
81 bool flag = true;
83 try
84 {
85 bool isFileStream = FileStreamReadLightUp.IsFileStream(stream);
86 if ((options & MetadataStreamOptions.PrefetchMetadata) == 0)
87 {
88 result = new MetadataReaderProvider(new StreamMemoryBlockProvider(stream, position, andValidateSize, isFileStream, (options & MetadataStreamOptions.LeaveOpen) != 0));
89 flag = false;
90 }
91 else
92 {
93 result = new MetadataReaderProvider(StreamMemoryBlockProvider.ReadMemoryBlockNoLock(stream, isFileStream, position, andValidateSize));
94 }
95 }
96 finally
97 {
98 if (flag && (options & MetadataStreamOptions.LeaveOpen) == 0)
99 {
100 stream.Dispose();
101 }
102 }
103 return result;
104 }
105
106 public void Dispose()
107 {
109 _blockProviderOpt = null;
111 _lazyMetadataBlock = null;
112 _lazyMetadataReader = null;
113 }
114
116 {
117 MetadataReader lazyMetadataReader = _lazyMetadataReader;
118 if (CanReuseReader(lazyMetadataReader, options, utf8Decoder))
119 {
120 return lazyMetadataReader;
121 }
123 {
124 lazyMetadataReader = _lazyMetadataReader;
125 if (CanReuseReader(lazyMetadataReader, options, utf8Decoder))
126 {
127 return lazyMetadataReader;
128 }
129 AbstractMemoryBlock metadataBlock = GetMetadataBlock();
130 return _lazyMetadataReader = new MetadataReader(metadataBlock.Pointer, metadataBlock.Size, options, utf8Decoder, this);
131 }
132 }
133
135 {
136 if (reader != null && reader.Options == options)
137 {
138 return reader.UTF8Decoder == (utf8DecoderOpt ?? MetadataStringDecoder.DefaultUTF8);
139 }
140 return false;
141 }
142
144 {
145 if (_lazyMetadataBlock == null)
146 {
147 if (_blockProviderOpt == null)
148 {
149 throw new ObjectDisposedException("MetadataReaderProvider");
150 }
152 if (Interlocked.CompareExchange(ref _lazyMetadataBlock, memoryBlock, null) != null)
153 {
154 memoryBlock.Dispose();
155 }
156 }
157 return _lazyMetadataBlock;
158 }
159}
static int GetAndValidateSize(Stream stream, int size, string streamParameterName)
static unsafe NativeHeapMemoryBlock ReadMemoryBlockNoLock(Stream stream, bool isFileStream, long start, int size)
static unsafe MetadataReaderProvider FromPortablePdbImage(byte *start, int size)
static MetadataReaderProvider FromMetadataImage(ImmutableArray< byte > image)
static bool CanReuseReader(MetadataReader reader, MetadataReaderOptions options, MetadataStringDecoder utf8DecoderOpt)
MetadataReaderProvider(MemoryBlockProvider blockProvider)
unsafe MetadataReader GetMetadataReader(MetadataReaderOptions options=MetadataReaderOptions.Default, MetadataStringDecoder? utf8Decoder=null)
static MetadataReaderProvider FromPortablePdbImage(ImmutableArray< byte > image)
static MetadataReaderProvider FromMetadataStream(Stream stream, MetadataStreamOptions options=MetadataStreamOptions.Default, int size=0)
static MetadataReaderProvider FromPortablePdbStream(Stream stream, MetadataStreamOptions options=MetadataStreamOptions.Default, int size=0)
static unsafe MetadataReaderProvider FromMetadataImage(byte *start, int size)
MetadataReaderProvider(AbstractMemoryBlock metadataBlock)
static string StreamMustSupportReadAndSeek
Definition SR.cs:52
Definition SR.cs:7
static int CompareExchange(ref int location1, int value, int comparand)