**FREE //===================================================================== // // Program.......: MEDDFNSRV // // Description...: Media Definition Service Procedures // // Serviceprogramm erstellen mit : // CRTSRVPGM SRVPGM(GOSCH1/MEDDFNSRV) // MODULE(GOSCH1/MEDDFNSRV // GOSCH1/MEDDFNBLD) // EXPORT(*SRCFILE) // SRCFILE(GOSCH1/MEDDFN) // SRCMBR(MEDDFNSRVB) // TGTRLS(*CURRENT) // TEXT('MEDDFN Service Program') // //===================================================================== ctl-opt option(*srcstmt:*nodebugio) nomain; //===================================================================== // // Includes // //===================================================================== /COPY './meddfn_h.rpgle' /COPY './meddfnap_h.rpgle' // /copy GOSCH1/MEDDFN,MEDDFN_H // /copy GOSCH1/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;