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(): Kein Stream - wie dass?!" );
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(): Zustand vergessen!" );
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 20 : FltError ImportExcel8::Read( void )
771 : {
772 : #if 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 20 : XclImpPageSettings& rPageSett = GetPageSettings();
783 20 : XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
784 20 : XclImpPalette& rPal = GetPalette();
785 20 : XclImpFontBuffer& rFontBfr = GetFontBuffer();
786 20 : XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer();
787 20 : XclImpXFBuffer& rXFBfr = GetXFBuffer();
788 20 : XclImpSst& rSst = GetSst();
789 20 : XclImpTabInfo& rTabInfo = GetTabInfo();
790 20 : XclImpNameManager& rNameMgr = GetNameManager();
791 20 : XclImpLinkManager& rLinkMgr = GetLinkManager();
792 20 : XclImpObjectManager& rObjMgr = GetObjectManager();
793 : // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets)
794 20 : XclImpCondFormatManager& rCondFmtMgr = GetCondFormatManager();
795 20 : XclImpValidationManager& rValidMgr = GetValidationManager();
796 20 : XclImpPivotTableManager& rPTableMgr = GetPivotTableManager();
797 20 : XclImpWebQueryBuffer& rWQBfr = GetWebQueryBuffer();
798 :
799 20 : 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 20 : XclImpReadState eAkt = EXC_STATE_BEFORE_GLOBALS;
813 :
814 20 : FltError eLastErr = eERR_OK;
815 :
816 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
817 : ::std::auto_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar(
818 20 : 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 20 : sal_Size nProgressBasePos = 0;
824 20 : sal_Size nProgressBaseSize = 0;
825 :
826 20 : bool bSheetHasCodeName = false;
827 :
828 20 : std::vector<rtl::OUString> aCodeNames;
829 20 : std::vector < SCTAB > nTabsWithNoCodeName;
830 :
831 66756 : while( eAkt != EXC_STATE_END )
832 : {
833 66736 : if( eAkt == EXC_STATE_BEFORE_SHEET )
834 : {
835 93 : sal_uInt16 nScTab = GetCurrScTab();
836 93 : if( nScTab < maSheetOffsets.size() )
837 : {
838 75 : nProgressBaseSize += (maStrm.GetSvStreamPos() - nProgressBasePos);
839 75 : 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 75 : if (aIn.PeekRecId(nProgressBasePos) == EXC_ID5_BOF)
847 : // BOUNDSHEET points to a valid BOF record. Good.
848 75 : 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 : // FIXME_REMOVE_WHEN_RE_BASE_COMPLETE
861 : // a lamer approach to do the above from dr:
862 :
863 : // import only 256 sheets
864 75 : if( nScTab > GetScMaxPos().Tab() )
865 : {
866 0 : if( maStrm.GetRecId() != EXC_ID_EOF )
867 0 : XclTools::SkipSubStream( maStrm );
868 : // #i29930# show warning box
869 0 : GetAddressConverter().CheckScTab( nScTab, true );
870 0 : eAkt = EXC_STATE_END;
871 : }
872 : else
873 : {
874 : // #i109800# SHEET record may point to any record inside the
875 : // sheet substream
876 75 : bool bIsBof = maStrm.GetRecId() == EXC_ID5_BOF;
877 75 : if( bIsBof )
878 75 : Bof5(); // read the BOF record
879 : else
880 0 : pExcRoot->eDateiTyp = Biff8; // on missing BOF, assume a standard worksheet
881 75 : NeueTabelle();
882 75 : switch( pExcRoot->eDateiTyp )
883 : {
884 : case Biff8: // worksheet
885 : case Biff8M4: // macro sheet
886 75 : eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
887 : // go to next record
888 75 : if( bIsBof ) maStrm.StartNextRecord();
889 75 : maStrm.StoreGlobalPosition();
890 75 : break;
891 : case Biff8C: // chart sheet
892 0 : GetCurrSheetDrawing().ReadTabChart( maStrm );
893 0 : Eof();
894 0 : GetTracer().TraceChartOnlySheet();
895 0 : break;
896 : case Biff8W: // workbook
897 : OSL_FAIL( "ImportExcel8::Read - double workbook globals" );
898 : // run through
899 : case Biff8V: // VB module
900 : default:
901 : // TODO: do not create a sheet in the Calc document
902 0 : pD->SetVisible( nScTab, false );
903 0 : XclTools::SkipSubStream( maStrm );
904 0 : IncCurrScTab();
905 : }
906 : }
907 : }
908 : else
909 18 : eAkt = EXC_STATE_END;
910 : }
911 : else
912 66643 : aIn.StartNextRecord();
913 :
914 66736 : if( !aIn.IsValid() )
915 : {
916 : // #i63591# finalize table if EOF is missing
917 3 : switch( eAkt )
918 : {
919 : case EXC_STATE_SHEET_PRE:
920 1 : eAkt = EXC_STATE_SHEET;
921 1 : aIn.SeekGlobalPosition();
922 1 : continue; // next iteration in while loop
923 : case EXC_STATE_SHEET:
924 1 : Eof();
925 1 : eAkt = EXC_STATE_END;
926 1 : break;
927 : default:
928 1 : eAkt = EXC_STATE_END;
929 : }
930 : }
931 :
932 66735 : if( eAkt == EXC_STATE_END )
933 20 : break;
934 :
935 66715 : if( eAkt != EXC_STATE_SHEET_PRE && eAkt != EXC_STATE_GLOBALS_PRE )
936 33123 : pProgress->ProgressAbs( nProgressBaseSize + aIn.GetSvStreamPos() - nProgressBasePos );
937 :
938 66715 : sal_uInt16 nRecId = aIn.GetRecId();
939 :
940 : /* #i39464# Ignore records between USERSVIEWBEGIN and USERSVIEWEND
941 : completely (user specific view settings). Otherwise view settings
942 : and filters are loaded multiple times, which at least causes
943 : problems in auto-filters. */
944 66715 : switch( nRecId )
945 : {
946 : case EXC_ID_USERSVIEWBEGIN:
947 : OSL_ENSURE( !bInUserView, "ImportExcel8::Read - nested user view settings" );
948 0 : bInUserView = true;
949 0 : break;
950 : case EXC_ID_USERSVIEWEND:
951 : OSL_ENSURE( bInUserView, "ImportExcel8::Read - not in user view settings" );
952 0 : bInUserView = false;
953 0 : break;
954 : }
955 :
956 66715 : if( !bInUserView ) switch( eAkt )
957 : {
958 : // ----------------------------------------------------------------
959 : // before workbook globals: wait for initial workbook globals BOF
960 : case EXC_STATE_BEFORE_GLOBALS:
961 : {
962 25 : if( nRecId == EXC_ID5_BOF )
963 : {
964 : OSL_ENSURE( GetBiff() == EXC_BIFF8, "ImportExcel8::Read - wrong BIFF version" );
965 20 : Bof5();
966 20 : if( pExcRoot->eDateiTyp == Biff8W )
967 : {
968 19 : eAkt = EXC_STATE_GLOBALS_PRE;
969 19 : maStrm.StoreGlobalPosition();
970 19 : nBdshtTab = 0;
971 : }
972 1 : else if( pExcRoot->eDateiTyp == Biff8 )
973 : {
974 : // #i62752# possible to have BIFF8 sheet without globals
975 0 : NeueTabelle();
976 0 : eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
977 0 : bSheetHasCodeName = false; // reset
978 0 : aIn.StoreGlobalPosition();
979 : }
980 : }
981 : }
982 25 : break;
983 :
984 : // ----------------------------------------------------------------
985 : // prefetch for workbook globals
986 : case EXC_STATE_GLOBALS_PRE:
987 : {
988 4881 : switch( nRecId )
989 : {
990 : case EXC_ID_EOF:
991 : case EXC_ID_EXTSST:
992 : /* #i56376# evil hack: if EOF for globals is missing,
993 : simulate it. This hack works only for the bugdoc
994 : given in the issue, where the sheet substreams
995 : start directly after the EXTSST record. A future
996 : implementation should be more robust against
997 : missing EOFs. */
998 49 : if( (nRecId == EXC_ID_EOF) ||
999 15 : ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
1000 : {
1001 19 : eAkt = EXC_STATE_GLOBALS;
1002 19 : aIn.SeekGlobalPosition();
1003 : }
1004 34 : break;
1005 11 : case 0x12: DocProtect(); break; // PROTECT [ 5678]
1006 11 : case 0x13: DocPasssword(); break;
1007 11 : case 0x19: WinProtection(); break;
1008 : case 0x2F: // FILEPASS [ 2345 ]
1009 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
1010 0 : if( eLastErr != ERRCODE_NONE )
1011 0 : eAkt = EXC_STATE_END;
1012 0 : break;
1013 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
1014 18 : case 0x3D: Window1(); break;
1015 18 : case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
1016 76 : case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5 ]
1017 17 : case 0x8C: Country(); break; // COUNTRY [ 345 ]
1018 :
1019 : // PALETTE follows XFs, but already needed while reading the XFs
1020 2 : case EXC_ID_PALETTE: rPal.ReadPalette( maStrm ); break;
1021 : }
1022 : }
1023 4881 : break;
1024 :
1025 : // ----------------------------------------------------------------
1026 : // workbook globals
1027 : case EXC_STATE_GLOBALS:
1028 : {
1029 4674 : switch( nRecId )
1030 : {
1031 : case EXC_ID_EOF:
1032 : case EXC_ID_EXTSST:
1033 : /* #i56376# evil hack: if EOF for globals is missing,
1034 : simulate it. This hack works only for the bugdoc
1035 : given in the issue, where the sheet substreams
1036 : start directly after the EXTSST record. A future
1037 : implementation should be more robust against
1038 : missing EOFs. */
1039 49 : if( (nRecId == EXC_ID_EOF) ||
1040 15 : ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
1041 : {
1042 19 : rNumFmtBfr.CreateScFormats();
1043 19 : rXFBfr.CreateUserStyles();
1044 19 : rPTableMgr.ReadPivotCaches( maStrm );
1045 19 : rNameMgr.ConvertAllTokens();
1046 19 : eAkt = EXC_STATE_BEFORE_SHEET;
1047 : }
1048 34 : break;
1049 17 : case 0x0E: Precision(); break; // PRECISION
1050 18 : case 0x22: Rec1904(); break; // 1904 [ 2345 ]
1051 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
1052 18 : case 0x8D: Hideobj(); break; // HIDEOBJ [ 345 ]
1053 3 : case 0xD3: SetHasBasic(); break;
1054 0 : case 0xDE: Olesize(); break;
1055 :
1056 4 : case EXC_ID_CODENAME: ReadCodeName( aIn, true ); break;
1057 17 : case EXC_ID_USESELFS: ReadUsesElfs(); break;
1058 :
1059 305 : case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break;
1060 174 : case EXC_ID4_FORMAT: rNumFmtBfr.ReadFormat( maStrm ); break;
1061 1719 : case EXC_ID5_XF: rXFBfr.ReadXF( maStrm ); break;
1062 426 : case EXC_ID_STYLE: rXFBfr.ReadStyle( maStrm ); break;
1063 :
1064 16 : case EXC_ID_SST: rSst.ReadSst( maStrm ); break;
1065 17 : case EXC_ID_TABID: rTabInfo.ReadTabid( maStrm ); break;
1066 39 : case EXC_ID_NAME: rNameMgr.ReadName( maStrm ); break;
1067 :
1068 11 : case EXC_ID_EXTERNSHEET: rLinkMgr.ReadExternsheet( maStrm ); break;
1069 11 : case EXC_ID_SUPBOOK: rLinkMgr.ReadSupbook( maStrm ); break;
1070 0 : case EXC_ID_XCT: rLinkMgr.ReadXct( maStrm ); break;
1071 0 : case EXC_ID_CRN: rLinkMgr.ReadCrn( maStrm ); break;
1072 0 : case EXC_ID_EXTERNNAME: rLinkMgr.ReadExternname( maStrm, pFormConv ); break;
1073 :
1074 12 : case EXC_ID_MSODRAWINGGROUP:rObjMgr.ReadMsoDrawingGroup( maStrm ); break;
1075 :
1076 1 : case EXC_ID_SXIDSTM: rPTableMgr.ReadSxidstm( maStrm ); break;
1077 1 : case EXC_ID_SXVS: rPTableMgr.ReadSxvs( maStrm ); break;
1078 1 : case EXC_ID_DCONREF: rPTableMgr.ReadDconref( maStrm ); break;
1079 0 : case EXC_ID_DCONNAME: rPTableMgr.ReadDConName( maStrm ); break;
1080 : }
1081 :
1082 : }
1083 4674 : break;
1084 :
1085 : // ----------------------------------------------------------------
1086 : // prefetch for worksheet
1087 : case EXC_STATE_SHEET_PRE:
1088 : {
1089 28711 : switch( nRecId )
1090 : {
1091 : // skip chart substream
1092 : case EXC_ID2_BOF:
1093 : case EXC_ID3_BOF:
1094 : case EXC_ID4_BOF:
1095 41 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1096 :
1097 73 : case EXC_ID_WINDOW2: rTabViewSett.ReadWindow2( maStrm, false );break;
1098 1 : case EXC_ID_SCL: rTabViewSett.ReadScl( maStrm ); break;
1099 16 : case EXC_ID_PANE: rTabViewSett.ReadPane( maStrm ); break;
1100 87 : case EXC_ID_SELECTION: rTabViewSett.ReadSelection( maStrm ); break;
1101 :
1102 : case EXC_ID2_DIMENSIONS:
1103 75 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
1104 :
1105 10 : case EXC_ID_CODENAME: ReadCodeName( aIn, false ); bSheetHasCodeName = true; break;
1106 :
1107 : case 0x0A: // EOF [ 2345 ]
1108 : {
1109 74 : eAkt = EXC_STATE_SHEET;
1110 74 : rtl::OUString sName;
1111 74 : GetDoc().GetName( GetCurrScTab(), sName );
1112 74 : if ( !bSheetHasCodeName )
1113 : {
1114 64 : nTabsWithNoCodeName.push_back( GetCurrScTab() );
1115 : OSL_TRACE("No Codename for %d", GetCurrScTab() );
1116 : }
1117 : else
1118 : {
1119 10 : rtl::OUString sCodeName;
1120 10 : GetDoc().GetCodeName( GetCurrScTab(), sCodeName );
1121 : OSL_TRACE("Have CodeName %s for SheetName %s",
1122 : rtl::OUStringToOString( sCodeName, RTL_TEXTENCODING_UTF8 ).getStr(), rtl::OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr() );
1123 10 : aCodeNames.push_back( sCodeName );
1124 : }
1125 :
1126 74 : bSheetHasCodeName = false; // reset
1127 :
1128 74 : aIn.SeekGlobalPosition(); // und zurueck an alte Position
1129 74 : break;
1130 : }
1131 12 : case 0x12: SheetProtect(); break;
1132 1 : case 0x13: SheetPassword(); break;
1133 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
1134 73 : case 0x55: DefColWidth(); break;
1135 278 : case 0x7D: Colinfo(); break; // COLINFO [ 345 ]
1136 74 : case 0x81: Wsbool(); break; // WSBOOL [ 2345 ]
1137 0 : case 0x8C: Country(); break; // COUNTRY [ 345 ]
1138 1 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45 ]
1139 5 : case 0x9B: FilterMode(); break; // FILTERMODE
1140 7 : case EXC_ID_AUTOFILTERINFO: AutoFilterInfo(); break;// AUTOFILTERINFO
1141 5 : case EXC_ID_AUTOFILTER: AutoFilter(); break; // AUTOFILTER
1142 4596 : case 0x0208: Row34(); break; // ROW [ 34 ]
1143 : case EXC_ID2_ARRAY:
1144 2 : case EXC_ID3_ARRAY: Array34(); break; // ARRAY [ 34 ]
1145 74 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345 ]
1146 12 : case 0x04BC: Shrfmla(); break; // SHRFMLA [ 5 ]
1147 50 : case 0x0867: SheetProtection(); break; // SHEETPROTECTION
1148 : }
1149 : }
1150 28711 : break;
1151 :
1152 : // ----------------------------------------------------------------
1153 : // worksheet
1154 : case EXC_STATE_SHEET:
1155 : {
1156 28424 : switch( nRecId )
1157 : {
1158 : // skip unknown substreams
1159 : case EXC_ID2_BOF:
1160 : case EXC_ID3_BOF:
1161 : case EXC_ID4_BOF:
1162 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1163 :
1164 74 : case EXC_ID_EOF: Eof(); eAkt = EXC_STATE_BEFORE_SHEET; break;
1165 :
1166 : case EXC_ID2_BLANK:
1167 666 : case EXC_ID3_BLANK: ReadBlank(); break;
1168 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
1169 : case EXC_ID2_NUMBER:
1170 1852 : case EXC_ID3_NUMBER: ReadNumber(); break;
1171 : case EXC_ID2_LABEL:
1172 0 : case EXC_ID3_LABEL: ReadLabel(); break;
1173 : case EXC_ID2_BOOLERR:
1174 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
1175 1950 : case EXC_ID_RK: ReadRk(); break;
1176 :
1177 : case EXC_ID2_FORMULA:
1178 : case EXC_ID3_FORMULA:
1179 2429 : case EXC_ID4_FORMULA: Formula25(); break;
1180 58 : case 0x000C: Calccount(); break; // CALCCOUNT
1181 73 : case 0x0010: Delta(); break; // DELTA
1182 73 : case 0x0011: Iteration(); break; // ITERATION
1183 : case 0x007E:
1184 0 : case 0x00AE: Scenman(); break; // SCENMAN
1185 0 : case 0x00AF: Scenario(); break; // SCENARIO
1186 2004 : case 0x00BD: Mulrk(); break; // MULRK [ 5 ]
1187 1791 : case 0x00BE: Mulblank(); break; // MULBLANK [ 5 ]
1188 0 : case 0x00D6: Rstring(); break; // RSTRING [ 5 ]
1189 30 : case 0x00E5: Cellmerging(); break; // CELLMERGING
1190 10470 : case 0x00FD: Labelsst(); break; // LABELSST [ 8 ]
1191 0 : case 0x0236: TableOp(); break; // TABLE
1192 :
1193 : case EXC_ID_HORPAGEBREAKS:
1194 2 : case EXC_ID_VERPAGEBREAKS: rPageSett.ReadPageBreaks( maStrm ); break;
1195 : case EXC_ID_HEADER:
1196 149 : case EXC_ID_FOOTER: rPageSett.ReadHeaderFooter( maStrm ); break;
1197 : case EXC_ID_LEFTMARGIN:
1198 : case EXC_ID_RIGHTMARGIN:
1199 : case EXC_ID_TOPMARGIN:
1200 192 : case EXC_ID_BOTTOMMARGIN: rPageSett.ReadMargin( maStrm ); break;
1201 73 : case EXC_ID_PRINTHEADERS: rPageSett.ReadPrintHeaders( maStrm ); break;
1202 74 : case EXC_ID_PRINTGRIDLINES: rPageSett.ReadPrintGridLines( maStrm ); break;
1203 : case EXC_ID_HCENTER:
1204 150 : case EXC_ID_VCENTER: rPageSett.ReadCenter( maStrm ); break;
1205 75 : case EXC_ID_SETUP: rPageSett.ReadSetup( maStrm ); break;
1206 0 : case EXC_ID8_IMGDATA: rPageSett.ReadImgData( maStrm ); break;
1207 :
1208 50 : case EXC_ID_MSODRAWING: GetCurrSheetDrawing().ReadMsoDrawing( maStrm ); break;
1209 : // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format
1210 0 : case EXC_ID_OBJ: GetCurrSheetDrawing().ReadObj( maStrm ); break;
1211 1 : case EXC_ID_NOTE: GetCurrSheetDrawing().ReadNote( maStrm ); break;
1212 :
1213 8 : case EXC_ID_HLINK: XclImpHyperlink::ReadHlink( maStrm ); break;
1214 0 : case EXC_ID_LABELRANGES: XclImpLabelranges::ReadLabelranges( maStrm ); break;
1215 :
1216 3 : case EXC_ID_CONDFMT: rCondFmtMgr.ReadCondfmt( maStrm ); break;
1217 11 : case EXC_ID_CF: rCondFmtMgr.ReadCF( maStrm ); break;
1218 :
1219 2 : case EXC_ID_DVAL: rValidMgr.ReadDval( maStrm ); break;
1220 1 : case EXC_ID_DV: rValidMgr.ReadDV( maStrm ); break;
1221 :
1222 0 : case EXC_ID_QSI: rWQBfr.ReadQsi( maStrm ); break;
1223 0 : case EXC_ID_WQSTRING: rWQBfr.ReadWqstring( maStrm ); break;
1224 0 : case EXC_ID_PQRY: rWQBfr.ReadParamqry( maStrm ); break;
1225 0 : case EXC_ID_WQSETT: rWQBfr.ReadWqsettings( maStrm ); break;
1226 0 : case EXC_ID_WQTABLES: rWQBfr.ReadWqtables( maStrm ); break;
1227 :
1228 1 : case EXC_ID_SXVIEW: rPTableMgr.ReadSxview( maStrm ); break;
1229 2 : case EXC_ID_SXVD: rPTableMgr.ReadSxvd( maStrm ); break;
1230 6 : case EXC_ID_SXVI: rPTableMgr.ReadSxvi( maStrm ); break;
1231 1 : case EXC_ID_SXIVD: rPTableMgr.ReadSxivd( maStrm ); break;
1232 0 : case EXC_ID_SXPI: rPTableMgr.ReadSxpi( maStrm ); break;
1233 0 : case EXC_ID_SXDI: rPTableMgr.ReadSxdi( maStrm ); break;
1234 2 : case EXC_ID_SXVDEX: rPTableMgr.ReadSxvdex( maStrm ); break;
1235 1 : case EXC_ID_SXEX: rPTableMgr.ReadSxex( maStrm ); break;
1236 0 : case EXC_ID_SHEETEXT: rTabViewSett.ReadTabBgColor( maStrm, rPal ); break;
1237 1 : case EXC_ID_SXVIEWEX9: rPTableMgr.ReadSxViewEx9( maStrm ); break;
1238 : }
1239 : }
1240 28424 : break;
1241 :
1242 : // ----------------------------------------------------------------
1243 : default:;
1244 : }
1245 : }
1246 :
1247 20 : if( eLastErr == eERR_OK )
1248 : {
1249 : // In some strange circumstances a the codename might be missing
1250 : // # Create any missing Sheet CodeNames
1251 20 : std::vector < SCTAB >::iterator it_end = nTabsWithNoCodeName.end();
1252 84 : for ( std::vector < SCTAB >::iterator it = nTabsWithNoCodeName.begin(); it != it_end; ++it )
1253 : {
1254 64 : SCTAB nTab = 1;
1255 : OSL_TRACE("Trying to find suitable codename for %d", *it );
1256 184 : while ( true )
1257 : {
1258 248 : rtl::OUStringBuffer aBuf;
1259 248 : aBuf.appendAscii("Sheet");
1260 248 : aBuf.append(static_cast<sal_Int32>(nTab++));
1261 248 : rtl::OUString sTmpName = aBuf.makeStringAndClear();
1262 248 : std::vector<rtl::OUString>::iterator codeName_It = aCodeNames.begin();
1263 248 : std::vector<rtl::OUString>::iterator codeName_It_end = aCodeNames.end();
1264 : // search for codename
1265 1070 : for ( ; codeName_It != codeName_It_end; ++codeName_It )
1266 : {
1267 1006 : if ( *codeName_It == sTmpName )
1268 184 : break;
1269 : }
1270 :
1271 248 : if ( codeName_It == codeName_It_end ) // generated codename not found
1272 : {
1273 : OSL_TRACE("Using generated codename %s", rtl::OUStringToOString( sTmpName, RTL_TEXTENCODING_UTF8 ).getStr() );
1274 : // Set new codename
1275 64 : GetDoc().SetCodeName( *it, sTmpName );
1276 : // Record newly used codename
1277 64 : aCodeNames.push_back(sTmpName);
1278 : // Record those we have created so they can be created in
1279 : // basic
1280 64 : maAutoGeneratedCodeNames.push_back( sTmpName );
1281 : break;
1282 : }
1283 248 : }
1284 :
1285 : }
1286 : // #i45843# Convert pivot tables before calculation, so they are available
1287 : // for the GETPIVOTDATA function.
1288 20 : if( GetBiff() == EXC_BIFF8 )
1289 20 : GetPivotTableManager().ConvertPivotTables();
1290 :
1291 20 : pProgress.reset();
1292 : #if 0
1293 : // Excel documents look much better without this call; better in the
1294 : // sense that the row heights are identical to the original heights in
1295 : // Excel.
1296 : if (pD->IsAdjustHeightEnabled())
1297 : AdjustRowHeight();
1298 : #endif
1299 20 : PostDocLoad();
1300 :
1301 20 : pD->CalcAfterLoad();
1302 :
1303 : // import change tracking data
1304 20 : XclImpChangeTrack aImpChTr( GetRoot(), maStrm );
1305 20 : aImpChTr.Apply();
1306 :
1307 20 : const XclImpAddressConverter& rAddrConv = GetAddressConverter();
1308 20 : if( rAddrConv.IsTabTruncated() )
1309 0 : eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW;
1310 20 : else if( bTabTruncated || rAddrConv.IsRowTruncated() )
1311 0 : eLastErr = SCWARN_IMPORT_ROW_OVERFLOW;
1312 20 : else if( rAddrConv.IsColTruncated() )
1313 1 : eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
1314 :
1315 20 : if( GetBiff() == EXC_BIFF8 )
1316 20 : GetPivotTableManager().MaybeRefreshPivotTables();
1317 : }
1318 :
1319 20 : return eLastErr;
1320 9 : }
1321 :
1322 : //___________________________________________________________________
1323 :
1324 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|