diff --git a/packages/delphi10/heidisql.dpr b/packages/delphi10/heidisql.dpr
index f9ac8ebc..c43edcfc 100644
--- a/packages/delphi10/heidisql.dpr
+++ b/packages/delphi10/heidisql.dpr
@@ -34,7 +34,8 @@ uses
column_selection in '..\..\source\column_selection.pas' {ColumnSelectionForm},
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
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}
diff --git a/packages/delphi11/heidisql.dpr b/packages/delphi11/heidisql.dpr
index f9ac8ebc..c43edcfc 100644
--- a/packages/delphi11/heidisql.dpr
+++ b/packages/delphi11/heidisql.dpr
@@ -34,7 +34,8 @@ uses
column_selection in '..\..\source\column_selection.pas' {ColumnSelectionForm},
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
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}
diff --git a/packages/delphi11/heidisql.dproj b/packages/delphi11/heidisql.dproj
index 450dccce..bd709571 100644
--- a/packages/delphi11/heidisql.dproj
+++ b/packages/delphi11/heidisql.dproj
@@ -134,6 +134,9 @@
+
+
+
diff --git a/res/arrow_refresh.gif b/res/arrow_refresh.gif
new file mode 100644
index 00000000..7b673bc8
Binary files /dev/null and b/res/arrow_refresh.gif differ
diff --git a/source/about.pas b/source/about.pas
index ba234ab0..44c4f1a3 100644
--- a/source/about.pas
+++ b/source/about.pas
@@ -98,7 +98,7 @@ begin
Screen.Cursor := crHourGlass;
// App-Version
- LabelVersion.Caption := 'Version ' + appversion;
+ LabelVersion.Caption := FullAppVersion;
// Compile-date
FileAge(ParamStr(0), Compiled);
diff --git a/source/main.dfm b/source/main.dfm
index d5ea5321..e8274328 100644
--- a/source/main.dfm
+++ b/source/main.dfm
@@ -562,6 +562,10 @@ object MainForm: TMainForm
object N8: TMenuItem
Caption = '-'
end
+ object menuUpdateCheck: TMenuItem
+ Caption = 'Check for updates ...'
+ OnClick = menuUpdateCheckClick
+ end
object menuWebsite: TMenuItem
Tag = 56
Caption = 'HeidiSQL Website'
diff --git a/source/main.pas b/source/main.pas
index a27f07c0..98cf3589 100644
--- a/source/main.pas
+++ b/source/main.pas
@@ -141,6 +141,7 @@ type
N8: TMenuItem;
Import1: TMenuItem;
ToolButton1: TToolButton;
+ menuUpdateCheck: TMenuItem;
procedure btnSQLHelpClick(Sender: TObject);
procedure menuWindowClick(Sender: TObject);
procedure focusWindow(Sender: TObject);
@@ -198,6 +199,7 @@ type
procedure HandleWMCopyData(var msg: TWMCopyData); message WM_COPYDATA;
procedure HandleWMProcessLog(var msg: TMessage); message WM_PROCESSLOG;
procedure HandleWMClearRightClickPointer(var msg: TMessage); message WM_CLEAR_RIGHTCLICK_POINTER;
+ procedure menuUpdateCheckClick(Sender: TObject);
private
regMain : TRegistry;
function GetChildwin: TMDIChild;
@@ -221,7 +223,9 @@ var
StatusText : String = 'Initializing...';
StatusIconIndex : Integer = 43;
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,
DirnameUserAppData,
DIRNAME_SNIPPETS,
@@ -260,7 +264,8 @@ uses
Helpers,
Threading,
mysql_structures,
- MysqlConn;
+ MysqlConn,
+ UpdateCheck;
{$R *.DFM}
@@ -448,14 +453,16 @@ begin
ToolBarStandard.Top := GetRegValue(REGNAME_TOOLBAR2TOP, ToolBarStandard.Top);
ToolBarData.Top := GetRegValue(REGNAME_TOOLBARDATATOP, ToolBarData.Top);
- // Beautify appversion
- if Pos('$Rev: WC', appversion) < 1 then begin
- appversion := Copy(appversion, 1, Pos('$Rev', appversion) + 4);
- appversion := appversion + ' unknown';
- end else appversion := StringReplace(appversion, 'WC ', '', []);
- appversion := StringReplace( appversion, '$Rev', 'Revision', [rfIgnoreCase] );
- appversion := StringReplace( appversion, '$', '', [] );
- appversion := Trim( appversion );
+ // Beautify AppRevision
+ if Pos('$Rev: WC', AppRevision) < 1 then
+ AppRevision := 'unknown'
+ else begin
+ AppRevision := StringReplace( AppRevision, '$Rev: WC', '', [rfIgnoreCase] );
+ AppRevision := StringReplace( AppRevision, '$', '', [] );
+ AppRevision := Trim( AppRevision );
+ end;
+ // Compose full version string
+ FullAppVersion := 'Version ' + AppVersion + ', Revision ' + AppRevision;
// "All users" folder for HeidiSQL's data (All Users\Application Data)
DirnameCommonAppData := GetShellFolder(CSIDL_COMMON_APPDATA) + '\' + APPNAME + '\';
@@ -718,9 +725,9 @@ procedure TMainForm.CopyHTMLtableExecute(Sender: TObject);
begin
// Copy data in actual dataset as HTML
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
- 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;
@@ -941,7 +948,7 @@ begin
Screen.Cursor := crHourGlass;
case FilterIndex of
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);
end;
ChildWin.prefCSVSeparator := FieldSep;
@@ -1266,5 +1273,13 @@ begin
ShowStatus( STATUS_MSG_READY, 2 );
end;
+procedure TMainForm.menuUpdateCheckClick(Sender: TObject);
+var
+ frm : TfrmUpdateCheck;
+begin
+ frm := TfrmUpdateCheck.Create(Self);
+ frm.ShowModal;
+ FreeAndNil(frm);
+end;
end.
diff --git a/source/updatecheck.dfm b/source/updatecheck.dfm
new file mode 100644
index 00000000..47f5e8c5
--- /dev/null
+++ b/source/updatecheck.dfm
@@ -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
diff --git a/source/updatecheck.pas b/source/updatecheck.pas
new file mode 100644
index 00000000..d2a657e6
--- /dev/null
+++ b/source/updatecheck.pas
@@ -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.