Componentes.Terceros.RemObj.../internal/6.0.43.801/1/RemObjects Samples/RemObjects SDK for Delphi/Extended File Transfer/DownloadThread.pas
2010-01-29 16:17:43 +00:00

101 lines
2.5 KiB
ObjectPascal

unit DownloadThread;
interface
uses
Classes, ExtendedFileTransferLibrary_Intf, uROTypes;
type
TDownloadThread = class(TThread)
private
{ Private declarations }
fThreadNumber: integer;
fFileName: string;
fPartNumber: integer;
fPartSize: integer;
fURL: string;
fPart: Binary;
fMessage: string;
fDone: boolean;
private
procedure WritePartSynchronized;
procedure WriteLogSynchronized; overload;
procedure WriteLogSynchronized(msg: string); overload;
protected
procedure Execute; override;
public
constructor Create(const aThreadNumber: integer; const aFileName: string; const aPartNumber: integer; const aPartSize: integer; aURL: string);
property Done: boolean read fDone;
end;
implementation
uses SysUtils, fClientForm, uROClasses, uROWinInetHTTPChannel, uROBinMessage, Forms;
constructor TDownloadThread.Create(const aThreadNumber: integer;
const aFileName: string; const aPartNumber,
aPartSize: integer; aURL: string);
begin
inherited Create(true);
FreeOnTerminate := false;
fThreadNumber := aThreadNumber;
fFileName := aFileName;
fPartNumber := aPartNumber;
fPartSize := aPartSize;
fURL := aURL;
fDone := false;
end;
procedure TDownloadThread.Execute;
var
ch: TROWinInetHTTPChannel;
msg: TROBinMessage;
svc: TExtendedFileTransferService_Proxy;
begin
WriteLogSynchronized('Thread #' + IntToStr(fThreadNumber) +
': downloading chunk ' + IntToStr(fPartNumber));
ch := TROWinInetHTTPChannel.Create(nil);
ch.TargetURL := fURL;
msg := TROBinMessage.Create;
svc := TExtendedFileTransferService_Proxy.Create(msg, ch);
try
fPart := (svc as IExtendedFileTransferService).DownloadFilePart(
{$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(fFileName),
fPartNumber, fPartSize);
finally
ch.Free;
msg.Free;
end;
WriteLogSynchronized('Thread #' + IntToStr(fThreadNumber) +
' download finished, writing to disk');
Synchronize(WritePartSynchronized);
WriteLogSynchronized('Thread #' + IntToStr(fThreadNumber) +
' completed.');
fPart.Free;
fDone := true;
end;
procedure TDownloadThread.WriteLogSynchronized;
begin
ClientForm.LogMessage(fMessage);
Application.ProcessMessages;
end;
procedure TDownloadThread.WriteLogSynchronized(msg: string);
begin
fMessage := msg;
WriteLogSynchronized;
end;
procedure TDownloadThread.WritePartSynchronized;
begin
ClientForm.WriteChunk(fPartNumber, fPartSize, fPart);
end;
end.