| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- { $HDR$}
- {**********************************************************************}
- { Unit archived using Team Coherence }
- { Team Coherence is Copyright 2002 by Quality Software Components }
- { }
- { For further information / comments, visit our WEB site at }
- { http://www.TeamCoherence.com }
- {**********************************************************************}
- {}
- { $Log: 10215: IdIOHandlerStream.pas
- {
- Rev 1.2 6/21/2003 10:00:00 AM DSiders
- Update declaration of Readable in implementation to match the interface
- declaration.
- }
- {
- { Rev 1.1 2003.06.15 3:00:32 PM czhower
- { -Fixed IdIOHandlerStream to function as originally designed and needed.
- { -Change ReadStream, WriteStream to Input/Output to be consistent with other
- { areas.
- }
- {
- { Rev 1.0 2002.11.12 10:42:42 PM czhower
- }
- unit IdIOHandlerStream;
- interface
- uses
- Classes,
- IdGlobal, IdIOHandler;
- type
- TIdIOHandlerStream = class(TIdIOHandler)
- protected
- FFreeStreams: Boolean;
- FInputStream: TStream;
- FOutputStream: TStream;
- //
- procedure SetInputStream(const AValue: TStream);
- procedure SetOutputStream(const AValue: TStream);
- public
- procedure Close; override;
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure Open; override;
- function Readable(AMSec: integer = IdTimeoutDefault): boolean; override;
- function Recv(var ABuf; ALen: integer): integer; override;
- function Send(var ABuf; ALen: integer): integer; override;
- //
- property InputStream: TStream read FInputStream write SetInputStream;
- property OutputStream: TStream read FOutputStream write SetOutputStream;
- published
- property FreeStreams: Boolean read FFreeStreams write FFreeStreams;
- end;
- implementation
- uses
- IdException,
- SysUtils;
- { TIdIOHandlerStream }
- procedure TIdIOHandlerStream.Close;
- begin
- inherited;
- // After Active = False inherited just in case
- if FreeStreams then begin
- FreeAndNil(FInputStream);
- FreeAndNil(FOutputStream);
- end;
- end;
- constructor TIdIOHandlerStream.Create(AOwner: TComponent);
- begin
- inherited;
- FFreeStreams := True;
- end;
- destructor TIdIOHandlerStream.Destroy;
- begin
- Close;
- inherited Destroy;
- end;
- procedure TIdIOHandlerStream.Open;
- begin
- // InputStream can be nil. For example coders use this to save to a file
- if (InputStream = nil) and (OutputStream = nil) then begin
- raise EIdException.Create('No InputStream or OutputStream assigned.');
- end;
- inherited;
- end;
- function TIdIOHandlerStream.Readable(AMSec: integer = IdTimeoutDefault): boolean;
- begin
- Result := InputStream <> nil;
- if Result then begin
- Result := InputStream.Position < InputStream.Size;
- end;
- end;
- function TIdIOHandlerStream.Recv(var ABuf; ALen: integer): integer;
- begin
- if InputStream = nil then begin
- // Should return closed gracefully IIRC
- Result := 0;
- end else begin
- Result := InputStream.Read(ABuf, ALen);
- end;
- end;
- function TIdIOHandlerStream.Send(var ABuf; ALen: integer): Integer;
- begin
- if OutputStream = nil then begin
- // If its nil, we just void the output and pretend we sent it
- Result := ALen;
- end else begin
- Result := OutputStream.Write(ABuf, ALen);
- end;
- end;
- procedure TIdIOHandlerStream.SetInputStream(const AValue: TStream);
- begin
- if Active then begin
- raise EIdException.Create('Cannot set InputStream while active.');
- end;
- FInputStream := AValue;
- end;
- procedure TIdIOHandlerStream.SetOutputStream(const AValue: TStream);
- begin
- if Active then begin
- raise EIdException.Create('Cannot set OutputStream while active.');
- end;
- FOutputStream := AValue;
- end;
- end.
|