diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-02-26 15:36:09 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-02-28 15:11:57 +0000 |
commit | 3209bc81245452ef6976c77818186b05c3026438 (patch) | |
tree | 84face5b12c25994325b03a79b3d6809ba65edb8 /filter | |
parent | 4ffa2ddf2490005347a6567fcd2f619f06c33025 (diff) |
fdo#61507 import/export RTF_UPR and RTF_UD
In short, these commits make the RTF filter import and export unicode
characters in document title properly. Previously we failed to import
such files from Word, and the export result caused problems in Wordpad
(Word handled it fine).
(cherry picked from commits 0805b222f87bf99ec0c53ca678d1c670eb5293a2,
3a934d928e455eca38f124072c20a624a64aa225 and
5de52551a963b932cc23c2ea75f709fa1924520b)
Change-Id: Ic9417d0f23d44149acb3ae3dc9d4c281058a1b36
Reviewed-on: https://gerrit.libreoffice.org/2436
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'filter')
-rw-r--r-- | filter/inc/filter/msfilter/rtfutil.hxx | 23 | ||||
-rw-r--r-- | filter/source/msfilter/rtfutil.cxx | 47 |
2 files changed, 62 insertions, 8 deletions
diff --git a/filter/inc/filter/msfilter/rtfutil.hxx b/filter/inc/filter/msfilter/rtfutil.hxx index 6f5d82c37283..aa842fd94001 100644 --- a/filter/inc/filter/msfilter/rtfutil.hxx +++ b/filter/inc/filter/msfilter/rtfutil.hxx @@ -41,10 +41,27 @@ namespace rtfutil { MSFILTER_DLLPUBLIC OString OutHex(sal_uLong nHex, sal_uInt8 nLen); /// Handles correct unicode and legacy export of a single character. -MSFILTER_DLLPUBLIC OString OutChar(sal_Unicode c, int *pUCMode, rtl_TextEncoding eDestEnc); +MSFILTER_DLLPUBLIC OString OutChar(sal_Unicode c, int *pUCMode, rtl_TextEncoding eDestEnc, bool* pSuccess = 0, bool bUnicode = true); -/// Handles correct unicode and legacy export of a string. -MSFILTER_DLLPUBLIC OString OutString(const String &rStr, rtl_TextEncoding eDestEnc); +/** + * Handles correct unicode and legacy export of a string. + * + * @param rStr the string to export + * @param eDestEnc the legacy encoding to use + * @param bUnicode if unicode output is wanted as well, or just legacy + */ +MSFILTER_DLLPUBLIC OString OutString(const String &rStr, rtl_TextEncoding eDestEnc, bool bUnicode = true); + +/** + * Handles correct unicode and legacy export of a string, when a + * '{' \upr '{' keyword ansi_text '}{\*' \ud '{' keyword Unicode_text '}}}' + * construct should be used. + * + * @param pToken the keyword + * @param rStr the text to export + * @param eDestEnc the legacy encoding to use + */ +MSFILTER_DLLPUBLIC OString OutStringUpr(const sal_Char *pToken, const String &rStr, rtl_TextEncoding eDestEnc); } } diff --git a/filter/source/msfilter/rtfutil.cxx b/filter/source/msfilter/rtfutil.cxx index ebb72bdeda94..3e2dfb0fbf85 100644 --- a/filter/source/msfilter/rtfutil.cxx +++ b/filter/source/msfilter/rtfutil.cxx @@ -53,8 +53,10 @@ OString OutHex(sal_uLong nHex, sal_uInt8 nLen) return OString(pStr); } -OString OutChar(sal_Unicode c, int *pUCMode, rtl_TextEncoding eDestEnc) +OString OutChar(sal_Unicode c, int *pUCMode, rtl_TextEncoding eDestEnc, bool* pSuccess, bool bUnicode) { + if (pSuccess) + *pSuccess = true; OStringBuffer aBuf; const sal_Char* pStr = 0; // 0x0b instead of \n, etc because of the replacements in SwWW8AttrIter::GetSnippet() @@ -91,10 +93,13 @@ OString OutChar(sal_Unicode c, int *pUCMode, rtl_TextEncoding eDestEnc) else { OUString sBuf(&c, 1); OString sConverted; - sBuf.convertToString(&sConverted, eDestEnc, OUSTRING_TO_OSTRING_CVTFLAGS); + if (pSuccess) + *pSuccess &= sBuf.convertToString(&sConverted, eDestEnc, RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR); + else + sBuf.convertToString(&sConverted, eDestEnc, OUSTRING_TO_OSTRING_CVTFLAGS); const sal_Int32 nLen = sConverted.getLength(); - if (pUCMode) + if (pUCMode && bUnicode) { if (*pUCMode != nLen) { @@ -130,13 +135,13 @@ OString OutChar(sal_Unicode c, int *pUCMode, rtl_TextEncoding eDestEnc) return aBuf.makeStringAndClear(); } -OString OutString(const String &rStr, rtl_TextEncoding eDestEnc) +OString OutString(const String &rStr, rtl_TextEncoding eDestEnc, bool bUnicode) { SAL_INFO("filter.ms", OSL_THIS_FUNC << ", rStr = '" << OUString(rStr) << "'"); OStringBuffer aBuf; int nUCMode = 1; for (xub_StrLen n = 0; n < rStr.Len(); ++n) - aBuf.append(OutChar(rStr.GetChar(n), &nUCMode, eDestEnc)); + aBuf.append(OutChar(rStr.GetChar(n), &nUCMode, eDestEnc, 0, bUnicode)); if (nUCMode != 1) { aBuf.append(OOO_STRING_SVTOOLS_RTF_UC); aBuf.append((sal_Int32)1); @@ -145,6 +150,38 @@ OString OutString(const String &rStr, rtl_TextEncoding eDestEnc) return aBuf.makeStringAndClear(); } +/// Checks if lossless conversion of the string to eDestEnc is possible or not. +static bool TryOutString(const String &rStr, rtl_TextEncoding eDestEnc) +{ + int nUCMode = 1; + for (xub_StrLen n = 0; n < rStr.Len(); ++n) + { + bool bRet; + OutChar(rStr.GetChar(n), &nUCMode, eDestEnc, &bRet); + if (!bRet) + return false; + } + return true; +} + +OString OutStringUpr(const sal_Char *pToken, const String &rStr, rtl_TextEncoding eDestEnc) +{ + if (TryOutString(rStr, eDestEnc)) + return OString("{") + pToken + " " + OutString(rStr, eDestEnc) + "}"; + + OStringBuffer aRet; + aRet.append("{" OOO_STRING_SVTOOLS_RTF_UPR "{"); + aRet.append(pToken); + aRet.append(" "); + aRet.append(OutString(rStr, eDestEnc, /*bUnicode =*/ false)); + aRet.append("}{" OOO_STRING_SVTOOLS_RTF_IGNORE OOO_STRING_SVTOOLS_RTF_UD "{"); + aRet.append(pToken); + aRet.append(" "); + aRet.append(OutString(rStr, eDestEnc)); + aRet.append("}}}"); + return aRet.makeStringAndClear(); +} + } } |