From c96e8a174f915e46b0f0814271e53938d8f07373 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Mon, 15 Dec 2014 12:17:06 +0000 Subject: Resolves: fdo#87248 assume 0 chse means use encoding that matches lid Change-Id: I813cc6bdc92b03bdfdd5202a85e958020a9c52c8 --- sw/source/filter/ww8/ww8glsy.cxx | 2 +- sw/source/filter/ww8/ww8par.cxx | 6 +++--- sw/source/filter/ww8/ww8par2.cxx | 2 +- sw/source/filter/ww8/ww8scan.cxx | 29 +++++++++++++++++++---------- sw/source/filter/ww8/ww8scan.hxx | 2 +- 5 files changed, 25 insertions(+), 16 deletions(-) (limited to 'sw') diff --git a/sw/source/filter/ww8/ww8glsy.cxx b/sw/source/filter/ww8/ww8glsy.cxx index 2836518ece1c..cb60ebf19b13 100644 --- a/sw/source/filter/ww8/ww8glsy.cxx +++ b/sw/source/filter/ww8/ww8glsy.cxx @@ -197,7 +197,7 @@ bool WW8Glossary::Load( SwTextBlocks &rBlocks, bool bSaveRelFile ) std::vector aData; rtl_TextEncoding eStructCharSet = - WW8Fib::GetFIBCharset(pGlossary->chseTables); + WW8Fib::GetFIBCharset(pGlossary->chseTables, pGlossary->lid); WW8ReadSTTBF(true, *xTableStream, pGlossary->fcSttbfglsy, pGlossary->lcbSttbfglsy, 0, eStructCharSet, aStrings, &aData ); diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 4d24c0aef61f..94962bc07ad3 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -5001,8 +5001,8 @@ sal_uLong SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos) bVer67 = bVer6 || bVer7; bVer8 = (8 == pWwFib->nVersion); - eTextCharSet = WW8Fib::GetFIBCharset(pWwFib->chse); - eStructCharSet = WW8Fib::GetFIBCharset(pWwFib->chseTables); + eTextCharSet = WW8Fib::GetFIBCharset(pWwFib->chse, pWwFib->lid); + eStructCharSet = WW8Fib::GetFIBCharset(pWwFib->chseTables, pWwFib->lid); bWWBugNormal = pWwFib->nProduct == 0xc03d; @@ -5568,7 +5568,7 @@ namespace OUString sUniPassword = QueryPasswordForMedium( rMedium ); OString sPassword(OUStringToOString(sUniPassword, - WW8Fib::GetFIBCharset(pWwFib->chseTables))); + WW8Fib::GetFIBCharset(pWwFib->chseTables, pWwFib->lid))); sal_Int32 nLen = sPassword.getLength(); if( nLen <= 15 ) diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx index bbea4c013004..4929642615af 100644 --- a/sw/source/filter/ww8/ww8par2.cxx +++ b/sw/source/filter/ww8/ww8par2.cxx @@ -4216,7 +4216,7 @@ void WW8RStyle::ImportOldFormatStyles() } rtl_TextEncoding eStructChrSet = WW8Fib::GetFIBCharset( - pIo->pWwFib->chseTables); + pIo->pWwFib->chseTables, pIo->pWwFib->lid); sal_uInt16 cstcStd(0); rSt.ReadUInt16( cstcStd ); diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx index f5b71fbbc35b..dbc1de53304f 100644 --- a/sw/source/filter/ww8/ww8scan.cxx +++ b/sw/source/filter/ww8/ww8scan.cxx @@ -3984,7 +3984,7 @@ WW8PLCFx_Book::WW8PLCFx_Book(SvStream* pTblSt, const WW8Fib& rFib) pBook[1] = new WW8PLCFspecial(pTblSt,rFib.fcPlcfbkl,rFib.lcbPlcfbkl,0); - rtl_TextEncoding eStructChrSet = WW8Fib::GetFIBCharset(rFib.chseTables); + rtl_TextEncoding eStructChrSet = WW8Fib::GetFIBCharset(rFib.chseTables, rFib.lid); WW8ReadSTTBF( (7 < rFib.nVersion), *pTblSt, rFib.fcSttbfbkmk, rFib.lcbSttbfbkmk, 0, eStructChrSet, aBookNames ); @@ -5944,14 +5944,23 @@ bool WW8Fib::Write(SvStream& rStrm) return 0 == rStrm.GetError(); } -rtl_TextEncoding WW8Fib::GetFIBCharset(sal_uInt16 chs) +rtl_TextEncoding WW8Fib::GetFIBCharset(sal_uInt16 chs, sal_uInt16 nLidLocale) { OSL_ENSURE(chs <= 0x100, "overflowed winword charset set"); - rtl_TextEncoding eCharSet = - (0x0100 == chs) - ? RTL_TEXTENCODING_APPLE_ROMAN - : rtl_getTextEncodingFromWindowsCharset( static_cast(chs) ); - return eCharSet; + if (chs == 0x0100) + return RTL_TEXTENCODING_APPLE_ROMAN; + if (chs == 0 && nLidLocale != 0 && nLidLocale >= 999) + { + /* + nLidLocale: + language stamp -- localized version In pre-WinWord 2.0 files this + value was the nLocale. If value is < 999, then it is the nLocale, + otherwise it is the lid. + */ + ::com::sun::star::lang::Locale aLocale(LanguageTag::convertToLocale(nLidLocale)); + return msfilter::util::getBestTextEncodingFromLocale(aLocale); + } + return rtl_getTextEncodingFromWindowsCharset(static_cast(chs)); } WW8Style::WW8Style(SvStream& rStream, WW8Fib& rFibPara) @@ -6334,7 +6343,7 @@ WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib ) the font, e.g load the doc in 97 and save to see the unicode ver of the asian fontnames in that example to confirm. */ - rtl_TextEncoding eEnc = WW8Fib::GetFIBCharset(p->chs); + rtl_TextEncoding eEnc = WW8Fib::GetFIBCharset(p->chs, rFib.lid); if ((eEnc == RTL_TEXTENCODING_SYMBOL) || (eEnc == RTL_TEXTENCODING_DONTKNOW)) eEnc = RTL_TEXTENCODING_MS_1252; @@ -6364,7 +6373,7 @@ WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib ) the font, e.g load the doc in 97 and save to see the unicode ver of the asian fontnames in that example to confirm. */ - rtl_TextEncoding eEnc = WW8Fib::GetFIBCharset(p->chs); + rtl_TextEncoding eEnc = WW8Fib::GetFIBCharset(p->chs, rFib.lid); if ((eEnc == RTL_TEXTENCODING_SYMBOL) || (eEnc == RTL_TEXTENCODING_DONTKNOW)) eEnc = RTL_TEXTENCODING_MS_1252; p->sFontname = OUString(pVer6->szFfn, rtl_str_getLength(pVer6->szFfn), eEnc); @@ -6378,7 +6387,7 @@ WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib ) { //#i18369# if it's a symbol font set Symbol as fallback if ( - RTL_TEXTENCODING_SYMBOL == WW8Fib::GetFIBCharset(p->chs) + RTL_TEXTENCODING_SYMBOL == WW8Fib::GetFIBCharset(p->chs, rFib.lid) && p->sFontname!="Symbol" ) { diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx index 2dec722dbd64..dd3638b35714 100644 --- a/sw/source/filter/ww8/ww8scan.hxx +++ b/sw/source/filter/ww8/ww8scan.hxx @@ -1433,7 +1433,7 @@ public: WW8Fib( sal_uInt8 nVersion = 6, bool bDot = false ); bool WriteHeader(SvStream& rStrm); bool Write(SvStream& rStrm); - static rtl_TextEncoding GetFIBCharset(sal_uInt16 chs); + static rtl_TextEncoding GetFIBCharset(sal_uInt16 chs, sal_uInt16 nLidLocale); ww::WordVersion GetFIBVersion() const; WW8_CP GetBaseCp(ManTypes nType) const; sal_Unicode getNumDecimalSep() const { return nNumDecimalSep;} -- cgit