summary refs log tree commit diff stats
path: root/tools/niminst/inno.nimf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/niminst/inno.nimf')
-rw-r--r--tools/niminst/inno.nimf182
1 files changed, 182 insertions, 0 deletions
diff --git a/tools/niminst/inno.nimf b/tools/niminst/inno.nimf
new file mode 100644
index 000000000..ef2da8a75
--- /dev/null
+++ b/tools/niminst/inno.nimf
@@ -0,0 +1,182 @@
+#? stdtmpl | standard
+#proc generateInnoSetup(c: ConfigData): string =
+#  result = ""
+; Default Template for NimInst
+[Setup]
+AppName=$c.displayName
+AppVerName=$c.displayName $c.version
+DefaultDirName={code:GiveMeAPath|$c.displayName}
+DefaultGroupName=$c.displayName
+AllowNoIcons=yes
+LicenseFile=${expandFilename(c.license)}
+OutputBaseFilename=${c.name}_${c.version}
+Compression=lzma
+SolidCompression=yes
+PrivilegesRequired=none
+ChangesEnvironment=yes
+
+[Languages]
+Name: english; MessagesFile: compiler:Default.isl
+
+[Files] 
+  #for i in low(FileCategory)..fcWindows:
+  #  for f in items(c.cat[i]):
+Source: ${expandFilename(f).toWin}; DestDir: {app}\${splitFile(f).dir.toWin}; Flags: ignoreversion
+  #  end for
+  #end for
+
+[Icons]
+  #if c.app == appConsole:
+Name: {group}\Console for $c.displayName; Filename: {cmd}
+  #else:
+Name: {group}\$c.displayName; Filename: {app}\${c.name}.exe
+  #end if
+  #for f in items(c.cat[fcDocStart]):
+Name: {group}\Documentation; Filename: {app}\${f.toWin}
+  #end for
+Name: {group}\{cm:UninstallProgram,$c.displayName}; Filename: {uninstallexe}
+
+  #if c.binPaths.len > 0:
+[Tasks]
+Name: modifypath; Description: &Add $c.displayName to your system path (if not in path already);
+  #end if
+
+[Code]
+function GiveMeAPath(const DefaultPathName: string): string;
+begin
+  if IsAdminLoggedOn then result := ExpandConstant('{pf}')
+  else result := ExpandConstant('{userdocs}');
+  result := result + '\' + DefaultPathName;
+end;
+
+  #if c.binPaths.len > 0:
+// ----------------------------------------------------------------------------
+//
+// Inno Setup Ver:  5.2.1
+// Script Version:  1.3.1
+// Author:          Jared Breland <jbreland@legroom.net>
+// Homepage:    http://www.legroom.net/software
+//
+// Script Function:
+//  Enable modification of system path directly from Inno Setup installers
+
+function ModPathDir(): TArrayOfString;
+begin
+  setArrayLength(result, $c.binPaths.len);
+    #var i = 0
+    #for b in items(c.binPaths):
+  result[$i] := ExpandConstant('{app}') + '\${b.toWin}';
+      #inc(i)
+    #end for
+end;
+
+procedure ModPath();
+var
+  oldpath, newpath, aExecFile: String;
+  pathArr, aExecArr, pathdir: TArrayOfString;
+  i, d: Integer;
+begin
+  // Get array of new directories and act on each individually
+  pathdir := ModPathDir();
+  for d := 0 to GetArrayLength(pathdir)-1 do begin
+    // Modify WinNT path
+    if UsingWinNT() then begin
+      // Get current path, split into an array
+      RegQueryStringValue(HKEY_LOCAL_MACHINE,
+        'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
+        'Path', oldpath);
+      oldpath := oldpath + ';';
+      i := 0;
+      while (Pos(';', oldpath) > 0) do begin
+        SetArrayLength(pathArr, i+1);
+        pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1);
+        oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath));
+        i := i + 1;
+        // Check if current directory matches app dir
+        if pathdir[d] = pathArr[i-1] then begin
+          // if uninstalling, remove dir from path
+          if IsUninstaller() then continue
+          // if installing, abort because dir was already in path
+          else abort;
+        end;
+        // Add current directory to new path
+        if i = 1 then newpath := pathArr[i-1]
+        else newpath := newpath + ';' + pathArr[i-1];
+      end;
+      // Append app dir to path if not already included
+      if not IsUninstaller() then
+        newpath := newpath + ';' + pathdir[d];
+      // Write new path
+      RegWriteStringValue(HKEY_LOCAL_MACHINE,
+        'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
+        'Path', newpath);
+    end
+    else begin
+      // Modify Win9x path
+      // Convert to shortened dirname
+      pathdir[d] := GetShortName(pathdir[d]);
+      // If autoexec.bat exists, check if app dir already exists in path
+      aExecFile := 'C:\AUTOEXEC.BAT';
+      if FileExists(aExecFile) then begin
+        LoadStringsFromFile(aExecFile, aExecArr);
+        for i := 0 to GetArrayLength(aExecArr)-1 do begin
+          if not IsUninstaller() then begin
+            // If app dir already exists while installing, abort add
+            if (Pos(pathdir[d], aExecArr[i]) > 0) then
+              abort;
+          end
+          else begin
+            // If app dir exists and = what we originally set,
+            // then delete at uninstall
+            if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then
+              aExecArr[i] := '';
+          end;
+        end;
+      end;
+      // If app dir not found, or autoexec.bat didn't exist, then
+      // (create and) append to current path
+      if not IsUninstaller() then begin
+        SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d],
+                         True);
+      end
+      else begin
+        // If uninstalling, write the full autoexec out
+        SaveStringsToFile(aExecFile, aExecArr, False);
+      end;
+    end;
+
+    // Write file to flag modifypath was selected
+    // Workaround since IsTaskSelected() cannot be called at uninstall and
+    // AppName and AppId cannot be "read" in Code section
+    if not IsUninstaller() then
+      SaveStringToFile(ExpandConstant('{app}') + '\uninsTasks.txt',
+                       WizardSelectedTasks(False), False);
+  end;
+end;
+
+procedure CurStepChanged(CurStep: TSetupStep);
+begin
+  if CurStep = ssPostInstall then begin
+    if IsTaskSelected('modifypath') then
+      ModPath();
+  end
+end;
+
+procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
+var
+  appdir, selectedTasks: String;
+begin
+  appdir := ExpandConstant('{app}');
+  if CurUninstallStep = usUninstall then begin
+    if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then
+      if Pos('modifypath', selectedTasks) > 0 then
+        ModPath();
+    DeleteFile(appdir + '\uninsTasks.txt')
+  end;
+end;
+
+function NeedRestart(): Boolean;
+begin
+  result := IsTaskSelected('modifypath') and not UsingWinNT()
+end;
+  #end if