| 25 | namespace Mona { |
| 26 | |
| 27 | UInt32 WSDecoder::decoding(Exception& ex, UInt8* data,UInt32 size) { |
| 28 | BinaryReader reader(data, size); |
| 29 | |
| 30 | if (reader.available()<2) |
| 31 | return 0; |
| 32 | |
| 33 | UInt8 type = reader.read8() & 0x0F; |
| 34 | UInt8 lengthByte = reader.read8(); |
| 35 | |
| 36 | size=lengthByte&0x7f; |
| 37 | if (size==127) { |
| 38 | if (reader.available()<8) |
| 39 | return 0; |
| 40 | size = (UInt32)reader.read64(); |
| 41 | } else if (size==126) { |
| 42 | if (reader.available()<2) |
| 43 | return 0; |
| 44 | size = reader.read16(); |
| 45 | } |
| 46 | |
| 47 | if(lengthByte&0x80) |
| 48 | size += 4; |
| 49 | |
| 50 | if (reader.available()<size) |
| 51 | return 0; |
| 52 | |
| 53 | reader.shrink(size); |
| 54 | |
| 55 | if (lengthByte & 0x80) |
| 56 | WS::Unmask(reader); |
| 57 | |
| 58 | receive(reader.current(),reader.available(),type); |
| 59 | |
| 60 | return reader.position()+reader.available(); |
| 61 | } |
| 62 | |
| 63 | } // namespace Mona |