summaryrefslogtreecommitdiff
path: root/filter
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
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')
-rw-r--r--filter/inc/filter/msfilter/rtfutil.hxx23
-rw-r--r--filter/source/msfilter/rtfutil.cxx47
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();
+}
+
}
}