**FREE //===================================================================== // // Media Definition Parser // // Parses TAPE0200 data returned by QSRRTVMD. // //===================================================================== ctl-opt option(*srcstmt:*nodebugio) nomain; /COPY './meddfn_h.rpgle' /COPY './meddfnap_h.rpgle' //===================================================================== // // Prototype // //===================================================================== dcl-pr MD_ParseRetrieveBuffer; ReceiverBuffer char(32767) const options(*varsize); MediaDefinition likeds(MD_MediaDefinition_T); end-pr; //===================================================================== // // MD_ParseRetrieveBuffer // // Parses a retrieved TAPE0200 buffer. // // Supported: // // - TAPE0200 Header // - Device Definitions // - Media File Definitions // - Volume Identifier Arrays // //===================================================================== dcl-proc MD_ParseRetrieveBuffer export; dcl-pi *n; ReceiverBuffer char(32767) const options(*varsize); MediaDefinition likeds(MD_MediaDefinition_T); end-pi; //================================================================== // TAPE0200 structures //================================================================== dcl-ds Header likeds(MD_Tape0200Header_T); dcl-ds Device likeds(MD_Tape0200DeviceDefinition_T); dcl-ds MediaFile likeds(MD_Tape0200MediaFileDefinition_T); //================================================================== // Working variables //================================================================== dcl-s DeviceOffset int(10); dcl-s MediaOffset int(10); dcl-s VolumeOffset int(10); dcl-s DeviceIndex int(10); dcl-s MediaIndex int(10); dcl-s VolumeIndex int(10); //================================================================== // Initialize result //================================================================== clear MediaDefinition; //================================================================== // TAPE0200 Header //================================================================== Header = %subst( ReceiverBuffer : 1 : %size(Header)); //================================================================== // Header -> Media Definition //================================================================== MediaDefinition.MaximumParallelResources = Header.MaximumParallelDeviceResources; MediaDefinition.MinimumParallelResources = Header.MinimumParallelDeviceResources; MediaDefinition.NumberOfDevices = Header.NumberOfDeviceDefinitions; MediaDefinition.DeviceAllocation = Header.DeviceAllocation; MediaDefinition.SaveFormat = Header.SaveFormat; //================================================================== // Device Definitions //================================================================== DeviceOffset = Header.OffsetToFirstDeviceDefinition; for DeviceIndex = 1 to Header.NumberOfDeviceDefinitions; //--------------------------------------------------------------- // Read Device Definition //--------------------------------------------------------------- Device = %subst( ReceiverBuffer : DeviceOffset + 1 : %size(Device)); //--------------------------------------------------------------- // Device -> Media Definition //--------------------------------------------------------------- MediaDefinition.Device(DeviceIndex).DeviceName = Device.DeviceName; MediaDefinition.Device(DeviceIndex).NumberOfMediaFiles = Device.NumberOfMediaFileDefinitions; //--------------------------------------------------------------- // Media Files //--------------------------------------------------------------- if Device.NumberOfMediaFileDefinitions > 0; // OffsetToFirstMediaFileDefinition is relative // to the Device Definition. MediaOffset = DeviceOffset + Device.OffsetToFirstMediaFileDefinition; for MediaIndex = 1 to Device.NumberOfMediaFileDefinitions; //---------------------------------------------------------- // Read Media File Definition //---------------------------------------------------------- MediaFile = %subst( ReceiverBuffer : MediaOffset + 1 : %size(MediaFile)); //---------------------------------------------------------- // Media File -> Media Definition //---------------------------------------------------------- MediaDefinition.Device(DeviceIndex) .MediaFile(MediaIndex) .SequenceNumber = MediaFile.SequenceNumber; MediaDefinition.Device(DeviceIndex) .MediaFile(MediaIndex) .StartingPositionInFile = MediaFile.StartingPositionInFile; MediaDefinition.Device(DeviceIndex) .MediaFile(MediaIndex) .NumberOfVolumeIdentifiers = MediaFile.NumberOfVolumeIdentifiers; //---------------------------------------------------------- // Volume Identifier Array //---------------------------------------------------------- if MediaFile.NumberOfVolumeIdentifiers > 0; VolumeOffset = MediaFile.OffsetToVolumeIdentifierArray; for VolumeIndex = 1 to MediaFile.NumberOfVolumeIdentifiers; MediaDefinition.Device(DeviceIndex) .MediaFile(MediaIndex) .VolumeIdentifier(VolumeIndex) .VolumeIdentifier = %subst( ReceiverBuffer : VolumeOffset + ((VolumeIndex - 1) * MediaFile.LengthOfVolumeIdentifier) + 1 : MediaFile.LengthOfVolumeIdentifier); endfor; endif; //---------------------------------------------------------- // Next Media File //---------------------------------------------------------- if MediaIndex < Device.NumberOfMediaFileDefinitions; if MediaFile.OffsetToNextMediaFileDefinition > 0; MediaOffset = MediaFile.OffsetToNextMediaFileDefinition; endif; endif; endfor; endif; //================================================================ // Next Device //================================================================ if Device.OffsetToNextDeviceDefinition > 0; DeviceOffset = Device.OffsetToNextDeviceDefinition; endif; endfor; end-proc;