Files
MEDDFN/meddfnsrv.rpgle
T

999 lines
18 KiB
RPGLE

**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;