Componentes.Terceros.jvcl/official/3.36/archive/examples/JvMultiHTTPGrabber/MainFrm.pas
2009-02-27 12:23:32 +00:00

416 lines
13 KiB
ObjectPascal
Raw Blame History

{******************************************************************
JEDI-VCL Demo
Copyright (C) 2002 Project JEDI
Original author:
Contributor(s):
You may retrieve the latest version of this file at the JEDI-JVCL
home page, located at http://jvcl.sourceforge.net
The contents of this file are used with permission, subject to
the Mozilla Public License Version 1.1 (the "License"); you may
not use this file except in compliance with the License. You may
obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1_1Final.html
Software distributed under the License is distributed on an
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
******************************************************************}
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, JvComponent, JvMultiHttpGrabber, StdCtrls,
ActnList, Menus, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
JvMultiHttpGrabber1: TJvMultiHttpGrabber;
Panel1: TPanel;
Label1: TLabel;
btnDownload: TButton;
gbContent: TGroupBox;
reContent: TRichEdit;
gnLog: TGroupBox;
reLog: TRichEdit;
Splitter1: TSplitter;
cbURL: TComboBox;
btnDownloadAll: TButton;
sbMain: TStatusBar;
pbProgress: TProgressBar;
acMainActions: TActionList;
acDownload: TAction;
acDownloadAll: TAction;
acURLAdd: TAction;
acURLDelete: TAction;
acClearLog: TAction;
acClearContent: TAction;
popMain: TPopupMenu;
Addtohistory1: TMenuItem;
Deletefromhistory1: TMenuItem;
N1: TMenuItem;
Download1: TMenuItem;
Downloadall1: TMenuItem;
N2: TMenuItem;
Clearcontent1: TMenuItem;
Clearlog1: TMenuItem;
acSaveToFile: TAction;
N3: TMenuItem;
acSaveToFile1: TMenuItem;
Options1: TMenuItem;
procedure JvMultiHttpGrabber1ClosedConnection(Sender: TObject;
UserData: Integer; Url: String);
procedure JvMultiHttpGrabber1ClosingConnection(Sender: TObject;
UserData: Integer; Url: String);
procedure JvMultiHttpGrabber1ConnectedToServer(Sender: TObject;
UserData: Integer; Url: String);
procedure JvMultiHttpGrabber1ConnectingToServer(Sender: TObject;
UserData: Integer; Url: String);
procedure JvMultiHttpGrabber1DoneStream(Sender: TObject;
UserData: Integer; Stream: TStream; StreamSize: Integer;
Url: String);
procedure JvMultiHttpGrabber1Error(Sender: TObject; UserData: Integer;
Url, Error: String);
procedure JvMultiHttpGrabber1Progress(Sender: TObject; UserData,
Position, TotalSize: Integer; Url: String; var Continue: Boolean);
procedure JvMultiHttpGrabber1ReceivedResponse(Sender: TObject;
UserData: Integer; Url: String; DataSize: Integer);
procedure JvMultiHttpGrabber1ReceivingResponse(Sender: TObject;
UserData: Integer; Url: String);
procedure JvMultiHttpGrabber1Redirect(Sender: TObject;
UserData: Integer; Url, NewUrl: String);
procedure JvMultiHttpGrabber1RequestComplete(Sender: TObject;
UserData: Integer; Url: String);
procedure JvMultiHttpGrabber1RequestSent(Sender: TObject;
UserData: Integer; Url: String; DataSize: Integer);
procedure JvMultiHttpGrabber1ResolvedName(Sender: TObject;
UserData: Integer; Url, Name: String);
procedure JvMultiHttpGrabber1ResolvingName(Sender: TObject;
UserData: Integer; Url: String);
procedure JvMultiHttpGrabber1SendingRequest(Sender: TObject;
UserData: Integer; Url: String);
procedure FormCreate(Sender: TObject);
procedure sbMainResize(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure acDownloadExecute(Sender: TObject);
procedure acDownloadAllExecute(Sender: TObject);
procedure acMainActionsUpdate(Action: TBasicAction;
var Handled: Boolean);
procedure acURLAddExecute(Sender: TObject);
procedure acURLDeleteExecute(Sender: TObject);
procedure acClearLogExecute(Sender: TObject);
procedure acClearContentExecute(Sender: TObject);
procedure JvMultiHttpGrabber1DoneFile(Sender: TObject;
UserData: Integer; FileName: String; FileSize: Integer; Url: String);
procedure acSaveToFileExecute(Sender: TObject);
private
{ Private declarations }
procedure LoadSettings;
procedure SaveSettings;
function GetColor(UserData:integer):TColor;
function MakeFileName(URL:string):string;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
IniFiles, JvTypes;
{$R *.dfm}
procedure TForm1.JvMultiHttpGrabber1ClosedConnection(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Closed Connection to %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1ClosingConnection(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Closing Connection to %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1ConnectedToServer(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Connected to %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1ConnectingToServer(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Connecting to %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1DoneStream(Sender: TObject;
UserData: Integer; Stream: TStream; StreamSize: Integer;
Url: String);
var S:String;
begin
reLog.Lines.Add(Format('Download complete from %s',[Url]));
// Stream.Seek(0,soFromBeginning); // (p3) not needed, already reset
if UserData < 0 then // single download
begin
reContent.DefAttributes.Color := GetColor(UserData);
reContent.Lines.LoadFromStream(Stream);
reContent.Lines.Insert(0,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ' + Url + ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>');
end
else if StreamSize > 0 then // multi download
begin
SetLength(S,StreamSize);
Stream.Read(S[1],StreamSize);
reContent.SelAttributes.Color := GetColor(UserData);
reContent.SelText := #13#10'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ' + Url + ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' + #13#10 + S;
end;
pbProgress.Position := 0;
sbMain.Panels[1].Text := ' Ready';
end;
procedure TForm1.JvMultiHttpGrabber1Error(Sender: TObject;
UserData: Integer; Url, Error: String);
begin
reLog.Lines.Add(Format('Error at %s:'#13#10'%s',[Url, Error]));
end;
procedure TForm1.JvMultiHttpGrabber1Progress(Sender: TObject; UserData,
Position, TotalSize: Integer; Url: String; var Continue: Boolean);
begin
if TotalSize > 0 then
pbProgress.Max := TotalSize
else
pbProgress.Max := Position;
pbProgress.Position := Position;
sbMain.Panels[1].Text := Format(' %dkB of %dkB completed',[Position div 1024, pbProgress.Max div 1024]);
// pbProgress.Visible := Position > 0;
pbProgress.Update;
sbMain.Update;
end;
procedure TForm1.JvMultiHttpGrabber1ReceivedResponse(Sender: TObject;
UserData: Integer; Url: String; DataSize: Integer);
begin
reLog.Lines.Add(Format('Size of %s is %d',[Url, DataSize]));
end;
procedure TForm1.JvMultiHttpGrabber1ReceivingResponse(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Recieving response from %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1Redirect(Sender: TObject;
UserData: Integer; Url, NewUrl: String);
begin
reLog.Lines.Add(Format('Redirected from %s to %s',[Url, NewUrl]));
end;
procedure TForm1.JvMultiHttpGrabber1RequestComplete(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Request completed on %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1RequestSent(Sender: TObject;
UserData: Integer; Url: String; DataSize: Integer);
begin
reLog.Lines.Add(Format('Request sent to %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1ResolvedName(Sender: TObject;
UserData: Integer; Url, Name: String);
begin
reLog.Lines.Add(Format('Name %s resolved on %s',[Name, Url]));
end;
procedure TForm1.JvMultiHttpGrabber1ResolvingName(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Resolving %s',[Url]));
end;
procedure TForm1.JvMultiHttpGrabber1SendingRequest(Sender: TObject;
UserData: Integer; Url: String);
begin
reLog.Lines.Add(Format('Sending request to %s',[Url]));
end;
function TForm1.GetColor(UserData: integer): TColor;
const
cDataColorCount = 10;
cDataColors:array [0..cDataColorCount-1] of TColor =
(clMaroon, clNavy, clRed, clBlue, clPurple, clBlack, clGray, clTeal, clGreen, clOlive);
begin
if UserData < 0 then
Result := cDataColors[0]
else
Result := cDataColors[UserData mod cDataColorCount];
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
LoadSettings;
pbProgress.Parent := sbMain;
end;
procedure TForm1.sbMainResize(Sender: TObject);
begin
pbProgress.SetBounds(2,2,sbMain.Panels[0].Width - 2,sbMain.ClientHeight - 2);
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
SaveSettings;
end;
procedure TForm1.LoadSettings;
begin
with TIniFile.Create(ChangeFileExt(Application.Exename, '.ini')) do
try
if SectionExists('URL History') then // reset to default if key doesn't exist
begin
ReadSection('URL History',cbURL.Items);
cbURL.ItemIndex := 0;
acSaveToFile.Checked := ReadBool('Settings','Save To File',acSaveToFile.Checked);
end;
finally
Free;
end;
reContent.WordWrap := true;
end;
procedure TForm1.SaveSettings;
var i:integer;
begin
with TIniFile.Create(ChangeFileExt(Application.Exename, '.ini')) do
try
EraseSection('URL History');
for i := 0 to cbURL.Items.Count - 1 do
WriteString('URL History',cbURL.Items[i],'');
WriteBool('Settings','Save To File',acSaveToFile.Checked);
finally
Free;
end;
end;
procedure TForm1.acDownloadExecute(Sender: TObject);
begin
reContent.WordWrap := false;
pbProgress.Position := 0;
sbMain.Panels[1].Text := '';
acURLAdd.Execute;
if acSaveToFile.Checked then
JvMultiHttpGrabber1.OutputMode := omFile
else
JvMultiHttpGrabber1.OutputMode := omStream;
JvMultiHttpGrabber1.Url := cbURL.Text;
JvMultiHttpGrabber1.Filename := MakeFileName(cbURL.Text);
JvMultiHttpGrabber1.Download(-1);
end;
procedure TForm1.acDownloadAllExecute(Sender: TObject);
var i:integer;
begin
reContent.WordWrap := false;
acClearContent.Execute;
acURLAdd.Execute;
if acSaveToFile.Checked then
JvMultiHttpGrabber1.OutputMode := omFile
else
JvMultiHttpGrabber1.OutputMode := omStream;
for i := 0 to cbURL.Items.Count - 1 do
begin
JvMultiHttpGrabber1.Url := cbURL.Items[i];
JvMultiHttpGrabber1.Filename := MakeFileName(cbURL.Items[i]);
JvMultiHttpGrabber1.Download(i);
end;
end;
procedure TForm1.acMainActionsUpdate(Action: TBasicAction;
var Handled: Boolean);
begin
if JvMultiHttpGrabber1.Working then
Screen.Cursor := crAppStart
else
Screen.Cursor := crDefault;
acDownload.Enabled := (cbURL.Text <> '') and not JvMultiHttpGrabber1.Working;
acDownloadAll.Enabled := cbURL.Items.Count > 1;
// pbProgress.Visible := JvMultiHttpGrabber1.Working;
acURLAdd.Enabled := cbURL.Text <> '';
acURLDelete.Enabled := acURLAdd.Enabled;
end;
procedure TForm1.acURLAddExecute(Sender: TObject);
begin
if cbURL.Items.IndexOf(cbURL.Text) < 0 then
cbURL.Items.Add(cbURL.Text);
end;
procedure TForm1.acURLDeleteExecute(Sender: TObject);
var i:integer;
begin
i := cbURL.Items.IndexOf(cbURL.Text);
if i >= 0 then cbURL.Items.Delete(i);
cbURL.Text := '';
if i >= cbURL.Items.Count then Dec(i);
if cbURL.ItemIndex < 0 then
cbURL.ItemIndex := i;
end;
procedure TForm1.acClearLogExecute(Sender: TObject);
begin
reLog.Clear;
end;
procedure TForm1.acClearContentExecute(Sender: TObject);
begin
reContent.Clear;
end;
procedure TForm1.JvMultiHttpGrabber1DoneFile(Sender: TObject;
UserData: Integer; FileName: String; FileSize: Integer; Url: String);
begin
reLog.Lines.Add(Format('%s was saved to file %s',[Url, Filename]));
pbProgress.Position := 0;
end;
function TForm1.MakeFileName(URL: string): string;
var i:integer;
begin
if Pos('http://',AnsiLowerCase(URL)) = 1 then
i := Length('http://') + 1
else
i := 1;
Result := '';
while i <= Length(URL) do
begin
if URL[i] in [':','/','.'] then
Result := Result + '_'
else
Result := Result + URL[i];
Inc(i);
end;
if Result = '' then
Result := 'default.htm';
Result := ExtractFilePath(Application.ExeName) + ChangeFileExt(Result,'.htm');
end;
procedure TForm1.acSaveToFileExecute(Sender: TObject);
begin
acSaveToFile.Checked := not acSaveToFile.Checked;
end;
end.