commands/fed/src/filebuffer.cpp
changeset 64 72ffa331d78d
parent 0 7f656887cf89
--- a/commands/fed/src/filebuffer.cpp	Mon Sep 20 16:46:34 2010 +0100
+++ b/commands/fed/src/filebuffer.cpp	Tue Sep 28 17:03:08 2010 +0100
@@ -852,7 +852,7 @@
 				{
 				// Can be null if charconv is busted
 				bytesLeft = aCharconvForUtf8Conversion->ConvertToUnicode(iData, data, state, numUnconverted, firstUnconverted);
-				ASSERT(bytesLeft <= 0); // Otherwise we didn't make our buffer big enough
+				ASSERT(bytesLeft <= 3); // Otherwise we didn't make our buffer big enough. There could be up to 3 bytes remaining if the block ends in a truncated UTF-8 sequence
 				// bytesLeft less than zero means an invalid sequence at the start of the buffer. Since our block size will never be so small there's no risk it's the start of a truncated sequence
 				}
 
@@ -865,16 +865,16 @@
 			else if (firstUnconverted >= 0)
 				{
 				// Got some bad data
-				if (iNext && data.Length() - firstUnconverted < 4)
+				if (iNext && data.Length() - bytesLeft < 4 && firstUnconverted == data.Length() - bytesLeft)
 					{
 					// Possibly a UTF-8 sequence spread over a block boundary
 					blockEncoding = EEncodingUtf8;
-					TInt err = iNext->TransferDataFromPreviousBlock(this, data.Mid(firstUnconverted));
+					TInt err = iNext->TransferDataFromPreviousBlock(this, data.Right(bytesLeft));
 					if (!err)
 						{
-						iBlockSize = firstUnconverted;
+						iBlockSize -= bytesLeft;
 						}
-					iData.SetLength(iData.Locate(0xFFFD)); // No better way of figuring out where charconv barfed than to scan for the first instance of the substitution character
+					iData.SetLength(iData.LocateReverse(0xFFFD)); // No better way of figuring out where charconv barfed than to scan for the last instance of the substitution character
 					}
 				else
 					{