blob: 2b3c67ddbe5ef5c1a10976e6eac3dbac1172cdba [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"
//------------------------------------------------------------------------
#include "document.hxx"
#include "scerrors.hxx"
#include "root.hxx"
#include "lotimpop.hxx"
#include "lotattr.hxx"
#include "fprogressbar.hxx"
class ScFormulaCell;
FltError ImportLotus::Read()
{
enum STATE
{
S_START, // analyse first BOF
S_WK1, // in WK1-Stream
S_WK3, // in WK3-Section
S_WK4, // ...
S_FM3, // ...
S_END // Import finished
};
sal_uInt16 nOp;
sal_uInt16 nSubType;
sal_uInt16 nRecLen;
sal_uInt32 nNextRec = 0UL;
FltError eRet = eERR_OK;
// ScFormulaCell *pLastFormCell;
STATE eAkt = S_START;
nTab = 0;
nExtTab = -2;
pIn->Seek( nNextRec );
// Progressbar starten
ScfStreamProgressBar aPrgrsBar( *pIn, pD->GetDocumentShell() );
while( eAkt != S_END )
{
*pIn >> nOp >> nRecLen;
if( pIn->IsEof() || nNextRec > SAL_MAX_UINT32 - nRecLen - 4 )
eAkt = S_END;
nNextRec += nRecLen + 4;
switch( eAkt )
{
// -----------------------------------------------------------
case S_START: // S_START
if( nOp )
{
eRet = SCERR_IMPORT_UNKNOWN_WK;
eAkt = S_END;
}
else
{
if( nRecLen > 2 )
{
Bof();
switch( pLotusRoot->eFirstType )
{
case Lotus_WK1: eAkt = S_WK1; break;
case Lotus_WK3: eAkt = S_WK3; break;
case Lotus_WK4: eAkt = S_WK4; break;
case Lotus_FM3: eAkt = S_FM3; break;
default:
eRet = SCERR_IMPORT_UNKNOWN_WK;
eAkt = S_END;
}
}
else
{
eAkt = S_END; // hier kommt wat fuer <= WK1 hinne!
eRet = 0xFFFFFFFF;
}
}
break;
// -----------------------------------------------------------
case S_WK1: // S_WK1
break;
// -----------------------------------------------------------
case S_WK3: // S_WK3
case S_WK4: // S_WK4
switch( nOp )
{
case 0x0001: // EOF
eAkt = S_FM3;
nTab++;
break;
case 0x0002: // PASSWORD
eRet = eERR_FILEPASSWD;
eAkt = S_END;
break;
case 0x0007: // COLUMNWIDTH
Columnwidth( nRecLen );
break;
case 0x0008: // HIDDENCOLUMN
Hiddencolumn( nRecLen );
break;
case 0x0009: // USERRANGE
Userrange();
break;
case 0x0013: // FORMAT
break;
case 0x0014: // ERRCELL
Errcell();
break;
case 0x0015: // NACELL
Nacell();
break;
case 0x0016: // LABELCELL
Labelcell();
break;
case 0x0017: // NUMBERCELL
Numbercell();
break;
case 0x0018: // SMALLNUMCELL
Smallnumcell();
break;
case 0x0019: // FORMULACELL
Formulacell( nRecLen );
break;
case 0x001b: // extended attributes
if (nRecLen > 2)
{
Read( nSubType );
nRecLen -= 2;
switch( nSubType )
{
case 2007: // ROW PRESENTATION
RowPresentation( nRecLen );
break;
case 14000: // NAMED SHEET
NamedSheet();
break;
}
}
else
{
eRet = eERR_FORMAT;
eAkt = S_END;
}
}
break;
// -----------------------------------------------------------
case S_FM3: // S_FM3
break;
// -----------------------------------------------------------
case S_END: // S_END
break;
}
DBG_ASSERT( nNextRec >= pIn->Tell(),
"*ImportLotus::Read(): Etwas zu gierig..." );
pIn->Seek( nNextRec );
aPrgrsBar.Progress();
}
// duemmliche Namen eliminieren
SCTAB nTabs = pD->GetTableCount();
SCTAB nCnt;
String aTabName;
String aBaseName;
String aRef( RTL_CONSTASCII_USTRINGPARAM( "temp" ) );
if( nTabs != 0 )
{
if( nTabs > 1 )
{
pD->GetName( 0, aBaseName );
aBaseName.Erase( aBaseName.Len() - 1 );
}
for( nCnt = 1 ; nCnt < nTabs ; nCnt++ )
{
DBG_ASSERT( pD->HasTable( nCnt ),
"-ImportLotus::Read(): Wo ist meine Tabelle?!" );
pD->GetName( nCnt, aTabName );
if( aTabName == aRef )
{
aTabName = aBaseName;
pD->CreateValidTabName( aTabName );
pD->RenameTab( nCnt, aTabName );
}
}
}
pD->CalcAfterLoad();
return eRet;
}
FltError ImportLotus::Read( SvStream& rIn )
{
pIn = &rIn;
sal_Bool bRead = sal_True;
sal_uInt16 nOp;
sal_uInt16 nRecLen;
sal_uInt32 nNextRec = 0UL;
FltError eRet = eERR_OK;
nTab = 0;
nExtTab = -1;
pIn->Seek( nNextRec );
// Progressbar starten
ScfStreamProgressBar aPrgrsBar( *pIn, pD->GetDocumentShell() );
while( bRead )
{
*pIn >> nOp >> nRecLen;
if( pIn->IsEof() || nNextRec > SAL_MAX_UINT32 - nRecLen - 4 )
bRead = sal_False;
else
{
nNextRec += nRecLen + 4;
switch( nOp )
{
case 0x0000: // BOF
if( nRecLen != 26 || !BofFm3() )
{
bRead = sal_False;
eRet = eERR_FORMAT;
}
break;
case 0x0001: // EOF
bRead = sal_False;
DBG_ASSERT( nTab == 0,
"-ImportLotus::Read( SvStream& ): Zweimal EOF nicht erlaubt" );
nTab++;
break;
case 174: // FONT_FACE
Font_Face();
break;
case 176: // FONT_TYPE
Font_Type();
break;
case 177: // FONT_YSIZE
Font_Ysize();
break;
case 195:
if( nExtTab >= 0 )
pLotusRoot->pAttrTable->Apply( ( SCTAB ) nExtTab );
nExtTab++;
break;
case 197:
_Row( nRecLen );
break;
}
DBG_ASSERT( nNextRec >= pIn->Tell(),
"*ImportLotus::Read(): Etwas zu gierig..." );
pIn->Seek( nNextRec );
aPrgrsBar.Progress();
}
}
pLotusRoot->pAttrTable->Apply( ( SCTAB ) nExtTab );
return eRet;
}