diff --git a/meddfnprs.rpgle b/meddfnprs.rpgle index cbf5196..cad7d48 100644 --- a/meddfnprs.rpgle +++ b/meddfnprs.rpgle @@ -1,246 +1,386 @@ -**free -//======================================================================== +**FREE + +//===================================================================== // // Media Definition Parser // +// Parses TAPE0200 data returned by QSRRTVMD. // -// -// -// -//========================================================================== - +//===================================================================== + ctl-opt - option(*srcstmt:*nodebugio) nomain; - + option(*srcstmt:*nodebugio) nomain; + + /COPY './meddfn_h.rpgle' /COPY './meddfnap_h.rpgle' - -// /COPY GOSCH1/MEDDFN,MEDDFN_H -// /COPY GOSCH1/MEDDFN,MEDDFNAP_H - + + +//===================================================================== +// +// Prototype +// +//===================================================================== + dcl-pr MD_ParseRetrieveBuffer; - - ReceiverBuffer + + ReceiverBuffer char(32767) const options(*varsize); - - MediaDefinition - likeds(MD_MediaDefinition_T); + + MediaDefinition + likeds(MD_MediaDefinition_T); + end-pr; - - //===================================================================== - // - // MD_ParseRetrieveBuffer - // - // Parses a retrieved TAPE0200 buffer. - // - // Currently supported: - // - TAPE0200 header - // - TAPE0200 device definitions - // - //===================================================================== - + + +//===================================================================== +// +// MD_ParseRetrieveBuffer +// +// Parses a retrieved TAPE0200 buffer. +// +// Supported: +// +// - TAPE0200 Header +// - Device Definitions +// - Media File Definitions +// - Volume Identifier Arrays +// +//===================================================================== + dcl-proc MD_ParseRetrieveBuffer; - - dcl-pi *n; - - - MediaDefinition - likeds(MD_MediaDefinition_T); - end-pi; - - dcl-ds Header ReceiverBuffer - char(32767) const - options(*varsize); - - 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; - + + dcl-pi *n; + + ReceiverBuffer + char(32767) const + options(*varsize); + 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; \ No newline at end of file + 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; + + +//===================================================================== +// +// 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; + + // API error handling will be completed separately. + + endif; + + + //================================================================== + // Parse retrieved buffer + //================================================================== + + MD_ParseRetrieveBuffer( + Receiver.Data : + MediaDefinition); + + +end-proc; \ No newline at end of file