| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| #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); |
| } |
| |
| WW8SED * WW8DocumentIteratorImpl::getSED() const |
| { |
| return mpDocument->getSED(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() |
| { |
| } |
| |
| #ifdef DEBUG |
| 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::createFromAscii |
| ("WordDocument")); |
| |
| mpSummaryInformationStream = getSubStream(::rtl::OUString::createFromAscii |
| ("\5SummaryInformation")); |
| |
| try |
| { |
| mpDataStream = getSubStream(::rtl::OUString::createFromAscii |
| ("Data")); |
| } |
| catch (ExceptionNotFound e) |
| { |
| } |
| |
| try |
| { |
| mpCompObjStream = getSubStream(::rtl::OUString::createFromAscii |
| ("\1CompObj")); |
| } |
| catch (ExceptionNotFound e) |
| { |
| } |
| |
| 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::createFromAscii |
| ("0Table")); |
| |
| break; |
| |
| case 1: |
| mpTableStream = getSubStream(::rtl::OUString::createFromAscii |
| ("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())); |
| |
| //clog << "BinTable(CHP):" << mpBinTableCHPX->toString(); |
| |
| parseBinTableCpAndFcs(*mpBinTableCHPX, PROP_CHP); |
| |
| mpSEDs = PLCF<WW8SED>::Pointer_t(new PLCF<WW8SED> |
| (*mpTableStream, |
| mpFib->get_fcPlcfsed(), |
| mpFib->get_lcbPlcfsed())); |
| |
| //mpSEDs->dump(clog); |
| |
| { |
| 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_) |
| { |
| //clog << "<bintable type=\"" << propertyTypeToString(eType_) << "\">" << endl; |
| for (sal_uInt32 i = 0; i < rTable.getEntryCount(); i++) |
| { |
| #if 0 |
| char sBuffer[255]; |
| snprintf(sBuffer, 255, "%ld", i); |
| char sBufferPageNum[255]; |
| snprintf(sBufferPageNum, 255, "%ld", rTable.getPageNumber(i)); |
| #endif |
| Fc aFcFromTable(rTable.getFc(i)); |
| |
| if (aFcFromTable < mpPieceTable->getFirstFc()) |
| aFcFromTable = mpPieceTable->getFirstFc(); |
| |
| bool bComplex = mpPieceTable->isComplex(aFcFromTable); |
| aFcFromTable.setComplex(bComplex); |
| |
| //clog << "<entry fc=\"" << aFcFromTable.toString() << "\">" << endl; |
| |
| 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); |
| |
| //clog << "<fkpentry fc=\"" << aFc.toString() << "\"/>" << endl; |
| |
| try |
| { |
| Cp aCp = mpPieceTable->fc2cp(aFc); |
| |
| CpAndFc aCpAndFc(aCp, aFc, eType_); |
| |
| mCpAndFcs.insert(aCpAndFc); |
| |
| //clog << aCpAndFc << endl; |
| } |
| catch (ExceptionNotFound e) |
| { |
| clog << e.getText() << endl; |
| } |
| } |
| } |
| catch (ExceptionNotFound e) |
| { |
| clog << e.getText() << endl; |
| } |
| |
| //clog << "</entry>" << endl; |
| } |
| |
| //clog << "</bintable>" << 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::getTextboxEndCp() const |
| { |
| return mTextboxEndCpAndFc; |
| } |
| |
| CpAndFc WW8DocumentImpl::getTextboxHeaderEndCp() const |
| { |
| return mTextboxHeaderEndCpAndFc; |
| } |
| |
| 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 e) |
| { |
| } |
| } |
| |
| 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 aException) { |
| } |
| } |
| |
| 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 0 |
| sal_uInt32 nEquals = 1; |
| while (aCpAndFcEnd == aCpAndFcStart && nPos + nEquals < getHeaderCount()) |
| { |
| ++nEquals; |
| |
| aCpAndFcEnd = getHeaderCpAndFc(nPos + nEquals); |
| } |
| #endif |
| |
| if (aCpAndFcStart < aCpAndFcEnd) |
| pResult = writerfilter::Reference<Stream>::Pointer_t |
| (new WW8DocumentImpl(*this, aCpAndFcStart, aCpAndFcEnd)); |
| |
| return pResult; |
| } |
| |
| sal_uInt32 WW8DocumentImpl::getFootnoteCount() const |
| { |
| return (mpFootnoteHelper.get() != NULL) ? mpFootnoteHelper->getCount() : 0; |
| } |
| |
| writerfilter::Reference<Stream>::Pointer_t |
| WW8DocumentImpl::getFootnote(sal_uInt32 nPos) |
| { |
| writerfilter::Reference<Stream>::Pointer_t pResult; |
| |
| if (! bSubDocument) |
| pResult = mpFootnoteHelper->get(nPos); |
| |
| 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; |
| } |
| |
| sal_uInt32 WW8DocumentImpl::getEndnoteCount() const |
| { |
| return mpEndnoteHelper.get() != NULL ? mpEndnoteHelper->getCount() : 0; |
| } |
| |
| writerfilter::Reference<Stream>::Pointer_t |
| WW8DocumentImpl::getEndnote(sal_uInt32 nPos) |
| { |
| writerfilter::Reference<Stream>::Pointer_t pResult; |
| |
| if (! bSubDocument) |
| pResult = mpEndnoteHelper->get(nPos); |
| |
| 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; |
| } |
| |
| sal_uInt32 WW8DocumentImpl::getAnnotationCount() const |
| { |
| return mpAnnotationHelper.get() != NULL ? |
| mpAnnotationHelper->getCount() : 0; |
| } |
| |
| writerfilter::Reference<Stream>::Pointer_t |
| WW8DocumentImpl::getAnnotation(sal_uInt32 nPos) |
| { |
| writerfilter::Reference<Stream>::Pointer_t pResult; |
| |
| if (! bSubDocument) |
| pResult = mpAnnotationHelper->get(nPos); |
| |
| 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( bool(mpDffBlock)) |
| { |
| 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; |
| } |
| |
| sal_uInt32 WW8DocumentImpl::getPicLocation() const |
| { |
| return mfcPicLoc; |
| } |
| |
| 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); |
| } |
| |
| CpAndFc WW8DocumentImpl::getCpAndFc(const Fc & fc, PropertyType type) const |
| { |
| Cp aCp = fc2cp(fc); |
| |
| return CpAndFc(aCp, fc, 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("text"); |
| #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("utext"); |
| #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("charactergroup"); |
| #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("paragraphgroup"); |
| #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("sectiongroup"); |
| #endif |
| rStream.endSectionGroup(); |
| mbInSection = false; |
| } |
| |
| void WW8DocumentImpl::resolve(Stream & rStream) |
| { |
| if (! bSubDocument) |
| { |
| |
| //mpPieceTable->dump(clog); |
| |
| //copy(mCpAndFcs.begin(), mCpAndFcs.end(), ostream_iterator<CpAndFc>(clog, ", ")); |
| |
| //mpDocStream->dump(output); |
| |
| //output.addItem(mTextboxHeaderEndCpAndFc.toString()); |
| |
| #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 0 |
| if (mpTextBoxStories.get() != NULL) |
| { |
| output.addItem("<textbox.boxes>"); |
| mpTextBoxStories->dump(output); |
| output.addItem("</textbox.boxes>"); |
| } |
| #endif |
| if (mpFib->get_lcbPlcftxbxBkd() > 0) |
| { |
| PLCF<WW8BKD> aPLCF(*mpTableStream, |
| mpFib->get_fcPlcftxbxBkd(), |
| mpFib->get_lcbPlcftxbxBkd()); |
| #if 0 |
| output.addItem("<textbox.breaks>"); |
| aPLCF.dump(output); |
| output.addItem("</textbox.breaks>"); |
| #endif |
| } |
| |
| if (mpDffBlock.get() != NULL) |
| { |
| DffBlock * pTmp = new DffBlock(*mpDffBlock); |
| //pTmp->dump(clog); |
| 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"); |
| } |
| |
| #if 0 |
| { |
| sal_uInt32 nFootnoteCount = getFootnoteCount(); |
| for (sal_uInt32 n = 0; n < nFootnoteCount; ++n) |
| { |
| //clog << "<footnote num=\"" << n << "\"/>" << endl; |
| |
| writerfilter::Reference<Stream>::Pointer_t pFootnote(getFootnote(n)); |
| |
| if (pFootnote.get() != NULL) |
| rStream.substream(NS_rtf::LN_footnote, pFootnote); |
| } |
| } |
| { |
| sal_uInt32 nEndnoteCount = getEndnoteCount(); |
| for (sal_uInt32 n = 0; n < nEndnoteCount; ++n) |
| { |
| //clog << "<endnote num=\"" << n << "\"/>" << endl; |
| |
| writerfilter::Reference<Stream>::Pointer_t pEndnote(getEndnote(n)); |
| |
| if (pEndnote.get() != NULL) |
| rStream.substream(NS_rtf::LN_endnote, pEndnote); |
| } |
| } |
| #endif |
| |
| 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("substream"); |
| #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("substream"); |
| #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("substream"); |
| #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 |
| PropertySetToTagHandler aHandler(IdToString::Pointer_t(new WW8IdToString())); |
| pProperties->resolve(aHandler); |
| debug_logger->addTag(aHandler.getTag()); |
| #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)); |
| } |
| |
| |
| }} |