Kaydet (Commit) 66c3655a authored tarafından Caolán McNamara's avatar Caolán McNamara

convert ReadCString from ByteString to OString

Nobody ever checked the return value anyway, so just return the string
and use the stream state bits if necessary to find failures.

Doesn't need to be a member, make a standalone function

Rename it to read_zeroTerminated_uInt8s_AsO[U]String, stupid perhaps,
but *shrug*, unambiguous.

Drop misleading overloaded String variants use:
read_zeroTerminated_uInt8s_AsOString or
read_zeroTerminated_uInt8s_AsOUString

added a unit test, valgrinded it, found and fixed invalid read
in original implementation.
üst ace8398c
...@@ -311,9 +311,7 @@ ByteString ScfTools::ReadCString( SvStream& rStrm, sal_Int32& rnBytesLeft ) ...@@ -311,9 +311,7 @@ ByteString ScfTools::ReadCString( SvStream& rStrm, sal_Int32& rnBytesLeft )
void ScfTools::AppendCString( SvStream& rStrm, String& rString, rtl_TextEncoding eTextEnc ) void ScfTools::AppendCString( SvStream& rStrm, String& rString, rtl_TextEncoding eTextEnc )
{ {
ByteString aByteString; rString += read_zeroTerminated_uInt8s_AsOUString(rStrm, eTextEnc);
rStrm.ReadCString(aByteString);
rString += String( aByteString, eTextEnc );
} }
// *** HTML table names <-> named range names *** ----------------------------- // *** HTML table names <-> named range names *** -----------------------------
......
...@@ -73,8 +73,7 @@ sal_Bool INetImage::Read( SvStream& rIStm, sal_uLong nFormat ) ...@@ -73,8 +73,7 @@ sal_Bool INetImage::Read( SvStream& rIStm, sal_uLong nFormat )
{ {
case SOT_FORMATSTR_ID_INET_IMAGE: case SOT_FORMATSTR_ID_INET_IMAGE:
{ {
String sINetImg; String sINetImg = read_zeroTerminated_uInt8s_AsOUString(rIStm, RTL_TEXTENCODING_UTF8);
rIStm.ReadCString( sINetImg, RTL_TEXTENCODING_UTF8 );
xub_StrLen nStart = 0; xub_StrLen nStart = 0;
aImageURL = sINetImg.GetToken( 0, TOKEN_SEPARATOR, nStart ); aImageURL = sINetImg.GetToken( 0, TOKEN_SEPARATOR, nStart );
aTargetURL = sINetImg.GetToken( 0, TOKEN_SEPARATOR, nStart ); aTargetURL = sINetImg.GetToken( 0, TOKEN_SEPARATOR, nStart );
...@@ -120,11 +119,11 @@ sal_Bool INetImage::Read( SvStream& rIStm, sal_uLong nFormat ) ...@@ -120,11 +119,11 @@ sal_Bool INetImage::Read( SvStream& rIStm, sal_uLong nFormat )
// skip over iExtraHTML_Offset // skip over iExtraHTML_Offset
rIStm.SeekRel( sizeof( int ) ); rIStm.SeekRel( sizeof( int ) );
rIStm.ReadCString( aImageURL, eSysCSet ); aImageURL = read_zeroTerminated_uInt8s_AsOUString(rIStm, eSysCSet);
if( nAltOffset ) if( nAltOffset )
{ {
rIStm.Seek( nFilePos + nAltOffset ); rIStm.Seek( nFilePos + nAltOffset );
rIStm.ReadCString( aAlternateText, eSysCSet ); aAlternateText = read_zeroTerminated_uInt8s_AsOUString(rIStm, eSysCSet);
} }
else if( aAlternateText.Len() ) else if( aAlternateText.Len() )
aAlternateText.Erase(); aAlternateText.Erase();
...@@ -132,7 +131,7 @@ sal_Bool INetImage::Read( SvStream& rIStm, sal_uLong nFormat ) ...@@ -132,7 +131,7 @@ sal_Bool INetImage::Read( SvStream& rIStm, sal_uLong nFormat )
if( nAnchorOffset ) if( nAnchorOffset )
{ {
rIStm.Seek( nFilePos + nAnchorOffset ); rIStm.Seek( nFilePos + nAnchorOffset );
rIStm.ReadCString( aTargetURL, eSysCSet ); aTargetURL = read_zeroTerminated_uInt8s_AsOUString(rIStm, eSysCSet);
} }
else if( aTargetURL.Len() ) else if( aTargetURL.Len() )
aTargetURL.Erase(); aTargetURL.Erase();
......
...@@ -1993,9 +1993,9 @@ int SwTransferable::_PasteDDE( TransferableDataHelper& rData, ...@@ -1993,9 +1993,9 @@ int SwTransferable::_PasteDDE( TransferableDataHelper& rData,
} // report useful error!! } // report useful error!!
rtl_TextEncoding eEncoding = DDE_TXT_ENCODING; rtl_TextEncoding eEncoding = DDE_TXT_ENCODING;
xStrm->ReadCString( aApp, eEncoding ); aApp = read_zeroTerminated_uInt8s_AsOUString(*xStrm, eEncoding);
xStrm->ReadCString( aTopic, eEncoding ); aTopic = read_zeroTerminated_uInt8s_AsOUString(*xStrm, eEncoding);
xStrm->ReadCString( aItem, eEncoding ); aItem = read_zeroTerminated_uInt8s_AsOUString(*xStrm, eEncoding);
} }
String aCmd; String aCmd;
......
...@@ -385,12 +385,6 @@ public: ...@@ -385,12 +385,6 @@ public:
// next Tell() <= nSize // next Tell() <= nSize
sal_Bool SetStreamSize( sal_Size nSize ); sal_Bool SetStreamSize( sal_Size nSize );
/// Read in the stream to a zero character and put all
/// read chracters in the Bytestring. The String interface
/// convert the BytString with the given encoding to a String
sal_Bool ReadCString( ByteString& rStr );
sal_Bool ReadCString( String& rStr, rtl_TextEncoding eToEncode );
sal_Bool ReadLine( ByteString& rStr ); sal_Bool ReadLine( ByteString& rStr );
sal_Bool ReadLine( rtl::OString& rStr ); sal_Bool ReadLine( rtl::OString& rStr );
sal_Bool WriteLine( const ByteString& rStr ); sal_Bool WriteLine( const ByteString& rStr );
...@@ -559,6 +553,13 @@ TOOLS_DLLPUBLIC rtl::OString read_uInt8s_AsOString(SvStream& rStr, sal_Size nLen ...@@ -559,6 +553,13 @@ TOOLS_DLLPUBLIC rtl::OString read_uInt8s_AsOString(SvStream& rStr, sal_Size nLen
//rtl::OUString's length is number of units successfully read //rtl::OUString's length is number of units successfully read
TOOLS_DLLPUBLIC rtl::OUString read_LEuInt16s_AsOUString(SvStream& rStr, sal_Size nLen); TOOLS_DLLPUBLIC rtl::OUString read_LEuInt16s_AsOUString(SvStream& rStr, sal_Size nLen);
//Attempt to read 8bit units to an OString until a zero terminator is encountered
TOOLS_DLLPUBLIC rtl::OString read_zeroTerminated_uInt8s_AsOString(SvStream& rStr);
//Attempt to read 8bit units assuming source encoding eEnc to an OUString until
//a zero terminator is encountered
TOOLS_DLLPUBLIC rtl::OUString read_zeroTerminated_uInt8s_AsOUString(SvStream& rStr, rtl_TextEncoding eEnc);
// -------------- // --------------
// - FileStream - // - FileStream -
// -------------- // --------------
......
...@@ -46,10 +46,12 @@ namespace ...@@ -46,10 +46,12 @@ namespace
public: public:
void test_stdstream(); void test_stdstream();
void test_fastostring(); void test_fastostring();
void test_read_cstring();
CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST_SUITE(Test);
CPPUNIT_TEST(test_stdstream); CPPUNIT_TEST(test_stdstream);
CPPUNIT_TEST(test_fastostring); CPPUNIT_TEST(test_fastostring);
CPPUNIT_TEST(test_read_cstring);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
}; };
...@@ -146,6 +148,25 @@ namespace ...@@ -146,6 +148,25 @@ namespace
CPPUNIT_ASSERT(aFour.equalsL(RTL_CONSTASCII_STRINGPARAM(foo))); CPPUNIT_ASSERT(aFour.equalsL(RTL_CONSTASCII_STRINGPARAM(foo)));
} }
void Test::test_read_cstring()
{
char foo[] = "foobar";
SvMemoryStream aMemStream(RTL_CONSTASCII_STRINGPARAM(foo), STREAM_READ);
rtl::OString aOne = read_zeroTerminated_uInt8s_AsOString(aMemStream);
CPPUNIT_ASSERT(aOne.equalsL(RTL_CONSTASCII_STRINGPARAM("foobar")));
CPPUNIT_ASSERT(!aMemStream.good());
CPPUNIT_ASSERT(!aMemStream.bad());
CPPUNIT_ASSERT(aMemStream.eof());
aMemStream.Seek(0);
foo[3] = 0;
rtl::OString aTwo = read_zeroTerminated_uInt8s_AsOString(aMemStream);
CPPUNIT_ASSERT(aTwo.equalsL(RTL_CONSTASCII_STRINGPARAM("foo")));
CPPUNIT_ASSERT(aMemStream.good());
}
CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_TEST_SUITE_REGISTRATION(Test);
} }
......
...@@ -806,30 +806,23 @@ sal_Bool SvStream::ReadUniOrByteStringLine( String& rStr, rtl_TextEncoding eSrcC ...@@ -806,30 +806,23 @@ sal_Bool SvStream::ReadUniOrByteStringLine( String& rStr, rtl_TextEncoding eSrcC
return ReadByteStringLine( rStr, eSrcCharSet ); return ReadByteStringLine( rStr, eSrcCharSet );
} }
/************************************************************************* rtl::OString read_zeroTerminated_uInt8s_AsOString(SvStream& rStream)
|*
|* Stream::ReadCString
|*
*************************************************************************/
sal_Bool SvStream::ReadCString( ByteString& rStr )
{ {
if( rStr.Len() ) rtl::OStringBuffer aOutput;
rStr.Erase();
sal_Char buf[ 256 + 1 ]; sal_Char buf[ 256 + 1 ];
sal_Bool bEnd = sal_False; sal_Bool bEnd = sal_False;
sal_Size nFilePos = Tell(); sal_Size nFilePos = rStream.Tell();
while( !bEnd && !GetError() ) while( !bEnd && !rStream.GetError() )
{ {
sal_uInt16 nLen = (sal_uInt16)Read( buf, sizeof(buf)-1 ); sal_Size nLen = rStream.Read(buf, sizeof(buf)-1);
sal_uInt16 nReallyRead = nLen; if (!nLen)
if( !nLen )
break; break;
sal_Size nReallyRead = nLen;
const sal_Char* pPtr = buf; const sal_Char* pPtr = buf;
while( *pPtr && nLen ) while (nLen && *pPtr)
++pPtr, --nLen; ++pPtr, --nLen;
bEnd = ( nReallyRead < sizeof(buf)-1 ) // read less than attempted to read bEnd = ( nReallyRead < sizeof(buf)-1 ) // read less than attempted to read
...@@ -837,25 +830,21 @@ sal_Bool SvStream::ReadCString( ByteString& rStr ) ...@@ -837,25 +830,21 @@ sal_Bool SvStream::ReadCString( ByteString& rStr )
&& ( 0 == *pPtr ) // AND found a string terminator && ( 0 == *pPtr ) // AND found a string terminator
); );
rStr.Append( buf, ::sal::static_int_cast< xub_StrLen >( pPtr - buf ) ); aOutput.append(buf, pPtr - buf);
} }
nFilePos += rStr.Len(); nFilePos += aOutput.getLength();
if( Tell() > nFilePos ) if (rStream.Tell() > nFilePos)
nFilePos++; rStream.Seek(nFilePos+1); // seeken wg. obigem BlockRead!
Seek( nFilePos ); // seeken wg. obigem BlockRead! return aOutput.makeStringAndClear();
return bEnd;
} }
sal_Bool SvStream::ReadCString( String& rStr, rtl_TextEncoding eToEncode ) rtl::OUString read_zeroTerminated_uInt8s_AsOUString(SvStream& rStream, rtl_TextEncoding eEnc)
{ {
ByteString sStr; return rtl::OStringToOUString(
sal_Bool bRet = ReadCString( sStr ); read_zeroTerminated_uInt8s_AsOString(rStream), eEnc);
rStr = String( sStr, eToEncode );
return bRet;
} }
/************************************************************************* /*************************************************************************
|* |*
|* Stream::WriteUnicodeText() |* Stream::WriteUnicodeText()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment