diff options
Diffstat (limited to 'svtools/source/svrtf/rtfout.cxx')
-rw-r--r-- | svtools/source/svrtf/rtfout.cxx | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/svtools/source/svrtf/rtfout.cxx b/svtools/source/svrtf/rtfout.cxx new file mode 100644 index 000000000000..d97e838d2450 --- /dev/null +++ b/svtools/source/svrtf/rtfout.cxx @@ -0,0 +1,209 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" +#include <tools/debug.hxx> +#include <tools/stream.hxx> +#include <tools/string.hxx> +#include <rtl/string.hxx> +#include <rtl/ustrbuf.hxx> +#include <rtfkeywd.hxx> +#include <rtfout.hxx> + +using namespace rtl; + +#if defined(UNX) +const sal_Char RTFOutFuncs::sNewLine = '\012'; +#else +const sal_Char __FAR_DATA RTFOutFuncs::sNewLine[] = "\015\012"; +#endif + + +SvStream& RTFOutFuncs::Out_Char(SvStream& rStream, sal_Unicode c, + int *pUCMode, rtl_TextEncoding eDestEnc, BOOL bWriteHelpFile) +{ + const sal_Char* pStr = 0; + switch (c) + { + case 0x1: + case 0x2: + // this are control character of our textattributes and will never be + // written + break; + case 0xA0: + rStream << "\\~"; + break; + case 0xAD: + rStream << "\\-"; + break; + case 0x2011: + rStream << "\\_"; + break; + case '\n': + pStr = OOO_STRING_SVTOOLS_RTF_LINE; + break; + case '\t': + pStr = OOO_STRING_SVTOOLS_RTF_TAB; + break; + default: + if(!bWriteHelpFile) + { + switch(c) + { + case 149: + pStr = OOO_STRING_SVTOOLS_RTF_BULLET; + break; + case 150: + pStr = OOO_STRING_SVTOOLS_RTF_ENDASH; + break; + case 151: + pStr = OOO_STRING_SVTOOLS_RTF_EMDASH; + break; + case 145: + pStr = OOO_STRING_SVTOOLS_RTF_LQUOTE; + break; + case 146: + pStr = OOO_STRING_SVTOOLS_RTF_RQUOTE; + break; + case 147: + pStr = OOO_STRING_SVTOOLS_RTF_LDBLQUOTE; + break; + case 148: + pStr = OOO_STRING_SVTOOLS_RTF_RDBLQUOTE; + break; + } + + if (pStr) + break; + } + + switch (c) + { + case '\\': + case '}': + case '{': + rStream << '\\' << (sal_Char)c; + break; + default: + if (c >= ' ' && c <= '~') + rStream << (sal_Char)c; + else + { + //If we can't convert to the dest encoding, or if + //its an uncommon multibyte sequence which most + //readers won't be able to handle correctly, then + //If we can't convert to the dest encoding, then + //export as unicode + OUString sBuf(&c, 1); + OString sConverted; + sal_uInt32 nFlags = + RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | + RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR; + bool bWriteAsUnicode = !(sBuf.convertToString(&sConverted, + eDestEnc, nFlags)) + || (RTL_TEXTENCODING_UTF8==eDestEnc); // #i43933# do not export UTF-8 chars in RTF; + if (bWriteAsUnicode) + { + sBuf.convertToString(&sConverted, + eDestEnc, OUSTRING_TO_OSTRING_CVTFLAGS); + } + const sal_Int32 nLen = sConverted.getLength(); + + if (bWriteAsUnicode && pUCMode) + { + // then write as unicode - character + if (*pUCMode != nLen) + { + rStream << "\\uc" << ByteString::CreateFromInt32(nLen).GetBuffer() << " "; // #i47831# add an additional whitespace, so that "document whitespaces" are not ignored.; + *pUCMode = nLen; + } + ByteString sNo(ByteString::CreateFromInt32(c)); + rStream << "\\u" << sNo.GetBuffer(); + } + + for (sal_Int32 nI = 0; nI < nLen; ++nI) + { + rStream << "\\'"; + Out_Hex(rStream, sConverted.getStr()[nI], 2); + } + } + break; + } + break; + } + + if (pStr) + rStream << pStr << ' '; + + return rStream; +} + +SvStream& RTFOutFuncs::Out_String( SvStream& rStream, const String& rStr, + rtl_TextEncoding eDestEnc, BOOL bWriteHelpFile) +{ + int nUCMode = 1; + for (xub_StrLen n = 0; n < rStr.Len(); ++n) + Out_Char(rStream, rStr.GetChar(n), &nUCMode, eDestEnc, bWriteHelpFile); + if (nUCMode != 1) + rStream << "\\uc1"<< " "; // #i47831# add an additional whitespace, so that "document whitespaces" are not ignored.; + return rStream; +} + +SvStream& RTFOutFuncs::Out_Fontname(SvStream& rStream, const String& rStr, + rtl_TextEncoding eDestEnc, BOOL bWriteHelpFile) +{ + //Fontnames in word have a quirk in that \uc and usage of ansi replacement + //chars after a \u don't work and in wordpad \u doesn't work, so we are + //left with forcing ansi characters only for fontnames + for (xub_StrLen n = 0; n < rStr.Len(); ++n) + Out_Char(rStream, rStr.GetChar(n), 0, eDestEnc, bWriteHelpFile); + return rStream; +} + +SvStream& RTFOutFuncs::Out_Hex( SvStream& rStream, ULONG nHex, BYTE nLen ) +{ + sal_Char aNToABuf[] = "0000000000000000"; + + DBG_ASSERT( nLen < sizeof(aNToABuf), "zu viele Stellen" ); + if( nLen >= sizeof(aNToABuf) ) + nLen = (sizeof(aNToABuf)-1); + + // Pointer an das Bufferende setzen + sal_Char* pStr = aNToABuf + (sizeof(aNToABuf)-1); + for( BYTE n = 0; n < nLen; ++n ) + { + *(--pStr) = (sal_Char)(nHex & 0xf ) + 48; + if( *pStr > '9' ) + *pStr += 39; + nHex >>= 4; + } + return rStream << pStr; +} + + + |