386 lines
9.2 KiB
RPGLE
386 lines
9.2 KiB
RPGLE
**FREE
|
|
|
|
//=====================================================================
|
|
//
|
|
// Media Definition Parser
|
|
//
|
|
// Parses TAPE0200 data returned by QSRRTVMD.
|
|
//
|
|
//=====================================================================
|
|
|
|
ctl-opt
|
|
option(*srcstmt:*nodebugio) nomain;
|
|
|
|
|
|
/COPY './meddfn_h.rpgle'
|
|
/COPY './meddfnap_h.rpgle'
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// Prototype
|
|
//
|
|
//=====================================================================
|
|
|
|
dcl-pr MD_ParseRetrieveBuffer;
|
|
|
|
ReceiverBuffer
|
|
char(32767) const
|
|
options(*varsize);
|
|
|
|
MediaDefinition
|
|
likeds(MD_MediaDefinition_T);
|
|
|
|
end-pr;
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// 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;
|
|
|
|
ReceiverBuffer
|
|
char(32767) const
|
|
options(*varsize);
|
|
|
|
MediaDefinition
|
|
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; |