25#include <rtl/textenc.h>
26#include <rtl/tencinfo.h>
28#include <com/sun/star/io/IOException.hpp>
29#include <com/sun/star/io/XTextOutputStream2.hpp>
30#include <com/sun/star/lang/XServiceInfo.hpp>
35using namespace ::
cppu;
44class OTextOutputStream :
public WeakImplHelper< XTextOutputStream2, XServiceInfo >
46 Reference< XOutputStream > mxStream;
49 bool mbEncodingInitialized;
50 rtl_UnicodeToTextConverter mConvUnicode2Text;
51 rtl_UnicodeToTextContext mContextUnicode2Text;
53 Sequence<sal_Int8> implConvert(
const OUString& rSource );
55 void checkOutputStream()
const;
59 virtual ~OTextOutputStream()
override;
62 virtual void SAL_CALL
writeString(
const OUString& aString )
override;
63 virtual void SAL_CALL setEncoding(
const OUString& Encoding )
override;
67 virtual void SAL_CALL flush( )
override;
68 virtual void SAL_CALL closeOutput( )
override;
71 virtual void SAL_CALL setOutputStream(
const Reference< XOutputStream >& aStream )
override;
72 virtual Reference< XOutputStream > SAL_CALL
getOutputStream( )
override;
82OTextOutputStream::OTextOutputStream()
83 : mbEncodingInitialized(false)
84 , mConvUnicode2Text(nullptr)
85 , mContextUnicode2Text(nullptr)
89OTextOutputStream::~OTextOutputStream()
91 if( mbEncodingInitialized )
93 rtl_destroyUnicodeToTextContext( mConvUnicode2Text, mContextUnicode2Text );
94 rtl_destroyUnicodeToTextConverter( mConvUnicode2Text );
98Sequence<sal_Int8> OTextOutputStream::implConvert(
const OUString& rSource )
101 sal_Int32 nSourceSize = rSource.getLength();
103 sal_Size nTargetCount = 0;
104 sal_Size nSourceCount = 0;
107 sal_Size nSrcCvtChars;
112 sal_Int32 nSeqSize = nSourceSize * 3;
114 Sequence<sal_Int8> seqText( nSeqSize );
115 char *pTarget =
reinterpret_cast<char *
>(seqText.getArray());
118 nTargetCount += rtl_convertUnicodeToText(
120 mContextUnicode2Text,
121 &( puSource[nSourceCount] ),
122 nSourceSize - nSourceCount ,
123 &( pTarget[nTargetCount] ),
124 nSeqSize - nTargetCount,
125 RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |
126 RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT ,
129 nSourceCount += nSrcCvtChars;
131 if( uiInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL )
134 seqText.realloc( nSeqSize );
135 pTarget =
reinterpret_cast<char*
>(seqText.getArray());
142 seqText.realloc( nTargetCount );
149void OTextOutputStream::writeString(
const OUString& aString )
152 if( !mbEncodingInitialized )
154 setEncoding(
"utf8" );
156 if( !mbEncodingInitialized )
159 Sequence<sal_Int8> aByteSeq = implConvert( aString );
160 mxStream->writeBytes( aByteSeq );
163void OTextOutputStream::setEncoding(
const OUString& Encoding )
165 OString aOEncodingStr =
OUStringToOString( Encoding, RTL_TEXTENCODING_ASCII_US );
166 rtl_TextEncoding encoding = rtl_getTextEncodingFromMimeCharset( aOEncodingStr.getStr() );
167 if( RTL_TEXTENCODING_DONTKNOW == encoding )
170 mbEncodingInitialized =
true;
171 mConvUnicode2Text = rtl_createUnicodeToTextConverter( encoding );
172 mContextUnicode2Text = rtl_createUnicodeToTextContext( mConvUnicode2Text );
180 mxStream->writeBytes( aData );
183void OTextOutputStream::flush( )
189void OTextOutputStream::closeOutput( )
192 mxStream->closeOutput();
196void OTextOutputStream::checkOutputStream()
const
198 if (! mxStream.is() )
199 throw IOException(
"output stream is not initialized, you have to use setOutputStream first");
205void OTextOutputStream::setOutputStream(
const Reference< XOutputStream >& aStream )
210Reference< XOutputStream > OTextOutputStream::getOutputStream()
215OUString OTextOutputStream::getImplementationName()
217 return "com.sun.star.comp.io.TextOutputStream";
220sal_Bool OTextOutputStream::supportsService(
const OUString& ServiceName)
225Sequence< OUString > OTextOutputStream::getSupportedServiceNames()
227 return {
"com.sun.star.io.TextOutputStream" };
232extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
234 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
236 return cppu::acquire(
new OTextOutputStream());
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * io_OTextOutputStream_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
bool getOutputStream(ProgramOptions const &options, OString const &extension, std::ostream **ppOutputStream, OString &targetSourceFileName, OString &tmpSourceFileName)
sal_uInt32 writeString(sal_uInt8 *buffer, const sal_Unicode *v)