unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes,
SysUtils,
Forms,
Controls,
Graphics,
uDownload,
//opensslsockets,
Dialogs,
StdCtrls, Menus,
VirtualTrees;
type
PData = ^TData;
TData = record
FUrl: String;
FName: String;
FState: String;
end;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
PopupMenu1: TPopupMenu;
VST: TVirtualStringTree;
procedure Button1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure MenuItem1Click(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure VSTGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
private
FDownload: TDownload;
procedure DoOnDownloadProgress(Sender: TObject; {%H-}AFrom, ATo: String; APos, ASize, AElapsed, ARemaining, ASpeed: Longint);
procedure DoOnDownloadCompleted(Sender: TObject);
function GetSelectedNodeData3(var AData: PData): Boolean;
public
end;
var
Form1: TForm1;
nro_descargas_total, nro_descarga_actual: integer;
implementation
{$R *.lfm}
{ TForm1 }
function TForm1.GetSelectedNodeData3(var AData: PData): Boolean;
Var
Node: PVirtualNode;
begin
Node := VST.GetFirstSelected;
while assigned (node) do
begin
if Node <> nil then
begin
AData := VST.GetNodeData(Node);
if TDownload(self).OriginalURL = aData^.FUrl then
begin
FDownload.CancelDownoad; // trying to cancel download
aData^.FState := 'cancelled';
end;
Result := True;
end
else
begin
MessageDlg('Please select a node first!', mtInformation, [mbOk], 0);
Result := False;
end;
node := VST.GetNextSelected(node) ;
End;
vst.Refresh;
vst.Repaint;
End;
procedure TForm1.FormCreate(Sender: TObject);
var
Data: Pdata;
Node: PVirtualNode;
begin
{nro_descargas_total:=0;
nro_descarga_actual:=0;}
VST.Clear;
VST.NodeDataSize := SizeOf(TData);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
Data^.FUrl := 'https://videolan.ip-connect.info/vlc/3.0.20/win64/vlc-3.0.20-win64.exe';
Data^.FName := 'vlc.exe';
Data^.FState := '';
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
Data^.FUrl := 'https://files2.codecguide.com/K-Lite_Codec_Pack_1805_Mega.exe';
Data^.FName := 'klite codec pack.exe';
Data^.FState := '';
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
Data^.FUrl := 'https://raw.githubusercontent.com/ericktux/software_terceros/main/cccp.exe';
Data^.FName := 'Combined codec pack.exe';
Data^.FState := '';
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
Data^.FUrl := 'https://www.aimp.ru/files/windows/builds/aimp_5.30.2533_w64.exe';
Data^.FName := 'aimp.exe';
Data^.FState := '';
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
Data^.FUrl := 'https://download.winamp.com/winamp/winamp_latest_full.exe';
Data^.FName := 'winamp.exe';
Data^.FState := '';
FDownload := nil;
end;
procedure TForm1.MenuItem1Click(Sender: TObject);
Var
Data: Pdata;
Node: PVirtualNode;
begin
GetSelectedNodeData3(Data);
End;
procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
End;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Assigned(FDownload) then
FDownload.CancelDownoad;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
node: PVirtualNode;
Data: PData;
begin
// ShowMessage(ExtractFilePath(Application.ExeName));
nro_descargas_total:=0;
nro_descarga_actual:=0;
node := VST.GetFirst;
while assigned(node) do
begin
if Node <> nil then
begin
Data := VST.GetNodeData(Node);
{
ShowMessage(Data^.FUrl);
ShowMessage(Data^.FName);
ShowMessage(Data^.FState);
}
nro_descargas_total:=nro_descargas_total+1;
Data^.FState := 'downloading';
FDownload := TDownload.Create;
FDownload.OnDownloadProgress := @DoOnDownloadProgress;
FDownload.OnDownloadCompleted := @DoOnDownloadCompleted;
FDownload.DownloadFile(Data^.FUrl, ExtractFilePath(Application.ExeName) + Data^.FName);
end;
node := VST.GetNext(node);
end;
vst.SetFocus;
vst.Refresh;
end;
procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
NodeDataSize := SizeOf(TData);
end;
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
var
Data: PData;
begin
// si no existen estos codes, el resultado sera el texto "NODE"
Data := VST.GetNodeData(Node);
case Column of
0: CellText := Data^.FUrl;
1: CellText := Data^.FName;
2: CellText := Data^.FState;
end;
end;
procedure TForm1.DoOnDownloadProgress(Sender: TObject; AFrom, ATo: String; APos, ASize, AElapsed, ARemaining, ASpeed: Longint);
var
node: PVirtualNode;
Data: PData;
begin
node := VST.GetFirst;
while assigned(node) do
begin
Data := VST.GetNodeData(Node);
if TDownload(Sender).OriginalURL = Data^.FUrl then
begin
{ // trabaja bien
if ASize > 0 then
Data^.FState := 'Received: ' + ' ' + FormatSize(APos) + ' / ' + FormatSize(ASize)
else
Data^.FState := 'Received: ' + ' ' + FormatSize(APos) + ' / ' + 'Unknown';
}
if ASize > 0 then
begin
Data^.FState :='Downloading '+inttostr(Round((APos/ASize) * 100))+'%';
//vst.Refresh;
end;
//Data^.FState := Format('downloading (%f %%)', [APos * 100 / ASize]); // original
vst.InvalidateNode(node);
//vst.Refresh;
break;
end
else
node := VST.GetNext(node);
end;
end;
procedure TForm1.DoOnDownloadCompleted(Sender: TObject);
var
node: PVirtualNode;
Data: PData;
begin
node := VST.GetFirst;
while assigned(node) do
begin
Data := VST.GetNodeData(Node);
if TDownload(Sender).OriginalURL = Data^.FUrl then
begin
nro_descarga_actual:=nro_descarga_actual+1;
Data^.FState := 'finalized';
vst.InvalidateNode(node);
//vst.Refresh;
break;
end
else
node := VST.GetNext(node);
end;
if nro_descarga_actual=nro_descargas_total then ShowMessage('ALL DOWNLOADS COMPLETED');
end;
end.