diff --git a/components/lazautoupdate/latest_stable/trayicon/trayupdater.lpi b/components/lazautoupdate/latest_stable/trayicon/trayupdater.lpi index 010061774..4ee76a880 100644 --- a/components/lazautoupdate/latest_stable/trayicon/trayupdater.lpi +++ b/components/lazautoupdate/latest_stable/trayicon/trayupdater.lpi @@ -23,10 +23,10 @@ - + - + @@ -101,6 +101,9 @@ + + + @@ -143,6 +146,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/lazautoupdate/latest_stable/trayicon/trayupdater.lps b/components/lazautoupdate/latest_stable/trayicon/trayupdater.lps index c98753c2a..393862b9f 100644 --- a/components/lazautoupdate/latest_stable/trayicon/trayupdater.lps +++ b/components/lazautoupdate/latest_stable/trayicon/trayupdater.lps @@ -3,16 +3,17 @@ - + + - - - + + + @@ -21,14 +22,18 @@ - - - + + + + + + + - + - + @@ -41,9 +46,8 @@ - - - + + @@ -251,126 +255,129 @@ + + + - - + + - - + + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - - + + - + diff --git a/components/lazautoupdate/latest_stable/trayicon/trayupdater.res b/components/lazautoupdate/latest_stable/trayicon/trayupdater.res index 423561923..fa455fa74 100644 Binary files a/components/lazautoupdate/latest_stable/trayicon/trayupdater.res and b/components/lazautoupdate/latest_stable/trayicon/trayupdater.res differ diff --git a/components/lazautoupdate/latest_stable/trayicon/uconfigform.lfm b/components/lazautoupdate/latest_stable/trayicon/uconfigform.lfm index e8911427f..91569242d 100644 --- a/components/lazautoupdate/latest_stable/trayicon/uconfigform.lfm +++ b/components/lazautoupdate/latest_stable/trayicon/uconfigform.lfm @@ -172,7 +172,6 @@ object configform: Tconfigform ClientHeight = 223 ClientWidth = 600 TabOrder = 1 - OnClick = grp_updateintervalClick object cmd_Close: TBitBtn Left = 228 Height = 30 diff --git a/components/lazautoupdate/latest_stable/trayicon/uconfigform.pas b/components/lazautoupdate/latest_stable/trayicon/uconfigform.pas index a027965d4..eac5c5cbc 100644 --- a/components/lazautoupdate/latest_stable/trayicon/uconfigform.pas +++ b/components/lazautoupdate/latest_stable/trayicon/uconfigform.pas @@ -1,77 +1,96 @@ unit uconfigform; +{ LazAutoUpdater Tray Updater + Copyright (C)2014 Gordon Bamber minesadorada@charcodelvalle.com + + An example of using LazAutoUpdate as a silent updater + + This source is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This code is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + A copy of the GNU General Public License is available on the World Wide Web + at . You can also obtain it by writing + to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. +} {$mode objfpc}{$H+} interface uses -Classes, SysUtils, FileUtil, Forms, Controls, Dialogs, Buttons, -StdCtrls, EditBtn; + SysUtils, Forms, Controls, Dialogs, Buttons, + StdCtrls, EditBtn; type -{ Tconfigform } + { Tconfigform } -Tconfigform = class(TForm) - cmd_DeleteAppProfile: TButton; - cmd_SaveChanges: TBitBtn; - chk_Update: TCheckBox; - cmb_IntervalDate: TComboBox; - cmb_IntervalHour: TComboBox; - cmb_IntervalDay: TComboBox; - cmd_Close: TBitBtn; - cmd_NewAppProfile: TButton; - cmb_AppProfile: TComboBox; - cmb_IntervalType: TComboBox; - edt_INIPath: TEdit; - edt_AppPath: TFileNameEdit; - edt_AppVersion: TEdit; - edt_SFUpdatesDirectory: TEdit; - edt_ZipPath: TEdit; - edt_SFProjectName: TEdit; - grp_updateinterval: TGroupBox; - grp_configapp: TGroupBox; - lbl_LastUpdated: TLabel; - lbl_AppVersion: TLabel; - lbl_AppProfile: TLabel; - lbl_AppPath: TLabel; - lbl_INIPath: TLabel; - lbl_IntervalDate: TLabel; - lbl_SFUpdatesDirectory: TLabel; - lbl_IntervalType: TLabel; - lbl_SFUpdatesDirectory2: TLabel; - lbl_IntervalDay: TLabel; - lbl_ZipPath: TLabel; - lbl_SFProjectName: TLabel; - procedure chk_UpdateClick(Sender: TObject); - procedure cmb_AppProfileClick(Sender: TObject); - procedure cmb_AppProfileCloseUp(Sender: TObject); - procedure cmd_CloseClick(Sender: TObject); - procedure cmd_DeleteAppProfileClick(Sender: TObject); - procedure cmd_NewAppProfileClick(Sender: TObject); - procedure cmd_SaveChangesClick(Sender: TObject); - procedure cmb_IntervalTypeChange(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormShow(Sender: TObject); - procedure grp_updateintervalClick(Sender: TObject); -private - { private declarations } - procedure DoInitialiseCombobox; - procedure DoDisplayProfile(AIndex: integer); - procedure DoSaveAllChanges; - procedure DoEnableDisableIntervalCombos; -public - { public declarations } - bDetailsChanged: boolean; -end; + Tconfigform = class(TForm) + cmd_DeleteAppProfile: TButton; + cmd_SaveChanges: TBitBtn; + chk_Update: TCheckBox; + cmb_IntervalDate: TComboBox; + cmb_IntervalHour: TComboBox; + cmb_IntervalDay: TComboBox; + cmd_Close: TBitBtn; + cmd_NewAppProfile: TButton; + cmb_AppProfile: TComboBox; + cmb_IntervalType: TComboBox; + edt_INIPath: TEdit; + edt_AppPath: TFileNameEdit; + edt_AppVersion: TEdit; + edt_SFUpdatesDirectory: TEdit; + edt_ZipPath: TEdit; + edt_SFProjectName: TEdit; + grp_updateinterval: TGroupBox; + grp_configapp: TGroupBox; + lbl_LastUpdated: TLabel; + lbl_AppVersion: TLabel; + lbl_AppProfile: TLabel; + lbl_AppPath: TLabel; + lbl_INIPath: TLabel; + lbl_IntervalDate: TLabel; + lbl_SFUpdatesDirectory: TLabel; + lbl_IntervalType: TLabel; + lbl_SFUpdatesDirectory2: TLabel; + lbl_IntervalDay: TLabel; + lbl_ZipPath: TLabel; + lbl_SFProjectName: TLabel; + procedure chk_UpdateClick(Sender: TObject); + procedure cmb_AppProfileClick(Sender: TObject); + procedure cmb_AppProfileCloseUp(Sender: TObject); + procedure cmd_CloseClick(Sender: TObject); + procedure cmd_DeleteAppProfileClick(Sender: TObject); + procedure cmd_NewAppProfileClick(Sender: TObject); + procedure cmd_SaveChangesClick(Sender: TObject); + procedure cmb_IntervalTypeChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + private + { private declarations } + procedure DoInitialiseCombobox; + procedure DoDisplayProfile(AIndex: integer); + procedure DoSaveAllChanges; + procedure DoEnableDisableIntervalCombos; + public + { public declarations } + bDetailsChanged: boolean; + end; var -configform : Tconfigform; + configform: Tconfigform; implementation uses -umainform; + umainform; {$R *.lfm} @@ -79,14 +98,14 @@ umainform; procedure Tconfigform.FormCreate(Sender: TObject); begin - Icon := Application.Icon; + Icon := Application.Icon; Caption := 'Configure ' + Application.Title; end; procedure Tconfigform.DoSaveAllChanges; begin with mainform.AppRecArray[cmb_AppProfile.ItemIndex] do - begin + begin AppPath := edt_AppPath.Text; AppVersion := edt_AppVersion.Text; INIPath := edt_INIPath.Text; @@ -99,50 +118,50 @@ begin IntervalHour := cmb_IntervalHour.ItemIndex; Update := chk_Update.Checked; bDetailsChanged := True; - end; + end; end; procedure Tconfigform.DoDisplayProfile(AIndex: integer); begin with mainform.AppRecArray[AIndex] do - begin - edt_AppPath.Text := AppPath; + begin + edt_AppPath.Text := AppPath; edt_AppVersion.Text := AppVersion; - edt_INIPath.Text := INIPath; - edt_ZipPath.Text := ZipPath; + edt_INIPath.Text := INIPath; + edt_ZipPath.Text := ZipPath; edt_SFProjectName.Text := SFProjectName; edt_SFUpdatesDirectory.Text := SFUpdatesDirectory; cmb_IntervalType.ItemIndex := IntervalType; cmb_IntervalDay.ItemIndex := IntervalDay; cmb_IntervalDate.ItemIndex := IntervalDate; cmb_IntervalHour.ItemIndex := IntervalHour; - chk_Update.Checked := Update; + chk_Update.Checked := Update; lbl_LastUpdated.Caption := Format('Last successful update was %s', [FormatDateTime('c', LastCheckDateTime)]); DoEnableDisableIntervalCombos; - end; + end; end; procedure Tconfigform.DoEnableDisableIntervalCombos; begin case cmb_IntervalType.ItemIndex of 0: - begin - cmb_IntervalDay.Enabled := False; + begin + cmb_IntervalDay.Enabled := False; cmb_IntervalDate.Enabled := False; - end; + end; 1: - begin - cmb_IntervalDay.Enabled := True; + begin + cmb_IntervalDay.Enabled := True; cmb_IntervalDate.Enabled := False; - end; + end; 2: - begin - cmb_IntervalDay.Enabled := False; + begin + cmb_IntervalDay.Enabled := False; cmb_IntervalDate.Enabled := True; - end; - end; + end; + end; end; procedure Tconfigform.cmd_SaveChangesClick(Sender: TObject); @@ -164,7 +183,7 @@ end; procedure Tconfigform.chk_UpdateClick(Sender: TObject); begin mainform.AppRecArray[cmb_AppProfile.ItemIndex].Update := chk_Update.Checked; -// mainform.LongTimerArray[cmb_AppProfile.ItemIndex].Enabled := chk_Update.Checked; + // mainform.LongTimerArray[cmb_AppProfile.ItemIndex].Enabled := chk_Update.Checked; end; procedure Tconfigform.cmb_AppProfileClick(Sender: TObject); @@ -187,16 +206,16 @@ procedure Tconfigform.cmd_DeleteAppProfileClick(Sender: TObject); // Copy the temp copy back to AppRecArray // Delete the INIFile section var - TempAppRecArray : array of TAppRec; - i, iLastIndex : integer; + TempAppRecArray: array of TAppRec; + i, iLastIndex: integer; begin if High(mainform.AppRecArray) = 0 then - begin + begin MessageDlg(Application.Title, 'You cannot delete the only profile left', mtError, [mbOK], 0); exit; - end; + end; // Delete INI section mainform.INI.EraseSection( @@ -206,15 +225,15 @@ begin iLastIndex := -1; for i := Low(mainform.AppRecArray) to High(mainform.AppRecArray) do if (i <> cmb_AppProfile.ItemIndex) then - begin + begin Inc(iLastIndex); TempAppRecArray[iLastIndex] := mainform.AppRecArray[i]; - end; + end; SetLength(mainform.AppRecArray, High(TempAppRecArray) + 1); mainform.AppRecArray := TempAppRecArray; DoInitialiseCombobox; - cmb_AppProfile.ItemIndex := 0; + cmb_AppProfile.ItemIndex := 0; mainform.iCurrentRecIndex := 0; mainform.INI.WriteInteger('ProgramInfo', 'CurrentProfileIndex', mainform.iCurrentRecIndex); @@ -225,25 +244,25 @@ end; procedure Tconfigform.cmd_NewAppProfileClick(Sender: TObject); var - szProfileName : string; - iLastIndex : integer; + szProfileName: string; + iLastIndex: integer; begin if InputQuery('New Profile', 'New Profile', False, szProfileName) then - begin + begin iLastIndex := High(mainform.AppRecArray); SetLength(mainform.AppRecArray, iLastIndex + 2); iLastIndex := High(mainform.AppRecArray); mainform.AppRecArray[iLastIndex] := mainform.AppRecArray[iLastIndex - 1]; mainform.AppRecArray[iLastIndex].AppPrettyName := szProfileName; DoInitialiseCombobox; - cmb_AppProfile.ItemIndex := iLastIndex; + cmb_AppProfile.ItemIndex := iLastIndex; mainform.iCurrentRecIndex := iLastIndex; mainform.INI.WriteInteger('ProgramInfo', 'CurrentProfileIndex', mainform.iCurrentRecIndex); mainform.INI.UpdateFile; bDetailsChanged := True; mainform.DoWriteAppRecArrayIntoINI; - end; + end; end; procedure Tconfigform.cmb_IntervalTypeChange(Sender: TObject); @@ -253,24 +272,24 @@ end; procedure Tconfigform.DoInitialiseCombobox; var - i : integer; + i: integer; begin if (Length(mainform.AppRecArray) = 0) then - begin + begin ShowMessage('There are no profiles to configure!'); ModalResult := mrOk; - end; + end; cmb_AppProfile.Clear; with mainform do - begin + begin for i := Low(AppRecArray) to High(AppRecArray) do - begin + begin cmb_AppProfile.Items.Add(AppRecArray[i].AppPrettyName); - end; - end; + end; + end; mainform.iCurrentRecIndex := mainform.INI.ReadInteger('ProgramInfo', 'CurrentProfileIndex', 0); - cmb_AppProfile.ItemIndex := mainform.iCurrentRecIndex; + cmb_AppProfile.ItemIndex := mainform.iCurrentRecIndex; DoDisplayProfile(mainform.iCurrentRecIndex); end; @@ -280,9 +299,4 @@ begin bDetailsChanged := False; end; -procedure Tconfigform.grp_updateintervalClick(Sender: TObject); -begin - -end; - end. diff --git a/components/lazautoupdate/latest_stable/trayicon/umainform.lfm b/components/lazautoupdate/latest_stable/trayicon/umainform.lfm index 842f6e242..fc06c2496 100644 --- a/components/lazautoupdate/latest_stable/trayicon/umainform.lfm +++ b/components/lazautoupdate/latest_stable/trayicon/umainform.lfm @@ -7,7 +7,6 @@ object mainform: Tmainform Caption = 'mainform' OnCloseQuery = FormCloseQuery OnCreate = FormCreate - OnShow = FormShow OnWindowStateChange = FormWindowStateChange Position = poScreenCenter ShowInTaskBar = stNever @@ -80,7 +79,7 @@ object mainform: Tmainform Left = 128 Top = 16 end - object EventLog1: TEventLog + object Logger: TEventLog AppendContent = False LogType = ltFile Active = False diff --git a/components/lazautoupdate/latest_stable/trayicon/umainform.pas b/components/lazautoupdate/latest_stable/trayicon/umainform.pas index c226b91e0..656dad41f 100644 --- a/components/lazautoupdate/latest_stable/trayicon/umainform.pas +++ b/components/lazautoupdate/latest_stable/trayicon/umainform.pas @@ -39,93 +39,94 @@ VERSION HISTORY 0.1.12: Commit to svn 0.1.13: Updated January 2017 Ini filename uses C_PFX +0.1.14: Memory leaks fixed +0.1.15: ?? } {$mode objfpc}{$H+} interface uses -Classes, SysUtils, FileUtil, LazFileUtils,Forms, Controls, Graphics, Dialogs, ExtCtrls, -Menus, uLongTimer, ulazautoupdate, inifiles, eventlog, strUtils, uconfigform + Classes, SysUtils, FileUtil, LazFileUtils, Forms, Dialogs, ExtCtrls, + Menus, uLongTimer, ulazautoupdate, inifiles, eventlog, strUtils, uconfigform {$IFDEF WINDOWS}, registry{$ENDIF}; type -{ TAppRec - in-memory storage for all settings } -TAppRec = record - AppPrettyName: string; - AppPath: string; - INIPath: string; - ZipPath: string; - AppVersion: string; - SFProjectName: string; - SFUpdatesDirectory: string; - Location: string; - IntervalType: word; - IntervalDay: word; - IntervalDate: word; - IntervalHour: word; - Update: boolean; - LastCheckDateTime: TDateTime; -end; + { TAppRec - in-memory storage for all settings } + TAppRec = record + AppPrettyName: string; + AppPath: string; + INIPath: string; + ZipPath: string; + AppVersion: string; + SFProjectName: string; + SFUpdatesDirectory: string; + Location: string; + IntervalType: word; + IntervalDay: word; + IntervalDate: word; + IntervalHour: word; + Update: boolean; + LastCheckDateTime: TDateTime; + end; -{ Tmainform } -Tmainform = class(TForm) - Logger: TEventLog; - idleReminder: TIdleTimer; - LazAutoUpdate1: TLazAutoUpdate; - mnu_About: TMenuItem; - mnu_SelfCheck: TMenuItem; - mnu_startAtOSStartUp: TMenuItem; - mnu_configure: TMenuItem; - mnu_fileExit: TMenuItem; - PopupMenu1: TPopupMenu; - TrayIcon1: TTrayIcon; - procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); - procedure FormCreate(Sender: TObject); - procedure FormShow(Sender: TObject); - procedure FormWindowStateChange(Sender: TObject); - procedure idleReminderTimer(Sender: TObject); - procedure LazAutoUpdate1DebugEvent(Sender: TObject; WhereAt, Message: string); - procedure mnu_AboutClick(Sender: TObject); - procedure mnu_configureClick(Sender: TObject); - procedure mnu_fileExitClick(Sender: TObject); - procedure mnu_startAtOSStartUpClick(Sender: TObject); - procedure mnu_SelfCheckClick(Sender: TObject); - procedure TrayIcon1Click(Sender: TObject); - function UT_DateTimeToStr(TheDate: TDateTime): string; - function UT_StrToDate(str: string): TDateTime; + { Tmainform } + Tmainform = class(TForm) + Logger: TEventLog; + idleReminder: TIdleTimer; + LazAutoUpdate1: TLazAutoUpdate; + mnu_About: TMenuItem; + mnu_SelfCheck: TMenuItem; + mnu_startAtOSStartUp: TMenuItem; + mnu_configure: TMenuItem; + mnu_fileExit: TMenuItem; + PopupMenu1: TPopupMenu; + TrayIcon1: TTrayIcon; + procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); + procedure FormCreate(Sender: TObject); + procedure FormWindowStateChange(Sender: TObject); + procedure idleReminderTimer(Sender: TObject); + procedure LazAutoUpdate1DebugEvent(Sender: TObject; WhereAt, Message: string); + procedure mnu_AboutClick(Sender: TObject); + procedure mnu_configureClick(Sender: TObject); + procedure mnu_fileExitClick(Sender: TObject); + procedure mnu_startAtOSStartUpClick(Sender: TObject); + procedure mnu_SelfCheckClick(Sender: TObject); + procedure TrayIcon1Click(Sender: TObject); + function UT_DateTimeToStr(TheDate: TDateTime): string; + function UT_StrToDate(str: string): TDateTime; -private - { private declarations } - szImportINIPath: string; - DebugMode: boolean; - procedure DoAlert(aAppname, aVersion: string); - // Transfers info from lauimport.ini to local ini - function ImportINIFile: boolean; - // When first run, Populates INI and AppRecArray with default entry - procedure PopulateOwnProfile; - // Transfers info from local INI to AppRecArray - procedure DoReadINIIntoAppRecArray; - // Re-initialises a LongTimer array from AppRecArray info - procedure DoSetupLongTimerArray; - // All LongTimers use this for their OnTimer event - procedure DoLongTimerEvent(Sender: TObject); - // Do a silent check/install for this AppRecArray member - procedure CheckAndUpdate(ARecIndex: integer); -public - { public declarations } - INI: TIniFile; - AppRecArray: array of TAppRec; // Dynamic array - LongTimerArray: array of TLongTimer; // Dynamic array - iCurrentRecIndex: integer; - // Transfers info from AppRecArray to local INI - procedure DoWriteAppRecArrayIntoINI; -end; + private + { private declarations } + szImportINIPath: string; + DebugMode: boolean; + procedure DoAlert(aAppname, aVersion: string); + // Transfers info from lauimport.ini to local ini + function ImportINIFile: boolean; + // When first run, Populates INI and AppRecArray with default entry + procedure PopulateOwnProfile; + // Transfers info from local INI to AppRecArray + procedure DoReadINIIntoAppRecArray; + // Re-initialises a LongTimer array from AppRecArray info + procedure DoSetupLongTimerArray; + // All LongTimers use this for their OnTimer event + procedure DoLongTimerEvent(Sender: TObject); + // Do a silent check/install for this AppRecArray member + procedure CheckAndUpdate(ARecIndex: integer); + public + { public declarations } + INI: TIniFile; + AppRecArray: array of TAppRec; // Dynamic array + LongTimerArray: array of TLongTimer; // Dynamic array + iCurrentRecIndex: integer; + // Transfers info from AppRecArray to local INI + procedure DoWriteAppRecArrayIntoINI; + end; var -mainform : Tmainform; + mainform: Tmainform; -Const +const {$IFDEF WINDOWS} C_OS = 'win'; {$ELSE} @@ -137,16 +138,16 @@ Const C_BITNESS = '64'; {$ENDIF} C_PFX = C_OS + C_BITNESS; -C_LAUTRayINI = 'lauimport.ini'; -C_INIFilename = 'trayupdater' + C_PFX + '.ini'; + C_LAUTRayINI = 'lauimport.ini'; + C_INIFilename = 'trayupdater' + C_PFX + '.ini'; implementation resourcestring -rs_balloontitle = '%s service'; -rs_trayloaded = '%s Loaded'; -rs_newversionavailable = 'A new version of %s (v%s) is available'; + rs_balloontitle = '%s service'; + rs_trayloaded = '%s Loaded'; + rs_newversionavailable = 'A new version of %s (v%s) is available'; // TODO: Put all the other strings here {$R *.lfm} @@ -154,15 +155,15 @@ rs_newversionavailable = 'A new version of %s (v%s) is available'; procedure Tmainform.DoWriteAppRecArrayIntoINI; // AppRecArray is an in-memory copy of the INI file var - i : integer; - szSection : string; + i: integer; + szSection: string; begin if High(AppRecArray) = 0 then Exit; for i := Low(AppRecArray) to High(AppRecArray) do - begin + begin szSection := AppRecArray[i].AppPrettyName; - try + try INI.WriteString(szSection, 'AppPrettyName', AppRecArray[i].AppPrettyName); INI.WriteString(szSection, 'AppPath', AppRecArray[i].AppPath); INI.WriteString(szSection, 'INIPath', AppRecArray[i].INIPath); @@ -181,25 +182,25 @@ begin INI.WriteString(szSection, 'LastCheckDateTime', UT_DateTimeToStr(AppRecArray[i].LastCheckDateTime)); INI.UpdateFile; - except + except if DebugMode then Logger.Error('Failed to write AppRecArray to %s', [INI.Filename]) - end; - end; + end; + end; end; procedure Tmainform.DoLongTimerEvent(Sender: TObject); // All LongTimerArray.OnTimer events go here // The Tag property is the same as the AppRecArray entry it relates to var - iTag : integer; + iTag: integer; begin iTag := 0; // Assertion check if Sender is TLongTimer then - begin + begin iTag := TLongTimer(Sender).Tag; - end; + end; if DebugMode then Logger.Log('Timer for %s fired', [AppRecArray[iTag].AppPrettyName]); TrayIcon1.BalloonHint := @@ -217,29 +218,29 @@ procedure Tmainform.DoSetupLongTimerArray; // 2. Iterate through the AppRecArray, setting up a new LongTimer for each element // 3. Enable the LongTimers for which AppArray.Update=TRUE var - i, iArrayElement : integer; + i, iArrayElement: integer; begin // Start with an empty array for i := Low(LongTimerArray) to High(LongTimerArray) do if LongTimerArray[i] <> nil then - begin + begin LongTimerArray[i].Enabled := False; FreeAndNil(LongTimerArray[i]); - end; + end; SetLength(LongTimerArray, 0); // Zeros the array iArrayElement := -1; for i := Low(AppRecArray) to High(AppRecArray) do - begin + begin Inc(iArrayElement); // initially to zero SetLength(LongTimerArray, iArrayElement + 1); LongTimerArray[iArrayElement] := TLongTimer.Create(nil); with AppRecArray[i] do - begin + begin case IntervalType of 0: LongTimerArray[iArrayElement].IntervalType := lt1Daily; 1: LongTimerArray[iArrayElement].IntervalType := lt2Weekly; 2: LongTimerArray[iArrayElement].IntervalType := lt3Monthly; - end; + end; case IntervalDay of 0: LongTimerArray[iArrayElement].WeeklyDay := lt1Monday; 1: LongTimerArray[iArrayElement].WeeklyDay := lt2Tuesday; @@ -248,21 +249,21 @@ begin 4: LongTimerArray[iArrayElement].WeeklyDay := lt5Friday; 5: LongTimerArray[iArrayElement].WeeklyDay := lt6Saturday; 6: LongTimerArray[iArrayElement].WeeklyDay := lt7Sunday; - end; + end; LongTimerArray[iArrayElement].MonthlyDate := IntervalDate; LongTimerArray[iArrayElement].Daily24Hour := IntervalHour; - LongTimerArray[iArrayElement].Tag := i; + LongTimerArray[iArrayElement].Tag := i; LongTimerArray[iArrayElement].OnTimer := @DoLongTimerEvent; // Make sure timer doesn't fire right after a self-update LongTimerArray[iArrayElement].SampleInterval := lt5Every45Minutes; LongTimerArray[iArrayElement].Enabled := Update; - end; - end; + end; + end; end; function Tmainform.UT_DateTimeToStr(TheDate: TDateTime): string; var - frmstg : TFormatSettings; + frmstg: TFormatSettings; // Ensures consitent String dates across platforms begin //GetLocaleFormatSettings(0, frmstg); @@ -275,14 +276,14 @@ end; function Tmainform.UT_StrToDate(str: string): TDateTime; var - frmstg : TFormatSettings; + frmstg: TFormatSettings; // Ensures consitent String dates across platforms begin //GetLocaleFormatSettings(0, frmstg); - frmstg.DateSeparator := '-'; + frmstg.DateSeparator := '-'; frmstg.ShortDateFormat := 'yyyy-mm-dd'; - frmstg.TimeSeparator := '-'; - frmstg.LongTimeFormat := 'hh-nn'; + frmstg.TimeSeparator := '-'; + frmstg.LongTimeFormat := 'hh-nn'; if not TryStrToDateTime(str, Result, frmstg) then Result := Now(); end; @@ -290,24 +291,24 @@ end; procedure Tmainform.DoReadINIIntoAppRecArray; // AppRecArray is an in-memory copy of the INI file var - SectionStringList : TStringList; - szSection : string; - i, iArrayElement : integer; + SectionStringList: TStringList; + szSection: string; + i, iArrayElement: integer; begin SetLength(AppRecArray, 0); // Zeros the array SectionStringList := TStringList.Create; - try - try + try + try // Fetch all the section names INI.ReadSections(SectionStringList); iArrayElement := -1; if SectionStringList.Count > 0 then for i := 0 to SectionStringList.Count - 1 do - begin // Loop through all the INI file sections + begin // Loop through all the INI file sections szSection := SectionStringList[i]; // Skip over the ProgramInfo section if (szSection <> 'ProgramInfo') then - begin + begin Inc(iArrayElement); // initially to zero SetLength(AppRecArray, iArrayElement + 1); AppRecArray[iArrayElement].AppPrettyName := @@ -339,30 +340,30 @@ begin AppRecArray[iArrayElement].LastCheckDateTime := UT_StrToDate(INI.ReadString(szSection, 'LastCheckDateTime', UT_DateTimeToStr(Now))); - end; - end; - except + end; + end; + except if DebugMode then Logger.Error('Failed to read AppRecArray from %s', [INI.Filename]) - end; - finally + end; + finally FreeAndNil(SectionStringList); - end; + end; // Low(AppRecArray) to High(AppRecArray) iterates the whole array end; procedure Tmainform.PopulateOwnProfile; // Only called when app is first run var - szSection, szOSsuffix : string; + szSection, szOSsuffix: string; begin - szSection := Application.Title; + szSection := Application.Title; szOSsuffix := LowerCase( {$I %FPCTARGETOS%} ); - szSection += szOSsuffix; + szSection += szOSsuffix; with INI do - begin + begin WriteString(szSection, 'AppPrettyName', szSection); WriteString(szSection, 'AppPath', ParamStr(0)); WriteString(szSection, 'Location', ProgramDirectory); @@ -379,14 +380,14 @@ begin WriteString(szSection, 'LastCheckDateTime', UT_DateTimeToStr(Now)); WriteBool('ProgramInfo', 'IsVirgin', False); UpdateFile; - end; + end; with LazAutoUpdate1 do - begin + begin VersionsININame := 'lautraynotify' + szOSsuffix + '.ini'; - ZipFileName := 'lautraynotify' + szOSsuffix + '.zip'; - UpdatesFolder := 'updates'; - SFProjectName := 'lazautoupdate'; - end; + ZipFileName := 'lautraynotify' + szOSsuffix + '.zip'; + UpdatesFolder := 'updates'; + SFProjectName := 'lazautoupdate'; + end; DoReadINIIntoAppRecArray; if not FileExistsUTF8(C_LAUTRayINI) then LazAutoUpdate1.CreateLocalLauImportFile; @@ -399,10 +400,10 @@ function Tmainform.ImportINIFile: boolean; // Sets Update=TRUE // into C_INIFilename then deletes source ini var - ImportINI : TIniFile; - SectionStringList, SectionContents : TStringList; - i : integer; - szSection, szKey, szLocation, szAppPath : string; + ImportINI: TIniFile; + SectionStringList, SectionContents: TStringList; + i: integer; + szSection, szKey, szLocation, szAppPath: string; begin {TODO: Preserve user Logtimer settings?} Result := False; @@ -411,14 +412,14 @@ begin ImportINI := TIniFile.Create(szImportINIPath); SectionStringList := TStringList.Create; SectionContents := TStringList.Create; - try + try ImportINI.ReadSections(SectionStringList); if SectionStringList.Count > 0 then - begin + begin szSection := SectionStringList[0]; ImportINI.ReadSection(szSection, SectionContents); for i := 0 to SectionContents.Count - 1 do - begin + begin szKey := SectionContents[i]; if szKey = 'Location' then szLocation := ImportINI.ReadString(szSection, szKey, ''); @@ -426,7 +427,7 @@ begin szAppPath := ImportINI.ReadString(szSection, szKey, ''); INI.WriteString(szSection, szKey, ImportINI.ReadString( szSection, szKey, '')); - end; + end; // Append Location to AppPath if ((szAppPath <> '') and (szLocation <> '')) then INI.WriteString(szSection, 'AppPath', AppendPathDelim(szLocation) + @@ -436,19 +437,19 @@ begin UT_DateTimeToStr(Now)); INI.UpdateFile; Result := True; - end; - finally + end; + finally FreeAndNil(SectionContents); FreeAndNil(SectionStringList); FreeAndNil(ImportINI); - end; + end; if (Result = True) then - begin + begin if DebugMode then Logger.Log('%s: Imported %s into %s', [Application.Title, szImportINIPath, INI.Filename]); DoReadINIIntoAppRecArray; - end; + end; end; procedure Tmainform.DoAlert(aAppname, aVersion: string); @@ -461,7 +462,7 @@ end; procedure Tmainform.FormWindowStateChange(Sender: TObject); begin if mainform.WindowState = wsMinimized then - begin + begin // 2 lines below are ineffective at hiding the main form // Replaced with Application.ShowMainForm := false; in the lpr // mainform.WindowState := wsNormal; @@ -473,7 +474,7 @@ begin if DebugMode then Logger.Log('%s version %s started OK', [Application.Title, LazAutoUpdate1.AppVersion]); - end; + end; end; procedure Tmainform.idleReminderTimer(Sender: TObject); @@ -481,28 +482,28 @@ procedure Tmainform.idleReminderTimer(Sender: TObject); // If found, it is imported then deleted. begin if LazAutoUpdate1.DownloadInprogress then - begin + begin TrayIcon1.BalloonHint := 'Download in progress'; TrayIcon1.ShowBalloonHint; Exit; - end; + end; if FileExists(szImportINIPath) then - begin + begin if DebugMode then Logger.Log('%s: Import file %s discovered', [Application.Title, szImportINIPath]); if ImportINIFile then - begin + begin if DebugMode then Logger.Log('%s: Import file %s successfully imported', [Application.Title, szImportINIPath]); DeleteFileUTF8(szImportINIPath); - end + end else - if DebugMode then - Logger.Error('%s: Failed to import file %s', - [Application.Title, szImportINIPath]); - end; + if DebugMode then + Logger.Error('%s: Failed to import file %s', + [Application.Title, szImportINIPath]); + end; end; procedure Tmainform.LazAutoUpdate1DebugEvent(Sender: TObject; WhereAt, Message: string); @@ -513,7 +514,7 @@ end; procedure Tmainform.mnu_AboutClick(Sender: TObject); var - sz : string; + sz: string; begin LazAutoUpdate1.ResetAppVersion; sz := Application.Title + ' system tray application' + LineEnding; @@ -547,56 +548,56 @@ end; procedure Tmainform.mnu_startAtOSStartUpClick(Sender: TObject); {$IFDEF WINDOWS} var - Reg : TRegistry; + Reg: TRegistry; {$ENDIF} begin {$IFDEF WINDOWS} Reg := TRegistry.Create(KEY_ALL_ACCESS); - try + try Reg.RootKey := HKEY_CURRENT_USER; Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False); if mnu_startAtOSStartUp.Checked then - begin + begin Reg.WriteString(Application.Title, ParamStr(0)); INI.WriteBool('ProgramInfo', 'RunAtStartUp', True); if DebugMode then Logger.Log('Run at OS startup Activated'); MessageDlg(Application.Title, 'Run at OS startup activated OK', mtInformation, [mbOK], 0); - end + end else - begin + begin Reg.DeleteValue(Application.Title); INI.WriteBool('ProgramInfo', 'RunAtStartUp', False); if DebugMode then Logger.Log('Run at OS startup Deactivated'); MessageDlg(Application.Title, 'Run at OS startup deactivated OK', mtInformation, [mbOK], 0); - end; + end; Reg.CloseKey; - finally + finally FreeAndNil(Reg); - end; + end; {$ELSE} if mnu_startAtOSStartUp.Checked then - begin + begin ShowMessage('Sorry - not implemented in Linux in this version'); mnu_startAtOSStartUp.Checked := False; - end; + end; {$ENDIF} end; procedure TmainForm.CheckAndUpdate(ARecIndex: integer); begin if LazAutoUpdate1.DownloadInprogress then - begin + begin if DebugMode then Logger.Error( 'Tried to update whilst download in progress. Exiting CheckAndUpdate routine'); Exit; - end; + end; with AppRecArray[ARecIndex] do - begin + begin LazAutoUpdate1.AppFileWithPath := AppPath; LazAutoUpdate1.AppVersion := AppVersion; LazAutoUpdate1.ZipfileName := ZipPath; @@ -604,36 +605,36 @@ begin LazAutoUpdate1.UpdatesFolder := SFUpdatesDirectory; LazAutoUpdate1.VersionsININame := INIPath; LazAutoUpdate1.CopyTree := True; - TrayIcon1.BalloonHint := + TrayIcon1.BalloonHint := Format('Checking %s for updates', [AppPrettyName]); TrayIcon1.ShowBalloonHint; // Debugging line LazAutoUpdate1.DebugMode := True; // Logs everyting if LazAutoUpdate1.NewVersionAvailable then - begin + begin TrayIcon1.BalloonHint := Format('Found newer version %s. Downloading...', [LazAutoUpdate1.GUIOnlineVersion]); TrayIcon1.ShowBalloonHint; if LazAutoUpdate1.DownloadNewVersion then if LazAutoUpdate1.SilentUpdate then - begin + begin TrayIcon1.BalloonHint := Format('Successfully updated %s to version %s', [AppPrettyName, LazAutoUpdate1.GUIOnlineVersion]); - LastCheckDateTime := Now; - end + LastCheckDateTime := Now; + end else TrayIcon1.BalloonHint := Format('Failed to update %s', [AppPrettyName]); - end + end else - begin + begin TrayIcon1.BalloonHint := AppPrettyName + ' is up-to-date'; TrayIcon1.ShowBalloonHint; - end; + end; LazAutoUpdate1.ResetAppVersion; TrayIcon1.ShowBalloonHint; - end; + end; end; procedure Tmainform.mnu_SelfCheckClick(Sender: TObject); @@ -653,10 +654,10 @@ end; procedure Tmainform.TrayIcon1Click(Sender: TObject); begin if LazAutoUpdate1.DownloadInprogress then - begin + begin TrayIcon1.BalloonHint := 'Currently downloading...'; TrayIcon1.ShowBalloonHint; - end; + end; end; procedure Tmainform.FormCreate(Sender: TObject); @@ -665,13 +666,15 @@ begin DebugMode := True else DebugMode := False; - {$IFDEF DEBUGMODE}DebugMode := True;{$ENDIF} + {$IFDEF DEBUGMODE} + DebugMode := True; +{$ENDIF} // Initialise the App's main INI file - Try - INI := TIniFile.Create(GetAppConfigDirUTF8(False) + C_INIFilename); - Except - sleep(4000); - If (INI = Nil) then + try + INI := TIniFile.Create(GetAppConfigDirUTF8(False) + C_INIFilename); + except + sleep(4000); + if (INI = nil) then INI := TIniFile.Create(GetAppConfigDirUTF8(False) + C_INIFilename); end; INI.CacheUpdates := False; @@ -702,10 +705,11 @@ begin // Logger.Identification := Application.Title; // Fetch the location of any trayicon INI on the users system szImportINIPath := GetAppConfigDirUTF8(False, True); - szImportINIPath := AnsiReplaceText(szImportINIPath, Application.Title, 'updatehm' + C_PFX); + szImportINIPath := AnsiReplaceText(szImportINIPath, Application.Title, + 'updatehm' + C_PFX); szImportINIPath := AppendPathDelim(szImportINIPath) + C_LAUTRayINI; if DebugMode then - Logger.Debug('szImportINIPath=' + szImportINIPath); + Logger.Debug('szImportINIPath=' + szImportINIPath); // Initialise the AppRecArray DoReadINIIntoAppRecArray; // Use last saved Profile at startup @@ -713,48 +717,50 @@ begin 'CurrentProfileIndex', 0); DoSetupLongTimerArray; // Sort out the TrayIcon stuff - TrayIcon1.Icon := Application.Icon; + TrayIcon1.Icon := Application.Icon; TrayIcon1.BalloonTitle := Format(rs_balloontitle, [Application.Title]); - TrayIcon1.Hint := Application.Title; + TrayIcon1.Hint := Application.Title; TrayIcon1.ShowIcon := True; TrayIcon1.Show; TrayIcon1.BalloonHint := Format(rs_trayloaded, [Application.Title]); TrayIcon1.ShowBalloonHint; LazAutoUpdate1.DebugMode := DebugMode; - mnu_SelfCheck.Visible := DebugMode; -end; - -procedure Tmainform.FormShow(Sender: TObject); -begin + mnu_SelfCheck.Visible := DebugMode; end; procedure Tmainform.FormCloseQuery(Sender: TObject; var CanClose: boolean); var - i : integer; + i: integer; begin if LazAutoUpdate1.DownloadInprogress then - begin + begin ShowMessage('Please wait. Update in progress'); CanClose := False; - end + end else - begin + // Clean up memory No leaks (V0.1.14) + begin if DebugMode then + begin Logger.Log('User closed application'); - if DebugMode then Logger.Active := False; + FreeAndNil(Logger); + end; CanClose := True; - end; + end; if CanClose then - begin + begin // Clean up any LongTimers for i := Low(LongTimerArray) to High(LongTimerArray) do if LongTimerArray[i] <> nil then - begin + begin LongTimerArray[i].Enabled := False; FreeAndNil(LongTimerArray[i]); - end; - end; + end; + SetLength(AppRecArray, 0); + FreeAndNil(AppRecArray); + FreeAndNil(INI); + end; end; end.