Parser um Medifules erweitert

This commit is contained in:
2026-09-08 15:52:25 +02:00
parent 01f654e63c
commit 5b0fdcc403
+301 -161
View File
@@ -1,246 +1,386 @@
**free **FREE
//========================================================================
//=====================================================================
// //
// Media Definition Parser // Media Definition Parser
// //
// Parses TAPE0200 data returned by QSRRTVMD.
// //
// //=====================================================================
//
//
//==========================================================================
ctl-opt ctl-opt
option(*srcstmt:*nodebugio) nomain; option(*srcstmt:*nodebugio) nomain;
/COPY './meddfn_h.rpgle' /COPY './meddfn_h.rpgle'
/COPY './meddfnap_h.rpgle' /COPY './meddfnap_h.rpgle'
// /COPY GOSCH1/MEDDFN,MEDDFN_H
// /COPY GOSCH1/MEDDFN,MEDDFNAP_H //=====================================================================
//
// Prototype
//
//=====================================================================
dcl-pr MD_ParseRetrieveBuffer; dcl-pr MD_ParseRetrieveBuffer;
ReceiverBuffer ReceiverBuffer
char(32767) const char(32767) const
options(*varsize); options(*varsize);
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
end-pr; end-pr;
//=====================================================================
// //=====================================================================
// MD_ParseRetrieveBuffer //
// // MD_ParseRetrieveBuffer
// Parses a retrieved TAPE0200 buffer. //
// // Parses a retrieved TAPE0200 buffer.
// Currently supported: //
// - TAPE0200 header // Supported:
// - TAPE0200 device definitions //
// // - TAPE0200 Header
//===================================================================== // - Device Definitions
// - Media File Definitions
// - Volume Identifier Arrays
//
//=====================================================================
dcl-proc MD_ParseRetrieveBuffer; dcl-proc MD_ParseRetrieveBuffer;
dcl-pi *n; dcl-pi *n;
ReceiverBuffer
char(32767) const
options(*varsize);
MediaDefinition
likeds(MD_MediaDefinition_T);
end-pi;
MediaDefinition //==================================================================
likeds(MD_MediaDefinition_T); // TAPE0200 structures
end-pi; //==================================================================
dcl-ds Header ReceiverBuffer dcl-ds Header
char(32767) const likeds(MD_Tape0200Header_T);
options(*varsize);
likeds(MD_Tape0200Header_T); dcl-ds Device
likeds(MD_Tape0200DeviceDefinition_T);
dcl-ds Device dcl-ds MediaFile
likeds(MD_Tape0200DeviceDefinition_T); likeds(MD_Tape0200MediaFileDefinition_T);
dcl-ds MediaFile
likeds(MD_Tape0200MediaFileDefinition_T);
dcl-s MediaOffset int(10); //==================================================================
// Working variables
//==================================================================
dcl-s DeviceOffset int(10); dcl-s DeviceOffset
dcl-s DeviceIndex int(10); int(10);
//--------------------------------------------------------------- dcl-s MediaOffset
// Initialize result int(10);
//---------------------------------------------------------------
clear MediaDefinition; dcl-s VolumeOffset
int(10);
//--------------------------------------------------------------- dcl-s DeviceIndex
// TAPE0200 Header int(10);
//---------------------------------------------------------------
Header = dcl-s MediaIndex
%subst( int(10);
ReceiverBuffer :
1 :
%size(Header));
//--------------------------------------------------------------- dcl-s VolumeIndex
// Header -> Media Definition int(10);
//---------------------------------------------------------------
MediaDefinition.MaximumParallelResources =
Header.MaximumParallelDeviceResources;
MediaDefinition.MinimumParallelResources = //==================================================================
Header.MinimumParallelDeviceResources; // Initialize result
//==================================================================
MediaDefinition.NumberOfDevices = clear MediaDefinition;
Header.NumberOfDeviceDefinitions;
MediaDefinition.DeviceAllocation =
Header.DeviceAllocation;
MediaDefinition.SaveFormat = //==================================================================
Header.SaveFormat; // TAPE0200 Header
//==================================================================
//--------------------------------------------------------------- Header =
// Device Definitions %subst(
//--------------------------------------------------------------- ReceiverBuffer :
1 :
%size(Header));
DeviceOffset =
Header.OffsetToFirstDeviceDefinition;
for DeviceIndex = 1 //==================================================================
to Header.NumberOfDeviceDefinitions; // 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 = Device =
%subst( %subst(
ReceiverBuffer : ReceiverBuffer :
DeviceOffset + 1 : DeviceOffset + 1 :
%size(Device)); %size(Device));
//------------------------------------------------------------
// Device -> Media Definition //---------------------------------------------------------------
//------------------------------------------------------------ // Device -> Media Definition
//---------------------------------------------------------------
MediaDefinition.Device(DeviceIndex).DeviceName = MediaDefinition.Device(DeviceIndex).DeviceName =
Device.DeviceName; Device.DeviceName;
MediaDefinition.Device(DeviceIndex).NumberOfMediaFiles = MediaDefinition.Device(DeviceIndex).NumberOfMediaFiles =
Device.NumberOfMediaFileDefinitions; Device.NumberOfMediaFileDefinitions;
//---------------------------------------------------------------
// First Media File //---------------------------------------------------------------
//--------------------------------------------------------------- // Media Files
//---------------------------------------------------------------
if Device.NumberOfMediaFileDefinitions > 0; if Device.NumberOfMediaFileDefinitions > 0;
MediaOffset = // OffsetToFirstMediaFileDefinition is relative
Device.OffsetToFirstMediaFileDefinition; // to the Device Definition.
MediaFile = MediaOffset =
%subst( DeviceOffset
ReceiverBuffer : + Device.OffsetToFirstMediaFileDefinition;
MediaOffset + 1 :
%size(MediaFile));
//------------------------------------------------------------
// Media File -> Media Definition
//------------------------------------------------------------
MediaDefinition.Device(DeviceIndex) for MediaIndex = 1
.MediaFile(1) to Device.NumberOfMediaFileDefinitions;
.SequenceNumber =
MediaFile.SequenceNumber;
MediaDefinition.Device(DeviceIndex)
.MediaFile(1)
.StartingPositionInFile =
MediaFile.StartingPositionInFile;
MediaDefinition.Device(DeviceIndex) //----------------------------------------------------------
.MediaFile(1) // Read Media File Definition
.NumberOfVolumeIdentifiers = //----------------------------------------------------------
MediaFile.NumberOfVolumeIdentifiers;
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; endif;
//------------------------------------------------------------
// Next device //================================================================
//------------------------------------------------------------ // Next Device
//================================================================
if Device.OffsetToNextDeviceDefinition > 0; if Device.OffsetToNextDeviceDefinition > 0;
DeviceOffset += DeviceOffset +=
Device.OffsetToNextDeviceDefinition; Device.OffsetToNextDeviceDefinition;
endif; endif;
endfor;
end-proc;
//=====================================================================
//
// MD_RetrieveMediaDefinition
//
// Retrieves a TAPE0200 media definition from IBM i.
//
//=====================================================================
dcl-proc MD_RetrieveMediaDefinition export; endfor;
dcl-pi *n;
end-proc;
//=====================================================================
//
// MD_RetrieveMediaDefinition
//
// Retrieves a TAPE0200 media definition from IBM i.
//
//=====================================================================
dcl-proc MD_RetrieveMediaDefinition export;
dcl-pi *n;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
end-pi;
dcl-ds QualifiedObject end-pi;
likeds(MD_QualifiedObjectName_T);
dcl-ds Receiver
likeds(MD_ApiReceiverBuffer_T);
dcl-ds ApiError dcl-ds QualifiedObject
likeds(MD_APIError_T); likeds(MD_QualifiedObjectName_T);
dcl-s ReceiverLength int(10); dcl-ds Receiver
likeds(MD_ApiReceiverBuffer_T);
//--------------------------------------------------------------- dcl-ds ApiError
// Qualified media definition name likeds(MD_APIError_T);
//---------------------------------------------------------------
QualifiedObject.ObjectName = dcl-s ReceiverLength
MediaDefinition.MediaDefinitionName; int(10);
QualifiedObject.LibraryName =
MediaDefinition.LibraryName;
//--------------------------------------------------------------- //==================================================================
// Initialize receiver buffer and error structure // Qualified media definition name
//--------------------------------------------------------------- //==================================================================
clear Receiver; QualifiedObject.ObjectName =
clear ApiError; MediaDefinition.MediaDefinitionName;
ApiError.BytesProvided = QualifiedObject.LibraryName =
%size(ApiError); MediaDefinition.LibraryName;
ReceiverLength = %size(Receiver.Data);
//---------------------------------------------------------------
// Retrieve TAPE0200 definition
//---------------------------------------------------------------
QSRRTVMD( //==================================================================
QualifiedObject : // Initialize receiver buffer and error structure
Receiver.Data : //==================================================================
ReceiverLength :
'TAPE0200' :
ApiError);
//--------------------------------------------------------------- clear Receiver;
// Check API error clear ApiError;
//---------------------------------------------------------------
if ApiError.BytesAvailable > 0; ApiError.BytesProvided =
%size(ApiError);
// zun�chst nur Fehler zur�ckgeben/anzeigen ReceiverLength =
endif; %size(Receiver.Data);
// MD_CheckApiError(ApiError);
end-proc; //==================================================================
// 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;