erstes Mediafiel im Parser

This commit is contained in:
2026-08-22 16:25:16 +02:00
parent f2ae46c427
commit 2012610615
+182 -165
View File
@@ -1,229 +1,246 @@
**FREE **free
//======================================================================== //========================================================================
// //
// Media Definition Parser // Media Definition Parser
// //
// //
// //
// //
// //
//========================================================================== //==========================================================================
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,MEDDFN_H
// /COPY GOSCH1/MEDDFN,MEDDFNAP_H // /COPY GOSCH1/MEDDFN,MEDDFNAP_H
dcl-pr MD_ParseRetrieveBuffer;
ReceiverBuffer
char(32767) const
options(*varsize);
dcl-pr MD_ParseRetrieveBuffer; MediaDefinition
likeds(MD_MediaDefinition_T);
end-pr;
ReceiverBuffer //=====================================================================
char(32767) const //
options(*varsize); // MD_ParseRetrieveBuffer
//
// Parses a retrieved TAPE0200 buffer.
//
// Currently supported:
// - TAPE0200 header
// - TAPE0200 device definitions
//
//=====================================================================
MediaDefinition dcl-proc MD_ParseRetrieveBuffer;
likeds(MD_MediaDefinition_T);
end-pr; dcl-pi *n;
//===================================================================== ReceiverBuffer
// char(32767) const
// MD_ParseRetrieveBuffer options(*varsize);
//
// Parses a retrieved TAPE0200 buffer.
//
// Currently supported:
// - TAPE0200 header
// - TAPE0200 device definitions
//
//=====================================================================
dcl-proc MD_ParseRetrieveBuffer; MediaDefinition
likeds(MD_MediaDefinition_T);
end-pi;
dcl-pi *n; dcl-ds Header
likeds(MD_Tape0200Header_T);
ReceiverBuffer dcl-ds Device
char(32767) const likeds(MD_Tape0200DeviceDefinition_T);
options(*varsize);
MediaDefinition dcl-ds MediaFile
likeds(MD_MediaDefinition_T); likeds(MD_Tape0200MediaFileDefinition_T);
end-pi; dcl-s MediaOffset int(10);
dcl-s DeviceOffset int(10);
dcl-s DeviceIndex int(10);
dcl-ds Header //---------------------------------------------------------------
likeds(MD_Tape0200Header_T); // Initialize result
//---------------------------------------------------------------
dcl-ds Device clear MediaDefinition;
likeds(MD_Tape0200DeviceDefinition_T);
dcl-s DeviceOffset int(10); //---------------------------------------------------------------
dcl-s DeviceIndex int(10); // TAPE0200 Header
//---------------------------------------------------------------
Header =
%subst(
ReceiverBuffer :
1 :
%size(Header));
//--------------------------------------------------------------- //---------------------------------------------------------------
// Initialize result // Header -> Media Definition
//--------------------------------------------------------------- //---------------------------------------------------------------
clear MediaDefinition; MediaDefinition.MaximumParallelResources =
Header.MaximumParallelDeviceResources;
MediaDefinition.MinimumParallelResources =
Header.MinimumParallelDeviceResources;
//--------------------------------------------------------------- MediaDefinition.NumberOfDevices =
// TAPE0200 Header Header.NumberOfDeviceDefinitions;
//---------------------------------------------------------------
Header = MediaDefinition.DeviceAllocation =
%subst( Header.DeviceAllocation;
ReceiverBuffer :
1 :
%size(Header));
MediaDefinition.SaveFormat =
Header.SaveFormat;
//--------------------------------------------------------------- //---------------------------------------------------------------
// Header -> Media Definition // Device Definitions
//--------------------------------------------------------------- //---------------------------------------------------------------
MediaDefinition.MaximumParallelResources = DeviceOffset =
Header.MaximumParallelDeviceResources; Header.OffsetToFirstDeviceDefinition;
MediaDefinition.MinimumParallelResources = for DeviceIndex = 1
Header.MinimumParallelDeviceResources; to Header.NumberOfDeviceDefinitions;
MediaDefinition.NumberOfDevices = Device =
Header.NumberOfDeviceDefinitions; %subst(
ReceiverBuffer :
DeviceOffset + 1 :
%size(Device));
MediaDefinition.DeviceAllocation = //------------------------------------------------------------
Header.DeviceAllocation; // Device -> Media Definition
//------------------------------------------------------------
MediaDefinition.SaveFormat = MediaDefinition.Device(DeviceIndex).DeviceName =
Header.SaveFormat; Device.DeviceName;
MediaDefinition.Device(DeviceIndex).NumberOfMediaFiles =
Device.NumberOfMediaFileDefinitions;
//--------------------------------------------------------------- //---------------------------------------------------------------
// Device Definitions // First Media File
//--------------------------------------------------------------- //---------------------------------------------------------------
DeviceOffset = if Device.NumberOfMediaFileDefinitions > 0;
Header.OffsetToFirstDeviceDefinition;
for DeviceIndex = 1 MediaOffset =
to Header.NumberOfDeviceDefinitions; Device.OffsetToFirstMediaFileDefinition;
Device = MediaFile =
%subst( %subst(
ReceiverBuffer : ReceiverBuffer :
DeviceOffset + 1 : MediaOffset + 1 :
%size(Device)); %size(MediaFile));
//------------------------------------------------------------
// Media File -> Media Definition
//------------------------------------------------------------
//------------------------------------------------------------ MediaDefinition.Device(DeviceIndex)
// Device -> Media Definition .MediaFile(1)
//------------------------------------------------------------ .SequenceNumber =
MediaFile.SequenceNumber;
MediaDefinition.Device(DeviceIndex).DeviceName = MediaDefinition.Device(DeviceIndex)
Device.DeviceName; .MediaFile(1)
.StartingPositionInFile =
MediaFile.StartingPositionInFile;
MediaDefinition.Device(DeviceIndex).NumberOfMediaFiles = MediaDefinition.Device(DeviceIndex)
Device.NumberOfMediaFileDefinitions; .MediaFile(1)
.NumberOfVolumeIdentifiers =
MediaFile.NumberOfVolumeIdentifiers;
endif;
//------------------------------------------------------------
// Next device
//------------------------------------------------------------
//------------------------------------------------------------ if Device.OffsetToNextDeviceDefinition > 0;
// Next device
//------------------------------------------------------------
if Device.OffsetToNextDeviceDefinition > 0; DeviceOffset +=
Device.OffsetToNextDeviceDefinition;
endif;
endfor;
end-proc;
DeviceOffset += //=====================================================================
Device.OffsetToNextDeviceDefinition; //
// MD_RetrieveMediaDefinition
//
// Retrieves a TAPE0200 media definition from IBM i.
//
//=====================================================================
endif; dcl-proc MD_RetrieveMediaDefinition export;
endfor; dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T);
end-pi;
end-proc; 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);
//
// MD_RetrieveMediaDefinition
//
// Retrieves a TAPE0200 media definition from IBM i.
//
//=====================================================================
dcl-proc MD_RetrieveMediaDefinition export; //---------------------------------------------------------------
// Qualified media definition name
//---------------------------------------------------------------
dcl-pi *n; QualifiedObject.ObjectName =
MediaDefinition.MediaDefinitionName;
MediaDefinition QualifiedObject.LibraryName =
likeds(MD_MediaDefinition_T); MediaDefinition.LibraryName;
end-pi; //---------------------------------------------------------------
// Initialize receiver buffer and error structure
//---------------------------------------------------------------
clear Receiver;
clear ApiError;
dcl-ds QualifiedObject ApiError.BytesProvided =
likeds(MD_QualifiedObjectName_T); %size(ApiError);
dcl-ds Receiver ReceiverLength = %size(Receiver.Data);
likeds(MD_ApiReceiverBuffer_T); //---------------------------------------------------------------
// Retrieve TAPE0200 definition
//---------------------------------------------------------------
dcl-ds ApiError QSRRTVMD(
likeds(MD_APIError_T); QualifiedObject :
Receiver.Data :
ReceiverLength :
'TAPE0200' :
ApiError);
dcl-s ReceiverLength int(10); //---------------------------------------------------------------
// Check API error
//---------------------------------------------------------------
//--------------------------------------------------------------- if ApiError.BytesAvailable > 0;
// Qualified media definition name
//---------------------------------------------------------------
QualifiedObject.ObjectName = // zunchst nur Fehler zurckgeben/anzeigen
MediaDefinition.MediaDefinitionName; endif;
QualifiedObject.LibraryName = // MD_CheckApiError(ApiError);
MediaDefinition.LibraryName; end-proc;
//---------------------------------------------------------------
// 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;
// zunchst nur Fehler zurckgeben/anzeigen
endif;
// MD_CheckApiError(ApiError);
end-proc;