summaryrefslogtreecommitdiff
path: root/filter/source
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-02-26 15:36:09 +0100
committerCaolán McNamara <caolanm@redhat.com>2013-02-28 15:11:57 +0000
commit3209bc81245452ef6976c77818186b05c3026438 (patch)
tree84face5b12c25994325b03a79b3d6809ba65edb8 /filter/source
parent4ffa2ddf2490005347a6567fcd2f619f06c33025 (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/source')
-rw-r--r--filter/source/msfilter/rtfutil.cxx47
1 files changed, 42 insertions, 5 deletions
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();
+}
+
}
}