git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.RemObjects@68 b6239004-a887-0f4b-9937-50029ccdca16
101 lines
2.5 KiB
ObjectPascal
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.
|