|
1 | 1 | using System;
|
2 | 2 | using System.Collections.Generic;
|
| 3 | +using System.IO; |
3 | 4 | using System.Text;
|
4 | 5 | using System.Windows.Forms;
|
5 | 6 |
|
6 | 7 | namespace MapleShark
|
7 | 8 | {
|
8 | 9 | public sealed class MaplePacket : ListViewItem
|
9 | 10 | {
|
10 |
| - private DateTime mTimestamp; |
11 |
| - private bool mOutbound; |
12 |
| - private ushort mBuild = 0; |
13 |
| - private ushort mLocale = 0; |
14 |
| - private ushort mOpcode = 0; |
15 |
| - private byte[] mBuffer = null; |
16 |
| - private int mCursor = 0; |
| 11 | + public DateTime Timestamp { get; private set; } |
| 12 | + public bool Outbound { get; private set; } |
| 13 | + public ushort Build { get; private set; } |
| 14 | + public ushort Locale { get; private set; } |
| 15 | + public ushort Opcode { get; private set; } |
| 16 | + public new string Name { set { SubItems[4].Text = value; } } |
| 17 | + |
| 18 | + public byte[] Buffer { get; private set; } |
| 19 | + public int Cursor { get; private set; } |
| 20 | + public int Length { get { return Buffer.Length; } } |
| 21 | + public int Remaining { get { return Length - Cursor; } } |
| 22 | + public uint PreDecodeIV { get; private set; } |
| 23 | + public uint PostDecodeIV { get; private set; } |
17 | 24 |
|
18 |
| - internal MaplePacket(DateTime pTimestamp, bool pOutbound, ushort pBuild, ushort pLocale, ushort pOpcode, string pName, byte[] pBuffer) |
| 25 | + internal MaplePacket(DateTime pTimestamp, bool pOutbound, ushort pBuild, ushort pLocale, ushort pOpcode, string pName, byte[] pBuffer, uint pPreDecodeIV, uint pPostDecodeIV) |
19 | 26 | : base(new string[] {
|
20 | 27 | pTimestamp.ToString("yyyy-MM-dd HH:mm:ss.fff"),
|
21 | 28 | pOutbound ? "Outbound" : "Inbound",
|
22 | 29 | pBuffer.Length.ToString(),
|
23 | 30 | "0x" + pOpcode.ToString("X4"),
|
24 | 31 | pName })
|
25 | 32 | {
|
26 |
| - mTimestamp = pTimestamp; |
27 |
| - mOutbound = pOutbound; |
28 |
| - mBuild = pBuild; |
29 |
| - mOpcode = pOpcode; |
30 |
| - mBuffer = pBuffer; |
31 |
| - mLocale = pLocale; |
| 33 | + Timestamp = pTimestamp; |
| 34 | + Outbound = pOutbound; |
| 35 | + Build = pBuild; |
| 36 | + Opcode = pOpcode; |
| 37 | + Buffer = pBuffer; |
| 38 | + Locale = pLocale; |
| 39 | + PreDecodeIV = pPreDecodeIV; |
| 40 | + PostDecodeIV = pPostDecodeIV; |
32 | 41 | }
|
33 | 42 |
|
34 |
| - public DateTime Timestamp { get { return mTimestamp; } } |
35 |
| - public bool Outbound { get { return mOutbound; } } |
36 |
| - public ushort Build { get { return mBuild; } } |
37 |
| - public ushort Locale { get { return mLocale; } } |
38 |
| - public ushort Opcode { get { return mOpcode; } } |
39 |
| - public new string Name { set { SubItems[4].Text = value; } } |
40 |
| - |
41 |
| - public byte[] InnerBuffer { get { return mBuffer; } } |
42 |
| - public int Cursor { get { return mCursor; } } |
43 |
| - public int Length { get { return mBuffer.Length; } } |
44 |
| - public int Remaining { get { return mBuffer.Length - mCursor; } } |
45 |
| - |
46 |
| - public void Rewind() { mCursor = 0; } |
| 43 | + public void Rewind() { Cursor = 0; } |
47 | 44 |
|
48 | 45 | public bool ReadByte(out byte pValue)
|
49 | 46 | {
|
50 | 47 | pValue = 0;
|
51 |
| - if (mCursor + 1 > mBuffer.Length) return false; |
52 |
| - pValue = mBuffer[mCursor++]; |
| 48 | + if (Cursor + 1 > Length) return false; |
| 49 | + pValue = Buffer[Cursor++]; |
53 | 50 | return true;
|
54 | 51 | }
|
55 | 52 | public bool ReadSByte(out sbyte pValue)
|
56 | 53 | {
|
57 | 54 | pValue = 0;
|
58 |
| - if (mCursor + 1 > mBuffer.Length) return false; |
59 |
| - pValue = (sbyte)mBuffer[mCursor++]; |
| 55 | + if (Cursor + 1 > Length) return false; |
| 56 | + pValue = (sbyte)Buffer[Cursor++]; |
60 | 57 | return true;
|
61 | 58 | }
|
62 | 59 | public bool ReadUShort(out ushort pValue)
|
63 | 60 | {
|
64 | 61 | pValue = 0;
|
65 |
| - if (mCursor + 2 > mBuffer.Length) return false; |
66 |
| - pValue = (ushort)(mBuffer[mCursor++] | |
67 |
| - mBuffer[mCursor++] << 8); |
| 62 | + if (Cursor + 2 > Length) return false; |
| 63 | + pValue = (ushort)(Buffer[Cursor++] | |
| 64 | + Buffer[Cursor++] << 8); |
68 | 65 | return true;
|
69 | 66 | }
|
70 | 67 | public bool ReadShort(out short pValue)
|
71 | 68 | {
|
72 | 69 | pValue = 0;
|
73 |
| - if (mCursor + 2 > mBuffer.Length) return false; |
74 |
| - pValue = (short)(mBuffer[mCursor++] | |
75 |
| - mBuffer[mCursor++] << 8); |
| 70 | + if (Cursor + 2 > Length) return false; |
| 71 | + pValue = (short)(Buffer[Cursor++] | |
| 72 | + Buffer[Cursor++] << 8); |
76 | 73 | return true;
|
77 | 74 | }
|
78 | 75 | public bool ReadUInt(out uint pValue)
|
79 | 76 | {
|
80 | 77 | pValue = 0;
|
81 |
| - if (mCursor + 4 > mBuffer.Length) return false; |
82 |
| - pValue = (uint)(mBuffer[mCursor++] | |
83 |
| - mBuffer[mCursor++] << 8 | |
84 |
| - mBuffer[mCursor++] << 16 | |
85 |
| - mBuffer[mCursor++] << 24); |
| 78 | + if (Cursor + 4 > Length) return false; |
| 79 | + pValue = (uint)(Buffer[Cursor++] | |
| 80 | + Buffer[Cursor++] << 8 | |
| 81 | + Buffer[Cursor++] << 16 | |
| 82 | + Buffer[Cursor++] << 24); |
86 | 83 | return true;
|
87 | 84 | }
|
88 | 85 | public bool ReadInt(out int pValue)
|
89 | 86 | {
|
90 | 87 | pValue = 0;
|
91 |
| - if (mCursor + 4 > mBuffer.Length) return false; |
92 |
| - pValue = (int)(mBuffer[mCursor++] | |
93 |
| - mBuffer[mCursor++] << 8 | |
94 |
| - mBuffer[mCursor++] << 16 | |
95 |
| - mBuffer[mCursor++] << 24); |
| 88 | + if (Cursor + 4 > Length) return false; |
| 89 | + pValue = (int)(Buffer[Cursor++] | |
| 90 | + Buffer[Cursor++] << 8 | |
| 91 | + Buffer[Cursor++] << 16 | |
| 92 | + Buffer[Cursor++] << 24); |
96 | 93 | return true;
|
97 | 94 | }
|
98 | 95 | public bool ReadFloat(out float pValue)
|
99 | 96 | {
|
100 | 97 | pValue = 0;
|
101 |
| - if (mCursor + 4 > mBuffer.Length) return false; |
102 |
| - pValue = BitConverter.ToSingle(mBuffer, mCursor); |
103 |
| - mCursor += 4; |
| 98 | + if (Cursor + 4 > Length) return false; |
| 99 | + pValue = BitConverter.ToSingle(Buffer, Cursor); |
| 100 | + Cursor += 4; |
104 | 101 | return true;
|
105 | 102 | }
|
106 | 103 | public bool ReadULong(out ulong pValue)
|
107 | 104 | {
|
108 | 105 | pValue = 0;
|
109 |
| - if (mCursor + 8 > mBuffer.Length) return false; |
110 |
| - pValue = (ulong)(mBuffer[mCursor++] | |
111 |
| - mBuffer[mCursor++] << 8 | |
112 |
| - mBuffer[mCursor++] << 16 | |
113 |
| - mBuffer[mCursor++] << 24 | |
114 |
| - mBuffer[mCursor++] << 32 | |
115 |
| - mBuffer[mCursor++] << 40 | |
116 |
| - mBuffer[mCursor++] << 48 | |
117 |
| - mBuffer[mCursor++] << 56); |
| 106 | + if (Cursor + 8 > Length) return false; |
| 107 | + pValue = (ulong)(Buffer[Cursor++] | |
| 108 | + Buffer[Cursor++] << 8 | |
| 109 | + Buffer[Cursor++] << 16 | |
| 110 | + Buffer[Cursor++] << 24 | |
| 111 | + Buffer[Cursor++] << 32 | |
| 112 | + Buffer[Cursor++] << 40 | |
| 113 | + Buffer[Cursor++] << 48 | |
| 114 | + Buffer[Cursor++] << 56); |
118 | 115 | return true;
|
119 | 116 | }
|
120 | 117 | public bool ReadLong(out long pValue)
|
121 | 118 | {
|
122 | 119 | pValue = 0;
|
123 |
| - if (mCursor + 8 > mBuffer.Length) return false; |
124 |
| - pValue = (long)(mBuffer[mCursor++] | |
125 |
| - mBuffer[mCursor++] << 8 | |
126 |
| - mBuffer[mCursor++] << 16 | |
127 |
| - mBuffer[mCursor++] << 24 | |
128 |
| - mBuffer[mCursor++] << 32 | |
129 |
| - mBuffer[mCursor++] << 40 | |
130 |
| - mBuffer[mCursor++] << 48 | |
131 |
| - mBuffer[mCursor++] << 56); |
| 120 | + if (Cursor + 8 > Length) return false; |
| 121 | + pValue = (long)(Buffer[Cursor++] | |
| 122 | + Buffer[Cursor++] << 8 | |
| 123 | + Buffer[Cursor++] << 16 | |
| 124 | + Buffer[Cursor++] << 24 | |
| 125 | + Buffer[Cursor++] << 32 | |
| 126 | + Buffer[Cursor++] << 40 | |
| 127 | + Buffer[Cursor++] << 48 | |
| 128 | + Buffer[Cursor++] << 56); |
132 | 129 | return true;
|
133 | 130 | }
|
134 | 131 | public bool ReadFlippedLong(out long pValue) // 5 6 7 8 1 2 3 4
|
135 | 132 | {
|
136 | 133 | pValue = 0;
|
137 |
| - if (mCursor + 8 > mBuffer.Length) return false; |
| 134 | + if (Cursor + 8 > Length) return false; |
138 | 135 | pValue = (long)(
|
139 |
| - mBuffer[mCursor++] << 32 | |
140 |
| - mBuffer[mCursor++] << 40 | |
141 |
| - mBuffer[mCursor++] << 48 | |
142 |
| - mBuffer[mCursor++] << 56 | |
143 |
| - mBuffer[mCursor++] | |
144 |
| - mBuffer[mCursor++] << 8 | |
145 |
| - mBuffer[mCursor++] << 16 | |
146 |
| - mBuffer[mCursor++] << 24); |
| 136 | + Buffer[Cursor++] << 32 | |
| 137 | + Buffer[Cursor++] << 40 | |
| 138 | + Buffer[Cursor++] << 48 | |
| 139 | + Buffer[Cursor++] << 56 | |
| 140 | + Buffer[Cursor++] | |
| 141 | + Buffer[Cursor++] << 8 | |
| 142 | + Buffer[Cursor++] << 16 | |
| 143 | + Buffer[Cursor++] << 24); |
147 | 144 | return true;
|
148 | 145 | }
|
149 | 146 | public bool ReadDouble(out double pValue)
|
150 | 147 | {
|
151 | 148 | pValue = 0;
|
152 |
| - if (mCursor + 8 > mBuffer.Length) return false; |
153 |
| - pValue = BitConverter.ToDouble(mBuffer, mCursor); |
154 |
| - mCursor += 8; |
| 149 | + if (Cursor + 8 > Length) return false; |
| 150 | + pValue = BitConverter.ToDouble(Buffer, Cursor); |
| 151 | + Cursor += 8; |
155 | 152 | return true;
|
156 | 153 | }
|
157 | 154 | public bool ReadBytes(byte[] pBytes) { return ReadBytes(pBytes, 0, pBytes.Length); }
|
158 | 155 | public bool ReadBytes(byte[] pBytes, int pStart, int pLength)
|
159 | 156 | {
|
160 |
| - if (mCursor + pLength > mBuffer.Length) return false; |
161 |
| - Buffer.BlockCopy(mBuffer, mCursor, pBytes, pStart, pLength); |
162 |
| - mCursor += pLength; |
| 157 | + if (Cursor + pLength > Length) return false; |
| 158 | + |
| 159 | + System.Buffer.BlockCopy(Buffer, Cursor, pBytes, pStart, pLength); |
| 160 | + Cursor += pLength; |
163 | 161 | return true;
|
164 | 162 | }
|
165 | 163 |
|
166 | 164 | public bool ReadPaddedString(out string pValue, int pLength)
|
167 | 165 | {
|
168 | 166 | pValue = "";
|
169 |
| - if (mCursor + pLength > mBuffer.Length) return false; |
| 167 | + if (Cursor + pLength > Length) return false; |
170 | 168 | int length = 0;
|
171 |
| - while (length < pLength && mBuffer[mCursor + length] != 0x00) ++length; |
172 |
| - if (length > 0) pValue = Encoding.ASCII.GetString(mBuffer, mCursor, length); |
173 |
| - mCursor += pLength; |
| 169 | + while (length < pLength && Buffer[Cursor + length] != 0x00) ++length; |
| 170 | + if (length > 0) pValue = Encoding.ASCII.GetString(Buffer, Cursor, length); |
| 171 | + Cursor += pLength; |
174 | 172 | return true;
|
175 | 173 | }
|
176 |
| - |
177 |
| - public byte[] Dump() |
178 |
| - { |
179 |
| - byte[] buffer = new byte[mBuffer.Length + 13]; |
180 |
| - ushort size = (ushort)(mBuffer.Length); |
181 |
| - |
182 |
| - long ticks = mTimestamp.Ticks; |
183 |
| - buffer[0] = (byte)ticks; |
184 |
| - buffer[1] = (byte)(ticks >> 8); |
185 |
| - buffer[2] = (byte)(ticks >> 16); |
186 |
| - buffer[3] = (byte)(ticks >> 24); |
187 |
| - buffer[4] = (byte)(ticks >> 32); |
188 |
| - buffer[5] = (byte)(ticks >> 40); |
189 |
| - buffer[6] = (byte)(ticks >> 48); |
190 |
| - buffer[7] = (byte)(ticks >> 56); |
191 |
| - |
192 |
| - buffer[8] = (byte)size; |
193 |
| - buffer[9] = (byte)(size >> 8); |
194 |
| - |
195 |
| - buffer[10] = (byte)mOpcode; |
196 |
| - buffer[11] = (byte)(mOpcode >> 8); |
197 |
| - |
198 |
| - buffer[12] = mOutbound ? (byte)1 : (byte)0; |
199 |
| - |
200 |
| - Buffer.BlockCopy(mBuffer, 0, buffer, 13, mBuffer.Length); |
201 |
| - |
202 |
| - return buffer; |
203 |
| - } |
204 | 174 | }
|
205 | 175 | }
|
0 commit comments