Add feature 1769207 "Automatic Software Update":

Implements a simple dialog which tells the user if there is some new release or nightly build available. Parses http://www.heidisql.com/updatecheck.php as a .ini file. Download buttons just start the webbrowser currently.
Todo: Automatic invocation of this dialog at regular intervals (for example once a week)
Todo: Automatic download + update + restart
This commit is contained in:
Ansgar Becker
2008-02-10 23:29:39 +00:00
parent 52c85ddabc
commit 638b69ea85
9 changed files with 408 additions and 16 deletions

View File

@ -34,7 +34,8 @@ uses
column_selection in '..\..\source\column_selection.pas' {ColumnSelectionForm}, column_selection in '..\..\source\column_selection.pas' {ColumnSelectionForm},
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm}, data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm}, runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm},
createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm}; createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm},
updatecheck in '..\..\source\updatecheck.pas' {frmUpdateCheck};
{$R *.RES} {$R *.RES}

View File

@ -34,7 +34,8 @@ uses
column_selection in '..\..\source\column_selection.pas' {ColumnSelectionForm}, column_selection in '..\..\source\column_selection.pas' {ColumnSelectionForm},
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm}, data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm}, runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm},
createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm}; createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm},
updatecheck in '..\..\source\updatecheck.pas' {frmUpdateCheck};
{$R *.RES} {$R *.RES}

View File

@ -134,6 +134,9 @@
<Form>tbl_properties_form</Form> <Form>tbl_properties_form</Form>
</DCCReference> </DCCReference>
<DCCReference Include="..\..\source\threading.pas" /> <DCCReference Include="..\..\source\threading.pas" />
<DCCReference Include="..\..\source\updatecheck.pas">
<Form>frmUpdateCheck</Form>
</DCCReference>
<DCCReference Include="..\..\source\usermanager.pas"> <DCCReference Include="..\..\source\usermanager.pas">
<Form>UserManagerForm</Form> <Form>UserManagerForm</Form>
</DCCReference> </DCCReference>

BIN
res/arrow_refresh.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

View File

@ -98,7 +98,7 @@ begin
Screen.Cursor := crHourGlass; Screen.Cursor := crHourGlass;
// App-Version // App-Version
LabelVersion.Caption := 'Version ' + appversion; LabelVersion.Caption := FullAppVersion;
// Compile-date // Compile-date
FileAge(ParamStr(0), Compiled); FileAge(ParamStr(0), Compiled);

View File

@ -562,6 +562,10 @@ object MainForm: TMainForm
object N8: TMenuItem object N8: TMenuItem
Caption = '-' Caption = '-'
end end
object menuUpdateCheck: TMenuItem
Caption = 'Check for updates ...'
OnClick = menuUpdateCheckClick
end
object menuWebsite: TMenuItem object menuWebsite: TMenuItem
Tag = 56 Tag = 56
Caption = 'HeidiSQL Website' Caption = 'HeidiSQL Website'

View File

@ -141,6 +141,7 @@ type
N8: TMenuItem; N8: TMenuItem;
Import1: TMenuItem; Import1: TMenuItem;
ToolButton1: TToolButton; ToolButton1: TToolButton;
menuUpdateCheck: TMenuItem;
procedure btnSQLHelpClick(Sender: TObject); procedure btnSQLHelpClick(Sender: TObject);
procedure menuWindowClick(Sender: TObject); procedure menuWindowClick(Sender: TObject);
procedure focusWindow(Sender: TObject); procedure focusWindow(Sender: TObject);
@ -198,6 +199,7 @@ type
procedure HandleWMCopyData(var msg: TWMCopyData); message WM_COPYDATA; procedure HandleWMCopyData(var msg: TWMCopyData); message WM_COPYDATA;
procedure HandleWMProcessLog(var msg: TMessage); message WM_PROCESSLOG; procedure HandleWMProcessLog(var msg: TMessage); message WM_PROCESSLOG;
procedure HandleWMClearRightClickPointer(var msg: TMessage); message WM_CLEAR_RIGHTCLICK_POINTER; procedure HandleWMClearRightClickPointer(var msg: TMessage); message WM_CLEAR_RIGHTCLICK_POINTER;
procedure menuUpdateCheckClick(Sender: TObject);
private private
regMain : TRegistry; regMain : TRegistry;
function GetChildwin: TMDIChild; function GetChildwin: TMDIChild;
@ -221,7 +223,9 @@ var
StatusText : String = 'Initializing...'; StatusText : String = 'Initializing...';
StatusIconIndex : Integer = 43; StatusIconIndex : Integer = 43;
loadsqlfile : boolean = true; // load sql-file into query-memo at startup? loadsqlfile : boolean = true; // load sql-file into query-memo at startup?
appversion : String = 'x.y $Rev$'; AppVersion : String = 'x.y';
AppRevision : String = '$Rev$';
FullAppVersion : String;
DirnameCommonAppData, DirnameCommonAppData,
DirnameUserAppData, DirnameUserAppData,
DIRNAME_SNIPPETS, DIRNAME_SNIPPETS,
@ -260,7 +264,8 @@ uses
Helpers, Helpers,
Threading, Threading,
mysql_structures, mysql_structures,
MysqlConn; MysqlConn,
UpdateCheck;
{$R *.DFM} {$R *.DFM}
@ -448,14 +453,16 @@ begin
ToolBarStandard.Top := GetRegValue(REGNAME_TOOLBAR2TOP, ToolBarStandard.Top); ToolBarStandard.Top := GetRegValue(REGNAME_TOOLBAR2TOP, ToolBarStandard.Top);
ToolBarData.Top := GetRegValue(REGNAME_TOOLBARDATATOP, ToolBarData.Top); ToolBarData.Top := GetRegValue(REGNAME_TOOLBARDATATOP, ToolBarData.Top);
// Beautify appversion // Beautify AppRevision
if Pos('$Rev: WC', appversion) < 1 then begin if Pos('$Rev: WC', AppRevision) < 1 then
appversion := Copy(appversion, 1, Pos('$Rev', appversion) + 4); AppRevision := 'unknown'
appversion := appversion + ' unknown'; else begin
end else appversion := StringReplace(appversion, 'WC ', '', []); AppRevision := StringReplace( AppRevision, '$Rev: WC', '', [rfIgnoreCase] );
appversion := StringReplace( appversion, '$Rev', 'Revision', [rfIgnoreCase] ); AppRevision := StringReplace( AppRevision, '$', '', [] );
appversion := StringReplace( appversion, '$', '', [] ); AppRevision := Trim( AppRevision );
appversion := Trim( appversion ); end;
// Compose full version string
FullAppVersion := 'Version ' + AppVersion + ', Revision ' + AppRevision;
// "All users" folder for HeidiSQL's data (All Users\Application Data) // "All users" folder for HeidiSQL's data (All Users\Application Data)
DirnameCommonAppData := GetShellFolder(CSIDL_COMMON_APPDATA) + '\' + APPNAME + '\'; DirnameCommonAppData := GetShellFolder(CSIDL_COMMON_APPDATA) + '\' + APPNAME + '\';
@ -718,9 +725,9 @@ procedure TMainForm.CopyHTMLtableExecute(Sender: TObject);
begin begin
// Copy data in actual dataset as HTML // Copy data in actual dataset as HTML
if ChildWin.PageControlMain.ActivePage = ChildWin.tabData then if ChildWin.PageControlMain.ActivePage = ChildWin.tabData then
dataset2html(ChildWin.GetVisualDataset(), TZQuery(ChildWin.GetVisualDataset()).Sql.Text, '', ChildWin.prefConvertHTMLEntities, APPNAME + ' ' + appversion ) dataset2html(ChildWin.GetVisualDataset(), TZQuery(ChildWin.GetVisualDataset()).Sql.Text, '', ChildWin.prefConvertHTMLEntities, APPNAME + ' ' + FullAppVersion )
else if ChildWin.PageControlMain.ActivePage = ChildWin.tabQuery then else if ChildWin.PageControlMain.ActivePage = ChildWin.tabQuery then
dataset2html(ChildWin.GetVisualDataset(), TZReadOnlyQuery(ChildWin.GetVisualDataset()).Sql.Text, '', ChildWin.prefConvertHTMLEntities, APPNAME + ' ' + appversion); dataset2html(ChildWin.GetVisualDataset(), TZReadOnlyQuery(ChildWin.GetVisualDataset()).Sql.Text, '', ChildWin.prefConvertHTMLEntities, APPNAME + ' ' + FullAppVersion);
end; end;
@ -941,7 +948,7 @@ begin
Screen.Cursor := crHourGlass; Screen.Cursor := crHourGlass;
case FilterIndex of case FilterIndex of
1 : dataset2csv(query, FieldSep, FieldEncl, LineSep, Filename); 1 : dataset2csv(query, FieldSep, FieldEncl, LineSep, Filename);
2 : dataset2html(query, FileName, FileName, ConvertHTMLSpecialChars, APPNAME+' '+appversion); 2 : dataset2html(query, FileName, FileName, ConvertHTMLSpecialChars, APPNAME+' '+FullAppVersion);
3 : dataset2xml(query, FileName, FileName); 3 : dataset2xml(query, FileName, FileName);
end; end;
ChildWin.prefCSVSeparator := FieldSep; ChildWin.prefCSVSeparator := FieldSep;
@ -1266,5 +1273,13 @@ begin
ShowStatus( STATUS_MSG_READY, 2 ); ShowStatus( STATUS_MSG_READY, 2 );
end; end;
procedure TMainForm.menuUpdateCheckClick(Sender: TObject);
var
frm : TfrmUpdateCheck;
begin
frm := TfrmUpdateCheck.Create(Self);
frm.ShowModal;
FreeAndNil(frm);
end;
end. end.

218
source/updatecheck.dfm Normal file
View File

@ -0,0 +1,218 @@
object frmUpdateCheck: TfrmUpdateCheck
Left = 0
Top = 0
BorderStyle = bsDialog
Caption = 'Check for updates ...'
ClientHeight = 176
ClientWidth = 294
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnShow = FormShow
DesignSize = (
294
176)
PixelsPerInch = 96
TextHeight = 13
object lblStatus: TLabel
Left = 40
Top = 16
Width = 236
Height = 51
Anchors = [akLeft, akTop, akRight, akBottom]
AutoSize = False
Caption = 'lblStatus'
end
object Image1: TImage
Left = 16
Top = 16
Width = 18
Height = 17
Picture.Data = {
0954474946496D61676547494638396110001000F70000296B21296B29297329
317B29397331398431398439427342428439428C394294394A8C424A94424A9C
42528C4A52944A529C4A529C5252A54A5A94525A9C525AA552638C5A638C6363
946363A55A63AD5A6BAD6373946B73B56373B56B73BD6B7B9C7B7BBD6B7BBD73
7BBD7B7BC66B7BC67384A58484BD7B84C67B84C6848CAD848CAD8C8CB5848CB5
8C8CC6848CCE8494AD8C94BD9494CE8494CE8C9CB59C9CBD9C9CC6949CCE949C
D694A5CE9CA5D69CADC6ADADCEA5ADCEADADD6A5B5CEADB5CEB5B5D6B5B5DEAD
B5DEB5BDD6B5BDDEB5BDDEBDCEDECEDEEFDEE7EFE7EFF7EFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21F9040100004B002C
000000001000100087296B21296B29297329317B293973313984313984394273
42428439428C394294394A8C424A94424A9C42528C4A52944A529C4A529C5252
A54A5A94525A9C525AA552638C5A638C6363946363A55A63AD5A6BAD6373946B
73B56373B56B73BD6B7B9C7B7BBD6B7BBD737BBD7B7BC66B7BC67384A58484BD
7B84C67B84C6848CAD848CAD8C8CB5848CB58C8CC6848CCE8494AD8C94BD9494
CE8494CE8C9CB59C9CBD9C9CC6949CCE949CD694A5CE9CA5D69CADC6ADADCEA5
ADCEADADD6A5B5CEADB5CEB5B5D6B5B5DEADB5DEB5BDD6B5BDDEB5BDDEBDCEDE
CEDEEFDEE7EFE7EFF7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF08AD0097081C389007C1830833B040B844C990141A1A30
484021828A83485C84403163860B1728442C58315009C81B1F419E10F1018189
81413E7444416180000008108020B8D2C508072D061EE07090C244043108922C
322408901F4F7FECD8B14408C11C0F121440701087888136289C40B10103411D
213E48902836E4021A037D84C071C323C80F2228604812B7434790283C644070
E1C8411B19281418108080051A7C11B298C0B032DCCA01010021F9040100004B
002C000000001000100087296B21296B29297329317B29397331398431398439
427342428439428C394294394A8C424A94424A9C42528C4A52944A529C4A529C
5252A54A5A94525A9C525AA552638C5A638C6363946363A55A63AD5A6BAD6373
946B73B56373B56B73BD6B7B9C7B7BBD6B7BBD737BBD7B7BC66B7BC67384A584
84BD7B84C67B84C6848CAD848CAD8C8CB5848CB58C8CC6848CCE8494AD8C94BD
9494CE8494CE8C9CB59C9CBD9C9CC6949CCE949CD694A5CE9CA5D69CADC6ADAD
CEA5ADCEADADD6A5B5CEADB5CEB5B5D6B5B5DEADB5DEB5BDD6B5BDDEB5BDDEBD
CEDECEDEEFDEE7EFE7EFF7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFF08AD0097081C389007C1830833B040B844C990141A
1A30484021828A83485C84403163860B1728442C58315009C81B1F419E10F101
818981413E7444416180000008108020B8D2C508072D061EE07090C244043108
922C322408901F4F7FECD8B14408C11C0F121440701087888136289C40B10103
411D213E48902836E4021A037D84C071C323C80F2228604812B7434790283C64
4070E1C8411B19281418108080051A7C11B298C0B032DCCA01010021F9040100
004B002C000000001000100087296B21296B29297329317B2939733139843139
8439427342428439428C394294394A8C424A94424A9C42528C4A52944A529C4A
529C5252A54A5A94525A9C525AA552638C5A638C6363946363A55A63AD5A6BAD
6373946B73B56373B56B73BD6B7B9C7B7BBD6B7BBD737BBD7B7BC66B7BC67384
A58484BD7B84C67B84C6848CAD848CAD8C8CB5848CB58C8CC6848CCE8494AD8C
94BD9494CE8494CE8C9CB59C9CBD9C9CC6949CCE949CD694A5CE9CA5D69CADC6
ADADCEA5ADCEADADD6A5B5CEADB5CEB5B5D6B5B5DEADB5DEB5BDD6B5BDDEB5BD
DEBDCEDECEDEEFDEE7EFE7EFF7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF08AD0097081C389007C1830833B040B844C990
141A1A30484021828A83485C84403163860B1728442C58315009C81B1F419E10
F101818981413E7444416180000008108020B8D2C508072D061EE07090C24404
3108922C322408901F4F7FECD8B14408C11C0F121440701087888136289C40B1
0103411D213E48902836E4021A037D84C071C323C80F2228604812B743479028
3C644070E1C8411B19281418108080051A7C11B298C0B032DCCA01010021F904
0100004B002C000000001000100087296B21296B29297329317B293973313984
31398439427342428439428C394294394A8C424A94424A9C42528C4A52944A52
9C4A529C5252A54A5A94525A9C525AA552638C5A638C6363946363A55A63AD5A
6BAD6373946B73B56373B56B73BD6B7B9C7B7BBD6B7BBD737BBD7B7BC66B7BC6
7384A58484BD7B84C67B84C6848CAD848CAD8C8CB5848CB58C8CC6848CCE8494
AD8C94BD9494CE8494CE8C9CB59C9CBD9C9CC6949CCE949CD694A5CE9CA5D69C
ADC6ADADCEA5ADCEADADD6A5B5CEADB5CEB5B5D6B5B5DEADB5DEB5BDD6B5BDDE
B5BDDEBDCEDECEDEEFDEE7EFE7EFF7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08AD0097081C389007C1830833B040B844
C990141A1A30484021828A83485C84403163860B1728442C58315009C81B1F41
9E10F101818981413E7444416180000008108020B8D2C508072D061EE07090C2
44043108922C322408901F4F7FECD8B14408C11C0F121440701087888136289C
40B10103411D213E48902836E4021A037D84C071C323C80F2228604812B74347
90283C644070E1C8411B19281418108080051A7C11B298C0B032DCCA0101003B}
Transparent = True
end
object btnRelease: TButton
Left = 16
Top = 73
Width = 260
Height = 25
Anchors = [akLeft, akRight, akBottom]
Caption = 'Download new release'
ModalResult = 1
TabOrder = 0
OnClick = btnReleaseClick
end
object btnBuild: TButton
Left = 16
Top = 104
Width = 260
Height = 25
Anchors = [akLeft, akRight, akBottom]
Caption = 'Download nightly build'
ModalResult = 1
TabOrder = 1
OnClick = btnBuildClick
end
object btnCancel: TButton
Left = 16
Top = 135
Width = 260
Height = 25
Anchors = [akLeft, akRight, akBottom]
Cancel = True
Caption = 'Cancel'
Default = True
ModalResult = 2
TabOrder = 2
end
end

150
source/updatecheck.pas Normal file
View File

@ -0,0 +1,150 @@
unit updatecheck;
interface
uses
Windows, Messages, SysUtils, Classes, Forms,
Dialogs, StdCtrls, ExtActns, IniFiles, Controls, ExtCtrls, GIFImg;
type
TfrmUpdateCheck = class(TForm)
btnRelease: TButton;
btnBuild: TButton;
lblStatus: TLabel;
btnCancel: TButton;
Image1: TImage;
procedure btnBuildClick(Sender: TObject);
procedure btnReleaseClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
d : TDownLoadURL;
ReleaseURL, BuildURL : String;
procedure Status(txt: String);
procedure ReadCheckFile;
public
{ Public declarations }
end;
implementation
uses helpers, main;
{$R *.dfm}
{$I const.inc}
{**
Update status text
}
procedure TfrmUpdateCheck.Status(txt: String);
begin
lblStatus.Caption := txt;
Repaint;
end;
{**
Download check file
}
procedure TfrmUpdateCheck.FormShow(Sender: TObject);
var
TempPath: array[0..MAX_PATH] of Char;
begin
Status('Initiating ... ');
Caption := 'Check for '+APPNAME+' updates ...';
// Detect temp directory
GetTempPath(MAX_PATH, @TempPath);
// Initially hide download buttons
btnRelease.Enabled := False;
btnBuild.Enabled := False;
btnCancel.Enabled := False;
d := TDownLoadURL.Create(Self);
d.URL := APPDOMAIN + 'updatecheck.php';
// Todo: find a better temp directory
d.Filename := StrPas(TempPath) + APPNAME + '_updatecheck.ini';
Screen.Cursor := crHourglass;
Status('Downloading check file '+d.URL+' ... ');
try
// Download the check file
d.ExecuteTarget(nil);
ReadCheckFile;
DeleteFile(d.Filename);
finally
FreeAndNil(d);
Screen.Cursor := crDefault;
btnCancel.Enabled := True;
end;
end;
{**
Parse check file for updated version + release
}
procedure TfrmUpdateCheck.ReadCheckFile;
var
Ini : TIniFile;
ReleaseVersion, BuildRevision, statustxt : String;
const
INISECT_RELEASE = 'Release';
INISECT_BUILD = 'Build';
begin
Status('Reading check file ...');
statustxt := 'No update available.';
// Read [Release] section of check file
Ini := TIniFile.Create(d.Filename);
if Ini.SectionExists(INISECT_RELEASE) then begin
ReleaseVersion := Ini.ReadString(INISECT_RELEASE, 'Version', 'unknown');
ReleaseURL := Ini.ReadString(INISECT_RELEASE, 'URL', '');
statustxt := 'Release available: Version ' + ReleaseVersion + ' (yours: '+AppVersion+')' + CRLF;
btnRelease.Caption := 'Download version ' + ReleaseVersion;
// Enable the download button if the current version is outdated
btnRelease.Enabled := ReleaseVersion <> AppVersion;
end;
// Read [Build] section of check file
if Ini.SectionExists(INISECT_BUILD) then begin
BuildRevision := Ini.ReadString(INISECT_BUILD, 'Revision', 'unknown');
BuildURL := Ini.ReadString(INISECT_BUILD, 'URL', '');
statustxt := statustxt + 'Build available: Revision ' + BuildRevision + ' (yours: '+AppRevision+')' + CRLF;
btnBuild.Caption := 'Download build ' + BuildRevision;
// A new release should have priority over a new nightly build.
// So the user should not be able to download a newer build here
// before having installed the new release.
btnBuild.Enabled := (BuildRevision <> AppRevision) and (not btnRelease.Enabled);
end;
// Display summary
Status(statustxt);
end;
{**
Download release installer via web browser
}
procedure TfrmUpdateCheck.btnReleaseClick(Sender: TObject);
begin
ShellExec(ReleaseURL);
end;
{**
Download latest build via web browser
TODO: internally replace heidisql.exe:
1. create a batch file which replaces heidisql.exe
2. quit Heidi
3. start the batch
4. start Heidi
}
procedure TfrmUpdateCheck.btnBuildClick(Sender: TObject);
begin
ShellExec(ReleaseURL);
end;
end.