LibreOffice Module sc (master)  1
ftools.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
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/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
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 .
18  */
19 
20 #pragma once
21 
22 #include <algorithm>
23 #include <vector>
24 #include <limits>
25 #include <string_view>
26 
27 #include <tools/ref.hxx>
28 #include <filter.hxx>
29 
30 // Common macros ==============================================================
31 
32 // items and item sets --------------------------------------------------------
33 
35 #define GETITEM( itemset, itemtype, which ) \
36  static_cast< const itemtype & >( (itemset).Get( which ) )
37 
39 #define GETITEMBOOL( itemset, which ) \
40  (static_cast<const SfxBoolItem &>( (itemset).Get( which )).GetValue() )
41 
42 // Global static helpers ======================================================
43 
44 // Value range limit helpers --------------------------------------------------
45 
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 ) ); }
50 
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 ) ); }
55 
57 template< typename ReturnType, typename Type >
58 inline ReturnType ulimit_cast( Type nValue )
59 { return ulimit_cast( nValue, ::std::numeric_limits< ReturnType >::max() ); }
60 
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 ) ); }
65 
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() ); }
70 
71 // Read from bitfields --------------------------------------------------------
72 
74 template< typename Type >
75 inline bool get_flag( Type nBitField, Type nMask )
76 { return (nBitField & nMask) != 0; }
77 
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; }
82 
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) ); }
90 
91 // Write to bitfields ---------------------------------------------------------
92 
94 template< typename Type >
95 inline void set_flag( Type& rnBitField, Type nMask, bool bSet = true )
96 { if( bSet ) rnBitField |= nMask; else rnBitField &= ~nMask; }
97 
101 template< typename Type, typename InsertType >
102 void insert_value( Type& rnBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount )
103 {
104  unsigned int nMask = (1U << nBitCount) - 1;
105  Type nNewValue = static_cast< Type >( nValue & nMask );
106  rnBitField = (rnBitField & ~(nMask << nStartBit)) | (nNewValue << nStartBit);
107 }
108 
109 class Color;
110 class SfxPoolItem;
111 class SfxItemSet;
112 class ScStyleSheet;
113 class ScStyleSheetPool;
114 class SvStream;
115 class SotStorage;
116 class SotStorageStream;
117 
119 class ScfTools
120 {
121 public:
124  ScfTools() = delete;
125  ScfTools(const ScfTools&) = delete;
126  const ScfTools& operator=(const ScfTools&) = delete;
127 
128 // *** common methods *** -----------------------------------------------------
129 
131  static void ReadLongDouble(SvStream& rStrm, double& fResult);
133  static rtl_TextEncoding GetSystemTextEncoding();
135  static OUString GetHexStr( sal_uInt16 nValue );
136 
139  static sal_uInt8 GetMixedColorComp( sal_uInt8 nFore, sal_uInt8 nBack, sal_uInt8 nTrans );
142  static Color GetMixedColor( const Color& rFore, const Color& rBack, sal_uInt8 nTrans );
143 
144 // *** conversion of names *** ------------------------------------------------
145 
150  static OUString ConvertToScDefinedName( const OUString& rName );
151 
152 // *** streams and storages *** -----------------------------------------------
153 
155  static tools::SvRef<SotStorage> OpenStorageRead( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrgName );
157  static tools::SvRef<SotStorage> OpenStorageWrite( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrgName );
158 
160  static tools::SvRef<SotStorageStream> OpenStorageStreamRead( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrmName );
162  static tools::SvRef<SotStorageStream> OpenStorageStreamWrite( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrmName );
163 
164 // *** item handling *** ------------------------------------------------------
165 
168  static bool CheckItem( const SfxItemSet& rItemSet, sal_uInt16 nWhichId, bool bDeep );
172  static bool CheckItems( const SfxItemSet& rItemSet, const sal_uInt16* pnWhichIds, bool bDeep );
173 
181  static void PutItem(
182  SfxItemSet& rItemSet, const SfxPoolItem& rItem,
183  sal_uInt16 nWhichId, bool bSkipPoolDef );
184 
191  static void PutItem( SfxItemSet& rItemSet, const SfxPoolItem& rItem, bool bSkipPoolDef );
192 
193 // *** style sheet handling *** -----------------------------------------------
194 
200  ScStyleSheetPool& rPool,
201  const OUString& rStyleName, bool bForceName );
207  ScStyleSheetPool& rPool,
208  const OUString& rStyleName, bool bForceName );
209 
210 // *** byte string import operations *** --------------------------------------
211 
213  static OString read_zeroTerminated_uInt8s_ToOString(SvStream& rStrm, sal_Int32& rnBytesLeft);
215  static OUString read_zeroTerminated_uInt8s_ToOUString(SvStream& rStrm, sal_Int32& rnBytesLeft, rtl_TextEncoding eTextEnc)
216  {
217  return OStringToOUString(read_zeroTerminated_uInt8s_ToOString(rStrm, rnBytesLeft), eTextEnc);
218  }
219 
221  static void AppendCString( SvStream& rStrm, OUString& rString, rtl_TextEncoding eTextEnc );
222 
223 // *** HTML table names <-> named range names *** -----------------------------
224 
226  static const OUString& GetHTMLDocName();
228  static const OUString& GetHTMLTablesName();
230  static OUString GetNameFromHTMLIndex( sal_uInt32 nIndex );
232  static OUString GetNameFromHTMLName( std::u16string_view rTabName );
233 
235  static bool IsHTMLDocName( const OUString& rSource );
237  static bool IsHTMLTablesName( const OUString& rSource );
242  static bool GetHTMLNameFromName( const OUString& rSource, OUString& rName );
243 
244 private:
246  static const OUString& GetHTMLIndexPrefix();
248  static const OUString& GetHTMLNamePrefix();
249 };
250 
251 // Containers =================================================================
252 
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;
259 
261 {
262 public:
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 ) override;
279 
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;
283 
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;
291 
292  virtual ScOrcusFilters* GetOrcusFilters() override;
293 };
294 
295 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Type
static void ReadLongDouble(SvStream &rStrm, double &fResult)
Reads a 10-byte-long-double and converts it to double.
Definition: ftools.cxx:41
static void AppendCString(SvStream &rStrm, OUString &rString, rtl_TextEncoding eTextEnc)
Appends a zero terminated byte string.
Definition: ftools.cxx:277
::std::vector< sal_uInt8 > ScfUInt8Vec
Definition: ftools.hxx:253
static bool GetHTMLNameFromName(const OUString &rSource, OUString &rName)
Converts a built-in range name to an HTML table name.
Definition: ftools.cxx:331
static bool CheckItem(const SfxItemSet &rItemSet, sal_uInt16 nWhichId, bool bDeep)
Returns true, if the passed item set contains the item.
Definition: ftools.cxx:199
ReturnType get_flagvalue(Type nBitField, Type nMask, ReturnType nSet, ReturnType nUnset)
Returns nSet, if at least one bit of nMask is set in nBitField, otherwise nUnset. ...
Definition: ftools.hxx:80
Collection of orcus filter wrappers.
static bool IsHTMLTablesName(const OUString &rSource)
Returns true, if rSource is the built-in range name for all HTML tables.
Definition: ftools.cxx:326
virtual ErrCode ScImportRTF(SvStream &, const OUString &rBaseURL, ScDocument *, ScRange &rRange) override
Definition: rtfimp.cxx:26
virtual ErrCode ScExportExcel5(SfxMedium &, ScDocument *, ExportFormatExcel eFormat, rtl_TextEncoding eDest) override
Definition: excel.cxx:398
static tools::SvRef< SotStorageStream > OpenStorageStreamWrite(tools::SvRef< SotStorage > const &xStrg, const OUString &rStrmName)
Creates and opens a stream with the specified name in the passed storage (read/write).
Definition: ftools.cxx:188
static OUString ConvertToScDefinedName(const OUString &rName)
Converts a string to a valid Calc defined name or database range name.
Definition: ftools.cxx:148
static bool IsHTMLDocName(const OUString &rSource)
Returns true, if rSource is the built-in range name for an HTML document.
Definition: ftools.cxx:321
virtual void ScExportDif(SvStream &, ScDocument *, const ScAddress &rOutPos, const rtl_TextEncoding eDest) override
Definition: difexp.cxx:35
void set_flag(Type &rnBitField, Type nMask, bool bSet=true)
Sets or clears (according to bSet) all set bits of nMask in rnBitField.
Definition: ftools.hxx:95
static OUString GetHexStr(sal_uInt16 nValue)
Returns a string representing the hexadecimal value of nValue.
Definition: ftools.cxx:120
virtual ErrCode ScImportQuattroPro(SvStream *pStream, ScDocument &rDoc) override
Definition: qpro.cxx:145
virtual void ScExportRTF(SvStream &, ScDocument *, const ScRange &rRange, const rtl_TextEncoding eDest) override
Definition: rtfexp.cxx:39
ReturnType limit_cast(Type nValue, ReturnType nMin, ReturnType nMax)
Returns the value, if it is not less than nMin and not greater than nMax, otherwise one of the limits...
Definition: ftools.hxx:63
static tools::SvRef< SotStorage > OpenStorageWrite(tools::SvRef< SotStorage > const &xStrg, const OUString &rStrgName)
Creates and opens a storage with the specified name in the passed storage (read/write).
Definition: ftools.cxx:172
static OUString read_zeroTerminated_uInt8s_ToOUString(SvStream &rStrm, sal_Int32 &rnBytesLeft, rtl_TextEncoding eTextEnc)
Reads and returns a zero terminated byte string and decreases a stream counter.
Definition: ftools.hxx:215
virtual ErrCode ScImportDif(SvStream &, ScDocument *, const ScAddress &rInsPos, const rtl_TextEncoding eSrc) override
Definition: difimp.cxx:49
static ScStyleSheet & MakePageStyleSheet(ScStyleSheetPool &rPool, const OUString &rStyleName, bool bForceName)
Creates and returns a page style sheet and inserts it into the pool.
Definition: ftools.cxx:261
static const OUString & GetHTMLTablesName()
Returns the built-in range name for all HTML tables.
Definition: ftools.cxx:290
ReturnType ulimit_cast(Type nValue, ReturnType nMax)
Returns the value, if it is not greater than nMax, otherwise nMax.
Definition: ftools.hxx:53
ScfTools()=delete
We don't want anybody to instantiate this class, since it is just a collection of static items...
Contains static methods used anywhere in the filters.
Definition: ftools.hxx:119
static OUString GetNameFromHTMLIndex(sal_uInt32 nIndex)
Returns the built-in range name for an HTML table, specified by table index.
Definition: ftools.cxx:309
static tools::SvRef< SotStorage > OpenStorageRead(tools::SvRef< SotStorage > const &xStrg, const OUString &rStrgName)
Tries to open an existing storage with the specified name in the passed storage (read-only).
Definition: ftools.cxx:164
static Color GetMixedColor(const Color &rFore, const Color &rBack, sal_uInt8 nTrans)
Mixes colors with given transparence.
Definition: ftools.cxx:136
virtual ScOrcusFilters * GetOrcusFilters() override
Definition: ftools.cxx:351
ReturnType extract_value(Type nBitField, sal_uInt8 nStartBit, sal_uInt8 nBitCount)
Extracts a value from a bit field.
Definition: ftools.hxx:88
static void PutItem(SfxItemSet &rItemSet, const SfxPoolItem &rItem, sal_uInt16 nWhichId, bool bSkipPoolDef)
Puts the item into the passed item set.
Definition: ftools.cxx:213
virtual std::unique_ptr< ScEEAbsImport > CreateRTFImport(ScDocument *pDoc, const ScRange &rRange) override
Definition: rtfimp.cxx:36
const ScfTools & operator=(const ScfTools &)=delete
static sal_uInt8 GetMixedColorComp(sal_uInt8 nFore, sal_uInt8 nBack, sal_uInt8 nTrans)
Mixes RGB components with given transparence.
Definition: ftools.cxx:130
static bool CheckItems(const SfxItemSet &rItemSet, const sal_uInt16 *pnWhichIds, bool bDeep)
Returns true, if the passed item set contains at least one of the items.
Definition: ftools.cxx:204
static const OUString & GetHTMLDocName()
Returns the built-in range name for an HTML document.
Definition: ftools.cxx:284
bool get_flag(Type nBitField, Type nMask)
Returns true, if at least one of the bits set in nMask is set in nBitField.
Definition: ftools.hxx:75
virtual std::unique_ptr< ScEEAbsImport > CreateHTMLImport(ScDocument *pDocP, const OUString &rBaseURL, const ScRange &rRange) override
Definition: htmlimp.cxx:57
static tools::SvRef< SotStorageStream > OpenStorageStreamRead(tools::SvRef< SotStorage > const &xStrg, const OUString &rStrmName)
Tries to open an existing stream with the specified name in the passed storage (read-only).
Definition: ftools.cxx:180
ReturnType llimit_cast(Type nValue, ReturnType nMin)
Returns the value, if it is not less than nMin, otherwise nMin.
Definition: ftools.hxx:48
virtual void ScExportHTML(SvStream &, const OUString &rBaseURL, ScDocument *, const ScRange &rRange, const rtl_TextEncoding eDest, bool bAll, const OUString &rStreamPath, OUString &rNonConvertibleChars, const OUString &rFilterOptions) override
Definition: htmlexp.cxx:130
ExportFormatExcel
Definition: filter.hxx:42
virtual ~ScFormatFilterPluginImpl()
Definition: ftools.cxx:349
::std::vector< sal_uInt32 > ScfUInt32Vec
Definition: ftools.hxx:257
::std::vector< sal_uInt16 > ScfUInt16Vec
Definition: ftools.hxx:255
unsigned char sal_uInt8
virtual ErrCode ScImportLotus123(SfxMedium &, ScDocument &, rtl_TextEncoding eSrc) override
Definition: lotus.cxx:31
EXCIMPFORMAT
Definition: filter.hxx:39
static const OUString & GetHTMLNamePrefix()
Returns the prefix for table names.
Definition: ftools.cxx:303
void insert_value(Type &rnBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount)
Inserts a value into a bitfield.
Definition: ftools.hxx:102
virtual OUString GetHTMLRangeNameList(ScDocument &rDoc, const OUString &rOrigName) override
Definition: htmlimp.cxx:198
virtual ErrCode ScImportHTML(SvStream &, const OUString &rBaseURL, ScDocument *, ScRange &rRange, double nOutputFactor, bool bCalcWidthHeight, SvNumberFormatter *pFormatter, bool bConvertDate) override
Definition: htmlimp.cxx:45
static OUString GetNameFromHTMLName(std::u16string_view rTabName)
Returns the built-in range name for an HTML table, specified by table name.
Definition: ftools.cxx:316
::std::vector< sal_Int32 > ScfInt32Vec
Definition: ftools.hxx:256
::std::vector< sal_Int16 > ScfInt16Vec
Definition: ftools.hxx:254
static ScStyleSheet & MakeCellStyleSheet(ScStyleSheetPool &rPool, const OUString &rStyleName, bool bForceName)
Creates and returns a cell style sheet and inserts it into the pool.
Definition: ftools.cxx:256
void SvStream & rStrm
virtual ErrCode ScImportExcel(SfxMedium &, ScDocument *, const EXCIMPFORMAT) override
Definition: excel.cxx:144
::std::vector< OUString > ScfStringVec
Definition: ftools.hxx:258
static rtl_TextEncoding GetSystemTextEncoding()
Returns system text encoding for byte string conversion.
Definition: ftools.cxx:115
static OString read_zeroTerminated_uInt8s_ToOString(SvStream &rStrm, sal_Int32 &rnBytesLeft)
Reads and returns a zero terminated byte string and decreases a stream counter.
Definition: ftools.cxx:268
sal_Int16 nValue
static const OUString & GetHTMLIndexPrefix()
Returns the prefix for table index names.
Definition: ftools.cxx:296