home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / upmlg101.zip / install.cmd < prev    next >
OS/2 REXX Batch file  |  1999-01-19  |  19KB  |  535 lines

  1. /*
  2.  *      INSTALL.CMD - UPMLOGIN V1.01 - C.Langanke 1998
  3.  *
  4.  *      This program installs Telnet UPM Login (UPMLOGIN)
  5.  *      onto your system.
  6.  *
  7.  *      "IBM TCP/IP for OS/2" ot the "Internet Access Kit" is required.
  8.  */
  9.  
  10.  SIGNAL ON HALT
  11.  
  12.  TitleLine = STRIP(SUBSTR(SourceLine(2), 3));
  13.  PARSE VAR TitleLine CmdName'.CMD 'Info;
  14.  Title     = Info;
  15.  
  16.  env          = 'OS2ENVIRONMENT';
  17.  TRUE         = (1 = 1);
  18.  FALSE        = (0 = 1);
  19.  Redirection  = '> NUL 2>&1';
  20.  '@ECHO OFF'
  21.  
  22.  /* OS/2 Fehlercodes */
  23.  ERROR.NO_ERROR           =  0;
  24.  ERROR.INVALID_FUNCTION   =  1;
  25.  ERROR.FILE_NOT_FOUND     =  2;
  26.  ERROR.PATH_NOT_FOUND     =  3;
  27.  ERROR.ACCESS_DENIED      =  5;
  28.  ERROR.NOT_ENOUGH_MEMORY  =  8;
  29.  ERROR.INVALID_FORMAT     = 11;
  30.  ERROR.INVALID_DATA       = 13;
  31.  ERROR.NO_MORE_FILES      = 18;
  32.  ERROR.WRITE_FAULT        = 29;
  33.  ERROR.READ_FAULT         = 30;
  34.  ERROR.GEN_FAILURE        = 31;
  35.  ERROR.INVALID_PARAMETER  = 87;
  36.  
  37.  GlobalVars = 'Title CmdName env TRUE FALSE Redirection ERROR.';
  38.  SAY;
  39.  
  40.  CALL RxFuncAdd    'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';
  41.  CALL SysLoadFuncs;
  42.  
  43.  /* default values */
  44.  GlobalVars = GlobalVars 'Msg.';
  45.  rc = ERROR.NO_ERROR;
  46.  
  47.  CallDir    = GetCallDir();
  48.  TCPIPDrive = GetInstDrive( '\TCPIP\BIN');
  49.  UPMDrive   = GetInstDrive( '\MUGLIB');
  50.  ETCDir     = VALUE('ETC',, env);
  51.  TargetDir  = TCPIPDrive'\TCPIP\BIN';
  52.  
  53.  SyslevelTitleId = 2;
  54.  SyslevelTitle   = '';
  55.  
  56.  DO UNTIL (TRUE)
  57.  
  58.     /* search TCPIP install drive */
  59.     IF (TCPIPDrive = '') THEN
  60.     DO
  61.        'CLS';
  62.        SAY;
  63.        SAY Title;
  64.        SAY;
  65.        SAY 'Error: TCP/IP installation not found.';
  66.        SAY;
  67.        SAY 'This package requires one of the following packages being installed:'
  68.        SAY;
  69.        SAY ' - IBM TCP/IP for OS/2';
  70.        SAY ' - Internet Access Kit for OS/2';
  71.        rc = ERROR.PATH_NOT_FOUND;
  72.        LEAVE;
  73.     END;
  74.  
  75.     /* search UPM install drive */
  76.     IF (UPMDrive = '') THEN
  77.     DO
  78.        'CLS';
  79.        SAY;
  80.        SAY Title;
  81.        SAY;
  82.        SAY 'Error: UPM installation not found.';
  83.        SAY;
  84.        SAY 'This package requires one of the following packages being installed:'
  85.        SAY;
  86.        SAY ' For OS/2 WARP 3:';
  87.        SAY ' - Peer Client for OS/2';
  88.        SAY;
  89.        SAY ' For OS/2 WARP 4:';
  90.        SAY ' - File and Print Client';
  91.        SAY;
  92.        SAY ' All OS/2 versions:';
  93.        SAY ' - LAN/WARP Server Client for OS/2';
  94.        rc = ERROR.PATH_NOT_FOUND;
  95.        LEAVE;
  96.     END;
  97.  
  98.     /* determine language */
  99.     LanguageTag = VALUE('TESTTAG',,env);
  100.     IF (LanguageTag = '') THEN
  101.     DO
  102.        CurrentCsd          = ReadSyslevelFile( TargetDir'\SYSLEVEL.TCP', '', CURRCSD);
  103.        LanguageTag         = SUBSTR( CurrentCsd, 3, 1);
  104.     END;
  105.     Language            = TranslateLanguageTag( LanguageTag);
  106.     LanguageMessageFile = TRANSLATE('tnl'Language'.msg');
  107.     IF (\FileExist( LanguageMessageFile)) THEN
  108.     DO
  109.        LanguageTag         = '0';
  110.        Language            = 'ENG';
  111.        LanguageMessageFile = TRANSLATE('tnleng.msg');
  112.     END;
  113.  
  114.     IF (\FileExist( LanguageMessageFile)) THEN
  115.     DO
  116.        SAY CmdName': Error: Messagefile' LanguageMessageFile ' not found.';
  117.        rc = ERROR.FILE_NOT_FOUND;
  118.        LEAVE;
  119.     END;
  120.  
  121.     DO
  122.        IF (FileExist( LanguageMessageFile)) THEN
  123.           SyslevelTitle = GetMessage( SyslevelTitleId, LanguageMessageFile);
  124.     END;
  125.  
  126.     /* read object title */
  127.     MessageFileInfo = GetMessage(0, LanguageMessageFile);
  128.     PARSE VAR MessageFileInfo . Objectstart;
  129.     IF (DATATYPE( ObjectStart) = 'NUM') THEN
  130.     DO
  131.        Title                   = GetMessage( 1,                LanguageMessageFile);
  132.        Msg.TitleFolder         = GetMessage( ObjectStart +  0, LanguageMessageFile);
  133.        Msg.TitleViewLogFile    = GetMessage( ObjectStart +  1, LanguageMessageFile);
  134.        Msg.TitleViewErrFile    = GetMessage( ObjectStart +  2, LanguageMessageFile);
  135.        Msg.TitleEditWelcomeMsg = GetMessage( ObjectStart +  3, LanguageMessageFile);
  136.        Msg.TitleEditLoginMsg   = GetMessage( ObjectStart +  4, LanguageMessageFile);
  137.        Msg.TitleViewReadme     = GetMessage( ObjectStart +  5, LanguageMessageFile);
  138.        Msg.TitleLocalLogon     = GetMessage( ObjectStart +  6, LanguageMessageFile);
  139.        Msg.TitleLocalLogoff    = GetMessage( ObjectStart +  7, LanguageMessageFile);
  140.        Msg.Installprompt       = GetMessage( ObjectStart +  8, LanguageMessageFile);
  141.        Msg.Copy                = GetMessage( ObjectStart +  9, LanguageMessageFile);
  142.        Msg.CopyFailed          = GetMessage( ObjectStart + 10, LanguageMessageFile);
  143.        Msg.Error               = GetMessage( ObjectStart + 11, LanguageMessageFile);
  144.        Msg.Ok                  = GetMessage( ObjectStart + 12, LanguageMessageFile);
  145.        Msg.Backup              = GetMessage( ObjectStart + 13, LanguageMessageFile);
  146.        Msg.Replacement         = GetMessage( ObjectStart + 14, LanguageMessageFile);
  147.        Msg.MsgFile             = GetMessage( ObjectStart + 15, LanguageMessageFile);
  148.        Msg.ReadmeFile          = GetMessage( ObjectStart + 16, LanguageMessageFile);
  149.        Msg.LoginMsgFiles       = GetMessage( ObjectStart + 17, LanguageMessageFile);
  150.        Msg.SyslevelFile        = GetMessage( ObjectStart + 18, LanguageMessageFile);
  151.        Msg.UPMCSet             = GetMessage( ObjectStart + 19, LanguageMessageFile);
  152.        Msg.CreateFolder        = GetMessage( ObjectStart + 20, LanguageMessageFile);
  153.     END;
  154.  
  155.     'CLS';
  156.     SAY;
  157.     SAY Title;
  158.     SAY;
  159.     SAY;
  160.  
  161.     /* ask user */
  162.     IF (\ProceedWith( Msg.Installprompt)) THEN
  163.        LEAVE;
  164.  
  165.     /* configure UPM */
  166.     'COPY' LanguageMessageFile CallDir'\TNLOGIN.MSG' Redirection;
  167.     'CALL' CallDir'\TNLOGIN /CONFIGUPM'
  168.     rcConfigure = rc;
  169.     'DEL' CallDir'\TNLOGIN.MSG';
  170.     IF (rcConfigure \= ERROR.NO_ERROR) THEN
  171.        LEAVE;
  172.  
  173.     /* create backup of exe file */
  174.     i = 1;
  175.     DO WHILE (TRUE)
  176.        BackupFile = 'tnlogin.'RIGHT(i ,3, '0');
  177.        IF (\FileExist(TargetDir'\'BackupFile)) THEN
  178.        DO
  179.           rc = Copyfiles( 'tnlogin.exe',  TargetDir'\'BackupFile, Msg.Backup BackupFile);
  180.           LEAVE;
  181.        END;
  182.        i = i + 1;
  183.     END;
  184.  
  185.     /* install EXE file */
  186.     rc = Copyfiles( 'tnlogin.exe',  TargetDir'\', Msg.Replacement);
  187.     if (rc \= ERROR.NO_ERROR) THEN
  188.        LEAVE;
  189.  
  190.     /* install message file */
  191.     rc = Copyfiles( LanguageMessageFile,  TargetDir'\tnlogin.msg', Msg.MsgFile);
  192.     IF (rc \= ERROR.NO_ERROR) THEN
  193.        LEAVE;
  194.  
  195.     /* install Readme */
  196.     rc = Copyfiles( 'readme',  ETCDir'\tnlogin.txt', Msg.ReadmeFile);
  197.     if (rc \= ERROR.NO_ERROR) THEN
  198.        LEAVE;
  199.  
  200.     /* install welcome and login message */
  201.     IF (ETCDir \= '') THEN
  202.     DO
  203.       rc = Copyfiles( 'ETC\*',  ETCDir'\', Msg.LoginMsgFiles);
  204.       if (rc \= ERROR.NO_ERROR) THEN
  205.       LEAVE;
  206.     END;
  207.  
  208.     /* install syslevel file */
  209.     rc = Copyfiles( 'sl.tnl',  TargetDir'\syslevel.*', Msg.SyslevelFile);
  210.     if (rc \= ERROR.NO_ERROR) THEN
  211.        LEAVE;
  212.  
  213.     /* patch title and language tag */
  214.     SetSyslevelInfo( TargetDir'\syslevel.tnl', LanguageTag, SyslevelTitle);
  215.  
  216.     /* setting extended character set */
  217.     CALL CHAROUT, Msg.UPMCSet '... ';
  218.     'CALL UPMCSET /X' Redirection
  219.     IF (rc = ERROR.NO_ERROR) THEN
  220.     DO
  221.        SAY Msg.Ok;
  222.     END;
  223.     ELSE 
  224.        SAY Msg.Error;
  225.  
  226.     /* create some WPS objects */
  227.     CALL CHAROUT, Msg.CreateFolder '... ';
  228.     FolderPos = '30 43 65 36';
  229.     rc = SysCreateObject( 'WPFolder',  Msg.TitleFolder,         '<WP_DESKTOP>',       'CCVIEW=NO;ICONVIEWPOS='FolderPos';OBJECTID=<UPMLOGIN_FOLDER>;', 'U');
  230.     rc = SysCreateObject( 'WPShadow',  'Dummy',                 '<UPMLOGIN_FOLDER>',  'SHADOWID=<UPM_ACCTS>;OBJECTID=<UPMLOGIN_UPM_ACCTS_SHADOW>;', 'U');
  231.     rc = SysCreateObject( 'WPProgram', Msg.TitleLocalLogoff,    '<UPMLOGIN_FOLDER>',  'EXENAME=LOGOFF.EXE;PARAMETERS=/s;PROGTYPE=WINDOWABLEVIO;MINIMIZED=YES;OBJECTID=<UPMLOGIN_LOCAL_LOGOFF;', 'U');
  232.     rc = SysCreateObject( 'WPProgram', Msg.TitleLocalLogon,     '<UPMLOGIN_FOLDER>',  'EXENAME=LOGON.EXE;PARAMETERS=/L;PROGTYPE=PM;OBJECTID=<UPMLOGIN_LOCAL_LOGON;', 'U');
  233.     rc = SysCreateObject( 'WPProgram', Msg.TitleViewLogFile,    '<UPMLOGIN_FOLDER>',  'EXENAME=E.EXE;PARAMETERS='ETCDir'\tnlogin.log;PROGTYPE=PM;OBJECTID=<UPMLOGIN_VIEW_LOGIN_LOG>;', 'U');
  234.     rc = SysCreateObject( 'WPProgram', Msg.TitleViewErrFile,    '<UPMLOGIN_FOLDER>',  'EXENAME=E.EXE;PARAMETERS='ETCDir'\tnlogin.err;PROGTYPE=PM;OBJECTID=<UPMLOGIN_VIEW_ERROR_LOG>;', 'U');
  235.     rc = SysCreateObject( 'WPProgram', Msg.TitleEditWelcomeMsg, '<UPMLOGIN_FOLDER>',  'EXENAME=E.EXE;PARAMETERS='ETCDir'\issue;PROGTYPE=PM;OBJECTID=<UPMLOGIN_EDIT_ISSUE>;', 'U');
  236.     rc = SysCreateObject( 'WPProgram', Msg.TitleEditLoginMsg,   '<UPMLOGIN_FOLDER>',  'EXENAME=E.EXE;PARAMETERS='ETCDir'\motd;PROGTYPE=PM;OBJECTID=<UPMLOGIN_EDIT_MOTD>;', 'U');
  237.     rc = SysCreateObject( 'WPProgram', Msg.TitleViewReadme,     '<UPMLOGIN_FOLDER>',  'EXENAME=E.EXE;PARAMETERS='ETCDir'\tnlogin.txt;PROGTYPE=PM;OBJECTID=<UPMLOGIN_VIEW_README>;', 'U');
  238.     rc = SysOpenObject( '<UPMLOGIN_FOLDER>', 'ICON', TRUE);
  239.     rc = SysOpenObject( '<UPMLOGIN_FOLDER>', 'ICON', TRUE);
  240.     SAY Msg.Ok;
  241.  
  242.  END;
  243.  
  244.  SAY;
  245.  EXIT(rc);
  246.  
  247. /* ------------------------------------------------------------------------- */
  248. HALT:
  249.  SAY 'Interrupted by user.';
  250.  EXIT(ERROR.GEN_FAILURE);
  251.  
  252. /* ------------------------------------------------------------------------- */
  253. ShowHelp: PROCEDURE EXPOSE (GlobalVars)
  254.  
  255.  PARSE SOURCE . . ThisFile
  256.  
  257.  DO i = 1 TO 3
  258.     rc = LINEIN(ThisFile);
  259.  END;
  260.  
  261.  ThisLine = LINEIN(Thisfile);
  262.  DO WHILE (ThisLine \= ' */')
  263.     SAY SUBSTR(ThisLine, 7);
  264.     ThisLine = LINEIN(Thisfile);
  265.  END;
  266.  
  267.  rc = LINEOUT(Thisfile);
  268.  
  269.  RETURN('');
  270.  
  271. /* ------------------------------------------------------------------------- */
  272. ProceedWith: PROCEDURE
  273.  PARSE ARG Prompt
  274.  
  275.  ResponseKeys  = SysGetMessage(0);
  276.  Yes           = WORD(ResponseKeys, 1);
  277.  No            = WORD(ResponseKeys, 2);
  278.  ch            = ' ';
  279.  ValidResponse = Yes||No;
  280.  
  281.  SAY;
  282.  CALL CHAROUT ,Prompt '('Yes'/'No') '
  283.  DO WHILE (POS(ch, ValidResponse) = 0)
  284.     ch = SysGetKey('NOECHO');
  285.     ch = TRANSLATE(ch);
  286.     IF (POS(ch, ValidResponse) = 0) THEN BEEP(800, 200);
  287.  END;
  288.  SAY;
  289.  SAY;
  290.  RETURN(ch = Yes);
  291.  
  292. /* ------------------------------------------------------------------------- */
  293. GetInstDrive: PROCEDURE EXPOSE env
  294.  ARG DirName, EnvVarName
  295.  
  296.  /* Default: OS2 directory */
  297.  IF (DirName = '') THEN DirName = '\OS2';
  298.  
  299.  /* Default: PATH  */
  300.  IF (EnvVarName = '') THEN EnvVarName = 'PATH';
  301.  
  302.  /* get value */
  303.  PathValue = TRANSLATE(VALUE(EnvVarName,,env));
  304.  
  305.  /* search entry and return drive */
  306.  DirName = ':'DirName';';
  307.  EntryPos = POS(DirName, PathValue) - 1;
  308.  IF (EntryPos = -1) THEN
  309.     RETURN('');
  310.  InstDrive = SUBSTR(PathValue, EntryPos, 2);
  311.  RETURN(InstDrive);
  312.  
  313. /* ------------------------------------------------------------------------- */
  314. FileExist: PROCEDURE
  315.  ARG FileName
  316.  
  317.  RETURN(STREAM(Filename, 'C', 'QUERY EXISTS') > '');
  318.  
  319. /* ------------------------------------------------------------------------- */
  320. ReadSyslevelFile: PROCEDURE EXPOSE (GlobalVars)
  321.  PARSE ARG File, ForceCompId, Request
  322.  
  323.  /* default values */
  324.  result = '';
  325.  Request = TRANSLATE(Request);
  326.  
  327.  /* valid tags */
  328.  Tag.0      = 8;
  329.  /* ------------------------------ */
  330.  Tag.1      = 'SYSID';
  331.  Tag.1.Exec = 'result = sysid';
  332.  /* ------------------------------ */
  333.  Tag.2      = 'EDITION';
  334.  Tag.2.Exec = 'result = edition';
  335.  /* ------------------------------ */
  336.  Tag.3      = 'VERSION';
  337.  Tag.3.Exec = 'result = version||modify';
  338.  /* ------------------------------ */
  339.  Tag.4      = 'MODIFY';
  340.  Tag.4.Exec = 'result = modify';
  341.  /* ------------------------------ */
  342.  Tag.5      = 'CURRCSD';
  343.  Tag.5.Exec = 'result = currCsd';
  344.  /* ------------------------------ */
  345.  Tag.6      = 'PREVCSD';
  346.  Tag.6.Exec = 'result = prevCsd';
  347.  /* ------------------------------ */
  348.  Tag.7      = 'ID';
  349.  Tag.7.Exec = 'result = compId';
  350.  /* ------------------------------ */
  351.  Tag.8      = 'NAME';
  352.  Tag.8.Exec = 'result = sysname';
  353.  
  354.  /* read header */
  355.  header        = C2D(CHARIN(File,,2));
  356.  sig           =     CHARIN(File,,8);
  357.  DateJulian    = C2D(CHARIN(File,,5));
  358.  Version       = C2D(CHARIN(File,,2));
  359.  reserved      =     CHARIN(File,,16);
  360.  offset        = C2D(REVERSE(CHARIN(File,,4))) + 1;
  361.  
  362.  /* is signature valid */
  363.  IF (sig \= 'SYSLEVEL') THEN
  364.     RETURN('');
  365.  
  366.  /* read table */
  367.  sysid          = C2D(REVERSE(CHARIN(File,offset, 2)));
  368.  edition        = C2D(CHARIN(File,,1));
  369.  version        = D2X(C2D(CHARIN(File,,1)));
  370.  modify         = C2D(CHARIN(File,,1));
  371.  DateValue      = CHARIN(File,,2);
  372.  
  373.  currCsd        = CHARIN(File,,8);
  374.  prevCsd        = CHARIN(File,,8);
  375.  sysName        = CHARIN(File,,80);
  376.  compId         = CHARIN(File,,9); /* ignore the rest */
  377.  
  378.  /* check comp id, if given */
  379.  IF (ForceCompId \= '') THEN
  380.     IF (ForceCompId  \= compId) THEN
  381.        RETURN('');
  382.  
  383.  /* transform version */
  384.  version = LEFT(version,1)'.'SUBSTR(version,2)
  385.  
  386.  /* get result */
  387.  IF (Request \= '') THEN
  388.  DO i = 1 TO Tag.0
  389.     IF (POS(Request, Tag.i) = 1) THEN
  390.     DO
  391.        INTERPRET(Tag.i.Exec);
  392.     END;
  393.  END;
  394.  
  395.  IF (Result = '') THEN
  396.     result = sysid edition version modify currCsd prevCsd compId sysname;
  397.  
  398.  /* close file */
  399.  rc = STREAM(File, 'C', 'CLOSE');
  400.  
  401.  RETURN(result);
  402.  
  403. /* ------------------------------------------------------------------------- */
  404. GetCalldir: PROCEDURE
  405. PARSE SOURCE . . CallName
  406.  CallDir = FILESPEC('Drive', CallName)||FILESPEC('Path', CallName);
  407.  RETURN(LEFT(CallDir, LENGTH(CallDir) - 1));
  408.      
  409. /* ========================================================================= */
  410. SetSyslevelInfo: PROCEDURE EXPOSE (GlobalVars)
  411.  PARSE ARG File, NewId, NewTitle
  412.  
  413.  /* read header */
  414.  header        = C2D(CHARIN(File,,2));
  415.  sig           =     CHARIN(File,,8);
  416.  DateJulian    = C2D(CHARIN(File,,5));
  417.  Version       = C2D(CHARIN(File,,2));
  418.  reserved      =     CHARIN(File,,16);
  419.  offset        = C2D(REVERSE(CHARIN(File,,4))) + 1;
  420.  
  421.  /* is signature valid */
  422.  IF (sig \= 'SYSLEVEL') THEN
  423.     RETURN('');
  424.  
  425.  /* determine data offsets */
  426.  sysidOffs      = offset;
  427.  editionOffs    = offset + 2;
  428.  versionOffs    = offset + 3;
  429.  modifyOffs     = offset + 4;
  430.  DateValueOffs  = offset + 5;
  431.  
  432.  currCsdOffs    = offset +  7;
  433.  prevCsdOffs    = offset + 15;
  434.  sysNameOffs    = offset + 23;
  435.  compIdOffs     = offset + 103;
  436.  
  437.  /* read in CSD level tags */
  438.  CurrLevel = CHARIN(File, currCsdOffs, 8);
  439.  PrevLevel = CHARIN(File, prevCsdOffs, 8);
  440.  
  441.  Id1 = SUBSTR(CurrLevel, 1, 3);
  442.  Id2 = SUBSTR(PrevLevel, 1, 3);
  443.  CurrId = RIGHT(Id1, 1);
  444.  
  445.  IF ((Id1 \= Id2) | (POS(CurrId, '0CDFGHIJLNPSUW') = 0)) THEN
  446.     RETURN('');
  447.  ELSE
  448.  DO
  449.     /* patch in new id and cose file */
  450.     rc = CHAROUT(File, NewId, currCsdOffs + 2);
  451.     rc = CHAROUT(File, NewId, prevCsdOffs + 2);
  452.     IF (NewTitle \= '') THEN
  453.     DO
  454.        NewTitle = STRIP(SUBSTR(NewTitle, 1, 79));  /* cut to max 79 chars */
  455.        NewTitle = NewTitle'00'x;
  456.        rc = CHAROUT(File, NewTitle, sysNameOffs);
  457.     END;
  458.     rc = LINEOUT(File);
  459.  END;
  460.  RETURN('');
  461.  
  462. /* ========================================================================= */
  463. TranslateLanguageTag: PROCEDURE
  464.  ARG SearchString
  465.  
  466.  /* special values in LanguageTag:                       */
  467.  /* '#'    : don't know the correct value yet            */
  468.  /* special values in LanguageZMsg:                      */
  469.  /* '*'    : language tag is unique, no zero msg needed  */
  470.  /* '?????': don't know the correct value yet            */
  471.  LanguageTag   = '0     U   G       D       F      H           H           S     I     W      N      F       J     P        B      C      T       O      0      0        #      #     #';
  472.  LanguageAbbr  = 'ENG   ENG DEU     DAN     FRA    NDL         KOR         ESP   ITA   SVE    NOR    FIN     JPN   PTG      PTB    FRC    TWN     POL    POL    HUN      HEB    ARA   CHT';
  473.  LanguageZMsg  = 'YNARI *   *       *       *      JNAHN       ?????       *     *     *      *      *       *     *        *      *      *       *      TNAPI  xxxxx    *      *     *';
  474.                /* us    uk  germany denmark france netherlands netherlands spain italy sweden norway finland japan protugal brazil canada taiwan  poland poland hungaria israel arab. china */
  475.                /*                                                                                                                                 WARP4  WARP3                              */
  476.  
  477.  /* determine which list to search */
  478.  SELECT
  479.     WHEN (LENGTH(SearchString) = 1) THEN SearchPos = WORDPOS(SearchString, TRANSLATE(LanguageTag));
  480.     WHEN (LENGTH(SearchString) = 3) THEN SearchPos = WORDPOS(SearchString, TRANSLATE(LanguageAbbr));
  481.     OTHERWISE NOP;
  482.  END;
  483.  
  484.  IF (SearchPos = 0) THEN
  485.     /* use default language code,if language not known */
  486.     SearchPos = 1;
  487.  
  488.  /* make second check for languages, that have not a unique language tag */
  489.  IF (WORD(LanguageZMsg, SearchPos) \= '*') THEN
  490.  DO
  491.     /* read the zero message of the system and remove spaces*/
  492.     ZeroMsg = LEFT(SPACE(SysGetMessage(0), 0), 5);
  493.  
  494.     /* check the language again */
  495.     SearchPos = WORDPOS(ZeroMsg, LanguageZMsg);
  496.  
  497.     IF (SearchPos = 0) THEN
  498.        /* use non existing language code,if language not known */
  499.        SearchPos = 1;
  500.  END;
  501.  
  502.  /* now determine result */
  503.  SELECT
  504.     WHEN (LENGTH(SearchString) = 1) THEN SearchResult = WORD(LanguageAbbr, SearchPos);
  505.     WHEN (LENGTH(SearchString) = 3) THEN SearchResult = WORD(LanguageTag,  SearchPos);
  506.     OTHERWISE;
  507.  END;
  508.  
  509.  RETURN(SearchResult);
  510.  
  511. /* ========================================================================= */
  512. Copyfiles: PROCEDURE EXPOSE (GlobalVars)
  513.  PARSE ARG Source, Target, Description
  514.  
  515.  rc = ERROR.NO_ERROR;
  516.  
  517.  /* install EXE file */
  518.  CALL CHAROUT, Msg.Copy Description '... ';
  519.  'COPY' Source Target Redirection;
  520.  IF (rc \= ERROR.NO_ERROR) THEN
  521.     SAY CmdName': ' Msg.CopyFailed Description'.';
  522.  ELSE
  523.    SAY Msg.Ok;
  524.  
  525.  RETURN(rc);
  526.  
  527. /* ========================================================================= */
  528. GetMessage: PROCEDURE EXPOSE (GlobalVars)
  529.  PARSE ARG Id, File
  530.  
  531.  Message = SysGetMessage( Id, File);
  532.  Message = LEFT( Message, LENGTH( Message) - 2);
  533.  RETURN(Message);
  534.  
  535.