**free //======================================================================== // // Media Definition Parser // // // // // //========================================================================== ctl-opt option(*srcstmt:*nodebugio) nomain; /COPY './meddfn_h.rpgle' /COPY './meddfnap_h.rpgle' // /COPY GOSCH1/MEDDFN,MEDDFN_H // /COPY GOSCH1/MEDDFN,MEDDFNAP_H dcl-pr MD_ParseRetrieveBuffer; ReceiverBuffer char(32767) const options(*varsize); MediaDefinition likeds(MD_MediaDefinition_T); end-pr; //===================================================================== // // MD_ParseRetrieveBuffer // // Parses a retrieved TAPE0200 buffer. // // Currently supported: // - TAPE0200 header // - TAPE0200 device definitions // //===================================================================== dcl-proc MD_ParseRetrieveBuffer; dcl-pi *n; ReceiverBuffer char(32767) const options(*varsize); MediaDefinition likeds(MD_MediaDefinition_T); end-pi; dcl-ds Header likeds(MD_Tape0200Header_T); dcl-ds Device likeds(MD_Tape0200DeviceDefinition_T); dcl-ds MediaFile likeds(MD_Tape0200MediaFileDefinition_T); dcl-s MediaOffset int(10); dcl-s DeviceOffset int(10); dcl-s DeviceIndex 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; Device = %subst( ReceiverBuffer : DeviceOffset + 1 : %size(Device)); //------------------------------------------------------------ // Device -> Media Definition //------------------------------------------------------------ MediaDefinition.Device(DeviceIndex).DeviceName = Device.DeviceName; MediaDefinition.Device(DeviceIndex).NumberOfMediaFiles = Device.NumberOfMediaFileDefinitions; //--------------------------------------------------------------- // First Media File //--------------------------------------------------------------- if Device.NumberOfMediaFileDefinitions > 0; MediaOffset = Device.OffsetToFirstMediaFileDefinition; MediaFile = %subst( ReceiverBuffer : MediaOffset + 1 : %size(MediaFile)); //------------------------------------------------------------ // Media File -> Media Definition //------------------------------------------------------------ MediaDefinition.Device(DeviceIndex) .MediaFile(1) .SequenceNumber = MediaFile.SequenceNumber; MediaDefinition.Device(DeviceIndex) .MediaFile(1) .StartingPositionInFile = MediaFile.StartingPositionInFile; MediaDefinition.Device(DeviceIndex) .MediaFile(1) .NumberOfVolumeIdentifiers = MediaFile.NumberOfVolumeIdentifiers; endif; //------------------------------------------------------------ // Next device //------------------------------------------------------------ if Device.OffsetToNextDeviceDefinition > 0; DeviceOffset += Device.OffsetToNextDeviceDefinition; endif; endfor; end-proc; //===================================================================== // // MD_RetrieveMediaDefinition // // Retrieves a TAPE0200 media definition from IBM i. // //===================================================================== dcl-proc MD_RetrieveMediaDefinition export; dcl-pi *n; MediaDefinition likeds(MD_MediaDefinition_T); end-pi; dcl-ds QualifiedObject likeds(MD_QualifiedObjectName_T); dcl-ds Receiver likeds(MD_ApiReceiverBuffer_T); dcl-ds ApiError likeds(MD_APIError_T); dcl-s ReceiverLength int(10); //--------------------------------------------------------------- // Qualified media definition name //--------------------------------------------------------------- QualifiedObject.ObjectName = MediaDefinition.MediaDefinitionName; QualifiedObject.LibraryName = MediaDefinition.LibraryName; //--------------------------------------------------------------- // Initialize receiver buffer and error structure //--------------------------------------------------------------- clear Receiver; clear ApiError; ApiError.BytesProvided = %size(ApiError); ReceiverLength = %size(Receiver.Data); //--------------------------------------------------------------- // Retrieve TAPE0200 definition //--------------------------------------------------------------- QSRRTVMD( QualifiedObject : Receiver.Data : ReceiverLength : 'TAPE0200' : ApiError); //--------------------------------------------------------------- // Check API error //--------------------------------------------------------------- if ApiError.BytesAvailable > 0; // zun�chst nur Fehler zur�ckgeben/anzeigen endif; // MD_CheckApiError(ApiError); end-proc;