IdIOHandlerStream.pas 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 10215: IdIOHandlerStream.pas
  11. {
  12. Rev 1.2 6/21/2003 10:00:00 AM DSiders
  13. Update declaration of Readable in implementation to match the interface
  14. declaration.
  15. }
  16. {
  17. { Rev 1.1 2003.06.15 3:00:32 PM czhower
  18. { -Fixed IdIOHandlerStream to function as originally designed and needed.
  19. { -Change ReadStream, WriteStream to Input/Output to be consistent with other
  20. { areas.
  21. }
  22. {
  23. { Rev 1.0 2002.11.12 10:42:42 PM czhower
  24. }
  25. unit IdIOHandlerStream;
  26. interface
  27. uses
  28. Classes,
  29. IdGlobal, IdIOHandler;
  30. type
  31. TIdIOHandlerStream = class(TIdIOHandler)
  32. protected
  33. FFreeStreams: Boolean;
  34. FInputStream: TStream;
  35. FOutputStream: TStream;
  36. //
  37. procedure SetInputStream(const AValue: TStream);
  38. procedure SetOutputStream(const AValue: TStream);
  39. public
  40. procedure Close; override;
  41. constructor Create(AOwner: TComponent); override;
  42. destructor Destroy; override;
  43. procedure Open; override;
  44. function Readable(AMSec: integer = IdTimeoutDefault): boolean; override;
  45. function Recv(var ABuf; ALen: integer): integer; override;
  46. function Send(var ABuf; ALen: integer): integer; override;
  47. //
  48. property InputStream: TStream read FInputStream write SetInputStream;
  49. property OutputStream: TStream read FOutputStream write SetOutputStream;
  50. published
  51. property FreeStreams: Boolean read FFreeStreams write FFreeStreams;
  52. end;
  53. implementation
  54. uses
  55. IdException,
  56. SysUtils;
  57. { TIdIOHandlerStream }
  58. procedure TIdIOHandlerStream.Close;
  59. begin
  60. inherited;
  61. // After Active = False inherited just in case
  62. if FreeStreams then begin
  63. FreeAndNil(FInputStream);
  64. FreeAndNil(FOutputStream);
  65. end;
  66. end;
  67. constructor TIdIOHandlerStream.Create(AOwner: TComponent);
  68. begin
  69. inherited;
  70. FFreeStreams := True;
  71. end;
  72. destructor TIdIOHandlerStream.Destroy;
  73. begin
  74. Close;
  75. inherited Destroy;
  76. end;
  77. procedure TIdIOHandlerStream.Open;
  78. begin
  79. // InputStream can be nil. For example coders use this to save to a file
  80. if (InputStream = nil) and (OutputStream = nil) then begin
  81. raise EIdException.Create('No InputStream or OutputStream assigned.');
  82. end;
  83. inherited;
  84. end;
  85. function TIdIOHandlerStream.Readable(AMSec: integer = IdTimeoutDefault): boolean;
  86. begin
  87. Result := InputStream <> nil;
  88. if Result then begin
  89. Result := InputStream.Position < InputStream.Size;
  90. end;
  91. end;
  92. function TIdIOHandlerStream.Recv(var ABuf; ALen: integer): integer;
  93. begin
  94. if InputStream = nil then begin
  95. // Should return closed gracefully IIRC
  96. Result := 0;
  97. end else begin
  98. Result := InputStream.Read(ABuf, ALen);
  99. end;
  100. end;
  101. function TIdIOHandlerStream.Send(var ABuf; ALen: integer): Integer;
  102. begin
  103. if OutputStream = nil then begin
  104. // If its nil, we just void the output and pretend we sent it
  105. Result := ALen;
  106. end else begin
  107. Result := OutputStream.Write(ABuf, ALen);
  108. end;
  109. end;
  110. procedure TIdIOHandlerStream.SetInputStream(const AValue: TStream);
  111. begin
  112. if Active then begin
  113. raise EIdException.Create('Cannot set InputStream while active.');
  114. end;
  115. FInputStream := AValue;
  116. end;
  117. procedure TIdIOHandlerStream.SetOutputStream(const AValue: TStream);
  118. begin
  119. if Active then begin
  120. raise EIdException.Create('Cannot set OutputStream while active.');
  121. end;
  122. FOutputStream := AValue;
  123. end;
  124. end.