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 "xlroot.hxx"
23 #include <compiler.hxx>
24 #include <memory>
25 #include <rtl/ref.hxx>
26 
27 // Forward declarations of objects in public use ==============================
28 
29 namespace com::sun::star::beans { struct NamedValue; }
30 
31 class XclExpRecordBase;
32 class XclExpString;
33 
34 typedef rtl::Reference< XclExpRecordBase >  XclExpRecordRef;
35 typedef std::shared_ptr< XclExpString >     XclExpStringRef;
36 
37 // Global data ================================================================
38 
39 class XclExpTabInfo;
40 class XclExpAddressConverter;
41 class XclExpFormulaCompiler;
42 class XclExpProgressBar;
43 class XclExpSst;
44 class XclExpPalette;
45 class XclExpFontBuffer;
46 class XclExpNumFmtBuffer;
47 class XclExpXFBuffer;
48 class XclExpLinkManager;
49 class XclExpNameManager;
50 class XclExpObjectManager;
51 class XclExpFilterManager;
52 class XclExpPivotTableManager;
53 class XclExpDxfs;
54 class XclExpXmlPivotTableManager;
55 class XclExpTablesManager;
56 namespace sc { class CompileFormulaContext; }
57 
58 /** Stores global buffers and data needed for Excel export filter. */
59 struct XclExpRootData : public XclRootData
60 {
61     typedef std::shared_ptr< XclExpTabInfo >             XclExpTabInfoRef;
62     typedef std::shared_ptr< XclExpAddressConverter >    XclExpAddrConvRef;
63     typedef std::shared_ptr< XclExpFormulaCompiler >     XclExpFmlaCompRef;
64     typedef std::shared_ptr< XclExpProgressBar >         XclExpProgressRef;
65 
66     typedef rtl::Reference< XclExpSst >                  XclExpSstRef;
67     typedef rtl::Reference< XclExpPalette >              XclExpPaletteRef;
68     typedef rtl::Reference< XclExpFontBuffer >           XclExpFontBfrRef;
69     typedef rtl::Reference< XclExpNumFmtBuffer >         XclExpNumFmtBfrRef;
70     typedef rtl::Reference< XclExpXFBuffer >             XclExpXFBfrRef;
71     typedef rtl::Reference< XclExpNameManager >          XclExpNameMgrRef;
72     typedef rtl::Reference< XclExpLinkManager >          XclExpLinkMgrRef;
73     typedef std::shared_ptr< XclExpObjectManager >       XclExpObjectMgrRef;
74     typedef std::shared_ptr< XclExpFilterManager >       XclExpFilterMgrRef;
75     typedef std::shared_ptr< XclExpPivotTableManager >   XclExpPTableMgrRef;
76     typedef rtl::Reference< XclExpDxfs >                 XclExpDxfsRef;
77 
78     XclExpTabInfoRef    mxTabInfo;          /// Calc->Excel sheet index conversion.
79     XclExpAddrConvRef   mxAddrConv;         /// The address converter.
80     XclExpFmlaCompRef   mxFmlaComp;         /// The formula compiler.
81     XclExpProgressRef   mxProgress;         /// The export progress bar.
82 
83     XclExpSstRef        mxSst;              /// The shared string table.
84     XclExpPaletteRef    mxPalette;          /// The color buffer.
85     XclExpFontBfrRef    mxFontBfr;          /// All fonts in the file.
86     XclExpNumFmtBfrRef  mxNumFmtBfr;        /// All number formats in the file.
87     XclExpXFBfrRef      mxXFBfr;            /// All XF records in the file.
88     XclExpNameMgrRef    mxNameMgr;          /// Internal defined names.
89     XclExpLinkMgrRef    mxGlobLinkMgr;      /// Global link manager for defined names.
90     XclExpLinkMgrRef    mxLocLinkMgr;       /// Local link manager for a sheet.
91     XclExpObjectMgrRef  mxObjMgr;           /// All drawing objects.
92     XclExpFilterMgrRef  mxFilterMgr;        /// Manager for filtered areas in all sheets.
93     XclExpPTableMgrRef  mxPTableMgr;        /// All pivot tables and pivot caches.
94     XclExpDxfsRef       mxDxfs;             /// All delta formatting entries
95 
96     std::shared_ptr<XclExpXmlPivotTableManager> mxXmlPTableMgr;
97     std::shared_ptr<XclExpTablesManager> mxTablesMgr;
98     std::shared_ptr<sc::CompileFormulaContext> mpCompileFormulaCxt;
99 
100     ScCompiler::OpCodeMapPtr  mxOpCodeMap;  /// mapping between op-codes and names
101 
102     bool                mbRelUrl;           /// true = Store URLs relative.
103 
104     OStringBuffer       maStringBuf;        /// buffer to avoid massive OUString allocations
105 
106     explicit            XclExpRootData( XclBiff eBiff, SfxMedium& rMedium,
107                             const tools::SvRef<SotStorage>& xRootStrg, ScDocument& rDoc, rtl_TextEncoding eTextEnc );
108     virtual             ~XclExpRootData() override;
109 };
110 
111 /** Access to global data from other classes. */
112 class XclExpRoot : public XclRoot
113 {
114 public:
115     explicit            XclExpRoot( XclExpRootData& rExpRootData );
116 
117     /** Returns this root instance - for code readability in derived classes. */
GetRoot() const118     const XclExpRoot& GetRoot() const { return *this; }
119     /** Returns true, if URLs should be stored relative to the document location. */
IsRelUrl() const120     bool         IsRelUrl() const { return mrExpData.mbRelUrl; }
GetCompileFormulaContext() const121     sc::CompileFormulaContext& GetCompileFormulaContext() const { return *mrExpData.mpCompileFormulaCxt; }
122 
123     /** Returns the buffer for Calc->Excel sheet index conversion. */
124     XclExpTabInfo&      GetTabInfo() const;
125     /** Returns the address converter. */
126     XclExpAddressConverter& GetAddressConverter() const;
127     /** Returns the formula compiler to produce formula token arrays. */
128     XclExpFormulaCompiler& GetFormulaCompiler() const;
129     /** Returns the export progress bar. */
130     XclExpProgressBar&  GetProgressBar() const;
131 
132     /** Returns the shared string table. */
133     XclExpSst&          GetSst() const;
134     /** Returns the color buffer. */
135     XclExpPalette&      GetPalette() const;
136     /** Returns the font buffer. */
137     XclExpFontBuffer&   GetFontBuffer() const;
138     /** Returns the number format buffer. */
139     XclExpNumFmtBuffer& GetNumFmtBuffer() const;
140     /** Returns the cell formatting attributes buffer. */
141     XclExpXFBuffer&     GetXFBuffer() const;
142     /** Returns the global link manager for defined names. */
143     XclExpLinkManager&  GetGlobalLinkManager() const;
144     /** Returns the local link manager for the current sheet. */
145     XclExpLinkManager&  GetLocalLinkManager() const;
146     /** Returns the buffer that contains internal defined names. */
147     XclExpNameManager&  GetNameManager() const;
148     /** Returns the drawing object manager. */
149     XclExpObjectManager& GetObjectManager() const;
150     /** Returns the filter manager. */
151     XclExpFilterManager& GetFilterManager() const;
152     /** Returns the pivot table manager. */
153     XclExpPivotTableManager& GetPivotTableManager() const;
154     /** Returns the differential formatting list */
155     XclExpDxfs&          GetDxfs() const;
156 
157     /** Clean and return the OStringBuffer */
GetStringBuf() const158     OStringBuffer&   GetStringBuf() const { mrExpData.maStringBuf.setLength(0); return mrExpData.maStringBuf; }
159 
160     XclExpXmlPivotTableManager& GetXmlPivotTableManager();
161 
162     XclExpTablesManager& GetTablesManager();
163 
164     /** Is called when export filter starts to create the Excel document (all BIFF versions). */
165     void                InitializeConvert();
166     /** Is called when export filter starts to create the workbook global data (>=BIFF5). */
167     void                InitializeGlobals();
168     /** Is called when export filter starts to create data for a single sheet (all BIFF versions). */
169     void                InitializeTable( SCTAB nScTab );
170     /** Is called before export filter starts to write the records to the stream. */
171     void                InitializeSave();
172     /** Returns the reference to a record (or record list) representing a root object.
173         @param nRecId  Identifier that specifies which record is returned. */
174     XclExpRecordRef     CreateRecord( sal_uInt16 nRecId ) const;
175 
176     bool                IsDocumentEncrypted() const;
177 
178     static css::uno::Sequence< css::beans::NamedValue > GenerateEncryptionData( const OUString& aPass );
179     css::uno::Sequence< css::beans::NamedValue > GetEncryptionData() const;
180     static css::uno::Sequence< css::beans::NamedValue > GenerateDefaultEncryptionData();
181 
182 private:
183 
184     /** Returns the local or global link manager, depending on current context. */
185     XclExpRootData::XclExpLinkMgrRef const & GetLocalLinkMgrRef() const;
186 
187 private:
188     XclExpRootData& mrExpData;      /// Reference to the global export data struct.
189 };
190 
191 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
192