Indy 컴포넌트들이 사용하기 대단히 편리하게 잘 만들어져 있지만, 패킷 단위로 처리하고 싶은 요구사항 때문에 소켓으로 직접 작업하고는 했었습니다. 그러다가 오늘 문득 "TStream 클래스를 상속받아서 처리하면 간단하겠구나"하는 뒤 늦은 깨달음이 ㅠ.ㅠ
"없으면 만들어서 한다"가 기본 자세이다 보니, 쓸 때 없는 곳에 힘을 빼고 말았네요 ㅡ.ㅡ;
코드가 간단해서 설명은 생략합니다 ^^; (메모장에는 다운로드가 끝난 다음에 한 거번에 표시됩니다)
unit _fmMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls;
type
TfmMain = class(TForm)
IdHTTP1: TIdHTTP;
moMsg: TMemo;
procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
procedure FormCreate(Sender: TObject);
procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
private
public
end;
var
fmMain: TfmMain;
implementation
type
THTTPSream = class (TStream)
private
FSize : int64;
FPosition : int64;
protected
function GetSize: Int64; override;
public
constructor Create;
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; overload; override;
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; override;
end;
{$R *.dfm}
procedure TfmMain.FormCreate(Sender: TObject);
var
HTTPSream : THTTPSream;
begin
HTTPSream := THTTPSream.Create;
try
IdHTTP1.Get('http://다운받은 데이터가 있는 주소', HTTPSream);
finally
HTTPSream.Free;
end;
end;
procedure TfmMain.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
//
end;
procedure TfmMain.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
fmMain.moMsg.Lines.Add(Format('AWorkCountMax: %d', [AWorkCountMax]));
end;
procedure TfmMain.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
//
end;
{ THTTPSream }
constructor THTTPSream.Create;
begin
inherited;
FSize := 0;
FPosition := 0;
end;
function THTTPSream.GetSize: Int64;
begin
Result := FSize;
end;
function THTTPSream.Read(var Buffer; Count: Integer): Longint;
begin
Result := 0;
end;
function THTTPSream.Seek(Offset: Integer; Origin: Word): Longint;
begin
Result := FPosition;
end;
function THTTPSream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
Result := FPosition;
end;
function THTTPSream.Write(const Buffer; Count: Integer): Longint;
begin
FSize := FSize + Count;
fmMain.moMsg.Lines.Add(Format('Position: %d, Size: %d, Count: %d', [Position, Size, Count]));
end;
end.
| Real Grid Plus - 리얼 그리드가 새제품으로 출시된다고 합니다. (0) | 2012.09.07 |
|---|---|
| 오브젝트 파스칼 책을 찾는 분들에게 (2) | 2012.09.05 |
| 방화벽 (Firewall)에 프로그램 예외 등록 하기 (0) | 2012.08.13 |
| SetFileSecurity를 이용해서 모든 사용자에게 권한 주기 (0) | 2012.08.13 |
| VolumeControl for all MS-Windows versions. (0) | 2012.07.31 |