From aa5b1a8e3c1f52c3e15decff488a9bd42e06c82d Mon Sep 17 00:00:00 2001 From: Eckhard Gosch Date: Fri, 14 Aug 2026 17:10:38 +0200 Subject: [PATCH] Initial import of MEDDFN --- meddfn/meddfn_h.rpgle | 216 +++++++++ meddfn/meddfnap_h.rpgle | 583 +++++++++++++++++++++++ meddfn/meddfnbld.rpgle | 625 +++++++++++++++++++++++++ meddfn/meddfnprs.rpgle | 95 ++++ meddfn/meddfnsrv.rpgle | 998 ++++++++++++++++++++++++++++++++++++++++ meddfn/meddfntstp.rpgle | 218 +++++++++ 6 files changed, 2735 insertions(+) create mode 100644 meddfn/meddfn_h.rpgle create mode 100644 meddfn/meddfnap_h.rpgle create mode 100644 meddfn/meddfnbld.rpgle create mode 100644 meddfn/meddfnprs.rpgle create mode 100644 meddfn/meddfnsrv.rpgle create mode 100644 meddfn/meddfntstp.rpgle diff --git a/meddfn/meddfn_h.rpgle b/meddfn/meddfn_h.rpgle new file mode 100644 index 0000000..4f481d5 --- /dev/null +++ b/meddfn/meddfn_h.rpgle @@ -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; + diff --git a/meddfn/meddfnap_h.rpgle b/meddfn/meddfnap_h.rpgle new file mode 100644 index 0000000..048727d --- /dev/null +++ b/meddfn/meddfnap_h.rpgle @@ -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. +// +//===================================================================== + + diff --git a/meddfn/meddfnbld.rpgle b/meddfn/meddfnbld.rpgle new file mode 100644 index 0000000..29aaf00 --- /dev/null +++ b/meddfn/meddfnbld.rpgle @@ -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; diff --git a/meddfn/meddfnprs.rpgle b/meddfn/meddfnprs.rpgle new file mode 100644 index 0000000..9ba742a --- /dev/null +++ b/meddfn/meddfnprs.rpgle @@ -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; diff --git a/meddfn/meddfnsrv.rpgle b/meddfn/meddfnsrv.rpgle new file mode 100644 index 0000000..38e91d4 --- /dev/null +++ b/meddfn/meddfnsrv.rpgle @@ -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; + + diff --git a/meddfn/meddfntstp.rpgle b/meddfn/meddfntstp.rpgle new file mode 100644 index 0000000..4d5cfa1 --- /dev/null +++ b/meddfn/meddfntstp.rpgle @@ -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;