You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
5.7 KiB
152 lines
5.7 KiB
4 years ago
|
/* This file is part of the wvWare 2 project
|
||
|
Copyright (C) 2001-2003 Werner Trobin <trobin@kde.org>
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Library General Public
|
||
|
License version 2 as published by the Free Software Foundation.
|
||
|
|
||
|
This library is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
Library General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Library General Public License
|
||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||
|
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||
|
Boston, MA 02111-1307, USA.
|
||
|
*/
|
||
|
|
||
|
#ifdef HAVE_CONFIG_H
|
||
|
#include <config.h>
|
||
|
#endif
|
||
|
|
||
|
#include <test.h>
|
||
|
#include <olestream.h>
|
||
|
#include <word_helper.h>
|
||
|
#include <word97_helper.h>
|
||
|
#include <word97_generated.h>
|
||
|
|
||
|
using namespace wvWare;
|
||
|
|
||
|
// A small testcase for the word97_helper stuff
|
||
|
int main( int, char** )
|
||
|
{
|
||
|
std::cerr << "Testing some auxilliary classes..." << std::endl;
|
||
|
|
||
|
OLEStorage storage( std::string( "testole.doc" ) );
|
||
|
test( storage.open( OLEStorage::ReadOnly ) );
|
||
|
|
||
|
OLEStreamReader* document = storage.createStreamReader( "WordDocument" );
|
||
|
test( document && document->isValid(), "Error: Couldn't open the WordDocument stream" );
|
||
|
//document->dumpStream( "document.stream" );
|
||
|
|
||
|
Word97::FIB fib( document, true );
|
||
|
|
||
|
OLEStreamReader* table = storage.createStreamReader( fib.fWhichTblStm ? "1Table" : "0Table" );
|
||
|
test( table && table->isValid(), "Error: Couldn't open the Table stream" );
|
||
|
|
||
|
// Test STTBFASSOC reading from memory
|
||
|
std::cerr << "Test 1: Read the STTBFASSOC from memory: ";
|
||
|
table->seek( fib.fcSttbfAssoc );
|
||
|
//table->dumpStream( "table.stream" );
|
||
|
U8* data = new U8[ fib.lcbSttbfAssoc ];
|
||
|
table->read( data, fib.lcbSttbfAssoc );
|
||
|
STTBF sttbf( 0x0400, data );
|
||
|
delete [] data;
|
||
|
test( sttbf.count() == 18 );
|
||
|
|
||
|
for ( UString s = sttbf.firstString(); !s.isNull(); s = sttbf.nextString() )
|
||
|
std::cerr << "String: '" << s.ascii() << "'" << std::endl;
|
||
|
|
||
|
// Test STTBFASSOC reading from a stream
|
||
|
std::cerr << "Test 2: Read the STTBFASSOC from a stream: ";
|
||
|
table->seek( fib.fcSttbfAssoc );
|
||
|
STTBF sttbf2( 0x0400, table );
|
||
|
|
||
|
UString s1 = sttbf.firstString(), s2 = sttbf2.firstString();
|
||
|
bool failed = false;
|
||
|
for ( ; !s1.isNull() && !s2.isNull(); s1 = sttbf.nextString(), s2 = sttbf2.nextString() ) {
|
||
|
if ( s1 != s2 ) {
|
||
|
failed = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
test( !failed );
|
||
|
|
||
|
// Testing PLF reading/iterating
|
||
|
std::cerr << "Test 3a: Reading a PLF (LFO): ";
|
||
|
table->seek( fib.fcPlfLfo );
|
||
|
PLF<Word97::LFO> plf( table );
|
||
|
test( plf.count() == 10 ); // we have some padding data at the end, so the size is screwed
|
||
|
|
||
|
std::cerr << "Test 3b: Reading a PLF (LSTF, \"short count\" PLF): ";
|
||
|
table->seek( fib.fcPlcfLst );
|
||
|
PLF<Word97::LSTF, true> plf1( table );
|
||
|
test( plf1.count() * Word97::LSTF::sizeOf + 2 == fib.lcbPlcfLst );
|
||
|
|
||
|
std::cerr << "Test 3c: Trying to match the list IDs: ";
|
||
|
// Check whether all list ids match, then the file is okay (and we read it correctly)
|
||
|
// Yes, I know that this is O(n^2), but hey, this is a test case for 10 elements ;)
|
||
|
bool success = true;
|
||
|
bool found = false;
|
||
|
for ( const Word97::LSTF* lstf = plf1.first(); lstf != 0; lstf = plf1.next() ) {
|
||
|
found = false;
|
||
|
for ( const Word97::LFO* lfo = plf.first(); lfo != 0; lfo = plf.next() )
|
||
|
if ( lstf->lsid == lfo->lsid ) {
|
||
|
found = true;
|
||
|
break;
|
||
|
}
|
||
|
if ( !found ) {
|
||
|
success = false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
test( success );
|
||
|
|
||
|
table->seek( fib.fcPlcfbtePapx );
|
||
|
std::cerr << "Test 4: Reading a PLCF: " << std::endl;
|
||
|
//std::cerr << "Size: " << fib.lcbPlcfbtePapx << std::endl;
|
||
|
PLCF<Word97::BTE> plcf( fib.lcbPlcfbtePapx, table );
|
||
|
|
||
|
std::cerr << "Test 4a: Checking the size of the PLCF: ";
|
||
|
test( plcf.count() == 6 );
|
||
|
|
||
|
PLCFIterator<Word97::BTE> it( plcf );
|
||
|
for ( ; it.current(); ++it ) {
|
||
|
std::cerr << "Item: " << std::endl;
|
||
|
std::cerr << " start: " << it.currentStart() << std::endl;
|
||
|
std::cerr << " lim: " << it.currentLim() << std::endl;
|
||
|
std::cerr << " value: " << it.current()->pn << std::endl;
|
||
|
}
|
||
|
|
||
|
// Test the FKP template
|
||
|
it.toFirst(); // rewind the iterator ;)
|
||
|
std::cerr << "Test 5: Reading a FKP: " << std::endl;
|
||
|
document->seek( it.current()->pn << 9, G_SEEK_SET );
|
||
|
FKP< BX<Word97::PHE> > fkp( document, false );
|
||
|
std::cerr << "crun: " << fkp.crun() << std::endl;
|
||
|
FKPIterator< BX<Word97::PHE> > it2( fkp );
|
||
|
for ( int i = 0; !it2.atEnd(); ++it2, ++i ) {
|
||
|
std::cerr << "Item(" << i << "): " << std::endl;
|
||
|
std::cerr << " start: " << it2.currentStart() << std::endl;
|
||
|
std::cerr << " lim: " << it2.currentLim() << std::endl;
|
||
|
if ( it2.current() )
|
||
|
std::cerr << " plain entry" << std::endl;
|
||
|
else
|
||
|
std::cerr << " null entry" << std::endl;
|
||
|
}
|
||
|
|
||
|
std::cerr << "sizeof(PRM): " << sizeof(Word97::PRM) << std::endl;
|
||
|
std::cerr << "sizeof(PRM2): " << sizeof(Word97::PRM2) << std::endl;
|
||
|
std::cerr << "sizeof(PCD): " << sizeof(Word97::PCD) << std::endl;
|
||
|
std::cerr << "sizeof(DTTM): " << sizeof(Word97::DTTM) << std::endl;
|
||
|
std::cerr << "sizeof(BTE): " << sizeof(Word97::BTE) << std::endl;
|
||
|
std::cerr << "sizeof(PHE): " << sizeof(Word97::PHE) << std::endl;
|
||
|
std::cerr << "sizeof(BX): " << sizeof(BX<Word97::PHE>) << std::endl;
|
||
|
|
||
|
delete document;
|
||
|
delete table;
|
||
|
std::cerr << "Done." << std::endl;
|
||
|
return 0;
|
||
|
}
|