/* SWIREXX - switch REXX interpreter */
/* This code is identical to switchrx.cmd except for the SAY
   commands that have been modified for message box display
*/

ARG window

/* Create filenames for files needed to do the switching at the next reboot */
LockedList = SysDrive || "\OS2\INSTALL\SWITCHRX.LST"
ConfigSys = SysDrive || "\CONFIG.SYS"
ConfigSysBackup = SysDrive || "\OS2\INSTALL\CONFIG.REX"
LockedSys = SysDrive || "\OS2\INSTALL\IBMLANLK.SYS"
LockedExe = SysDrive || "\OS2\INSTALL\IBMLANLK.EXE"
RexxDll = SysDrive || "\OS2\DLL\REXX.DLL"
CRexxDll = SysDrive || "\OS2\DLL\CREXX.DLL"
ORexxDll = SysDrive || "\OS2\DLL\OREXX.DLL"
RexxUtilDll = SysDrive || "\OS2\DLL\REXXUTIL.DLL"
CRexxUtilDll = SysDrive || "\OS2\DLL\CREXUTIL.DLL"
ORexxUtilDll = SysDrive || "\OS2\DLL\OREXUTIL.DLL"
RexxScDll = SysDrive || "\OS2\DLL\REXXSC.DLL"
ORexxScDll = SysDrive || "\OS2\DLL\OREXXSC.DLL"
RexxSomDll = SysDrive || "\OS2\DLL\REXXSOM.DLL"
ORexxSomDll = SysDrive || "\OS2\DLL\OREXXSOM.DLL"
RexxWpsDll = SysDrive || "\OS2\DLL\REXXWPS.DLL"
ORexxWpsDll = SysDrive || "\OS2\DLL\OREXXWPS.DLL"
RexxMsg = SysDrive || "\OS2\SYSTEM\REX.MSG"
CRexxMsg = SysDrive || "\OS2\SYSTEM\CREX.MSG"
ORexxMsg = SysDrive || "\OS2\SYSTEM\OREX.MSG"
RexxHelpMsg = SysDrive || "\OS2\SYSTEM\REXH.MSG"
CRexxHelpMsg = SysDrive || "\OS2\SYSTEM\CREXH.MSG"
ORexxHelpMsg = SysDrive || "\OS2\SYSTEM\OREXH.MSG"
RexxReference = SysDrive || "\OS2\BOOK\REXX.INF"
CRexxReference = SysDrive || "\OS2\BOOK\CREXX.INF"
ORexxReference = SysDrive || "\OS2\BOOK\OREXX.INF"

If Stream(LockedList, 'C', 'QUERY EXIST') \= '' Then
  Do
    response=VpMessageBox(window,'Switch REXX','WARNING: The replacement of' CurrentREXX 'with' TargetREXX 'has already been initiated for the next reboot.' || X2C('0d') || 'To stop replacement enter YES.' || X2C('0d0d') || 'A NO will leave the replacement of' CurrentREXX 'with' TargetREXX 'at the next reboot.','YESNO')
    IF response <> 'YES' THEN
     DO
       CALL VpAddItem window, 1003, 'END', X2C('0d')
       CALL VpAddItem window, 1003, 'END', TargetREXX 'will be initiated during the next reboot.', X2C('0d')
       SIGNAL ReturnHere
     END

    '@DEL' LockedList '1>NUL 2>NUL'
    '@COPY' ConfigSysBackup ConfigSys '1>NUL 2>NUL'
    '@DEL' ConfigSysBackup '1>NUL 2>NUL'

    CALL VpAddItem window, 1003, 'END', X2C('0d')
    CALL VpAddItem window, 1003, 'END', CurrentREXX 'will remain active for the next reboot.', X2C('0d')
    SIGNAL ReturnHere
  End

If Stream(ConfigSysBackup, 'C', 'QUERY EXIST') \= '' Then
  Do
    response=VpMessageBox(window,'Switch REXX','WARNING: A file with name '" || ConfigSysBackup || "' already exists!' || X2C('0d') || 'This procedure will create a backup copy of your CONFIG.SYS with this filename. If you proceed with this procedure it will be deleted.' || X2C('0d') || 'Press YES to overwrite this file or NO to cancel the operation.','YESNO')
    IF response <> 'YES' THEN
     DO
       CALL VpAddItem window, 1003, 'END', X2C('0d')
       CALL VpAddItem window, 1003, 'END', 'Creating backup copy of CONFIG.SYS canceled.' || X2C('0d')
       SIGNAL ReturnHere
     END
  End

'@COPY' ConfigSys ConfigSysBackup '1>NUL 2>NUL'

If Level > 4.00 Then
  Do
    /* we're switching from Object REXX to classic REXX */
    Call LineOut LockedList, "RENAME" RexxDll ORexxDll
    Call LineOut LockedList, "RENAME" CRexxDll RexxDll
    Call LineOut LockedList, "RENAME" RexxUtilDll ORexxUtilDll
    Call LineOut LockedList, "RENAME" CRexxUtilDll RexxUtilDll
    Call LineOut LockedList, "RENAME" RexxScDll ORexxScDll
    Call LineOut LockedList, "RENAME" RexxSomDll ORexxSomDll
    Call LineOut LockedList, "RENAME" RexxWpsDll ORexxWpsDll
    Call LineOut LockedList, "RENAME" RexxMsg ORexxMsg
    Call LineOut LockedList, "RENAME" CRexxMsg RexxMsg
    Call LineOut LockedList, "RENAME" RexxHelpMsg ORexxHelpMsg
    Call LineOut LockedList, "RENAME" CRexxHelpMsg RexxHelpMsg
    Call LineOut LockedList, "RENAME" RexxReference ORexxReference
    Call LineOut LockedList, "RENAME" CRexxReference RexxReference
  End
Else
  Do
    /* we're switching from classic REXX to Object REXX */
    Call LineOut LockedList, "RENAME" RexxDll CRexxDll
    Call LineOut LockedList, "RENAME" ORexxDll RexxDll
    Call LineOut LockedList, "RENAME" RexxUtilDll CRexxUtilDll
    Call LineOut LockedList, "RENAME" ORexxUtilDll RexxUtilDll
    Call LineOut LockedList, "RENAME" ORexxScDll RexxScDll
    Call LineOut LockedList, "RENAME" ORexxSomDll RexxSomDll
    Call LineOut LockedList, "RENAME" ORexxWpsDll RexxWpsDll
    Call LineOut LockedList, "RENAME" RexxMsg CRexxMsg
    Call LineOut LockedList, "RENAME" ORexxMsg RexxMsg
    Call LineOut LockedList, "RENAME" RexxHelpMsg CRexxHelpMsg
    Call LineOut LockedList, "RENAME" ORexxHelpMsg RexxHelpMsg
    Call LineOut LockedList, "RENAME" RexxReference CRexxReference
    Call LineOut LockedList, "RENAME" ORexxReference RexxReference
  End

Call LineOut LockedList, "COPY" ConfigSysBackup ConfigSys
Call LineOut LockedList, "ERASE" ConfigSysBackup
Call LineOut LockedList, "ERASE" LockedList
Call LineOut LockedList, "1A"x /* EOF */
Call LineOut LockedList /* close file */

/* read in Config.Sys and watch for a line containing IFS=..HPFS */
Line = 0
HPFSIndex = 0
Do While Lines(ConfigSys) \= 0
  Line = Line + 1
  Config.Line = LineIn(ConfigSys)

  InputLine = Translate(Config.Line)
  If (Pos('IFS', InputLine) \= 0) & (Pos('HPFS', InputLine) \= 0) Then
    HPFSIndex = Line
End
Call Stream ConfigSys, "C", "CLOSE"

/* write a new Config.Sys with the locked files device driver statements */
'@DEL' ConfigSys '1>NUL 2>NUL'
Do Index = 1 To Line
  If Index > HPFSIndex Then
    Do
      Call LineOut ConfigSys, "DEVICE=" || LockedSys LockedList
      Call LineOut ConfigSys, "RUN=" || LockedExe LockedList
      HPFSIndex = Line + 1
    End

  Call LineOut ConfigSys, Config.Index
End

Call LineOut ConfigSys

/* if we're running in Object REXX check whether WPS support was registered */
If Level > 4.00 Then
  Do
    WPSDereg = 0
    Call SysQueryClassList "Classes."
    Do Index = 1 To Classes.0
      If Translate(Word(Classes.Index, 2)) = "REXXWPS" Then
        Do
          Call SysDeRegisterObjectClass Word(Classes.Index, 1)
          If Result = 0 Then
            DO
              CALL VpAddItem window, 1003, 'END', X2C('0d')
              CALL VpAddItem window, 1003, 'END', 'Error: WPS class' Word(Classes.Index, 1) 'could not be deregistered.' || X2C('0d')
            END
          Else
            WPSDereg = 1
        End
    End

    If SysIni('USER', 'PM_Workplace:IplLoad', 'WPZORX', 'DELETE:') = '' Then
      WPSDereg = 1
    If SysIni('USER', 'PM_Workplace:IplLoad', 'WPZORXINIT', 'DELETE:') = '' Then
      WPSDereg = 1

    If WPSDereg = 1 Then
      Do
        response=VpMessageBox(window,'Switch REXX','The WPS support of Object REXX had' || X2C('0d') || 'to be removed for the activiation of the' || X2C('0d') || TargetREXX 'interpreter. After switching back to' CurrentREXX || X2C('0d') || "you should run the program 'WPSINST.CMD' again." )
      End
  End

CALL VpAddItem window, 1003, 'END', X2C('0d')
CALL VpAddItem window, 1003, 'END', 'Preparations complete. The' TargetREXX || X2C('0d')
CALL VpAddItem window, 1003, 'END', 'interpreter will be activated' || X2C('0d')
CALL VpAddItem window, 1003, 'END', 'after the next reboot.' || X2C('0d')


ReturnHere:
SWIREXXFlag = 1
/* start the time to enable the switch button after this subprogram has finished executing */
/* duration in 1/1000 secs */
CALL VpWindow window,'STARTTIMER',500

RETURN