From 20126106158a7e1ce570195ce91841b3511b5504 Mon Sep 17 00:00:00 2001 From: Eckhard Gosch Date: Sat, 22 Aug 2026 16:25:16 +0200 Subject: [PATCH] erstes Mediafiel im Parser --- meddfnprs.rpgle | 475 +++++++++++++++++++++++++----------------------- 1 file changed, 246 insertions(+), 229 deletions(-) diff --git a/meddfnprs.rpgle b/meddfnprs.rpgle index 6901147..48214bb 100644 --- a/meddfnprs.rpgle +++ b/meddfnprs.rpgle @@ -1,229 +1,246 @@ -**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-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; - - - //------------------------------------------------------------ - // 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; +**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; \ No newline at end of file