0031333: Data Exchange - RWGltf_TriangulationReader::readBuffer() fails to read inter...
[occt.git] / src / Standard / Standard_ReadBuffer.hxx
index e741e39..099a9ce 100644 (file)
@@ -25,7 +25,8 @@ public:
 
   //! Constructor with initialization.
   Standard_ReadBuffer (int64_t theDataLen,
-                       size_t  theChunkLen)
+                       size_t  theChunkLen,
+                       bool theIsPartialPayload = false)
   : myBufferPtr(NULL),
     myBufferEnd(NULL),
     myDataLen  (0),
@@ -34,17 +35,28 @@ public:
     myNbChunks (0),
     myBufferLen(0)
   {
-    Init (theDataLen, theChunkLen);
+    Init (theDataLen, theChunkLen, theIsPartialPayload);
   }
 
   //! Initialize the buffer.
-  //! @param theDataLen  the full length of input data to read from stream.
-  //! @param theChunkLen the length of single chunk to read
+  //! @param theDataLen  [in] the full length of input data to read from stream.
+  //! @param theChunkLen [in] the length of single chunk to read
+  //! @param theIsPartialPayload [in] when FALSE, theDataLen will be automatically aligned to the multiple of theChunkLen;
+  //!                                 when TRUE, last chunk will be read from stream exactly till theDataLen
+  //!                                 allowing portion of chunk to be uninitialized (useful for interleaved data)
   void Init (int64_t theDataLen,
-             size_t  theChunkLen)
+             size_t  theChunkLen,
+             bool theIsPartialPayload = false)
   {
     myDataRead  = 0;
-    myDataLen   = theDataLen - theDataLen % int64_t(theChunkLen);
+    if (theIsPartialPayload)
+    {
+      myDataLen = theDataLen;
+    }
+    else
+    {
+      myDataLen = theDataLen - theDataLen % int64_t(theChunkLen);
+    }
     myChunkLen  = theChunkLen;
     myNbChunks  = sizeof(myBuffer) / theChunkLen;
     myBufferLen = theChunkLen * myNbChunks;
@@ -95,7 +107,7 @@ private:
     }
 
     const int64_t aDataLeft = myDataLen - myDataRead;
-    if (aDataLeft == 0) // myDataLen should be multiple of myChunkLen
+    if (aDataLeft <= 0) // myDataLen is normally multiple of myChunkLen, but can be smaller in interleaved data
     {
       myBufferPtr = NULL;
       return NULL;