streamex.pp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. {$mode objfpc}
  2. {$h+}
  3. unit streamex;
  4. Interface
  5. uses Classes;
  6. type
  7. { TBidirBinaryObjectReader }
  8. TBidirBinaryObjectReader = class(TBinaryObjectReader)
  9. protected
  10. function GetPosition: Longint;
  11. procedure SetPosition(const AValue: Longint);
  12. public
  13. property Position: Longint read GetPosition write SetPosition;
  14. end;
  15. { TBidirBinaryObjectWriter }
  16. TBidirBinaryObjectWriter = class(TBinaryObjectWriter)
  17. protected
  18. function GetPosition: Longint;
  19. procedure SetPosition(const AValue: Longint);
  20. public
  21. property Position: Longint read GetPosition write SetPosition;
  22. end;
  23. { TDelphiReader }
  24. TDelphiReader = class(TReader)
  25. protected
  26. function GetPosition: LongInt;
  27. procedure SetPosition(const AValue: LongInt);
  28. function CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectReader; override;
  29. public
  30. function GetDriver: TBidirBinaryObjectReader;
  31. function ReadStr: string;
  32. procedure Read(var Buf; Count: LongInt);
  33. property Position: LongInt read GetPosition write SetPosition;
  34. end;
  35. { TDelphiWriter }
  36. TDelphiWriter = class(TWriter)
  37. protected
  38. function GetPosition: Longint;
  39. procedure SetPosition(const AValue: LongInt);
  40. function CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectWriter; override;
  41. public
  42. function GetDriver: TBidirBinaryObjectWriter;
  43. procedure FlushBuffer;
  44. procedure Write(const Buf; Count: LongInt);
  45. procedure WriteStr(const Value: string);
  46. procedure WriteValue(Value: TValueType);
  47. property Position: LongInt read GetPosition write SetPosition;
  48. end;
  49. Implementation
  50. { TBidirBinaryObjectReader }
  51. function TBidirBinaryObjectReader.GetPosition: Longint;
  52. begin
  53. Result := FStream.Position - (FBufEnd - FBufPos);
  54. end;
  55. procedure TBidirBinaryObjectReader.SetPosition(const AValue: Longint);
  56. begin
  57. FStream.Position := AValue;
  58. FBufPos := 0;
  59. FBufEnd := 0;
  60. end;
  61. { TBidirBinaryObjectWriter }
  62. function TBidirBinaryObjectWriter.GetPosition: Longint;
  63. begin
  64. Result := FStream.Position - (FBufEnd - FBufPos);
  65. end;
  66. procedure TBidirBinaryObjectWriter.SetPosition(const AValue: Longint);
  67. begin
  68. FStream.Position := AValue;
  69. FBufPos := 0;
  70. FBufEnd := 0;
  71. end;
  72. { TDelphiReader }
  73. function TDelphiReader.GetDriver: TBidirBinaryObjectReader;
  74. begin
  75. Result := (Driver as TBidirBinaryObjectReader);
  76. end;
  77. function TDelphiReader.GetPosition: LongInt;
  78. begin
  79. Result := GetDriver.Position;
  80. end;
  81. procedure TDelphiReader.SetPosition(const AValue: LongInt);
  82. begin
  83. GetDriver.Position := AValue;
  84. end;
  85. function TDelphiReader.CreateDriver(Stream: TStream; BufSize:
  86. Integer): TAbstractObjectReader;
  87. begin
  88. Result := TBidirBinaryObjectReader.Create(Stream, BufSize);
  89. end;
  90. function TDelphiReader.ReadStr: string;
  91. begin
  92. Result := GetDriver.ReadStr;
  93. end;
  94. procedure TDelphiReader.Read(var Buf; Count: LongInt);
  95. begin
  96. GetDriver.Read(Buf, Count);
  97. end;
  98. { TDelphiWriter }
  99. function TDelphiWriter.GetDriver: TBidirBinaryObjectWriter;
  100. begin
  101. Result := (Driver as TBidirBinaryObjectWriter);
  102. end;
  103. function TDelphiWriter.GetPosition: LongInt;
  104. begin
  105. Result := GetDriver.Position;
  106. end;
  107. procedure TDelphiWriter.SetPosition(const AValue: LongInt);
  108. begin
  109. GetDriver.Position := AValue;
  110. end;
  111. function TDelphiWriter.CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectWriter;
  112. begin
  113. Result := TBidirBinaryObjectWriter.Create(Stream, BufSize);
  114. end;
  115. procedure TDelphiWriter.FlushBuffer;
  116. begin
  117. GetDriver.FlushBuffer();
  118. end;
  119. procedure TDelphiWriter.Write(const Buf; Count: Longint);
  120. begin
  121. GetDriver.Write(Buf, Count);
  122. end;
  123. procedure TDelphiWriter.WriteStr(const Value: string);
  124. begin
  125. GetDriver.WriteStr(Value);
  126. end;
  127. procedure TDelphiWriter.WriteValue(Value: TValueType);
  128. begin
  129. GetDriver.WriteValue(Value);
  130. end;
  131. end.