5 namespace ByteFX.Data.MySqlClient
\r
8 /// Summary description for Packet.
\r
10 internal class Packet : MemoryStream
\r
15 public static int NULL_LEN=-1;
\r
16 private int shortLen = 2;
\r
17 private int intLen = 3;
\r
18 private int longLen = 4;
\r
19 private bool longInts = false;
\r
21 public Packet(bool longInts) : base()
\r
23 LongInts = longInts;
\r
26 public Packet(byte[] bytes, bool longInts) : base(bytes.Length)
\r
28 this.Write( bytes, 0, bytes.Length );
\r
30 LongInts = longInts;
\r
33 public bool LongInts
\r
35 get { return longInts; }
\r
47 public int CompleteLength
\r
49 get { return completeLen; }
\r
50 set { completeLen = value; }
\r
53 public byte Sequence
\r
55 get { return sequence; }
\r
56 set { sequence = value; }
\r
59 public Encoding Encoding
\r
61 set { encoding = value; }
\r
62 get { return encoding; }
\r
71 public byte this[int index]
\r
75 long pos = Position;
\r
77 byte b = (byte)ReadByte();
\r
83 public new int Length
\r
85 get { return (int)base.Length; }
\r
88 public bool IsLastPacket()
\r
90 return (Length == 1 && this[0] == 0xfe);
\r
93 public void Append( Packet p )
\r
95 long oldPos = Position;
\r
97 this.Write( p.GetBuffer(), 0, p.Length );
\r
101 public Packet ReadPacket()
\r
103 if (! HasMoreData) return null;
\r
105 int len = this.ReadInteger(3);
\r
106 byte seq = (byte)this.ReadByte();
\r
107 byte[] buf = new byte[ len ];
\r
108 this.Read( buf, 0, len );
\r
109 Packet p = new Packet( buf, LongInts );
\r
111 p.Encoding = this.Encoding;
\r
115 public int ReadNBytes()
\r
117 byte c = (byte)ReadByte();
\r
118 if (c < 1 || c > 4) throw new MySqlException("Unexpected byte count received");
\r
119 return ReadInteger((int)c);
\r
122 public string ReadLenString()
\r
124 long len = ReadLenInteger();
\r
126 byte[] buffer = new Byte[len];
\r
127 Read(buffer, 0, (int)len);
\r
128 return encoding.GetString( buffer, 0, (int)len);
\r
135 /// <param name="v"></param>
\r
136 /// <param name="numbytes"></param>
\r
137 public void WriteInteger( int v, int numbytes )
\r
141 if (numbytes < 1 || numbytes > 4)
\r
142 throw new ArgumentOutOfRangeException("Wrong byte count for WriteInteger");
\r
144 for (int x=0; x < numbytes; x++)
\r
146 WriteByte( (byte)(val&0xff) );
\r
154 /// <param name="numbytes"></param>
\r
155 /// <returns></returns>
\r
156 public int ReadInteger(int numbytes)
\r
160 for (int x=0; x < numbytes; x++)
\r
162 int b = ReadByte();
\r
172 /// <returns></returns>
\r
173 public long ReadLenInteger()
\r
175 byte c = (byte)ReadByte();
\r
179 case 251 : return NULL_LEN;
\r
180 case 252 : return ReadInteger(shortLen);
\r
181 case 253 : return ReadInteger(intLen);
\r
182 case 254 : return ReadInteger(longLen);
\r
183 default : return c;
\r
187 public bool HasMoreData
\r
189 get { return Position < Length; }
\r
192 #region String Functions
\r
193 public string ReadString()
\r
195 System.Text.StringBuilder sb = new System.Text.StringBuilder();
\r
197 while ( HasMoreData )
\r
199 byte b = (byte)ReadByte();
\r
201 sb.Append( Convert.ToChar( b ));
\r
204 return sb.ToString();
\r
207 public void WriteString(string v, Encoding encoding)
\r
209 WriteStringNoNull(v, encoding);
\r
213 public void WriteStringNoNull(string v, Encoding encoding)
\r
215 byte[] bytes = encoding.GetBytes(v);
\r
216 Write(bytes, 0, bytes.Length);
\r