Initial import of MEDDFN

This commit is contained in:
2026-08-14 17:10:38 +02:00
commit aa5b1a8e3c
6 changed files with 2735 additions and 0 deletions
+216
View File
@@ -0,0 +1,216 @@
**FREE
//=====================================================================
//
// Project.....: MEDDFN
//
// Member......: MEDDFN_H
//
// Description.: Common project definitions.
//
// This member contains project wide definitions that are
// independent from IBM APIs.
//
// IBM API prototypes and API structures are located in
// MEDDFNAPI_H.
//
// Author......: Eckhard Gosch
//
//=====================================================================
//=====================================================================
// Project Information
//=====================================================================
dcl-s MD_ProjectName varchar(16) inz('MEDDFN') const;
dcl-s MD_Version varchar(10) inz('1.0.0') const;
//=====================================================================
// Project Limits
//=====================================================================
dcl-s MD_MaxDeviceDefinitions int(10) inz(32) const;
dcl-s MD_MaxMediaDefinitions int(10) inz(32) const;
dcl-s MD_MaxVolumeIdentifiers int(10) inz(75) const;
//=====================================================================
// Public Authority
//=====================================================================
dcl-s MD_PublicUse char(10) inz('*USE') const;
dcl-s MD_PublicChange char(10) inz('*CHANGE') const;
dcl-s MD_PublicAll char(10) inz('*ALL') const;
dcl-s MD_PublicExclude char(10) inz('*EXCLUDE') const;
dcl-s MD_PublicLibCrtAut char(10) inz('*LIBCRTAUT') const;
//=====================================================================
// Device Allocation
//=====================================================================
dcl-s MD_DeviceAllocateAll int(10) inz(0) const;
dcl-s MD_DeviceAllocateOne int(10) inz(1) const;
dcl-s MD_DeviceAllocateMinimum int(10) inz(2) const;
//=====================================================================
// Save Format
//=====================================================================
dcl-s MD_SaveFormatAuto int(10) inz(-2) const;
dcl-s MD_SaveFormatSerial int(10) inz(-1) const;
dcl-s MD_SaveFormatParallel int(10) inz(0) const;
dcl-s MD_VOLUME_ID_LENGTH int(5) inz(6) const;
//=====================================================================
// Volume Identifier
//=====================================================================
dcl-ds MD_VolumeIdentifier_T qualified template;
VolumeIdentifier char(6);
end-ds;
//=====================================================================
// Media File Definition
//=====================================================================
// dcl-ds MD_MediaFileDefinition_T qualified template;
//
// SequenceNumber int(10);
//
// StartingPosition char(32);
//
// VolumeIdentifierCount int(10);
//
// end-ds;
//=====================================================================
// Device Definition
//=====================================================================
//dcl-ds MD_DeviceDefinition_T qualified template;
//
// DeviceName char(10);
//
// MediaDefinitionCount int(10);
//
//end-ds;
//=====================================================================
//
// Builder Context
//
// Used internally by MEDDFNBLD.
//
//=====================================================================
dcl-ds MD_BuilderContext_T qualified template;
Buffer char(32767);
BufferLength int(10);
end-ds;
//=====================================================================
//
// Device Definition
//
//=====================================================================
dcl-ds MD_Device_T qualified template;
DeviceName char(10);
end-ds;
//=====================================================================
//
// Media File Definition
//
// One media file belongs to exactly one tape device.
//
//=====================================================================
dcl-ds MD_MediaFile_T qualified template;
SequenceNumber int(10);
StartingPositionInFile char(32);
NumberOfVolumeIdentifiers int(10);
VolumeIdentifier likeds(MD_VolumeIdentifier_T)
dim(75);
end-ds;
//=====================================================================
//
// Media Device
//
// One device contains one or more media files.
//
//=====================================================================
dcl-ds MD_MediaDevice_T qualified template;
DeviceName char(10);
NumberOfMediaFiles int(10);
MediaFile likeds(MD_MediaFile_T)
dim(32);
end-ds;
//=====================================================================
//
// Media Definition
//
// Business object.
//
//=====================================================================
dcl-ds MD_MediaDefinition_T qualified template;
MediaDefinitionName char(10);
LibraryName char(10);
TextDescription char(50);
Replace ind;
DeviceAllocation int(10);
SaveFormat int(10);
MaximumParallelResources int(10);
MinimumParallelResources int(10);
NumberOfDevices int(10);
Device likeds(MD_MediaDevice_T)
dim(32);
end-ds;
+583
View File
@@ -0,0 +1,583 @@
**FREE
//=====================================================================
//
// Project.....: MEDDFN
//
// Member......: MEDDFNAPI_H
//
// Description.: IBM API definitions.
//
// This member contains ONLY IBM API related definitions.
//
// Included:
//
// - IBM API Prototypes
// - IBM API Data Structures
// - API Error Code
// - Qualified Object Name
// - TAPE0100 Structures
// - TAPE0200 Structures
//
// No business logic is implemented in this member.
//
// IBM Release.: IBM i V7R5
//
//=====================================================================
//=====================================================================
//
// 2.0 IBM API Error Code Structure
//
// IBM Standard Error Code
//
//=====================================================================
dcl-ds MD_APIError_T qualified template;
BytesProvided int(10);
BytesAvailable int(10);
MessageID char(7);
Reserved char(1);
MessageData char(128);
end-ds;
//=====================================================================
//
// 3.0 Qualified Object Name
//
//=====================================================================
dcl-ds MD_QualifiedObjectName_T qualified template;
ObjectName char(10);
LibraryName char(10);
end-ds;
//=====================================================================
//
// API Receiver Buffer
//
//=====================================================================
dcl-ds MD_ApiReceiverBuffer_T qualified template;
Data
char(32767);
end-ds;
//=====================================================================
//
// Message Constants
//
//=====================================================================
dcl-s MD_MessageFile
char(20)
inz('MEDDFNMSG GOSCH')
const;
dcl-s MD_MessageTypeEscape
char(10)
inz('*ESCAPE')
const;
dcl-s MD_MessageTypeDiagnostic
char(10)
inz('*DIAG')
const;
//=====================================================================
//
// 4.0 IBM API Prototypes
//
//=====================================================================
//=====================================================================
//
// 4.1 Create Media Definition
//
// API........: QSRCRTMD
//
// Service Program : QSRLIB01
//
//=====================================================================
dcl-pr QSRCRTMD extpgm('QSRCRTMD');
QualifiedName likeds(MD_QualifiedObjectName_T) const;
InputData char(32767)
const
options(*varsize);
LengthOfData int(10) ;
FormatName char(8) const;
PublicAuthority char(10) const;
TextDescription char(50) const;
Replace char(1);
ErrorCode likeds(MD_APIError_T);
end-pr;
//=====================================================================
//
// 4.2 Retrieve Media Definition
//
// API........: QSRRTVMD
//
// Service Program : QSRLIB01
//
//=====================================================================
dcl-pr QSRRTVMD extpgm('QSRRTVMD');
QualifiedName likeds(MD_QualifiedObjectName_T) const;
ReceiverVariable char(32767)
options(*varsize);
LengthOfReceiverVariable int(10) ;
FormatName char(8) const;
ErrorCode likeds(MD_APIError_T);
end-pr;
//=====================================================================
//
// 4.3 Delete Media Definition
//
// API........: QSRDLTMD
//
// Service Program : QSRLIB01
//
//=====================================================================
dcl-pr QSRDLTMD extpgm('QSRDLTMD');
QualifiedName likeds(MD_QualifiedObjectName_T) const;
ErrorCode likeds(MD_APIError_T);
end-pr;
//=====================================================================
//
// Send Program Message
//
// API........: QMHSNDPM
//
//=====================================================================
dcl-pr QMHSNDPM extpgm('QMHSNDPM');
MessageId char(7) const;
QualifiedMessageFile char(20) const;
MessageData
char(32767)
options(*varsize);
MessageDataLength int(10);
MessageType char(10) const;
CallStackEntry char(10) const;
CallStackCounter int(10);
MessageKey char(4);
ErrorCode
likeds(MD_APIError_T);
end-pr;
//=====================================================================
//
// 5.1 TAPE0100 Header Structure
//
// IBM API......: QSRCRTMD / QSRRTVMD
//
// IBM Size.....: 24 Bytes
//
// Offset
//
// 0 Reserved
// 4 Reserved
// 8 Maximum Parallel Device Resources
// 12 Minimum Parallel Device Resources
// 16 Offset to First Device Definition
// 20 Number of Device Definitions
//
//=====================================================================
dcl-ds MD_Tape0100Header_T qualified template;
Reserved1 int(10);
Reserved2 int(10);
MaximumParallelDeviceResources int(10);
MinimumParallelDeviceResources int(10);
OffsetToFirstDeviceDefinition int(10);
NumberOfDeviceDefinitions int(10);
end-ds;
//=====================================================================
//
// 6.0 TAPE0200 Structures
//
//=====================================================================
//=====================================================================
//
// 6.1 TAPE0200 Header Structure
//
// IBM API......: QSRCRTMD / QSRRTVMD
//
// IBM Size.....: 36 Bytes
//
// Offset
//
// 0 Reserved
// 4 Reserved
// 8 Maximum Parallel Device Resources
// 12 Minimum Parallel Device Resources
// 16 Offset to First Device Definition
// 20 Number of Device Definitions
// 24 Length of Header
// 28 Device Allocation
// 32 Save Format
//
//=====================================================================
dcl-ds MD_Tape0200Header_T qualified template;
Reserved1 int(10);
Reserved2 int(10);
MaximumParallelDeviceResources int(10);
MinimumParallelDeviceResources int(10);
OffsetToFirstDeviceDefinition int(10);
NumberOfDeviceDefinitions int(10);
LengthOfHeader int(10);
DeviceAllocation int(10);
SaveFormat int(10);
end-ds;
//=====================================================================
//
// Expected IBM Structure Sizes
//
// %SIZE(MD_Tape0100Header_T) = 24
//
// %SIZE(MD_Tape0200Header_T) = 36
//
//=====================================================================
//=====================================================================
//
// 6.2 TAPE0100 Device Definition Structure
//
// IBM API......: QSRCRTMD / QSRRTVMD
//
// IBM Size.....: 24 Bytes
//
// Offset
//
// 0 Offset to Next Device Definition
// 4 Device Name
// 14 Reserved
// 16 Offset to First Media File Definition
// 20 Number of Media File Definitions
//
//=====================================================================
dcl-ds MD_Tape0100DeviceDefinition_T qualified template;
OffsetToNextDeviceDefinition int(10);
DeviceName char(10);
Reserved char(2);
OffsetToFirstMediaFileDefinition int(10);
NumberOfMediaFileDefinitions int(10);
end-ds;
//=====================================================================
//
// 6.3 TAPE0200 Device Definition Structure
//
// IBM API......: QSRCRTMD / QSRRTVMD
//
// IBM Size.....: 28 Bytes
//
// Offset
//
// 0 Offset to Next Device Definition
// 4 Device Name
// 14 Reserved
// 16 Offset to First Media File Definition
// 20 Number of Media File Definitions
// 24 Length of Device Definition
//
//=====================================================================
dcl-ds MD_Tape0200DeviceDefinition_T qualified template;
OffsetToNextDeviceDefinition int(10);
DeviceName char(10);
Reserved char(2);
OffsetToFirstMediaFileDefinition int(10);
NumberOfMediaFileDefinitions int(10);
LengthOfDeviceDefinition int(10);
end-ds;
//=====================================================================
//
// Expected IBM Structure Sizes
//
// %SIZE(MD_Tape0100DeviceDefinition_T) = 24
//
// %SIZE(MD_Tape0200DeviceDefinition_T) = 28
//
//=====================================================================
//=====================================================================
//
// Notes
//
// One device definition describes exactly one tape device.
//
// Each device contains one or more media file definitions.
//
// The OffsetToNextDeviceDefinition field is an absolute byte offset
// from the beginning of the complete API input buffer.
//
// OffsetToFirstMediaFileDefinition is relative to the beginning of the
// current device definition.
//
//=====================================================================
//=====================================================================
//
// 6.4 TAPE0100 Media File Definition Structure
//
// IBM API......: QSRCRTMD / QSRRTVMD
//
// IBM Size.....: 24 Bytes
//
// Offset
//
// 0 Offset to Next Media File Definition
// 4 Sequence Number
// 8 Offset to Volume Identifier Array
// 12 Number of Volume Identifiers
// 16 Length of Volume Identifier
// 20 Starting Volume Array Element
//
//=====================================================================
dcl-ds MD_Tape0100MediaFileDefinition_T qualified template;
OffsetToNextMediaFileDefinition int(10);
SequenceNumber int(10);
OffsetToVolumeIdentifierArray int(10);
NumberOfVolumeIdentifiers int(10);
LengthOfVolumeIdentifier int(10);
StartingVolumeArrayElement int(10);
end-ds;
//=====================================================================
//
// 6.5 TAPE0200 Media File Definition Structure
//
// IBM API......: QSRCRTMD / QSRRTVMD
//
// IBM Size.....: 60 Bytes
//
// Offset
//
// 0 Offset to Next Media File Definition
// 4 Sequence Number
// 8 Offset to Volume Identifier Array
// 12 Number of Volume Identifiers
// 16 Length of Volume Identifier
// 20 Starting Volume Array Element
// 24 Length of Media File Definition
// 28 Starting Position In File
//
//=====================================================================
dcl-ds MD_Tape0200MediaFileDefinition_T qualified template;
OffsetToNextMediaFileDefinition int(10);
SequenceNumber int(10);
OffsetToVolumeIdentifierArray int(10);
NumberOfVolumeIdentifiers int(10);
LengthOfVolumeIdentifier int(10);
StartingVolumeArrayElement int(10);
LengthOfMediaFileDefinition int(10);
StartingPositionInFile char(32);
end-ds;
//=====================================================================
//
// Expected IBM Structure Sizes
//
// %SIZE(MD_Tape0100MediaFileDefinition_T) = 24
//
// %SIZE(MD_Tape0200MediaFileDefinition_T) = 60
//
//=====================================================================
//=====================================================================
//
// Notes
//
// OffsetToNextMediaFileDefinition
//
// Absolute byte offset from the beginning of the complete API buffer.
//
// OffsetToVolumeIdentifierArray
//
// Absolute byte offset from the beginning of the complete API buffer.
//
// NumberOfVolumeIdentifiers
//
// 0 = Use currently mounted volume.
//
// >0 = Volume identifiers follow immediately after this structure.
//
// LengthOfVolumeIdentifier
//
// IBM currently supports 0..6 bytes.
//
// StartingPositionInFile
//
// 32 hexadecimal characters.
//
// Default:
//
// 00000000000000000000000000000000
//
//=====================================================================
//=====================================================================
//
// MEDDFNAPI_H completed.
//
// This member intentionally contains:
//
//  IBM API prototypes
//  IBM API data structures
//  IBM object definitions
//
// This member intentionally does NOT contain:
//
//  Business logic
//  Builder logic
//  Validation
//  Helper procedures
//  Message handling
//
// All implementation belongs to MEDDFNSRV.
//
//=====================================================================
+625
View File
@@ -0,0 +1,625 @@
**FREE
//=====================================================================
//
// Project......: MEDDFN
//
// Member.......: MEDDFNBLD
//
// Description..: Media Definition Buffer Builder
//
// Builds IBM API request buffers.
//
// IBM Release..: IBM i V7R5
//
//=====================================================================
//---------------------------------------------------------------
// IMPORTANT:
//
// All offsets in the TAPE0200 create buffer are ABSOLUTE offsets
// from the beginning of the API input buffer.
//
// This includes:
//
// OffsetToFirstDeviceDefinition
// OffsetToNextDeviceDefinition
// OffsetToFirstMediaFileDefinition
// OffsetToNextMediaFileDefinition
// OffsetToVolumeIdentifierArray
//
// Verified against IBM QSRCRTMD on IBM i 7.5.
//
//---------------------------------------------------------------
ctl-opt
option(*srcstmt:*nodebugio) nomain ;
/COPY GOSCH/MEDDFN,MEDDFN_H
/COPY GOSCH/MEDDFN,MEDDFNAP_H
//=====================================================================
// Internal Prototypes
//=====================================================================
dcl-pr MD_InitializeBuilder;
BuilderContext likeds(MD_BuilderContext_T);
end-pr;
dcl-pr MD_AppendStructure;
BuilderContext likeds(MD_BuilderContext_T);
Data char(32767) const options(*varsize);
DataLength int(10) const;
end-pr;
dcl-pr MD_AppendBytes;
BuilderContext likeds(MD_BuilderContext_T);
Data char(32767) const options(*varsize);
DataLength int(10) const;
end-pr;
dcl-pr MD_BuildTape0200Device;
BuilderContext likeds(MD_BuilderContext_T);
MediaDevice likeds(MD_MediaDevice_T) const;
IsLastDevice ind const;
end-pr;
//=====================================================================
// Volume Builder
//=====================================================================
dcl-pr MD_BuildTape0200VolumeArray;
BuilderContext likeds(MD_BuilderContext_T);
MediaFile likeds(MD_MediaFile_T) const;
end-pr;
//=====================================================================
// Media Builder
//=====================================================================
dcl-pr MD_BuildTape0200Media;
BuilderContext likeds(MD_BuilderContext_T);
MediaDevice likeds(MD_MediaDevice_T) const;
MediaIndex int(10) const;
end-pr;
//=====================================================================
// Header Builder
//=====================================================================
dcl-pr MD_BuildTape0200Header;
BuilderContext likeds(MD_BuilderContext_T);
MediaDefinition likeds(MD_MediaDefinition_T) const;
end-pr;
//=====================================================================
// Exported Procedures
//=====================================================================
//=====================================================================
//
// MD_BuildCreateBuffer
//
// Description:
// Builds a complete TAPE0200 create buffer.
//
//=====================================================================
dcl-proc MD_BuildCreateBuffer export;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
MediaDefinition likeds(MD_MediaDefinition_T) const;
end-pi;
dcl-s DeviceIndex int(10);
MD_InitializeBuilder(BuilderContext);
MD_BuildTape0200Header(
BuilderContext :
MediaDefinition);
for DeviceIndex = 1 to MediaDefinition.NumberOfDevices;
MD_BuildTape0200Device(
BuilderContext :
MediaDefinition.Device(DeviceIndex) :
DeviceIndex = MediaDefinition.NumberOfDevices);
endfor;
end-proc;
//=====================================================================
// Internal Procedures
//=====================================================================
//=====================================================================
//
// MD_InitializeBuilder
//
//=====================================================================
dcl-proc MD_InitializeBuilder;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
end-pi;
clear BuilderContext;
BuilderContext.BufferLength = 0;
end-proc;
//=====================================================================
//
// MD_AppendStructure
//
//=====================================================================
dcl-proc MD_AppendStructure;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
Data char(32767) const options(*varsize);
DataLength int(10) const;
end-pi;
%subst(
BuilderContext.Buffer :
BuilderContext.BufferLength + 1 :
DataLength) = %subst(Data : 1 : DataLength);
BuilderContext.BufferLength += DataLength;
end-proc;
//=====================================================================
//
// MD_AppendBytes
//
//=====================================================================
dcl-proc MD_AppendBytes;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
Data char(32767) const options(*varsize);
DataLength int(10) const;
end-pi;
%subst(
BuilderContext.Buffer :
BuilderContext.BufferLength + 1 :
DataLength) = %subst(Data : 1 : DataLength);
BuilderContext.BufferLength += DataLength;
end-proc;
//=====================================================================
//
// MD_BuildTape0200Header
//
// Builds the TAPE0200 header.
//
//=====================================================================
dcl-proc MD_BuildTape0200Header;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
MediaDefinition likeds(MD_MediaDefinition_T) const;
end-pi;
dcl-ds Header0200
likeds(MD_Tape0200Header_T)
inz;
Header0200.Reserved1 = 0;
Header0200.Reserved2 = 0;
Header0200.MaximumParallelDeviceResources =
MediaDefinition.MaximumParallelResources;
Header0200.MinimumParallelDeviceResources =
MediaDefinition.MinimumParallelResources;
Header0200.OffsetToFirstDeviceDefinition =
%size(MD_Tape0200Header_T);
Header0200.NumberOfDeviceDefinitions =
MediaDefinition.NumberOfDevices;
Header0200.LengthOfHeader =
%size(MD_Tape0200Header_T);
Header0200.DeviceAllocation =
MediaDefinition.DeviceAllocation;
Header0200.SaveFormat =
MediaDefinition.SaveFormat;
MD_AppendStructure(
BuilderContext :
Header0200 :
%size(Header0200));
end-proc;
//=====================================================================
//
// MD_BuildTape0200Device
//
// Description:
// Builds one TAPE0200 Device Definition and appends it to the
// builder buffer.
//
//=====================================================================
dcl-proc MD_BuildTape0200Device;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
MediaDevice likeds(MD_MediaDevice_T) const;
IsLastDevice ind const;
end-pi;
dcl-ds Device0200
likeds(MD_Tape0200DeviceDefinition_T)
inz;
dcl-s MediaIndex int(10);
dcl-s NextDeviceOffset int(10);
//---------------------------------------------------------------
// Calculate offset to next device definition
//---------------------------------------------------------------
if IsLastDevice;
NextDeviceOffset = 0;
else;
NextDeviceOffset =
%size(MD_Tape0200DeviceDefinition_T);
for MediaIndex = 1
to MediaDevice.NumberOfMediaFiles;
NextDeviceOffset +=
%size(MD_Tape0200MediaFileDefinition_T);
NextDeviceOffset +=
MD_AlignLength(
MediaDevice.MediaFile(MediaIndex)
.NumberOfVolumeIdentifiers
* MD_VOLUME_ID_LENGTH);
endfor;
endif;
//---------------------------------------------------------------
// Device structure
//---------------------------------------------------------------
// Device0200.OffsetToNextDeviceDefinition =
// NextDeviceOffset;
Device0200.OffsetToNextDeviceDefinition =
BuilderContext.BufferLength + NextDeviceOffset;
Device0200.DeviceName =
MediaDevice.DeviceName;
Device0200.Reserved = x'0000';
Device0200.OffsetToFirstMediaFileDefinition =
BuilderContext.BufferLength
+ %size(MD_Tape0200DeviceDefinition_T);
Device0200.NumberOfMediaFileDefinitions =
MediaDevice.NumberOfMediaFiles;
Device0200.LengthOfDeviceDefinition =
%size(MD_Tape0200DeviceDefinition_T);
//---------------------------------------------------------------
// Append device structure
//---------------------------------------------------------------
MD_AppendStructure(
BuilderContext :
Device0200 :
%size(Device0200));
//---------------------------------------------------------------
// Append all media definitions
//---------------------------------------------------------------
for MediaIndex = 1
to MediaDevice.NumberOfMediaFiles;
MD_BuildTape0200Media(
BuilderContext :
MediaDevice :
MediaIndex);
MD_BuildTape0200VolumeArray(
BuilderContext :
MediaDevice.MediaFile(MediaIndex));
endfor;
end-proc;
//=====================================================================
//
// MD_BuildTape0200Media
//
// Description:
// Builds one TAPE0200 Media Definition and appends it to the
// builder buffer.
//
//=====================================================================
dcl-proc MD_BuildTape0200Media;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
MediaDevice likeds(MD_MediaDevice_T) const;
MediaIndex int(10) const;
end-pi;
dcl-ds Media0200
likeds(MD_Tape0200MediaFileDefinition_T)
inz;
dcl-ds MediaFile likeds(MD_MediaFile_T) inz;
MediaFile = MediaDevice.MediaFile(MediaIndex);
//---------------------------------------------------------------
// Sequence Number
//---------------------------------------------------------------
Media0200.SequenceNumber =
MediaFile.SequenceNumber;
//---------------------------------------------------------------
// Starting Position in File
//---------------------------------------------------------------
Media0200.StartingPositionInFile = *ALL'0';
// TODO:
// StartingPositionInFile is currently initialized to *ALL'0'.
// The business object does not yet expose all valid API options.
//---------------------------------------------------------------
// Volume Information
//---------------------------------------------------------------
Media0200.NumberOfVolumeIdentifiers =
MediaFile.NumberOfVolumeIdentifiers;
if MediaFile.NumberOfVolumeIdentifiers > 0;
Media0200.OffsetToVolumeIdentifierArray =
BuilderContext.BufferLength
+ %size(MD_Tape0200MediaFileDefinition_T);
Media0200.LengthOfVolumeIdentifier =
MD_VOLUME_ID_LENGTH;
Media0200.StartingVolumeArrayElement = 1;
else;
Media0200.OffsetToVolumeIdentifierArray =
0;
Media0200.LengthOfVolumeIdentifier =
0;
Media0200.StartingVolumeArrayElement =
0;
endif;
//---------------------------------------------------------------
// Structure Length
//---------------------------------------------------------------
Media0200.LengthOfMediaFileDefinition =
%size(MD_Tape0200MediaFileDefinition_T);
if MediaIndex < MediaDevice.NumberOfMediaFiles;
Media0200.OffsetToNextMediaFileDefinition =
BuilderContext.BufferLength
+ %size(MD_Tape0200MediaFileDefinition_T)
+ (MD_AlignLength(
MediaFile.NumberOfVolumeIdentifiers
* MD_VOLUME_ID_LENGTH));
else;
Media0200.OffsetToNextMediaFileDefinition = 0;
endif;
//---------------------------------------------------------------
// Append structure to builder buffer
//---------------------------------------------------------------
MD_AppendStructure(
BuilderContext :
Media0200 :
%size(Media0200));
end-proc;
//=====================================================================
//
// MD_BuildTape0200VolumeArray
//
// Description:
// Appends all Volume Identifiers to the builder buffer.
//
//=====================================================================
dcl-proc MD_BuildTape0200VolumeArray;
dcl-pi *n;
BuilderContext likeds(MD_BuilderContext_T);
MediaFile likeds(MD_MediaFile_T) const;
end-pi;
dcl-s VolumeIndex int(10);
dcl-s Padding int(10) inz(0);
dcl-s Pad char(4) inz(x'00000000');
dcl-s VolumeBytes int(10) inz(0);
for VolumeIndex = 1
to MediaFile.NumberOfVolumeIdentifiers;
MD_AppendBytes(
BuilderContext :
MediaFile.VolumeIdentifier(
VolumeIndex).VolumeIdentifier :
MD_VOLUME_ID_LENGTH
);
endfor;
VolumeBytes =
MediaFile.NumberOfVolumeIdentifiers
* MD_VOLUME_ID_LENGTH;
Padding =
MD_AlignLength(VolumeBytes)
- VolumeBytes;
if Padding > 0;
MD_AppendBytes(
BuilderContext :
Pad :
Padding);
endif;
end-proc;
dcl-proc MD_AlignLength;
dcl-pi *n int(10);
Length int(10) const;
end-pi;
dcl-s Result int(10);
Result = Length;
if %rem(Result : 4) <> 0;
Result += 4 - %rem(Result : 4);
endif;
return Result;
end-proc;
+95
View File
@@ -0,0 +1,95 @@
**FREE
//========================================================================
//
// Media Definition Parser
//
//
//
//
//
//==========================================================================
ctl-opt
option(*srcstmt:*nodebugio) nomain ;
/COPY GOSCH/MEDDFN,MEDDFN_H
/COPY GOSCH/MEDDFN,MEDDFNAP_H
//=====================================================================
//
// 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;
+998
View File
@@ -0,0 +1,998 @@
**FREE
//=====================================================================
//
// Program.......: MEDDFNSRV
//
// Description...: Media Definition Service Procedures
//
// Serviceprogramm erstellen mit :
// CRTSRVPGM SRVPGM(GOSCH/MEDDFNSRV)
// MODULE(GOSCH/MEDDFNSRV
// GOSCH/MEDDFNBLD)
// EXPORT(*SRCFILE)
// SRCFILE(GOSCH/MEDDFN)
// SRCMBR(MEDDFNSRVB)
// TGTRLS(*CURRENT)
// TEXT('MEDDFN Service Program')
//
//=====================================================================
ctl-opt
option(*srcstmt:*nodebugio)
nomain;
//=====================================================================
//
// Includes
//
//=====================================================================
/copy GOSCH/MEDDFN,MEDDFN_H
/copy GOSCH/MEDDFN,MEDDFNAP_H
//=====================================================================
//
// Builder Prototype
//
//=====================================================================
dcl-pr MD_BuildCreateBuffer;
BuilderContext
likeds(MD_BuilderContext_T);
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
//=====================================================================
//
// Parser Prototype
//
//=====================================================================
dcl-pr MD_ParseRetrieveBuffer;
ReceiverBuffer
char(32767) const
options(*varsize);
MediaDefinition
likeds(MD_MediaDefinition_T);
end-pr;
//=====================================================================
//
// Export Prototypes
//
//=====================================================================
dcl-pr MD_CreateMediaDefinition ;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
dcl-pr MD_DeleteMediaDefinition ;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
dcl-pr MD_RetrieveMediaDefinition ;
MediaDefinition
likeds(MD_MediaDefinition_T);
end-pr;
//=====================================================================
//
// Internal Prototypes
//
//=====================================================================
dcl-pr MD_ValidateCreate;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
dcl-pr MD_ValidateDelete;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
dcl-pr MD_ValidateRetrieve;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
dcl-pr MD_CheckApiError;
ApiError
likeds(MD_APIError_T) const;
end-pr;
dcl-pr MD_SendMessage;
MessageId
char(7) const;
MessageType
char(10) const;
MessageData
char(32767) const
options(*varsize);
end-pr;
dcl-pr MD_SendEscape;
MessageId
char(7) const;
MessageData
char(32767) const
options(*varsize);
end-pr;
dcl-pr MD_SendDiagnostic;
MessageId
char(7) const;
MessageData
char(32767) const
options(*varsize);
end-pr;
dcl-pr MD_CheckDuplicateDevices;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
dcl-pr MD_CheckDuplicateSequences;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pr;
//=====================================================================
//
// MD_CreateMediaDefinition
//
//=====================================================================
dcl-proc MD_CreateMediaDefinition export;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pi;
dcl-ds BuilderContext
likeds(MD_BuilderContext_T);
dcl-ds QualifiedObject
likeds(MD_QualifiedObjectName_T);
dcl-ds ApiError
likeds(MD_APIError_T);
dcl-s ReplaceExisting char(1);
dcl-s ApiInputLength int(10);
//--------------------------------------------------------------
// Validate
//--------------------------------------------------------------
MD_ValidateCreate(MediaDefinition);
//--------------------------------------------------------------
// Build API Buffer
//--------------------------------------------------------------
MD_BuildCreateBuffer(
BuilderContext :
MediaDefinition);
//--------------------------------------------------------------
// Qualified Object
//--------------------------------------------------------------
QualifiedObject.ObjectName =
MediaDefinition.MediaDefinitionName;
QualifiedObject.LibraryName =
MediaDefinition.LibraryName;
//--------------------------------------------------------------
// Replace Existing
//--------------------------------------------------------------
if MediaDefinition.Replace;
ReplaceExisting = '1';
else;
ReplaceExisting = '0';
endif;
//--------------------------------------------------------------
// Error Structure
//--------------------------------------------------------------
clear ApiError;
ApiError.BytesProvided =
%size(ApiError);
//--------------------------------------------------------------
// IBM API
//--------------------------------------------------------------
ApiInputLength = BuilderContext.BufferLength;
QSRCRTMD(
QualifiedObject :
BuilderContext.Buffer :
ApiInputLength :
'TAPE0200' :
MD_PublicUse :
MediaDefinition.TextDescription :
ReplaceExisting :
ApiError);
// dump(a);
MD_CheckApiError(ApiError);
end-proc;
//=====================================================================
//
// MD_DeleteMediaDefinition
//
//=====================================================================
dcl-proc MD_DeleteMediaDefinition export;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pi;
dcl-ds QualifiedObject
likeds(MD_QualifiedObjectName_T);
dcl-ds ApiError
likeds(MD_APIError_T);
MD_ValidateDelete(MediaDefinition);
QualifiedObject.ObjectName =
MediaDefinition.MediaDefinitionName;
QualifiedObject.LibraryName =
MediaDefinition.LibraryName;
clear ApiError;
ApiError.BytesProvided =
%size(ApiError);
QSRDLTMD(
QualifiedObject :
ApiError);
MD_CheckApiError(ApiError);
end-proc;
//=====================================================================
//
// MD_RetrieveMediaDefinition
//
//=====================================================================
dcl-proc MD_RetrieveMediaDefinition export;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T);
end-pi;
dcl-ds QualifiedObject
likeds(MD_QualifiedObjectName_T);
dcl-ds ApiError
likeds(MD_APIError_T);
dcl-ds Receiver
likeds(MD_ApiReceiverBuffer_T);
dcl-s ApiReceiverLength int(10);
MD_ValidateRetrieve(MediaDefinition);
QualifiedObject.ObjectName =
MediaDefinition.MediaDefinitionName;
QualifiedObject.LibraryName =
MediaDefinition.LibraryName;
clear ApiError;
ApiError.BytesProvided =
%size(ApiError);
ApiReceiverLength = %size(Receiver);
QSRRTVMD(
QualifiedObject :
Receiver :
ApiReceiverLength :
'TAPE0200' :
ApiError);
MD_CheckApiError(ApiError);
// TODO:
// Parser folgt mit MEDDFNPRS
// MD_ParseRetrieveBuffer(
// Receiver.Data :
// MediaDefinition);
end-proc;
//=====================================================================
//
// MD_ValidateCreate
//
//=====================================================================
dcl-proc MD_ValidateCreate;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pi;
dcl-s DeviceIndex int(10);
dcl-s MediaFileIndex int(10);
dcl-s VolumeIndex int(10);
//--------------------------------------------------------------
// Media Definition Name
//--------------------------------------------------------------
if %trim(MediaDefinition.MediaDefinitionName) = '';
MD_SendEscape(
'MDF0001' :
*blanks);
endif;
//--------------------------------------------------------------
// Library
//--------------------------------------------------------------
if %trim(MediaDefinition.LibraryName) = '';
MD_SendEscape(
'MDF0002' :
*blanks);
endif;
//--------------------------------------------------------------
// Number of Devices
//--------------------------------------------------------------
if MediaDefinition.NumberOfDevices < 1
or MediaDefinition.NumberOfDevices >
MD_MaxDeviceDefinitions;
MD_SendEscape(
'MDF0003' :
*blanks);
endif;
//--------------------------------------------------------------
// Device Allocation
//--------------------------------------------------------------
select;
when MediaDefinition.DeviceAllocation =
MD_DeviceAllocateAll;
when MediaDefinition.DeviceAllocation =
MD_DeviceAllocateOne;
when MediaDefinition.DeviceAllocation =
MD_DeviceAllocateMinimum;
other;
MD_SendEscape(
'MDF0004' :
*blanks);
endsl;
//--------------------------------------------------------------
// Save Format
//--------------------------------------------------------------
select;
when MediaDefinition.SaveFormat =
MD_SaveFormatAuto;
when MediaDefinition.SaveFormat =
MD_SaveFormatSerial;
when MediaDefinition.SaveFormat =
MD_SaveFormatParallel;
other;
MD_SendEscape(
'MDF0005' :
*blanks);
endsl;
//--------------------------------------------------------------
// Parallel Resources
//--------------------------------------------------------------
if MediaDefinition.MaximumParallelResources < 0;
MD_SendEscape(
'MDF0012' :
*blanks);
endif;
if MediaDefinition.MinimumParallelResources < 0;
MD_SendEscape(
'MDF0013' :
*blanks);
endif;
if MediaDefinition.MinimumParallelResources >
MediaDefinition.MaximumParallelResources;
MD_SendEscape(
'MDF0014' :
*blanks);
endif;
//--------------------------------------------------------------
// Devices
//--------------------------------------------------------------
for DeviceIndex = 1
to MediaDefinition.NumberOfDevices;
if %trim(
MediaDefinition.Device(DeviceIndex).DeviceName) = '';
MD_SendEscape(
'MDF0006' :
*blanks);
endif;
if MediaDefinition.Device(DeviceIndex)
.NumberOfMediaFiles < 1;
MD_SendEscape(
'MDF0017' :
MediaDefinition.Device(DeviceIndex).DeviceName);
endif;
//-----------------------------------------------------------
// Media Files
//-----------------------------------------------------------
for MediaFileIndex = 1
to MediaDefinition.Device(DeviceIndex)
.NumberOfMediaFiles;
if MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex)
.SequenceNumber <= 0;
MD_SendEscape(
'MDF0009' :
*blanks);
endif;
if MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex)
.NumberOfVolumeIdentifiers < 0
or MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex)
.NumberOfVolumeIdentifiers >
MD_MaxVolumeIdentifiers;
MD_SendEscape(
'MDF0010' :
*blanks);
endif;
//--------------------------------------------------------
// Volume IDs
//--------------------------------------------------------
for VolumeIndex = 1
to MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex)
.NumberOfVolumeIdentifiers;
if %trim(
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex)
.VolumeIdentifier(VolumeIndex)
.VolumeIdentifier) = '';
MD_SendEscape(
'MDF0011' :
*blanks);
endif;
endfor;
endfor;
endfor;
//--------------------------------------------------------------
// Duplicate Checks
//--------------------------------------------------------------
MD_CheckDuplicateDevices(MediaDefinition);
MD_CheckDuplicateSequences(MediaDefinition);
end-proc;
//=====================================================================
//
// MD_ValidateDelete
//
//=====================================================================
dcl-proc MD_ValidateDelete;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pi;
if %trim(MediaDefinition.MediaDefinitionName) = '';
MD_SendEscape(
'MDF0001' :
*blanks);
endif;
if %trim(MediaDefinition.LibraryName) = '';
MD_SendEscape(
'MDF0002' :
*blanks);
endif;
end-proc;
//=====================================================================
//
// MD_ValidateRetrieve
//
//=====================================================================
dcl-proc MD_ValidateRetrieve;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pi;
if %trim(MediaDefinition.MediaDefinitionName) = '';
MD_SendEscape(
'MDF0001' :
*blanks);
endif;
if %trim(MediaDefinition.LibraryName) = '';
MD_SendEscape(
'MDF0002' :
*blanks);
endif;
end-proc;
//=====================================================================
//
// MD_CheckApiError
//
// Checks the standard IBM API error code structure.
//
//=====================================================================
dcl-proc MD_CheckApiError;
dcl-pi *n;
ApiError
likeds(MD_APIError_T) const;
end-pi;
//---------------------------------------------------------------
// No API error
//---------------------------------------------------------------
if ApiError.BytesAvailable = 0;
return;
endif;
//---------------------------------------------------------------
// Forward IBM message
//---------------------------------------------------------------
MD_SendEscape(
ApiError.MessageId :
'');
end-proc;
//=====================================================================
//
// MD_SendEscape
//
//=====================================================================
dcl-proc MD_SendEscape;
dcl-pi *n;
MessageId
char(7) const;
MessageData
char(32767) const
options(*varsize);
end-pi;
MD_SendMessage(
MessageId :
MD_MessageTypeEscape :
MessageData);
end-proc;
//=====================================================================
//
// MD_SendDiagnostic
//
//=====================================================================
dcl-proc MD_SendDiagnostic;
dcl-pi *n;
MessageId
char(7) const;
MessageData
char(32767) const
options(*varsize);
end-pi;
MD_SendMessage(
MessageId :
MD_MessageTypeDiagnostic :
MessageData);
end-proc;
//=====================================================================
//
// MD_SendMessage
//
//=====================================================================
dcl-proc MD_SendMessage;
dcl-pi *n;
MessageId
char(7) const;
MessageType
char(10) const;
MessageData
char(32767) const
options(*varsize);
end-pi;
dcl-s MessageKey char(4);
dcl-s CallStackEntry char(10) inz('*');
dcl-s CallStackCounter int(10) inz(0);
dcl-s MessageDataLength int(10);
dcl-s ApiMessageData char(32767);
dcl-ds ApiError likeds(MD_APIError_T);
clear ApiError;
ApiError.BytesProvided = %size(ApiError);
MessageDataLength = %len(MessageData);
ApiMessageData = MessageData;
QMHSNDPM(
MessageId :
MD_MessageFile :
ApiMessageData :
MessageDataLength :
MessageType :
CallStackEntry :
CallStackCounter :
MessageKey :
ApiError);
// Keine weitere Fehlerbehandlung hier.
// MD_SendMessage ist die unterste Schicht der Message-Infrastruktur.
end-proc;
//=====================================================================
//
// MD_CheckDuplicateDevices
//
//=====================================================================
dcl-proc MD_CheckDuplicateDevices;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pi;
dcl-s DeviceIndex1 int(10);
dcl-s DeviceIndex2 int(10);
for DeviceIndex1 = 1
to MediaDefinition.NumberOfDevices - 1;
for DeviceIndex2 = DeviceIndex1 + 1
to MediaDefinition.NumberOfDevices;
if %trim(
MediaDefinition.Device(DeviceIndex1).DeviceName)
=
%trim(
MediaDefinition.Device(DeviceIndex2).DeviceName);
MD_SendEscape(
'MDF0007' :
MediaDefinition.Device(DeviceIndex1).DeviceName);
endif;
endfor;
endfor;
end-proc;
//=====================================================================
//
// MD_CheckDuplicateSequences
//
//=====================================================================
dcl-proc MD_CheckDuplicateSequences;
dcl-pi *n;
MediaDefinition
likeds(MD_MediaDefinition_T) const;
end-pi;
dcl-s DeviceIndex int(10);
dcl-s MediaFileIndex1 int(10);
dcl-s MediaFileIndex2 int(10);
for DeviceIndex = 1
to MediaDefinition.NumberOfDevices;
for MediaFileIndex1 = 1
to MediaDefinition.Device(DeviceIndex)
.NumberOfMediaFiles - 1;
for MediaFileIndex2 = MediaFileIndex1 + 1
to MediaDefinition.Device(DeviceIndex)
.NumberOfMediaFiles;
if MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex1)
.SequenceNumber
=
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex2)
.SequenceNumber;
MD_SendEscape(
'MDF0019' :
%char(
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaFileIndex1)
.SequenceNumber));
endif;
endfor;
endfor;
endfor;
end-proc;
+218
View File
@@ -0,0 +1,218 @@
**FREE
//=====================================================================
//
// Program......: MEDDFNTSTP
//
// Description..: MEDDFN Builder Test Program
// Erstellen mit :
// CRTPGM PGM(GOSCH/MEDDFNTSTP)
// MODULE(GOSCH/MEDDFNTSTP)
// BNDSRVPGM(GOSCH/MEDDFNSRV)
// ACTGRP(*NEW)
// TGTRLS(*CURRENT)
//
//
//
//
//=====================================================================
ctl-opt
// dftactgrp(*no)
// actgrp(*new)
option(*srcstmt:*nodebugio);
/copy GOSCH/MEDDFN,MEDDFN_H
/copy GOSCH/MEDDFN,MEDDFNPR
dcl-ds MediaDefinition
likeds(MD_MediaDefinition_T);
dcl-pr BuildTestDefinition;
end-pr;
BuildTestDefinition();
monitor;
MD_DeleteMediaDefinition(
MediaDefinition);
on-error;
endmon;
MD_CreateMediaDefinition(
MediaDefinition);
*inlr = *on;
return;
//=====================================================================
//
// BuildTestDefinition
//
// Builds a simple test media definition:
//
// 1 Device
// 1 Media File
// VOL001
// VOL002
//
//=====================================================================
dcl-proc BuildTestDefinition;
dcl-pi *n;
end-pi;
clear MediaDefinition;
//---------------------------------------------------------------
// General
//---------------------------------------------------------------
MediaDefinition.MediaDefinitionName = 'TEST0200X';
MediaDefinition.LibraryName = 'GOSCH';
MediaDefinition.TextDescription = 'Test MEDDFN';
MediaDefinition.MaximumParallelResources = 2;
MediaDefinition.MinimumParallelResources = 2;
MediaDefinition.DeviceAllocation = MD_DeviceAllocateAll;
MediaDefinition.SaveFormat = MD_SaveFormatParallel;
MediaDefinition.NumberOfDevices = 2;
//---------------------------------------------------------------
// Device 1 / Resource 1
//---------------------------------------------------------------
MediaDefinition.Device(1).DeviceName = 'TAPMLBBRMS';
MediaDefinition.Device(1).NumberOfMediaFiles = 1;
MediaDefinition.Device(1)
.MediaFile(1)
.SequenceNumber = 0;
MediaDefinition.Device(1)
.MediaFile(1)
.StartingPositionInFile = *ALL'0';
MediaDefinition.Device(1)
.MediaFile(1)
.NumberOfVolumeIdentifiers = 1;
MediaDefinition.Device(1)
.MediaFile(1)
.VolumeIdentifier(1)
.VolumeIdentifier = 'DAK066';
//---------------------------------------------------------------
// Device 2 / Resource 2
//---------------------------------------------------------------
MediaDefinition.Device(2).DeviceName = 'TAPMLBBRMS';
MediaDefinition.Device(2).NumberOfMediaFiles = 1;
MediaDefinition.Device(2)
.MediaFile(1)
.SequenceNumber = 0;
MediaDefinition.Device(2)
.MediaFile(1)
.StartingPositionInFile = *ALL'0';
MediaDefinition.Device(2)
.MediaFile(1)
.NumberOfVolumeIdentifiers = 1;
MediaDefinition.Device(2)
.MediaFile(1)
.VolumeIdentifier(1)
.VolumeIdentifier = 'DAK079';
end-proc;
//=====================================================================
//
// BuildTestDefinition
//
//=====================================================================
dcl-proc BuildTestDefinitionOld;
dcl-pi *n;
end-pi;
clear MediaDefinition;
//--------------------------------------------------------------
// Media Definition
//--------------------------------------------------------------
MediaDefinition.MediaDefinitionName = 'TEST0200';
MediaDefinition.LibraryName = 'QTEMP';
MediaDefinition.TextDescription = 'MEDDFN Test';
MediaDefinition.Replace = *on;
MediaDefinition.DeviceAllocation = MD_DeviceAllocateAll;
MediaDefinition.SaveFormat = MD_SaveFormatParallel;
MediaDefinition.MaximumParallelResources = 1;
MediaDefinition.MinimumParallelResources = 1;
//--------------------------------------------------------------
// Device
//--------------------------------------------------------------
MediaDefinition.NumberOfDevices = 1;
MediaDefinition.Device(1).DeviceName =
'TAPMLBBRMS';
MediaDefinition.Device(1).NumberOfMediaFiles = 1;
//--------------------------------------------------------------
// Media File
//--------------------------------------------------------------
MediaDefinition.Device(1)
.MediaFile(1)
.SequenceNumber = 0;
MediaDefinition.Device(1)
.MediaFile(1)
.StartingPositionInFile = *ALLX'00';
// .StartingPositionInFile = '*FIRST';
MediaDefinition.Device(1)
.MediaFile(1)
.NumberOfVolumeIdentifiers = 0;
//--------------------------------------------------------------
// Volume IDs
//--------------------------------------------------------------
// MediaDefinition.Device(1)
// .MediaFile(1)
// .VolumeIdentifier(1)
// .VolumeIdentifier = 'VOL001';
// MediaDefinition.Device(1)
// .MediaFile(1)
// .VolumeIdentifier(2)
// .VolumeIdentifier = 'VOL002';
end-proc;