diff options
Diffstat (limited to 'writerfilter/source/doctok/WW8DocumentImpl.cxx')
-rw-r--r-- | writerfilter/source/doctok/WW8DocumentImpl.cxx | 2212 |
1 files changed, 0 insertions, 2212 deletions
diff --git a/writerfilter/source/doctok/WW8DocumentImpl.cxx b/writerfilter/source/doctok/WW8DocumentImpl.cxx deleted file mode 100644 index 6c6e649d4..000000000 --- a/writerfilter/source/doctok/WW8DocumentImpl.cxx +++ /dev/null @@ -1,2212 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org 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 Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <resourcemodel/exceptions.hxx> -#include <resourcemodel/QNameToString.hxx> -#include <WW8DocumentImpl.hxx> -#include <WW8FKPImpl.hxx> -#include <WW8PieceTableImpl.hxx> -#include <WW8BinTableImpl.hxx> -#include <WW8StreamImpl.hxx> -#include <WW8Sttbf.hxx> -#include <Dff.hxx> -#include <iterator> -#include <XNoteHelperImpl.hxx> -#include <rtl/ustring.hxx> -#include <rtl/ustrbuf.hxx> -#include <doctokLoggers.hxx> - -namespace writerfilter { -namespace doctok -{ - -using namespace ::std; - -template <class T> -struct PLCFHelper -{ - static void processPLCFCpAndFcs(WW8DocumentImpl & rDoc, - WW8PieceTable::Pointer_t pPieceTable, - typename PLCF<T>::Pointer_t pPLCF, - PropertyType eType, - sal_uInt32 nOffset) - { - sal_uInt32 nCount = pPLCF->getEntryCount(); - for (sal_uInt32 n = 0; n < nCount; ++n) - { - Cp aCp(pPLCF->getFc(n) + nOffset); - CpAndFc aCpAndFc = pPieceTable->createCpAndFc(aCp, eType); - - rDoc.insertCpAndFc(aCpAndFc); - } - } -}; - -// WW8DocumentIteratorImpl -bool operator == (const WW8DocumentIterator & rA, - const WW8DocumentIterator & rB) -{ - return rA.equal(rB); -} - -WW8DocumentIterator::~WW8DocumentIterator() -{ -} - -WW8DocumentIteratorImpl::~WW8DocumentIteratorImpl() -{ -} - -WW8DocumentIterator & WW8DocumentIteratorImpl::operator++() -{ - mCpAndFc = mpDocument->getNextCp(mCpAndFc); - - return *this; -} - -WW8DocumentIterator & WW8DocumentIteratorImpl::operator--() -{ - mCpAndFc = mpDocument->getPrevCp(mCpAndFc); - - return *this; -} - -bool WW8DocumentIteratorImpl::equal(const WW8DocumentIterator & rIt_) const -{ - const WW8DocumentIteratorImpl & rIt = - dynamic_cast<const WW8DocumentIteratorImpl &>(rIt_); - - return mCpAndFc == rIt.mCpAndFc && mpDocument == rIt.mpDocument; -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentIteratorImpl::getProperties() const -{ - return mpDocument->getProperties(mCpAndFc); -} - -writerfilter::Reference<Stream>::Pointer_t -WW8DocumentIteratorImpl::getSubDocument() const -{ - return mpDocument->getSubDocument(mCpAndFc); -} - -WW8Stream::Sequence WW8DocumentIteratorImpl::getText() -{ - return mpDocument->getText(mCpAndFc); -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentIteratorImpl::getShape() const -{ - return mpDocument->getShape(mCpAndFc); -} - -PropertyType WW8DocumentIteratorImpl::getPropertyType() const -{ - return mCpAndFc.getType(); -} - -bool WW8DocumentIteratorImpl::isComplex() const -{ - return mCpAndFc.isComplex(); -} - -void WW8DocumentIteratorImpl::dump(ostream & o) const -{ - o << mCpAndFc; -} - -string WW8DocumentIteratorImpl::toString() const -{ - return mCpAndFc.toString(); -} - -// WW8DocumentImpl - -WW8Document::~WW8Document() -{ -} - -#if OSL_DEBUG_LEVEL > 1 -class WW8IdToString : public IdToString -{ -public: - WW8IdToString() : IdToString() {} - virtual ~WW8IdToString() {} - - virtual string toString(const Id & rId) const - { - string s((*SprmIdToString::Instance())(rId)); - - if (s.size() == 0) - s = (*QNameToString::Instance())(rId); - - return s; - } -}; -#endif - -WW8DocumentImpl::~WW8DocumentImpl() -{ -} - -WW8DocumentImpl::WW8DocumentImpl(WW8Stream::Pointer_t rpStream) -: bSubDocument(false), mfcPicLoc(0), mbPicIsData(false), mpStream(rpStream), -mbInSection(false), mbInParagraphGroup(false), mbInCharacterGroup(false) -{ - mpDocStream = getSubStream(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM - ("WordDocument"))); - - mpSummaryInformationStream = getSubStream(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM - ("\5SummaryInformation"))); - - try - { - mpDataStream = getSubStream(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM - ("Data"))); - } - catch (ExceptionNotFound) - { - } - - try - { - mpCompObjStream = getSubStream(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM - ("\1CompObj"))); - } - catch (ExceptionNotFound) - { - } - - mpCHPFKPCache = - WW8FKPCache::Pointer_t(new WW8CHPFKPCacheImpl(mpDocStream, 5)); - mpPAPFKPCache = - WW8FKPCache::Pointer_t(new WW8PAPFKPCacheImpl(mpDocStream, 5)); - - mpFib = WW8Fib::Pointer_t(new WW8Fib(*mpDocStream)); - - switch (mpFib->get_fWhichTblStm()) - { - case 0: - mpTableStream = getSubStream(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM - ("0Table"))); - - break; - - case 1: - mpTableStream = getSubStream(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM - ("1Table"))); - - break; - - default: - break; - } - - if (mpFib->get_nFib() >= 0xD9) - { - mpFibRgFcLcb2000.reset(new WW8FibRgFcLcb2000(*mpFib)); - } - - if (mpTableStream.get() == NULL) - throw ExceptionNotFound("Table stream not found."); - - mpPieceTable = - WW8PieceTable::Pointer_t - (new WW8PieceTableImpl(*mpTableStream, mpFib->get_fcClx(), - mpFib->get_lcbClx())); - - { - Cp aCp(mpPieceTable->getLastCp()); - Fc aFc(mpPieceTable->getLastFc()); - CpAndFc aCpAndFc(aCp, aFc, PROP_DOC); - mCpAndFcs.insert(aCpAndFc); - } - - { - Cp aCp(mpFib->get_ccpText()); - - mDocumentEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp), - PROP_DOC); - mCpAndFcs.insert(mDocumentEndCpAndFc); - - aCp += mpFib->get_ccpFtn(); - mFootnoteEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp), - PROP_DOC); - mCpAndFcs.insert(mFootnoteEndCpAndFc); - - aCp += mpFib->get_ccpHdd(); - mHeaderEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp), - PROP_DOC); - mCpAndFcs.insert(mHeaderEndCpAndFc); - - aCp += mpFib->get_ccpAtn(); - mAnnotationEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp), - PROP_DOC); - mCpAndFcs.insert(mAnnotationEndCpAndFc); - - aCp += mpFib->get_ccpEdn(); - mEndnoteEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp), - PROP_DOC); - mCpAndFcs.insert(mEndnoteEndCpAndFc); - - aCp += mpFib->get_ccpTxbx(); - mTextboxEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp), - PROP_DOC); - mCpAndFcs.insert(mTextboxEndCpAndFc); - - aCp += mpFib->get_ccpHdrTxbx(); - mTextboxHeaderEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp), - PROP_DOC); - mCpAndFcs.insert(mTextboxHeaderEndCpAndFc); - } - - mpBinTablePAPX = - WW8BinTable::Pointer_t(new WW8BinTableImpl - (*mpTableStream, - mpFib->get_fcPlcfbtePapx(), - mpFib->get_lcbPlcfbtePapx())); - - //clog << "BinTable(PAP):" << mpBinTablePAPX->toString(); - - parseBinTableCpAndFcs(*mpBinTablePAPX, PROP_PAP); - - mpBinTableCHPX = - WW8BinTable::Pointer_t(new WW8BinTableImpl - (*mpTableStream, - mpFib->get_fcPlcfbteChpx(), - mpFib->get_lcbPlcfbteChpx())); - - parseBinTableCpAndFcs(*mpBinTableCHPX, PROP_CHP); - - mpSEDs = PLCF<WW8SED>::Pointer_t(new PLCF<WW8SED> - (*mpTableStream, - mpFib->get_fcPlcfsed(), - mpFib->get_lcbPlcfsed())); - - { - PLCFHelper<WW8SED>::processPLCFCpAndFcs - (*this, mpPieceTable, mpSEDs, PROP_SEC, 0); - } - - sal_uInt32 nHeaders = getHeaderCount(); - - if (nHeaders > 0) - { - mpHeaderOffsets = WW8StructBase::Pointer_t - (new WW8StructBase(*mpTableStream, - mpFib->get_fcPlcfhdd(), - mpFib->get_lcbPlcfhdd())); - - { - for (sal_uInt32 n = 0; n <= nHeaders; ++n) - { - CpAndFc aCpAndFc(getHeaderCpAndFc(n)); - - mCpAndFcs.insert(aCpAndFc); - } - } - } - - if (mpFib->get_lcbPlcffndTxt() > 0) - { - WW8StructBase::Pointer_t pCps - (new WW8StructBase(*mpTableStream, - mpFib->get_fcPlcffndTxt(), - mpFib->get_lcbPlcffndTxt())); - - PLCF<WW8FRD>::Pointer_t pRefs - (new PLCF<WW8FRD>(*mpTableStream, - mpFib->get_fcPlcffndRef(), - mpFib->get_lcbPlcffndRef())); - - mpFootnoteHelper = XNoteHelper<WW8FRD>::Pointer_t - (new XNoteHelper<WW8FRD>(pCps, pRefs, mpPieceTable, this, - PROP_FOOTNOTE, getDocumentEndCp())); - - mpFootnoteHelper->init(); - } - - if (mpFib->get_lcbPlcfendTxt() > 0) - { - WW8StructBase::Pointer_t pCps - (new WW8StructBase(*mpTableStream, - mpFib->get_fcPlcfendTxt(), - mpFib->get_lcbPlcfendTxt())); - - PLCF<WW8FRD>::Pointer_t pRefs - (new PLCF<WW8FRD>(*mpTableStream, - mpFib->get_fcPlcfendRef(), - mpFib->get_lcbPlcfendRef())); - - mpEndnoteHelper = XNoteHelper<WW8FRD>::Pointer_t - (new XNoteHelper<WW8FRD>(pCps, pRefs, mpPieceTable, this, - PROP_ENDNOTE, getAnnotationEndCp())); - - mpEndnoteHelper->init(); - } - - if (mpFib->get_lcbPlcfandTxt() > 0) - { - WW8StructBase::Pointer_t pCps - (new WW8StructBase(*mpTableStream, - mpFib->get_fcPlcfandTxt(), - mpFib->get_lcbPlcfandTxt())); - - PLCF<WW8ATRD>::Pointer_t pRefs - (new PLCF<WW8ATRD>(*mpTableStream, - mpFib->get_fcPlcfandRef(), - mpFib->get_lcbPlcfandRef())); - - mpAnnotationHelper = XNoteHelper<WW8ATRD>::Pointer_t - (new XNoteHelper<WW8ATRD>(pCps, pRefs, mpPieceTable, this, - PROP_ANNOTATION, getHeaderEndCp())); - - mpAnnotationHelper->init(); - } - - if (mpFib->get_lcbSttbfbkmk() > 0) - { - PLCF<WW8BKF>::Pointer_t pStartCps - (new PLCF<WW8BKF>(*mpTableStream, mpFib->get_fcPlcfbkf(), - mpFib->get_lcbPlcfbkf())); - - WW8StructBase::Pointer_t pEndCps - (new WW8StructBase(*mpTableStream, mpFib->get_fcPlcfbkl(), - mpFib->get_lcbPlcfbkl())); - - WW8Sttbf::Pointer_t pNames - (new WW8Sttbf(*mpTableStream, mpFib->get_fcSttbfbkmk(), - mpFib->get_lcbSttbfbkmk())); - - mpBookmarkHelper = BookmarkHelper::Pointer_t - (new BookmarkHelper(pStartCps, pEndCps, pNames, mpPieceTable, this)); - - mpBookmarkHelper->init(); - } - - { - PLCF<WW8FLD>::Pointer_t pPlcffldMom; - - if (mpFib->get_lcbPlcffldMom() > 0) - { - pPlcffldMom = PLCF<WW8FLD>::Pointer_t - (new PLCF<WW8FLD>(*mpTableStream, - mpFib->get_fcPlcffldMom(), - mpFib->get_lcbPlcffldMom())); - - mpFieldHelper = FieldHelper::Pointer_t - (new FieldHelper(pPlcffldMom, - this)); - - mpFieldHelper->init(); - } - } - - PLCF<WW8FSPA>::Pointer_t pPlcspaMom; - if (mpFib->get_lcbPlcspaMom() > 0) - { - pPlcspaMom = PLCF<WW8FSPA>::Pointer_t - (new PLCF<WW8FSPA> - (*mpTableStream, mpFib->get_fcPlcspaMom(), - mpFib->get_lcbPlcspaMom())); - } - - PLCF<WW8FSPA>::Pointer_t pPlcspaHdr; - if (mpFib->get_lcbPlcspaHdr() > 0) - { - pPlcspaHdr = PLCF<WW8FSPA>::Pointer_t - (new PLCF<WW8FSPA> - (*mpTableStream, mpFib->get_fcPlcspaHdr(), - mpFib->get_lcbPlcspaHdr())); - } - - mpShapeHelper = ShapeHelper::Pointer_t - (new ShapeHelper(pPlcspaMom, pPlcspaHdr, this)); - - mpShapeHelper->init(); - - PLCF<WW8BKD>::Pointer_t pPlcbkdMother; - if (mpFib->get_fcBkdMother() > 0 && mpFib->get_lcbBkdMother() > 0) - { - pPlcbkdMother = PLCF<WW8BKD>::Pointer_t - (new PLCF<WW8BKD> - (*mpTableStream, mpFib->get_fcBkdMother(), - mpFib->get_lcbBkdMother())); - } - - mpBreakHelper = BreakHelper::Pointer_t - (new BreakHelper(pPlcbkdMother, this)); - - mpBreakHelper->init(); - - if (mpFib->get_fcDggInfo() != 0 && mpFib->get_lcbDggInfo() > 0) - { - mpDffBlock = DffBlock::Pointer_t - (new DffBlock(*mpTableStream, mpFib->get_fcDggInfo(), - mpFib->get_lcbDggInfo(), 1)); - - mpDffBlock->setDocument(this); - } - - if (mpFib->get_lcbPlcftxbxTxt() > 0) - { - mpTextBoxStories = PLCF<WW8FTXBXS>::Pointer_t - (new PLCF<WW8FTXBXS>(*mpTableStream, - mpFib->get_fcPlcftxbxTxt(), - mpFib->get_lcbPlcftxbxTxt())); - - PLCFHelper<WW8FTXBXS>::processPLCFCpAndFcs - (*this, mpPieceTable, mpTextBoxStories, PROP_DOC, - mEndnoteEndCpAndFc.getCp().get()); - } - - if (mCpAndFcs.size() > 0) - { - mCpAndFcStart = *mCpAndFcs.begin(); - mCpAndFcEnd = getDocumentEndCp(); - } -} - -bool WW8DocumentImpl::isSpecial(sal_uInt32 nChar) -{ - bool bResult = false; - - if (nChar <= 8) - bResult = true; - else if (nChar >= 10) - { - if (nChar == 12) - bResult= true; - else if (nChar <= 16) - bResult = true; - else if (nChar >= 22) - { - if (nChar <= 30) - bResult = true; - else if (nChar >= 33) - { - if (nChar <= 39) - bResult = true; - else if (nChar == 41) - bResult = true; - } - } - } - - return bResult; -} - -WW8DocumentImpl::WW8DocumentImpl(const WW8DocumentImpl & rSrc, - const CpAndFc & rStart, const CpAndFc & rEnd) -: bSubDocument(true), mfcPicLoc(0), mbPicIsData(false) -{ - Assign(rSrc); - - mCpAndFcStart = rStart; - mCpAndFcEnd = rEnd; -} - -WW8DocumentImpl & WW8DocumentImpl::Assign(const WW8DocumentImpl & rSrc) -{ - mCpAndFcs = rSrc.mCpAndFcs; - - mpCHPFKPCache = rSrc.mpCHPFKPCache; - mpPAPFKPCache = rSrc.mpPAPFKPCache; - - mpStream = rSrc.mpStream; - mpTableStream = rSrc.mpTableStream; - mpDataStream = rSrc.mpDataStream; - mpDocStream = rSrc.mpDocStream; - mpCompObjStream = rSrc.mpCompObjStream; - - mpPieceTable = rSrc.mpPieceTable; - - mpBinTableCHPX = rSrc.mpBinTableCHPX; - mpBinTablePAPX = rSrc.mpBinTablePAPX; - - mpSEDs = rSrc.mpSEDs; - - mpFib = rSrc.mpFib; - - mpHeaderOffsets = rSrc.mpHeaderOffsets; - mpFootnoteHelper = rSrc.mpFootnoteHelper; - mpEndnoteHelper = rSrc.mpEndnoteHelper; - mpAnnotationHelper = rSrc.mpAnnotationHelper; - mpShapeHelper = rSrc.mpShapeHelper; - mpBreakHelper = rSrc.mpBreakHelper; - - mpBookmarkHelper = rSrc.mpBookmarkHelper; - - mpDffBlock = rSrc.mpDffBlock; - mpTextBoxStories = rSrc.mpTextBoxStories; - - mDocumentEndCpAndFc = rSrc.mDocumentEndCpAndFc; - mFootnoteEndCpAndFc = rSrc.mFootnoteEndCpAndFc; - - return *this; -} - -string WW8DocumentImpl::getType() const -{ - return "WW8DocumentImpl"; -} - -void WW8DocumentImpl::parseBinTableCpAndFcs(WW8BinTable & rTable, - PropertyType eType_) -{ - for (sal_uInt32 i = 0; i < rTable.getEntryCount(); i++) - { - Fc aFcFromTable(rTable.getFc(i)); - - if (aFcFromTable < mpPieceTable->getFirstFc()) - aFcFromTable = mpPieceTable->getFirstFc(); - - bool bComplex = mpPieceTable->isComplex(aFcFromTable); - aFcFromTable.setComplex(bComplex); - - try - { - Cp aCpFromTable(mpPieceTable->fc2cp(aFcFromTable)); - CpAndFc aCpAndFcFromTable(aCpFromTable, aFcFromTable, eType_); - - mCpAndFcs.insert(aCpAndFcFromTable); - - WW8FKP::Pointer_t pFKP; - - switch (eType_) - { - case PROP_CHP: - pFKP = getFKPCHPX(rTable.getPageNumber(i), - aCpAndFcFromTable.isComplex()); - - break; - - case PROP_PAP: - pFKP = getFKPPAPX(rTable.getPageNumber(i), - aCpAndFcFromTable.isComplex()); - - break; - default: - break; - } - - for (sal_uInt32 n = 0; n < pFKP->getEntryCount(); n++) - { - Fc aFc = pFKP->getFc(n); - - if (aFc < mpPieceTable->getFirstFc()) - aFc = mpPieceTable->getFirstFc(); - - bool bComplexFKP = mpPieceTable->isComplex(aFc); - aFc.setComplex(bComplexFKP); - - try - { - Cp aCp = mpPieceTable->fc2cp(aFc); - - CpAndFc aCpAndFc(aCp, aFc, eType_); - - mCpAndFcs.insert(aCpAndFc); - } - catch (ExceptionNotFound &e) - { - clog << e.getText() << endl; - } - } - } - catch (ExceptionNotFound &e) - { - clog << e.getText() << endl; - } - } -} - -WW8Stream::Pointer_t WW8DocumentImpl::getSubStream -(const ::rtl::OUString & sId) const -{ - return mpStream->getSubStream(sId); -} - -WW8Document::Pointer_t WW8DocumentImpl::getSubDocument(SubDocumentId /*nId*/) -{ - return WW8Document::Pointer_t(new WW8DocumentImpl(*this)); -} - -WW8DocumentIterator::Pointer_t -WW8DocumentImpl::getIterator(const CpAndFc & rCpAndFc) -{ - return WW8DocumentIterator::Pointer_t - (new WW8DocumentIteratorImpl(this, rCpAndFc)); -} - -WW8DocumentIterator::Pointer_t WW8DocumentImpl::begin() -{ - return getIterator(getFirstCp()); -} - -WW8DocumentIterator::Pointer_t WW8DocumentImpl::end() -{ - return getIterator(getLastCp()); -} - -WW8Stream::Pointer_t WW8DocumentImpl::getDocStream() const -{ - return mpDocStream; -} - -WW8Stream::Pointer_t WW8DocumentImpl::getDataStream() const -{ - return mpDataStream; -} - -sal_uInt32 WW8DocumentImpl::getByteLength(const CpAndFc & rCpAndFc) const -{ - CpAndFc aEnd = getNextCp(rCpAndFc); - - sal_uInt32 nResult = 3; - - if (rCpAndFc < aEnd) - nResult = (aEnd - rCpAndFc) * - (mpPieceTable->isComplex(rCpAndFc.getCp()) ? 1 : 2); - - return nResult; -} - -WW8Stream::Sequence -WW8DocumentImpl::getText(const CpAndFc & rStart) -{ - return mpDocStream->get(rStart.getFc().get(), getByteLength(rStart)); -} - -const CpAndFc & WW8DocumentImpl::getFirstCp() const -{ - return mCpAndFcStart; -} - -const CpAndFc & WW8DocumentImpl::getLastCp() const -{ - return mCpAndFcEnd; -} - -CpAndFc WW8DocumentImpl::getDocumentEndCp() const -{ - return mDocumentEndCpAndFc; -} - -CpAndFc WW8DocumentImpl::getFootnodeEndCp() const -{ - return mFootnoteEndCpAndFc; -} - -CpAndFc WW8DocumentImpl::getHeaderEndCp() const -{ - return mHeaderEndCpAndFc; -} - -CpAndFc WW8DocumentImpl::getAnnotationEndCp() const -{ - return mAnnotationEndCpAndFc; -} - -CpAndFc WW8DocumentImpl::getEndnoteEndCp() const -{ - return mEndnoteEndCpAndFc; -} - -CpAndFc WW8DocumentImpl::getNextCp(const CpAndFc & rCpAndFc) const -{ - CpAndFc aResult = mCpAndFcEnd; - CpAndFcs::const_iterator aIt = mCpAndFcs.find(rCpAndFc); - - if (aIt != mCpAndFcs.end()) - { - ++aIt; - - if (aIt != mCpAndFcs.end()) - aResult = *aIt; - } - else - throw ExceptionNotFound("getNextCp: " + rCpAndFc.toString()); - - return aResult; -} - -CpAndFc WW8DocumentImpl::getPrevCp(const CpAndFc & rCpAndFc) const -{ - CpAndFc aResult = mCpAndFcStart; - - CpAndFcs::const_iterator aIt = mCpAndFcs.find(CpAndFc(rCpAndFc)); - - if (aIt != mCpAndFcs.end() && aIt != mCpAndFcs.begin()) - { - --aIt; - - aResult = *aIt; - } - else - throw ExceptionNotFound("getPrevCp: " + rCpAndFc.toString()); - - return aResult; -} - -WW8FKP::Pointer_t WW8DocumentImpl::getFKP(const CpAndFc & rCpAndFc) -{ - WW8FKP::Pointer_t pResult; - - sal_uInt32 nPageNumber = 0; - - switch (rCpAndFc.getType()) - { - case PROP_PAP: - { - nPageNumber = - mpBinTablePAPX->getPageNumber(rCpAndFc.getFc()); - - pResult = getFKPPAPX(nPageNumber, rCpAndFc.isComplex()); - } - break; - case PROP_CHP: - { - nPageNumber = - mpBinTableCHPX->getPageNumber(rCpAndFc.getFc()); - - pResult = getFKPCHPX(nPageNumber, rCpAndFc.isComplex()); - } - break; - default: - break; - } - - if (pResult.get() != NULL) - pResult->setDocument(this); - - return pResult; -} - -WW8FKP::Pointer_t WW8DocumentImpl::getFKPCHPX(sal_uInt32 nIndex, - bool bComplex) -{ - return mpCHPFKPCache->get(nIndex, bComplex); -} - -WW8FKP::Pointer_t WW8DocumentImpl::getFKPPAPX(sal_uInt32 nIndex, - bool bComplex) -{ - return mpPAPFKPCache->get(nIndex, bComplex); -} - -writerfilter::Reference<Properties>::Pointer_t WW8DocumentImpl::getProperties -(const CpAndFc & rCpAndFc) -{ - writerfilter::Reference<Properties>::Pointer_t pResult; - - switch (rCpAndFc.getType()) - { - case PROP_CHP: - case PROP_PAP: - { - try - { - WW8FKP::Pointer_t pFKP = getFKP(rCpAndFc); - - pResult = pFKP->getProperties(rCpAndFc.getFc()); - } - catch (ExceptionOutOfBounds) - { - } - } - - break; - - case PROP_SEC: - { - pResult = writerfilter::Reference<Properties>::Pointer_t - (getSED(rCpAndFc)); - } - - break; - - case PROP_FOOTNOTE: - { - pResult = writerfilter::Reference<Properties>::Pointer_t - (mpFootnoteHelper->getRef(rCpAndFc)); - } - break; - - case PROP_ENDNOTE: - { - pResult = writerfilter::Reference<Properties>::Pointer_t - (mpEndnoteHelper->getRef(rCpAndFc)); - } - break; - - case PROP_ANNOTATION: - { - pResult = writerfilter::Reference<Properties>::Pointer_t - (mpAnnotationHelper->getRef(rCpAndFc)); - } - break; - - case PROP_BOOKMARKSTART: - case PROP_BOOKMARKEND: - { - pResult = getBookmark(rCpAndFc); - } - - break; - case PROP_FLD: - { - pResult = getField(rCpAndFc); - - mpFLD = mpFieldHelper->getWW8FLD(rCpAndFc); - } - - break; - case PROP_SHP: - { - pResult = getShape(rCpAndFc); - } - break; - case PROP_BRK: - { - pResult = getBreak(rCpAndFc); - } - break; - default: - break; - } - - return pResult; -} - -writerfilter::Reference<Stream>::Pointer_t -WW8DocumentImpl::getSubDocument(const CpAndFc & rCpAndFc) -{ - writerfilter::Reference<Stream>::Pointer_t pResult; - - switch (rCpAndFc.getType()) - { - case PROP_FOOTNOTE: - pResult = getFootnote(rCpAndFc); - break; - - case PROP_ENDNOTE: - pResult = getEndnote(rCpAndFc); - break; - - case PROP_ANNOTATION: - pResult = getAnnotation(rCpAndFc); - break; - - default: - break; - } - - return pResult; -} - -WW8SED * WW8DocumentImpl::getSED(const CpAndFc & rCpAndFc) const -{ - WW8SED * pResult = mpSEDs->getEntryByFc(rCpAndFc.getCp().get()); - - pResult->setDoc(const_cast<const WW8DocumentImpl *>(this)); - - return pResult; -} - -writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getListTplcs() const -{ - writerfilter::Reference<Table>::Pointer_t pResult; - - if (mpFibRgFcLcb2000.get() != NULL && - mpFibRgFcLcb2000->get_fcSttbRgtplc() != 0 && - mpFibRgFcLcb2000->get_lcbSttbRgtplc() != 0) - { - WW8SttbRgtplc * pSttbRgtplc = - new WW8SttbRgtplc(*mpTableStream, - mpFibRgFcLcb2000->get_fcSttbRgtplc(), - mpFibRgFcLcb2000->get_lcbSttbRgtplc()); - - pResult = writerfilter::Reference<Table>::Pointer_t(pSttbRgtplc); - } - - return pResult; -} - -writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getListTable() const -{ - writerfilter::Reference<Table>::Pointer_t pResult; - - if (mpFib->get_fcPlcfLst() != 0 && mpFib->get_lcbPlcfLst() > 0) - { - try - { - WW8ListTable * pList = new WW8ListTable(*mpTableStream, - mpFib->get_fcPlcfLst(), - mpFib->get_fcPlfLfo() - - mpFib->get_fcPlcfLst()); - - pList->setPayloadOffset(mpFib->get_lcbPlcfLst()); - pList->initPayload(); - - pResult = writerfilter::Reference<Table>::Pointer_t(pList); - } - catch (ExceptionOutOfBounds) { - } - } - - return pResult; -} - -writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getLFOTable() const -{ - writerfilter::Reference<Table>::Pointer_t pResult; - - if (mpFib->get_fcPlfLfo() != 0 && mpFib->get_lcbPlfLfo() > 0) - { - try - { - WW8LFOTable * pLFOs = new WW8LFOTable(*mpTableStream, - mpFib->get_fcPlfLfo(), - mpFib->get_lcbPlfLfo()); - - pLFOs->setPayloadOffset(mpFib->get_lcbPlcfLst()); - pLFOs->initPayload(); - - pResult = writerfilter::Reference<Table>::Pointer_t(pLFOs); - } - catch (Exception &e) - { - clog << e.getText() << endl; - } - } - - return pResult; -} - -writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getFontTable() const -{ - writerfilter::Reference<Table>::Pointer_t pResult; - - if (mpFib->get_fcSttbfffn() != 0 && mpFib->get_lcbSttbfffn() > 0) - { - WW8FontTable * pFonts = new WW8FontTable(*mpTableStream, - mpFib->get_fcSttbfffn(), - mpFib->get_lcbSttbfffn()); - - pFonts->initPayload(); - - pResult = writerfilter::Reference<Table>::Pointer_t(pFonts); - } - - return pResult; -} - -writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getStyleSheet() const -{ - writerfilter::Reference<Table>::Pointer_t pResult; - - if (mpFib->get_lcbStshf() > 0) - { - WW8StyleSheet * pStyles = new WW8StyleSheet(*mpTableStream, - mpFib->get_fcStshf(), - mpFib->get_lcbStshf()); - - pStyles->initPayload(); - - pResult = writerfilter::Reference<Table>::Pointer_t(pStyles); - } - - return pResult; -} - -writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getAssocTable() const -{ - writerfilter::Reference<Table>::Pointer_t pResult; - - if (mpFib->get_lcbSttbfAssoc() > 0) - { - WW8Sttbf::Pointer_t pSttbfAssoc - (new WW8Sttbf(*mpTableStream, - mpFib->get_fcSttbfAssoc(), - mpFib->get_lcbSttbfAssoc())); - - pResult = writerfilter::Reference<Table>::Pointer_t - (new WW8SttbTableResource(pSttbfAssoc)); - } - - return pResult; -} - -sal_uInt32 WW8DocumentImpl::getHeaderCount() const -{ - sal_uInt32 nResult = 0; - sal_uInt32 nLcbPlcfhdd = mpFib->get_lcbPlcfhdd(); - - if (nLcbPlcfhdd > 4) - nResult = (nLcbPlcfhdd / 4) - 1; - - return nResult; -} - -CpAndFc WW8DocumentImpl::getHeaderCpAndFc(sal_uInt32 nPos) -{ - sal_uInt32 nCount = getHeaderCount(); - - // There are getHeaderCount() + 1 entries in mpHeaderOffsets => greater - if (nPos > nCount) - throw ExceptionNotFound("getHeaderCpAndFc"); - - if (nPos == nCount) - return mHeaderEndCpAndFc; - else - { - Cp aCp(getFootnodeEndCp().getCp() + mpHeaderOffsets->getU32(nPos * 4)); - Fc aFc(mpPieceTable->cp2fc(aCp)); - CpAndFc aCpAndFc(aCp, aFc, PROP_DOC); - - return aCpAndFc; - } - -} - -writerfilter::Reference<Stream>::Pointer_t WW8DocumentImpl::getHeader(sal_uInt32 nPos) -{ - // There are getHeaderCount() headers => greater or equal - if (nPos >= getHeaderCount()) - throw ExceptionNotFound("getHeader"); - - writerfilter::Reference<Stream>::Pointer_t pResult; - - CpAndFc aCpAndFcStart(getHeaderCpAndFc(nPos)); - CpAndFc aCpAndFcEnd(getHeaderCpAndFc(nPos + 1)); - - if (aCpAndFcStart < aCpAndFcEnd) - pResult = writerfilter::Reference<Stream>::Pointer_t - (new WW8DocumentImpl(*this, aCpAndFcStart, aCpAndFcEnd)); - - return pResult; -} - -writerfilter::Reference<Stream>::Pointer_t -WW8DocumentImpl::getFootnote(const CpAndFc & rCpAndFc) -{ - writerfilter::Reference<Stream>::Pointer_t pResult; - - if (! bSubDocument) - pResult = mpFootnoteHelper->get(rCpAndFc); - - return pResult; -} - -writerfilter::Reference<Stream>::Pointer_t -WW8DocumentImpl::getEndnote(const CpAndFc & rCpAndFc) -{ - writerfilter::Reference<Stream>::Pointer_t pResult; - - if (! bSubDocument) - pResult = mpEndnoteHelper->get(rCpAndFc); - - return pResult; -} - - -writerfilter::Reference<Stream>::Pointer_t -WW8DocumentImpl::getAnnotation(const CpAndFc & rCpAndFc) -{ - writerfilter::Reference<Stream>::Pointer_t pResult; - - if (! bSubDocument) - pResult = mpAnnotationHelper->get(rCpAndFc); - - return pResult; -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentImpl::getBookmark(const CpAndFc & rCpAndFc) const -{ - return mpBookmarkHelper->getBookmark(rCpAndFc); -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentImpl::getShape(const CpAndFc & rCpAndFc) const -{ - return mpShapeHelper->getShape(rCpAndFc); -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentImpl::getShape(sal_uInt32 nSpid) -{ - writerfilter::Reference<Properties>::Pointer_t pResult; - DffRecord::Pointer_t pShape = mpDffBlock->getShape(nSpid); - - if (pShape.get() != NULL) - { - DffSpContainer * pTmp = new DffSpContainer(*pShape); - pTmp->setDocument(this); - - pResult = writerfilter::Reference<Properties>::Pointer_t(pTmp); - } - - return pResult; -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentImpl::getBreak(const CpAndFc & rCpAndFc) const -{ - return mpBreakHelper->getBreak(rCpAndFc); -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentImpl::getBlip(sal_uInt32 nBid) -{ - writerfilter::Reference<Properties>::Pointer_t pResult; - - if (mpDffBlock != NULL) - { - DffRecord::Pointer_t pDffRecord(mpDffBlock->getBlip(nBid)); - - if (pDffRecord.get() != NULL) - { - DffBSE * pBlip = new DffBSE(*pDffRecord); - - if (pBlip != NULL) - pResult = writerfilter::Reference<Properties>::Pointer_t(pBlip); - } - } - - return pResult; -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentImpl::getField(const CpAndFc & rCpAndFc) const -{ - return mpFieldHelper->getField(rCpAndFc); -} - -writerfilter::Reference<Properties>::Pointer_t -WW8DocumentImpl::getDocumentProperties() const -{ - writerfilter::Reference<Properties>::Pointer_t pResult; - - if (mpFib->get_lcbDop() > 0) - { - pResult.reset(new WW8DopBase(*mpTableStream, mpFib->get_fcDop(), mpFib->get_lcbDop())); - } - - return pResult; -} - -WW8FLD::Pointer_t WW8DocumentImpl::getCurrentFLD() const -{ - return mpFLD; -} - -void WW8DocumentImpl::setPicLocation(sal_uInt32 fcPicLoc) -{ - mfcPicLoc = fcPicLoc; -} - -bool WW8DocumentImpl::isPicData() -{ - return mbPicIsData; -} - -void WW8DocumentImpl::setPicIsData(bool bPicIsData) -{ - mbPicIsData = bPicIsData; -} - -writerfilter::Reference<Stream>::Pointer_t -WW8DocumentImpl::getTextboxText(sal_uInt32 nShpId) const -{ - writerfilter::Reference<Stream>::Pointer_t pResult; - - if (mpTextBoxStories.get() != NULL) - { - sal_uInt32 nCount = mpTextBoxStories->getEntryCount(); - - sal_uInt32 n = 0; - while (n < nCount) - { - WW8FTXBXS * pTextboxStory = mpTextBoxStories->getEntryPointer(n); - - if (pTextboxStory->get_lid() == nShpId) - break; - - ++n; - } - - if (n < nCount) - { - Cp aCpStart(mpTextBoxStories->getFc(n)); - aCpStart += getEndnoteEndCp().getCp().get(); - CpAndFc aCpAndFcStart = - mpPieceTable->createCpAndFc(aCpStart, PROP_DOC); - Cp aCpEnd(mpTextBoxStories->getFc(n + 1)); - aCpEnd += getEndnoteEndCp().getCp().get(); - CpAndFc aCpAndFcEnd = mpPieceTable->createCpAndFc(aCpEnd, PROP_DOC); - - pResult = writerfilter::Reference<Stream>::Pointer_t - (new WW8DocumentImpl(*this, aCpAndFcStart, aCpAndFcEnd)); - } - } - - return pResult; -} - -Id lcl_headerQName(sal_uInt32 nIndex) -{ - Id qName = NS_rtf::LN_header; - - if (nIndex > 5) - { - switch ((nIndex - 6) % 6) - { - case 0: - qName = NS_rtf::LN_headerl; - - break; - case 1: - qName = NS_rtf::LN_headerr; - - break; - case 2: - qName = NS_rtf::LN_footerl; - - break; - case 3: - qName = NS_rtf::LN_footerr; - - break; - case 4: - qName = NS_rtf::LN_headerf; - - break; - case 5: - qName = NS_rtf::LN_footerf; - - break; - } - } - - return qName; -} - -Fc WW8DocumentImpl::cp2fc(const Cp & cp) const -{ - return mpPieceTable->cp2fc(cp); -} - -Cp WW8DocumentImpl::fc2cp(const Fc & fc) const -{ - return mpPieceTable->fc2cp(fc); -} - -CpAndFc WW8DocumentImpl::getCpAndFc(const Cp & cp, PropertyType type) const -{ - Fc aFc = cp2fc(cp); - - return CpAndFc(cp, aFc, type); -} - -void WW8DocumentImpl::resolvePicture(Stream & rStream) -{ - WW8Stream::Pointer_t pStream = getDataStream(); - - if (pStream.get() != NULL) - { - WW8StructBase aStruct(*pStream, mfcPicLoc, 4); - sal_uInt32 nCount = aStruct.getU32(0); - - { - WW8PICF * pPicf = new WW8PICF(*pStream, mfcPicLoc, nCount); - pPicf->setDocument(this); - - writerfilter::Reference<Properties>::Pointer_t pProps(pPicf); - - rStream.props(pProps); - } - } -} - -void WW8DocumentImpl::resolveSpecialChar(sal_uInt32 nChar, Stream & rStream) -{ - switch (nChar) - { - case 0x1: - resolvePicture(rStream); - break; - default: - break; - } -} - -void WW8DocumentImpl::text(Stream & rStream, const sal_uInt8 * data, size_t len) -{ -#ifdef DEBUG_ELEMENT - ::rtl::OUString sText( (const sal_Char*) data, len, RTL_TEXTENCODING_MS_1252 ); - debug_logger->startElement("text"); - debug_logger->chars(OUStringToOString(sText, RTL_TEXTENCODING_ASCII_US).getStr()); - debug_logger->endElement(); -#endif - rStream.text(data, len); -} - -void WW8DocumentImpl::utext(Stream & rStream, const sal_uInt8 * data, size_t len) -{ -#ifdef DEBUG_ELEMENT - debug_logger->startElement("utext"); - - ::rtl::OUString sText; - ::rtl::OUStringBuffer aBuffer = ::rtl:: OUStringBuffer(len); - aBuffer.append( (const sal_Unicode *) data, len); - sText = aBuffer.makeStringAndClear(); - - debug_logger->chars(OUStringToOString(sText, RTL_TEXTENCODING_ASCII_US).getStr()); - debug_logger->endElement(); -#endif - rStream.utext(data, len); -} - - -void WW8DocumentImpl::resolveText(WW8DocumentIterator::Pointer_t pIt, - Stream & rStream) -{ - WW8Stream::Sequence aSeq = pIt->getText(); - - sal_uInt32 nCount = aSeq.getCount(); - bool bComplex = pIt->isComplex(); - - /* - Assumption: Special characters are always at the beginning or end of a - run. - */ - if (nCount > 0) - { - if (nCount == 1) - bComplex = true; - - if (bComplex) - { - sal_uInt32 nStartIndex = 0; - sal_uInt32 nEndIndex = nCount - 1; - - sal_uInt32 nCharFirst = aSeq[0]; - sal_uInt32 nCharLast = aSeq[nEndIndex]; - - if (isSpecial(nCharFirst)) - { - nStartIndex += 1; - resolveSpecialChar(nCharFirst, rStream); - text(rStream, &aSeq[0], 1); - } - - if (!isSpecial(nCharLast)) - nEndIndex += 1; - - if (nStartIndex < nEndIndex) - { - sal_uInt32 nChars = nEndIndex - nStartIndex; - text(rStream, &aSeq[nStartIndex], nChars); - - if (isSpecial(nCharLast)) - { - resolveSpecialChar(nCharLast, rStream); - text(rStream, &aSeq[nEndIndex], 1); - } - } - } - else - { - sal_uInt32 nStartIndex = 0; - sal_uInt32 nEndIndex = nCount - 2; - - sal_uInt32 nCharFirst = aSeq[0] + (aSeq[1] << 8); - sal_uInt32 nCharLast = aSeq[nEndIndex] + (aSeq[nEndIndex + 1]); - - if (isSpecial(nCharFirst)) - { - nStartIndex += 2; - resolveSpecialChar(nCharFirst, rStream); - utext(rStream, &aSeq[0], 1); - } - - if (!isSpecial(nCharLast)) - nEndIndex += 2; - - if (nStartIndex < nEndIndex) - { - sal_uInt32 nChars = (nEndIndex - nStartIndex) / 2; - utext(rStream, &aSeq[nStartIndex], nChars); - - if (isSpecial(nCharLast)) - { - resolveSpecialChar(nCharLast, rStream); - utext(rStream, &aSeq[nEndIndex], 1); - } - } - } - } -} - -void WW8DocumentImpl::startCharacterGroup(Stream & rStream) -{ - if (mbInCharacterGroup) - endCharacterGroup(rStream); - -#ifdef DEBUG_ELEMENT - debug_logger->startElement("charactergroup"); -#endif - - rStream.startCharacterGroup(); - mbInCharacterGroup = true; -} - -void WW8DocumentImpl::endCharacterGroup(Stream & rStream) -{ -#ifdef DEBUG_ELEMENT - debug_logger->endElement(); -#endif - - rStream.endCharacterGroup(); - mbInCharacterGroup = false; -} - -void WW8DocumentImpl::startParagraphGroup(Stream & rStream) -{ - if (mbInParagraphGroup) - endParagraphGroup(rStream); - -#ifdef DEBUG_ELEMENT - debug_logger->startElement("paragraphgroup"); -#endif - - rStream.startParagraphGroup(); - mbInParagraphGroup = true; -} - -void WW8DocumentImpl::endParagraphGroup(Stream & rStream) -{ - if (mbInCharacterGroup) - endCharacterGroup(rStream); - -#ifdef DEBUG_ELEMENT - debug_logger->endElement(); -#endif - rStream.endParagraphGroup(); - mbInParagraphGroup = false; -} - -void WW8DocumentImpl::startSectionGroup(Stream & rStream) -{ - if (mbInSection) - endSectionGroup(rStream); - -#ifdef DEBUG_ELEMENT - debug_logger->startElement("sectiongroup"); -#endif - - rStream.startSectionGroup(); - mbInSection = true; -} - -void WW8DocumentImpl::endSectionGroup(Stream & rStream) -{ - if (mbInParagraphGroup) - endParagraphGroup(rStream); - -#ifdef DEBUG_ELEMENT - debug_logger->endElement(); -#endif - rStream.endSectionGroup(); - mbInSection = false; -} - -void WW8DocumentImpl::resolve(Stream & rStream) -{ - if (! bSubDocument) - { -#if 1 - output.addItem("<substream-names>"); - output.addItem(mpStream->getSubStreamNames()); - output.addItem("</substream-names>"); - - if (mpDocStream.get() != NULL) - { - mpDocStream->dump(output); - } - - if (mpSummaryInformationStream.get() != NULL) - { - mpSummaryInformationStream->dump(output); - } -#endif - - writerfilter::Reference<Properties>::Pointer_t pFib - (new WW8Fib(*mpFib)); - rStream.props(pFib); - - if (mpFibRgFcLcb2000.get() != NULL) - { - writerfilter::Reference<Properties>::Pointer_t pFibRgFcLcb2000 - (new WW8FibRgFcLcb2000(*mpFibRgFcLcb2000)); - rStream.props(pFibRgFcLcb2000); - } - - if (mpFib->get_lcbPlcftxbxBkd() > 0) - { - PLCF<WW8BKD> aPLCF(*mpTableStream, - mpFib->get_fcPlcftxbxBkd(), - mpFib->get_lcbPlcftxbxBkd()); - } - - if (mpDffBlock.get() != NULL) - { - DffBlock * pTmp = new DffBlock(*mpDffBlock); - writerfilter::Reference<Properties>::Pointer_t pDffBlock = - writerfilter::Reference<Properties>::Pointer_t(pTmp); - - rStream.props(pDffBlock); - } - - { - rStream.info("headers"); - sal_uInt32 nHeaderCount = getHeaderCount(); - for (sal_uInt32 n = 0; n < nHeaderCount; ++n) - { - rStream.info(getHeaderCpAndFc(n).toString()); - } - rStream.info("/headers"); - } - - writerfilter::Reference<Table>::Pointer_t pSttbRgtplc = getListTplcs(); - - if (pSttbRgtplc.get() != NULL) - rStream.table(NS_rtf::LN_SttbRgtplc, pSttbRgtplc); - - writerfilter::Reference<Table>::Pointer_t pFontTable = getFontTable(); - - if (pFontTable.get() != NULL) - rStream.table(NS_rtf::LN_FONTTABLE, pFontTable); - - try - { - writerfilter::Reference<Table>::Pointer_t pStyleSheet = getStyleSheet(); - - if (pStyleSheet.get() != NULL) - rStream.table(NS_rtf::LN_STYLESHEET, pStyleSheet); - } - catch (Exception &e) - { - clog << e.getText() << endl; - } - - writerfilter::Reference<Table>::Pointer_t pAssocTable = getAssocTable(); - - if (pAssocTable.get() != NULL) - rStream.table(NS_rtf::LN_SttbAssoc, pAssocTable); - - writerfilter::Reference<Table>::Pointer_t pListTable = getListTable(); - - if (pListTable.get() != NULL) - rStream.table(NS_rtf::LN_LISTTABLE, pListTable); - - writerfilter::Reference<Table>::Pointer_t pLFOTable = getLFOTable(); - - if (pLFOTable.get() != NULL) - rStream.table(NS_rtf::LN_LFOTABLE, pLFOTable); - } - - WW8DocumentIterator::Pointer_t pIt = begin(); - WW8DocumentIterator::Pointer_t pItEnd = end(); - - mbInParagraphGroup = false; - mbInCharacterGroup = false; - mbInSection = false; - - sal_uInt32 nSectionIndex = 0; - - rStream.info(pIt->toString()); - rStream.info(pItEnd->toString()); - - while (! pIt->equal(*pItEnd)) - { - writerfilter::Reference<Properties>::Pointer_t - pProperties(pIt->getProperties()); - - switch (pIt->getPropertyType()) - { - case PROP_FOOTNOTE: - { - rStream.info(pIt->toString()); - writerfilter::Reference<Stream>::Pointer_t - pFootnote(pIt->getSubDocument()); - - if (pFootnote.get() != NULL) - { -#ifdef DEBUG_ELEMENT - debug_logger->startElement("substream"); -#endif - rStream.substream(NS_rtf::LN_footnote, pFootnote); -#ifdef DEBUG_ELEMENT - debug_logger->endElement(); -#endif - } - } - break; - case PROP_ENDNOTE: - { - rStream.info(pIt->toString()); - writerfilter::Reference<Stream>::Pointer_t - pEndnote(pIt->getSubDocument()); - - if (pEndnote.get() != NULL) - { -#ifdef DEBUG_ELEMENT - debug_logger->startElement("substream"); -#endif - rStream.substream(NS_rtf::LN_endnote, pEndnote); -#ifdef DEBUG_ELEMENT - debug_logger->endElement(); -#endif - } - } - break; - case PROP_ANNOTATION: - { - rStream.info(pIt->toString()); - writerfilter::Reference<Stream>::Pointer_t - pAnnotation(pIt->getSubDocument()); - - if (pAnnotation.get() != NULL) - { -#ifdef DEBUG_ELEMENT - debug_logger->startElement("substream"); -#endif - rStream.substream(NS_rtf::LN_annotation, pAnnotation); -#ifdef DEBUG_ELEMENT - debug_logger->endElement(); -#endif - } - } - break; - case PROP_CHP: - { - startCharacterGroup(rStream); - } - - break; - case PROP_PAP: - { - startParagraphGroup(rStream); - rStream.info(pIt->toString()); - } - - break; - case PROP_SEC: - { - startSectionGroup(rStream); - rStream.info(pIt->toString()); - - if (nSectionIndex == 0) - rStream.props(getDocumentProperties()); - - sal_uInt32 nHeaderStartIndex = 6 + nSectionIndex * 6; - sal_uInt32 nHeaderEndIndex = nHeaderStartIndex + 6; - - if (nHeaderStartIndex >= getHeaderCount()) - nHeaderStartIndex = getHeaderCount(); - - if (nHeaderEndIndex >= getHeaderCount()) - nHeaderEndIndex = getHeaderCount(); - - for (sal_uInt32 n = nHeaderStartIndex; n < nHeaderEndIndex; ++n) - { - writerfilter::Reference<Stream>::Pointer_t - pHeader(getHeader(n)); - - Id qName = lcl_headerQName(n); - - if (pHeader.get() != NULL) - rStream.substream(qName, pHeader); - } - - ++nSectionIndex; - } - - break; - default: - rStream.info(pIt->toString()); - } - - if (pProperties.get() != NULL) - { -#ifdef DEBUG_PROPERTIES - debug_logger->propertySet(pProperties, - IdToString::Pointer_t(new WW8IdToString())); -#endif - - rStream.props(pProperties); - } - - if (pIt->getPropertyType() == PROP_PAP) - { - startCharacterGroup(rStream); - } - - resolveText(pIt, rStream); - - ++(*pIt); - } - - if (mbInCharacterGroup) - endCharacterGroup(rStream); - - if (mbInParagraphGroup) - endParagraphGroup(rStream); - - if (mbInSection) - endSectionGroup(rStream); - -} - -WW8Stream::Pointer_t -WW8DocumentFactory::createStream(uno::Reference<uno::XComponentContext> rContext, - uno::Reference<io::XInputStream> rStream) -{ - return WW8Stream::Pointer_t(new WW8StreamImpl(rContext, rStream)); -} - -WW8Document * -WW8DocumentFactory::createDocument(WW8Stream::Pointer_t rpStream) -{ - return new WW8DocumentImpl(rpStream); -} - -writerfilter::Reference<Properties>::Pointer_t -WW8SED::get_sepx() -{ - writerfilter::Reference<Properties>::Pointer_t pResult; - - if (get_fcSepx() != 0xffffffff) - { - WW8StructBase aTmp(*mpDoc->getDocStream(), get_fcSepx(), 2); - pResult = writerfilter::Reference<Properties>::Pointer_t - (new WW8PropertySetImpl - (*mpDoc->getDocStream(), get_fcSepx() + 2, - (sal_uInt32) aTmp.getU16(0), false)); - } - - return pResult; -} - -void WW8DocumentImpl::insertCpAndFc(const CpAndFc & rCpAndFc) -{ - mCpAndFcs.insert(rCpAndFc); -} - -string propertyTypeToString(PropertyType nType) -{ - string result; - - switch (nType) - { - case PROP_SHP: - result = "SHP"; - - break; - case PROP_FLD: - result = "FLD"; - - break; - case PROP_BOOKMARKSTART: - result = "BOOKMARKSTART"; - - break; - case PROP_BOOKMARKEND: - result = "BOOKMARKEND"; - - break; - case PROP_ENDNOTE: - result = "ENDNOTE"; - - break; - case PROP_FOOTNOTE: - result = "FOOTNOTE"; - - break; - case PROP_ANNOTATION: - result = "ANNOTATION"; - - break; - case PROP_DOC: - result = "DOC"; - - break; - - case PROP_SEC: - result = "SEC"; - - break; - - case PROP_PAP: - result = "PAP"; - - break; - - case PROP_CHP: - result = "CHP"; - - break; - default: - break; - } - - return result; -} - -string CpAndFc::toString() const -{ - string result; - - result += "("; - result += getCp().toString(); - result += ", "; - result += getFc().toString(); - result += ", "; - - result += propertyTypeToString(getType()); - - result += ")"; - - return result; -} - - -// Bookmark - -Bookmark::Bookmark(writerfilter::Reference<Properties>::Pointer_t pBKF, - rtl::OUString & rName) -: mpBKF(pBKF), mName(rName) -{ -} - -void Bookmark::resolve(Properties & rHandler) -{ - mpBKF->resolve(rHandler); - - WW8Value::Pointer_t pValue = createValue(mName); - rHandler.attribute(NS_rtf::LN_BOOKMARKNAME, *pValue); -} - -string Bookmark::getType() const -{ - return "Bookmark"; -} - -// BookmarkHelper - -CpAndFc BookmarkHelper::getStartCpAndFc(sal_uInt32 nPos) -{ - Cp aCp(mpStartCps->getFc(nPos)); - Fc aFc(mpPieceTable->cp2fc(aCp)); - CpAndFc aCpAndFc(aCp, aFc, PROP_BOOKMARKSTART); - - return aCpAndFc; -} - -CpAndFc BookmarkHelper::getEndCpAndFc(sal_uInt32 nPos) -{ - Cp aCp(mpEndCps->getU32(nPos * 4)); - Fc aFc(mpPieceTable->cp2fc(aCp)); - CpAndFc aCpAndFc(aCp, aFc, PROP_BOOKMARKEND); - - return aCpAndFc; -} - -rtl::OUString BookmarkHelper::getName(sal_uInt32 nPos) -{ - return mpNames->getEntry(nPos); -} - -sal_uInt32 BookmarkHelper::getIndex(const CpAndFc & rCpAndFc) -{ - sal_uInt32 nResult = mpStartCps->getEntryCount(); - - sal_uInt32 nCp = rCpAndFc.getCp().get(); - - sal_uInt32 n; - switch (rCpAndFc.getType()) - { - case PROP_BOOKMARKSTART: - { - sal_uInt32 nStartsCount = mpStartCps->getEntryCount(); - - for (n = 0; n < nStartsCount; ++n) - { - if (nCp == mpStartCps->getFc(n)) - { - nResult = n; - - break; - } - } - - if (n == nStartsCount) - throw ExceptionNotFound("BookmarkHelper::getIndex"); - } - - break; - - case PROP_BOOKMARKEND: - { - sal_uInt32 nEndsCount = mpEndCps->getCount() / 4; - sal_uInt32 nIndex = nEndsCount; - - for (n = 0; n < nEndsCount; ++n) - { - if (nCp == mpEndCps->getU16(n * 4)) - { - nIndex = n; - - break; - } - } - - if (n == nEndsCount) - throw ExceptionNotFound("BookmarkHelper::getIndex"); - - { - { - sal_uInt32 nStartsCount = mpStartCps->getEntryCount(); - for (n = 0; n < nStartsCount; ++n) - { - WW8BKF::Pointer_t pBKF(mpStartCps->getEntry(n)); - - if (pBKF->get_ibkl() == - sal::static_int_cast<sal_Int32>(nIndex)) - { - nResult = n; - - break; - } - } - - if (n == nStartsCount) - throw ExceptionNotFound("BookmarkHelper::getIndex"); - } - } - } - - break; - default: - break; - } - - return nResult; -} - -void BookmarkHelper::init() -{ - { - sal_uInt32 nStartsCount = mpStartCps->getEntryCount(); - - for (sal_uInt32 n = 0; n < nStartsCount; ++n) - mpDoc->insertCpAndFc(getStartCpAndFc(n)); - } - - { - sal_uInt32 nEndsCount = mpEndCps->getCount() / 4; - - for (sal_uInt32 n = 0; n < nEndsCount; ++n) - mpDoc->insertCpAndFc(getEndCpAndFc(n)); - } -} - -writerfilter::Reference<Properties>::Pointer_t -BookmarkHelper::getBKF(const CpAndFc & rCpAndFc) -{ - sal_uInt32 nIndex = getIndex(rCpAndFc); - - return writerfilter::Reference<Properties>::Pointer_t - (mpStartCps->getEntryPointer(nIndex)); -} - -writerfilter::Reference<Properties>::Pointer_t -BookmarkHelper::getBookmark(const CpAndFc & rCpAndFc) -{ - writerfilter::Reference<Properties>::Pointer_t pResult; - - try - { - rtl::OUString aName = getName(rCpAndFc); - - pResult = writerfilter::Reference<Properties>::Pointer_t - (new Bookmark(getBKF(rCpAndFc), aName)); - } - catch (ExceptionNotFound &e) - { - clog << e.getText() << endl; - } - - return pResult; -} - -rtl::OUString BookmarkHelper::getName(const CpAndFc & rCpAndFc) -{ - rtl::OUString sResult; - - sal_uInt32 nIndex = getIndex(rCpAndFc); - - sResult = getName(nIndex); - - return sResult; -} - -template <class T, class Helper> -struct ProcessPLCF2Map -{ - void process(typename PLCF<T>::Pointer_t pPlcf, - typename Helper::Map_t & rMap, - PropertyType type, - WW8DocumentImpl * pDoc) - { - if (pPlcf.get() != NULL) - { - sal_uInt32 nCount = pPlcf->getEntryCount(); - - for (sal_uInt32 n = 0; n < nCount; n++) - { - Cp aCp(pPlcf->getFc(n)); - CpAndFc aCpAndFc(pDoc->getCpAndFc(aCp, type)); - typename T::Pointer_t pT = pPlcf->getEntry(n); - - rMap[aCpAndFc] = pT; - } - } - } -}; - -FieldHelper::FieldHelper(PLCF<WW8FLD>::Pointer_t pPlcffldMom, - WW8DocumentImpl * pDoc) -: mpDoc(pDoc) -{ - ProcessPLCF2Map<WW8FLD, FieldHelper> process; - process.process(pPlcffldMom, mMap, PROP_FLD, pDoc); -} - -void FieldHelper::init() -{ - Map_t::iterator aIt; - - for (aIt = mMap.begin(); aIt != mMap.end(); ++aIt) - { - mpDoc->insertCpAndFc(aIt->first); - } -} - -WW8FLD::Pointer_t FieldHelper::getWW8FLD(const CpAndFc & rCpAndFc) -{ - WW8FLD::Pointer_t pFld = mMap[rCpAndFc]; - - return pFld; -} - -writerfilter::Reference<Properties>::Pointer_t -FieldHelper::getField(const CpAndFc & rCpAndFc) -{ - WW8FLD::Pointer_t pFLD = getWW8FLD(rCpAndFc); - - return writerfilter::Reference<Properties>::Pointer_t - (new WW8FLD(*pFLD)); -} - -ShapeHelper::ShapeHelper(PLCF<WW8FSPA>::Pointer_t pPlcspaMom, - PLCF<WW8FSPA>::Pointer_t pPlcspaHdr, - WW8DocumentImpl * pDoc) -: mpDoc(pDoc) -{ - ProcessPLCF2Map<WW8FSPA, ShapeHelper> process; - process.process(pPlcspaMom, mMap, PROP_SHP, pDoc); - process.process(pPlcspaHdr, mMap, PROP_SHP, pDoc); -} - -void ShapeHelper::init() -{ - Map_t::iterator aIt; - - for (aIt = mMap.begin(); aIt != mMap.end(); ++aIt) - { - mpDoc->insertCpAndFc(aIt->first); - aIt->second->setDocument(mpDoc); - } -} - -writerfilter::Reference<Properties>::Pointer_t -ShapeHelper::getShape(const CpAndFc & rCpAndFc) -{ - WW8FSPA::Pointer_t pFSPA = mMap[rCpAndFc]; - - return writerfilter::Reference<Properties>::Pointer_t - (new WW8FSPA(*pFSPA)); -} - -BreakHelper::BreakHelper(PLCF<WW8BKD>::Pointer_t pPlcfbkdMom, - WW8DocumentImpl * pDoc) -: mpDoc(pDoc) -{ - ProcessPLCF2Map<WW8BKD, BreakHelper> process; - process.process(pPlcfbkdMom, mMap, PROP_BRK, pDoc); -} - -void BreakHelper::init() -{ - Map_t::iterator aIt; - - for (aIt = mMap.begin(); aIt != mMap.end(); ++aIt) - { - mpDoc->insertCpAndFc(aIt->first); - } -} - -writerfilter::Reference<Properties>::Pointer_t -BreakHelper::getBreak(const CpAndFc & rCpAndFc) -{ - WW8BKD::Pointer_t pBKD = mMap[rCpAndFc]; - - return writerfilter::Reference<Properties>::Pointer_t - (new WW8BKD(*pBKD)); -} - - -}} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |