DEADSOFTWARE

Net: Buffer outgoing messages
[d2df-sdl.git] / src / engine / e_msg.pas
index 6433511f3abd87e2d2570a4e05b272f3e1ecb7a8..a2ecc52e3e9a40e6a2c58dede4d26344e35847b3 100644 (file)
@@ -39,6 +39,9 @@ type
     function AssignBuffer(P: Pointer; N: Integer; Full: Boolean = False): Boolean;
 
     procedure BeginReading();
+    procedure Seek(Pos: Integer);
+    procedure Skip(Size: Integer);
+    function BytesLeft(): Integer;
     function ReadData(V: Pointer; N: Integer): Integer;
     function ReadChar(): Char;
     function ReadByte(): Byte;
@@ -61,6 +64,7 @@ type
     procedure Write(V: Int64); overload;
     procedure Write(V: String); overload;
     procedure Write(V: TMD5Digest); overload;
+    procedure Write(V: TMsg);
   end;
 
 type
@@ -97,6 +101,7 @@ procedure TMsg.Free();
 begin
   if not OwnMemory then
     raise Exception.Create('TMsg.Free: called on borrowed memory');
+  Clear();
   OwnMemory := False;
   FreeMem(Data);
   Data := nil;
@@ -147,6 +152,18 @@ begin
   CurSize := CurSize + N;
 end;
 
+procedure TMsg.Write(V: TMsg);
+begin
+  if CurSize + V.CurSize > MaxSize then
+  begin
+    Overflow := True;
+    raise Exception.Create('TMsg.WriteData: buffer overrun!');
+    Exit;
+  end;
+  Move(V.Data^, (Data + CurSize)^, V.CurSize);
+  CurSize := CurSize + V.CurSize;
+end;
+
 procedure TMsg.Write(V: Byte); overload;
 begin
   WriteData(@V, 1);
@@ -206,6 +223,25 @@ begin
   Bit := 0;
 end;
 
+procedure TMsg.Seek(Pos: Integer);
+begin
+  if Pos > CurSize then
+    raise Exception.Create('TMsg.Seek: buffer overrun!');
+  ReadCount := Pos;
+end;
+
+procedure TMsg.Skip(Size: Integer);
+begin
+  if ReadCount + Size > CurSize then
+    raise Exception.Create('TMsg.Skip: buffer overrun!');
+  ReadCount := ReadCount + Size;
+end;
+
+function TMsg.BytesLeft(): Integer;
+begin
+  Result := CurSize - ReadCount;
+end;
+
 function TMsg.ReadData(V: Pointer; N: Integer): Integer;
 begin
   Result := 0;