Parser um Medifules erweitert

This commit is contained in:
2026-09-08 15:52:25 +02:00
parent 01f654e63c
commit 5b0fdcc403
+192 -52
View File
@@ -1,22 +1,26 @@
**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;
@@ -26,17 +30,22 @@ dcl-pr MD_ParseRetrieveBuffer;
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: // Supported:
// - TAPE0200 header //
// - TAPE0200 device definitions // - TAPE0200 Header
// - Device Definitions
// - Media File Definitions
// - Volume Identifier Arrays
// //
//===================================================================== //=====================================================================
@@ -44,15 +53,21 @@ dcl-proc MD_ParseRetrieveBuffer;
dcl-pi *n; dcl-pi *n;
ReceiverBuffer
MediaDefinition
likeds(MD_MediaDefinition_T);
end-pi;
dcl-ds Header ReceiverBuffer
char(32767) const char(32767) const
options(*varsize); options(*varsize);
MediaDefinition
likeds(MD_MediaDefinition_T);
end-pi;
//==================================================================
// TAPE0200 structures
//==================================================================
dcl-ds Header
likeds(MD_Tape0200Header_T); likeds(MD_Tape0200Header_T);
dcl-ds Device dcl-ds Device
@@ -61,20 +76,40 @@ dcl-proc MD_ParseRetrieveBuffer;
dcl-ds MediaFile dcl-ds MediaFile
likeds(MD_Tape0200MediaFileDefinition_T); likeds(MD_Tape0200MediaFileDefinition_T);
dcl-s MediaOffset int(10);
dcl-s DeviceOffset int(10); //==================================================================
dcl-s DeviceIndex int(10); // 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 // Initialize result
//--------------------------------------------------------------- //==================================================================
clear MediaDefinition; clear MediaDefinition;
//---------------------------------------------------------------
//==================================================================
// TAPE0200 Header // TAPE0200 Header
//--------------------------------------------------------------- //==================================================================
Header = Header =
%subst( %subst(
@@ -82,9 +117,10 @@ dcl-proc MD_ParseRetrieveBuffer;
1 : 1 :
%size(Header)); %size(Header));
//---------------------------------------------------------------
//==================================================================
// Header -> Media Definition // Header -> Media Definition
//--------------------------------------------------------------- //==================================================================
MediaDefinition.MaximumParallelResources = MediaDefinition.MaximumParallelResources =
Header.MaximumParallelDeviceResources; Header.MaximumParallelDeviceResources;
@@ -101,25 +137,33 @@ dcl-proc MD_ParseRetrieveBuffer;
MediaDefinition.SaveFormat = MediaDefinition.SaveFormat =
Header.SaveFormat; Header.SaveFormat;
//---------------------------------------------------------------
//==================================================================
// Device Definitions // Device Definitions
//--------------------------------------------------------------- //==================================================================
DeviceOffset = DeviceOffset =
Header.OffsetToFirstDeviceDefinition; Header.OffsetToFirstDeviceDefinition;
for DeviceIndex = 1 for DeviceIndex = 1
to Header.NumberOfDeviceDefinitions; 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;
@@ -127,14 +171,28 @@ dcl-proc MD_ParseRetrieveBuffer;
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;
// OffsetToFirstMediaFileDefinition is relative
// to the Device Definition.
MediaOffset = MediaOffset =
Device.OffsetToFirstMediaFileDefinition; DeviceOffset
+ Device.OffsetToFirstMediaFileDefinition;
for MediaIndex = 1
to Device.NumberOfMediaFileDefinitions;
//----------------------------------------------------------
// Read Media File Definition
//----------------------------------------------------------
MediaFile = MediaFile =
%subst( %subst(
@@ -142,38 +200,101 @@ dcl-proc MD_ParseRetrieveBuffer;
MediaOffset + 1 : MediaOffset + 1 :
%size(MediaFile)); %size(MediaFile));
//------------------------------------------------------------
//----------------------------------------------------------
// Media File -> Media Definition // Media File -> Media Definition
//------------------------------------------------------------ //----------------------------------------------------------
MediaDefinition.Device(DeviceIndex) MediaDefinition.Device(DeviceIndex)
.MediaFile(1) .MediaFile(MediaIndex)
.SequenceNumber = .SequenceNumber =
MediaFile.SequenceNumber; MediaFile.SequenceNumber;
MediaDefinition.Device(DeviceIndex) MediaDefinition.Device(DeviceIndex)
.MediaFile(1) .MediaFile(MediaIndex)
.StartingPositionInFile = .StartingPositionInFile =
MediaFile.StartingPositionInFile; MediaFile.StartingPositionInFile;
MediaDefinition.Device(DeviceIndex) MediaDefinition.Device(DeviceIndex)
.MediaFile(1) .MediaFile(MediaIndex)
.NumberOfVolumeIdentifiers = .NumberOfVolumeIdentifiers =
MediaFile.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; endif;
//------------------------------------------------------------
// Next device //----------------------------------------------------------
//------------------------------------------------------------ // Next Media File
//----------------------------------------------------------
if MediaIndex
< Device.NumberOfMediaFileDefinitions;
if MediaFile.OffsetToNextMediaFileDefinition > 0;
MediaOffset =
MediaFile.OffsetToNextMediaFileDefinition;
endif;
endif;
endfor;
endif;
//================================================================
// Next Device
//================================================================
if Device.OffsetToNextDeviceDefinition > 0; if Device.OffsetToNextDeviceDefinition > 0;
DeviceOffset += DeviceOffset +=
Device.OffsetToNextDeviceDefinition; Device.OffsetToNextDeviceDefinition;
endif; endif;
endfor; endfor;
end-proc; end-proc;
//===================================================================== //=====================================================================
// //
// MD_RetrieveMediaDefinition // MD_RetrieveMediaDefinition
@@ -188,8 +309,10 @@ dcl-proc MD_ParseRetrieveBuffer;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
end-pi; end-pi;
dcl-ds QualifiedObject dcl-ds QualifiedObject
likeds(MD_QualifiedObjectName_T); likeds(MD_QualifiedObjectName_T);
@@ -199,11 +322,13 @@ dcl-proc MD_ParseRetrieveBuffer;
dcl-ds ApiError dcl-ds ApiError
likeds(MD_APIError_T); likeds(MD_APIError_T);
dcl-s ReceiverLength int(10); dcl-s ReceiverLength
int(10);
//---------------------------------------------------------------
//==================================================================
// Qualified media definition name // Qualified media definition name
//--------------------------------------------------------------- //==================================================================
QualifiedObject.ObjectName = QualifiedObject.ObjectName =
MediaDefinition.MediaDefinitionName; MediaDefinition.MediaDefinitionName;
@@ -211,9 +336,10 @@ dcl-proc MD_ParseRetrieveBuffer;
QualifiedObject.LibraryName = QualifiedObject.LibraryName =
MediaDefinition.LibraryName; MediaDefinition.LibraryName;
//---------------------------------------------------------------
//==================================================================
// Initialize receiver buffer and error structure // Initialize receiver buffer and error structure
//--------------------------------------------------------------- //==================================================================
clear Receiver; clear Receiver;
clear ApiError; clear ApiError;
@@ -221,10 +347,13 @@ dcl-proc MD_ParseRetrieveBuffer;
ApiError.BytesProvided = ApiError.BytesProvided =
%size(ApiError); %size(ApiError);
ReceiverLength = %size(Receiver.Data); ReceiverLength =
//--------------------------------------------------------------- %size(Receiver.Data);
//==================================================================
// Retrieve TAPE0200 definition // Retrieve TAPE0200 definition
//--------------------------------------------------------------- //==================================================================
QSRRTVMD( QSRRTVMD(
QualifiedObject : QualifiedObject :
@@ -233,14 +362,25 @@ dcl-proc MD_ParseRetrieveBuffer;
'TAPE0200' : 'TAPE0200' :
ApiError); ApiError);
//---------------------------------------------------------------
//==================================================================
// Check API error // Check API error
//--------------------------------------------------------------- //==================================================================
if ApiError.BytesAvailable > 0; if ApiError.BytesAvailable > 0;
// zun�chst nur Fehler zur�ckgeben/anzeigen // API error handling will be completed separately.
endif; endif;
// MD_CheckApiError(ApiError);
//==================================================================
// Parse retrieved buffer
//==================================================================
MD_ParseRetrieveBuffer(
Receiver.Data :
MediaDefinition);
end-proc; end-proc;