using System; using System.IO; using System.Text; using forms_cil; namespace UnitTestProject.RefVm { // Token: 0x0200000A RID: 10 internal sealed class MyBufferReader : IDisposable // \u0002\u2007 { // Token: 0x0400000C RID: 12 private MyBuffer _src; // \u0002 // Token: 0x0400000D RID: 13 private byte[] _inputRawBuf; // \u0003 // Token: 0x0400000E RID: 14 private Decoder _decoder; // \u0005 // Token: 0x0400000F RID: 15 private byte[] _inputCharRawBuf; // \u0008 // Token: 0x04000010 RID: 16 private char[] _inputCharsDecoded; // \u0006 // Token: 0x04000011 RID: 17 private char[] _stringChunk; // \u000E // Token: 0x04000012 RID: 18 private readonly int _maxCharsIn128Bytes; // \u000F // Token: 0x04000013 RID: 19 private readonly bool _isUnicode; // \u0002\u2000 // Token: 0x04000014 RID: 20 private readonly bool _alwaysTrue; // \u0003\u2000 // Token: 0x06000034 RID: 52 RVA: 0x000027C8 File Offset: 0x000009C8 public MyBufferReader(MyBuffer src) : this(src, new UTF8Encoding()) { } // Token: 0x06000035 RID: 53 RVA: 0x000027D8 File Offset: 0x000009D8 private MyBufferReader(MyBuffer src, Encoding encoding) { if (src == null) { throw new ArgumentNullException(); } if (encoding == null) { throw new ArgumentNullException(); } if (!src.IsValid()) { throw new ArgumentException(); } _src = src; _decoder = encoding.GetDecoder(); _maxCharsIn128Bytes = encoding.GetMaxCharCount(128); var num = encoding.GetMaxByteCount(1); if (num < 16) num = 16; _inputRawBuf = new byte[num]; _stringChunk = null; _inputCharRawBuf = null; _isUnicode = (encoding is UnicodeEncoding); _alwaysTrue = (_src != null); } // Token: 0x06000036 RID: 54 RVA: 0x00002878 File Offset: 0x00000A78 public MyBuffer GetBuffer() // \u0002 { return _src; } // Token: 0x06000037 RID: 55 RVA: 0x00002880 File Offset: 0x00000A80 public void Dispose() // \u0002 { DoDispose(true); } // Token: 0x06000038 RID: 56 RVA: 0x0000288C File Offset: 0x00000A8C private void DoDispose(bool disposing) // \u0002 { if (disposing) _src?.DoDispose(); _src = null; _inputRawBuf = null; _decoder = null; _inputCharRawBuf = null; _inputCharsDecoded = null; _stringChunk = null; } // Token: 0x06000039 RID: 57 RVA: 0x000028E0 File Offset: 0x00000AE0 void IDisposable.Dispose() // \u0002\u2007\u2008\u2000\u2002\u200A\u0003 { DoDispose(true); } // Token: 0x0600003A RID: 58 RVA: 0x000028EC File Offset: 0x00000AEC public int PeekUnicodeChar() // \u0002 { SrcPrecondition(); if (!_src.IsValid2()) { return -1; } var pos = _src.GetPos(); var ret = SafeReadUnicodeChar(); _src.SetPos(pos); return ret; } // Token: 0x06000051 RID: 81 RVA: 0x00002FE8 File Offset: 0x000011E8 private void SrcPrecondition() // \u0005 { if (_src == null) { throw new Exception(); } } // Token: 0x0600003B RID: 59 RVA: 0x0000292C File Offset: 0x00000B2C public int SafeReadUnicodeChar() // \u0003 { SrcPrecondition(); return ReadUnicodeChar(); } // Token: 0x0600004E RID: 78 RVA: 0x00002E38 File Offset: 0x00001038 private int ReadUnicodeChar() // \u0005 { var charCnt = 0; var savedPos = 0L; if (_src.IsValid2()) { savedPos = _src.GetPos(); } if (_inputCharRawBuf == null) { _inputCharRawBuf = new byte[128]; } if (_inputCharsDecoded == null) { _inputCharsDecoded = new char[1]; } while (charCnt == 0) { var bytesToRead = _isUnicode ? 2 : 1; var b = _src.ReadByte(); _inputCharRawBuf[0] = (byte)b; if (b == -1) { bytesToRead = 0; } if (bytesToRead == 2) { b = _src.ReadByte(); _inputCharRawBuf[1] = (byte)b; if (b == -1) { bytesToRead = 1; } } if (bytesToRead == 0) { return -1; } try { charCnt = _decoder.GetChars(_inputCharRawBuf, 0, bytesToRead, _inputCharsDecoded, 0); } catch { if (_src.IsValid2()) { _src.Seek(savedPos - _src.GetPos(), SeekOrigin.Current); } throw; } } if (charCnt == 0) { return -1; } return _inputCharsDecoded[0]; } // Token: 0x06000053 RID: 83 RVA: 0x0000305C File Offset: 0x0000125C private void ReadToRawBuf(int cnt) // \u0002 { SrcPrecondition(); var offset = 0; int bytesRead; if (cnt != 1) { while (true) { bytesRead = _src.Read(_inputRawBuf, offset, cnt - offset); if (bytesRead == 0) break; offset += bytesRead; if (offset >= cnt) return; } throw new Exception(); } bytesRead = _src.ReadByte(); if (bytesRead == -1) { throw new Exception(); } _inputRawBuf[0] = (byte)bytesRead; } // Token: 0x0600003C RID: 60 RVA: 0x0000293C File Offset: 0x00000B3C public bool ReadByteInternal() // \u0002 { ReadToRawBuf(1); return _inputRawBuf[0] > 0; } // Token: 0x0600003D RID: 61 RVA: 0x00002950 File Offset: 0x00000B50 public byte ReadByte() // \u0002 { SrcPrecondition(); var b = _src.ReadByte(); if (b == -1) { throw new Exception(); } return (byte)b; } // Token: 0x0600003E RID: 62 RVA: 0x00002970 File Offset: 0x00000B70 public sbyte ReadSbyte() // \u0002 { ReadToRawBuf(1); return (sbyte)_inputRawBuf[0]; } // Token: 0x0600003F RID: 63 RVA: 0x00002984 File Offset: 0x00000B84 public char ReadChar() // \u0002 { var c = SafeReadUnicodeChar(); if (c == -1) { throw new Exception(); } return (char)c; } // Token: 0x06000040 RID: 64 RVA: 0x00002998 File Offset: 0x00000B98 public short ReadShort() // \u0002 { ReadToRawBuf(2); return (short)(_inputRawBuf[0] | _inputRawBuf[1] << 8); } // Token: 0x06000041 RID: 65 RVA: 0x000029B8 File Offset: 0x00000BB8 public ushort ReadUshort() // \u0002 { ReadToRawBuf(2); return (ushort)(_inputRawBuf[0] | _inputRawBuf[1] << 8); } // Token: 0x06000042 RID: 66 RVA: 0x000029D8 File Offset: 0x00000BD8 public uint ReadUint() // \u0002 { ReadToRawBuf(4); return (uint)(_inputRawBuf[0] | _inputRawBuf[1] << 8 | _inputRawBuf[2] << 16 | _inputRawBuf[3] << 24); } // Token: 0x06000043 RID: 67 RVA: 0x00002A0C File Offset: 0x00000C0C public long ReadLong() // \u0002 { ReadToRawBuf(8); var num = (uint)(_inputRawBuf[0] | _inputRawBuf[1] << 8 | _inputRawBuf[2] << 16 | _inputRawBuf[3] << 24); return (long)((ulong)(_inputRawBuf[4] | _inputRawBuf[5] << 8 | _inputRawBuf[6] << 16 | _inputRawBuf[7] << 24) << 32 | num); } // Token: 0x06000044 RID: 68 RVA: 0x00002A80 File Offset: 0x00000C80 public ulong ReadUlong() // \u0002 { ReadToRawBuf(8); var num = (uint)(_inputRawBuf[0] | _inputRawBuf[1] << 8 | _inputRawBuf[2] << 16 | _inputRawBuf[3] << 24); return (ulong)(_inputRawBuf[4] | _inputRawBuf[5] << 8 | _inputRawBuf[6] << 16 | _inputRawBuf[7] << 24) << 32 | num; } // Token: 0x06000045 RID: 69 RVA: 0x00002AF4 File Offset: 0x00000CF4 private BinaryReader ReaderFor(int cnt) // \u0002 { ReadToRawBuf(cnt); return new BinaryReader(new MemoryStream(_inputRawBuf, 0, cnt, false)); } // Token: 0x06000046 RID: 70 RVA: 0x00002B10 File Offset: 0x00000D10 public float ReadFloat() // \u0002 { var r = ReaderFor(4); var result = r.ReadSingle(); r.Close(); return result; } // Token: 0x06000047 RID: 71 RVA: 0x00002B34 File Offset: 0x00000D34 public double ReadDouble() // \u0002 { var r = ReaderFor(8); var result = r.ReadDouble(); r.Close(); return result; } // Token: 0x06000048 RID: 72 RVA: 0x00002B58 File Offset: 0x00000D58 private static decimal CreateDecimal(int lo, int mid, int hi, int scaleNeg) // \u0002 { var isNegative = (scaleNeg & -2147483648) != 0; var scale = (byte)(scaleNeg >> 16); return new decimal(lo, mid, hi, isNegative, scale); } // Token: 0x06000049 RID: 73 RVA: 0x00002B80 File Offset: 0x00000D80 internal static decimal CreateDecimal(byte[] b) // b { var lo = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24; var mid = b[4] | b[5] << 8 | b[6] << 16 | b[7] << 24; var hi = b[8] | b[9] << 8 | b[10] << 16 | b[11] << 24; var scaleNeg = b[12] | b[13] << 8 | b[14] << 16 | b[15] << 24; return CreateDecimal(lo, mid, hi, scaleNeg); } // Token: 0x0600004A RID: 74 RVA: 0x00002BFC File Offset: 0x00000DFC public decimal ReadDecimal() // \u0002 { ReadToRawBuf(16); return CreateDecimal(_inputRawBuf); } // Token: 0x0600004B RID: 75 RVA: 0x00002C14 File Offset: 0x00000E14 public string ReadString() // \u0002 { var totalRead = 0; SrcPrecondition(); var strLen = Read28Bit(); if (strLen < 0) { throw new IOException(); } if (strLen == 0) { return string.Empty; } if (_inputCharRawBuf == null) { _inputCharRawBuf = new byte[128]; } if (_stringChunk == null) { _stringChunk = new char[_maxCharsIn128Bytes]; } StringBuilder stringBuilder = null; while (true) { var needChunkCnt = (strLen - totalRead > 128) ? 128 : (strLen - totalRead); var realChunkRead = _src.Read(_inputCharRawBuf, 0, needChunkCnt); if (realChunkRead == 0) { break; } var chars = _decoder.GetChars(_inputCharRawBuf, 0, realChunkRead, _stringChunk, 0); if (totalRead == 0 && realChunkRead == strLen) { return new string(_stringChunk, 0, chars); } if (stringBuilder == null) { stringBuilder = new StringBuilder(strLen); } stringBuilder.Append(_stringChunk, 0, chars); totalRead += realChunkRead; if (totalRead >= strLen) { return stringBuilder.ToString(); } } throw new Exception(); } // Token: 0x0600004C RID: 76 RVA: 0x00002D08 File Offset: 0x00000F08 public int Read(char[] dest, int offset, int cnt) // \u0002 { if (dest == null) { throw new ArgumentNullException(StringDecryptor.GetString(-1550347170), /* \u0002 */ StringDecryptor.GetString(-1550347157) /* ArgumentNull_Buffer */); } if (offset < 0) { throw new ArgumentOutOfRangeException(); } if (cnt < 0) { throw new ArgumentOutOfRangeException(); } if (dest.Length - offset < cnt) { throw new ArgumentException(); } SrcPrecondition(); return DoRead(dest, offset, cnt); } // Token: 0x0600004D RID: 77 RVA: 0x00002D64 File Offset: 0x00000F64 private int DoRead(char[] dest, int offset, int cnt) // \u0003 { var remainCharsToRead = cnt; if (_inputCharRawBuf == null) { _inputCharRawBuf = new byte[128]; } while (remainCharsToRead > 0) { var chunkSize = remainCharsToRead; if (_isUnicode) { chunkSize <<= 1; } if (chunkSize > 128) { chunkSize = 128; } int chars; if (_alwaysTrue) { var byteIndex = _src.GetCursor(); chunkSize = _src.SkipBytes(chunkSize); if (chunkSize == 0) { return cnt - remainCharsToRead; } chars = _decoder.GetChars(_src.Data(), byteIndex, chunkSize, dest, offset); } else { chunkSize = _src.Read(_inputCharRawBuf, 0, chunkSize); if (chunkSize == 0) { return cnt - remainCharsToRead; } chars = _decoder.GetChars(_inputCharRawBuf, 0, chunkSize, dest, offset); } remainCharsToRead -= chars; offset += chars; } return cnt; } // Token: 0x0600004F RID: 79 RVA: 0x00002F54 File Offset: 0x00001154 public char[] ReadChars(int cnt) // \u0002 { SrcPrecondition(); if (cnt < 0) { throw new ArgumentOutOfRangeException(); } var ret = new char[cnt]; var realLength = DoRead(ret, 0, cnt); if (realLength != cnt) { var shrinked = new char[realLength]; Buffer.BlockCopy(ret, 0, shrinked, 0, 2 * realLength); ret = shrinked; } return ret; } // Token: 0x06000050 RID: 80 RVA: 0x00002F9C File Offset: 0x0000119C public int Read(byte[] dest, int offset, int cnt) // dest { if (dest == null) { throw new ArgumentNullException(); } if (offset < 0) { throw new ArgumentOutOfRangeException(); } if (cnt < 0) { throw new ArgumentOutOfRangeException(); } if (dest.Length - offset < cnt) { throw new ArgumentException(); } SrcPrecondition(); return _src.Read(dest, offset, cnt); } // Token: 0x06000052 RID: 82 RVA: 0x00002FF8 File Offset: 0x000011F8 public byte[] ReadBytes(int cnt) // \u0002 { if (cnt < 0) { throw new ArgumentOutOfRangeException(); } SrcPrecondition(); var ret = new byte[cnt]; var offset = 0; do { var chunkSize = _src.Read(ret, offset, cnt); if (chunkSize == 0) { break; } offset += chunkSize; cnt -= chunkSize; } while (cnt > 0); if (offset != ret.Length) { var shrinked = new byte[offset]; Buffer.BlockCopy(ret, 0, shrinked, 0, offset); ret = shrinked; } return ret; } // Token: 0x06000054 RID: 84 RVA: 0x000030C0 File Offset: 0x000012C0 internal int Read28Bit() // \u0008 { var ret = 0; var bitCnt = 0; while (bitCnt != 35) { var b = ReadByte(); ret |= (b & 127) << bitCnt; bitCnt += 7; if ((b & 128) == 0) { return ret; } } throw new FormatException(); } // Token: 0x06000055 RID: 85 RVA: 0x00003100 File Offset: 0x00001300 public int ReadInt32() // \u0006 { if (_alwaysTrue) { return _src.ReadInt32(); } ReadToRawBuf(4); return _inputRawBuf[3] << 8 | _inputRawBuf[1] << 24 | _inputRawBuf[0] << 16 | _inputRawBuf[2]; } } }