Subversion Repositories factorylink.statist

Rev

Blame | Last modification | View Log | Download

; -- statist.iss --
; Copyright (C) 2008 RLD Automation
; FL7.5.1, Windows 2003 + XP

#pragma option -v+
#pragma verboselevel 9

#define Debug
#define Company "RLD Automation"
;FactoryLink version
#define FlVer "Fl660"
;FactoryLink and/or OS version and SP required
#define SysVer "FL660 Windows NT4 (with SP4 or higher)"

;Application definitions
#define AppName  "Statistical calculations"
#define AppId    "STATIST"
#define AppShort "Statist"
#define BaseDir  "..\..\..\Flink"
#define FlAppVersion GetFileVersion(BaseDir+"\Bin\"+FlVer+"\"+AppShort+".exe")

;Entry for ctlist file
#define CtList "stat_ctr stat_inf"

;Key files to add
#define Key1 ""
#define Key2 ""
#define Key3 ""
#define Key4 ""
#define Key5 ""

;Message files to add
#define Msg1 "statist"
#define Msg2 "stat_ac"
#define Msg3 ""

[Setup]
AppName={#AppName}
AppVerName={#AppName} {#FlAppVersion}, for {#SysVer}
AppCopyright=Copyright © 2008 {#Company}.
AppPublisher={#Company}
AppPublisherURL=http://www.rldautomation.eu
AppSupportURL=http://www.rldautomation.eu
AppUpdatesURL=http://www.rldautomation.eu
AppVersion=1.0 ;{#FlAppVersion}

OutputBaseFilename={#AppShort}Install{#FlVer}
OutputDir=..\..\Setup\{#FlVer}

WizardImageFile=..\SetupModern23.bmp
WizardSmallImageFile=..\MicrosoftModernSmall05.bmp

Uninstallable=no
UninstallDisplayIcon={app}\{#AppShort}.exe
UninstallDisplayName={#AppName}
UninstallFilesDir={app}

LicenseFile=..\license.txt
;InfoBeforeFile=..\infobefore.txt

PrivilegesRequired=admin
RestartIfNeededByRun=yes
;AlwaysRestart=yes
DisableStartupPrompt=yes
DisableProgramGroupPage=yes
DiskSpanning=0
DefaultDirName={code:GetPrgDir|{pf}\{#AppShort}}
;DefaultGroupName={#Company}
DirExistsWarning=no
MinVersion=4,4
UsePreviousAppDir=yes
WizardStyle=modern
UninstallStyle=modern
WindowVisible=false
BackColor=clSilver
BackColor2=clBlack
BackColorDirection=toptobottom
;WizardDebug=no

[Types]
Name: full; Description: Full installation
;Name: "compact"; Description: "Compact installation"
Name: custom; Description: Custom installation; Flags: iscustom

[Components]
Name: main; Description: {#AppName}; Types: full custom; Flags: fixed
;Name: manual; Description: {#AppShort} Task Manual; Types: full
Name: debug; Description: {#AppShort} Task Debug Support-files; Types: full

[Files]
;FactoryLink files
Source: {#BaseDir}\Ac\{#AppShort}.ac; DestDir: {app}\ac; Components: main
;Source: {#BaseDir}\Ac\FlNTsys.acr; DestDir: {app}\ac; Components: main
;Source: {#BaseDir}\Ac\FlNTsys.h; DestDir: {app}\ac; Components: main
Source: {#BaseDir}\Bin\{#FlVer}\{#AppShort}.exe; DestDir: {app}\bin; Flags: ignoreversion; Components: main
Source: {#BaseDir}\Bin\{#FlVer}\{#AppShort}.map; DestDir: {app}\bin; Flags: ignoreversion; Components: debug
Source: {#BaseDir}\Bin\{#AppShort}.ini; DestDir: {app}\bin; Flags: confirmoverwrite; Components: main
;Source: {#BaseDir}\Bin\FlMsgRLD.dll; DestDir: {sys}; Flags: ignoreversion; Components: main
;Source: {#BaseDir}\Bin\BlackBox.dll; DestDir: {sys}; Flags: ignoreversion; Components: debug
;Source: {#BaseDir}\Bin\RLDTitle.exe; DestDir: {app}\bin; Flags: uninsneveruninstall; Components: main
Source: {#BaseDir}\Ctgen\{#AppShort}.ctg; DestDir: {app}\ctgen; Components: main
Source: {#BaseDir}\Ctgen\{#AppShort}.rtm; DestDir: {app}\ctgen; Components: main
Source: {#BaseDir}\Help\en\{#AppShort}.hlp; DestDir: {app}\help\de; Components: main
Source: {#BaseDir}\Help\en\{#AppShort}.hlp; DestDir: {app}\help\en; Components: main
Source: {#BaseDir}\Help\en\{#AppShort}.hlp; DestDir: {app}\help\fr; Components: main
;Source: {#BaseDir}\Help\en\{#AppShort}.ahs; DestDir: {app}\help\de; Components: main
;Source: {#BaseDir}\Help\en\{#AppShort}.ahs; DestDir: {app}\help\en; Components: main
;Source: {#BaseDir}\Help\en\{#AppShort}.ahs; DestDir: {app}\help\fr; Components: main
#if (len(Key1) > 0)
Source: {#BaseDir}\Key\En\{#Key1}.key; DestDir: {app}\key\de; Components: main
Source: {#BaseDir}\Key\En\{#Key1}.key; DestDir: {app}\key\en; Components: main
Source: {#BaseDir}\Key\En\{#Key1}.key; DestDir: {app}\key\fr; Components: main
#endif
#if (len(Key2) > 0)
Source: {#BaseDir}\Key\En\{#Key2}.key; DestDir: {app}\key\de; Components: main
Source: {#BaseDir}\Key\En\{#Key2}.key; DestDir: {app}\key\en; Components: main
Source: {#BaseDir}\Key\En\{#Key2}.key; DestDir: {app}\key\fr; Components: main
#endif
#if (len(Key3) > 0)
Source: {#BaseDir}\Key\En\{#Key3}.key; DestDir: {app}\key\de; Components: main
Source: {#BaseDir}\Key\En\{#Key3}.key; DestDir: {app}\key\en; Components: main
Source: {#BaseDir}\Key\En\{#Key3}.key; DestDir: {app}\key\fr; Components: main
#endif
#if (len(Key4) > 0)
Source: {#BaseDir}\Key\En\{#Key4}.key; DestDir: {app}\key\de; Components: main
Source: {#BaseDir}\Key\En\{#Key4}.key; DestDir: {app}\key\en; Components: main
Source: {#BaseDir}\Key\En\{#Key4}.key; DestDir: {app}\key\fr; Components: main
#endif
#if (len(Key5) > 0)
Source: {#BaseDir}\Key\En\{#Key5}.key; DestDir: {app}\key\de; Components: main
Source: {#BaseDir}\Key\En\{#Key5}.key; DestDir: {app}\key\en; Components: main
Source: {#BaseDir}\Key\En\{#Key5}.key; DestDir: {app}\key\fr; Components: main
#endif
;Source: {#BaseDir}\Mps\{#FlVer}\{#AppShort}.mps; DestDir: {app}\mps\{#AppShort}.mps; Components: main
Source: {#BaseDir}\Msg\En\{#AppShort}.txt; DestDir: {app}\msg\de; Components: main
Source: {#BaseDir}\Msg\En\{#AppShort}.txt; DestDir: {app}\msg\en; Components: main
Source: {#BaseDir}\Msg\En\{#AppShort}.txt; DestDir: {app}\msg\fr; Components: main
#if (len(Msg1) > 0)
Source: {#BaseDir}\Msg\En\{#Msg1}.txt; DestDir: {app}\msg\de; Components: main
Source: {#BaseDir}\Msg\En\{#Msg1}.txt; DestDir: {app}\msg\en; Components: main
Source: {#BaseDir}\Msg\En\{#Msg1}.txt; DestDir: {app}\msg\fr; Components: main
#endif
#if (len(Msg2) > 0)
Source: {#BaseDir}\Msg\En\{#Msg2}.txt; DestDir: {app}\msg\de; Components: main
Source: {#BaseDir}\Msg\En\{#Msg2}.txt; DestDir: {app}\msg\en; Components: main
Source: {#BaseDir}\Msg\En\{#Msg2}.txt; DestDir: {app}\msg\fr; Components: main
#endif
#if (len(Msg3) > 0)
Source: {#BaseDir}\Msg\En\{#Msg3}.txt; DestDir: {app}\msg\de; Components: main
Source: {#BaseDir}\Msg\En\{#Msg3}.txt; DestDir: {app}\msg\en; Components: main
Source: {#BaseDir}\Msg\En\{#Msg3}.txt; DestDir: {app}\msg\fr; Components: main
#endif

;Debug viewer
Source: \Tecnomatix\Projects\DebugView\*; DestDir: {app}\bin; Flags: ignoreversion; Components: debug

;Documentation
;Source: {src}\{#AppShort}.pdf; DestDir: {app}\..\Documentation\English; Flags: external skipifsourcedoesntexist; Components: manual
;Source: ..\im_bas.exe; DestDir: {app}\bin; DestName: ReadMeIm_bas.exe; Flags: isreadme; Components: main

;Protection
;Source: {#BaseDir}\bin\inst_seq.exe; DestDir: {app}; Flags: deleteafterinstall; Components: main
;Source: {#BaseDir}\opt\rld.opt; DestDir: {app}\opt; Flags: onlyifdoesntexist; Components: main
;Source: {src}\rld.opt; DestDir: {app}; Flags: deleteafterinstall external skipifsourcedoesntexist; Components: main

;Honeywell IPC620 systems
;Source: {#BaseDir}\plc\ipc620\*; DestDir: {app}\plc\ipc620; Components: main

;SIEMENS S5 PLC's
;Source: {#BaseDir}\plc\s5\*; DestDir: {app}\plc\s5; Components: main

;SIEMENS S7 S300 and S400 range
;Source: {#BaseDir}\plc\s7\SinecH1.zip; DestDir: {app}\plc\s7; Components: main

;Readme file
;Source: ..\Im_bas.txt; DestDir: "{app}"; Flags: isreadme; Components: main

[Registry]
;Root: HKLM; Subkey: "SOFTWARE\Tecnomatix\FactoryLink\Configuration Explorer\Menus\Node Classes\NC_TASKGROUP"; ValueType: String; ValueName: ""; ValueData: "NC_TASKGROUP"; Flags: noerror createvalueifdoesntexist; Components: main
;Root: HKLM; Subkey: "SOFTWARE\Tecnomatix\FactoryLink\Configuration Explorer\Menus\Node Classes\NC_TASKGROUP"; ValueType: String; ValueName: "Opened Icon"; ValueData: "folderclosed"; Flags: createvalueifdoesntexist; Components: main
;Root: HKLM; Subkey: "SOFTWARE\Tecnomatix\FactoryLink\Configuration Explorer\Menus\Node Classes\NC_TASKGROUP"; ValueType: String; ValueName: "Closed Icon"; ValueData: "folderopened"; Flags: createvalueifdoesntexist; Components: main
;Root: HKLM; Subkey: "SOFTWARE\Tecnomatix\FactoryLink\Configuration Explorer\Menus\Node Classes\NC_TASKGROUP"; ValueType: String; ValueName: "Description"; ValueData: "Task Group"; Flags: createvalueifdoesntexist; Components: main
;Root: HKLM; Subkey: "SOFTWARE\Tecnomatix\FactoryLink\Configuration Explorer\Menus\Node Classes\NC_TASKGROUP"; ValueType: String; ValueName: "TG_CAPTION Device Interfaces"; ValueData: "Device Interfaces"; Flags: createvalueifdoesntexist; Components: main
;Root: HKLM; Subkey: "SOFTWARE\Tecnomatix\FactoryLink\Configuration Explorer\Menus\Node Classes\NC_TASKGROUP"; ValueType: String; ValueName: "Task Group Device Interfaces"; ValueData: "{code:GetDriverString}"; Components: main

[Icons]

[Run]
Filename: {app}\bin\acctmgr.exe; Parameters: -c -d -v; Check: AddTitle('{#AppShort},{#CtList}'); Flags: runhidden; StatusMsg: Updating FactoryLink account manager index...; Components: main
;Filename: {app}\inst_seq.exe; Parameters: -M{#AppId} -S{app}\rld.opt; Flags: runhidden; StatusMsg: Updating RLD protection...; Components: main
Filename: {app}\bin\mkhelp.exe; Flags: runhidden; StatusMsg: Updating FactoryLik help file index...; Components: main

[UninstallRun]
;Filename: {app}\bin\RLDTitle.exe; Parameters: " /REMOVE={#AppId}"; Flags: runhidden; StatusMsg: Updating FactoryLink account manager index...; Components: main
Filename: {app}\bin\acctmgr.exe; Parameters: -c -d -v; Check: RemoveTitle('{#AppShort}'); Flags: runhidden; StatusMsg: Updating FactoryLink account manager index...; Components: main

[InstallDelete]

[Messages]
RunEntryShellExec=Yes, I would like to view the README file
BeveledLabel={#Company}

#ifdef Debug
  #expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
#endif

[Code]

var
  DriverList: String;
  TaskName: String;
{  UserPage: TInputQueryWizardPage;   }
  UsagePage: TInputOptionWizardPage;
 { LightMsgPage: TOutputMsgWizardPage;  }
 { KeyPage: TInputQueryWizardPage;       }
 { ProgressPage: TOutputProgressWizardPage; }
 { DataDirPage: TInputDirWizardPage;         }
  FlVersion: String;

function InitializeSetup(): Boolean;
begin

  TaskName := '{#AppShort}';
  {RegQueryStringValue(HKLM, 'SOFTWARE\USDATA\FactoryLink\Configuration Explorer\Menus\Node Classes\NC_TASKGROUP', 'Task Group Drivers', DriverList);

  if (DriverList = '') then begin
    DriverList := 'opcexp,opcclnt,ioxlator,edi_dev,te__,mb_plus,mbus,modp,mbustcp,sqrd,ab__,ab__rapd,netdtl,ktdtl,gene,asyn,omrn,sdrv,siem,h1mp,ti__,omux,ov60,mist,ldnr,t405,reli,gem_,dan2,eibi,apac2,bn90,dmod,es__,moor,rocm,tmdm,rmdm,hdp_rocm,bris,profibus,sinec_h1,s_3964r,stple,stplcnfg,Flgmmsg,Flgmport,Flgmproc,Flgmrprt,te__load,te__drq,eths,jbus,ucini,ucdef,ucref,ksv24ini,ksv24def,ksv24ref,comwiz,Mecomdef,Mecomrd,Mecomwr,odx,eci00,eci01,eci02,eco,S7D';
  end;

  if (Pos(TaskName,  DriverList) = 0) then begin
    DriverList := DriverList + ',' + TaskName;
  end;
  }
  Result := True;
end;

function GetDriverString(DefaultInput: String): String;
begin

  { Return the driver list }
  Result := DriverList;
end;

function GetFlVersion(DefaultInput: String): String;
begin

  { Return the Fl version }
  Result := FlVersion;
end;

{Read the FactoryLink directory from the autostart service program location,
 using the environment variable FLINK will result in a directory with
 short names. By using the autostart server the long names are found, and
 the setup progam will use these names instead of the notation in short}
function GetPrgDir(S: String): String;
var
  MyDir: String;
begin

  {read the autostart service directory, filename and extension}
  {RegQueryStringValue( HKEY_LOCAL_MACHINE, 'System\CurrentControlSet\Control\Session Manager\Environment', 'FLINK', MyDir);}
  MyDir := GetEnv('FLINK');
  
  {return default in case no directory is found}
  if (Length( MyDir) <= 0) then begin
    MyDir := S;
  end;

  {return the directory to install the program}
  Result := MyDir;
end;

{Add a AC line for the current task to the titles file, add a line
 to the CTlist file. The taskname and ct-line are specified in the
 function-parameter: taskname,ct-line}
function AddTitle( MyEntry: String): Boolean;
var
  MyText: TArrayOfString;
  MyFile: String;
  MyAC: String;
  MyCT: String;
  k: Integer;
  bText: Boolean;
  found: Integer;
begin

  {first file to load is th etitles file in the AC directory}
  MyFile := GetPrgDir( '') + '\ac\titles';
  bText := LoadStringsFromFile( MyFile, MyText);

  {AC entry looks like: taskname.ac}
  k := Pos( ',', MyEntry);
  if k = 0 then k := Pos( ':', MyEntry);
  MyAC := Copy( MyEntry, 0, k-1) + '.ac';
  MyCT := MyEntry;
  StrSet( ':', k, MyCt);

  {search for ac entry}
  found := 0;
  k := 0;
  while (k < GetArrayLength(MyText)) and (found = 0) do begin

    found := Pos( MyAC, MyText[ k]);
    k := k + 1;
  end;

  {if the entry is not found, add a line to the titles file}
  if (found = 0) then begin

    SetArrayLength(MyText, GetArrayLength(MyText)+1);
    MyText[ GetArrayLength(MyText)-1] := MyAC;
    SaveStringsToFile( MyFile, MyText, false);
  end;

  {add entry to ctlist file}
  MyFile := GetPrgDir( '') + '\ctgen\ctlist';
  bText := LoadStringsFromFile( MyFile, MyText);

  {search for ctgen entry}
  found := 0;
  k := 0;
  while (k < GetArrayLength(MyText)) and (found = 0) do begin

    found := Pos( MyCT, MyText[ k]);
    k := k + 1;
  end;

  {if the entry is not found, add a line to the ctlist file}
  if (found = 0) then begin

    SetArrayLength(MyText, GetArrayLength(MyText)+1);
    MyText[ GetArrayLength(MyText)-1] := MyCT;
    SaveStringsToFile( MyFile, MyText, false);
  end;

  {return always true, ac file must be installed, this function
   only adds a line to the titles file}
  Result := True;
end;

{Remove a AC line for the current task in the titles file, and remove
 a line in the CTlist file the entry is specified with the task name
 in the function-parameter}
function RemoveTitle( MyEntry: String): Boolean;
var
  MyText: TArrayOfString;
  MyFile: String;
  MyAC: String;
  MyCT: String;
  Temp: String;
  k: Integer;
  found: Integer;
  bText: Boolean;
begin

  MyAC := MyEntry + '.ac';
  MyCT := MyEntry + ':';

  {search the task name in the ctlist file}
  MyFile := GetPrgDir( '') + '\ctgen\ctlist';
  SetArrayLength( MyText, 0);
  bText := LoadStringsFromFile( MyFile, MyText);

  {search for the task name}
  for k:=0 to GetArrayLength(MyText)-1 do begin

    Temp := MyText[ k];
    if (found = 0) then
      found := Pos( MyCT, MyText[ k]);

    {if the entry is found, remove the line from the titles file}
    if (found <> 0) then begin

      if ((k+1) < GetArrayLength(MyText)) then begin

        MyText[ k] := MyText[ k+1];
      end else {begin;}
        MyText[ k] := '';
    end;
  end;

  if (found <> 0) then begin

    {shorten array with one}
    SetArrayLength( MyText, GetArrayLength( MyText) - 1);
    SaveStringsToFile( MyFile, MyText, false);
  end;

  {search the task name in the titles file}
  MyFile := GetPrgDir( '') + '\ac\titles';
  bText := LoadStringsFromFile( MyFile, MyText);
  found := 0;

  {search for the task name}
  for k:=0 to GetArrayLength(MyText)-1 do begin

    Temp := MyText[ k];
    if (found = 0) then
      found := Pos( MyAC, MyText[ k]);

    {if the entry is found, remove the line from the titles file}
    if (found <> 0) then begin

      if ((k+1) < GetArrayLength(MyText)) then begin

        MyText[ k] := MyText[ k+1];
      end else {begin;}
        MyText[ k] := '';
    end;
  end;

  if (found <> 0) then begin

    {shorten array with one}
    SetArrayLength( MyText, GetArrayLength( MyText) - 1);
    SaveStringsToFile( MyFile, MyText, false);
  end;

  {return always true, ac file must be removed}
  Result := True;
end;

procedure InitializeWizard;
begin
  { Create the pages }

{  UserPage := CreateInputQueryPage(wpWelcome,
    'Personal Information', 'Who are you?',
    'Please specify your name and the company for whom you work, then click Next.');
  UserPage.Add('Name:', False);
  UserPage.Add('Company:', False);
}
{  UsagePage := CreateInputOptionPage(wpWelcome,
    'FactoryLink Version Information', 'For which version are you installing the IM-BAS application?',
    'Please select the correct version of FactoryLink, then click Next.',
    True, False);}
  {UsagePage.Add('FactoryLink 7.0, or FactoryLink 7++');} {selection 0}
  {UsagePage.Add('FactoryLink 7.1');}                      {selection 1}
  {UsagePage.Add('FactoryLink 7.2');}                      {selection 2}
  {UsagePage.Add('FactoryLink 7.5');}                      {selection 3}

{  LightMsgPage := CreateOutputMsgPage(UsagePage.ID,
    'Personal Information', 'How will you use My Program?',
    'Note: to enjoy all features My Program can offer and to support its development, ' +
    'you can switch to sponsored or paid mode at any time by selecting ''Usage Mode'' ' +
    'in the ''Help'' menu of My Program after the installation has completed.'#13#13 +
    'Click Back if you want to change your usage mode setting now, or click Next to ' +
    'continue with the installation.');
 }
  {KeyPage := CreateInputQueryPage(UsagePage.ID,
    'Personal Information', 'What''s your registration key?',
    'Please specify your registration key and click Next to continue. If you don''t ' +
    'have a valid registration key, click Back to choose a different usage mode.');
  KeyPage.Add('Registration key:', False);

  ProgressPage := CreateOutputProgressPage('Personal Information',
    'What''s your registration key?');

  DataDirPage := CreateInputDirPage(wpSelectDir,
    'Select Personal Data Directory', 'Where should personal data files be installed?',
    'Select the folder in which Setup should install personal data files, then click Next.',
    False, '');
  DataDirPage.Add('');
  }
  { Set default values, using settings that were stored last time if possible }

  {case GetPreviousData('FlVersion', '') of
    'light': UsagePage.SelectedValueIndex := 0;
    'sponsored': UsagePage.SelectedValueIndex := 1;
    'paid': UsagePage.SelectedValueIndex := 2;
  else
    UsagePage.SelectedValueIndex := 3;
  end;}

  {DataDirPage.Values[0] := GetPreviousData('DataDir', '');}
end;


function rmNextButtonClick(CurPageID: Integer): Boolean;
var
  I: Integer;
begin
  { Validate certain pages before allowing the user to proceed }
  if CurPageId = UsagePage.ID then begin
    case UsagePage.SelectedValueIndex of
      0: FlVersion := 'FL70';
      1: FlVersion := 'FL71';
      2: FlVersion := 'FL72';
      else
         FlVersion := 'FL75';
    end;
  end;
  {if CurPageID = UserPage.ID then begin
    if UserPage.Values[0] = '' then begin
      MsgBox('You must enter your name.', mbError, MB_OK);
      Result := False;
    end else begin
      if DataDirPage.Values[0] = '' then
        DataDirPage.Values[0] := 'C:\' + UserPage.Values[0];
      Result := True;
    end;
  end else}
  {if CurPageID = KeyPage.ID then begin}
    { Just to show how 'OutputProgress' pages work.
      Always use a try..finally between the Show and Hide calls as shown below. }
{    ProgressPage.SetText('Authorizing registration key...', '');
    ProgressPage.SetProgress(0, 0);
    ProgressPage.Show;
    try
      for I := 0 to 10 do begin
        ProgressPage.SetProgress(I, 10);
        Sleep(100);
      end;
    finally
      ProgressPage.Hide;
    end;
    if KeyPage.Values[0] = 'inno' then
      Result := True
    else begin
      MsgBox('You must enter a valid registration key. (Hint: The key is "inno".)', mbError, MB_OK);
      Result := False;
    end;
  end else}
    Result := True;
end;


procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
  { Store the settings so we can restore them next time }
  SetPreviousData(PreviousDataKey, 'FlVersion', FlVersion);
end;