;This file has been created by Adam Twardoch ;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;