Initial import of MEDDFN
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
//
|
||||
//=====================================================================
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user