blob: 1227b9a7481142b64b44894eacc042bf8987437b [file] [log] [blame]
;This file has been created by Adam Twardoch <adam@twardoch.com>
;See README.TXT in this folder for instructions on building the setup
[Setup]
AppName=TTX
AppVerName=TTX 2.0 r040926 for Windows
AppPublisher=Just van Rossum
AppPublisherURL=http://www.letterror.com/code/ttx/
AppSupportURL=http://www.font.org/software/ttx/
AppUpdatesURL=http://www.font.org/software/ttx/
DefaultDirName={pf}\TTX
DefaultGroupName=TTX
AllowNoIcons=false
LicenseFile=..\LICENSE.txt
InfoBeforeFile=fonttools-win-setup.txt
InfoAfterFile=..\Doc\changes.txt
OutputBaseFilename=WinTTX2.0r040926
AppCopyright=Copyright 1999-2004 by Just van Rossum, Letterror, The Netherlands.
UninstallDisplayIcon={app}\ttx.ico
[Tasks]
Name: desktopicon; Description: Create a &desktop icon; GroupDescription: Additional icons:
[Files]
Source: ..\dist\ttx\*.*; DestDir: {app}; Flags: ignoreversion promptifolder
Source: ..\LICENSE.txt; DestDir: {app}; Flags: ignoreversion promptifolder
Source: ..\Doc\documentation.html; DestDir: {app}; Flags: ignoreversion promptifolder
Source: ..\Doc\changes.txt; DestDir: {app}; Flags: ignoreversion promptifolder
Source: ..\Doc\bugs.txt; DestDir: {app}; Flags: ignoreversion promptifolder
Source: fonttools-win-setup.txt; DestDir: {app}; Flags: ignoreversion promptifolder
Source: ttx.ico; DestDir: {app}; Flags: ignoreversion promptifolder; AfterInstall: AddFolderToPathVariable
[Icons]
Name: {userdesktop}\ttx.exe; Filename: {app}\ttx.exe; Tasks: desktopicon; IconFilename: {app}\ttx.ico; IconIndex: 0
Name: {group}\TTX; Filename: {app}\ttx.exe; Tasks: desktopicon; IconFilename: {app}\ttx.ico; IconIndex: 0
Name: {group}\TTX documentation; Filename: {app}\documentation.html; IconIndex: 0
Name: {group}\Changes; Filename: {app}\changes.txt; IconIndex: 0
Name: {group}\Bugs; Filename: {app}\bugs.txt; IconIndex: 0
Name: {group}\License; Filename: {app}\LICENSE.txt; IconIndex: 0
Name: {group}\Uninstall TTX; Filename: {uninstallexe}; IconIndex: 0
Name: {reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders,SendTo}\TTX; Filename: {app}\ttx.exe; WorkingDir: {reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders,SendTo}; IconFilename: {app}\ttx.ico; IconIndex: 0; MinVersion: 0,5.00.2195
[_ISTool]
EnableISX=true
[Registry]
Root: HKCR; Subkey: .ttx; ValueType: string; ValueData: {reg:HKCR\.xml,}; Flags: createvalueifdoesntexist uninsdeletekey
[Code]
//
// InnoSetup Extensions Knowledge Base
// Article 44 - Native ISX procedures for PATH modification
// http://www13.brinkster.com/vincenzog/isxart.asp?idart=44
// Author: Thomas Vedel
//
// Version log:
// 03/31/2003: Initial release (thv@lr.dk)
const
// Modification method
pmAddToBeginning = $1; // Add dir to beginning of Path
pmAddToEnd = $2; // Add dir to end of Path
pmAddAllways = $4; // Add also if specified dir is already included in existing path
pmAddOnlyIfDirExists = $8; // Add only if specified dir actually exists
pmRemove = $10; // Remove dir from path
pmRemoveSubdirsAlso = $20; // Remove dir and all subdirs from path
// Scope
psCurrentUser = 1; // Modify path for current user
psAllUsers = 2; // Modify path for all users
// Error results
mpOK = 0; // No errors
mpMissingRights = -1; // User has insufficient rights
mpAutoexecNoWriteacc = -2; // Autoexec can not be written (may be readonly)
mpBothAddAndRemove = -3; // User has specified that dir should both be removed from and added to path
{ Helper procedure: Split a path environment variable into individual dirnames }
procedure SplitPath(Path: string; var Dirs: TStringList);
var
pos: integer;
s: string;
begin
Dirs.Clear;
s := '';
pos := 1;
while (pos<=Length(Path)) do
begin
if (Path[pos]<>';') then
s := s + Path[pos];
if ((Path[pos]=';') or (pos=Length(Path))) then
begin
s := Trim(s);
s := RemoveQuotes(s);
s := Trim(s);
if (s <> '') then
Dirs.Add(s);
s := '';
end;
Pos := Pos + 1;
end;
end; // procedure SplitPath
{ Helper procedure: Concatenate individual dirnames into a path environment variable }
procedure ConcatPath(Dirs: TStringList; Quotes: boolean; var Path: string);
var
Index, MaxIndex: integer;
s: string;
begin
MaxIndex := Dirs.Count-1;
Path := '';
for Index := 0 to MaxIndex do
begin
s := Dirs.Strings[Index];
if ((Quotes) and (pos(' ',s) > 0)) then
s := AddQuotes(s);
Path := Path + s;
if (Index < MaxIndex) then
Path := Path + ';'
end;
end; // procedure ConcatPath
{ Helper function: Modifies path environment string }
procedure ModifyPathString(OldPath, DirName: string; Method: integer; Quotes: boolean; var ResultPath: string);
var
Dirs: TStringList;
DirNotInPath: Boolean;
i: integer;
begin
// Create Dirs variable
Dirs := TStringList.Create;
// Remove quotes form DirName
DirName := Trim(DirName);
DirName := RemoveQuotes(DirName);
DirName := Trim(DirName);
// Split old path in individual directory names
SplitPath(OldPath, Dirs);
// Check if dir is allready in path
DirNotInPath := True;
for i:=Dirs.Count-1 downto 0 do
begin
if (uppercase(Dirs.Strings[i]) = uppercase(DirName)) then
DirNotInPath := False;
end;
// Should dir be removed from existing Path?
if ((Method and (pmRemove or pmRemoveSubdirsAlso)) > 0) then
begin
for i:=Dirs.Count-1 downto 0 do
begin
if (((Method and pmRemoveSubdirsAlso) > 0) and (pos(uppercase(DirName)+'\', uppercase(Dirs.Strings[i])) = 1)) or
(((Method and (pmRemove) or (pmRemoveSubdirsAlso)) > 0) and (uppercase(DirName) = uppercase(Dirs.Strings[i])))
then
Dirs.Delete(i);
end;
end;
// Should dir be added to existing Path?
if ((Method and (pmAddToBeginning or pmAddToEnd)) > 0) then
begin
// Add dir to path
if (((Method and pmAddAllways) > 0) or DirNotInPath) then
begin
// Dir is not in path allready or should be added anyway
if (((Method and pmAddOnlyIfDirExists) = 0) or (DirExists(DirName))) then
begin
// Dir actually exsists or should be added anyway
if ((Method and pmAddToBeginning) > 0) then
Dirs.Insert(0, DirName)
else
Dirs.Append(DirName);
end;
end;
end;
// Concatenate directory names into one single path variable
ConcatPath(Dirs, Quotes, ResultPath);
// Finally free Dirs object
Dirs.Free;
end; // ModifyPathString
{ Helper function: Modify path on Windows 9x }
function ModifyPath9x(DirName: string; Method: integer): integer;
var
AutoexecLines: TStringList;
ActualLine: String;
PathLineNos: TStringList;
FirstPathLineNo: Integer;
OldPath, ResultPath: String;
LineNo, CharNo, Index: integer;
TempString: String;
begin
// Expect everything to be OK
result := mpOK;
// Create stringslists
AutoexecLines := TStringList.Create;
PathLineNos := TStringList.Create;
// Read existing path
OldPath := '';
LoadStringFromFile('c:\Autoexec.bat', TempString);
AutoexecLines.Text := TempString;
PathLineNos.Clear;
// Read Autoexec line by line
for LineNo := 0 to AutoexecLines.Count - 1 do begin
ActualLine := AutoexecLines.Strings[LineNo];
// Check if line starts with "PATH=" after first stripping spaces and other "fill-chars"
if Pos('=', ActualLine) > 0 then
begin
for CharNo := Pos('=', ActualLine)-1 downto 1 do
if (ActualLine[CharNo]=' ') or (ActualLine[CharNo]=#9) then
Delete(ActualLine, CharNo, 1);
if Pos('@', ActualLine) = 1 then
Delete(ActualLine, 1, 1);
if (Pos('PATH=', uppercase(ActualLine))=1) or (Pos('SETPATH=', uppercase(ActualLine))=1) then
begin
// Remove 'PATH=' and add path to "OldPath" variable
Delete(ActualLine, 1, pos('=', ActualLine));
// Check if an earlier PATH variable is referenced, but there has been no previous PATH defined in Autoexec
if (pos('%PATH%',uppercase(ActualLine))>0) and (PathLineNos.Count=0) then
OldPath := ExpandConstant('{win}') + ';' + ExpandConstant('{win}')+'\COMMAND';
if (pos('%PATH%',uppercase(ActualLine))>0) then
begin
ActualLine := Copy(ActualLine, 1, pos('%PATH%',uppercase(ActualLine))-1) +
OldPath +
Copy(ActualLine, pos('%PATH%',uppercase(ActualLine))+6, Length(ActualLine));
end;
OldPath := ActualLine;
// Update list of line numbers holding path variables
PathLineNos.Add(IntToStr(LineNo));
end;
end;
end;
// Save first line number in Autoexec.bat which modifies path environment variable
if PathLineNos.Count > 0 then
FirstPathLineNo := StrToInt(PathLineNos.Strings[0])
else
FirstPathLineNo := 0;
// Modify path
ModifyPathString(OldPath, DirName, Method, True, ResultPath);
// Write Modified path back to Autoexec.bat
// First delete all existing path references from Autoexec.bat
Index := PathLineNos.Count-1;
while (Index>=0) do
begin
AutoexecLines.Delete(StrToInt(PathLineNos.Strings[Index]));
Index := Index-1;
end;
// Then insert new path variable into Autoexec.bat
AutoexecLines.Insert(FirstPathLineNo, '@PATH='+ResultPath);
// Delete old Autoexec.bat from disk
if not DeleteFile('c:\Autoexec.bat') then
result := mpAutoexecNoWriteAcc;
Sleep(500);
// And finally write Autoexec.bat back to disk
if not (result=mpAutoexecNoWriteAcc) then
SaveStringToFile('c:\Autoexec.bat', AutoexecLines.Text, false);
// Free stringlists
PathLineNos.Free;
AutoexecLines.Free;
end; // ModifyPath9x
{ Helper function: Modify path on Windows NT, 2000 and XP }
function ModifyPathNT(DirName: string; Method, Scope: integer): integer;
var
RegRootKey: integer;
RegSubKeyName: string;
RegValueName: string;
OldPath, ResultPath: string;
OK: boolean;
begin
// Expect everything to be OK
result := mpOK;
// Initialize registry key and value names to reflect if changes should be global or local to current user only
case Scope of
psCurrentUser:
begin
RegRootKey := HKEY_CURRENT_USER;
RegSubKeyName := 'Environment';
RegValueName := 'Path';
end;
psAllUsers:
begin
RegRootKey := HKEY_LOCAL_MACHINE;
RegSubKeyName := 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
RegValueName := 'Path';
end;
end;
// Read current path value from registry
OK := RegQueryStringValue(RegRootKey, RegSubKeyName, RegValueName, OldPath);
if not OK then
begin
result := mpMissingRights;
Exit;
end;
// Modify path
ModifyPathString(OldPath, DirName, Method, False, ResultPath);
// Write new path value to registry
if not RegWriteStringValue(RegRootKey, RegSubKeyName, RegValueName, ResultPath) then
begin
result := mpMissingRights;
Exit;
end;
end; // ModifyPathNT
{ Main function: Modify path }
function ModifyPath(Path: string; Method, Scope: integer): integer;
begin
// Check if both add and remove has been specified (= error!)
if (Method and (pmAddToBeginning or pmAddToEnd) and (pmRemove or pmRemoveSubdirsAlso)) > 0 then
begin
result := mpBothAddAndRemove;
Exit;
end;
// Perform directory constant expansion
Path := ExpandConstantEx(Path, ' ', ' ');
// Test if Win9x
if InstallOnThisVersion('4,0','0,0') = irInstall then
ModifyPath9x(Path, Method);
// Test if WinNT, 2000 or XP
if InstallOnThisVersion('0,4','0,0') = irInstall then
ModifyPathNT(Path, Method, Scope);
end; // ModifyPath
procedure AddFolderToPathVariable();
begin
ModifyPath('{app}', pmAddToBeginning, psAllUsers);
ModifyPath('{app}', pmAddToBeginning, psCurrentUser);
end;