Neue testfälle für TAPE0200
This commit is contained in:
+309
-27
@@ -31,6 +31,9 @@ dcl-pr MD_ParseRetrieveBuffer;
|
|||||||
MediaDefinition
|
MediaDefinition
|
||||||
likeds(MD_MediaDefinition_T);
|
likeds(MD_MediaDefinition_T);
|
||||||
|
|
||||||
|
Error
|
||||||
|
likeds(MD_Error_T);
|
||||||
|
|
||||||
end-pr;
|
end-pr;
|
||||||
|
|
||||||
|
|
||||||
@@ -47,6 +50,8 @@ end-pr;
|
|||||||
// - Media File Definitions
|
// - Media File Definitions
|
||||||
// - Volume Identifier Arrays
|
// - Volume Identifier Arrays
|
||||||
//
|
//
|
||||||
|
// Parser errors are returned in Error.
|
||||||
|
//
|
||||||
//=====================================================================
|
//=====================================================================
|
||||||
|
|
||||||
dcl-proc MD_ParseRetrieveBuffer export;
|
dcl-proc MD_ParseRetrieveBuffer export;
|
||||||
@@ -60,6 +65,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
MediaDefinition
|
MediaDefinition
|
||||||
likeds(MD_MediaDefinition_T);
|
likeds(MD_MediaDefinition_T);
|
||||||
|
|
||||||
|
Error
|
||||||
|
likeds(MD_Error_T);
|
||||||
|
|
||||||
end-pi;
|
end-pi;
|
||||||
|
|
||||||
|
|
||||||
@@ -81,6 +89,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
// Working variables
|
// Working variables
|
||||||
//==================================================================
|
//==================================================================
|
||||||
|
|
||||||
|
dcl-s ReceiverLength
|
||||||
|
int(10);
|
||||||
|
|
||||||
dcl-s DeviceOffset
|
dcl-s DeviceOffset
|
||||||
int(10);
|
int(10);
|
||||||
|
|
||||||
@@ -99,12 +110,32 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
dcl-s VolumeIndex
|
dcl-s VolumeIndex
|
||||||
int(10);
|
int(10);
|
||||||
|
|
||||||
|
dcl-s RequiredLength
|
||||||
|
int(10);
|
||||||
|
|
||||||
|
|
||||||
//==================================================================
|
//==================================================================
|
||||||
// Initialize result
|
// Initialize
|
||||||
//==================================================================
|
//==================================================================
|
||||||
|
|
||||||
clear MediaDefinition;
|
clear MediaDefinition;
|
||||||
|
clear Error;
|
||||||
|
|
||||||
|
ReceiverLength = %len(ReceiverBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
//==================================================================
|
||||||
|
// Receiver buffer
|
||||||
|
//==================================================================
|
||||||
|
|
||||||
|
if ReceiverLength < %size(Header);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2005';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
//==================================================================
|
//==================================================================
|
||||||
@@ -118,6 +149,80 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
%size(Header));
|
%size(Header));
|
||||||
|
|
||||||
|
|
||||||
|
//==================================================================
|
||||||
|
// Validate Header
|
||||||
|
//==================================================================
|
||||||
|
|
||||||
|
if Header.LengthOfHeader <> %size(Header);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2001';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if Header.NumberOfDeviceDefinitions < 1
|
||||||
|
or Header.NumberOfDeviceDefinitions > MD_MaxDeviceDefinitions;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2001';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if Header.OffsetToFirstDeviceDefinition < %size(Header)
|
||||||
|
or Header.OffsetToFirstDeviceDefinition >
|
||||||
|
ReceiverLength - %size(Device);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2001';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if Header.DeviceAllocation <> MD_DeviceAllocateAll
|
||||||
|
and Header.DeviceAllocation <> MD_DeviceAllocateOne
|
||||||
|
and Header.DeviceAllocation <> MD_DeviceAllocateMinimum;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2001';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if Header.SaveFormat <> MD_SaveFormatAuto
|
||||||
|
and Header.SaveFormat <> MD_SaveFormatSerial
|
||||||
|
and Header.SaveFormat <> MD_SaveFormatParallel;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2001';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if Header.MaximumParallelDeviceResources < 0
|
||||||
|
or Header.MinimumParallelDeviceResources < 0
|
||||||
|
or Header.MinimumParallelDeviceResources >
|
||||||
|
Header.MaximumParallelDeviceResources;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2001';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
//==================================================================
|
//==================================================================
|
||||||
// Header -> Media Definition
|
// Header -> Media Definition
|
||||||
//==================================================================
|
//==================================================================
|
||||||
@@ -150,9 +255,24 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
to Header.NumberOfDeviceDefinitions;
|
to Header.NumberOfDeviceDefinitions;
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//===============================================================
|
||||||
|
// Validate Device Offset
|
||||||
|
//===============================================================
|
||||||
|
|
||||||
|
if DeviceOffset < 0
|
||||||
|
or DeviceOffset > ReceiverLength - %size(Device);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2002';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
//===============================================================
|
||||||
// Read Device Definition
|
// Read Device Definition
|
||||||
//---------------------------------------------------------------
|
//===============================================================
|
||||||
|
|
||||||
Device =
|
Device =
|
||||||
%subst(
|
%subst(
|
||||||
@@ -161,9 +281,54 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
%size(Device));
|
%size(Device));
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//===============================================================
|
||||||
|
// Validate Device Definition
|
||||||
|
//===============================================================
|
||||||
|
|
||||||
|
if Device.LengthOfDeviceDefinition <> %size(Device);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2002';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if Device.NumberOfMediaFileDefinitions < 1
|
||||||
|
or Device.NumberOfMediaFileDefinitions > MD_MaxMediaDefinitions;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2002';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if %trim(Device.DeviceName) = '';
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2002';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if Device.OffsetToFirstMediaFileDefinition < %size(Device);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2002';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
//===============================================================
|
||||||
// Device -> Media Definition
|
// Device -> Media Definition
|
||||||
//---------------------------------------------------------------
|
//===============================================================
|
||||||
|
|
||||||
MediaDefinition.Device(DeviceIndex).DeviceName =
|
MediaDefinition.Device(DeviceIndex).DeviceName =
|
||||||
Device.DeviceName;
|
Device.DeviceName;
|
||||||
@@ -172,14 +337,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
Device.NumberOfMediaFileDefinitions;
|
Device.NumberOfMediaFileDefinitions;
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//===============================================================
|
||||||
// Media Files
|
// Media Files
|
||||||
//---------------------------------------------------------------
|
//===============================================================
|
||||||
|
|
||||||
if Device.NumberOfMediaFileDefinitions > 0;
|
|
||||||
|
|
||||||
// OffsetToFirstMediaFileDefinition is relative
|
|
||||||
// to the Device Definition.
|
|
||||||
|
|
||||||
MediaOffset =
|
MediaOffset =
|
||||||
DeviceOffset
|
DeviceOffset
|
||||||
@@ -190,9 +350,24 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
to Device.NumberOfMediaFileDefinitions;
|
to Device.NumberOfMediaFileDefinitions;
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
|
// Validate Media Offset
|
||||||
|
//============================================================
|
||||||
|
|
||||||
|
if MediaOffset < 0
|
||||||
|
or MediaOffset > ReceiverLength - %size(MediaFile);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2003';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================
|
||||||
// Read Media File Definition
|
// Read Media File Definition
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
|
|
||||||
MediaFile =
|
MediaFile =
|
||||||
%subst(
|
%subst(
|
||||||
@@ -201,9 +376,79 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
%size(MediaFile));
|
%size(MediaFile));
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
|
// Validate Media File Definition
|
||||||
|
//============================================================
|
||||||
|
|
||||||
|
if MediaFile.LengthOfMediaFileDefinition <> %size(MediaFile);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2003';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if MediaFile.NumberOfVolumeIdentifiers < 0
|
||||||
|
or MediaFile.NumberOfVolumeIdentifiers > MD_MaxVolumeIdentifiers;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2003';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
if MediaFile.NumberOfVolumeIdentifiers = 0;
|
||||||
|
|
||||||
|
if MediaFile.OffsetToVolumeIdentifierArray <> 0
|
||||||
|
or MediaFile.LengthOfVolumeIdentifier <> 0
|
||||||
|
or MediaFile.StartingVolumeArrayElement <> 0;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2004';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
else;
|
||||||
|
|
||||||
|
if MediaFile.OffsetToVolumeIdentifierArray <= 0
|
||||||
|
or MediaFile.LengthOfVolumeIdentifier <> MD_VOLUME_ID_LENGTH
|
||||||
|
or MediaFile.StartingVolumeArrayElement < 1;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2004';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
RequiredLength =
|
||||||
|
MediaFile.NumberOfVolumeIdentifiers
|
||||||
|
* MediaFile.LengthOfVolumeIdentifier;
|
||||||
|
|
||||||
|
if MediaFile.OffsetToVolumeIdentifierArray >
|
||||||
|
ReceiverLength - RequiredLength
|
||||||
|
or MediaFile.OffsetToVolumeIdentifierArray <
|
||||||
|
MediaOffset + %size(MediaFile);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2004';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================
|
||||||
// Media File -> Media Definition
|
// Media File -> Media Definition
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
|
|
||||||
MediaDefinition.Device(DeviceIndex)
|
MediaDefinition.Device(DeviceIndex)
|
||||||
.MediaFile(MediaIndex)
|
.MediaFile(MediaIndex)
|
||||||
@@ -223,9 +468,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
MediaFile.NumberOfVolumeIdentifiers;
|
MediaFile.NumberOfVolumeIdentifiers;
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
// Volume Identifier Array
|
// Volume Identifier Array
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
|
|
||||||
if MediaFile.NumberOfVolumeIdentifiers > 0;
|
if MediaFile.NumberOfVolumeIdentifiers > 0;
|
||||||
|
|
||||||
@@ -236,7 +481,6 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
for VolumeIndex = 1
|
for VolumeIndex = 1
|
||||||
to MediaFile.NumberOfVolumeIdentifiers;
|
to MediaFile.NumberOfVolumeIdentifiers;
|
||||||
|
|
||||||
|
|
||||||
MediaDefinition.Device(DeviceIndex)
|
MediaDefinition.Device(DeviceIndex)
|
||||||
.MediaFile(MediaIndex)
|
.MediaFile(MediaIndex)
|
||||||
.VolumeIdentifier(VolumeIndex)
|
.VolumeIdentifier(VolumeIndex)
|
||||||
@@ -249,24 +493,42 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
+ 1 :
|
+ 1 :
|
||||||
MediaFile.LengthOfVolumeIdentifier);
|
MediaFile.LengthOfVolumeIdentifier);
|
||||||
|
|
||||||
|
|
||||||
endfor;
|
endfor;
|
||||||
|
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
// Next Media File
|
// Next Media File
|
||||||
//----------------------------------------------------------
|
//============================================================
|
||||||
|
|
||||||
if MediaIndex
|
if MediaIndex
|
||||||
< Device.NumberOfMediaFileDefinitions;
|
< Device.NumberOfMediaFileDefinitions;
|
||||||
|
|
||||||
if MediaFile.OffsetToNextMediaFileDefinition > 0;
|
if MediaFile.OffsetToNextMediaFileDefinition <=
|
||||||
|
MediaOffset
|
||||||
|
or MediaFile.OffsetToNextMediaFileDefinition >
|
||||||
|
ReceiverLength - %size(MediaFile);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2003';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
MediaOffset =
|
MediaOffset =
|
||||||
MediaFile.OffsetToNextMediaFileDefinition;
|
MediaFile.OffsetToNextMediaFileDefinition;
|
||||||
|
|
||||||
|
else;
|
||||||
|
|
||||||
|
if MediaFile.OffsetToNextMediaFileDefinition <> 0;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2003';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
endif;
|
endif;
|
||||||
@@ -274,18 +536,39 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
|
|
||||||
endfor;
|
endfor;
|
||||||
|
|
||||||
endif;
|
|
||||||
|
|
||||||
|
|
||||||
//================================================================
|
//================================================================
|
||||||
// Next Device
|
// Next Device
|
||||||
//================================================================
|
//================================================================
|
||||||
|
|
||||||
if Device.OffsetToNextDeviceDefinition > 0;
|
if DeviceIndex < Header.NumberOfDeviceDefinitions;
|
||||||
|
|
||||||
|
if Device.OffsetToNextDeviceDefinition <=
|
||||||
|
DeviceOffset
|
||||||
|
or Device.OffsetToNextDeviceDefinition >
|
||||||
|
ReceiverLength - %size(Device);
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2002';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
DeviceOffset =
|
DeviceOffset =
|
||||||
Device.OffsetToNextDeviceDefinition;
|
Device.OffsetToNextDeviceDefinition;
|
||||||
|
|
||||||
|
else;
|
||||||
|
|
||||||
|
if Device.OffsetToNextDeviceDefinition <> 0;
|
||||||
|
|
||||||
|
Error.HasError = *on;
|
||||||
|
Error.MessageID = 'MDF2002';
|
||||||
|
Error.MessageData = *blanks;
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
|
|
||||||
@@ -293,4 +576,3 @@ dcl-proc MD_ParseRetrieveBuffer export;
|
|||||||
|
|
||||||
|
|
||||||
end-proc;
|
end-proc;
|
||||||
|
|
||||||
|
|||||||
+15
-1
@@ -68,6 +68,9 @@ dcl-pr MD_ParseRetrieveBuffer;
|
|||||||
MediaDefinition
|
MediaDefinition
|
||||||
likeds(MD_MediaDefinition_T);
|
likeds(MD_MediaDefinition_T);
|
||||||
|
|
||||||
|
Error
|
||||||
|
likeds(MD_Error_T);
|
||||||
|
|
||||||
end-pr;
|
end-pr;
|
||||||
|
|
||||||
|
|
||||||
@@ -555,7 +558,18 @@ dcl-proc MD_RetrieveMediaDefinition export;
|
|||||||
|
|
||||||
MD_ParseRetrieveBuffer(
|
MD_ParseRetrieveBuffer(
|
||||||
Receiver.Data :
|
Receiver.Data :
|
||||||
MediaDefinition);
|
MediaDefinition :
|
||||||
|
Error);
|
||||||
|
|
||||||
|
if Error.HasError;
|
||||||
|
|
||||||
|
MD_SendEscape(
|
||||||
|
Error.MessageID :
|
||||||
|
Error.MessageData);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
endif;
|
||||||
|
|
||||||
end-proc;
|
end-proc;
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,20 @@ dsply '----------------------------------------';
|
|||||||
dsply 'MEDDFN Error Test completed';
|
dsply 'MEDDFN Error Test completed';
|
||||||
dsply '----------------------------------------';
|
dsply '----------------------------------------';
|
||||||
|
|
||||||
|
//=====================================================================
|
||||||
|
// End
|
||||||
|
//=====================================================================
|
||||||
|
|
||||||
|
*inlr = *on;
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
//=====================================================================
|
||||||
|
//
|
||||||
|
// TestCreateValidation
|
||||||
|
//
|
||||||
|
//=====================================================================
|
||||||
|
|
||||||
|
|
||||||
//=====================================================================
|
//=====================================================================
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user