/** * @return Q3DemoMessage return a next message buffer or null if EOD is reached * @throws Exception in case stream is corrupted */ public Q3DemoMessage nextMessage() { byte[] headerBuffer = binaryReader.ReadBytes(8); if (headerBuffer.Length != 8) { return(null); } //if (BitConverter.IsLittleEndian) { // Array.Reverse(headerBuffer); //} int sequence = BitConverter.ToInt32(headerBuffer, 0); int msgLength = BitConverter.ToInt32(headerBuffer, 4); if (sequence == -1 && msgLength == -1) { // a normal case, end of message-sequence return(null); } if (msgLength < 0 || msgLength > Constants.Q3_MESSAGE_MAX_SIZE) { throw new ErrorWrongLength(); } var msg = new Q3DemoMessage(sequence, msgLength); msg.data = binaryReader.ReadBytes(msgLength); this.readMessages++; return(msg); }
private Q3DemoConfigParser doParse(Q3DemoConfigParser msgParser) { Q3MessageStream messageStream = new Q3MessageStream(this.file_name); try { Q3DemoMessage msg = null; while ((msg = messageStream.nextMessage()) != null) { if (!msgParser.parse(msg)) { break; } } } catch (Exception r) { Q3Utils.PrintDebug(msgParser.clc.errors, r.Message); } messageStream.close(); return(msgParser); }
public bool parse(Q3DemoMessage message) { clc.serverMessageSequence = message.sequence; Q3HuffmanReader reader = new Q3HuffmanReader(message.data); reader.readLong(); while (!reader.isEOD()) { var b = reader.readByte(); switch (b) { case Q3_SVC.BAD: case Q3_SVC.NOP: return(true); case Q3_SVC.EOF: return(true); case Q3_SVC.SERVERCOMMAND: this.parseServerCommand(reader); break; case Q3_SVC.GAMESTATE: this.parseGameState(reader); break; case Q3_SVC.SNAPSHOT: this.parseSnapshot(reader); // snapshots couldn't be mixed with game-state command in a single message break; default: // unknown command / corrupted stream return(true); } } return(true); }