"Fossies" - the Fresh Open Source Software Archive

Member "snapcraft-3.8/windows/modpath.iss" (9 Sep 2019, 6326 Bytes) of package /linux/misc/snapcraft-3.8.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Inno Setup source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 // ----------------------------------------------------------------------------
    2 //
    3 // Inno Setup Ver:  5.4.2
    4 // Script Version:  1.4.2
    5 // Author:          Jared Breland <jbreland@legroom.net>
    6 // Homepage:        http://www.legroom.net/software
    7 // License:         GNU Lesser General Public License (LGPL), version 3
    8 //                      http://www.gnu.org/licenses/lgpl.html
    9 //
   10 // Script Function:
   11 //  Allow modification of environmental path directly from Inno Setup installers
   12 //
   13 // Instructions:
   14 //  Copy modpath.iss to the same directory as your setup script
   15 //
   16 //  Add this statement to your [Setup] section
   17 //      ChangesEnvironment=true
   18 //
   19 //  Add this statement to your [Tasks] section
   20 //  You can change the Description or Flags
   21 //  You can change the Name, but it must match the ModPathName setting below
   22 //      Name: modifypath; Description: &Add application directory to your environmental path; Flags: unchecked
   23 //
   24 //  Add the following to the end of your [Code] section
   25 //  ModPathName defines the name of the task defined above
   26 //  ModPathType defines whether the 'user' or 'system' path will be modified;
   27 //      this will default to user if anything other than system is set
   28 //  setArrayLength must specify the total number of dirs to be added
   29 //  Result[0] contains first directory, Result[1] contains second, etc.
   30 //      const
   31 //          ModPathName = 'modifypath';
   32 //          ModPathType = 'user';
   33 //
   34 //      function ModPathDir(): TArrayOfString;
   35 //      begin
   36 //          setArrayLength(Result, 1);
   37 //          Result[0] := ExpandConstant('{app}');
   38 //      end;
   39 //      #include "modpath.iss"
   40 // ----------------------------------------------------------------------------
   41 
   42 procedure ModPath();
   43 var
   44     oldpath:    String;
   45     newpath:    String;
   46     updatepath: Boolean;
   47     pathArr:    TArrayOfString;
   48     aExecFile:  String;
   49     aExecArr:   TArrayOfString;
   50     i, d:       Integer;
   51     pathdir:    TArrayOfString;
   52     regroot:    Integer;
   53     regpath:    String;
   54 
   55 begin
   56     // Get constants from main script and adjust behavior accordingly
   57     // ModPathType MUST be 'system' or 'user'; force 'user' if invalid
   58     if ModPathType = 'system' then begin
   59         regroot := HKEY_LOCAL_MACHINE;
   60         regpath := 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
   61     end else begin
   62         regroot := HKEY_CURRENT_USER;
   63         regpath := 'Environment';
   64     end;
   65 
   66     // Get array of new directories and act on each individually
   67     pathdir := ModPathDir();
   68     for d := 0 to GetArrayLength(pathdir)-1 do begin
   69         updatepath := true;
   70 
   71         // Modify WinNT path
   72         if UsingWinNT() = true then begin
   73 
   74             // Get current path, split into an array
   75             RegQueryStringValue(regroot, regpath, 'Path', oldpath);
   76             oldpath := oldpath + ';';
   77             i := 0;
   78 
   79             while (Pos(';', oldpath) > 0) do begin
   80                 SetArrayLength(pathArr, i+1);
   81                 pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1);
   82                 oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath));
   83                 i := i + 1;
   84 
   85                 // Check if current directory matches app dir
   86                 if pathdir[d] = pathArr[i-1] then begin
   87                     // if uninstalling, remove dir from path
   88                     if IsUninstaller() = true then begin
   89                         continue;
   90                     // if installing, flag that dir already exists in path
   91                     end else begin
   92                         updatepath := false;
   93                     end;
   94                 end;
   95 
   96                 // Add current directory to new path
   97                 if i = 1 then begin
   98                     newpath := pathArr[i-1];
   99                 end else begin
  100                     newpath := newpath + ';' + pathArr[i-1];
  101                 end;
  102             end;
  103 
  104             // Append app dir to path if not already included
  105             if (IsUninstaller() = false) AND (updatepath = true) then
  106                 newpath := newpath + ';' + pathdir[d];
  107 
  108             // Write new path
  109             RegWriteStringValue(regroot, regpath, 'Path', newpath);
  110 
  111         // Modify Win9x path
  112         end else begin
  113 
  114             // Convert to shortened dirname
  115             pathdir[d] := GetShortName(pathdir[d]);
  116 
  117             // If autoexec.bat exists, check if app dir already exists in path
  118             aExecFile := 'C:\AUTOEXEC.BAT';
  119             if FileExists(aExecFile) then begin
  120                 LoadStringsFromFile(aExecFile, aExecArr);
  121                 for i := 0 to GetArrayLength(aExecArr)-1 do begin
  122                     if IsUninstaller() = false then begin
  123                         // If app dir already exists while installing, skip add
  124                         if (Pos(pathdir[d], aExecArr[i]) > 0) then
  125                             updatepath := false;
  126                             break;
  127                     end else begin
  128                         // If app dir exists and = what we originally set, then delete at uninstall
  129                         if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then
  130                             aExecArr[i] := '';
  131                     end;
  132                 end;
  133             end;
  134 
  135             // If app dir not found, or autoexec.bat didn't exist, then (create and) append to current path
  136             if (IsUninstaller() = false) AND (updatepath = true) then begin
  137                 SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], True);
  138 
  139             // If uninstalling, write the full autoexec out
  140             end else begin
  141                 SaveStringsToFile(aExecFile, aExecArr, False);
  142             end;
  143         end;
  144     end;
  145 end;
  146 
  147 // Split a string into an array using passed delimiter
  148 procedure MPExplode(var Dest: TArrayOfString; Text: String; Separator: String);
  149 var
  150     i: Integer;
  151 begin
  152     i := 0;
  153     repeat
  154         SetArrayLength(Dest, i+1);
  155         if Pos(Separator,Text) > 0 then begin
  156             Dest[i] := Copy(Text, 1, Pos(Separator, Text)-1);
  157             Text := Copy(Text, Pos(Separator,Text) + Length(Separator), Length(Text));
  158             i := i + 1;
  159         end else begin
  160              Dest[i] := Text;
  161              Text := '';
  162         end;
  163     until Length(Text)=0;
  164 end;
  165 
  166 procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
  167 var
  168     aSelectedTasks: TArrayOfString;
  169     i:              Integer;
  170     taskname:       String;
  171     regpath:        String;
  172     regstring:      String;
  173     appid:          String;
  174 begin
  175     // only run during actual uninstall
  176     if CurUninstallStep = usUninstall then begin
  177         // get list of selected tasks saved in registry at install time
  178         appid := '{#emit SetupSetting("AppId")}';
  179         if appid = '' then appid := '{#emit SetupSetting("AppName")}';
  180         regpath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+appid+'_is1');
  181         RegQueryStringValue(HKLM, regpath, 'Inno Setup: Selected Tasks', regstring);
  182         if regstring = '' then RegQueryStringValue(HKCU, regpath, 'Inno Setup: Selected Tasks', regstring);
  183 
  184         // check each task; if matches modpath taskname, trigger patch removal
  185         if regstring <> '' then begin
  186             taskname := ModPathName;
  187             MPExplode(aSelectedTasks, regstring, ',');
  188             if GetArrayLength(aSelectedTasks) > 0 then begin
  189                 for i := 0 to GetArrayLength(aSelectedTasks)-1 do begin
  190                     if comparetext(aSelectedTasks[i], taskname) = 0 then
  191                         ModPath();
  192                 end;
  193             end;
  194         end;
  195     end;
  196 end;