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 @@
tbl_properties_form
+ +
frmUpdateCheck
+
UserManagerForm
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.