Line data Source code
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 : #include <stdlib.h>
21 : #include <stdio.h>
22 :
23 : #include "document.hxx"
24 : #include "scerrors.hxx"
25 : #include "fprogressbar.hxx"
26 : #include "xltracer.hxx"
27 : #include "xltable.hxx"
28 : #include "xihelper.hxx"
29 : #include "xipage.hxx"
30 : #include "xiview.hxx"
31 : #include "xilink.hxx"
32 : #include "xiname.hxx"
33 : #include "xicontent.hxx"
34 : #include "xiescher.hxx"
35 : #include "xipivot.hxx"
36 : #include "XclImpChangeTrack.hxx"
37 :
38 : #include "root.hxx"
39 : #include "imp_op.hxx"
40 : #include "excimp8.hxx"
41 :
42 0 : FltError ImportExcel::Read( void )
43 : {
44 0 : XclImpPageSettings& rPageSett = GetPageSettings();
45 0 : XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
46 0 : XclImpPalette& rPal = GetPalette();
47 0 : XclImpFontBuffer& rFontBfr = GetFontBuffer();
48 0 : XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer();
49 0 : XclImpXFBuffer& rXFBfr = GetXFBuffer();
50 0 : XclImpNameManager& rNameMgr = GetNameManager();
51 0 : XclImpObjectManager& rObjMgr = GetObjectManager();
52 : (void)rObjMgr;
53 : // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets)
54 :
55 : enum Zustand {
56 : Z_BiffNull, // Nicht in gueltigem Biff-Format
57 : Z_Biff2, // Biff2: nur eine Tabelle
58 :
59 : Z_Biff3, // Biff3: nur eine Tabelle
60 :
61 : Z_Biff4, // Biff4: nur eine Tabelle
62 : Z_Biff4W, // Biff4 Workbook: Globals
63 : Z_Biff4T, // Biff4 Workbook: eine Tabelle selbst
64 : Z_Biff4E, // Biff4 Workbook: zwischen den Tabellen
65 :
66 : Z_Biff5WPre,// Biff5: Prefetch Workbook
67 : Z_Biff5W, // Biff5: Globals
68 : Z_Biff5TPre,// Biff5: Prefetch fuer Shrfmla/Array Formula
69 : Z_Biff5T, // Biff5: eine Tabelle selbst
70 : Z_Biff5E, // Biff5: zwischen den Tabellen
71 : Z_Biffn0, // Alle Biffs: Tabelle bis naechstesss EOF ueberlesen
72 : Z_Ende };
73 :
74 0 : Zustand eAkt = Z_BiffNull, ePrev = Z_BiffNull;
75 :
76 0 : FltError eLastErr = eERR_OK;
77 : sal_uInt16 nOpcode;
78 0 : sal_uInt16 nBofLevel = 0;
79 :
80 : OSL_ENSURE( &aIn != NULL, "-ImportExcel::Read(): No Stream - what happened?!" );
81 :
82 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
83 : ::std::auto_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar(
84 0 : aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) );
85 : SAL_WNODEPRECATED_DECLARATIONS_POP
86 :
87 : /* #i104057# Need to track a base position for progress bar calculation,
88 : because sheet substreams may not be in order of sheets. */
89 0 : sal_Size nProgressBasePos = 0;
90 0 : sal_Size nProgressBaseSize = 0;
91 :
92 0 : while( eAkt != Z_Ende )
93 : {
94 0 : if( eAkt == Z_Biff5E )
95 : {
96 0 : sal_uInt16 nScTab = GetCurrScTab();
97 0 : if( nScTab < maSheetOffsets.size() )
98 : {
99 0 : nProgressBaseSize += (aIn.GetSvStreamPos() - nProgressBasePos);
100 0 : nProgressBasePos = maSheetOffsets[ nScTab ];
101 0 : aIn.StartNextRecord( nProgressBasePos );
102 : }
103 : else
104 0 : eAkt = Z_Ende;
105 : }
106 : else
107 0 : aIn.StartNextRecord();
108 :
109 0 : nOpcode = aIn.GetRecId();
110 :
111 0 : if( !aIn.IsValid() )
112 : {
113 : // finalize table if EOF is missing
114 0 : switch( eAkt )
115 : {
116 : case Z_Biff2:
117 : case Z_Biff3:
118 : case Z_Biff4:
119 : case Z_Biff4T:
120 : case Z_Biff5TPre:
121 : case Z_Biff5T:
122 0 : rNumFmtBfr.CreateScFormats();
123 0 : Eof();
124 0 : break;
125 : default:;
126 : };
127 0 : eAkt = Z_Ende;
128 0 : break;
129 : }
130 :
131 0 : if( eAkt == Z_Ende )
132 0 : break;
133 :
134 0 : if( eAkt != Z_Biff5TPre && eAkt != Z_Biff5WPre )
135 0 : pProgress->ProgressAbs( nProgressBaseSize + aIn.GetSvStreamPos() - nProgressBasePos );
136 :
137 0 : switch( eAkt )
138 : {
139 : // ----------------------------------------------------------------
140 : case Z_BiffNull: // ------------------------------- Z_BiffNull -
141 : {
142 0 : switch( nOpcode )
143 : {
144 : case EXC_ID2_BOF:
145 : case EXC_ID3_BOF:
146 : case EXC_ID4_BOF:
147 : case EXC_ID5_BOF:
148 : {
149 : // #i23425# don't rely on the record ID, but on the detected BIFF version
150 0 : switch( GetBiff() )
151 : {
152 : case EXC_BIFF2:
153 0 : Bof2();
154 0 : if( pExcRoot->eDateiTyp == Biff2 )
155 : {
156 0 : eAkt = Z_Biff2;
157 0 : NeueTabelle();
158 : }
159 0 : break;
160 : case EXC_BIFF3:
161 0 : Bof3();
162 0 : if( pExcRoot->eDateiTyp == Biff3 )
163 : {
164 0 : eAkt = Z_Biff3;
165 0 : NeueTabelle();
166 : }
167 0 : break;
168 : case EXC_BIFF4:
169 0 : Bof4();
170 0 : if( pExcRoot->eDateiTyp == Biff4 )
171 : {
172 0 : eAkt = Z_Biff4;
173 0 : NeueTabelle();
174 : }
175 0 : else if( pExcRoot->eDateiTyp == Biff4W )
176 0 : eAkt = Z_Biff4W;
177 0 : break;
178 : case EXC_BIFF5:
179 0 : Bof5();
180 0 : if( pExcRoot->eDateiTyp == Biff5W )
181 : {
182 0 : eAkt = Z_Biff5WPre;
183 :
184 0 : nBdshtTab = 0;
185 :
186 0 : aIn.StoreGlobalPosition(); // und Position merken
187 : }
188 0 : else if( pExcRoot->eDateiTyp == Biff5 )
189 : {
190 : // #i62752# possible to have BIFF5 sheet without globals
191 0 : NeueTabelle();
192 0 : eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch
193 0 : nBofLevel = 0;
194 0 : aIn.StoreGlobalPosition(); // und Position merken
195 : }
196 0 : break;
197 : default:
198 : DBG_ERROR_BIFF();
199 : }
200 : }
201 0 : break;
202 : }
203 : }
204 0 : break;
205 : // ----------------------------------------------------------------
206 : case Z_Biff2: // ---------------------------------- Z_Biff2 -
207 : {
208 0 : switch( nOpcode )
209 : {
210 : case EXC_ID2_DIMENSIONS:
211 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
212 : case EXC_ID2_BLANK:
213 0 : case EXC_ID3_BLANK: ReadBlank(); break;
214 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
215 : case EXC_ID2_NUMBER:
216 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
217 : case EXC_ID2_LABEL:
218 0 : case EXC_ID3_LABEL: ReadLabel(); break;
219 : case EXC_ID2_BOOLERR:
220 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
221 0 : case EXC_ID_RK: ReadRk(); break;
222 :
223 0 : case 0x06: Formula25(); break; // FORMULA [ 2 5]
224 0 : case 0x08: Row25(); break; // ROW [ 2 5]
225 : case 0x0A: // EOF [ 2345]
226 0 : rNumFmtBfr.CreateScFormats();
227 0 : rNameMgr.ConvertAllTokens();
228 0 : Eof();
229 0 : eAkt = Z_Ende;
230 0 : break;
231 : case 0x14:
232 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
233 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
234 0 : case 0x18: rNameMgr.ReadName( maStrm ); break;
235 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
236 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
237 0 : case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
238 0 : case 0x20: Columndefault(); break; // COLUMNDEFAULT[ 2 ]
239 0 : case 0x21: Array25(); break; // ARRAY [ 2 5]
240 0 : case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
241 0 : case 0x24: Colwidth(); break; // COLWIDTH [ 2 ]
242 0 : case 0x25: Defrowheight2(); break; // DEFAULTROWHEI[ 2 ]
243 : case 0x26:
244 : case 0x27:
245 : case 0x28:
246 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
247 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
248 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
249 : case 0x2F: // FILEPASS [ 2345]
250 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
251 0 : if( eLastErr != ERRCODE_NONE )
252 0 : eAkt = Z_Ende;
253 0 : break;
254 0 : case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break;
255 0 : case EXC_ID_EFONT: rFontBfr.ReadEfont( maStrm ); break;
256 0 : case 0x3E: rTabViewSett.ReadWindow2( maStrm, false );break;
257 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
258 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
259 0 : case 0x43: rXFBfr.ReadXF( maStrm ); break;
260 0 : case 0x44: Ixfe(); break; // IXFE [ 2 ]
261 : }
262 : }
263 0 : break;
264 : // ----------------------------------------------------------------
265 : case Z_Biff3: // ---------------------------------- Z_Biff3 -
266 : {
267 0 : switch( nOpcode )
268 : {
269 : // skip chart substream
270 : case EXC_ID2_BOF:
271 : case EXC_ID3_BOF:
272 : case EXC_ID4_BOF:
273 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
274 :
275 : case EXC_ID2_DIMENSIONS:
276 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
277 : case EXC_ID2_BLANK:
278 0 : case EXC_ID3_BLANK: ReadBlank(); break;
279 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
280 : case EXC_ID2_NUMBER:
281 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
282 : case EXC_ID2_LABEL:
283 0 : case EXC_ID3_LABEL: ReadLabel(); break;
284 : case EXC_ID2_BOOLERR:
285 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
286 0 : case EXC_ID_RK: ReadRk(); break;
287 :
288 : case 0x0A: // EOF [ 2345]
289 0 : rNumFmtBfr.CreateScFormats();
290 0 : rNameMgr.ConvertAllTokens();
291 0 : Eof();
292 0 : eAkt = Z_Ende;
293 0 : break;
294 : case 0x14:
295 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
296 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
297 : case 0x1A:
298 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
299 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
300 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
301 0 : case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
302 0 : case 0x22: Rec1904(); break; // 1904 [ 2345]
303 : case 0x26:
304 : case 0x27:
305 : case 0x28:
306 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
307 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
308 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
309 : case 0x2F: // FILEPASS [ 2345]
310 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
311 0 : if( eLastErr != ERRCODE_NONE )
312 0 : eAkt = Z_Ende;
313 0 : break;
314 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
315 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
316 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
317 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
318 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
319 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
320 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
321 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
322 0 : case 0x0206: Formula3(); break; // FORMULA [ 3 ]
323 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
324 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
325 0 : case 0x0221: Array34(); break; // ARRAY [ 34 ]
326 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
327 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
328 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
329 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
330 0 : case 0x0243: rXFBfr.ReadXF( maStrm ); break;
331 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
332 : }
333 : }
334 0 : break;
335 : // ----------------------------------------------------------------
336 : case Z_Biff4: // ---------------------------------- Z_Biff4 -
337 : {
338 0 : switch( nOpcode )
339 : {
340 : // skip chart substream
341 : case EXC_ID2_BOF:
342 : case EXC_ID3_BOF:
343 : case EXC_ID4_BOF:
344 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
345 :
346 : case EXC_ID2_DIMENSIONS:
347 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
348 : case EXC_ID2_BLANK:
349 0 : case EXC_ID3_BLANK: ReadBlank(); break;
350 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
351 : case EXC_ID2_NUMBER:
352 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
353 : case EXC_ID2_LABEL:
354 0 : case EXC_ID3_LABEL: ReadLabel(); break;
355 : case EXC_ID2_BOOLERR:
356 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
357 0 : case EXC_ID_RK: ReadRk(); break;
358 :
359 : case 0x0A: // EOF [ 2345]
360 0 : rNumFmtBfr.CreateScFormats();
361 0 : rNameMgr.ConvertAllTokens();
362 0 : Eof();
363 0 : eAkt = Z_Ende;
364 0 : break;
365 0 : case 0x12: SheetProtect(); break; // SHEET PROTECTION
366 : case 0x14:
367 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
368 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
369 : case 0x1A:
370 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
371 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
372 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
373 0 : case 0x22: Rec1904(); break; // 1904 [ 2345]
374 : case 0x26:
375 : case 0x27:
376 : case 0x28:
377 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
378 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
379 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
380 : case 0x2F: // FILEPASS [ 2345]
381 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
382 0 : if( eLastErr != ERRCODE_NONE )
383 0 : eAkt = Z_Ende;
384 0 : break;
385 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
386 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
387 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
388 0 : case 0x55: DefColWidth(); break;
389 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
390 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
391 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
392 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
393 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
394 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
395 0 : case 0xA1: rPageSett.ReadSetup( maStrm ); break;
396 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
397 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
398 0 : case 0x0221: Array34(); break; // ARRAY [ 34 ]
399 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
400 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
401 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
402 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
403 0 : case 0x0406: Formula4(); break; // FORMULA [ 4 ]
404 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
405 0 : case 0x0443: rXFBfr.ReadXF( maStrm ); break;
406 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
407 : }
408 : }
409 0 : break;
410 : // ----------------------------------------------------------------
411 : case Z_Biff4W: // --------------------------------- Z_Biff4W -
412 : {
413 0 : switch( nOpcode )
414 : {
415 : case 0x0A: // EOF [ 2345]
416 0 : rNameMgr.ConvertAllTokens();
417 0 : eAkt = Z_Ende;
418 0 : break;
419 0 : case 0x12: DocProtect(); break; // PROTECT [ 5]
420 : case 0x2F: // FILEPASS [ 2345]
421 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
422 0 : if( eLastErr != ERRCODE_NONE )
423 0 : eAkt = Z_Ende;
424 0 : break;
425 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
426 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
427 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
428 0 : case 0x55: DefColWidth(); break;
429 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
430 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
431 0 : case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ]
432 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
433 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
434 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
435 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
436 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
437 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
438 : case 0x0409: // BOF [ 4 ]
439 0 : Bof4();
440 0 : if( pExcRoot->eDateiTyp == Biff4 )
441 : {
442 0 : eAkt = Z_Biff4T;
443 0 : NeueTabelle();
444 : }
445 : else
446 0 : eAkt = Z_Ende;
447 0 : break;
448 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
449 0 : case 0x0443: rXFBfr.ReadXF( maStrm ); break;
450 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
451 : }
452 :
453 : }
454 0 : break;
455 : // ----------------------------------------------------------------
456 : case Z_Biff4T: // --------------------------------- Z_Biff4T -
457 : {
458 0 : switch( nOpcode )
459 : {
460 : // skip chart substream
461 : case EXC_ID2_BOF:
462 : case EXC_ID3_BOF:
463 : case EXC_ID4_BOF:
464 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
465 :
466 : case EXC_ID2_DIMENSIONS:
467 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
468 : case EXC_ID2_BLANK:
469 0 : case EXC_ID3_BLANK: ReadBlank(); break;
470 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
471 : case EXC_ID2_NUMBER:
472 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
473 : case EXC_ID2_LABEL:
474 0 : case EXC_ID3_LABEL: ReadLabel(); break;
475 : case EXC_ID2_BOOLERR:
476 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
477 0 : case EXC_ID_RK: ReadRk(); break;
478 :
479 : case 0x0A: // EOF [ 2345]
480 0 : rNameMgr.ConvertAllTokens();
481 0 : Eof();
482 0 : eAkt = Z_Biff4E;
483 0 : break;
484 0 : case 0x12: SheetProtect(); break; // SHEET PROTECTION
485 : case 0x14:
486 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
487 : case 0x1A:
488 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
489 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
490 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
491 : case 0x2F: // FILEPASS [ 2345]
492 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
493 0 : if( eLastErr != ERRCODE_NONE )
494 0 : eAkt = Z_Ende;
495 0 : break;
496 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
497 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
498 0 : case 0x55: DefColWidth(); break;
499 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
500 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
501 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
502 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
503 0 : case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ]
504 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
505 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
506 0 : case 0xA1: rPageSett.ReadSetup( maStrm ); break;
507 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
508 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
509 0 : case 0x0221: Array34(); break;
510 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
511 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
512 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
513 0 : case 0x0406: Formula4(); break;
514 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
515 0 : case 0x0443: rXFBfr.ReadXF( maStrm ); break;
516 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
517 : }
518 :
519 : }
520 0 : break;
521 : // ----------------------------------------------------------------
522 : case Z_Biff4E: // --------------------------------- Z_Biff4E -
523 : {
524 0 : switch( nOpcode )
525 : {
526 : case 0x0A: // EOF [ 2345]
527 0 : eAkt = Z_Ende;
528 0 : break;
529 0 : case 0x8F: break; // BUNDLEHEADER [ 4 ]
530 : case 0x0409: // BOF [ 4 ]
531 0 : Bof4();
532 0 : NeueTabelle();
533 0 : if( pExcRoot->eDateiTyp == Biff4 )
534 : {
535 0 : eAkt = Z_Biff4T;
536 : }
537 : else
538 : {
539 0 : ePrev = eAkt;
540 0 : eAkt = Z_Biffn0;
541 : }
542 0 : break;
543 : }
544 :
545 : }
546 0 : break;
547 : case Z_Biff5WPre: // ------------------------------ Z_Biff5WPre -
548 : {
549 0 : switch( nOpcode )
550 : {
551 : case 0x0A: // EOF [ 2345]
552 0 : eAkt = Z_Biff5W;
553 0 : aIn.SeekGlobalPosition(); // und zurueck an alte Position
554 0 : break;
555 0 : case 0x12: DocProtect(); break; // PROTECT [ 5]
556 : case 0x2F: // FILEPASS [ 2345]
557 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
558 0 : if( eLastErr != ERRCODE_NONE )
559 0 : eAkt = Z_Ende;
560 0 : break;
561 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
562 0 : case 0x3D: Window1(); break;
563 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
564 0 : case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5]
565 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
566 : // PALETTE follows XFs, but already needed while reading the XFs
567 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
568 : }
569 : }
570 0 : break;
571 : case Z_Biff5W: // --------------------------------- Z_Biff5W -
572 : {
573 0 : switch( nOpcode )
574 : {
575 : case 0x0A: // EOF [ 2345]
576 0 : rNumFmtBfr.CreateScFormats();
577 0 : rXFBfr.CreateUserStyles();
578 0 : rNameMgr.ConvertAllTokens();
579 0 : eAkt = Z_Biff5E;
580 0 : break;
581 0 : case 0x18: rNameMgr.ReadName( maStrm ); break;
582 0 : case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
583 0 : case 0x22: Rec1904(); break; // 1904 [ 2345]
584 0 : case 0x31: rFontBfr.ReadFont( maStrm ); break;
585 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
586 0 : case 0x8D: Hideobj(); break; // HIDEOBJ [ 345]
587 0 : case 0xDE: Olesize(); break;
588 0 : case 0xE0: rXFBfr.ReadXF( maStrm ); break;
589 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
590 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
591 : }
592 :
593 : }
594 0 : break;
595 : // ----------------------------------------------------------------
596 : case Z_Biff5TPre: // ------------------------------- Z_Biff5Pre -
597 : {
598 0 : if( nOpcode == 0x0809 )
599 0 : nBofLevel++;
600 0 : else if( (nOpcode == 0x000A) && nBofLevel )
601 0 : nBofLevel--;
602 0 : else if( !nBofLevel ) // don't read chart records
603 : {
604 0 : switch( nOpcode )
605 : {
606 : case EXC_ID2_DIMENSIONS:
607 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
608 0 : case 0x08: Row25(); break; // ROW [ 2 5]
609 : case 0x0A: // EOF [ 2345]
610 0 : eAkt = Z_Biff5T;
611 0 : aIn.SeekGlobalPosition(); // und zurueck an alte Position
612 0 : break;
613 0 : case 0x12: SheetProtect(); break; // SHEET PROTECTION
614 : case 0x1A:
615 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
616 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
617 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
618 0 : case 0x21: Array25(); break; // ARRAY [ 2 5]
619 0 : case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
620 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
621 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
622 0 : case 0x55: DefColWidth(); break;
623 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
624 0 : case 0x81: Wsbool(); break; // WSBOOL [ 2345]
625 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
626 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
627 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
628 0 : case 0x0221: Array34(); break; // ARRAY [ 34 ]
629 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
630 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
631 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
632 0 : case 0x04BC: Shrfmla(); break; // SHRFMLA [ 5]
633 : }
634 : }
635 : }
636 0 : break;
637 : // ----------------------------------------------------------------
638 : case Z_Biff5T: // --------------------------------- Z_Biff5T -
639 : {
640 0 : switch( nOpcode )
641 : {
642 : case EXC_ID2_BLANK:
643 0 : case EXC_ID3_BLANK: ReadBlank(); break;
644 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
645 : case EXC_ID2_NUMBER:
646 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
647 : case EXC_ID2_LABEL:
648 0 : case EXC_ID3_LABEL: ReadLabel(); break;
649 : case EXC_ID2_BOOLERR:
650 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
651 0 : case EXC_ID_RK: ReadRk(); break;
652 :
653 : case EXC_ID2_FORMULA:
654 : case EXC_ID3_FORMULA:
655 0 : case EXC_ID4_FORMULA: Formula25(); break;
656 0 : case 0x0A: Eof(); eAkt = Z_Biff5E; break;
657 : case 0x14:
658 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
659 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
660 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
661 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
662 0 : case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
663 : case 0x26:
664 : case 0x27:
665 : case 0x28:
666 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
667 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
668 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
669 : case 0x2F: // FILEPASS [ 2345]
670 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
671 0 : if( eLastErr != ERRCODE_NONE )
672 0 : eAkt = Z_Ende;
673 0 : break;
674 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
675 : case 0x83:
676 0 : case 0x84: rPageSett.ReadCenter( maStrm ); break;
677 0 : case 0xA0: rTabViewSett.ReadScl( maStrm ); break;
678 0 : case 0xA1: rPageSett.ReadSetup( maStrm ); break;
679 0 : case 0xBD: Mulrk(); break; // MULRK [ 5]
680 0 : case 0xBE: Mulblank(); break; // MULBLANK [ 5]
681 0 : case 0xD6: Rstring(); break; // RSTRING [ 5]
682 0 : case 0x00E5: Cellmerging(); break; // #i62300#
683 0 : case 0x0236: TableOp(); break; // TABLE [ 5]
684 : case 0x0809: // BOF [ 5]
685 0 : XclTools::SkipSubStream( maStrm );
686 0 : break;
687 : }
688 :
689 : }
690 0 : break;
691 : // ----------------------------------------------------------------
692 : case Z_Biff5E: // --------------------------------- Z_Biff5E -
693 : {
694 0 : switch( nOpcode )
695 : {
696 : case 0x0809: // BOF [ 5]
697 0 : Bof5();
698 0 : NeueTabelle();
699 0 : switch( pExcRoot->eDateiTyp )
700 : {
701 : case Biff5:
702 : case Biff5M4:
703 0 : eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch
704 0 : nBofLevel = 0;
705 0 : aIn.StoreGlobalPosition(); // und Position merken
706 0 : break;
707 : case Biff5C: // chart sheet
708 0 : GetCurrSheetDrawing().ReadTabChart( maStrm );
709 0 : Eof();
710 0 : GetTracer().TraceChartOnlySheet();
711 0 : break;
712 : case Biff5V:
713 : default:
714 0 : pD->SetVisible( GetCurrScTab(), false );
715 0 : ePrev = eAkt;
716 0 : eAkt = Z_Biffn0;
717 : }
718 : OSL_ENSURE( pExcRoot->eDateiTyp != Biff5W,
719 : "+ImportExcel::Read(): Doppel-Whopper-Workbook!" );
720 :
721 0 : break;
722 : }
723 :
724 : }
725 0 : break;
726 : case Z_Biffn0: // --------------------------------- Z_Biffn0 -
727 : {
728 0 : switch( nOpcode )
729 : {
730 : case 0x0A: // EOF [ 2345]
731 0 : eAkt = ePrev;
732 0 : IncCurrScTab();
733 0 : break;
734 : }
735 :
736 : }
737 0 : break;
738 : // ----------------------------------------------------------------
739 : case Z_Ende: // ----------------------------------- Z_Ende -
740 : OSL_FAIL( "*ImportExcel::Read(): Not possible state!" );
741 0 : break;
742 : default: OSL_FAIL( "-ImportExcel::Read(): state forgotten!" );
743 : }
744 : }
745 :
746 0 : if( eLastErr == eERR_OK )
747 : {
748 0 : pProgress.reset();
749 :
750 0 : AdjustRowHeight();
751 0 : PostDocLoad();
752 :
753 0 : pD->CalcAfterLoad();
754 :
755 0 : const XclImpAddressConverter& rAddrConv = GetAddressConverter();
756 0 : if( rAddrConv.IsTabTruncated() )
757 0 : eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW;
758 0 : else if( bTabTruncated || rAddrConv.IsRowTruncated() )
759 0 : eLastErr = SCWARN_IMPORT_ROW_OVERFLOW;
760 0 : else if( rAddrConv.IsColTruncated() )
761 0 : eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
762 : }
763 :
764 0 : return eLastErr;
765 : }
766 :
767 :
768 : //___________________________________________________________________
769 :
770 46 : FltError ImportExcel8::Read( void )
771 : {
772 : #ifdef EXC_INCL_DUMPER
773 : {
774 : Biff8RecDumper aDumper( GetRoot(), sal_True );
775 : if( aDumper.Dump( aIn ) )
776 : return ERRCODE_ABORT;
777 : }
778 : #endif
779 : // read the entire BIFF8 stream
780 : // don't look too close - this stuff seriously needs to be reworked
781 :
782 46 : XclImpPageSettings& rPageSett = GetPageSettings();
783 46 : XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
784 46 : XclImpPalette& rPal = GetPalette();
785 46 : XclImpFontBuffer& rFontBfr = GetFontBuffer();
786 46 : XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer();
787 46 : XclImpXFBuffer& rXFBfr = GetXFBuffer();
788 46 : XclImpSst& rSst = GetSst();
789 46 : XclImpTabInfo& rTabInfo = GetTabInfo();
790 46 : XclImpNameManager& rNameMgr = GetNameManager();
791 46 : XclImpLinkManager& rLinkMgr = GetLinkManager();
792 46 : XclImpObjectManager& rObjMgr = GetObjectManager();
793 : // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets)
794 46 : XclImpCondFormatManager& rCondFmtMgr = GetCondFormatManager();
795 46 : XclImpValidationManager& rValidMgr = GetValidationManager();
796 46 : XclImpPivotTableManager& rPTableMgr = GetPivotTableManager();
797 46 : XclImpWebQueryBuffer& rWQBfr = GetWebQueryBuffer();
798 :
799 46 : bool bInUserView = false; // true = In USERSVIEW(BEGIN|END) record block.
800 :
801 : enum XclImpReadState
802 : {
803 : EXC_STATE_BEFORE_GLOBALS, /// Before workbook globals (wait for initial BOF).
804 : EXC_STATE_GLOBALS_PRE, /// Prefetch for workbook globals.
805 : EXC_STATE_GLOBALS, /// Workbook globals.
806 : EXC_STATE_BEFORE_SHEET, /// Before worksheet (wait for new worksheet BOF).
807 : EXC_STATE_SHEET_PRE, /// Prefetch for worksheet.
808 : EXC_STATE_SHEET, /// Worksheet.
809 : EXC_STATE_END /// Stop reading.
810 : };
811 :
812 46 : XclImpReadState eAkt = EXC_STATE_BEFORE_GLOBALS;
813 :
814 46 : FltError eLastErr = eERR_OK;
815 :
816 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
817 : ::std::auto_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar(
818 46 : aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) );
819 : SAL_WNODEPRECATED_DECLARATIONS_POP
820 :
821 : /* #i104057# Need to track a base position for progress bar calculation,
822 : because sheet substreams may not be in order of sheets. */
823 46 : sal_Size nProgressBasePos = 0;
824 46 : sal_Size nProgressBaseSize = 0;
825 :
826 46 : bool bSheetHasCodeName = false;
827 :
828 92 : std::vector<OUString> aCodeNames;
829 92 : std::vector < SCTAB > nTabsWithNoCodeName;
830 :
831 876209 : while( eAkt != EXC_STATE_END )
832 : {
833 876163 : if( eAkt == EXC_STATE_BEFORE_SHEET )
834 : {
835 200 : sal_uInt16 nScTab = GetCurrScTab();
836 200 : if( nScTab < maSheetOffsets.size() )
837 : {
838 156 : nProgressBaseSize += (maStrm.GetSvStreamPos() - nProgressBasePos);
839 156 : nProgressBasePos = maSheetOffsets[ nScTab ];
840 :
841 : // i#115255 fdo#40304 BOUNDSHEET doesn't point to a valid
842 : // BOF record position. Scan the records manually (from
843 : // the BOUNDSHEET position) until we find a BOF. Some 3rd
844 : // party Russian programs generate invalid xls docs with
845 : // this kind of silliness.
846 156 : if (aIn.PeekRecId(nProgressBasePos) == EXC_ID5_BOF)
847 : // BOUNDSHEET points to a valid BOF record. Good.
848 156 : aIn.StartNextRecord(nProgressBasePos);
849 : else
850 : {
851 0 : bool bValid = true;
852 0 : while (bValid && aIn.GetRecId() != EXC_ID5_BOF)
853 0 : bValid = aIn.StartNextRecord();
854 :
855 0 : if (!bValid)
856 : // Safeguard ourselves from potential infinite loop.
857 0 : eAkt = EXC_STATE_END;
858 : }
859 :
860 : // import only 256 sheets
861 156 : if( nScTab > GetScMaxPos().Tab() )
862 : {
863 0 : if( maStrm.GetRecId() != EXC_ID_EOF )
864 0 : XclTools::SkipSubStream( maStrm );
865 : // #i29930# show warning box
866 0 : GetAddressConverter().CheckScTab( nScTab, true );
867 0 : eAkt = EXC_STATE_END;
868 : }
869 : else
870 : {
871 : // #i109800# SHEET record may point to any record inside the
872 : // sheet substream
873 156 : bool bIsBof = maStrm.GetRecId() == EXC_ID5_BOF;
874 156 : if( bIsBof )
875 156 : Bof5(); // read the BOF record
876 : else
877 0 : pExcRoot->eDateiTyp = Biff8; // on missing BOF, assume a standard worksheet
878 156 : NeueTabelle();
879 156 : switch( pExcRoot->eDateiTyp )
880 : {
881 : case Biff8: // worksheet
882 : case Biff8M4: // macro sheet
883 156 : eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
884 : // go to next record
885 156 : if( bIsBof ) maStrm.StartNextRecord();
886 156 : maStrm.StoreGlobalPosition();
887 156 : break;
888 : case Biff8C: // chart sheet
889 0 : GetCurrSheetDrawing().ReadTabChart( maStrm );
890 0 : Eof();
891 0 : GetTracer().TraceChartOnlySheet();
892 0 : break;
893 : case Biff8W: // workbook
894 : OSL_FAIL( "ImportExcel8::Read - double workbook globals" );
895 : // run through
896 : case Biff8V: // VB module
897 : default:
898 : // TODO: do not create a sheet in the Calc document
899 0 : pD->SetVisible( nScTab, false );
900 0 : XclTools::SkipSubStream( maStrm );
901 0 : IncCurrScTab();
902 : }
903 : }
904 : }
905 : else
906 44 : eAkt = EXC_STATE_END;
907 : }
908 : else
909 875963 : aIn.StartNextRecord();
910 :
911 876163 : if( !aIn.IsValid() )
912 : {
913 : // #i63591# finalize table if EOF is missing
914 3 : switch( eAkt )
915 : {
916 : case EXC_STATE_SHEET_PRE:
917 1 : eAkt = EXC_STATE_SHEET;
918 1 : aIn.SeekGlobalPosition();
919 1 : continue; // next iteration in while loop
920 : case EXC_STATE_SHEET:
921 1 : Eof();
922 1 : eAkt = EXC_STATE_END;
923 1 : break;
924 : default:
925 1 : eAkt = EXC_STATE_END;
926 : }
927 : }
928 :
929 876162 : if( eAkt == EXC_STATE_END )
930 46 : break;
931 :
932 876116 : if( eAkt != EXC_STATE_SHEET_PRE && eAkt != EXC_STATE_GLOBALS_PRE )
933 437730 : pProgress->ProgressAbs( nProgressBaseSize + aIn.GetSvStreamPos() - nProgressBasePos );
934 :
935 876116 : sal_uInt16 nRecId = aIn.GetRecId();
936 :
937 : /* #i39464# Ignore records between USERSVIEWBEGIN and USERSVIEWEND
938 : completely (user specific view settings). Otherwise view settings
939 : and filters are loaded multiple times, which at least causes
940 : problems in auto-filters. */
941 876116 : switch( nRecId )
942 : {
943 : case EXC_ID_USERSVIEWBEGIN:
944 : OSL_ENSURE( !bInUserView, "ImportExcel8::Read - nested user view settings" );
945 0 : bInUserView = true;
946 0 : break;
947 : case EXC_ID_USERSVIEWEND:
948 : OSL_ENSURE( bInUserView, "ImportExcel8::Read - not in user view settings" );
949 0 : bInUserView = false;
950 0 : break;
951 : }
952 :
953 876116 : if( !bInUserView ) switch( eAkt )
954 : {
955 : // ----------------------------------------------------------------
956 : // before workbook globals: wait for initial workbook globals BOF
957 : case EXC_STATE_BEFORE_GLOBALS:
958 : {
959 51 : if( nRecId == EXC_ID5_BOF )
960 : {
961 : OSL_ENSURE( GetBiff() == EXC_BIFF8, "ImportExcel8::Read - wrong BIFF version" );
962 46 : Bof5();
963 46 : if( pExcRoot->eDateiTyp == Biff8W )
964 : {
965 45 : eAkt = EXC_STATE_GLOBALS_PRE;
966 45 : maStrm.StoreGlobalPosition();
967 45 : nBdshtTab = 0;
968 : }
969 1 : else if( pExcRoot->eDateiTyp == Biff8 )
970 : {
971 : // #i62752# possible to have BIFF8 sheet without globals
972 0 : NeueTabelle();
973 0 : eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
974 0 : bSheetHasCodeName = false; // reset
975 0 : aIn.StoreGlobalPosition();
976 : }
977 : }
978 : }
979 51 : break;
980 :
981 : // ----------------------------------------------------------------
982 : // prefetch for workbook globals
983 : case EXC_STATE_GLOBALS_PRE:
984 : {
985 9178 : switch( nRecId )
986 : {
987 : case EXC_ID_EOF:
988 : case EXC_ID_EXTSST:
989 : /* #i56376# evil hack: if EOF for globals is missing,
990 : simulate it. This hack works only for the bugdoc
991 : given in the issue, where the sheet substreams
992 : start directly after the EXTSST record. A future
993 : implementation should be more robust against
994 : missing EOFs. */
995 129 : if( (nRecId == EXC_ID_EOF) ||
996 39 : ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
997 : {
998 45 : eAkt = EXC_STATE_GLOBALS;
999 45 : aIn.SeekGlobalPosition();
1000 : }
1001 84 : break;
1002 36 : case 0x12: DocProtect(); break; // PROTECT [ 5678]
1003 36 : case 0x13: DocPasssword(); break;
1004 36 : case 0x19: WinProtection(); break;
1005 : case 0x2F: // FILEPASS [ 2345 ]
1006 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
1007 0 : if( eLastErr != ERRCODE_NONE )
1008 0 : eAkt = EXC_STATE_END;
1009 0 : break;
1010 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
1011 44 : case 0x3D: Window1(); break;
1012 44 : case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
1013 157 : case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5 ]
1014 43 : case 0x8C: Country(); break; // COUNTRY [ 345 ]
1015 :
1016 : // PALETTE follows XFs, but already needed while reading the XFs
1017 2 : case EXC_ID_PALETTE: rPal.ReadPalette( maStrm ); break;
1018 : }
1019 : }
1020 9178 : break;
1021 :
1022 : // ----------------------------------------------------------------
1023 : // workbook globals
1024 : case EXC_STATE_GLOBALS:
1025 : {
1026 8889 : switch( nRecId )
1027 : {
1028 : case EXC_ID_EOF:
1029 : case EXC_ID_EXTSST:
1030 : /* #i56376# evil hack: if EOF for globals is missing,
1031 : simulate it. This hack works only for the bugdoc
1032 : given in the issue, where the sheet substreams
1033 : start directly after the EXTSST record. A future
1034 : implementation should be more robust against
1035 : missing EOFs. */
1036 129 : if( (nRecId == EXC_ID_EOF) ||
1037 39 : ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
1038 : {
1039 45 : rNumFmtBfr.CreateScFormats();
1040 45 : rXFBfr.CreateUserStyles();
1041 45 : rPTableMgr.ReadPivotCaches( maStrm );
1042 45 : rNameMgr.ConvertAllTokens();
1043 45 : eAkt = EXC_STATE_BEFORE_SHEET;
1044 : }
1045 84 : break;
1046 43 : case 0x0E: Precision(); break; // PRECISION
1047 44 : case 0x22: Rec1904(); break; // 1904 [ 2345 ]
1048 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
1049 44 : case 0x8D: Hideobj(); break; // HIDEOBJ [ 345 ]
1050 27 : case 0xD3: SetHasBasic(); break;
1051 0 : case 0xDE: Olesize(); break;
1052 :
1053 28 : case EXC_ID_CODENAME: ReadCodeName( aIn, true ); break;
1054 43 : case EXC_ID_USESELFS: ReadUsesElfs(); break;
1055 :
1056 610 : case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break;
1057 692 : case EXC_ID4_FORMAT: rNumFmtBfr.ReadFormat( maStrm ); break;
1058 2759 : case EXC_ID5_XF: rXFBfr.ReadXF( maStrm ); break;
1059 968 : case EXC_ID_STYLE: rXFBfr.ReadStyle( maStrm ); break;
1060 :
1061 40 : case EXC_ID_SST: rSst.ReadSst( maStrm ); break;
1062 43 : case EXC_ID_TABID: rTabInfo.ReadTabid( maStrm ); break;
1063 98 : case EXC_ID_NAME: rNameMgr.ReadName( maStrm ); break;
1064 :
1065 33 : case EXC_ID_EXTERNSHEET: rLinkMgr.ReadExternsheet( maStrm ); break;
1066 33 : case EXC_ID_SUPBOOK: rLinkMgr.ReadSupbook( maStrm ); break;
1067 0 : case EXC_ID_XCT: rLinkMgr.ReadXct( maStrm ); break;
1068 0 : case EXC_ID_CRN: rLinkMgr.ReadCrn( maStrm ); break;
1069 0 : case EXC_ID_EXTERNNAME: rLinkMgr.ReadExternname( maStrm, pFormConv ); break;
1070 :
1071 34 : case EXC_ID_MSODRAWINGGROUP:rObjMgr.ReadMsoDrawingGroup( maStrm ); break;
1072 :
1073 1 : case EXC_ID_SXIDSTM: rPTableMgr.ReadSxidstm( maStrm ); break;
1074 1 : case EXC_ID_SXVS: rPTableMgr.ReadSxvs( maStrm ); break;
1075 1 : case EXC_ID_DCONREF: rPTableMgr.ReadDconref( maStrm ); break;
1076 0 : case EXC_ID_DCONNAME: rPTableMgr.ReadDConName( maStrm ); break;
1077 : }
1078 :
1079 : }
1080 8889 : break;
1081 :
1082 : // ----------------------------------------------------------------
1083 : // prefetch for worksheet
1084 : case EXC_STATE_SHEET_PRE:
1085 : {
1086 429208 : switch( nRecId )
1087 : {
1088 : // skip chart substream
1089 : case EXC_ID2_BOF:
1090 : case EXC_ID3_BOF:
1091 : case EXC_ID4_BOF:
1092 41 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1093 :
1094 154 : case EXC_ID_WINDOW2: rTabViewSett.ReadWindow2( maStrm, false );break;
1095 2 : case EXC_ID_SCL: rTabViewSett.ReadScl( maStrm ); break;
1096 16 : case EXC_ID_PANE: rTabViewSett.ReadPane( maStrm ); break;
1097 168 : case EXC_ID_SELECTION: rTabViewSett.ReadSelection( maStrm ); break;
1098 :
1099 : case EXC_ID2_DIMENSIONS:
1100 156 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
1101 :
1102 87 : case EXC_ID_CODENAME: ReadCodeName( aIn, false ); bSheetHasCodeName = true; break;
1103 :
1104 : case 0x0A: // EOF [ 2345 ]
1105 : {
1106 155 : eAkt = EXC_STATE_SHEET;
1107 155 : OUString sName;
1108 155 : GetDoc().GetName( GetCurrScTab(), sName );
1109 155 : if ( !bSheetHasCodeName )
1110 : {
1111 68 : nTabsWithNoCodeName.push_back( GetCurrScTab() );
1112 : OSL_TRACE("No Codename for %d", GetCurrScTab() );
1113 : }
1114 : else
1115 : {
1116 87 : OUString sCodeName;
1117 87 : GetDoc().GetCodeName( GetCurrScTab(), sCodeName );
1118 : OSL_TRACE("Have CodeName %s for SheetName %s",
1119 : OUStringToOString( sCodeName, RTL_TEXTENCODING_UTF8 ).getStr(), OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr() );
1120 87 : aCodeNames.push_back( sCodeName );
1121 : }
1122 :
1123 155 : bSheetHasCodeName = false; // reset
1124 :
1125 155 : aIn.SeekGlobalPosition(); // und zurueck an alte Position
1126 155 : break;
1127 : }
1128 12 : case 0x12: SheetProtect(); break;
1129 1 : case 0x13: SheetPassword(); break;
1130 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
1131 154 : case 0x55: DefColWidth(); break;
1132 312 : case 0x7D: Colinfo(); break; // COLINFO [ 345 ]
1133 155 : case 0x81: Wsbool(); break; // WSBOOL [ 2345 ]
1134 0 : case 0x8C: Country(); break; // COUNTRY [ 345 ]
1135 1 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45 ]
1136 5 : case 0x9B: FilterMode(); break; // FILTERMODE
1137 8 : case EXC_ID_AUTOFILTERINFO: AutoFilterInfo(); break;// AUTOFILTERINFO
1138 5 : case EXC_ID_AUTOFILTER: AutoFilter(); break; // AUTOFILTER
1139 200500 : case 0x0208: Row34(); break; // ROW [ 34 ]
1140 : case EXC_ID2_ARRAY:
1141 2 : case EXC_ID3_ARRAY: Array34(); break; // ARRAY [ 34 ]
1142 155 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345 ]
1143 13 : case 0x04BC: Shrfmla(); break; // SHRFMLA [ 5 ]
1144 81 : case 0x0867: SheetProtection(); break; // SHEETPROTECTION
1145 : }
1146 : }
1147 429208 : break;
1148 :
1149 : // ----------------------------------------------------------------
1150 : // worksheet
1151 : case EXC_STATE_SHEET:
1152 : {
1153 428790 : switch( nRecId )
1154 : {
1155 : // skip unknown substreams
1156 : case EXC_ID2_BOF:
1157 : case EXC_ID3_BOF:
1158 : case EXC_ID4_BOF:
1159 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1160 :
1161 155 : case EXC_ID_EOF: Eof(); eAkt = EXC_STATE_BEFORE_SHEET; break;
1162 :
1163 : case EXC_ID2_BLANK:
1164 196352 : case EXC_ID3_BLANK: ReadBlank(); break;
1165 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
1166 : case EXC_ID2_NUMBER:
1167 1847 : case EXC_ID3_NUMBER: ReadNumber(); break;
1168 : case EXC_ID2_LABEL:
1169 0 : case EXC_ID3_LABEL: ReadLabel(); break;
1170 : case EXC_ID2_BOOLERR:
1171 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
1172 2056 : case EXC_ID_RK: ReadRk(); break;
1173 :
1174 : case EXC_ID2_FORMULA:
1175 : case EXC_ID3_FORMULA:
1176 2469 : case EXC_ID4_FORMULA: Formula25(); break;
1177 138 : case 0x000C: Calccount(); break; // CALCCOUNT
1178 154 : case 0x0010: Delta(); break; // DELTA
1179 154 : case 0x0011: Iteration(); break; // ITERATION
1180 : case 0x007E:
1181 0 : case 0x00AE: Scenman(); break; // SCENMAN
1182 0 : case 0x00AF: Scenario(); break; // SCENARIO
1183 2087 : case 0x00BD: Mulrk(); break; // MULRK [ 5 ]
1184 1874 : case 0x00BE: Mulblank(); break; // MULBLANK [ 5 ]
1185 0 : case 0x00D6: Rstring(); break; // RSTRING [ 5 ]
1186 34 : case 0x00E5: Cellmerging(); break; // CELLMERGING
1187 10614 : case 0x00FD: Labelsst(); break; // LABELSST [ 8 ]
1188 0 : case 0x0236: TableOp(); break; // TABLE
1189 :
1190 : case EXC_ID_HORPAGEBREAKS:
1191 2 : case EXC_ID_VERPAGEBREAKS: rPageSett.ReadPageBreaks( maStrm ); break;
1192 : case EXC_ID_HEADER:
1193 311 : case EXC_ID_FOOTER: rPageSett.ReadHeaderFooter( maStrm ); break;
1194 : case EXC_ID_LEFTMARGIN:
1195 : case EXC_ID_RIGHTMARGIN:
1196 : case EXC_ID_TOPMARGIN:
1197 256 : case EXC_ID_BOTTOMMARGIN: rPageSett.ReadMargin( maStrm ); break;
1198 154 : case EXC_ID_PRINTHEADERS: rPageSett.ReadPrintHeaders( maStrm ); break;
1199 155 : case EXC_ID_PRINTGRIDLINES: rPageSett.ReadPrintGridLines( maStrm ); break;
1200 : case EXC_ID_HCENTER:
1201 312 : case EXC_ID_VCENTER: rPageSett.ReadCenter( maStrm ); break;
1202 156 : case EXC_ID_SETUP: rPageSett.ReadSetup( maStrm ); break;
1203 0 : case EXC_ID8_IMGDATA: rPageSett.ReadImgData( maStrm ); break;
1204 :
1205 79 : case EXC_ID_MSODRAWING: GetCurrSheetDrawing().ReadMsoDrawing( maStrm ); break;
1206 : // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format
1207 0 : case EXC_ID_OBJ: GetCurrSheetDrawing().ReadObj( maStrm ); break;
1208 1 : case EXC_ID_NOTE: GetCurrSheetDrawing().ReadNote( maStrm ); break;
1209 :
1210 8 : case EXC_ID_HLINK: XclImpHyperlink::ReadHlink( maStrm ); break;
1211 0 : case EXC_ID_LABELRANGES: XclImpLabelranges::ReadLabelranges( maStrm ); break;
1212 :
1213 2 : case EXC_ID_CONDFMT: rCondFmtMgr.ReadCondfmt( maStrm ); break;
1214 2 : case EXC_ID_CF: rCondFmtMgr.ReadCF( maStrm ); break;
1215 :
1216 5 : case EXC_ID_DVAL: rValidMgr.ReadDval( maStrm ); break;
1217 3 : case EXC_ID_DV: rValidMgr.ReadDV( maStrm ); break;
1218 :
1219 0 : case EXC_ID_QSI: rWQBfr.ReadQsi( maStrm ); break;
1220 0 : case EXC_ID_WQSTRING: rWQBfr.ReadWqstring( maStrm ); break;
1221 0 : case EXC_ID_PQRY: rWQBfr.ReadParamqry( maStrm ); break;
1222 0 : case EXC_ID_WQSETT: rWQBfr.ReadWqsettings( maStrm ); break;
1223 0 : case EXC_ID_WQTABLES: rWQBfr.ReadWqtables( maStrm ); break;
1224 :
1225 1 : case EXC_ID_SXVIEW: rPTableMgr.ReadSxview( maStrm ); break;
1226 2 : case EXC_ID_SXVD: rPTableMgr.ReadSxvd( maStrm ); break;
1227 6 : case EXC_ID_SXVI: rPTableMgr.ReadSxvi( maStrm ); break;
1228 1 : case EXC_ID_SXIVD: rPTableMgr.ReadSxivd( maStrm ); break;
1229 0 : case EXC_ID_SXPI: rPTableMgr.ReadSxpi( maStrm ); break;
1230 0 : case EXC_ID_SXDI: rPTableMgr.ReadSxdi( maStrm ); break;
1231 2 : case EXC_ID_SXVDEX: rPTableMgr.ReadSxvdex( maStrm ); break;
1232 1 : case EXC_ID_SXEX: rPTableMgr.ReadSxex( maStrm ); break;
1233 0 : case EXC_ID_SHEETEXT: rTabViewSett.ReadTabBgColor( maStrm, rPal ); break;
1234 1 : case EXC_ID_SXVIEWEX9: rPTableMgr.ReadSxViewEx9( maStrm ); break;
1235 : }
1236 : }
1237 428790 : break;
1238 :
1239 : // ----------------------------------------------------------------
1240 : default:;
1241 : }
1242 : }
1243 :
1244 46 : if( eLastErr == eERR_OK )
1245 : {
1246 : // In some strange circumstances a the codename might be missing
1247 : // # Create any missing Sheet CodeNames
1248 46 : std::vector < SCTAB >::iterator it_end = nTabsWithNoCodeName.end();
1249 114 : for ( std::vector < SCTAB >::iterator it = nTabsWithNoCodeName.begin(); it != it_end; ++it )
1250 : {
1251 68 : SCTAB nTab = 1;
1252 : OSL_TRACE("Trying to find suitable codename for %d", *it );
1253 : while ( true )
1254 : {
1255 255 : OUStringBuffer aBuf;
1256 255 : aBuf.appendAscii("Sheet");
1257 255 : aBuf.append(static_cast<sal_Int32>(nTab++));
1258 442 : OUString sTmpName = aBuf.makeStringAndClear();
1259 255 : std::vector<OUString>::iterator codeName_It = aCodeNames.begin();
1260 255 : std::vector<OUString>::iterator codeName_It_end = aCodeNames.end();
1261 : // search for codename
1262 1081 : for ( ; codeName_It != codeName_It_end; ++codeName_It )
1263 : {
1264 1013 : if ( *codeName_It == sTmpName )
1265 187 : break;
1266 : }
1267 :
1268 255 : if ( codeName_It == codeName_It_end ) // generated codename not found
1269 : {
1270 : OSL_TRACE("Using generated codename %s", OUStringToOString( sTmpName, RTL_TEXTENCODING_UTF8 ).getStr() );
1271 : // Set new codename
1272 68 : GetDoc().SetCodeName( *it, sTmpName );
1273 : // Record newly used codename
1274 68 : aCodeNames.push_back(sTmpName);
1275 : // Record those we have created so they can be created in
1276 : // basic
1277 68 : maAutoGeneratedCodeNames.push_back( sTmpName );
1278 68 : break;
1279 : }
1280 187 : }
1281 :
1282 187 : }
1283 : // #i45843# Convert pivot tables before calculation, so they are available
1284 : // for the GETPIVOTDATA function.
1285 46 : if( GetBiff() == EXC_BIFF8 )
1286 46 : GetPivotTableManager().ConvertPivotTables();
1287 :
1288 46 : pProgress.reset();
1289 : #if 0
1290 : // Excel documents look much better without this call; better in the
1291 : // sense that the row heights are identical to the original heights in
1292 : // Excel.
1293 : if (pD->IsAdjustHeightEnabled())
1294 : AdjustRowHeight();
1295 : #endif
1296 46 : PostDocLoad();
1297 :
1298 46 : pD->CalcAfterLoad();
1299 :
1300 : // import change tracking data
1301 46 : XclImpChangeTrack aImpChTr( GetRoot(), maStrm );
1302 46 : aImpChTr.Apply();
1303 :
1304 46 : const XclImpAddressConverter& rAddrConv = GetAddressConverter();
1305 46 : if( rAddrConv.IsTabTruncated() )
1306 0 : eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW;
1307 46 : else if( bTabTruncated || rAddrConv.IsRowTruncated() )
1308 0 : eLastErr = SCWARN_IMPORT_ROW_OVERFLOW;
1309 46 : else if( rAddrConv.IsColTruncated() )
1310 1 : eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
1311 :
1312 46 : if( GetBiff() == EXC_BIFF8 )
1313 46 : GetPivotTableManager().MaybeRefreshPivotTables();
1314 : }
1315 :
1316 92 : return eLastErr;
1317 15 : }
1318 :
1319 : //___________________________________________________________________
1320 :
1321 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|