1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
25 #include <string_view>
27 #include <rtl/ref.hxx>
30 // Common macros ==============================================================
32 // items and item sets --------------------------------------------------------
34 /** Expands to the item (with type 'itemtype') with Which-ID 'which'. */
35 #define GETITEM( itemset, itemtype, which ) \
36 static_cast< const itemtype & >( (itemset).Get( which ) )
38 /** Expands to the value of the SfxBoolItem with Which-ID 'which'. */
39 #define GETITEMBOOL( itemset, which ) \
40 (static_cast<const SfxBoolItem &>( (itemset).Get( which )).GetValue() )
42 // Global static helpers ======================================================
44 // Value range limit helpers --------------------------------------------------
46 /** Returns the value, if it is not less than nMin, otherwise nMin. */
47 template< typename ReturnType
, typename Type
>
48 inline ReturnType
llimit_cast( Type nValue
, ReturnType nMin
)
49 { return static_cast< ReturnType
>( ::std::max
< Type
>( nValue
, nMin
) ); }
51 /** Returns the value, if it is not greater than nMax, otherwise nMax. */
52 template< typename ReturnType
, typename Type
>
53 inline ReturnType
ulimit_cast( Type nValue
, ReturnType nMax
)
54 { return static_cast< ReturnType
>( ::std::min
< Type
>( nValue
, nMax
) ); }
56 /** Returns the value, if it fits into ReturnType, otherwise the maximum value of ReturnType. */
57 template< typename ReturnType
, typename Type
>
58 inline ReturnType
ulimit_cast( Type nValue
)
59 { return ulimit_cast( nValue
, ::std::numeric_limits
< ReturnType
>::max() ); }
61 /** Returns the value, if it is not less than nMin and not greater than nMax, otherwise one of the limits. */
62 template< typename ReturnType
, typename Type
>
63 inline ReturnType
limit_cast( Type nValue
, ReturnType nMin
, ReturnType nMax
)
64 { return static_cast< ReturnType
>( ::std::clamp
< Type
>( nValue
, nMin
, nMax
) ); }
66 /** Returns the value, if it fits into ReturnType, otherwise one of the limits of ReturnType. */
67 template< typename ReturnType
, typename Type
>
68 inline ReturnType
limit_cast( Type nValue
)
69 { return limit_cast( nValue
, ::std::numeric_limits
< ReturnType
>::min(), ::std::numeric_limits
< ReturnType
>::max() ); }
71 // Read from bitfields --------------------------------------------------------
73 /** Returns true, if at least one of the bits set in nMask is set in nBitField. */
74 template< typename Type
>
75 inline bool get_flag( Type nBitField
, Type nMask
)
76 { return (nBitField
& nMask
) != 0; }
78 /** Returns nSet, if at least one bit of nMask is set in nBitField, otherwise nUnset. */
79 template< typename ReturnType
, typename Type
>
80 inline ReturnType
get_flagvalue( Type nBitField
, Type nMask
, ReturnType nSet
, ReturnType nUnset
)
81 { return ::get_flag( nBitField
, nMask
) ? nSet
: nUnset
; }
83 /** Extracts a value from a bit field.
84 @descr Returns in rnRet the data fragment from nBitField, that starts at bit nStartBit
85 (0-based, bit 0 is rightmost) with the width of nBitCount. rnRet will be right-aligned (normalized).
86 For instance: extract_value( n, 0x4321, 8, 4 ) stores 3 in n (value in bits 8-11). */
87 template< typename ReturnType
, typename Type
>
88 inline ReturnType
extract_value( Type nBitField
, sal_uInt8 nStartBit
, sal_uInt8 nBitCount
)
89 { return static_cast< ReturnType
>( ((1UL << nBitCount
) - 1) & (nBitField
>> nStartBit
) ); }
91 // Write to bitfields ---------------------------------------------------------
93 /** Sets or clears (according to bSet) all set bits of nMask in rnBitField. */
94 template< typename Type
>
95 inline void set_flag( Type
& rnBitField
, Type nMask
, bool bSet
= true )
96 { if( bSet
) rnBitField
|= nMask
; else rnBitField
&= ~nMask
; }
98 /** Inserts a value into a bitfield.
99 @descr Inserts the lower nBitCount bits of nValue into rnBitField, starting
100 there at bit nStartBit. Other contents of rnBitField keep unchanged. */
101 template< typename Type
, typename InsertType
>
102 void insert_value( Type
& rnBitField
, InsertType nValue
, sal_uInt8 nStartBit
, sal_uInt8 nBitCount
)
104 unsigned int nMask
= (1U << nBitCount
) - 1;
105 Type nNewValue
= static_cast< Type
>( nValue
& nMask
);
106 rnBitField
= (rnBitField
& ~(nMask
<< nStartBit
)) | (nNewValue
<< nStartBit
);
113 class ScStyleSheetPool
;
116 class SotStorageStream
;
118 /** Contains static methods used anywhere in the filters. */
122 /** We don't want anybody to instantiate this class, since it is just a
123 collection of static items. */
125 ScfTools(const ScfTools
&) = delete;
126 const ScfTools
& operator=(const ScfTools
&) = delete;
128 // *** common methods *** -----------------------------------------------------
130 /** Reads a 10-byte-long-double and converts it to double. */
131 static void ReadLongDouble(SvStream
& rStrm
, double& fResult
);
132 /** Returns system text encoding for byte string conversion. */
133 static rtl_TextEncoding
GetSystemTextEncoding();
134 /** Returns a string representing the hexadecimal value of nValue. */
135 static OUString
GetHexStr( sal_uInt16 nValue
);
137 /** Mixes RGB components with given transparence.
138 @param nTrans Foreground transparence (0x00 == full nFore ... 0x80 = full nBack). */
139 static sal_uInt8
GetMixedColorComp( sal_uInt8 nFore
, sal_uInt8 nBack
, sal_uInt8 nTrans
);
140 /** Mixes colors with given transparence.
141 @param nTrans Foreground transparence (0x00 == full rFore ... 0x80 = full rBack). */
142 static Color
GetMixedColor( const Color
& rFore
, const Color
& rBack
, sal_uInt8 nTrans
);
144 // *** conversion of names *** ------------------------------------------------
146 /** Converts a string to a valid Calc defined name or database range name.
147 @descr Defined names in Calc may contain letters, digits (*), underscores, periods (*),
148 colons (*), question marks, and dollar signs.
149 (*) = not allowed at first position. */
150 static OUString
ConvertToScDefinedName( const OUString
& rName
);
152 // *** streams and storages *** -----------------------------------------------
154 /** Tries to open an existing storage with the specified name in the passed storage (read-only). */
155 static rtl::Reference
<SotStorage
> OpenStorageRead( rtl::Reference
<SotStorage
> const & xStrg
, const OUString
& rStrgName
);
156 /** Creates and opens a storage with the specified name in the passed storage (read/write). */
157 static rtl::Reference
<SotStorage
> OpenStorageWrite( rtl::Reference
<SotStorage
> const & xStrg
, const OUString
& rStrgName
);
159 /** Tries to open an existing stream with the specified name in the passed storage (read-only). */
160 static rtl::Reference
<SotStorageStream
> OpenStorageStreamRead( rtl::Reference
<SotStorage
> const & xStrg
, const OUString
& rStrmName
);
161 /** Creates and opens a stream with the specified name in the passed storage (read/write). */
162 static rtl::Reference
<SotStorageStream
> OpenStorageStreamWrite( rtl::Reference
<SotStorage
> const & xStrg
, const OUString
& rStrmName
);
164 // *** item handling *** ------------------------------------------------------
166 /** Returns true, if the passed item set contains the item.
167 @param bDeep true = Searches in parent item sets too. */
168 static bool CheckItem( const SfxItemSet
& rItemSet
, sal_uInt16 nWhichId
, bool bDeep
);
169 /** Returns true, if the passed item set contains at least one of the items.
170 @param pnWhichIds Zero-terminated array of Which-IDs.
171 @param bDeep true = Searches in parent item sets too. */
172 static bool CheckItems( const SfxItemSet
& rItemSet
, const sal_uInt16
* pnWhichIds
, bool bDeep
);
174 /** Puts the item into the passed item set.
175 @descr The item will be put into the item set, if bSkipPoolDef is false,
176 or if the item differs from the default pool item.
177 @param rItemSet The destination item set.
178 @param rItem The item to put into the item set.
179 @param nWhichId The Which-ID to set with the item.
180 @param bSkipPoolDef true = Do not put item if it is equal to pool default; false = Always put the item. */
182 SfxItemSet
& rItemSet
, const SfxPoolItem
& rItem
,
183 sal_uInt16 nWhichId
, bool bSkipPoolDef
);
185 /** Puts the item into the passed item set.
186 @descr The item will be put into the item set, if bSkipPoolDef is false,
187 or if the item differs from the default pool item.
188 @param rItemSet The destination item set.
189 @param rItem The item to put into the item set.
190 @param bSkipPoolDef true = Do not put item if it is equal to pool default; false = Always put the item. */
191 static void PutItem( SfxItemSet
& rItemSet
, const SfxPoolItem
& rItem
, bool bSkipPoolDef
);
193 // *** style sheet handling *** -----------------------------------------------
195 /** Creates and returns a cell style sheet and inserts it into the pool.
196 @descr If the style sheet is already in the pool, another unused style name is used.
197 @param bForceName Controls behaviour, if the style already exists:
198 true = Old existing style will be renamed; false = New style gets another name. */
199 static ScStyleSheet
& MakeCellStyleSheet(
200 ScStyleSheetPool
& rPool
,
201 const OUString
& rStyleName
, bool bForceName
);
202 /** Creates and returns a page style sheet and inserts it into the pool.
203 @descr If the style sheet is already in the pool, another unused style name is used.
204 @param bForceName Controls behaviour, if the style already exists:
205 true = Old existing style will be renamed; false = New style gets another name. */
206 static ScStyleSheet
& MakePageStyleSheet(
207 ScStyleSheetPool
& rPool
,
208 const OUString
& rStyleName
, bool bForceName
);
210 // *** byte string import operations *** --------------------------------------
212 /** Reads and returns a zero terminated byte string and decreases a stream counter. */
213 static OString
read_zeroTerminated_uInt8s_ToOString(SvStream
& rStrm
, sal_Int32
& rnBytesLeft
);
214 /** Reads and returns a zero terminated byte string and decreases a stream counter. */
215 static OUString
read_zeroTerminated_uInt8s_ToOUString(SvStream
& rStrm
, sal_Int32
& rnBytesLeft
, rtl_TextEncoding eTextEnc
)
217 return OStringToOUString(read_zeroTerminated_uInt8s_ToOString(rStrm
, rnBytesLeft
), eTextEnc
);
220 /** Appends a zero terminated byte string. */
221 static void AppendCString( SvStream
& rStrm
, OUString
& rString
, rtl_TextEncoding eTextEnc
);
223 // *** HTML table names <-> named range names *** -----------------------------
225 /** Returns the built-in range name for an HTML document. */
226 static const OUString
& GetHTMLDocName();
227 /** Returns the built-in range name for all HTML tables. */
228 static const OUString
& GetHTMLTablesName();
229 /** Returns the built-in range name for an HTML table, specified by table index. */
230 static OUString
GetNameFromHTMLIndex( sal_uInt32 nIndex
);
231 /** Returns the built-in range name for an HTML table, specified by table name. */
232 static OUString
GetNameFromHTMLName( std::u16string_view rTabName
);
234 /** Returns true, if rSource is the built-in range name for an HTML document. */
235 static bool IsHTMLDocName( std::u16string_view rSource
);
236 /** Returns true, if rSource is the built-in range name for all HTML tables. */
237 static bool IsHTMLTablesName( std::u16string_view rSource
);
238 /** Converts a built-in range name to an HTML table name.
239 @param rSource The string to be determined.
240 @param rName The HTML table name.
241 @return true, if conversion was successful. */
242 static bool GetHTMLNameFromName( const OUString
& rSource
, OUString
& rName
);
245 /** Returns the prefix for table index names. */
246 static const OUString
& GetHTMLIndexPrefix();
247 /** Returns the prefix for table names. */
248 static const OUString
& GetHTMLNamePrefix();
251 // Containers =================================================================
253 typedef ::std::vector
< sal_uInt8
> ScfUInt8Vec
;
254 typedef ::std::vector
< sal_Int16
> ScfInt16Vec
;
255 typedef ::std::vector
< sal_uInt16
> ScfUInt16Vec
;
256 typedef ::std::vector
< sal_Int32
> ScfInt32Vec
;
257 typedef ::std::vector
< sal_uInt32
> ScfUInt32Vec
;
258 typedef ::std::vector
< OUString
> ScfStringVec
;
260 class ScFormatFilterPluginImpl
: public ScFormatFilterPlugin
263 ScFormatFilterPluginImpl();
264 virtual ~ScFormatFilterPluginImpl();
265 // various import filters
266 virtual ErrCode
ScImportLotus123( SfxMedium
&, ScDocument
&, rtl_TextEncoding eSrc
) override
;
267 virtual ErrCode
ScImportQuattroPro(SvStream
* pStream
, ScDocument
& rDoc
) override
;
268 virtual ErrCode
ScImportExcel( SfxMedium
&, ScDocument
*, const EXCIMPFORMAT
) override
;
269 // eFormat == EIF_AUTO -> matching filter is used automatically
270 // eFormat == EIF_BIFF5 -> only Biff5 stream leads to success (even in an Excel97 doc)
271 // eFormat == EIF_BIFF8 -> only Biff8 stream leads to success (only in Excel97 docs)
272 // eFormat == EIF_BIFF_LE4 -> only non-storage files _could_ lead to success
273 virtual ErrCode
ScImportDif( SvStream
&, ScDocument
*, const ScAddress
& rInsPos
,
274 const rtl_TextEncoding eSrc
) override
;
275 virtual ErrCode
ScImportRTF( SvStream
&, const OUString
& rBaseURL
, ScDocument
*, ScRange
& rRange
) override
;
276 virtual ErrCode
ScImportHTML( SvStream
&, const OUString
& rBaseURL
, ScDocument
*, ScRange
& rRange
,
277 double nOutputFactor
, bool bCalcWidthHeight
,
278 SvNumberFormatter
* pFormatter
, bool bConvertDate
, bool bConvertScientific
) override
;
280 virtual std::unique_ptr
<ScEEAbsImport
> CreateRTFImport( ScDocument
* pDoc
, const ScRange
& rRange
) override
;
281 virtual std::unique_ptr
<ScEEAbsImport
> CreateHTMLImport( ScDocument
* pDocP
, const OUString
& rBaseURL
, const ScRange
& rRange
) override
;
282 virtual OUString
GetHTMLRangeNameList( ScDocument
& rDoc
, const OUString
& rOrigName
) override
;
284 // various export filters
285 virtual ErrCode
ScExportExcel5( SfxMedium
&, ScDocument
*, ExportFormatExcel eFormat
, rtl_TextEncoding eDest
) override
;
286 virtual void ScExportDif( SvStream
&, ScDocument
*, const ScAddress
& rOutPos
, const rtl_TextEncoding eDest
) override
;
287 virtual void ScExportDif( SvStream
&, ScDocument
*, const ScRange
& rRange
, const rtl_TextEncoding eDest
) override
;
288 virtual void ScExportHTML( SvStream
&, const OUString
& rBaseURL
, ScDocument
*, const ScRange
& rRange
, const rtl_TextEncoding eDest
, bool bAll
,
289 const OUString
& rStreamPath
, OUString
& rNonConvertibleChars
, const OUString
& rFilterOptions
) override
;
290 virtual void ScExportRTF( SvStream
&, ScDocument
*, const ScRange
& rRange
, const rtl_TextEncoding eDest
) override
;
292 virtual ScOrcusFilters
* GetOrcusFilters() override
;
295 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */