X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fengine%2Fe_msg.pas;h=a2ecc52e3e9a40e6a2c58dede4d26344e35847b3;hp=6433511f3abd87e2d2570a4e05b272f3e1ecb7a8;hb=69ed21bb4a9cd4c59ba1acfd5971c7be5f854ee2;hpb=6b0ba68063ba1c8f35903d3e939e5eeb91d2a58c diff --git a/src/engine/e_msg.pas b/src/engine/e_msg.pas index 6433511..a2ecc52 100644 --- a/src/engine/e_msg.pas +++ b/src/engine/e_msg.pas @@ -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;