home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / sndys200.zip / install / install.cmd < prev    next >
OS/2 REXX Batch file  |  1996-03-01  |  22KB  |  715 lines

  1. /*
  2.  *      INSTALL.CMD SendYes V2.0 - C.Langanke 1996 - Installation
  3.  *
  4.  *      Syntax: INSTALL.CMD [/TARGETDIR:...]
  5.  *                          [/LOCATION:"<...>"] [/BATCH]
  6.  *                          [/?]
  7.  *
  8.  *      Creates a WPS folder and program objects for the SendYes! package. 
  9.  *      Optionally copies files of SendYes! package to a target directory before.
  10.  *
  11.  *      /TARGETDIR:...     -  name of target directory where files are to be
  12.  *                            copied to before installation of WPS objects
  13.  *                            All files must be unzipped before invoking INSTALL !!!
  14.  *                            If /TARGETDIR is not specified, no copy is performed!
  15.  *      /LOCATION:"<...>"  -  WPS-ID: Location for the SendYes! folder 
  16.  *                            [Default: "<WP_DESKTOP>"]
  17.  *      /BATCH             -  don't use menus and prompts: just install with defaults
  18.  *      /?                 -  display this help text
  19.  */
  20. /* The first comment is used as online help text */
  21.  
  22.  SIGNAL ON HALT
  23.  
  24.  TitleLine = STRIP(SUBSTR(SourceLine(2), 3));
  25.  PARSE VAR TitleLine CmdName'.CMD 'Info
  26.  Title     = CmdName Info
  27.  NewLine   = D2C(13)||D2C(10);
  28.  env       = 'OS2ENVIRONMENT';
  29.  TRUE      = (1 = 1);
  30.  FALSE     = (0 = 1);
  31.  Redirection = '1>NUL 2>&1';
  32.  '@ECHO OFF'
  33.   
  34.  /* some OS/2 Error codes */
  35.  ERROR.NO_ERROR          =  0;
  36.  ERROR.ACCESS_DENIED     =  5;
  37.  ERROR.NOT_ENOUGH_MEMORY =  8;
  38.  ERROR.INVALID_DATA      = 13;
  39.  ERROR.NO_MORE_FILES     = 18;
  40.  ERROR.GEN_FAILURE       = 31;
  41.  ERROR.INVALID_PARAMETER = 87;
  42.  
  43.  /* some default values */
  44.  NlsMsg.HaltMsg      = 'Interrupted by user.';
  45.  NlsMsg.AbortProgram = 'Program aborted.';
  46.  NlsMsg.Error        =  'error';
  47.  NlsMsg.Keys         = 'YN';
  48.  Overview            = 'SendYes! *';
  49.  Choice = 0;
  50.  
  51.  /* defaults */
  52.  Default.PromptLen   = 60;
  53.  Default.Location     = "<WP_DESKTOP>";
  54.  Default.Language     = "english";
  55.  Default.LanguageAbrv = 'ENG';
  56.  
  57.  /* flags */
  58.  Flag.Batch        = FALSE;
  59.  Flag.InvalidParm  = FALSE;
  60.  Value.InvalidParm = '';
  61.  Flag.ReadonlyMode = FALSE;
  62.  
  63.  /* defaults for selection by parms */
  64.  Selected.TargetDir = '';
  65.  Selected.Location  = Default.Location;
  66.  Selected.Language  = '';
  67.  
  68.  /* determine directories */
  69.  InstallDir       = GetCallDir();
  70.  LastSlash        = LASTPOS( '\', InstallDir);
  71.  ProgDir          = TRANSLATE(LEFT(InstallDir, LastSlash - 1));
  72.  
  73.  /* NLS file name definitions */
  74.  NLSFileBaseName       = 'SNDYS';
  75.  
  76.  /* INI file definitions */
  77.  Ini.Error             = 'ERROR:';
  78.  Ini.Delete            = 'DELETE:';
  79.  Ini.FileName          = ProgDir'\SENDYES.INI';
  80.  Ini.AppName           = 'SendYes!';
  81.  Ini.KeyName_Language  = 'Language';
  82.  Ini.KeyName_TestWrite = 'TestWrite';
  83.  Ini.KeyName_CallDir   = 'CallDir';
  84.  
  85.  SyslevelFile         = ProgDir'\SYSLEVEL.SNY';
  86.  
  87.  /* load RexxUtil */ 
  88.  CALL RxFuncAdd    'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';
  89.  CALL SysLoadFuncs;
  90.   
  91.  /* show help */
  92.  ARG Parms
  93.  IF (POS('?', Parms) > 0) THEN
  94.  DO
  95.     rc = ShowHelp();
  96.     EXIT(ERROR.NO_ERROR)
  97.  END;
  98.  
  99.  
  100.  /* look for all messagefiles in directory */
  101.  /* to determine the languages available   */
  102.  rc = GetLanguages(InstallDir'\'NLSFileBaseName'*.MSG', ProgDir'\'NLSFileBaseName);
  103.  IF (rc \= ERROR.NO_ERROR) THEN
  104.  DO
  105.     SAY;
  106.     SAY CmdName':' NlsMsg.Error': No valid SendYes! language install message file found.'; 
  107.     SAY NlsMsg.AbortProgram;
  108.     EXIT(ERROR.GEN_FAILURE);
  109.  END;
  110.  
  111.  IF (Language.0 = 0) THEN
  112.  DO
  113.     SAY;
  114.     SAY CmdName':' NlsMsg.Error': No complete SendYes! NLS component available.';
  115.     SAY NlsMsg.AbortProgram;
  116.     EXIT(ERROR.GEN_FAILURE);
  117.  END;
  118.  
  119.  /* read commandline parms */ 
  120.  PARSE ARG Parms
  121.  
  122.  DO i = 1 TO WORDS(Parms);
  123.     ThisParm = WORD(Parms, i);
  124.     PARSE VAR ThisParm ThisTag':'ThisValue
  125.     ThisTag = TRANSLATE(ThisTag);
  126.  
  127.     SELECT
  128.        WHEN (POS(ThisTag, '/TARGETDIR') = 1) THEN
  129.        DO
  130.           /* ### longnames with embedded blanks      */
  131.           /* and/or in quotes are not supported here */
  132.           Selected.TargetDir = ThisValue;
  133.        END;
  134.  
  135.        WHEN (POS(ThisTag, '/LOCATION') = 1) THEN
  136.        DO
  137.           ThisValue = STRIP(ThisValue);
  138.           IF (LEFT(ThisValue, 1) = '"') THEN
  139.              PARSE VAR ThisValue '"'ThisValue'"'
  140.           Selected.Location = ThisValue;
  141.        END;
  142.  
  143.        WHEN (POS(ThisTag, '/BATCH') = 1) THEN
  144.        DO
  145.           Flag.Batch = TRUE;
  146.        END;
  147.  
  148.        OTHERWISE
  149.        DO
  150.           Flag.InvalidParm = TRUE;
  151.           Value.InvalidParm = ThisParm;
  152.        END;
  153.  
  154.     END; /* SELECT */
  155.  END; /* DO */
  156.  
  157.  /* use language specified in INI file if not specified within parameters */ 
  158.  Selected.Language = SysIni( Ini.Filename, Ini.AppName, Ini.KeyName_Language);
  159.  IF (Selected.Language \= Ini.Error) THEN
  160.  DO
  161.     Selected.Language = LEFT(Selected.Language, 3);
  162.     Choice = WORDPOS(Selected.Language, Language.ListAbrv);
  163.     Selected.Language = Language.Choice;
  164.  END;
  165.  ELSE
  166.     Choice = 0;
  167.  
  168.  /* preselect language */
  169.  IF (Choice = 0) THEN
  170.     Choice = 'UNSELECTED'; 
  171.  
  172.  /* test if ini can be written */
  173.  rc = SysIni( Ini.Filename, Ini.AppName, Ini.KeyName_Testwrite, Ini.KeyName_Testwrite||'00'x);
  174.  IF (rc = Ini.Error) THEN
  175.  DO
  176.     /* use global ini file in OS2 directory instead */
  177.     UserIni      = VALUE('USER_INI',,env);
  178.     LastSlash    = LASTPOS('\',UserIni);
  179.     Ini.FileName = LEFT( UserIni, LastSlash - 1)'\SENDYES.INI';
  180.  
  181.     /* give warning message */
  182.     'CLS'
  183.     SAY;
  184.     SAY CmdName': Warning:';
  185.     SAY;
  186.     SAY 'SENDYES.INI in directory' ProgDir 'cannot be written.';
  187.     SAY;
  188.     SAY 'Settings will be written to' Ini.FileName;
  189.     SAY 'when SendYes! is called from directory' ProgDir'.';
  190.     SAY;
  191.     SAY 'Press any key to continue ...';
  192.     'PAUSE' Redirection
  193.  
  194.     /* save program dir */
  195.     rc = SysIni( Ini.Filename, Ini.AppName, Ini.KeyName_CallDir, ProgDir||'00'x);
  196.  END;
  197.  ELSE
  198.     /* delete test enry */
  199.     rc = SysIni( Ini.Filename, Ini.AppName, Ini.KeyName_Testwrite, Ini.Delete);
  200.  
  201.  
  202. SelectLanguage:
  203.  Language.MenuKeys = LEFT('123456789ABCDEF', Language.0);
  204.  
  205.  IF (Choice = 'UNSELECTED') THEN
  206.  DO
  207.     DROP(Menu.);
  208.     Menu.ValidMenuKeys = Language.MenuKeys;
  209.     Menu.Line.0 = 4 + Language.0;
  210.     Menu.Line.1 = '';
  211.     Menu.Line.2 = Title
  212.     Menu.Line.3 = '';
  213.     Menu.Line.4 = '';
  214.     DO i = 1 TO Language.0
  215.        ThisLine = 4 + i;
  216.        Menu.Line.ThisLine = '   'SUBSTR(Menu.ValidMenuKeys, i, 1)'.  'Language.i;
  217.     END;
  218.     Choice = Menu(WORDPOS(Default.Language, Language.List));
  219.  END;
  220.  Choice = POS(Choice, Language.MenuKeys);
  221.  
  222.  /* select NLS settings */
  223.  MessageFile           = InstallDir'\'NLSFileBaseName''Language.Choice.Abrv'.MSG';
  224.  InfFileName           = NLSFileBaseName''Language.Choice.Abrv'.INF'; 
  225.  InfFile               = ProgDir'\'InfFileName;
  226.  HlpFileName           = NLSFileBaseName''Language.Choice.Abrv'.HLP'; 
  227.  HlpFile               = ProgDir'\'HlpFileName;
  228.  Selected.LabguageAbrv = Language.Choice.Abrv;
  229.  
  230.  /* load messages and object strings */
  231.  rc = LoadMessageFile(MessageFile, FALSE);
  232.  ExitKey = RIGHT(NlsMsg.Keys, 1);
  233.  
  234. /*
  235.  *      validate parms
  236.  */
  237.  
  238.  IF (Flag.InvalidParm) THEN
  239.  DO
  240.     SAY;
  241.     SAY Title
  242.     SAY;
  243.     SAY CmdName':' NlsMsg.Error':' NlsMsg.InvalidParm '»'Value.InvalidParm'«.';
  244.     SAY NlsMsg.AbortProgram;
  245.     EXIT(ERROR.INVALID_PARAMAMETER);
  246.  END;
  247.  
  248.  IF (\ObjectExist(Selected.Location)) THEN
  249.  DO
  250.     SAY;
  251.     SAY Title
  252.     SAY;
  253.     SAY CmdName':' NlsMsg.Error':' NlsMsg.NotExist':' Selected.Location
  254.     SAY NlsMsg.AbortProgram;
  255.     EXIT(ERROR.INVALID_PARAMETER);
  256.  END;
  257.  
  258.  /* if target directory is specified, do a xcopy and call       */
  259.  /*  this batch again within the target directory structure     */
  260.  IF (Selected.TargetDir \= '' ) THEN
  261.  DO
  262.     IF (\Flag.Batch) THEN
  263.        IF (\ProceedWith(NlsMsg.InstallPrompt Selected.TargetDir)) THEN
  264.           SIGNAL HALT;
  265.     SAY NlsMsg.TargetDirInstall Selected.TargetDir
  266.     IF (FileExist(Selected.TargetDir)) THEN
  267.     DO
  268.        IF (Flag.Batch) THEN
  269.        DO
  270.           SAY;
  271.           SAY Title
  272.           SAY;
  273.        END;
  274.        SAY; 
  275.        SAY NlsMsg.TargetDirExists
  276.        SAY NlsMsg.AbortProgram
  277.        EXIT(ERROR.ACCESS_DENIED);
  278.     END;
  279.     'XCOPY "'ProgDir'\*.*"  "'Selected.TargetDir'\" /S /E /T /H' Redirection
  280.     IF (rc \= ERROR.NO_ERROR) THEN
  281.     DO
  282.        IF (Flag.Batch) THEN
  283.        DO
  284.           SAY;
  285.           SAY Title
  286.           SAY;
  287.        END;
  288.        SAY; 
  289.        SAY NlsMsg.XcopyFailed
  290.        SAY NlsMsg.AbortProgram
  291.        EXIT(ERROR.ACCESS_DENIED);
  292.     END;
  293.     rc = DIRECTORY(Selected.TargetDir);
  294.     
  295.     CallParms = '/LOCATION:"'Selected.Location'"'
  296.     IF (Flag.Batch) THEN CallParms = CallParms '/BATCH';
  297.     'CALL "'Selected.TargetDir'\INSTALL\INSTALL.CMD"' CallParms 
  298.     EXIT(ERROR.NO_ERROR);
  299.  END;
  300.  
  301.  /* select installation, readme or language select */
  302.  DROP(Menu.);
  303.  Menu.ValidMenuKeys = '123'ExitKey;
  304.  Menu.Line.0  = 9;
  305.  Menu.Line.1  = '';
  306.  Menu.Line.2  = Title;
  307.  Menu.Line.3  = '';
  308.  Menu.Line.4  = '';
  309.  Menu.Line.5  = '   ' NlsMsg.Readme
  310.  Menu.Line.6  = '   ' NlsMsg.Install
  311.  Menu.Line.7  = '   ' NlsMsg.NLSSelect
  312.  Menu.Line.8  = '';
  313.  Menu.Line.9  = '   ' NlsMsg.Exit
  314.  
  315.  DO WHILE (TRUE)
  316.  
  317.     /* just install within batch mode */
  318.     IF (Flag.Batch) THEN
  319.     DO
  320.        DO i = 1 TO 3
  321.           Say Menu.Line.i;
  322.        END;
  323.        LEAVE;
  324.     END;
  325.  
  326.     Choice = Menu(1);
  327.     SELECT
  328.        WHEN (Choice = '1') THEN 
  329.        DO
  330.           'START VIEW' InfFile Overview
  331.           rc = SysSleep(3);
  332.        END;
  333.  
  334.        WHEN (Choice = '2') THEN LEAVE;
  335.  
  336.        WHEN (Choice = '3') THEN 
  337.        DO
  338.           Choice = 'UNSELECTED';
  339.           SIGNAL SelectLanguage;
  340.        END;
  341.  
  342.        WHEN (Choice = ExitKey) THEN SIGNAL HALT;
  343.        OTHERWISE NOP;
  344.     END /* SELECT */
  345.  END; /* WHILE (TRUE) */
  346.  
  347.  /* store selected language in INI and syslevel file */
  348.  rc = SysIni( Ini.Filename, Ini.AppName, Ini.KeyName_Language, Selected.LabguageAbrv||'00'x);
  349.  rc = SetSyslevelLanguage(SyslevelFile, Selected.LabguageAbrv);
  350.  
  351.  /* Now create all objects defined */
  352.  DO i = 1 TO Objects.0
  353.     /* parse object details */
  354.     PARSE VAR Objects.i,
  355.            '"'ObjectClass'"',
  356.            '"'ObjectLocation'"',
  357.            '"'ObjectId'"',
  358.            '"'ObjectTitle'"',
  359.            '"'ObjectOption'"',
  360.            '"'ObjectExeName'"',
  361.            '"'ObjectParameters'"',
  362.            '"'ObjectSetup'"'
  363.  
  364.     /* use selected location */
  365.     IF (ObjectLocation = Default.Location) THEN
  366.        ObjectLocation = Selected.Location;
  367.  
  368.     /* make insertions to setup string */
  369.     IF ((ObjectExeName \= '') | (ObjectParameters \= '')) THEN
  370.     DO
  371.        /* add path to Exename, if neccessary */
  372.        IF ((ObjectExename \= '*') & (FileExist(ProgDir'\'ObjectExename))) THEN
  373.           ObjectExeName = ProgDir'\'ObjectExeName;
  374.  
  375.        /* append rest of setup */
  376.        ObjectSetup =,
  377.                    'EXENAME='ObjectExeName';'||,
  378.                    'PARAMETERS='ObjectParameters';'||,
  379.                    ObjectSetup;
  380.     END;
  381.  
  382.     /* SetupString: replace '@1' with program directory */
  383.     ObjectSetup = TranslateString(ObjectSetup, ProgDir, '@1');
  384.  
  385.     /* SetupString: replace '@2' with inf filename */
  386.     ObjectSetup = TranslateString(ObjectSetup, InfFile, '@2');
  387.  
  388.     /* SetupString: replace '@3' with hlp filename */
  389.     ObjectSetup = TranslateString(ObjectSetup, HlpFile, '@3');
  390.  
  391.     /* create object */
  392.     rc = CreateObject(ObjectTitle, ObjectClass, ObjectLocation,,
  393.                       'OBJECTID='ObjectId';'||,
  394.                       ObjectSetup, ObjectOption);
  395.  END;
  396.  
  397.  /* show the folder (open twice is ok, ccview=no is set !) */
  398.  rc = SysSetObjectData('<SENDYES_FOLDER>', 'OPEN=DEFAULT;');
  399.  rc = SysSetObjectData('<SENDYES_FOLDER>', 'OPEN=DEFAULT;');
  400.  
  401.  /* success message */
  402.  SAY;
  403.  SAY NlsMsg.InstallEnded;
  404.  
  405.  EXIT(ERROR.NO_ERROR);
  406.  
  407. /* ------------------------------------------------------------------------- */
  408.  
  409. HALT:
  410.   SAY NlsMsg.HaltMsg;
  411.   EXIT(ERROR.GEN_FAILURE);
  412.  
  413. /* ------------------------------------------------------------------------- */
  414. ShowHelp: PROCEDURE EXPOSE ExitMessage Title
  415.  
  416.  SAY;
  417.  SAY Title
  418.  SAY;
  419.  
  420.  PARSE SOURCE . . ThisFile
  421.  
  422.  /* skip header */
  423.  DO i = 1 TO 3
  424.     rc = LINEIN(ThisFile);
  425.  END;
  426.  
  427.  /* show help */
  428.  DO WHILE (ThisLine \= ' */')
  429.     ThisLine = LINEIN(Thisfile);
  430.     SAY SUBSTR(ThisLine, 7);
  431.  END;
  432.  
  433.  /* close file */
  434.  rc = LINEOUT(Thisfile);
  435.  
  436.  RETURN('');
  437.  
  438. /* ------------------------------------------------------------------------- */
  439. CreateObject: PROCEDURE EXPOSE NlsMsg. Default. ExitMessage
  440.  PARSE ARG Title, Class, Location, Setup, Option
  441.  
  442.  CALL CHAROUT, LEFT(NlsMsg.Create Title '...', Default.PromptLen)
  443.  
  444.  rc = SysCreateObject(Class, Title, Location, Setup, Option);
  445.  
  446.  IF (rc) THEN
  447.     SAY NlsMsg.Ok
  448.  ELSE
  449.     SAY NlsMsg.Error '!'
  450.  
  451.  RETURN(rc);
  452.  
  453. /* ------------------------------------------------------------------------- */
  454. PullVariable: PROCEDURE EXPOSE ExitMessage
  455.  PARSE ARG Default, Message
  456.  
  457.  SAY;
  458.  CALL CHAROUT, Message '['Default'] : ';
  459.  PARSE PULL PullVar;
  460.  IF (LENGTH(PullVar) > 0) THEN
  461.     RETURN(PullVar);
  462.  ELSE
  463.     RETURN(Default);
  464.  
  465. /* ------------------------------------------------------------------------- */
  466. LoadMsgString: PROCEDURE EXPOSE ExitMessage
  467.  ARG MsgId, MessageFile
  468.  
  469.  Message = SysGetMessage(MsgId, MessageFile);
  470.  RETURN(LEFT(Message, LENGTH(Message) - 2));
  471.  
  472. /* ------------------------------------------------------------------------- */
  473. FileExist: PROCEDURE EXPOSE ExitMessage
  474.  ARG FileName
  475.  
  476.  RETURN(STREAM(Filename, 'C', 'QUERY EXISTS') > '');
  477.    
  478. /* ------------------------------------------------------------------------- */
  479. GetCalldir: PROCEDURE EXPOSE ExitMessage
  480. PARSE SOURCE . . CallName
  481.  CallDir = FILESPEC('Drive', CallName)||FILESPEC('Path', CallName);
  482.  RETURN(LEFT(CallDir, LENGTH(CallDir) - 1));
  483.  
  484. /* ------------------------------------------------------------------------- */
  485. GetDrivePath: PROCEDURE EXPOSE ExitMessage
  486.  ARG FileName
  487.  
  488.  FullPath = FILESPEC('D', FileName)||FILESPEC('P', FileName);
  489.  IF (FullPath \= '') THEN
  490.     RETURN(LEFT(FullPath, LENGTH(FullPath) - 1));
  491.  ELSE
  492.     RETURN('');
  493.  
  494. /* ------------------------------------------------------------------------- */
  495. PullVariable: PROCEDURE EXPOSE ExitMessage
  496.  PARSE ARG Default, Message
  497.  
  498.  SAY;
  499.  CALL CHAROUT, Message '['Default'] : ';
  500.  PARSE PULL PullVar;
  501.  IF (LENGTH(PullVar) > 0) THEN
  502.     RETURN(PullVar);
  503.  ELSE
  504.     RETURN(Default);
  505.  
  506. /* ------------------------------------------------------------------------- */
  507. TranslateString: PROCEDURE EXPOSE ExitMessage
  508.  PARSE ARG String, ReplaceString, SearchString
  509.  
  510.  TagPos   = POS(SearchString, String);
  511.  TagLen   = LENGTH(SearchString);
  512.  
  513.  IF (TagPos > 0) THEN
  514.  DO
  515.     NewString  = '';
  516.     LastTagPos = 1 - TagLen;
  517.     DO WHILE (TagPos > 0)
  518.        NewString  = NewString''SUBSTR(String, LastTagPos + TagLen, TagPos - LastTagPos - TagLen, )''ReplaceString;
  519.        LastTagPos = TagPos;
  520.        TagPos     = POS(SearchString, String, TagPos + TagLen);
  521.     END;
  522.     NewString     = NewString''SUBSTR(String, LastTagPos + TagLen);
  523.     RETURN(NewString);
  524.  END;
  525.  ELSE
  526.     RETURN(String);
  527.  
  528. /* ========================================================================= */
  529. ObjectExist: PROCEDURE EXPOSE ExitMessage
  530.  ARG ObjectId
  531.  
  532.  RETURN(SysSetObjectData(ObjectId, ';'));
  533.    
  534. /* ========================================================================= */
  535. ProceedWith: PROCEDURE EXPOSE NlsMsg. ExitMessage
  536.  PARSE ARG Prompt
  537.  
  538.  ch            = ' ';
  539.  ValidResponse = LEFT(NlsMsg.Keys, 2);
  540.  YesKey        = LEFT(ValidResponse, 1);
  541.  NoKey         = RIGHT(ValidResponse, 1);
  542.  
  543.  SAY;
  544.  CALL CHAROUT ,Prompt '('YesKey'/'NoKey') '
  545.  DO WHILE (POS(ch, ValidResponse) = 0)
  546.     PULL ch
  547.     ch = TRANSLATE(ch);
  548.     IF (POS(ch, ValidResponse) = 0) THEN BEEP(800, 200);
  549.  END;
  550.  SAY;
  551.  SAY;
  552.  RETURN(ch = YesKey);
  553.    
  554. /* ========================================================================= */
  555. Menu: PROCEDURE EXPOSE Menu. TRUE FALSE ExitMessage
  556. ARG Default
  557.  
  558.  IF (Default = '') THEN
  559.     Default = LEFT(Menu.ValidMenuKeys, 1);
  560.  
  561.  Choice = '';
  562.  ChoiceOk = FALSE;
  563.  DO WHILE (\ChoiceOk)
  564.     rc = SysCls();
  565.     DO i = 1 TO Menu.Line.0
  566.        SAY Menu.Line.i
  567.     END;
  568.  
  569.     Choice   = TRANSLATE(PullVariable(Default , '   ?  '));
  570.     ChoiceOk = (POS(Choice, Menu.ValidMenuKeys) > 0);
  571.     IF (\ChoiceOk) THEN
  572.        CALL CHAROUT, '';
  573.  END;
  574.  SAY;
  575.  
  576.  RETURN(Choice);
  577.  
  578. /* ========================================================================= */
  579. LoadMessageFile: PROCEDURE EXPOSE ERROR. NlsMsg. Objects. ExitMessage,
  580.                                   InstLanguage InstLanguageAbrv 
  581.  
  582.  ARG MessageFile, ReadInfoOnly
  583.  
  584.  /* default values */
  585.  MessageFileIdText = 'SENDYES_MESSAGEFILE';
  586.  DROP(Objects.);
  587.  Objects.  = '';
  588.  Objects.0 = 0;
  589.  
  590.  /* load MessageIds and YesNo Keys*/
  591.  MessageFileInfo        = LoadMsgString(0, MessageFile)
  592.  PARSE VAR MessageFileInfo MessageFileId InstMsgStart InstObjectsStart InstObjectsEnd NlsMsg.Keys InstLanguage InstLanguageAbrv
  593.  IF (MessageFileIdText \= MessageFileId) THEN
  594.     RETURN(ERROR.INVALID_DATA);
  595.  
  596.  IF (\ReadInfoOnly) THEN
  597.  DO
  598.     /* load message strings */
  599.     NlsMsg.AbortProgram     = LoadMsgString(InstMsgStart +  0, MessageFile);
  600.     NlsMsg.AlreadyActive    = LoadMsgString(InstMsgStart +  1, MessageFile); /**/
  601.     NlsMsg.HaltMsg          = LoadMsgString(InstMsgStart +  2, MessageFile);
  602.     NlsMsg.Readme           = LoadMsgString(InstMsgStart +  3, MessageFile);
  603.     NlsMsg.Install          = LoadMsgString(InstMsgStart +  4, MessageFile);
  604.     NlsMsg.NLSSelect        = LoadMsgString(InstMsgStart +  5, MessageFile);
  605.     NlsMsg.Exit             = LoadMsgString(InstMsgStart +  6, MessageFile);
  606.     NlsMsg.Ok               = LoadMsgString(InstMsgStart +  7, MessageFile);
  607.     NlsMsg.Error            = LoadMsgString(InstMsgStart +  8, MessageFile);
  608.     NlsMsg.InstallPrompt    = LoadMsgString(InstMsgStart +  9, MessageFile)
  609.     NlsMsg.TargetDirInstall = LoadMsgString(InstMsgStart + 10, MessageFile);
  610.     NlsMsg.TargetDirExists  = LoadMsgString(InstMsgStart + 11, MessageFile);
  611.     NlsMsg.InvalidParm      = LoadMsgString(InstMsgStart + 12, MessageFile);
  612.     NlsMsg.NotExist         = LoadMsgString(InstMsgStart + 13, MessageFile);
  613.     NlsMsg.XcopyFailed      = LoadMsgString(InstMsgStart + 14, MessageFile);
  614.     NlsMsg.DeactivatePrompt = LoadMsgString(InstMsgStart + 15, MessageFile); /**/
  615.     NlsMsg.Deactivated      = LoadMsgString(InstMsgStart + 16, MessageFile); /**/
  616.     NlsMsg.Create           = LoadMsgString(InstMsgStart + 17, MessageFile);
  617.     NlsMsg.Delete           = LoadMsgString(InstMsgStart + 18, MessageFile);
  618.     NlsMsg.Deinstall        = LoadMsgString(InstMsgStart + 19, MessageFile);
  619.     NlsMsg.NotInstalled     = LoadMsgString(InstMsgStart + 20, MessageFile);
  620.     NlsMsg.InstallEnded     = LoadMsgString(InstMsgStart + 21, MessageFile);
  621.     NlsMsg.DeInstallEnded   = LoadMsgString(InstMsgStart + 22, MessageFile);
  622.    
  623.     /* load object strings */
  624.     DO i = InstObjectsStart TO InstObjectsEnd
  625.        n         = Objects.0 + 1;
  626.        Objects.n = LoadMsgString(i, MessageFile);
  627.        Objects.0 = n;
  628.     END;
  629.  
  630.  END; /* IF (\ReadInfoOnly) */
  631.  
  632.  RETURN(ERROR.NO_ERROR);
  633.  
  634. /* ========================================================================= */
  635. GetLanguages: PROCEDURE EXPOSE ERROR. TRUE FALSE Language.
  636.  ARG FileName, NlsBaseName
  637.  
  638.  /* initialize output stem */
  639.  Language.  = '';
  640.  Language.0 = 0;
  641.  
  642.  
  643.  Options  = 'OFS';
  644.  rc = SysFileTree(FileName, 'File.', Options);
  645.  IF (rc \= ERROR.NO_ERROR) THEN
  646.     RETURN(ERROR.NOT_ENOUGH_MEMORY);
  647.  
  648.  IF (File.0 = 0) THEN
  649.     RETURN(ERROR.NO_MORE_FILES);
  650.  
  651.  DO i = 1 TO File.0
  652.     /* load only first message out of the file*/
  653.     rc = LoadMessageFile(File.i, TRUE);
  654.     IF (rc = ERROR.NO_ERROR) THEN
  655.     DO
  656.        /* check if resource dll, hlp and inf file exist*/
  657.        LanguageBaseName = NlsBaseName''InstLanguageAbrv;
  658.        InfFile          = LanguageBaseName'.INF';
  659.        HlpFile          = LanguageBaseName'.HLP';
  660.        ResFile          = LanguageBaseName'.DLL';
  661.        IF ((FileExist(InfFile)) &,
  662.            (FileExist(HlpFile)) &,
  663.            (FileExist(ResFile))) THEN
  664.        DO
  665.           /* load language identifier and abbreviation into language stem  */
  666.           n                 = Language.0 + 1;
  667.           Language.n        = InstLanguage 
  668.           Language.n.Abrv   = InstLanguageAbrv;
  669.           Language.0        = n;
  670.           Language.List     = Language.List InstLanguage;
  671.           Language.ListAbrv = Language.ListAbrv InstLanguageAbrv;
  672.        END;
  673.     END;
  674.  END;
  675.  
  676.  RETURN(ERROR.NO_ERROR);
  677.  
  678. /* ========================================================================= */
  679. SetSyslevelLanguage: PROCEDURE EXPOSE ERROR. TRUE FALSE CmdName Language.
  680.  ARG SyslevelFile, LanguageAbrv
  681.  
  682.  /* patch SendYes! SYSLEVEL file */
  683.  IF (\FileExist(Syslevelfile)) THEN
  684.     RETURN('');
  685.  ELSE
  686.  DO
  687.  
  688.     /* read in CSD level tags */
  689.     CurrLevel = CHARIN(Syslevelfile, 45, 8);
  690.     PrevLevel = CHARIN(Syslevelfile, 53, 8);
  691.  
  692.     Id1 = SUBSTR(CurrLevel, 1, 3);
  693.     Id2 = SUBSTR(PrevLevel, 1, 3);
  694.     CurrId = RIGHT(Id1, 1);
  695.  
  696.     IF ((Id1 \= Id2) | (POS(CurrId, '0CDFGHIJLNPSUW') = 0)) THEN
  697.        RETURN('');
  698.     ELSE
  699.     DO
  700.        /* select new language ID */
  701.        SELECT
  702.           WHEN (LanguageAbrv = 'GER') THEN NewId = 'G';
  703.           WHEN (LanguageAbrv = 'ENG') THEN NewId = '0';
  704.  
  705.           OTHERWISE                    NewId = '0';
  706.        END;
  707.        /* patch in new id and cose file */
  708.        CurrId  = CHAROUT(Syslevelfile, NewId, 47);
  709.        CurrId  = CHAROUT(Syslevelfile, NewId, 55);
  710.        rc = LINEOUT(Syslevelfile);
  711.     END;
  712.  END;
  713.  RETURN('');
  714.  
  715.