home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 11 Util
/
11-Util.zip
/
tlh120.zip
/
INSTALL
/
INSTALL.CMD
< prev
next >
Wrap
OS/2 REXX Batch file
|
1995-07-29
|
18KB
|
637 lines
/*
* INSTALL.CMD TLHIDE V1.2 - C.Langanke 1995 - Installation
*
* Syntax: INSTALL.CMD [/LANGUAGE:deutsch|english] [/TARGETDIR:...]
* [/LISTFILE:...] [/LOCATION:"<...>"] [/BATCH]
* [/?]
*
* Creates a WPS folder and program objects for the TLHIDE package.
* Optionally copies files of TLHIDE package to a target directory before.
*
* /LANGUAGE:... - deutsch/english [Default:deutsch]
* /TARGETDIR:... - name of target directory where files are to be
* copied to before installation of WPS objects
* All files must be unzipped before invoking INSTALL !!!
* If /TARGETDIR is not specified, no copy is performed!
* /LISTFILE:... - defaultname of listfile
* /LOCATION:"<...>" - WPS-ID: Location for the TLHIDE folder
* [Default: "<WP_DESKTOP>"]
* /BATCH - don't use menus and prompts: just install with defaults
* /? - display this help text
*/
/* The first comment is used as online help text */
SIGNAL ON HALT
TitleLine = STRIP(SUBSTR(SourceLine(2), 3));
PARSE VAR TitleLine CmdName'.CMD 'Info
Title = CmdName Info
NewLine = D2C(13)||D2C(10);
TRUE = (1 = 1);
FALSE = (0 = 1);
Redirection = '1>NUL 2>&1';
'@ECHO OFF'
/* some OS/2 Error codes */
ERROR.NO_ERROR = 0;
ERROR.ACCESS_DENIED = 5;
ERROR.INVALID_PARAMETER = 87;
/* some default values */
Default.PromptLen = 60;
ExitMessage = 'Abbruch durch Benutzer.';
/* defaults */
Default.Location = "<WP_DESKTOP>";
Default.ListFile = 'TLHIDE.LST';
Default.Language = 'deutsch';
/* flags */
Flag.Batch = FALSE;
Flag.Language = FALSE;
Flag.InvalidParm = FALSE;
Value.InvalidParm = '';
/* defaults for selection by parms */
Selected.TargetDir = '';
Selected.Location = Default.Location;
Selected.ListFile = Default.ListFile;
Selected.Language = '';
/* determine directories */
InstallDir = GetCallDir();
LastSlash = LASTPOS( '\', InstallDir);
ProgDir = LEFT(InstallDir, LastSlash - 1);
/* NLS definitions */
DefaultMessageFile = ProgDir'\TLHIDE.MSG';
NlsMsgFile.1 = InstallDir'\TLHGER.MSG';
NlsMsgFile.2 = InstallDir'\TLHUS.MSG';
DefaultInfFile = ProgDir'\TLHIDE.INF';
NlsInfFile.1 = InstallDir'\TLHGER.INF';
NlsInfFile.2 = InstallDir'\TLHUS.INF';
NlsOverview.1 = '"TLHIDE Überblick"';
NlsOverview.2 = '"TLHIDE Overview"';
/*
* load RexxUtil
*/
CALL RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';
CALL SysLoadFuncs;
/*
* show help
*/
ARG Parms
IF (POS('?', Parms) > 0) THEN
DO
rc = ShowHelp();
EXIT(ERROR.NO_ERROR)
END;
/*
* read commandline parms
*/
PARSE ARG Parms
DO i = 1 TO WORDS(Parms);
ThisParm = WORD(Parms, i);
PARSE VAR ThisParm ThisTag':'ThisValue
ThisTag = TRANSLATE(ThisTag);
SELECT
WHEN (POS(ThisTag, '/LANGUAGE') = 1) THEN
DO
Selected.Language = TRANSLATE(ThisValue);
Flag.Language = TRUE;
END;
WHEN (POS(ThisTag, '/LISTFILE') = 1) THEN
DO
Selected.Listfile = ThisValue;
END;
WHEN (POS(ThisTag, '/TARGETDIR') = 1) THEN
DO
Selected.TargetDir = ThisValue;
END;
WHEN (POS(ThisTag, '/LOCATION') = 1) THEN
DO
ThisValue = STRIP(ThisValue);
IF (LEFT(ThisValue, 1) = '"') THEN
PARSE VAR ThisValue '"'ThisValue'"'
Selected.Location = ThisValue;
END;
WHEN (POS(ThisTag, '/BATCH') = 1) THEN
DO
Flag.Batch = TRUE;
END;
OTHERWISE
DO
Flag.InvalidParm = TRUE;
Value.InvalidParm = ThisParm;
END;
END; /* SELECT */
END; /* DO */
/*
* modify parms if batch is requested
*/
IF (Flag.Batch) THEN
DO
/* use default lanuage if not selected */
IF (Selected.Language = '') THEN
DO
Selected.Language = Default.Language;
Flag.Language = TRUE;
END;
END;
/*
* select language
*/
/* select language */
SELECT
WHEN (LEFT(Selected.Language, 1) = 'D') THEN Choice = 1;
WHEN (LEFT(Selected.Language, 1) = 'E') THEN Choice = 2;
OTHERWISE Choice = 'UNSELECTED';
END;
SelectLanguage:
IF (Choice = 'UNSELECTED') THEN
DO
DROP(Menu.);
Menu.ValidMenuKeys = '12';
Menu.Line.0 = 6;
Menu.Line.1 = '';
Menu.Line.2 = Title
Menu.Line.3 = '';
Menu.Line.4 = '';
Menu.Line.5 = ' 1. deutsch';
Menu.Line.6 = ' 2. english';
Choice = Menu();
END;
/* select NLS files */
MessageFile = NlsMsgFile.Choice;
InfFile = NlsInfFile.Choice;
Overview = NlsOverview.Choice;
/* load MessageIds and YesNo Keys*/
MessageFileInfo = LoadMsgString(0, MessageFile)
PARSE VAR MessageFileInfo InstMsgStart InstObjectsStart InstObjectsEnd YesKey NoKey ValidKeys2 InstLanguage
/* load MessageIds */
NlsMsg.AbortProgram = LoadMsgString(InstMsgStart + 0, MessageFile);
NlsMsg.AlreadyActive = LoadMsgString(InstMsgStart + 1, MessageFile);
NlsMsg.HaltMsg = LoadMsgString(InstMsgStart + 2, MessageFile);
NlsMsg.Readme = LoadMsgString(InstMsgStart + 3, MessageFile);
NlsMsg.Install = LoadMsgString(InstMsgStart + 4, MessageFile);
NlsMsg.NLSSelect = LoadMsgString(InstMsgStart + 5, MessageFile);
NlsMsg.LstSelect = LoadMsgString(InstMsgStart + 6, MessageFile);
NlsMsg.Exit = LoadMsgString(InstMsgStart + 7, MessageFile);
NlsMsg.Ok = LoadMsgString(InstMsgStart + 8, MessageFile);
NlsMsg.Error = LoadMsgString(InstMsgStart + 9, MessageFile);
NlsMsg.LstSelectPrompt = LoadMsgString(InstMsgStart + 10, MessageFile);
NlsMsg.SelectDefault = LoadMsgString(InstMsgStart + 11, MessageFile);
NlsMsg.InstallPrompt = LoadMsgString(InstMsgStart + 12, MessageFile)
NlsMsg.TargetDirInstall = LoadMsgString(InstMsgStart + 13, MessageFile);
NlsMsg.TargetDirExists = LoadMsgString(InstMsgStart + 14, MessageFile);
NlsMsg.InvalidParm = LoadMsgString(InstMsgStart + 15, MessageFile);
NlsMsg.NotExist = LoadMsgString(InstMsgStart + 16, MessageFile);
NlsMsg.XcopyFailed = LoadMsgString(InstMsgStart + 17, MessageFile);
NlsMsg.DeactivatePrompt = LoadMsgString(InstMsgStart + 18, MessageFile);
NlsMsg.Deactivated = LoadMsgString(InstMsgStart + 19, MessageFile);
NlsMsg.Create = LoadMsgString(InstMsgStart + 20, MessageFile);
NlsMsg.Delete = LoadMsgString(InstMsgStart + 21, MessageFile);
NlsMsg.MsgFileCopy = LoadMsgString(InstMsgStart + 22, MessageFile);
NlsMsg.MsgFileLocked = LoadMsgString(InstMsgStart + 23, MessageFile);
NlsMsg.InfFileCopy = LoadMsgString(InstMsgStart + 24, MessageFile);
NlsMsg.InfFileLocked = LoadMsgString(InstMsgStart + 25, MessageFile);
NlsMsg.Deinstall = LoadMsgString(InstMsgStart + 26, MessageFile);
NlsMsg.NotInstalled = LoadMsgString(InstMsgStart + 27, MessageFile);
ExitMessage = NlsMsg.HaltMsg;
/*
* validate parms
*/
IF (Flag.InvalidParm) THEN
DO
IF (Flag.Language) THEN
DO
SAY;
SAY Title
SAY;
END;
SAY CmdName':' NlsMsg.Error':' NlsMsg.InvalidParm '»'Value.InvalidParm'«.';
EXIT(ERROR.INVALID_PARAMAMETER);
END;
IF (\ObjectExist(Selected.Location)) THEN
DO
IF (Flag.Language) THEN
DO
SAY;
SAY Title
SAY;
END;
SAY CmdName':' NlsMsg.Error':' NlsMsg.NotExist':' Selected.Location
EXIT(ERROR.INVALID_PARAMETER);
END;
/*
* if target directory is specified, do a xcopy and call
* this batch again within the target directory structure
*/
IF (Selected.TargetDir \= '' ) THEN
DO
IF (\Flag.Batch) THEN
IF (\ProceedWith(NlsMsg.InstallPrompt Selected.TargetDir)) THEN
SIGNAL HALT;
SAY NlsMsg.TargetDirInstall Selected.TargetDir
IF (FileExist(Selected.TargetDir)) THEN
DO
IF (Flag.Batch) THEN
DO
SAY;
SAY Title
SAY;
END;
SAY;
SAY NlsMsg.TargetDirExists
SAY NlsMsg.AbortProgram
EXIT(ERROR.ACCESS_DENIED);
END;
'XCOPY' ProgDir'\*.*' Selected.TargetDir'\ /S /E /T /H' Redirection
IF (rc \= ERROR.NO_ERROR) THEN
DO
IF (Flag.Batch) THEN
DO
SAY;
SAY Title
SAY;
END;
SAY;
SAY NlsMsg.XcopyFailed
SAY NlsMsg.AbortProgram
EXIT(ERROR.ACCESS_DENIED);
END;
rc = DIRECTORY(Selected.TargetDir);
CallParms = '/LANGUAGE:'InstLanguage '/LISTFILE:'Selected.Listfile '/LOCATION:"'Selected.Location'"'
IF (Flag.Batch) THEN CallParms = CallParms '/BATCH';
'CALL' Selected.TargetDir'\INSTALL\INSTALL.CMD' CallParms
EXIT(ERROR.NO_ERROR);
END;
/*
* select installation, readme, or listfile selection
*/
DROP(Menu.);
Menu.ValidMenuKeys = ValidKeys2;
Menu.Line.0 = 10;
Menu.Line.1 = '';
Menu.Line.2 = Title;
Menu.Line.3 = '';
Menu.Line.4 = '';
Menu.Line.5 = ' ' NlsMsg.Readme
Menu.Line.6 = ' ' NlsMsg.Install
Menu.Line.7 = ' ' NlsMsg.NLSSelect
Menu.Line.9 = '';
Menu.Line.10 = ' ' NlsMsg.Exit
DO WHILE (TRUE)
/* setup dynamically changing lines here */
Menu.Line.8 = ' ' NlsMsg.LstSelect '['Selected.ListFile']'
/* just install within batch mode */
IF (Flag.Batch) THEN
DO
DO i = 1 TO 3
Say Menu.Line.i;
END;
LEAVE;
END;
Choice = Menu();
SELECT
WHEN (Choice = SUBSTR(ValidKeys2, 1, 1)) THEN
DO
'START VIEW' InfFile Overview
rc = SysSleep(3);
END;
WHEN (Choice = SUBSTR(ValidKeys2, 2, 1)) THEN LEAVE;
WHEN (Choice = SUBSTR(ValidKeys2, 3, 1)) THEN
DO
Choice = 'UNSELECTED';
SIGNAL SelectLanguage;
END;
WHEN (Choice = SUBSTR(ValidKeys2, 4, 1)) THEN
DO
NewListFile = PullVariable(Selected.ListFile, NlsMsg.LstSelectPrompt);
IF (NewListFile \= Default.ListFile) THEN
DO
IF (NewListFile = Selected.ListFile) THEN
DO
IF (ProceedWith( NlsMsg.SelectDefault '['Default.Listfile']')) THEN
NewListfile = Default.ListFile;
END;
END;
Selected.ListFile = NewListFile;
END;
WHEN (Choice = SUBSTR(ValidKeys2, 5, 1)) THEN SIGNAL HALT;
OTHERWISE NOP;
END /* SELECT */
END; /* WHILE (TRUE) */
/*
* deactivate TLHIDE, if it is active
*/
'CALL ' ProgDir'\TLHIDE /S' Redirection
IF (rc = 1) THEN
DO
SAY;
SAY NlsMsg.AlreadyActive;
IF (\Flag.Batch) THEN
IF (\ProceedWith(NlsMsg.DeactivatePrompt)) THEN
EXIT(ERROR.GEN_FAILURE);
'CALL ' ProgDir'\TLHIDE /U' Redirection
SAY NlsMsg.Deactivated;
SAY;
END;
/*
* copy Msg file
*/
CALL CHAROUT, LEFT(NlsMsg.MsgFileCopy '...', Default.PromptLen)
'COPY' MessageFile DefaultMessageFile Redirection
IF (rc = ERROR.NO_ERROR) THEN
SAY NlsMsg.Ok
ELSE
DO
SAY;
SAY NlsMsg.Error '!'
SAY NlsMsg.MsgFileLocked
SAY NlsMsg.AbortProgram;
SAY;
EXIT(ERROR.GEN_FAILURE);
END;
/*
* copy INF file
*/
CALL CHAROUT, LEFT(NlsMsg.InfFileCopy '...', Default.PromptLen)
'COPY' InfFile DefaultInfFile Redirection
IF (rc = ERROR.NO_ERROR) THEN
SAY NlsMsg.Ok
ELSE
DO
SAY;
SAY NlsMsg.Error '!'
SAY NlsMsg.InfFileLocked
SAY NlsMsg.AbortProgram;
SAY;
EXIT(ERROR.GEN_FAILURE);
END;
/*
* Now create all objects defined
*/
DO i = InstObjectsStart TO InstObjectsEnd
/* load object details */
ObjectDetails = LoadMsgString(i, MessageFile);
PARSE VAR ObjectDetails,
'"'ObjectClass'"',
'"'ObjectLocation'"',
'"'ObjectId'"',
'"'ObjectTitle'"',
'"'ObjectOption'"',
'"'ObjectExeName'"',
'"'ObjectParameters'"',
'"'ObjectSetup'"'
/* use selected location */
IF (ObjectLocation = Default.Location) THEN
ObjectLocation = Selected.Location;
/* make insertions to setup string */
IF ((ObjectExeName \= '') | (ObjectParameters \= '')) THEN
DO
/* add path to Exename, if neccessary */
IF ((ObjectExename \= '*') & (FileExist(ProgDir'\'ObjectExename))) THEN
ObjectExeName = ProgDir'\'ObjectExeName;
/* append rest of setup */
ObjectSetup =,
'EXENAME='ObjectExeName';'||,
'PARAMETERS='ObjectParameters';'||,
'STARTUPDIR='ProgDir';'||,
ObjectSetup;
END;
/* SetupString: replace '@1' with program directory */
ObjectSetup = TranslateString(ObjectSetup, ProgDir, '@1');
/* SetupString: replace '@2' with Listfile */
ObjectSetup = TranslateString(ObjectSetup, Selected.ListFile, '@2');
/* create object */
rc = CreateObject(ObjectTitle, ObjectClass, ObjectLocation,,
'OBJECTID='ObjectId';'||,
ObjectSetup, ObjectOption);
END;
/* show the folder (open twice is ok, ccview=no is set !) */
rc = SysSetObjectData('<TLHIDE_FOLDER>', 'OPEN=DEFAULT;');
rc = SysSetObjectData('<TLHIDE_FOLDER>', 'OPEN=DEFAULT;');
EXIT(ERROR.NO_ERROR);
/* ------------------------------------------------------------------------- */
HALT:
SAY ExitMessage;
EXIT(ERROR.GEN_FAILURE);
/* ------------------------------------------------------------------------- */
ShowHelp: PROCEDURE EXPOSE ExitMessage Title
SAY;
SAY Title
SAY;
PARSE SOURCE . . ThisFile
/* skip header */
DO i = 1 TO 3
rc = LINEIN(ThisFile);
END;
/* show help */
DO WHILE (ThisLine \= ' */')
ThisLine = LINEIN(Thisfile);
SAY SUBSTR(ThisLine, 7);
END;
/* close file */
rc = LINEOUT(Thisfile);
RETURN('');
/* ------------------------------------------------------------------------- */
CreateObject: PROCEDURE EXPOSE NlsMsg. Default. ExitMessage
PARSE ARG Title, Class, Location, Setup, Option
CALL CHAROUT, LEFT(NlsMsg.Create Title '...', Default.PromptLen)
rc = SysCreateObject(Class, Title, Location, Setup, Option);
IF (rc) THEN
SAY NlsMsg.Ok
ELSE
SAY NlsMsg.Error '!'
RETURN(rc);
/* ------------------------------------------------------------------------- */
PullVariable: PROCEDURE EXPOSE ExitMessage
PARSE ARG Default, Message
SAY;
CALL CHAROUT, Message '['Default'] : ';
PARSE PULL PullVar;
IF (LENGTH(PullVar) > 0) THEN
RETURN(PullVar);
ELSE
RETURN(Default);
/* ------------------------------------------------------------------------- */
LoadMsgString: PROCEDURE EXPOSE ExitMessage
ARG MsgId, MessageFile
Message = SysGetMessage(MsgId, MessageFile);
RETURN(LEFT(Message, LENGTH(Message) - 2));
/* ------------------------------------------------------------------------- */
FileExist: PROCEDURE EXPOSE ExitMessage
ARG FileName
RETURN(STREAM(Filename, 'C', 'QUERY EXISTS') > '');
/* ------------------------------------------------------------------------- */
GetCalldir: PROCEDURE EXPOSE ExitMessage
PARSE SOURCE . . CallName
CallDir = FILESPEC('Drive', CallName)||FILESPEC('Path', CallName);
RETURN(LEFT(CallDir, LENGTH(CallDir) - 1));
/* ------------------------------------------------------------------------- */
GetDrivePath: PROCEDURE EXPOSE ExitMessage
ARG FileName
FullPath = FILESPEC('D', FileName)||FILESPEC('P', FileName);
IF (FullPath \= '') THEN
RETURN(LEFT(FullPath, LENGTH(FullPath) - 1));
ELSE
RETURN('');
/* ------------------------------------------------------------------------- */
PullVariable: PROCEDURE EXPOSE ExitMessage
PARSE ARG Default, Message
SAY;
CALL CHAROUT, Message '['Default'] : ';
PARSE PULL PullVar;
IF (LENGTH(PullVar) > 0) THEN
RETURN(PullVar);
ELSE
RETURN(Default);
/* ------------------------------------------------------------------------- */
TranslateString: PROCEDURE EXPOSE ExitMessage
PARSE ARG String, ReplaceString, SearchString
TagPos = POS(SearchString, String);
TagLen = LENGTH(SearchString);
IF (TagPos > 0) THEN
DO
NewString = '';
LastTagPos = 1 - TagLen;
DO WHILE (TagPos > 0)
NewString = NewString''SUBSTR(String, LastTagPos + TagLen, TagPos - LastTagPos - TagLen, )''ReplaceString;
LastTagPos = TagPos;
TagPos = POS(SearchString, String, TagPos + TagLen);
END;
NewString = NewString''SUBSTR(String, LastTagPos + TagLen);
RETURN(NewString);
END;
ELSE
RETURN(String);
/* ========================================================================= */
ObjectExist: PROCEDURE EXPOSE ExitMessage
ARG ObjectId
RETURN(SysSetObjectData(ObjectId, ';'));
/* ========================================================================= */
ProceedWith: PROCEDURE EXPOSE YesKey NoKey ExitMessage
PARSE ARG Prompt
ch = ' ';
ValidResponse = YesKey||NoKey;
SAY;
CALL CHAROUT ,Prompt '('YesKey'/'NoKey') '
DO WHILE (POS(ch, ValidResponse) = 0)
PULL ch
ch = TRANSLATE(ch);
IF (POS(ch, ValidResponse) = 0) THEN BEEP(800, 200);
END;
SAY;
SAY;
RETURN(ch = YesKey);
/* ========================================================================= */
Menu: PROCEDURE EXPOSE Menu. TRUE FALSE ExitMessage
Choice = '';
ChoiceOk = FALSE;
DO WHILE (\ChoiceOk)
rc = SysCls();
DO i = 1 TO Menu.Line.0
SAY Menu.Line.i
END;
Choice = TRANSLATE(PullVariable(LEFT(Menu.ValidMenuKeys, 1) , ' ? '));
ChoiceOk = (POS(Choice, Menu.ValidMenuKeys) > 0);
IF (\ChoiceOk) THEN
CALL CHAROUT, '';
END;
SAY;
RETURN(Choice);