summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2014-12-15 12:17:06 +0000
committerCaolán McNamara <caolanm@redhat.com>2014-12-15 12:30:43 +0000
commitc96e8a174f915e46b0f0814271e53938d8f07373 (patch)
tree599b4d30ab23304dd95504d69ebb9f17ff1b07eb /sw
parentdc46c9266afa239281fd4c624be6be5700582fb6 (diff)
Resolves: fdo#87248 assume 0 chse means use encoding that matches lid
Change-Id: I813cc6bdc92b03bdfdd5202a85e958020a9c52c8
Diffstat (limited to 'sw')
-rw-r--r--sw/source/filter/ww8/ww8glsy.cxx2
-rw-r--r--sw/source/filter/ww8/ww8par.cxx6
-rw-r--r--sw/source/filter/ww8/ww8par2.cxx2
-rw-r--r--sw/source/filter/ww8/ww8scan.cxx29
-rw-r--r--sw/source/filter/ww8/ww8scan.hxx2
5 files changed, 25 insertions, 16 deletions
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<ww::bytes> 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<sal_uInt8>(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<sal_uInt8>(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;}