blob: f4f92e3d4312c4fb6f3c193acff5d96907193abb [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
// Das geht: Versionserkennung WKS, WK1 und WK3
// ...Rest steht in op.cpp
//------------------------------------------------------------------------
#include <tools/solar.h>
#include <string.h>
#include <map>
#include "filter.hxx"
#include "document.hxx"
#include "compiler.hxx"
#include "scerrors.hxx"
#include "root.hxx"
#include "lotrange.hxx"
#include "optab.h"
#include "scmem.h"
#include "decl.h"
#include "tool.h"
#include "fprogressbar.hxx"
#include "op.h"
// Konstanten ------------------------------------------------------------
const sal_uInt16 nBOF = 0x0000;
// externe Variablen -----------------------------------------------------
extern WKTYP eTyp; // Typ der gerade in bearbeitung befindlichen Datei
WKTYP eTyp;
extern sal_Bool bEOF; // zeigt Ende der Datei
sal_Bool bEOF;
extern CharSet eCharVon;
CharSet eCharVon;
extern ScDocument* pDoc; // Aufhaenger zum Dokumentzugriff
ScDocument* pDoc;
extern OPCODE_FKT pOpFkt[ FKT_LIMIT ];
// -> optab.cxx, Tabelle moeglicher Opcodes
extern OPCODE_FKT pOpFkt123[ FKT_LIMIT123 ];
// -> optab.cxx, Table of possible Opcodes
LOTUS_ROOT* pLotusRoot = NULL;
std::map<sal_uInt16, ScPatternAttr> aLotusPatternPool;
static FltError
generate_Opcodes( SvStream& aStream, ScDocument& rDoc,
ScfStreamProgressBar& aPrgrsBar, WKTYP eType )
{
OPCODE_FKT *pOps;
int nOps;
switch(eType)
{
case eWK_1:
case eWK_2:
pOps = pOpFkt;
nOps = FKT_LIMIT;
break;
case eWK123:
pOps = pOpFkt123;
nOps = FKT_LIMIT123;
break;
case eWK3: return eERR_NI;
case eWK_Error: return eERR_FORMAT;
default: return eERR_UNKN_WK;
}
// #i76299# seems that SvStream::IsEof() does not work correctly
aStream.Seek( STREAM_SEEK_TO_END );
sal_Size nStrmSize = aStream.Tell();
aStream.Seek( STREAM_SEEK_TO_BEGIN );
while( !bEOF && !aStream.IsEof() && (aStream.Tell() < nStrmSize) )
{
sal_uInt16 nOpcode, nLength;
aStream >> nOpcode >> nLength;
aPrgrsBar.Progress();
if( nOpcode == LOTUS_EOF )
bEOF = sal_True;
else if( nOpcode == LOTUS_FILEPASSWD )
return eERR_FILEPASSWD;
else if( nOpcode < nOps )
pOps[ nOpcode ] ( aStream, nLength );
else if( eType == eWK123 &&
nOpcode == LOTUS_PATTERN )
{
// This is really ugly - needs re-factoring ...
aStream.SeekRel(nLength);
aStream >> nOpcode >> nLength;
if ( nOpcode == 0x29a)
{
aStream.SeekRel(nLength);
aStream >> nOpcode >> nLength;
if ( nOpcode == 0x804 )
{
aStream.SeekRel(nLength);
OP_ApplyPatternArea123(aStream);
}
else
aStream.SeekRel(nLength);
}
else
aStream.SeekRel(nLength);
}
else
aStream.SeekRel( nLength );
}
MemDelete();
rDoc.CalcAfterLoad();
return eERR_OK;
}
WKTYP ScanVersion( SvStream& aStream )
{
// PREC: pWKDatei: Zeiger auf offene Datei
// POST: return: Typ der Datei
sal_uInt16 nOpcode, nVersNr, nRecLen;
// erstes Byte muss wegen BOF zwingend 0 sein!
aStream >> nOpcode;
if( nOpcode != nBOF )
return eWK_UNKNOWN;
aStream >> nRecLen >> nVersNr;
if( aStream.IsEof() )
return eWK_Error;
switch( nVersNr )
{
case 0x0404:
if( nRecLen == 2 )
return eWK_1;
else
return eWK_UNKNOWN;
case 0x0406:
if( nRecLen == 2 )
return eWK_2;
else
return eWK_UNKNOWN;
case 0x1000:
aStream >> nVersNr;
if( aStream.IsEof() ) return eWK_Error;
if( nVersNr == 0x0004 && nRecLen == 26 )
{ // 4 bytes of 26 read => skip 22 (read instead of seek to make IsEof() work just in case)
sal_Char aDummy[22];
aStream.Read( aDummy, 22 );
return aStream.IsEof() ? eWK_Error : eWK3;
}
break;
case 0x1003:
if( nRecLen == 0x1a )
return eWK123;
else
return eWK_UNKNOWN;
case 0x1005:
if( nRecLen == 0x1a )
return eWK123;
else
return eWK_UNKNOWN;
}
return eWK_UNKNOWN;
}
FltError ScImportLotus123old( SvStream& aStream, ScDocument* pDocument, CharSet eSrc )
{
aStream.Seek( 0UL );
// Zeiger auf Dokument global machen
pDoc = pDocument;
bEOF = sal_False;
eCharVon = eSrc;
// Speicher besorgen
if( !MemNew() )
return eERR_NOMEM;
InitPage(); // Seitenformat initialisieren (nur Tab 0!)
// Progressbar starten
ScfStreamProgressBar aPrgrsBar( aStream, pDocument->GetDocumentShell() );
// Datei-Typ ermitteln
eTyp = ScanVersion( aStream );
aLotusPatternPool.clear();
return generate_Opcodes( aStream, *pDoc, aPrgrsBar, eTyp );
}