diff options
Diffstat (limited to 'oox/source/xls/biffhelper.cxx')
-rw-r--r-- | oox/source/xls/biffhelper.cxx | 97 |
1 files changed, 16 insertions, 81 deletions
diff --git a/oox/source/xls/biffhelper.cxx b/oox/source/xls/biffhelper.cxx index 8ecea303183e..afd7e04e6a08 100644 --- a/oox/source/xls/biffhelper.cxx +++ b/oox/source/xls/biffhelper.cxx @@ -26,8 +26,8 @@ ************************************************************************/ #include "oox/xls/biffhelper.hxx" -#include <algorithm> #include <rtl/math.hxx> +#include <rtl/tencinfo.h> #include "oox/xls/biffinputstream.hxx" #include "oox/xls/biffoutputstream.hxx" #include "oox/xls/worksheethelper.hxx" @@ -56,69 +56,6 @@ const sal_uInt16 BIFF_IMGDATA_NATIVE = 14; // ---------------------------------------------------------------------------- -static const struct CodePageEntry -{ - sal_uInt16 mnCodePage; - rtl_TextEncoding meTextEnc; -} -spCodePages[] = -{ - { 437, RTL_TEXTENCODING_IBM_437 }, // OEM US -// { 720, RTL_TEXTENCODING_IBM_720 }, // OEM Arabic - { 737, RTL_TEXTENCODING_IBM_737 }, // OEM Greek - { 775, RTL_TEXTENCODING_IBM_775 }, // OEM Baltic - { 850, RTL_TEXTENCODING_IBM_850 }, // OEM Latin I - { 852, RTL_TEXTENCODING_IBM_852 }, // OEM Latin II (Central European) - { 855, RTL_TEXTENCODING_IBM_855 }, // OEM Cyrillic - { 857, RTL_TEXTENCODING_IBM_857 }, // OEM Turkish -// { 858, RTL_TEXTENCODING_IBM_858 }, // OEM Multilingual Latin I with Euro - { 860, RTL_TEXTENCODING_IBM_860 }, // OEM Portugese - { 861, RTL_TEXTENCODING_IBM_861 }, // OEM Icelandic - { 862, RTL_TEXTENCODING_IBM_862 }, // OEM Hebrew - { 863, RTL_TEXTENCODING_IBM_863 }, // OEM Canadian (French) - { 864, RTL_TEXTENCODING_IBM_864 }, // OEM Arabic - { 865, RTL_TEXTENCODING_IBM_865 }, // OEM Nordic - { 866, RTL_TEXTENCODING_IBM_866 }, // OEM Cyrillic (Russian) - { 869, RTL_TEXTENCODING_IBM_869 }, // OEM Greek (Modern) - { 874, RTL_TEXTENCODING_MS_874 }, // MS Windows Thai - { 932, RTL_TEXTENCODING_MS_932 }, // MS Windows Japanese Shift-JIS - { 936, RTL_TEXTENCODING_MS_936 }, // MS Windows Chinese Simplified GBK - { 949, RTL_TEXTENCODING_MS_949 }, // MS Windows Korean (Wansung) - { 950, RTL_TEXTENCODING_MS_950 }, // MS Windows Chinese Traditional BIG5 - { 1200, RTL_TEXTENCODING_DONTKNOW }, // Unicode (BIFF8) - return *_DONTKNOW to preserve old code page - { 1250, RTL_TEXTENCODING_MS_1250 }, // MS Windows Latin II (Central European) - { 1251, RTL_TEXTENCODING_MS_1251 }, // MS Windows Cyrillic - { 1252, RTL_TEXTENCODING_MS_1252 }, // MS Windows Latin I (BIFF4-BIFF8) - { 1253, RTL_TEXTENCODING_MS_1253 }, // MS Windows Greek - { 1254, RTL_TEXTENCODING_MS_1254 }, // MS Windows Turkish - { 1255, RTL_TEXTENCODING_MS_1255 }, // MS Windows Hebrew - { 1256, RTL_TEXTENCODING_MS_1256 }, // MS Windows Arabic - { 1257, RTL_TEXTENCODING_MS_1257 }, // MS Windows Baltic - { 1258, RTL_TEXTENCODING_MS_1258 }, // MS Windows Vietnamese - { 1361, RTL_TEXTENCODING_MS_1361 }, // MS Windows Korean (Johab) - { 10000, RTL_TEXTENCODING_APPLE_ROMAN }, // Apple Roman - { 32768, RTL_TEXTENCODING_APPLE_ROMAN }, // Apple Roman - { 32769, RTL_TEXTENCODING_MS_1252 } // MS Windows Latin I (BIFF2-BIFF3) -}; - -/** Predicate to search by given code page. */ -struct CodePageEntry_CPPred -{ - inline explicit CodePageEntry_CPPred( sal_uInt16 nCodePage ) : mnCodePage( nCodePage ) {} - inline bool operator()( const CodePageEntry& rEntry ) const { return rEntry.mnCodePage == mnCodePage; } - sal_uInt16 mnCodePage; -}; - -/** Predicate to search by given text encoding. */ -struct CodePageEntry_TEPred -{ - inline explicit CodePageEntry_TEPred( rtl_TextEncoding eTextEnc ) : meTextEnc( eTextEnc ) {} - inline bool operator()( const CodePageEntry& rEntry ) const { return rEntry.meTextEnc == meTextEnc; } - rtl_TextEncoding meTextEnc; -}; - -// ---------------------------------------------------------------------------- - union DecodedDouble { double mfValue; @@ -217,7 +154,7 @@ void lclImportImgDataDib( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, aOutStrm << sal_uInt16( 0x4D42 ) << nBmpSize << sal_Int32( 0 ) << nOffset; // copy the DIB header - aOutStrm.copyStream( rStrm, nDibHdrSize ); + rStrm.copyToStream( aOutStrm, nDibHdrSize ); nBytes -= nDibHdrSize; /* Excel 3.x and Excel 4.x seem to write broken or out-dated DIB data. @@ -239,8 +176,8 @@ void lclImportImgDataDib( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, aOutStrm.seek( nOutStrmPos ); } - // copy remaining pixel data top output stream - aOutStrm.copyStream( rStrm, nBytes ); + // copy remaining pixel data to output stream + rStrm.copyToStream( aOutStrm, nBytes ); } rStrm.seek( nInStrmPos + nBytes ); } @@ -249,8 +186,6 @@ void lclImportImgDataDib( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, // ============================================================================ -// conversion ----------------------------------------------------------------- - /*static*/ double BiffHelper::calcDoubleFromRk( sal_Int32 nRkValue ) { DecodedDouble aDecDbl( 0.0 ); @@ -307,24 +242,24 @@ void lclImportImgDataDib( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, /*static*/ rtl_TextEncoding BiffHelper::calcTextEncodingFromCodePage( sal_uInt16 nCodePage ) { - const CodePageEntry* pEntry = ::std::find_if( spCodePages, STATIC_ARRAY_END( spCodePages ), CodePageEntry_CPPred( nCodePage ) ); - if( pEntry == STATIC_ARRAY_END( spCodePages ) ) + // some specials for BIFF + switch( nCodePage ) { - OSL_ENSURE( false, "UnitConverter::calcTextEncodingFromCodePage - unknown code page" ); - return RTL_TEXTENCODING_DONTKNOW; + case 1200: return RTL_TEXTENCODING_DONTKNOW; // BIFF8 Unicode + case 32768: return RTL_TEXTENCODING_APPLE_ROMAN; + case 32769: return RTL_TEXTENCODING_MS_1252; // BIFF2-BIFF3 } - return pEntry->meTextEnc; + + rtl_TextEncoding eTextEnc = rtl_getTextEncodingFromWindowsCodePage( nCodePage ); + OSL_ENSURE( eTextEnc != RTL_TEXTENCODING_DONTKNOW, "BiffHelper::calcTextEncodingFromCodePage - unknown code page" ); + return eTextEnc; } /*static*/ sal_uInt16 BiffHelper::calcCodePageFromTextEncoding( rtl_TextEncoding eTextEnc ) { - const CodePageEntry* pEntry = ::std::find_if( spCodePages, STATIC_ARRAY_END( spCodePages ), CodePageEntry_TEPred( eTextEnc ) ); - if( pEntry == STATIC_ARRAY_END( spCodePages ) ) - { - OSL_ENSURE( false, "UnitConverter::calcCodePageFromTextEncoding - unsupported text encoding" ); - return 1252; - } - return pEntry->mnCodePage; + sal_uInt32 nCodePage = rtl_getWindowsCodePageFromTextEncoding( eTextEnc ); + OSL_ENSURE( (0 < nCodePage) && (nCodePage <= SAL_MAX_UINT16), "BiffHelper::calcCodePageFromTextEncoding - unknown text encoding" ); + return static_cast< sal_uInt16 >( (nCodePage == 0) ? 1252 : nCodePage ); } /*static*/ void BiffHelper::importImgData( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, BiffType eBiff ) |