This version can also list files as shadows and not only <WP_OBJECTID>.
It list only one of duplicate named shadows.
< and > has to be specified for objects to be able to retrieve the entry from SysIni.
/*
* Filename: WPSObj.cmd
* Author: JanErik
* Created: Sat Aug 3 2019
* Purpose: Script to list Paths and Object names of Object ID's with rexx
* Changes:
*/
call rxFuncAdd "SysIni", "REXXUTIL", "SysIni"
IF ARG(1) = 1 THEN
RETURN RxShadows()
objids = 'Bitmap Movies TAJMAHAL.MAH REXXLIB.ZIP FireFox'
DO i = 1 TO WORDS( objids )
CALL TIME 'R'
hID = RxObjIDPath( SUBWORD( objids, i, 1 ) )
SAY hID '"'!_PWH_!.hID.appPath'" ->' !_PWH_!.hID.fPath '"'!_PWH_!.hID.fName'"' '<-'||!_PWH_!.hID.isDir||'->' !_PWH_!.hID.oPath '"'!_PWH_!.hID.oName'" (' TIME( 'E' )'s )'
END
RETURN 0
RxObjIDPath: PROCEDURE EXPOSE !_PWH_!.
PARSE ARG objID, refresh
IF \DATATYPE( !_PWH_!.0, 'W' ) | refresh = 1 THEN
DO
/* Process shortcuts to shadows in parallell */
'@START "WPShadow" /C /MIN WPSObj 1'
/* Determine the currently active handles */
hApp = SysIni( 'SYSTEM', 'PM_Workplace:ActiveHandles', 'HandlesAppName' )
IF hApp = 'ERROR:' THEN
hApp = 'PM_Workplace:Handles0'
block = ''
CALL SysIni 'SYSTEM', hApp, 'All:', 'blocks.'
DO i = 1 To blocks.0
block = block||SysIni( 'SYSTEM', hApp, blocks.i )
END
DROP blocks.
DROP hApp
!_PWH_!. = ''
!_count_! = 0
PARSE VALUE block WITH 5 block
DO WHILE 0 < LENGTH( block )
PARSE VALUE block WITH !_name_! 5 block
SELECT
WHEN !_name_! = 'DRIV' THEN
PARSE VALUE block WITH 20 block
WHEN !_name_! = 'NODE' THEN
DO
PARSE VALUE block WITH !_pre_! 3 !_oID_! 5 !_pID_! 7 !_mid_! 25 !_isDir_! 27 !_fnSize_! 29 block
!_oID_! = C2RX( !_oID_! )
!_PWH_!.!_oID_!.isDir = C2X2D( !_isDir_! )
!_PWH_!.!_oID_!.fID = C2RX( !_pID_! )
!_PWH_!.!_oID_!.fPath = ''
!_fnSize_! = C2X2D( !_fnSize_! )
!_PWH_!.!_oID_!.fName = LEFT( block, !_fnSize_! )
!_count_! = !_count_! + 1
!_PWH_!.0 = !_count_!
block = SUBSTR( block, !_fnSize_! + 2 )
END
OTHERWISE NOP
END
END
IF SysIni( 'USER', 'PM_Abstract:FldrContent', 'All:', 'blocks.' ) <> 'ERROR:' THEN
DO i = 1 TO blocks.0
!_children_! = SysIni( 'USER', 'PM_Abstract:FldrContent', blocks.i )
block = blocks.i
IF !_PWH_!.block.isDir <> 1 THEN
!_PWH_!.block.isDir = 1
DO WHILE 0 < LENGTH( !_children_! )
PARSE VALUE !_children_! WITH !_child_! 3 5 !_children_!
!_child_! = C2RX( !_child_! )
IF !_PWH_!.!_child_!.fID = '' THEN
!_PWH_!.!_child_!.fID = block
END
END
DROP blocks.
DROP block
DROP !_child_!
DROP !_children_!
END
IF 0 < LENGTH( STRIP( objID ) ) THEN
DO
!_findID_! = SysIni( 'USER', 'PM_Workplace:Location', objID )
IF !_findID_! = 'ERROR:' THEN
!_findID_! = SysIni( 'SHADOW.INI', 'PM_Shadow:Location', SysMapCase( objID ) )
IF !_findID_! <> 'ERROR:' THEN
DO
PARSE VALUE !_findID_! WITH !_findID_! +2 +2 !_objName_!
!_findID_! = C2RX( !_findID_! )
!_PWH_!.!_findID_!.oPath = RxObjPath( !_findID_! )
RETURN !_findID_!
END
END
RETURN 0
RxShadows: PROCEDURE
IF SysIni( 'USER', 'PM_Abstract:Objects', 'All:', 'shadow.' ) <> 'ERROR:' THEN
DO i = 1 TO shadow.0
PARSE VALUE SysIni( 'USER', 'PM_Abstract:Objects', shadow.i ) WITH . 'WPShadow' . 'WPAbstract' +15 !_objSize_! +2 !_objName_! 'WPObject'
IF 0 < LENGTH( !_objName_! ) THEN
CALL SysIni 'SHADOW.INI', 'PM_Shadow:Location', SysMapCase( LEFT( !_objName_!, C2X2D( !_objSize_! ) - 1 ) ), X2C( XREV( shadow.i ) )
END
RETURN 0
RxObjPath: PROCEDURE EXPOSE !_PWH_!.
PARSE ARG findID
!_path_! = ''
!_PWH_!.findID.appPath = ''
PARSE VALUE SysIni( 'USER', 'PM_Abstract:Objects', STRIP( findID, 'L', '0' ) ) WITH !_pre_! 'WPAbstract' +15 !_objSize_! +2 !_objName_! 'WPObject'
PARSE VALUE !_pre_! WITH . 'WPProgramRef' +19 !_findID_! +2
IF !_findID_! = '' THEN
PARSE VALUE !_pre_! WITH . 'WPShadow' +15 !_findID_! +2
IF !_findID_! <> '' THEN
DO
!_findID_! = C2RX( !_findID_! )
IF 0 < LENGTH( !_objSize_! ) THEN
!_PWH_!.findID.oName = LEFT( !_objName_!, C2X2D( !_objSize_! ) - 1 )
IF !_PWH_!.!_findID_!.isDir <> 1 THEN
DO
!_PWH_!.findID.fName = !_PWH_!.findID.oName
DO WHILE 0 < !_PWH_!.!_findID_!.fID
!_path_! = '\'||!_PWH_!.!_findID_!.fName||!_path_!
!_findID_! = !_PWH_!.!_findID_!.fID
END
!_path_! = !_PWH_!.!_findID_!.fName||!_path_!
!_PWH_!.findID.appPath = !_path_!
END
!_findID_! = !_PWH_!.findID.fID
END
ELSE IF !_PWH_!.!_findID_!.isDir <> 1 THEN
!_findID_! = !_PWH_!.findID.fID
ELSE
!_findID_! = findID
!_path_! = ''
DO WHILE 0 < !_PWH_!.!_findID_!.fID
!_path_! = '\'||!_PWH_!.!_findID_!.fName||!_path_!
!_findID_! = !_PWH_!.!_findID_!.fID
END
!_path_! = !_PWH_!.!_findID_!.fName||!_path_!
!_PWH_!.findID.fPath = !_path_!
!_path_! = !_path_!||'\'||!_PWH_!.findID.fName
!_findID_! = findID
DO WHILE 0 < !_PWH_!.!_findID_!.fID
PARSE VALUE REVERSE( !_path_! ) WITH !_name_!'\'!_path_!
!_name_! = REVERSE( !_name_! )
!_path_! = REVERSE( !_path_! )
IF SysGetEA( !_path_!||'\'||!_name_!, '.LONGNAME', 'EAValue' ) = 0 & EAValue <> '' THEN
DO
PARSE VAR EAValue EAType +2 EALength +2 EAValue
IF EAType = 'FDFF'x THEN
!_PWH_!.!_findID_!.oName = STRIP( EAValue, 'T', '00'x )
END
ELSE
!_PWH_!.!_findID_!.oName = !_name_!
!_findID_! = !_PWH_!.!_findID_!.fID
END
!_path_! = ''
!_findID_! = !_PWH_!.findID.fID
DO WHILE 0 < !_PWH_!.!_findID_!.fID
!_path_! = '\'||!_PWH_!.!_findID_!.oName||!_path_!
!_findID_! = !_PWH_!.!_findID_!.fID
END
!_path_! = !_PWH_!.!_findID_!.fName||!_path_!
RETURN !_path_!
XREV: PROCEDURE
!_hex_! = STRIP( ARG( 1 ) )
!_exp_! = ''
IF \DATATYPE( !_hex_!, 'X' ) THEN RETURN !_exp_!
DO i = 1 TO LENGTH( !_hex_! ) BY 4
!_exp_! = STRIP( TRANSLATE( '1234', RIGHT( '0000'||STRIP( SUBSTR( !_hex_!, i, 4 ) ), 4 ), '3412' ) )||!_exp_!
END
RETURN !_exp_!
C2R2X: PROCEDURE
chrs = ARG(1)
retval = ''
DO i = 1 TO LENGTH( chrs ) BY 2
retval = retval||'|'||C2RX( SUBSTR( chrs, i, 2 ) )
END
RETURN retval
C2RX: PROCEDURE
RETURN XREV( C2X( ARG(1) ) )
C2X2D: PROCEDURE
chrs = ARG(1)
retval = ''
DO i = 1 TO LENGTH( chrs ) BY 2
retval = retval||X2D( C2RX( SUBSTR( chrs, i, 2 ) ) )
END
RETURN retval