Update for OPM

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5506 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
gbamber
2016-12-15 17:46:49 +00:00
parent 53baf386d8
commit 77fd6e5a30
9 changed files with 836 additions and 836 deletions

View File

@@ -1,233 +1,233 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<CONFIG> <CONFIG>
<ProjectOptions> <ProjectOptions>
<Version Value="9"/> <Version Value="9"/>
<General> <General>
<Flags> <Flags>
<MainUnitHasCreateFormStatements Value="False"/> <MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/> <MainUnitHasTitleStatement Value="False"/>
</Flags> </Flags>
<SessionStorage Value="InProjectDir"/> <SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/> <MainUnit Value="0"/>
<Title Value="LazUpdate Updater"/> <Title Value="LazUpdate Updater"/>
<UseAppBundle Value="False"/> <UseAppBundle Value="False"/>
<ResourceType Value="res"/> <ResourceType Value="res"/>
<XPManifest> <XPManifest>
<ExecutionLevel Value="1"/> <ExecutionLevel Value="1"/>
<UIAccess Value="True"/> <UIAccess Value="True"/>
</XPManifest> </XPManifest>
</General> </General>
<i18n> <i18n>
<EnableI18N LFM="False"/> <EnableI18N LFM="False"/>
</i18n> </i18n>
<VersionInfo> <VersionInfo>
<UseVersionInfo Value="True"/> <UseVersionInfo Value="True"/>
<RevisionNr Value="14"/> <RevisionNr Value="14"/>
<StringTable Comments="updatehm -h for list of parameters" CompanyName="minesadorada@charcodelvalle.com" FileDescription="Console updater for LazAutoUpdate component" InternalName="updatehm" LegalCopyright="LGPLv2" OriginalFilename="updatehm.exe" ProductName="LazAutoUpdate" ProductVersion="0.0.13.0"/> <StringTable Comments="updatehm -h for list of parameters" CompanyName="minesadorada@charcodelvalle.com" FileDescription="Console updater for LazAutoUpdate component" InternalName="updatehm" LegalCopyright="LGPLv2" OriginalFilename="updatehm.exe" ProductName="LazAutoUpdate" ProductVersion="0.0.13.0"/>
</VersionInfo> </VersionInfo>
<BuildModes Count="6"> <BuildModes Count="6">
<Item1 Name="Default" Default="True"/> <Item1 Name="Default" Default="True"/>
<Item2 Name="Debug"> <Item2 Name="Debug">
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Target> <Target>
<Filename Value="updates\updatehm"/> <Filename Value="updates\updatehm"/>
</Target> </Target>
<SearchPaths> <SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/> <IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths> </SearchPaths>
<Parsing> <Parsing>
<SyntaxOptions> <SyntaxOptions>
<IncludeAssertionCode Value="True"/> <IncludeAssertionCode Value="True"/>
</SyntaxOptions> </SyntaxOptions>
</Parsing> </Parsing>
<CodeGeneration> <CodeGeneration>
<Checks> <Checks>
<IOChecks Value="True"/> <IOChecks Value="True"/>
<RangeChecks Value="True"/> <RangeChecks Value="True"/>
<OverflowChecks Value="True"/> <OverflowChecks Value="True"/>
<StackChecks Value="True"/> <StackChecks Value="True"/>
</Checks> </Checks>
</CodeGeneration> </CodeGeneration>
<Linking> <Linking>
<Debugging> <Debugging>
<DebugInfoType Value="dsDwarf2Set"/> <DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/> <UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/> <UseExternalDbgSyms Value="True"/>
</Debugging> </Debugging>
</Linking> </Linking>
</CompilerOptions> </CompilerOptions>
</Item2> </Item2>
<Item3 Name="Win32 Release"> <Item3 Name="Win32 Release">
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Target> <Target>
<Filename Value="..\updatehmcompiled\win32\updatehm"/> <Filename Value="..\updatehmcompiled\win32\updatehm"/>
</Target> </Target>
<SearchPaths> <SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/> <IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths> </SearchPaths>
<CodeGeneration> <CodeGeneration>
<SmartLinkUnit Value="True"/> <SmartLinkUnit Value="True"/>
<TargetCPU Value="i386"/> <TargetCPU Value="i386"/>
<TargetOS Value="win32"/> <TargetOS Value="win32"/>
<Optimizations> <Optimizations>
<OptimizationLevel Value="3"/> <OptimizationLevel Value="3"/>
</Optimizations> </Optimizations>
<SmallerCode Value="True"/> <SmallerCode Value="True"/>
</CodeGeneration> </CodeGeneration>
<Linking> <Linking>
<Debugging> <Debugging>
<GenerateDebugInfo Value="False"/> <GenerateDebugInfo Value="False"/>
</Debugging> </Debugging>
<LinkSmart Value="True"/> <LinkSmart Value="True"/>
</Linking> </Linking>
</CompilerOptions> </CompilerOptions>
</Item3> </Item3>
<Item4 Name="Win64 Release"> <Item4 Name="Win64 Release">
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Target> <Target>
<Filename Value="..\updatehmcompiled\win64\updatehm"/> <Filename Value="..\updatehmcompiled\win64\updatehm"/>
</Target> </Target>
<SearchPaths> <SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/> <IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths> </SearchPaths>
<CodeGeneration> <CodeGeneration>
<SmartLinkUnit Value="True"/> <SmartLinkUnit Value="True"/>
<TargetCPU Value="x86_64"/> <TargetCPU Value="x86_64"/>
<TargetOS Value="win64"/> <TargetOS Value="win64"/>
<Optimizations> <Optimizations>
<OptimizationLevel Value="3"/> <OptimizationLevel Value="3"/>
</Optimizations> </Optimizations>
<SmallerCode Value="True"/> <SmallerCode Value="True"/>
</CodeGeneration> </CodeGeneration>
<Linking> <Linking>
<Debugging> <Debugging>
<GenerateDebugInfo Value="False"/> <GenerateDebugInfo Value="False"/>
</Debugging> </Debugging>
<LinkSmart Value="True"/> <LinkSmart Value="True"/>
</Linking> </Linking>
</CompilerOptions> </CompilerOptions>
</Item4> </Item4>
<Item5 Name="Linux32 Release"> <Item5 Name="Linux32 Release">
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Target> <Target>
<Filename Value="..\updatehmcompiled\linux32\updatehm"/> <Filename Value="..\updatehmcompiled\linux32\updatehm"/>
</Target> </Target>
<SearchPaths> <SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/> <IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths> </SearchPaths>
<CodeGeneration> <CodeGeneration>
<SmartLinkUnit Value="True"/> <SmartLinkUnit Value="True"/>
<TargetCPU Value="i386"/> <TargetCPU Value="i386"/>
<TargetOS Value="linux"/> <TargetOS Value="linux"/>
<Optimizations> <Optimizations>
<OptimizationLevel Value="3"/> <OptimizationLevel Value="3"/>
</Optimizations> </Optimizations>
<SmallerCode Value="True"/> <SmallerCode Value="True"/>
</CodeGeneration> </CodeGeneration>
<Linking> <Linking>
<Debugging> <Debugging>
<GenerateDebugInfo Value="False"/> <GenerateDebugInfo Value="False"/>
</Debugging> </Debugging>
<LinkSmart Value="True"/> <LinkSmart Value="True"/>
</Linking> </Linking>
<Other> <Other>
<CustomOptions Value="-FLC:\NewPascal\cross\lib\i386-linux\ld-linux.so.2"/> <CustomOptions Value="-FLC:\NewPascal\cross\lib\i386-linux\ld-linux.so.2"/>
</Other> </Other>
</CompilerOptions> </CompilerOptions>
</Item5> </Item5>
<Item6 Name="Linux64 Release"> <Item6 Name="Linux64 Release">
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Target> <Target>
<Filename Value="..\updatehmcompiled\linux64\updatehm"/> <Filename Value="..\updatehmcompiled\linux64\updatehm"/>
</Target> </Target>
<SearchPaths> <SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/> <IncludeFiles Value="$(ProjOutDir)"/>
<Libraries Value="C:\codetyphon\linux\x86_64-linux\"/> <Libraries Value="C:\codetyphon\linux\x86_64-linux\"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths> </SearchPaths>
<CodeGeneration> <CodeGeneration>
<SmartLinkUnit Value="True"/> <SmartLinkUnit Value="True"/>
<TargetCPU Value="x86_64"/> <TargetCPU Value="x86_64"/>
<TargetOS Value="linux"/> <TargetOS Value="linux"/>
<Optimizations> <Optimizations>
<OptimizationLevel Value="3"/> <OptimizationLevel Value="3"/>
</Optimizations> </Optimizations>
<SmallerCode Value="True"/> <SmallerCode Value="True"/>
</CodeGeneration> </CodeGeneration>
<Linking> <Linking>
<Debugging> <Debugging>
<GenerateDebugInfo Value="False"/> <GenerateDebugInfo Value="False"/>
</Debugging> </Debugging>
<LinkSmart Value="True"/> <LinkSmart Value="True"/>
</Linking> </Linking>
</CompilerOptions> </CompilerOptions>
</Item6> </Item6>
</BuildModes> </BuildModes>
<PublishOptions> <PublishOptions>
<Version Value="2"/> <Version Value="2"/>
</PublishOptions> </PublishOptions>
<RunParams> <RunParams>
<local> <local>
<FormatVersion Value="1"/> <FormatVersion Value="1"/>
<CommandLineParams Value="healthmonitor32sqlite3.exe"/> <CommandLineParams Value="healthmonitor32sqlite3.exe"/>
</local> </local>
</RunParams> </RunParams>
<RequiredPackages Count="2"> <RequiredPackages Count="2">
<Item1> <Item1>
<PackageName Value="LCLBase"/> <PackageName Value="LCLBase"/>
</Item1> </Item1>
<Item2> <Item2>
<PackageName Value="LazUtils"/> <PackageName Value="LazUtils"/>
</Item2> </Item2>
</RequiredPackages> </RequiredPackages>
<Units Count="1"> <Units Count="1">
<Unit0> <Unit0>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
</Unit0> </Unit0>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Target> <Target>
<Filename Value="updatehm"/> <Filename Value="updatehm"/>
</Target> </Target>
<SearchPaths> <SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/> <IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths> </SearchPaths>
<Linking> <Linking>
<Debugging> <Debugging>
<GenerateDebugInfo Value="False"/> <GenerateDebugInfo Value="False"/>
</Debugging> </Debugging>
</Linking> </Linking>
</CompilerOptions> </CompilerOptions>
<Debugging> <Debugging>
<Exceptions Count="3"> <Exceptions Count="3">
<Item1> <Item1>
<Name Value="EAbort"/> <Name Value="EAbort"/>
</Item1> </Item1>
<Item2> <Item2>
<Name Value="ECodetoolError"/> <Name Value="ECodetoolError"/>
</Item2> </Item2>
<Item3> <Item3>
<Name Value="EFOpenError"/> <Name Value="EFOpenError"/>
</Item3> </Item3>
</Exceptions> </Exceptions>
</Debugging> </Debugging>
</CONFIG> </CONFIG>

View File

@@ -1,329 +1,329 @@
program updatehm; program updatehm;
{$ifdef Linux} {$ifdef Linux}
{$ifdef FPC_CROSSCOMPILING} {$ifdef FPC_CROSSCOMPILING}
{$ifdef CPUARM} {$ifdef CPUARM}
//if GUI, then uncomment //if GUI, then uncomment
//{$linklib GLESv2} //{$linklib GLESv2}
{$endif} {$endif}
{$linklib libc_nonshared.a} {$linklib libc_nonshared.a}
{$endif} {$endif}
{$endif} {$endif}
{ LazAutoUpdate companion application { LazAutoUpdate companion application
This application should be deployed in the same directory This application should be deployed in the same directory
as any application that uses the LazAutoUpdate component. as any application that uses the LazAutoUpdate component.
Actions: Actions:
1. Checks for correct parameters 1. Checks for correct parameters
2. Copies a whatsnew.txt file from the updates directory to the ProgramDirectory 2. Copies a whatsnew.txt file from the updates directory to the ProgramDirectory
3. Waits for 2 seconds whilst the calling app shuts itself down 3. Waits for 2 seconds whilst the calling app shuts itself down
4. If present, copies TrayNotifier info to the common data directory 4. If present, copies TrayNotifier info to the common data directory
and adds a new entry: Location=<ProgramDirectory> and adds a new entry: Location=<ProgramDirectory>
5(a) If CopyTree=TRUE, copies the whole directory tree from 5(a) If CopyTree=TRUE, copies the whole directory tree from
the updates folder to the ProgramDirectory the updates folder to the ProgramDirectory
5(b) If CopyTree=FALSE, copies the new executable from the 5(b) If CopyTree=FALSE, copies the new executable from the
updates folder to the ProgramDirectory updates folder to the ProgramDirectory
6. Uses TProcess to start up the new executable 6. Uses TProcess to start up the new executable
7. Closes. 7. Closes.
Note that an application log (C_LogFileName) is written anew, and Note that an application log (C_LogFileName) is written anew, and
can be checked for error information can be checked for error information
Copyright (C)2014 Gordon Bamber (minesadorada@charcodelvalle.com) Copyright (C)2014 Gordon Bamber (minesadorada@charcodelvalle.com)
This library is free software; you can redistribute it and/or modify it This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your the Free Software Foundation; either version 2 of the License, or (at your
option) any later version. option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
for more details. for more details.
You should have received a copy of the GNU Library General Public License You should have received a copy of the GNU Library General Public License
along with this library; if not, write to the Free Software Foundation, along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
} }
// Takes 5 parameters // Takes 5 parameters
uses uses
SysUtils, SysUtils,
LazUTF8,LazFileUtils,FileUtil, LazUTF8,LazFileUtils,FileUtil,
process, process,
eventlog, eventlog,
DateUtils, DateUtils,
inifiles, inifiles,
Classes; Classes;
{$R *.res} {$R *.res}
const const
C_AppPrettyName = 'Lazarus Auto-Updater'; C_AppPrettyName = 'Lazarus Auto-Updater';
C_WhatsNewFileName = 'whatsnew.txt'; C_WhatsNewFileName = 'whatsnew.txt';
C_Version = '0.0.14'; C_Version = '0.0.14';
C_UpdatesDirectory = 'updates'; C_UpdatesDirectory = 'updates';
C_LogFileName = 'updatehmlog.txt'; C_LogFileName = 'updatehmlog.txt';
C_LAUTRayINI = 'lauimport.ini'; C_LAUTRayINI = 'lauimport.ini';
{$IFDEF WINDOWS} {$IFDEF WINDOWS}
C_OS = 'win'; C_OS = 'win';
{$ELSE} {$ELSE}
C_OS = 'linux'; C_OS = 'linux';
{$ENDIF} {$ENDIF}
{$IFDEF CPU32} {$IFDEF CPU32}
C_BITNESS = '32'; C_BITNESS = '32';
{$ELSE} {$ELSE}
C_BITNESS = '64'; C_BITNESS = '64';
{$ENDIF} {$ENDIF}
C_PFX = C_OS + C_BITNESS; C_PFX = C_OS + C_BITNESS;
{$IFDEF WINDOWS} {$IFDEF WINDOWS}
C_Appname = 'lazautoupdateexample' + C_PFX + '.exe'; C_Appname = 'lazautoupdateexample' + C_PFX + '.exe';
C_LAUTrayApp = 'lautraynotify' + C_PFX + '.exe'; C_LAUTrayApp = 'lautraynotify' + C_PFX + '.exe';
{$ELSE} {$ELSE}
C_Appname = 'lazautoupdateexample' + C_PFX; C_Appname = 'lazautoupdateexample' + C_PFX;
C_LAUTrayApp = 'lautraynotify' + C_PFX; C_LAUTrayApp = 'lautraynotify' + C_PFX;
{$ENDIF} {$ENDIF}
var var
szAppName, szUpdatesFolder, szWhatsNewName, szPrettyName: string; szAppName, szUpdatesFolder, szWhatsNewName, szPrettyName: string;
szUpdatedEXEPath, szOldEXEPath: string; szUpdatedEXEPath, szOldEXEPath: string;
szUpdatedWNPath, szOldWNPath: string; szUpdatedWNPath, szOldWNPath: string;
szUpdatesFullPath: string; szUpdatesFullPath: string;
AppProcess: TProcess; AppProcess: TProcess;
Logger: TEventLog; Logger: TEventLog;
bCopyTreeSuccess: boolean; bCopyTreeSuccess: boolean;
szLAUTrayAppPath: string; szLAUTrayAppPath: string;
INI: TINIFile; INI: TINIFile;
SectionStringList: TStrings; SectionStringList: TStrings;
procedure WaitFor(const MillisecondDelay: longword); procedure WaitFor(const MillisecondDelay: longword);
// Linux - this proc is intentionally thread-blocking // Linux - this proc is intentionally thread-blocking
var var
ThisSecond: longword; ThisSecond: longword;
begin begin
ThisSecond := MilliSecondOfTheDay(Now); ThisSecond := MilliSecondOfTheDay(Now);
while MilliSecondOfTheDay(Now) < (ThisSecond + MillisecondDelay) do ; while MilliSecondOfTheDay(Now) < (ThisSecond + MillisecondDelay) do ;
end; end;
procedure WriteAndLog(szText: string); procedure WriteAndLog(szText: string);
begin begin
Logger.Info(szText); Logger.Info(szText);
writeln(szText); writeln(szText);
end; end;
begin begin
if ParamCount = 0 then if ParamCount = 0 then
begin begin
Writeln(LineEnding + '==== updatehm v' + C_Version + Writeln(LineEnding + '==== updatehm v' + C_Version +
' - an lazautoupdate application ===='); ' - an lazautoupdate application ====');
Writeln('Usage: updatehm exename.exe [updatesfoldername] [whatnewfilename] [exePrettyName] [copytree]'); Writeln('Usage: updatehm exename.exe [updatesfoldername] [whatnewfilename] [exePrettyName] [copytree]');
Halt; Halt;
end; end;
if (ParamStrUTF8(1) = '-h') or (ParamStrUTF8(1) = '/h') then if (ParamStrUTF8(1) = '-h') or (ParamStrUTF8(1) = '/h') then
begin begin
WriteLn('=========================================================='); WriteLn('==========================================================');
Writeln('Normal usage: updatehm exename.exe [updatesfoldername] [whatnewfilename] [exePrettyName] [copytree]'); Writeln('Normal usage: updatehm exename.exe [updatesfoldername] [whatnewfilename] [exePrettyName] [copytree]');
WriteLn('- where exename.exe is a single application to be updated'); WriteLn('- where exename.exe is a single application to be updated');
WriteLn(LineEnding); WriteLn(LineEnding);
WriteLn('optional parameters are'); WriteLn('optional parameters are');
WriteLn('-h or /h - this screen'); WriteLn('-h or /h - this screen');
WriteLn('=========================================================='); WriteLn('==========================================================');
Halt; Halt;
end; end;
Logger := TEventLog.Create(nil); Logger := TEventLog.Create(nil);
Logger.LogType := ltFile; Logger.LogType := ltFile;
Logger.FileName := C_LogFileName; Logger.FileName := C_LogFileName;
if FileExistsUTF8(C_LogFileName) then if FileExistsUTF8(C_LogFileName) then
DeleteFile(C_LogFileName); DeleteFile(C_LogFileName);
Logger.Active := True; Logger.Active := True;
Logger.Info('Start of Log'); Logger.Info('Start of Log');
bCopyTreeSuccess := False; bCopyTreeSuccess := False;
szAppName := ParamStrUTF8(1); szAppName := ParamStrUTF8(1);
if szAppName = '' then if szAppName = '' then
szAppname := C_Appname; szAppname := C_Appname;
szUpdatesFolder := ParamStrUTF8(2); szUpdatesFolder := ParamStrUTF8(2);
if szUpdatesFolder = '' then if szUpdatesFolder = '' then
szUpdatesFolder := C_UpdatesDirectory; szUpdatesFolder := C_UpdatesDirectory;
szWhatsNewName := ParamStrUTF8(3); szWhatsNewName := ParamStrUTF8(3);
if szWhatsNewName = '' then if szWhatsNewName = '' then
szWhatsNewName := C_WhatsNewFileName; szWhatsNewName := C_WhatsNewFileName;
szPrettyName := ParamStrUTF8(4); szPrettyName := ParamStrUTF8(4);
if szPrettyName = '' then if szPrettyName = '' then
szPrettyName := C_AppPrettyName; szPrettyName := C_AppPrettyName;
WriteAndLog('updatehm version ' + C_Version); WriteAndLog('updatehm version ' + C_Version);
Logger.Info('Given parameters follow:'); Logger.Info('Given parameters follow:');
Logger.Info('App name = ' + szAppName); Logger.Info('App name = ' + szAppName);
Logger.Info('Updates folder = ' + szUpdatesFolder); Logger.Info('Updates folder = ' + szUpdatesFolder);
Logger.Info('WhatsNew filename = ' + szWhatsNewName); Logger.Info('WhatsNew filename = ' + szWhatsNewName);
Logger.Info('Pretty Name = ' + szPrettyName); Logger.Info('Pretty Name = ' + szPrettyName);
if ParamStrUTF8(5) = 'copytree' then if ParamStrUTF8(5) = 'copytree' then
Logger.Info('CopyTree = TRUE') Logger.Info('CopyTree = TRUE')
else else
Logger.Info('CopyTree = FALSE'); Logger.Info('CopyTree = FALSE');
WriteAndLog('Please wait. Updating ' + szPrettyName + '....'); WriteAndLog('Please wait. Updating ' + szPrettyName + '....');
// Set up paths // Set up paths
szOldEXEPath := CleanAndExpandFilename(ProgramDirectory + PathDelim + szAppName); szOldEXEPath := CleanAndExpandFilename(ProgramDirectory + PathDelim + szAppName);
Logger.Info('Application path = ' + szOldEXEPath); Logger.Info('Application path = ' + szOldEXEPath);
szUpdatedEXEPath := CleanAndExpandFilename(ProgramDirectory + szUpdatedEXEPath := CleanAndExpandFilename(ProgramDirectory +
szUpdatesFolder + PathDelim + szAppName); szUpdatesFolder + PathDelim + szAppName);
Logger.Info('Updated application path = ' + szUpdatedEXEPath); Logger.Info('Updated application path = ' + szUpdatedEXEPath);
szOldWNPath := CleanAndExpandFilename(ProgramDirectory + PathDelim + szWhatsNewName); szOldWNPath := CleanAndExpandFilename(ProgramDirectory + PathDelim + szWhatsNewName);
Logger.Info('WhatsNew path = ' + szOldWNPath); Logger.Info('WhatsNew path = ' + szOldWNPath);
szUpdatedWNPath := CleanAndExpandFilename(ProgramDirectory + szUpdatedWNPath := CleanAndExpandFilename(ProgramDirectory +
szUpdatesFolder + PathDelim + szWhatsNewName); szUpdatesFolder + PathDelim + szWhatsNewName);
Logger.Info('Updated whatsNew path = ' + szUpdatedWNPath); Logger.Info('Updated whatsNew path = ' + szUpdatedWNPath);
if not FileExistsUTF8(szUpdatedEXEPath) then if not FileExistsUTF8(szUpdatedEXEPath) then
begin begin
WriteAndLog('Couldn''t find szUpdatedEXEPath'); WriteAndLog('Couldn''t find szUpdatedEXEPath');
Logger.Active := False; Logger.Active := False;
FreeAndNil(Logger); FreeAndNil(Logger);
Halt(1); Halt(1);
end; end;
if FileExistsUTF8(szUpdatedWNPath) then if FileExistsUTF8(szUpdatedWNPath) then
begin begin
// Write a file to disk that the app keeps checking for. // Write a file to disk that the app keeps checking for.
try try
Fileutil.CopyFile(szUpdatedWNPath, szOldWNPath, [cffOverWriteFile]); Fileutil.CopyFile(szUpdatedWNPath, szOldWNPath, [cffOverWriteFile]);
WriteAndLog('Writing.. ' + szWhatsNewName); WriteAndLog('Writing.. ' + szWhatsNewName);
except except
On E: Exception do On E: Exception do
begin begin
WriteAndLog(Format('There was a problem writing %s. Reason: %s', WriteAndLog(Format('There was a problem writing %s. Reason: %s',
[szWhatsNewName, E.Message])); [szWhatsNewName, E.Message]));
Logger.Active := False; Logger.Active := False;
FreeAndNil(Logger); FreeAndNil(Logger);
Halt(1); Halt(1);
end; end;
end; end;
end; end;
// The calling app is in a loop - waiting to detect // The calling app is in a loop - waiting to detect
// a Whatsnew file in it's home directory // a Whatsnew file in it's home directory
// As soon as the call: If FileExists(WhatsNew) returns TRUE // As soon as the call: If FileExists(WhatsNew) returns TRUE
// then the app will close itself // then the app will close itself
// The following code is to give the App time to do all this.. // The following code is to give the App time to do all this..
{$IFDEF HAS_SLEEP} {$IFDEF HAS_SLEEP}
WriteAndLog('Sleeping...'); WriteAndLog('Sleeping...');
Sleep(2000); // give time for calling app to close Sleep(2000); // give time for calling app to close
{$ELSE} {$ELSE}
WriteAndLog('Waiting 2 seconds...'); WriteAndLog('Waiting 2 seconds...');
WaitFor(2000); WaitFor(2000);
{$ENDIF} {$ENDIF}
// App should now be closed. OK to overwrite it. // App should now be closed. OK to overwrite it.
// Define Updates directory // Define Updates directory
szUpdatesFullPath := CleanAndExpandDirectory(ProgramDirectory + szUpdatesFolder); szUpdatesFullPath := CleanAndExpandDirectory(ProgramDirectory + szUpdatesFolder);
// Deal with C_LAUTRayINI // Deal with C_LAUTRayINI
// Copied to the global application data folder // Copied to the global application data folder
// Add entry 'Location' // Add entry 'Location'
if FileExistsUTF8(szUpdatesFullPath + C_LAUTRayINI) then if FileExistsUTF8(szUpdatesFullPath + C_LAUTRayINI) then
begin begin
szLAUTrayAppPath := GetAppConfigDirUTF8(False, True);; szLAUTrayAppPath := GetAppConfigDirUTF8(False, True);;
try try
ForceDirectory(szLAUTrayAppPath); ForceDirectory(szLAUTrayAppPath);
Fileutil.CopyFile(szUpdatesFullPath + C_LAUTRayINI, szLAUTrayAppPath + Fileutil.CopyFile(szUpdatesFullPath + C_LAUTRayINI, szLAUTrayAppPath +
C_LAUTRayINI, [cffOverWriteFile]); C_LAUTRayINI, [cffOverWriteFile]);
WriteAndLog(Format('Successfully copied %s to %s ', WriteAndLog(Format('Successfully copied %s to %s ',
[C_LAUTRayINI, szLAUTrayAppPath])); [C_LAUTRayINI, szLAUTrayAppPath]));
if FileExistsUTF8(szLAUTrayAppPath + C_LAUTRayINI) then if FileExistsUTF8(szLAUTrayAppPath + C_LAUTRayINI) then
begin begin
INI := TINIFile.Create(szLAUTrayAppPath + C_LAUTRayINI); INI := TINIFile.Create(szLAUTrayAppPath + C_LAUTRayINI);
SectionStringList := TStringList.Create; SectionStringList := TStringList.Create;
try try
INI.ReadSections(SectionStringList); INI.ReadSections(SectionStringList);
if SectionStringList.Count > 0 then if SectionStringList.Count > 0 then
begin begin
INI.WriteString(SectionStringList[0], 'Location', ProgramDirectory); INI.WriteString(SectionStringList[0], 'Location', ProgramDirectory);
WriteAndLog(Format('Wrote new entry in section %s. Location=%s', WriteAndLog(Format('Wrote new entry in section %s. Location=%s',
[SectionStringList[0], ProgramDirectory])); [SectionStringList[0], ProgramDirectory]));
end end
else else
WriteAndLog('Failed to find a valid section in ' + C_LAUTRayINI); WriteAndLog('Failed to find a valid section in ' + C_LAUTRayINI);
finally finally
FreeAndNil(SectionStringList); FreeAndNil(SectionStringList);
FreeAndNil(INI); FreeAndNil(INI);
end; end;
end end
else else
WriteAndLog('Failed to copy ' + C_LAUTRayINI + ' to ' + szLAUTrayAppPath); WriteAndLog('Failed to copy ' + C_LAUTRayINI + ' to ' + szLAUTrayAppPath);
except except
On E: Exception do On E: Exception do
WriteAndLog(Format('Could not copy %s. Error: %s ', [C_LAUTrayApp, E.Message])); WriteAndLog(Format('Could not copy %s. Error: %s ', [C_LAUTrayApp, E.Message]));
end; end;
end; end;
// If CopyTree, then just copy the whole of the /updates folder (inc directories) to the App Directory // If CopyTree, then just copy the whole of the /updates folder (inc directories) to the App Directory
try try
if ParamStrUTF8(5) = 'copytree' then if ParamStrUTF8(5) = 'copytree' then
// Copy a whole directory tree? // Copy a whole directory tree?
bCopyTreeSuccess := CopyDirTree(szUpdatesFullPath, ProgramDirectory, bCopyTreeSuccess := CopyDirTree(szUpdatesFullPath, ProgramDirectory,
[cffOverwriteFile, cffCreateDestDirectory]); [cffOverwriteFile, cffCreateDestDirectory]);
except except
On E: Exception do On E: Exception do
WriteAndLog('Copytree error: ' + E.Message); WriteAndLog('Copytree error: ' + E.Message);
end; end;
// CopyTree not specified, or operation failed // CopyTree not specified, or operation failed
// Just copy the updated app over the old one // Just copy the updated app over the old one
if FileExistsUTF8(szUpdatedEXEPath) then if FileExistsUTF8(szUpdatedEXEPath) then
begin begin
if (bCopyTreeSuccess = False) then if (bCopyTreeSuccess = False) then
// Copy over exe file // Copy over exe file
if Fileutil.CopyFile(szUpdatedEXEPath, szOldEXEPath, [cffOverWriteFile]) then if Fileutil.CopyFile(szUpdatedEXEPath, szOldEXEPath, [cffOverWriteFile]) then
begin begin
WriteAndLog('Copying over executeable, then sleeping...'); WriteAndLog('Copying over executeable, then sleeping...');
{$IFDEF HAS_SLEEP} {$IFDEF HAS_SLEEP}
WriteAndLog('Sleeping...'); WriteAndLog('Sleeping...');
Sleep(1000); // give more time for calling app to close Sleep(1000); // give more time for calling app to close
{$ELSE} {$ELSE}
WriteAndLog('Waiting 1 second...'); WriteAndLog('Waiting 1 second...');
WaitFor(1000); WaitFor(1000);
{$ENDIF} {$ENDIF}
end end
else else
WriteAndLog('Copy to ' + szUpdatedEXEPath + ' failed'); WriteAndLog('Copy to ' + szUpdatedEXEPath + ' failed');
// Restart updated app // Restart updated app
if FileExistsUTF8(szOldEXEPath) then if FileExistsUTF8(szOldEXEPath) then
begin begin
WriteAndLog('Restarting ' + szPrettyName + '...'); WriteAndLog('Restarting ' + szPrettyName + '...');
AppProcess := TProcess.Create(nil); AppProcess := TProcess.Create(nil);
try try
AppProcess.CurrentDirectory := ExtractFileDir(szOldEXEPath); AppProcess.CurrentDirectory := ExtractFileDir(szOldEXEPath);
AppProcess.Executable := szOldEXEPath; AppProcess.Executable := szOldEXEPath;
AppProcess.StartupOptions := [suoUseShowWindow]; AppProcess.StartupOptions := [suoUseShowWindow];
AppProcess.Execute; AppProcess.Execute;
finally finally
AppProcess.Free; AppProcess.Free;
end; end;
end end
else else
WriteAndLog('Failure. Couldn''t find ' + szOldEXEPath); WriteAndLog('Failure. Couldn''t find ' + szOldEXEPath);
end end
else else
WriteAndLog('Failure. Couldn''t find ' + szUpdatedEXEPath); WriteAndLog('Failure. Couldn''t find ' + szUpdatedEXEPath);
Logger.Info('End of Log'); Logger.Info('End of Log');
Logger.Active := False; Logger.Active := False;
FreeAndNil(Logger); FreeAndNil(Logger);
end. end.

View File

@@ -1,274 +1,274 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<CONFIG> <CONFIG>
<ProjectSession> <ProjectSession>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Version Value="9"/> <Version Value="9"/>
<BuildModes Active="Win64 Release"/> <BuildModes Active="Win64 Release"/>
<Units Count="25"> <Units Count="25">
<Unit0> <Unit0>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<IsVisibleTab Value="True"/> <IsVisibleTab Value="True"/>
<TopLine Value="114"/> <TopLine Value="114"/>
<CursorPos X="36" Y="292"/> <CursorPos X="36" Y="292"/>
<UsageCount Value="76"/> <UsageCount Value="76"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="copydir.pas"/> <Filename Value="copydir.pas"/>
<TopLine Value="333"/> <TopLine Value="333"/>
<CursorPos X="22" Y="333"/> <CursorPos X="22" Y="333"/>
<UsageCount Value="32"/> <UsageCount Value="32"/>
</Unit1> </Unit1>
<Unit2> <Unit2>
<Filename Value="upoweredby.pas"/> <Filename Value="upoweredby.pas"/>
<TopLine Value="6"/> <TopLine Value="6"/>
<CursorPos X="47" Y="27"/> <CursorPos X="47" Y="27"/>
<UsageCount Value="6"/> <UsageCount Value="6"/>
</Unit2> </Unit2>
<Unit3> <Unit3>
<Filename Value="D:\Lazarus32_production\components\splashabout\usplashabout.pas"/> <Filename Value="D:\Lazarus32_production\components\splashabout\usplashabout.pas"/>
<TopLine Value="65"/> <TopLine Value="65"/>
<CursorPos X="79" Y="86"/> <CursorPos X="79" Y="86"/>
<UsageCount Value="6"/> <UsageCount Value="6"/>
</Unit3> </Unit3>
<Unit4> <Unit4>
<Filename Value="ulazautoupdate.pas"/> <Filename Value="ulazautoupdate.pas"/>
<TopLine Value="112"/> <TopLine Value="112"/>
<CursorPos X="43" Y="24"/> <CursorPos X="43" Y="24"/>
<UsageCount Value="7"/> <UsageCount Value="7"/>
</Unit4> </Unit4>
<Unit5> <Unit5>
<Filename Value="..\..\..\healthmonitor\svn\trunk\updatefromsourceforge.pas"/> <Filename Value="..\..\..\healthmonitor\svn\trunk\updatefromsourceforge.pas"/>
<TopLine Value="22"/> <TopLine Value="22"/>
<CursorPos X="44" Y="49"/> <CursorPos X="44" Y="49"/>
<UsageCount Value="7"/> <UsageCount Value="7"/>
</Unit5> </Unit5>
<Unit6> <Unit6>
<Filename Value="D:\Lazarus32_production\components\ideintf\propedits.pp"/> <Filename Value="D:\Lazarus32_production\components\ideintf\propedits.pp"/>
<TopLine Value="619"/> <TopLine Value="619"/>
<UsageCount Value="7"/> <UsageCount Value="7"/>
</Unit6> </Unit6>
<Unit7> <Unit7>
<Filename Value="D:\Lazarus32_production\components\lazutils\fileutil.pas"/> <Filename Value="D:\Lazarus32_production\components\lazutils\fileutil.pas"/>
<TopLine Value="76"/> <TopLine Value="76"/>
<CursorPos X="9" Y="77"/> <CursorPos X="9" Y="77"/>
<UsageCount Value="11"/> <UsageCount Value="11"/>
</Unit7> </Unit7>
<Unit8> <Unit8>
<Filename Value="..\..\..\copydir.pas"/> <Filename Value="..\..\..\copydir.pas"/>
<TopLine Value="94"/> <TopLine Value="94"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit8> </Unit8>
<Unit9> <Unit9>
<Filename Value="D:\development\fpc\rtl\objpas\sysutils\osutilsh.inc"/> <Filename Value="D:\development\fpc\rtl\objpas\sysutils\osutilsh.inc"/>
<CursorPos Y="27"/> <CursorPos Y="27"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit9> </Unit9>
<Unit10> <Unit10>
<Filename Value="D:\development\lazarus\lcl\extctrls.pp"/> <Filename Value="D:\development\lazarus\lcl\extctrls.pp"/>
<TopLine Value="165"/> <TopLine Value="165"/>
<CursorPos X="47" Y="198"/> <CursorPos X="47" Y="198"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit10> </Unit10>
<Unit11> <Unit11>
<Filename Value="D:\development\lazarus\lcl\customtimer.pas"/> <Filename Value="D:\development\lazarus\lcl\customtimer.pas"/>
<TopLine Value="91"/> <TopLine Value="91"/>
<CursorPos X="30" Y="129"/> <CursorPos X="30" Y="129"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit11> </Unit11>
<Unit12> <Unit12>
<Filename Value="D:\development\lazarus\lcl\interfacebase.pp"/> <Filename Value="D:\development\lazarus\lcl\interfacebase.pp"/>
<CursorPos X="19" Y="18"/> <CursorPos X="19" Y="18"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit12> </Unit12>
<Unit13> <Unit13>
<Filename Value="D:\development\fpc\rtl\linux\linux.pp"/> <Filename Value="D:\development\fpc\rtl\linux\linux.pp"/>
<CursorPos X="45" Y="28"/> <CursorPos X="45" Y="28"/>
<UsageCount Value="11"/> <UsageCount Value="11"/>
</Unit13> </Unit13>
<Unit14> <Unit14>
<Filename Value="D:\development\fpc\packages\fcl-base\src\eventlog.pp"/> <Filename Value="D:\development\fpc\packages\fcl-base\src\eventlog.pp"/>
<TopLine Value="70"/> <TopLine Value="70"/>
<CursorPos X="30" Y="26"/> <CursorPos X="30" Y="26"/>
<UsageCount Value="11"/> <UsageCount Value="11"/>
</Unit14> </Unit14>
<Unit15> <Unit15>
<Filename Value="D:\development\lazarus\components\lazutils\fileutil.pas"/> <Filename Value="D:\development\lazarus\components\lazutils\fileutil.pas"/>
<TopLine Value="194"/> <TopLine Value="194"/>
<CursorPos X="21" Y="218"/> <CursorPos X="21" Y="218"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit15> </Unit15>
<Unit16> <Unit16>
<Filename Value="D:\development\lazarus\components\lazutils\fileutil.inc"/> <Filename Value="D:\development\lazarus\components\lazutils\fileutil.inc"/>
<TopLine Value="680"/> <TopLine Value="680"/>
<CursorPos X="3" Y="714"/> <CursorPos X="3" Y="714"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit16> </Unit16>
<Unit17> <Unit17>
<Filename Value="D:\development\fpc\rtl\objpas\dateutils.pp"/> <Filename Value="D:\development\fpc\rtl\objpas\dateutils.pp"/>
<CursorPos X="13"/> <CursorPos X="13"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit17> </Unit17>
<Unit18> <Unit18>
<Filename Value="D:\development\fpc\rtl\objpas\dateutil.inc"/> <Filename Value="D:\development\fpc\rtl\objpas\dateutil.inc"/>
<TopLine Value="196"/> <TopLine Value="196"/>
<CursorPos X="29" Y="214"/> <CursorPos X="29" Y="214"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit18> </Unit18>
<Unit19> <Unit19>
<Filename Value="D:\development\fpc\rtl\objpas\dateutil.pp"/> <Filename Value="D:\development\fpc\rtl\objpas\dateutil.pp"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit19> </Unit19>
<Unit20> <Unit20>
<Filename Value="trayicon\umainform.pas"/> <Filename Value="trayicon\umainform.pas"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<TopLine Value="103"/> <TopLine Value="103"/>
<CursorPos X="43" Y="126"/> <CursorPos X="43" Y="126"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit20> </Unit20>
<Unit21> <Unit21>
<Filename Value="updatepack\updatepack.lpr"/> <Filename Value="updatepack\updatepack.lpr"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<CursorPos X="89" Y="24"/> <CursorPos X="89" Y="24"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit21> </Unit21>
<Unit22> <Unit22>
<Filename Value="..\..\..\..\..\lazarus\components\lazutils\lazutf8.pas"/> <Filename Value="..\..\..\..\..\lazarus\components\lazutils\lazutf8.pas"/>
<UnitName Value="LazUTF8"/> <UnitName Value="LazUTF8"/>
<EditorIndex Value="3"/> <EditorIndex Value="3"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit22> </Unit22>
<Unit23> <Unit23>
<Filename Value="..\..\..\..\..\lazarus\components\lazutils\lazfileutils.pas"/> <Filename Value="..\..\..\..\..\lazarus\components\lazutils\lazfileutils.pas"/>
<UnitName Value="LazFileUtils"/> <UnitName Value="LazFileUtils"/>
<EditorIndex Value="2"/> <EditorIndex Value="2"/>
<TopLine Value="61"/> <TopLine Value="61"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit23> </Unit23>
<Unit24> <Unit24>
<Filename Value="..\..\..\..\..\fpc\packages\fcl-process\src\process.pp"/> <Filename Value="..\..\..\..\..\fpc\packages\fcl-process\src\process.pp"/>
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<TopLine Value="76"/> <TopLine Value="76"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit24> </Unit24>
</Units> </Units>
<JumpHistory Count="28" HistoryIndex="27"> <JumpHistory Count="28" HistoryIndex="27">
<Position1> <Position1>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="47" Column="92" TopLine="19"/> <Caret Line="47" Column="92" TopLine="19"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="34" Column="6" TopLine="13"/> <Caret Line="34" Column="6" TopLine="13"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="55" Column="65" TopLine="9"/> <Caret Line="55" Column="65" TopLine="9"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="81" Column="53" TopLine="27"/> <Caret Line="81" Column="53" TopLine="27"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="101" Column="52" TopLine="69"/> <Caret Line="101" Column="52" TopLine="69"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="8"/> <Caret Line="8"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="90" Column="6" TopLine="67"/> <Caret Line="90" Column="6" TopLine="67"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="30" Column="5" TopLine="13"/> <Caret Line="30" Column="5" TopLine="13"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="27" Column="15" TopLine="4"/> <Caret Line="27" Column="15" TopLine="4"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="98" Column="49" TopLine="58"/> <Caret Line="98" Column="49" TopLine="58"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="8" Column="22" TopLine="2"/> <Caret Line="8" Column="22" TopLine="2"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="98" Column="44" TopLine="74"/> <Caret Line="98" Column="44" TopLine="74"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="57" Column="29" TopLine="13"/> <Caret Line="57" Column="29" TopLine="13"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="30" Column="23"/> <Caret Line="30" Column="23"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="113" Column="14" TopLine="94"/> <Caret Line="113" Column="14" TopLine="94"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="158" Column="28" TopLine="134"/> <Caret Line="158" Column="28" TopLine="134"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="164" Column="21" TopLine="146"/> <Caret Line="164" Column="21" TopLine="146"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="169" Column="50" TopLine="148"/> <Caret Line="169" Column="50" TopLine="148"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="181" Column="90" TopLine="148"/> <Caret Line="181" Column="90" TopLine="148"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="237" Column="84" TopLine="196"/> <Caret Line="237" Column="84" TopLine="196"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="73" Column="29" TopLine="53"/> <Caret Line="73" Column="29" TopLine="53"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="47" Column="10" TopLine="23"/> <Caret Line="47" Column="10" TopLine="23"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="2" Column="9"/> <Caret Line="2" Column="9"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="213" Column="46" TopLine="170"/> <Caret Line="213" Column="46" TopLine="170"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="52" Column="77" TopLine="34"/> <Caret Line="52" Column="77" TopLine="34"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="55" Column="38" TopLine="45"/> <Caret Line="55" Column="38" TopLine="45"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="60" Column="14" TopLine="31"/> <Caret Line="60" Column="14" TopLine="31"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="updatehm.lpr"/> <Filename Value="updatehm.lpr"/>
<Caret Line="312" Column="58" TopLine="279"/> <Caret Line="312" Column="58" TopLine="279"/>
</Position28> </Position28>
</JumpHistory> </JumpHistory>
</ProjectSession> </ProjectSession>
</CONFIG> </CONFIG>