xref: /trunk/main/sc/source/filter/inc/xilink.hxx (revision 38d50f7b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SC_XILINK_HXX
25 #define SC_XILINK_HXX
26 
27 #include <map>
28 #include "xllink.hxx"
29 #include "xiroot.hxx"
30 
31 /* ============================================================================
32 Classes for import of different kinds of internal/external references.
33 - 3D cell and cell range links
34 - External cell and cell range links
35 - External defined names
36 - Add-in functions
37 - DDE links
38 - OLE object links
39 ============================================================================ */
40 
41 // Excel sheet indexes ========================================================
42 
43 /** A buffer containing information about names and creation order of sheets.
44 
45     The first purpose of this buffer is to translate original Excel
46     sheet names into Calc sheet indexes. This is not trivial because the filter
47     may rename the Calc sheets during creation. This buffer stores the original
48     Excel sheet names with the corresponding Calc sheet indexes.
49 
50     The second purpose is to store the creation order of all sheets inside the
51     Excel workbook. The creation order list is contained in the TABID record
52     and needed to import the change log. Example: If the list contains 3;1;2
53     this means that the second sheet in the file was created first, than the
54     third sheet in the file was created and finally the first sheet.
55  */
56 class XclImpTabInfo
57 {
58 public:
59     // original Excel sheet names ---------------------------------------------
60 
61     /** Appends an original Excel sheet name with corresponding Calc sheet index. */
62     void                AppendXclTabName( const String& rXclTabName, SCTAB nScTab );
63     /** Inserts a Calc sheet index (increases all following sheet indexes). */
64     void                InsertScTab( SCTAB nScTab );
65 
66     /** Returns the Calc sheet index from the passed original Excel sheet name. */
67     SCTAB               GetScTabFromXclName( const String& rXclTabName ) const;
68 
69     // record creation order - TABID record -----------------------------------
70 
71     /** Reads the TABID record. */
72     void                ReadTabid( XclImpStream& rStrm );
73 
74     /** Returns the current sheet index calculated from creation index.
75         @param nCreatedId  The creation index of the sheet (1-based).
76         @param nMaxTabId  All values greater than this parameter are not used to find the index.
77         @return  The 0-based index of the sheet nCreatedId if it is contained in the list.
78         Example: The buffer is 3;5;2;4;1, nCreatedId is 1 and nMaxTabId is 3. The function will
79         return 2 which is the 0-based index of sheet 1 in the list 3;2;1. */
80     sal_uInt16          GetCurrentIndex( sal_uInt16 nCreatedId, sal_uInt16 nMaxTabId = 0xFFFF ) const;
81 
82 private:
83     typedef ::std::map< String, SCTAB > XclTabNameMap;
84 
85     XclTabNameMap       maTabNames;     /// All Excel sheet names with Calc sheet index.
86     ScfUInt16Vec        maTabIdVec;     /// The vector with sheet indexes.
87 };
88 
89 // External names =============================================================
90 
91 /** Type of an external name. */
92 enum XclImpExtNameType
93 {
94     xlExtName,                  /// An external defined name.
95     xlExtAddIn,                 /// An add-in function name.
96     xlExtDDE,                   /// A DDE link range.
97     xlExtOLE,                   /// An OLE object link.
98     xlExtEuroConvert            /// An external in Excel, but internal in OO function name.
99 };
100 
101 // ----------------------------------------------------------------------------
102 
103 class XclImpCachedMatrix;
104 class ScTokenArray;
105 class XclImpSupbook;
106 
107 /** Stores contents of an external name.
108     @descr Supported: External defined names, AddIn names, DDE links and OLE objects. */
109 class XclImpExtName
110 {
111 public:
112     /** Reads the external name from the stream. */
113     explicit            XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm,
114                                         XclSupbookType eSubType, ExcelToSc* pFormulaConv );
115                         ~XclImpExtName();
116 
117     /** Create and apply the cached list of this DDE Link to the document. */
118     void                CreateDdeData( ScDocument& rDoc,
119                             const String& rApplc, const String& rExtDoc ) const;
120 
121     void                CreateExtNameData( ScDocument& rDoc, sal_uInt16 nFileId ) const;
122 
123     bool                HasFormulaTokens() const;
124 
GetType() const125     inline XclImpExtNameType GetType() const { return meType; }
GetName() const126     inline const String& GetName() const { return maName; }
GetStorageId() const127     inline sal_uInt32   GetStorageId() const { return mnStorageId; }
128 
129 private:
130     typedef ::std::auto_ptr< XclImpCachedMatrix > XclImpCachedMatrixPtr;
131     typedef ::std::auto_ptr< ScTokenArray >       TokenArrayPtr;
132 
133     XclImpCachedMatrixPtr mxDdeMatrix;      /// Cached results of the DDE link.
134     TokenArrayPtr       mxArray;            /// Formula tokens for external name.
135     String              maName;             /// The name of the external name.
136     sal_uInt32          mnStorageId;        /// Storage ID for OLE object storages.
137     XclImpExtNameType   meType;             /// Type of the external name.
138 };
139 
140 // Import link manager ========================================================
141 
142 class XclImpLinkManagerImpl;
143 
144 /** This is the central class for the import of all internal/external links.
145     @descr  This manager stores all data about external documents with their sheets
146     and cached cell contents. Additionally it handles external names, such as add-in
147     function names, DDE links, and OLE object links.
148     File contents in BIFF8:
149     - Record SUPBOOK: Contains the name of an external document and the names of its sheets.
150     This record is optionally followed by NAME, EXTERNNAME, XCT and CRN records.
151     - Record XCT: Contains the number and sheet index of the following CRN records.
152     - Record CRN: Contains addresses (row and column) and values of external referenced cells.
153     - Record NAME: Contains defined names of the own workbook.
154     - Record EXTERNNAME: Contains external defined names, DDE links, or OLE object links.
155     - Record EXTERNSHEET: Contains indexes to URLs of external documents (SUPBOOKs)
156     and sheet indexes for each external reference used anywhere in the workbook.
157     This record follows a list of SUPBOOK records (with their attached records).
158 */
159 class XclImpLinkManager : protected XclImpRoot
160 {
161 public:
162     explicit            XclImpLinkManager( const XclImpRoot& rRoot );
163                         ~XclImpLinkManager();
164 
165     /** Reads the EXTERNSHEET record. */
166     void                ReadExternsheet( XclImpStream& rStrm );
167     /** Reads a SUPBOOK record. */
168     void                ReadSupbook( XclImpStream& rStrm );
169     /** Reads an XCT record and appends it to the current SUPBOOK. */
170     void                ReadXct( XclImpStream& rStrm );
171     /** Reads a CRN record and appends it to the current SUPBOOK. */
172     void                ReadCrn( XclImpStream& rStrm );
173     /** Reads an EXTERNNAME record and appends it to the current SUPBOOK. */
174     void                ReadExternname( XclImpStream& rStrm, ExcelToSc* pFormulaConv = NULL );
175 
176     /** Returns true, if the specified XTI entry contains an internal reference. */
177     bool                IsSelfRef( sal_uInt16 nXtiIndex ) const;
178     /** Returns the Calc sheet index range of the specified XTI entry.
179         @return  true = XTI data found, returned sheet index range is valid. */
180     bool                GetScTabRange(
181                             SCTAB& rnFirstScTab, SCTAB& rnLastScTab,
182                             sal_uInt16 nXtiIndex ) const;
183     /** Returns the specified external name or 0 on error. */
184     const XclImpExtName* GetExternName( sal_uInt16 nXtiIndex, sal_uInt16 nExtName ) const;
185 
186     const String* GetSupbookUrl( sal_uInt16 nXtiIndex ) const;
187 
188     const String& GetSupbookTabName( sal_uInt16 nXti, sal_uInt16 nXtiTab ) const;
189 
190     /** Tries to decode the URL of the specified XTI entry to OLE or DDE link components.
191         @descr  For DDE links: Decodes to application name and topic.
192         For OLE object links: Decodes to class name and document URL.
193         @return  true = decoding was successful, returned strings are valid (not empty). */
194     bool                GetLinkData( String& rApplic, String& rTopic, sal_uInt16 nXtiIndex ) const;
195     /** Returns the specified macro name or an empty string on error. */
196     const String&       GetMacroName( sal_uInt16 nExtSheet, sal_uInt16 nExtName ) const;
197 
198 private:
199     typedef ::std::auto_ptr< XclImpLinkManagerImpl > XclImpLinkMgrImplPtr;
200     XclImpLinkMgrImplPtr mxImpl;
201 };
202 
203 // ============================================================================
204 
205 #endif
206 
207