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 #ifndef INCLUDED_SC_SOURCE_FILTER_INC_FTOOLS_HXX
21 #define INCLUDED_SC_SOURCE_FILTER_INC_FTOOLS_HXX
22 
23 #include <vector>
24 #include <limits>
25 #include <tools/ref.hxx>
26 #include <filter.hxx>
27 
28 // Common macros ==============================================================
29 
30 // items and item sets --------------------------------------------------------
31 
33 #define GETITEM( itemset, itemtype, which ) \
34  static_cast< const itemtype & >( (itemset).Get( which ) )
35 
37 #define GETITEMBOOL( itemset, which ) \
38  (static_cast<const SfxBoolItem &>( (itemset).Get( which )).GetValue() )
39 
40 // Global static helpers ======================================================
41 
42 // Value range limit helpers --------------------------------------------------
43 
45 template< typename ReturnType, typename Type >
46 inline ReturnType llimit_cast( Type nValue, ReturnType nMin )
47 { return static_cast< ReturnType >( ::std::max< Type >( nValue, nMin ) ); }
48 
50 template< typename ReturnType, typename Type >
51 inline ReturnType ulimit_cast( Type nValue, ReturnType nMax )
52 { return static_cast< ReturnType >( ::std::min< Type >( nValue, nMax ) ); }
53 
55 template< typename ReturnType, typename Type >
56 inline ReturnType ulimit_cast( Type nValue )
57 { return ulimit_cast( nValue, ::std::numeric_limits< ReturnType >::max() ); }
58 
60 template< typename ReturnType, typename Type >
61 inline ReturnType limit_cast( Type nValue, ReturnType nMin, ReturnType nMax )
62 { return static_cast< ReturnType >( ::std::max< Type >( ::std::min< Type >( nValue, nMax ), nMin ) ); }
63 
65 template< typename ReturnType, typename Type >
66 inline ReturnType limit_cast( Type nValue )
67 { return limit_cast( nValue, ::std::numeric_limits< ReturnType >::min(), ::std::numeric_limits< ReturnType >::max() ); }
68 
69 // Read from bitfields --------------------------------------------------------
70 
72 template< typename Type >
73 inline bool get_flag( Type nBitField, Type nMask )
74 { return (nBitField & nMask) != 0; }
75 
77 template< typename ReturnType, typename Type >
78 inline ReturnType get_flagvalue( Type nBitField, Type nMask, ReturnType nSet, ReturnType nUnset )
79 { return ::get_flag( nBitField, nMask ) ? nSet : nUnset; }
80 
85 template< typename ReturnType, typename Type >
86 inline ReturnType extract_value( Type nBitField, sal_uInt8 nStartBit, sal_uInt8 nBitCount )
87 { return static_cast< ReturnType >( ((1UL << nBitCount) - 1) & (nBitField >> nStartBit) ); }
88 
89 // Write to bitfields ---------------------------------------------------------
90 
92 template< typename Type >
93 inline void set_flag( Type& rnBitField, Type nMask, bool bSet = true )
94 { if( bSet ) rnBitField |= nMask; else rnBitField &= ~nMask; }
95 
99 template< typename Type, typename InsertType >
100 void insert_value( Type& rnBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount )
101 {
102  unsigned int nMask = (1U << nBitCount) - 1;
103  Type nNewValue = static_cast< Type >( nValue & nMask );
104  rnBitField = (rnBitField & ~(nMask << nStartBit)) | (nNewValue << nStartBit);
105 }
106 
107 class Color;
108 class SfxPoolItem;
109 class SfxItemSet;
110 class ScStyleSheet;
111 class ScStyleSheetPool;
112 class SvStream;
113 class SotStorage;
114 class SotStorageStream;
115 
117 class ScfTools
118 {
119 public:
122  ScfTools() = delete;
123  ScfTools(const ScfTools&) = delete;
124  const ScfTools& operator=(const ScfTools&) = delete;
125 
126 // *** common methods *** -----------------------------------------------------
127 
129  static double ReadLongDouble( SvStream& rStrm );
131  static rtl_TextEncoding GetSystemTextEncoding();
133  static OUString GetHexStr( sal_uInt16 nValue );
134 
137  static sal_uInt8 GetMixedColorComp( sal_uInt8 nFore, sal_uInt8 nBack, sal_uInt8 nTrans );
140  static Color GetMixedColor( const Color& rFore, const Color& rBack, sal_uInt8 nTrans );
141 
142 // *** conversion of names *** ------------------------------------------------
143 
148  static OUString ConvertToScDefinedName( const OUString& rName );
149 
150 // *** streams and storages *** -----------------------------------------------
151 
153  static tools::SvRef<SotStorage> OpenStorageRead( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrgName );
155  static tools::SvRef<SotStorage> OpenStorageWrite( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrgName );
156 
158  static tools::SvRef<SotStorageStream> OpenStorageStreamRead( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrmName );
160  static tools::SvRef<SotStorageStream> OpenStorageStreamWrite( tools::SvRef<SotStorage> const & xStrg, const OUString& rStrmName );
161 
162 // *** item handling *** ------------------------------------------------------
163 
166  static bool CheckItem( const SfxItemSet& rItemSet, sal_uInt16 nWhichId, bool bDeep );
170  static bool CheckItems( const SfxItemSet& rItemSet, const sal_uInt16* pnWhichIds, bool bDeep );
171 
179  static void PutItem(
180  SfxItemSet& rItemSet, const SfxPoolItem& rItem,
181  sal_uInt16 nWhichId, bool bSkipPoolDef );
182 
189  static void PutItem( SfxItemSet& rItemSet, const SfxPoolItem& rItem, bool bSkipPoolDef );
190 
191 // *** style sheet handling *** -----------------------------------------------
192 
198  ScStyleSheetPool& rPool,
199  const OUString& rStyleName, bool bForceName );
205  ScStyleSheetPool& rPool,
206  const OUString& rStyleName, bool bForceName );
207 
208 // *** byte string import operations *** --------------------------------------
209 
211  static OString read_zeroTerminated_uInt8s_ToOString(SvStream& rStrm, sal_Int32& rnBytesLeft);
213  static OUString read_zeroTerminated_uInt8s_ToOUString(SvStream& rStrm, sal_Int32& rnBytesLeft, rtl_TextEncoding eTextEnc)
214  {
215  return OStringToOUString(read_zeroTerminated_uInt8s_ToOString(rStrm, rnBytesLeft), eTextEnc);
216  }
217 
219  static void AppendCString( SvStream& rStrm, OUString& rString, rtl_TextEncoding eTextEnc );
220 
221 // *** HTML table names <-> named range names *** -----------------------------
222 
224  static const OUString& GetHTMLDocName();
226  static const OUString& GetHTMLTablesName();
228  static OUString GetNameFromHTMLIndex( sal_uInt32 nIndex );
230  static OUString GetNameFromHTMLName( const OUString& rTabName );
231 
233  static bool IsHTMLDocName( const OUString& rSource );
235  static bool IsHTMLTablesName( const OUString& rSource );
240  static bool GetHTMLNameFromName( const OUString& rSource, OUString& rName );
241 
242 private:
244  static const OUString& GetHTMLIndexPrefix();
246  static const OUString& GetHTMLNamePrefix();
247 };
248 
249 // Containers =================================================================
250 
251 typedef ::std::vector< sal_uInt8 > ScfUInt8Vec;
252 typedef ::std::vector< sal_Int16 > ScfInt16Vec;
253 typedef ::std::vector< sal_uInt16 > ScfUInt16Vec;
254 typedef ::std::vector< sal_Int32 > ScfInt32Vec;
255 typedef ::std::vector< sal_uInt32 > ScfUInt32Vec;
256 typedef ::std::vector< OUString > ScfStringVec;
257 
259 {
260 public:
262  virtual ~ScFormatFilterPluginImpl();
263  // various import filters
264  virtual ErrCode ScImportLotus123( SfxMedium&, ScDocument*, rtl_TextEncoding eSrc ) override;
265  virtual ErrCode ScImportQuattroPro(SvStream* pStream, ScDocument *pDoc) override;
266  virtual ErrCode ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ) override;
267  // eFormat == EIF_AUTO -> matching filter is used automatically
268  // eFormat == EIF_BIFF5 -> only Biff5 stream leads to success (even in an Excel97 doc)
269  // eFormat == EIF_BIFF8 -> only Biff8 stream leads to success (only in Excel97 docs)
270  // eFormat == EIF_BIFF_LE4 -> only non-storage files _could_ lead to success
271  virtual ErrCode ScImportDif( SvStream&, ScDocument*, const ScAddress& rInsPos,
272  const rtl_TextEncoding eSrc ) override;
273  virtual ErrCode ScImportRTF( SvStream&, const OUString& rBaseURL, ScDocument*, ScRange& rRange ) override;
274  virtual ErrCode ScImportHTML( SvStream&, const OUString& rBaseURL, ScDocument*, ScRange& rRange,
275  double nOutputFactor, bool bCalcWidthHeight,
276  SvNumberFormatter* pFormatter, bool bConvertDate ) override;
277 
278  virtual std::unique_ptr<ScEEAbsImport> CreateRTFImport( ScDocument* pDoc, const ScRange& rRange ) override;
279  virtual std::unique_ptr<ScEEAbsImport> CreateHTMLImport( ScDocument* pDocP, const OUString& rBaseURL, const ScRange& rRange ) override;
280  virtual OUString GetHTMLRangeNameList( ScDocument* pDoc, const OUString& rOrigName ) override;
281 
282  // various export filters
283  virtual ErrCode ScExportExcel5( SfxMedium&, ScDocument*, ExportFormatExcel eFormat, rtl_TextEncoding eDest ) override;
284  virtual void ScExportDif( SvStream&, ScDocument*, const ScAddress& rOutPos, const rtl_TextEncoding eDest ) override;
285  virtual void ScExportDif( SvStream&, ScDocument*, const ScRange& rRange, const rtl_TextEncoding eDest ) override;
286  virtual void ScExportHTML( SvStream&, const OUString& rBaseURL, ScDocument*, const ScRange& rRange, const rtl_TextEncoding eDest, bool bAll,
287  const OUString& rStreamPath, OUString& rNonConvertibleChars, const OUString& rFilterOptions ) override;
288  virtual void ScExportRTF( SvStream&, ScDocument*, const ScRange& rRange, const rtl_TextEncoding eDest ) override;
289 
290  virtual ScOrcusFilters* GetOrcusFilters() override;
291 };
292 
293 #endif
294 
295 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
static double ReadLongDouble(SvStream &rStrm)
Reads a 10-byte-long-double and converts it to double.
Definition: ftools.cxx:42
Type
static void AppendCString(SvStream &rStrm, OUString &rString, rtl_TextEncoding eTextEnc)
Appends a zero terminated byte string.
Definition: ftools.cxx:274
::std::vector< sal_uInt8 > ScfUInt8Vec
Definition: ftools.hxx:251
static bool GetHTMLNameFromName(const OUString &rSource, OUString &rName)
Converts a built-in range name to an HTML table name.
Definition: ftools.cxx:328
static bool CheckItem(const SfxItemSet &rItemSet, sal_uInt16 nWhichId, bool bDeep)
Returns true, if the passed item set contains the item.
Definition: ftools.cxx:196
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:78
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:323
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:185
static OUString ConvertToScDefinedName(const OUString &rName)
Converts a string to a valid Calc defined name or database range name.
Definition: ftools.cxx:145
static bool IsHTMLDocName(const OUString &rSource)
Returns true, if rSource is the built-in range name for an HTML document.
Definition: ftools.cxx:318
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:93
static OUString GetHexStr(sal_uInt16 nValue)
Returns a string representing the hexadecimal value of nValue.
Definition: ftools.cxx:117
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:61
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:169
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:213
virtual ErrCode ScImportDif(SvStream &, ScDocument *, const ScAddress &rInsPos, const rtl_TextEncoding eSrc) override
Definition: difimp.cxx:48
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:258
static const OUString & GetHTMLTablesName()
Returns the built-in range name for all HTML tables.
Definition: ftools.cxx:287
ReturnType ulimit_cast(Type nValue, ReturnType nMax)
Returns the value, if it is not greater than nMax, otherwise nMax.
Definition: ftools.hxx:51
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:117
static OUString GetNameFromHTMLIndex(sal_uInt32 nIndex)
Returns the built-in range name for an HTML table, specified by table index.
Definition: ftools.cxx:306
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:161
static Color GetMixedColor(const Color &rFore, const Color &rBack, sal_uInt8 nTrans)
Mixes colors with given transparence.
Definition: ftools.cxx:133
virtual OUString GetHTMLRangeNameList(ScDocument *pDoc, const OUString &rOrigName) override
Definition: htmlimp.cxx:195
virtual ErrCode ScImportQuattroPro(SvStream *pStream, ScDocument *pDoc) override
Definition: qpro.cxx:130
virtual ScOrcusFilters * GetOrcusFilters() override
Definition: ftools.cxx:348
ReturnType extract_value(Type nBitField, sal_uInt8 nStartBit, sal_uInt8 nBitCount)
Extracts a value from a bit field.
Definition: ftools.hxx:86
static void PutItem(SfxItemSet &rItemSet, const SfxPoolItem &rItem, sal_uInt16 nWhichId, bool bSkipPoolDef)
Puts the item into the passed item set.
Definition: ftools.cxx:210
virtual std::unique_ptr< ScEEAbsImport > CreateRTFImport(ScDocument *pDoc, const ScRange &rRange) override
Definition: rtfimp.cxx:36
const ScfTools & operator=(const ScfTools &)=delete
virtual ErrCode ScImportLotus123(SfxMedium &, ScDocument *, rtl_TextEncoding eSrc) override
Definition: lotus.cxx:31
static sal_uInt8 GetMixedColorComp(sal_uInt8 nFore, sal_uInt8 nBack, sal_uInt8 nTrans)
Mixes RGB components with given transparence.
Definition: ftools.cxx:127
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:201
static const OUString & GetHTMLDocName()
Returns the built-in range name for an HTML document.
Definition: ftools.cxx:281
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:73
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:177
ReturnType llimit_cast(Type nValue, ReturnType nMin)
Returns the value, if it is not less than nMin, otherwise nMin.
Definition: ftools.hxx:46
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:124
ExportFormatExcel
Definition: filter.hxx:43
virtual ~ScFormatFilterPluginImpl()
Definition: ftools.cxx:346
::std::vector< sal_uInt32 > ScfUInt32Vec
Definition: ftools.hxx:255
static OUString GetNameFromHTMLName(const OUString &rTabName)
Returns the built-in range name for an HTML table, specified by table name.
Definition: ftools.cxx:313
::std::vector< sal_uInt16 > ScfUInt16Vec
Definition: ftools.hxx:253
unsigned char sal_uInt8
EXCIMPFORMAT
Definition: filter.hxx:40
static const OUString & GetHTMLNamePrefix()
Returns the prefix for table names.
Definition: ftools.cxx:300
void insert_value(Type &rnBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount)
Inserts a value into a bitfield.
Definition: ftools.hxx:100
virtual ErrCode ScImportHTML(SvStream &, const OUString &rBaseURL, ScDocument *, ScRange &rRange, double nOutputFactor, bool bCalcWidthHeight, SvNumberFormatter *pFormatter, bool bConvertDate) override
Definition: htmlimp.cxx:45
::std::vector< sal_Int32 > ScfInt32Vec
Definition: ftools.hxx:254
::std::vector< sal_Int16 > ScfInt16Vec
Definition: ftools.hxx:252
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:253
void SvStream & rStrm
virtual ErrCode ScImportExcel(SfxMedium &, ScDocument *, const EXCIMPFORMAT) override
Definition: excel.cxx:144
::std::vector< OUString > ScfStringVec
Definition: ftools.hxx:256
static rtl_TextEncoding GetSystemTextEncoding()
Returns system text encoding for byte string conversion.
Definition: ftools.cxx:112
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:265
sal_Int16 nValue
static const OUString & GetHTMLIndexPrefix()
Returns the prefix for table index names.
Definition: ftools.cxx:293