Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <resourcemodel/exceptions.hxx>
21 : #include <resourcemodel/QNameToString.hxx>
22 : #include <WW8DocumentImpl.hxx>
23 : #include <WW8FKPImpl.hxx>
24 : #include <WW8PieceTableImpl.hxx>
25 : #include <WW8BinTableImpl.hxx>
26 : #include <WW8StreamImpl.hxx>
27 : #include <WW8Sttbf.hxx>
28 : #include <Dff.hxx>
29 : #include <iterator>
30 : #include <XNoteHelperImpl.hxx>
31 : #include <rtl/ustring.hxx>
32 : #include <rtl/ustrbuf.hxx>
33 : #include <doctokLoggers.hxx>
34 :
35 : namespace writerfilter {
36 : namespace doctok
37 : {
38 :
39 : using namespace ::std;
40 :
41 : template <class T>
42 : struct PLCFHelper
43 : {
44 0 : static void processPLCFCpAndFcs(WW8DocumentImpl & rDoc,
45 : WW8PieceTable::Pointer_t pPieceTable,
46 : typename PLCF<T>::Pointer_t pPLCF,
47 : PropertyType eType,
48 : sal_uInt32 nOffset)
49 : {
50 0 : sal_uInt32 nCount = pPLCF->getEntryCount();
51 0 : for (sal_uInt32 n = 0; n < nCount; ++n)
52 : {
53 0 : Cp aCp(pPLCF->getFc(n) + nOffset);
54 0 : CpAndFc aCpAndFc = pPieceTable->createCpAndFc(aCp, eType);
55 :
56 0 : rDoc.insertCpAndFc(aCpAndFc);
57 : }
58 0 : }
59 : };
60 :
61 : // WW8DocumentIteratorImpl
62 0 : bool operator == (const WW8DocumentIterator & rA,
63 : const WW8DocumentIterator & rB)
64 : {
65 0 : return rA.equal(rB);
66 : }
67 :
68 0 : WW8DocumentIterator::~WW8DocumentIterator()
69 : {
70 0 : }
71 :
72 0 : WW8DocumentIteratorImpl::~WW8DocumentIteratorImpl()
73 : {
74 0 : }
75 :
76 0 : WW8DocumentIterator & WW8DocumentIteratorImpl::operator++()
77 : {
78 0 : mCpAndFc = mpDocument->getNextCp(mCpAndFc);
79 :
80 0 : return *this;
81 : }
82 :
83 0 : WW8DocumentIterator & WW8DocumentIteratorImpl::operator--()
84 : {
85 0 : mCpAndFc = mpDocument->getPrevCp(mCpAndFc);
86 :
87 0 : return *this;
88 : }
89 :
90 0 : bool WW8DocumentIteratorImpl::equal(const WW8DocumentIterator & rIt_) const
91 : {
92 : const WW8DocumentIteratorImpl & rIt =
93 0 : dynamic_cast<const WW8DocumentIteratorImpl &>(rIt_);
94 :
95 0 : return mCpAndFc == rIt.mCpAndFc && mpDocument == rIt.mpDocument;
96 : }
97 :
98 : writerfilter::Reference<Properties>::Pointer_t
99 0 : WW8DocumentIteratorImpl::getProperties() const
100 : {
101 0 : return mpDocument->getProperties(mCpAndFc);
102 : }
103 :
104 : writerfilter::Reference<Stream>::Pointer_t
105 0 : WW8DocumentIteratorImpl::getSubDocument() const
106 : {
107 0 : return mpDocument->getSubDocument(mCpAndFc);
108 : }
109 :
110 0 : WW8Stream::Sequence WW8DocumentIteratorImpl::getText()
111 : {
112 0 : return mpDocument->getText(mCpAndFc);
113 : }
114 :
115 : writerfilter::Reference<Properties>::Pointer_t
116 0 : WW8DocumentIteratorImpl::getShape() const
117 : {
118 0 : return mpDocument->getShape(mCpAndFc);
119 : }
120 :
121 0 : PropertyType WW8DocumentIteratorImpl::getPropertyType() const
122 : {
123 0 : return mCpAndFc.getType();
124 : }
125 :
126 0 : bool WW8DocumentIteratorImpl::isComplex() const
127 : {
128 0 : return mCpAndFc.isComplex();
129 : }
130 :
131 0 : void WW8DocumentIteratorImpl::dump(ostream & o) const
132 : {
133 0 : o << mCpAndFc;
134 0 : }
135 :
136 0 : string WW8DocumentIteratorImpl::toString() const
137 : {
138 0 : return mCpAndFc.toString();
139 : }
140 :
141 : // WW8DocumentImpl
142 :
143 0 : WW8Document::~WW8Document()
144 : {
145 0 : }
146 :
147 : #if OSL_DEBUG_LEVEL > 1
148 : class WW8IdToString : public IdToString
149 : {
150 : public:
151 : WW8IdToString() : IdToString() {}
152 : virtual ~WW8IdToString() {}
153 :
154 : virtual string toString(const Id & rId) const
155 : {
156 : string s((*SprmIdToString::Instance())(rId));
157 :
158 : if (s.empty())
159 : s = (*QNameToString::Instance())(rId);
160 :
161 : return s;
162 : }
163 : };
164 : #endif
165 :
166 0 : WW8DocumentImpl::~WW8DocumentImpl()
167 : {
168 0 : }
169 :
170 0 : WW8DocumentImpl::WW8DocumentImpl(WW8Stream::Pointer_t rpStream)
171 : : bSubDocument(false), mfcPicLoc(0), mbPicIsData(false), mpStream(rpStream),
172 0 : mbInSection(false), mbInParagraphGroup(false), mbInCharacterGroup(false)
173 : {
174 0 : mpDocStream = getSubStream("WordDocument");
175 :
176 0 : mpSummaryInformationStream = getSubStream("\5SummaryInformation");
177 :
178 : try
179 : {
180 0 : mpDataStream = getSubStream("Data");
181 : }
182 0 : catch (const ExceptionNotFound &)
183 : {
184 : }
185 :
186 : try
187 : {
188 0 : mpCompObjStream = getSubStream("\1CompObj");
189 : }
190 0 : catch (const ExceptionNotFound &)
191 : {
192 : }
193 :
194 : mpCHPFKPCache =
195 0 : WW8FKPCache::Pointer_t(new WW8CHPFKPCacheImpl(mpDocStream, 5));
196 : mpPAPFKPCache =
197 0 : WW8FKPCache::Pointer_t(new WW8PAPFKPCacheImpl(mpDocStream, 5));
198 :
199 0 : mpFib = WW8Fib::Pointer_t(new WW8Fib(*mpDocStream));
200 :
201 0 : switch (mpFib->get_fWhichTblStm())
202 : {
203 : case 0:
204 0 : mpTableStream = getSubStream("0Table");
205 :
206 0 : break;
207 :
208 : case 1:
209 0 : mpTableStream = getSubStream("1Table");
210 :
211 0 : break;
212 :
213 : default:
214 0 : break;
215 : }
216 :
217 0 : if (mpFib->get_nFib() >= 0xD9)
218 : {
219 0 : mpFibRgFcLcb2000.reset(new WW8FibRgFcLcb2000(*mpFib));
220 : }
221 :
222 0 : if (mpTableStream.get() == NULL)
223 0 : throw ExceptionNotFound("Table stream not found.");
224 :
225 : mpPieceTable =
226 : WW8PieceTable::Pointer_t
227 0 : (new WW8PieceTableImpl(*mpTableStream, mpFib->get_fcClx(),
228 0 : mpFib->get_lcbClx()));
229 :
230 : {
231 0 : Cp aCp(mpPieceTable->getLastCp());
232 0 : Fc aFc(mpPieceTable->getLastFc());
233 0 : CpAndFc aCpAndFc(aCp, aFc, PROP_DOC);
234 0 : mCpAndFcs.insert(aCpAndFc);
235 : }
236 :
237 : {
238 0 : Cp aCp(mpFib->get_ccpText());
239 :
240 0 : mDocumentEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp),
241 0 : PROP_DOC);
242 0 : mCpAndFcs.insert(mDocumentEndCpAndFc);
243 :
244 0 : aCp += mpFib->get_ccpFtn();
245 0 : mFootnoteEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp),
246 0 : PROP_DOC);
247 0 : mCpAndFcs.insert(mFootnoteEndCpAndFc);
248 :
249 0 : aCp += mpFib->get_ccpHdd();
250 0 : mHeaderEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp),
251 0 : PROP_DOC);
252 0 : mCpAndFcs.insert(mHeaderEndCpAndFc);
253 :
254 0 : aCp += mpFib->get_ccpAtn();
255 0 : mAnnotationEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp),
256 0 : PROP_DOC);
257 0 : mCpAndFcs.insert(mAnnotationEndCpAndFc);
258 :
259 0 : aCp += mpFib->get_ccpEdn();
260 0 : mEndnoteEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp),
261 0 : PROP_DOC);
262 0 : mCpAndFcs.insert(mEndnoteEndCpAndFc);
263 :
264 0 : aCp += mpFib->get_ccpTxbx();
265 0 : mTextboxEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp),
266 0 : PROP_DOC);
267 0 : mCpAndFcs.insert(mTextboxEndCpAndFc);
268 :
269 0 : aCp += mpFib->get_ccpHdrTxbx();
270 0 : mTextboxHeaderEndCpAndFc = CpAndFc(aCp, mpPieceTable->cp2fc(aCp),
271 0 : PROP_DOC);
272 0 : mCpAndFcs.insert(mTextboxHeaderEndCpAndFc);
273 : }
274 :
275 : mpBinTablePAPX =
276 : WW8BinTable::Pointer_t(new WW8BinTableImpl
277 0 : (*mpTableStream,
278 0 : mpFib->get_fcPlcfbtePapx(),
279 0 : mpFib->get_lcbPlcfbtePapx()));
280 :
281 : //clog << "BinTable(PAP):" << mpBinTablePAPX->toString();
282 :
283 0 : parseBinTableCpAndFcs(*mpBinTablePAPX, PROP_PAP);
284 :
285 : mpBinTableCHPX =
286 : WW8BinTable::Pointer_t(new WW8BinTableImpl
287 0 : (*mpTableStream,
288 0 : mpFib->get_fcPlcfbteChpx(),
289 0 : mpFib->get_lcbPlcfbteChpx()));
290 :
291 0 : parseBinTableCpAndFcs(*mpBinTableCHPX, PROP_CHP);
292 :
293 : mpSEDs = PLCF<WW8SED>::Pointer_t(new PLCF<WW8SED>
294 0 : (*mpTableStream,
295 0 : mpFib->get_fcPlcfsed(),
296 0 : mpFib->get_lcbPlcfsed()));
297 :
298 : {
299 : PLCFHelper<WW8SED>::processPLCFCpAndFcs
300 0 : (*this, mpPieceTable, mpSEDs, PROP_SEC, 0);
301 : }
302 :
303 0 : sal_uInt32 nHeaders = getHeaderCount();
304 :
305 0 : if (nHeaders > 0)
306 : {
307 : mpHeaderOffsets = WW8StructBase::Pointer_t
308 0 : (new WW8StructBase(*mpTableStream,
309 0 : mpFib->get_fcPlcfhdd(),
310 0 : mpFib->get_lcbPlcfhdd()));
311 :
312 : {
313 0 : for (sal_uInt32 n = 0; n <= nHeaders; ++n)
314 : {
315 0 : CpAndFc aCpAndFc(getHeaderCpAndFc(n));
316 :
317 0 : mCpAndFcs.insert(aCpAndFc);
318 : }
319 : }
320 : }
321 :
322 0 : if (mpFib->get_lcbPlcffndTxt() > 0)
323 : {
324 : WW8StructBase::Pointer_t pCps
325 0 : (new WW8StructBase(*mpTableStream,
326 0 : mpFib->get_fcPlcffndTxt(),
327 0 : mpFib->get_lcbPlcffndTxt()));
328 :
329 : PLCF<WW8FRD>::Pointer_t pRefs
330 0 : (new PLCF<WW8FRD>(*mpTableStream,
331 0 : mpFib->get_fcPlcffndRef(),
332 0 : mpFib->get_lcbPlcffndRef()));
333 :
334 : mpFootnoteHelper = XNoteHelper<WW8FRD>::Pointer_t
335 : (new XNoteHelper<WW8FRD>(pCps, pRefs, mpPieceTable, this,
336 0 : PROP_FOOTNOTE, getDocumentEndCp()));
337 :
338 0 : mpFootnoteHelper->init();
339 : }
340 :
341 0 : if (mpFib->get_lcbPlcfendTxt() > 0)
342 : {
343 : WW8StructBase::Pointer_t pCps
344 0 : (new WW8StructBase(*mpTableStream,
345 0 : mpFib->get_fcPlcfendTxt(),
346 0 : mpFib->get_lcbPlcfendTxt()));
347 :
348 : PLCF<WW8FRD>::Pointer_t pRefs
349 0 : (new PLCF<WW8FRD>(*mpTableStream,
350 0 : mpFib->get_fcPlcfendRef(),
351 0 : mpFib->get_lcbPlcfendRef()));
352 :
353 : mpEndnoteHelper = XNoteHelper<WW8FRD>::Pointer_t
354 : (new XNoteHelper<WW8FRD>(pCps, pRefs, mpPieceTable, this,
355 0 : PROP_ENDNOTE, getAnnotationEndCp()));
356 :
357 0 : mpEndnoteHelper->init();
358 : }
359 :
360 0 : if (mpFib->get_lcbPlcfandTxt() > 0)
361 : {
362 : WW8StructBase::Pointer_t pCps
363 0 : (new WW8StructBase(*mpTableStream,
364 0 : mpFib->get_fcPlcfandTxt(),
365 0 : mpFib->get_lcbPlcfandTxt()));
366 :
367 : PLCF<WW8ATRD>::Pointer_t pRefs
368 0 : (new PLCF<WW8ATRD>(*mpTableStream,
369 0 : mpFib->get_fcPlcfandRef(),
370 0 : mpFib->get_lcbPlcfandRef()));
371 :
372 : mpAnnotationHelper = XNoteHelper<WW8ATRD>::Pointer_t
373 : (new XNoteHelper<WW8ATRD>(pCps, pRefs, mpPieceTable, this,
374 0 : PROP_ANNOTATION, getHeaderEndCp()));
375 :
376 0 : mpAnnotationHelper->init();
377 : }
378 :
379 0 : if (mpFib->get_lcbSttbfbkmk() > 0)
380 : {
381 : PLCF<WW8BKF>::Pointer_t pStartCps
382 0 : (new PLCF<WW8BKF>(*mpTableStream, mpFib->get_fcPlcfbkf(),
383 0 : mpFib->get_lcbPlcfbkf()));
384 :
385 : WW8StructBase::Pointer_t pEndCps
386 0 : (new WW8StructBase(*mpTableStream, mpFib->get_fcPlcfbkl(),
387 0 : mpFib->get_lcbPlcfbkl()));
388 :
389 : WW8Sttbf::Pointer_t pNames
390 0 : (new WW8Sttbf(*mpTableStream, mpFib->get_fcSttbfbkmk(),
391 0 : mpFib->get_lcbSttbfbkmk()));
392 :
393 : mpBookmarkHelper = BookmarkHelper::Pointer_t
394 0 : (new BookmarkHelper(pStartCps, pEndCps, pNames, mpPieceTable, this));
395 :
396 0 : mpBookmarkHelper->init();
397 : }
398 :
399 : {
400 0 : PLCF<WW8FLD>::Pointer_t pPlcffldMom;
401 :
402 0 : if (mpFib->get_lcbPlcffldMom() > 0)
403 : {
404 : pPlcffldMom = PLCF<WW8FLD>::Pointer_t
405 0 : (new PLCF<WW8FLD>(*mpTableStream,
406 0 : mpFib->get_fcPlcffldMom(),
407 0 : mpFib->get_lcbPlcffldMom()));
408 :
409 : mpFieldHelper = FieldHelper::Pointer_t
410 : (new FieldHelper(pPlcffldMom,
411 0 : this));
412 :
413 0 : mpFieldHelper->init();
414 0 : }
415 : }
416 :
417 0 : PLCF<WW8FSPA>::Pointer_t pPlcspaMom;
418 0 : if (mpFib->get_lcbPlcspaMom() > 0)
419 : {
420 : pPlcspaMom = PLCF<WW8FSPA>::Pointer_t
421 : (new PLCF<WW8FSPA>
422 0 : (*mpTableStream, mpFib->get_fcPlcspaMom(),
423 0 : mpFib->get_lcbPlcspaMom()));
424 : }
425 :
426 0 : PLCF<WW8FSPA>::Pointer_t pPlcspaHdr;
427 0 : if (mpFib->get_lcbPlcspaHdr() > 0)
428 : {
429 : pPlcspaHdr = PLCF<WW8FSPA>::Pointer_t
430 : (new PLCF<WW8FSPA>
431 0 : (*mpTableStream, mpFib->get_fcPlcspaHdr(),
432 0 : mpFib->get_lcbPlcspaHdr()));
433 : }
434 :
435 : mpShapeHelper = ShapeHelper::Pointer_t
436 0 : (new ShapeHelper(pPlcspaMom, pPlcspaHdr, this));
437 :
438 0 : mpShapeHelper->init();
439 :
440 0 : PLCF<WW8BKD>::Pointer_t pPlcbkdMother;
441 0 : if (mpFib->get_fcBkdMother() > 0 && mpFib->get_lcbBkdMother() > 0)
442 : {
443 : pPlcbkdMother = PLCF<WW8BKD>::Pointer_t
444 : (new PLCF<WW8BKD>
445 0 : (*mpTableStream, mpFib->get_fcBkdMother(),
446 0 : mpFib->get_lcbBkdMother()));
447 : }
448 :
449 : mpBreakHelper = BreakHelper::Pointer_t
450 0 : (new BreakHelper(pPlcbkdMother, this));
451 :
452 0 : mpBreakHelper->init();
453 :
454 0 : if (mpFib->get_fcDggInfo() != 0 && mpFib->get_lcbDggInfo() > 0)
455 : {
456 : mpDffBlock = DffBlock::Pointer_t
457 0 : (new DffBlock(*mpTableStream, mpFib->get_fcDggInfo(),
458 0 : mpFib->get_lcbDggInfo(), 1));
459 :
460 0 : mpDffBlock->setDocument(this);
461 : }
462 :
463 0 : if (mpFib->get_lcbPlcftxbxTxt() > 0)
464 : {
465 : mpTextBoxStories = PLCF<WW8FTXBXS>::Pointer_t
466 0 : (new PLCF<WW8FTXBXS>(*mpTableStream,
467 0 : mpFib->get_fcPlcftxbxTxt(),
468 0 : mpFib->get_lcbPlcftxbxTxt()));
469 :
470 : PLCFHelper<WW8FTXBXS>::processPLCFCpAndFcs
471 : (*this, mpPieceTable, mpTextBoxStories, PROP_DOC,
472 0 : mEndnoteEndCpAndFc.getCp().get());
473 : }
474 :
475 0 : if (mCpAndFcs.size() > 0)
476 : {
477 0 : mCpAndFcStart = *mCpAndFcs.begin();
478 0 : mCpAndFcEnd = getDocumentEndCp();
479 0 : }
480 0 : }
481 :
482 0 : bool WW8DocumentImpl::isSpecial(sal_uInt32 nChar)
483 : {
484 0 : bool bResult = false;
485 :
486 0 : if (nChar <= 8)
487 0 : bResult = true;
488 0 : else if (nChar >= 10)
489 : {
490 0 : if (nChar == 12)
491 0 : bResult= true;
492 0 : else if (nChar <= 16)
493 0 : bResult = true;
494 0 : else if (nChar >= 22)
495 : {
496 0 : if (nChar <= 30)
497 0 : bResult = true;
498 0 : else if (nChar >= 33)
499 : {
500 0 : if (nChar <= 39)
501 0 : bResult = true;
502 0 : else if (nChar == 41)
503 0 : bResult = true;
504 : }
505 : }
506 : }
507 :
508 0 : return bResult;
509 : }
510 :
511 0 : WW8DocumentImpl::WW8DocumentImpl(const WW8DocumentImpl & rSrc,
512 : const CpAndFc & rStart, const CpAndFc & rEnd)
513 0 : : bSubDocument(true), mfcPicLoc(0), mbPicIsData(false)
514 : {
515 0 : Assign(rSrc);
516 :
517 0 : mCpAndFcStart = rStart;
518 0 : mCpAndFcEnd = rEnd;
519 0 : }
520 :
521 0 : WW8DocumentImpl & WW8DocumentImpl::Assign(const WW8DocumentImpl & rSrc)
522 : {
523 0 : mCpAndFcs = rSrc.mCpAndFcs;
524 :
525 0 : mpCHPFKPCache = rSrc.mpCHPFKPCache;
526 0 : mpPAPFKPCache = rSrc.mpPAPFKPCache;
527 :
528 0 : mpStream = rSrc.mpStream;
529 0 : mpTableStream = rSrc.mpTableStream;
530 0 : mpDataStream = rSrc.mpDataStream;
531 0 : mpDocStream = rSrc.mpDocStream;
532 0 : mpCompObjStream = rSrc.mpCompObjStream;
533 :
534 0 : mpPieceTable = rSrc.mpPieceTable;
535 :
536 0 : mpBinTableCHPX = rSrc.mpBinTableCHPX;
537 0 : mpBinTablePAPX = rSrc.mpBinTablePAPX;
538 :
539 0 : mpSEDs = rSrc.mpSEDs;
540 :
541 0 : mpFib = rSrc.mpFib;
542 :
543 0 : mpHeaderOffsets = rSrc.mpHeaderOffsets;
544 0 : mpFootnoteHelper = rSrc.mpFootnoteHelper;
545 0 : mpEndnoteHelper = rSrc.mpEndnoteHelper;
546 0 : mpAnnotationHelper = rSrc.mpAnnotationHelper;
547 0 : mpShapeHelper = rSrc.mpShapeHelper;
548 0 : mpBreakHelper = rSrc.mpBreakHelper;
549 :
550 0 : mpBookmarkHelper = rSrc.mpBookmarkHelper;
551 :
552 0 : mpDffBlock = rSrc.mpDffBlock;
553 0 : mpTextBoxStories = rSrc.mpTextBoxStories;
554 :
555 0 : mDocumentEndCpAndFc = rSrc.mDocumentEndCpAndFc;
556 0 : mFootnoteEndCpAndFc = rSrc.mFootnoteEndCpAndFc;
557 :
558 0 : return *this;
559 : }
560 :
561 0 : string WW8DocumentImpl::getType() const
562 : {
563 0 : return "WW8DocumentImpl";
564 : }
565 :
566 0 : void WW8DocumentImpl::parseBinTableCpAndFcs(WW8BinTable & rTable,
567 : PropertyType eType_)
568 : {
569 0 : for (sal_uInt32 i = 0; i < rTable.getEntryCount(); i++)
570 : {
571 0 : Fc aFcFromTable(rTable.getFc(i));
572 :
573 0 : if (aFcFromTable < mpPieceTable->getFirstFc())
574 0 : aFcFromTable = mpPieceTable->getFirstFc();
575 :
576 0 : bool bComplex = mpPieceTable->isComplex(aFcFromTable);
577 0 : aFcFromTable.setComplex(bComplex);
578 :
579 : try
580 : {
581 0 : Cp aCpFromTable(mpPieceTable->fc2cp(aFcFromTable));
582 0 : CpAndFc aCpAndFcFromTable(aCpFromTable, aFcFromTable, eType_);
583 :
584 0 : mCpAndFcs.insert(aCpAndFcFromTable);
585 :
586 0 : WW8FKP::Pointer_t pFKP;
587 :
588 0 : switch (eType_)
589 : {
590 : case PROP_CHP:
591 0 : pFKP = getFKPCHPX(rTable.getPageNumber(i),
592 0 : aCpAndFcFromTable.isComplex());
593 :
594 0 : break;
595 :
596 : case PROP_PAP:
597 0 : pFKP = getFKPPAPX(rTable.getPageNumber(i),
598 0 : aCpAndFcFromTable.isComplex());
599 :
600 0 : break;
601 : default:
602 0 : break;
603 : }
604 :
605 0 : for (sal_uInt32 n = 0; n < pFKP->getEntryCount(); n++)
606 : {
607 0 : Fc aFc = pFKP->getFc(n);
608 :
609 0 : if (aFc < mpPieceTable->getFirstFc())
610 0 : aFc = mpPieceTable->getFirstFc();
611 :
612 0 : bool bComplexFKP = mpPieceTable->isComplex(aFc);
613 0 : aFc.setComplex(bComplexFKP);
614 :
615 : try
616 : {
617 0 : Cp aCp = mpPieceTable->fc2cp(aFc);
618 :
619 0 : CpAndFc aCpAndFc(aCp, aFc, eType_);
620 :
621 0 : mCpAndFcs.insert(aCpAndFc);
622 : }
623 0 : catch (const ExceptionNotFound &e)
624 : {
625 0 : clog << e.getText() << endl;
626 : }
627 0 : }
628 : }
629 0 : catch (const ExceptionNotFound &e)
630 : {
631 0 : clog << e.getText() << endl;
632 : }
633 : }
634 0 : }
635 :
636 0 : WW8Stream::Pointer_t WW8DocumentImpl::getSubStream
637 : (const OUString & sId) const
638 : {
639 0 : return mpStream->getSubStream(sId);
640 : }
641 :
642 0 : WW8Document::Pointer_t WW8DocumentImpl::getSubDocument(SubDocumentId /*nId*/)
643 : {
644 0 : return WW8Document::Pointer_t(new WW8DocumentImpl(*this));
645 : }
646 :
647 : WW8DocumentIterator::Pointer_t
648 0 : WW8DocumentImpl::getIterator(const CpAndFc & rCpAndFc)
649 : {
650 : return WW8DocumentIterator::Pointer_t
651 0 : (new WW8DocumentIteratorImpl(this, rCpAndFc));
652 : }
653 :
654 0 : WW8DocumentIterator::Pointer_t WW8DocumentImpl::begin()
655 : {
656 0 : return getIterator(getFirstCp());
657 : }
658 :
659 0 : WW8DocumentIterator::Pointer_t WW8DocumentImpl::end()
660 : {
661 0 : return getIterator(getLastCp());
662 : }
663 :
664 0 : WW8Stream::Pointer_t WW8DocumentImpl::getDocStream() const
665 : {
666 0 : return mpDocStream;
667 : }
668 :
669 0 : WW8Stream::Pointer_t WW8DocumentImpl::getDataStream() const
670 : {
671 0 : return mpDataStream;
672 : }
673 :
674 0 : sal_uInt32 WW8DocumentImpl::getByteLength(const CpAndFc & rCpAndFc) const
675 : {
676 0 : CpAndFc aEnd = getNextCp(rCpAndFc);
677 :
678 0 : sal_uInt32 nResult = 3;
679 :
680 0 : if (rCpAndFc < aEnd)
681 0 : nResult = (aEnd - rCpAndFc) *
682 0 : (mpPieceTable->isComplex(rCpAndFc.getCp()) ? 1 : 2);
683 :
684 0 : return nResult;
685 : }
686 :
687 : WW8Stream::Sequence
688 0 : WW8DocumentImpl::getText(const CpAndFc & rStart)
689 : {
690 0 : return mpDocStream->get(rStart.getFc().get(), getByteLength(rStart));
691 : }
692 :
693 0 : const CpAndFc & WW8DocumentImpl::getFirstCp() const
694 : {
695 0 : return mCpAndFcStart;
696 : }
697 :
698 0 : const CpAndFc & WW8DocumentImpl::getLastCp() const
699 : {
700 0 : return mCpAndFcEnd;
701 : }
702 :
703 0 : CpAndFc WW8DocumentImpl::getDocumentEndCp() const
704 : {
705 0 : return mDocumentEndCpAndFc;
706 : }
707 :
708 0 : CpAndFc WW8DocumentImpl::getFootnodeEndCp() const
709 : {
710 0 : return mFootnoteEndCpAndFc;
711 : }
712 :
713 0 : CpAndFc WW8DocumentImpl::getHeaderEndCp() const
714 : {
715 0 : return mHeaderEndCpAndFc;
716 : }
717 :
718 0 : CpAndFc WW8DocumentImpl::getAnnotationEndCp() const
719 : {
720 0 : return mAnnotationEndCpAndFc;
721 : }
722 :
723 0 : CpAndFc WW8DocumentImpl::getEndnoteEndCp() const
724 : {
725 0 : return mEndnoteEndCpAndFc;
726 : }
727 :
728 0 : CpAndFc WW8DocumentImpl::getNextCp(const CpAndFc & rCpAndFc) const
729 : {
730 0 : CpAndFc aResult = mCpAndFcEnd;
731 0 : CpAndFcs::const_iterator aIt = mCpAndFcs.find(rCpAndFc);
732 :
733 0 : if (aIt != mCpAndFcs.end())
734 : {
735 0 : ++aIt;
736 :
737 0 : if (aIt != mCpAndFcs.end())
738 0 : aResult = *aIt;
739 : }
740 : else
741 0 : throw ExceptionNotFound("getNextCp: " + rCpAndFc.toString());
742 :
743 0 : return aResult;
744 : }
745 :
746 0 : CpAndFc WW8DocumentImpl::getPrevCp(const CpAndFc & rCpAndFc) const
747 : {
748 0 : CpAndFc aResult = mCpAndFcStart;
749 :
750 0 : CpAndFcs::const_iterator aIt = mCpAndFcs.find(CpAndFc(rCpAndFc));
751 :
752 0 : if (aIt != mCpAndFcs.end() && aIt != mCpAndFcs.begin())
753 : {
754 0 : --aIt;
755 :
756 0 : aResult = *aIt;
757 : }
758 : else
759 0 : throw ExceptionNotFound("getPrevCp: " + rCpAndFc.toString());
760 :
761 0 : return aResult;
762 : }
763 :
764 0 : WW8FKP::Pointer_t WW8DocumentImpl::getFKP(const CpAndFc & rCpAndFc)
765 : {
766 0 : WW8FKP::Pointer_t pResult;
767 :
768 0 : sal_uInt32 nPageNumber = 0;
769 :
770 0 : switch (rCpAndFc.getType())
771 : {
772 : case PROP_PAP:
773 : {
774 : nPageNumber =
775 0 : mpBinTablePAPX->getPageNumber(rCpAndFc.getFc());
776 :
777 0 : pResult = getFKPPAPX(nPageNumber, rCpAndFc.isComplex());
778 : }
779 0 : break;
780 : case PROP_CHP:
781 : {
782 : nPageNumber =
783 0 : mpBinTableCHPX->getPageNumber(rCpAndFc.getFc());
784 :
785 0 : pResult = getFKPCHPX(nPageNumber, rCpAndFc.isComplex());
786 : }
787 0 : break;
788 : default:
789 0 : break;
790 : }
791 :
792 0 : if (pResult.get() != NULL)
793 0 : pResult->setDocument(this);
794 :
795 0 : return pResult;
796 : }
797 :
798 0 : WW8FKP::Pointer_t WW8DocumentImpl::getFKPCHPX(sal_uInt32 nIndex,
799 : bool bComplex)
800 : {
801 0 : return mpCHPFKPCache->get(nIndex, bComplex);
802 : }
803 :
804 0 : WW8FKP::Pointer_t WW8DocumentImpl::getFKPPAPX(sal_uInt32 nIndex,
805 : bool bComplex)
806 : {
807 0 : return mpPAPFKPCache->get(nIndex, bComplex);
808 : }
809 :
810 0 : writerfilter::Reference<Properties>::Pointer_t WW8DocumentImpl::getProperties
811 : (const CpAndFc & rCpAndFc)
812 : {
813 0 : writerfilter::Reference<Properties>::Pointer_t pResult;
814 :
815 0 : switch (rCpAndFc.getType())
816 : {
817 : case PROP_CHP:
818 : case PROP_PAP:
819 : {
820 : try
821 : {
822 0 : WW8FKP::Pointer_t pFKP = getFKP(rCpAndFc);
823 :
824 0 : pResult = pFKP->getProperties(rCpAndFc.getFc());
825 : }
826 0 : catch (const ExceptionOutOfBounds &)
827 : {
828 : }
829 : }
830 :
831 0 : break;
832 :
833 : case PROP_SEC:
834 : {
835 : pResult = writerfilter::Reference<Properties>::Pointer_t
836 0 : (getSED(rCpAndFc));
837 : }
838 :
839 0 : break;
840 :
841 : case PROP_FOOTNOTE:
842 : {
843 : pResult = writerfilter::Reference<Properties>::Pointer_t
844 0 : (mpFootnoteHelper->getRef(rCpAndFc));
845 : }
846 0 : break;
847 :
848 : case PROP_ENDNOTE:
849 : {
850 : pResult = writerfilter::Reference<Properties>::Pointer_t
851 0 : (mpEndnoteHelper->getRef(rCpAndFc));
852 : }
853 0 : break;
854 :
855 : case PROP_ANNOTATION:
856 : {
857 : pResult = writerfilter::Reference<Properties>::Pointer_t
858 0 : (mpAnnotationHelper->getRef(rCpAndFc));
859 : }
860 0 : break;
861 :
862 : case PROP_BOOKMARKSTART:
863 : case PROP_BOOKMARKEND:
864 : {
865 0 : pResult = getBookmark(rCpAndFc);
866 : }
867 :
868 0 : break;
869 : case PROP_FLD:
870 : {
871 0 : pResult = getField(rCpAndFc);
872 :
873 0 : mpFLD = mpFieldHelper->getWW8FLD(rCpAndFc);
874 : }
875 :
876 0 : break;
877 : case PROP_SHP:
878 : {
879 0 : pResult = getShape(rCpAndFc);
880 : }
881 0 : break;
882 : case PROP_BRK:
883 : {
884 0 : pResult = getBreak(rCpAndFc);
885 : }
886 0 : break;
887 : default:
888 0 : break;
889 : }
890 :
891 0 : return pResult;
892 : }
893 :
894 : writerfilter::Reference<Stream>::Pointer_t
895 0 : WW8DocumentImpl::getSubDocument(const CpAndFc & rCpAndFc)
896 : {
897 0 : writerfilter::Reference<Stream>::Pointer_t pResult;
898 :
899 0 : switch (rCpAndFc.getType())
900 : {
901 : case PROP_FOOTNOTE:
902 0 : pResult = getFootnote(rCpAndFc);
903 0 : break;
904 :
905 : case PROP_ENDNOTE:
906 0 : pResult = getEndnote(rCpAndFc);
907 0 : break;
908 :
909 : case PROP_ANNOTATION:
910 0 : pResult = getAnnotation(rCpAndFc);
911 0 : break;
912 :
913 : default:
914 0 : break;
915 : }
916 :
917 0 : return pResult;
918 : }
919 :
920 0 : WW8SED * WW8DocumentImpl::getSED(const CpAndFc & rCpAndFc) const
921 : {
922 0 : WW8SED * pResult = mpSEDs->getEntryByFc(rCpAndFc.getCp().get());
923 :
924 0 : pResult->setDoc(const_cast<const WW8DocumentImpl *>(this));
925 :
926 0 : return pResult;
927 : }
928 :
929 0 : writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getListTplcs() const
930 : {
931 0 : writerfilter::Reference<Table>::Pointer_t pResult;
932 :
933 0 : if (mpFibRgFcLcb2000.get() != NULL &&
934 0 : mpFibRgFcLcb2000->get_fcSttbRgtplc() != 0 &&
935 0 : mpFibRgFcLcb2000->get_lcbSttbRgtplc() != 0)
936 : {
937 : WW8SttbRgtplc * pSttbRgtplc =
938 0 : new WW8SttbRgtplc(*mpTableStream,
939 0 : mpFibRgFcLcb2000->get_fcSttbRgtplc(),
940 0 : mpFibRgFcLcb2000->get_lcbSttbRgtplc());
941 :
942 0 : pResult = writerfilter::Reference<Table>::Pointer_t(pSttbRgtplc);
943 : }
944 :
945 0 : return pResult;
946 : }
947 :
948 0 : writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getListTable() const
949 : {
950 0 : writerfilter::Reference<Table>::Pointer_t pResult;
951 :
952 0 : if (mpFib->get_fcPlcfLst() != 0 && mpFib->get_lcbPlcfLst() > 0)
953 : {
954 : try
955 : {
956 0 : WW8ListTable * pList = new WW8ListTable(*mpTableStream,
957 0 : mpFib->get_fcPlcfLst(),
958 0 : mpFib->get_fcPlfLfo() -
959 0 : mpFib->get_fcPlcfLst());
960 :
961 0 : pList->setPayloadOffset(mpFib->get_lcbPlcfLst());
962 0 : pList->initPayload();
963 :
964 0 : pResult = writerfilter::Reference<Table>::Pointer_t(pList);
965 : }
966 0 : catch (const ExceptionOutOfBounds &) {
967 : }
968 : }
969 :
970 0 : return pResult;
971 : }
972 :
973 0 : writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getLFOTable() const
974 : {
975 0 : writerfilter::Reference<Table>::Pointer_t pResult;
976 :
977 0 : if (mpFib->get_fcPlfLfo() != 0 && mpFib->get_lcbPlfLfo() > 0)
978 : {
979 : try
980 : {
981 0 : WW8LFOTable * pLFOs = new WW8LFOTable(*mpTableStream,
982 0 : mpFib->get_fcPlfLfo(),
983 0 : mpFib->get_lcbPlfLfo());
984 :
985 0 : pLFOs->setPayloadOffset(mpFib->get_lcbPlcfLst());
986 0 : pLFOs->initPayload();
987 :
988 0 : pResult = writerfilter::Reference<Table>::Pointer_t(pLFOs);
989 : }
990 0 : catch (const Exception &e)
991 : {
992 0 : clog << e.getText() << endl;
993 : }
994 : }
995 :
996 0 : return pResult;
997 : }
998 :
999 0 : writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getFontTable() const
1000 : {
1001 0 : writerfilter::Reference<Table>::Pointer_t pResult;
1002 :
1003 0 : if (mpFib->get_fcSttbfffn() != 0 && mpFib->get_lcbSttbfffn() > 0)
1004 : {
1005 0 : WW8FontTable * pFonts = new WW8FontTable(*mpTableStream,
1006 0 : mpFib->get_fcSttbfffn(),
1007 0 : mpFib->get_lcbSttbfffn());
1008 :
1009 0 : pFonts->initPayload();
1010 :
1011 0 : pResult = writerfilter::Reference<Table>::Pointer_t(pFonts);
1012 : }
1013 :
1014 0 : return pResult;
1015 : }
1016 :
1017 0 : writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getStyleSheet() const
1018 : {
1019 0 : writerfilter::Reference<Table>::Pointer_t pResult;
1020 :
1021 0 : if (mpFib->get_lcbStshf() > 0)
1022 : {
1023 0 : WW8StyleSheet * pStyles = new WW8StyleSheet(*mpTableStream,
1024 0 : mpFib->get_fcStshf(),
1025 0 : mpFib->get_lcbStshf());
1026 :
1027 0 : pStyles->initPayload();
1028 :
1029 0 : pResult = writerfilter::Reference<Table>::Pointer_t(pStyles);
1030 : }
1031 :
1032 0 : return pResult;
1033 : }
1034 :
1035 0 : writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getAssocTable() const
1036 : {
1037 0 : writerfilter::Reference<Table>::Pointer_t pResult;
1038 :
1039 0 : if (mpFib->get_lcbSttbfAssoc() > 0)
1040 : {
1041 : WW8Sttbf::Pointer_t pSttbfAssoc
1042 0 : (new WW8Sttbf(*mpTableStream,
1043 0 : mpFib->get_fcSttbfAssoc(),
1044 0 : mpFib->get_lcbSttbfAssoc()));
1045 :
1046 : pResult = writerfilter::Reference<Table>::Pointer_t
1047 0 : (new WW8SttbTableResource(pSttbfAssoc));
1048 : }
1049 :
1050 0 : return pResult;
1051 : }
1052 :
1053 0 : sal_uInt32 WW8DocumentImpl::getHeaderCount() const
1054 : {
1055 0 : sal_uInt32 nResult = 0;
1056 0 : sal_uInt32 nLcbPlcfhdd = mpFib->get_lcbPlcfhdd();
1057 :
1058 0 : if (nLcbPlcfhdd > 4)
1059 0 : nResult = (nLcbPlcfhdd / 4) - 1;
1060 :
1061 0 : return nResult;
1062 : }
1063 :
1064 0 : CpAndFc WW8DocumentImpl::getHeaderCpAndFc(sal_uInt32 nPos)
1065 : {
1066 0 : sal_uInt32 nCount = getHeaderCount();
1067 :
1068 : // There are getHeaderCount() + 1 entries in mpHeaderOffsets => greater
1069 0 : if (nPos > nCount)
1070 0 : throw ExceptionNotFound("getHeaderCpAndFc");
1071 :
1072 0 : if (nPos == nCount)
1073 0 : return mHeaderEndCpAndFc;
1074 : else
1075 : {
1076 0 : Cp aCp(getFootnodeEndCp().getCp() + mpHeaderOffsets->getU32(nPos * 4));
1077 0 : Fc aFc(mpPieceTable->cp2fc(aCp));
1078 0 : CpAndFc aCpAndFc(aCp, aFc, PROP_DOC);
1079 :
1080 0 : return aCpAndFc;
1081 : }
1082 :
1083 : }
1084 :
1085 0 : writerfilter::Reference<Stream>::Pointer_t WW8DocumentImpl::getHeader(sal_uInt32 nPos)
1086 : {
1087 : // There are getHeaderCount() headers => greater or equal
1088 0 : if (nPos >= getHeaderCount())
1089 0 : throw ExceptionNotFound("getHeader");
1090 :
1091 0 : writerfilter::Reference<Stream>::Pointer_t pResult;
1092 :
1093 0 : CpAndFc aCpAndFcStart(getHeaderCpAndFc(nPos));
1094 0 : CpAndFc aCpAndFcEnd(getHeaderCpAndFc(nPos + 1));
1095 :
1096 0 : if (aCpAndFcStart < aCpAndFcEnd)
1097 : pResult = writerfilter::Reference<Stream>::Pointer_t
1098 0 : (new WW8DocumentImpl(*this, aCpAndFcStart, aCpAndFcEnd));
1099 :
1100 0 : return pResult;
1101 : }
1102 :
1103 : writerfilter::Reference<Stream>::Pointer_t
1104 0 : WW8DocumentImpl::getFootnote(const CpAndFc & rCpAndFc)
1105 : {
1106 0 : writerfilter::Reference<Stream>::Pointer_t pResult;
1107 :
1108 0 : if (! bSubDocument)
1109 0 : pResult = mpFootnoteHelper->get(rCpAndFc);
1110 :
1111 0 : return pResult;
1112 : }
1113 :
1114 : writerfilter::Reference<Stream>::Pointer_t
1115 0 : WW8DocumentImpl::getEndnote(const CpAndFc & rCpAndFc)
1116 : {
1117 0 : writerfilter::Reference<Stream>::Pointer_t pResult;
1118 :
1119 0 : if (! bSubDocument)
1120 0 : pResult = mpEndnoteHelper->get(rCpAndFc);
1121 :
1122 0 : return pResult;
1123 : }
1124 :
1125 :
1126 : writerfilter::Reference<Stream>::Pointer_t
1127 0 : WW8DocumentImpl::getAnnotation(const CpAndFc & rCpAndFc)
1128 : {
1129 0 : writerfilter::Reference<Stream>::Pointer_t pResult;
1130 :
1131 0 : if (! bSubDocument)
1132 0 : pResult = mpAnnotationHelper->get(rCpAndFc);
1133 :
1134 0 : return pResult;
1135 : }
1136 :
1137 : writerfilter::Reference<Properties>::Pointer_t
1138 0 : WW8DocumentImpl::getBookmark(const CpAndFc & rCpAndFc) const
1139 : {
1140 0 : return mpBookmarkHelper->getBookmark(rCpAndFc);
1141 : }
1142 :
1143 : writerfilter::Reference<Properties>::Pointer_t
1144 0 : WW8DocumentImpl::getShape(const CpAndFc & rCpAndFc) const
1145 : {
1146 0 : return mpShapeHelper->getShape(rCpAndFc);
1147 : }
1148 :
1149 : writerfilter::Reference<Properties>::Pointer_t
1150 0 : WW8DocumentImpl::getShape(sal_uInt32 nSpid)
1151 : {
1152 0 : writerfilter::Reference<Properties>::Pointer_t pResult;
1153 0 : DffRecord::Pointer_t pShape = mpDffBlock->getShape(nSpid);
1154 :
1155 0 : if (pShape.get() != NULL)
1156 : {
1157 0 : DffSpContainer * pTmp = new DffSpContainer(*pShape);
1158 0 : pTmp->setDocument(this);
1159 :
1160 0 : pResult = writerfilter::Reference<Properties>::Pointer_t(pTmp);
1161 : }
1162 :
1163 0 : return pResult;
1164 : }
1165 :
1166 : writerfilter::Reference<Properties>::Pointer_t
1167 0 : WW8DocumentImpl::getBreak(const CpAndFc & rCpAndFc) const
1168 : {
1169 0 : return mpBreakHelper->getBreak(rCpAndFc);
1170 : }
1171 :
1172 : writerfilter::Reference<Properties>::Pointer_t
1173 0 : WW8DocumentImpl::getBlip(sal_uInt32 nBid)
1174 : {
1175 0 : writerfilter::Reference<Properties>::Pointer_t pResult;
1176 :
1177 0 : if (mpDffBlock != NULL)
1178 : {
1179 0 : DffRecord::Pointer_t pDffRecord(mpDffBlock->getBlip(nBid));
1180 :
1181 0 : if (pDffRecord.get() != NULL)
1182 : {
1183 0 : DffBSE * pBlip = new DffBSE(*pDffRecord);
1184 :
1185 0 : if (pBlip != NULL)
1186 0 : pResult = writerfilter::Reference<Properties>::Pointer_t(pBlip);
1187 0 : }
1188 : }
1189 :
1190 0 : return pResult;
1191 : }
1192 :
1193 : writerfilter::Reference<Properties>::Pointer_t
1194 0 : WW8DocumentImpl::getField(const CpAndFc & rCpAndFc) const
1195 : {
1196 0 : return mpFieldHelper->getField(rCpAndFc);
1197 : }
1198 :
1199 : writerfilter::Reference<Properties>::Pointer_t
1200 0 : WW8DocumentImpl::getDocumentProperties() const
1201 : {
1202 0 : writerfilter::Reference<Properties>::Pointer_t pResult;
1203 :
1204 0 : if (mpFib->get_lcbDop() > 0)
1205 : {
1206 0 : pResult.reset(new WW8DopBase(*mpTableStream, mpFib->get_fcDop(), mpFib->get_lcbDop()));
1207 : }
1208 :
1209 0 : return pResult;
1210 : }
1211 :
1212 0 : WW8FLD::Pointer_t WW8DocumentImpl::getCurrentFLD() const
1213 : {
1214 0 : return mpFLD;
1215 : }
1216 :
1217 0 : void WW8DocumentImpl::setPicLocation(sal_uInt32 fcPicLoc)
1218 : {
1219 0 : mfcPicLoc = fcPicLoc;
1220 0 : }
1221 :
1222 0 : bool WW8DocumentImpl::isPicData()
1223 : {
1224 0 : return mbPicIsData;
1225 : }
1226 :
1227 0 : void WW8DocumentImpl::setPicIsData(bool bPicIsData)
1228 : {
1229 0 : mbPicIsData = bPicIsData;
1230 0 : }
1231 :
1232 : writerfilter::Reference<Stream>::Pointer_t
1233 0 : WW8DocumentImpl::getTextboxText(sal_uInt32 nShpId) const
1234 : {
1235 0 : writerfilter::Reference<Stream>::Pointer_t pResult;
1236 :
1237 0 : if (mpTextBoxStories.get() != NULL)
1238 : {
1239 0 : sal_uInt32 nCount = mpTextBoxStories->getEntryCount();
1240 :
1241 0 : sal_uInt32 n = 0;
1242 0 : while (n < nCount)
1243 : {
1244 0 : WW8FTXBXS * pTextboxStory = mpTextBoxStories->getEntryPointer(n);
1245 :
1246 0 : if (pTextboxStory->get_lid() == nShpId)
1247 0 : break;
1248 :
1249 0 : ++n;
1250 : }
1251 :
1252 0 : if (n < nCount)
1253 : {
1254 0 : Cp aCpStart(mpTextBoxStories->getFc(n));
1255 0 : aCpStart += getEndnoteEndCp().getCp().get();
1256 : CpAndFc aCpAndFcStart =
1257 0 : mpPieceTable->createCpAndFc(aCpStart, PROP_DOC);
1258 0 : Cp aCpEnd(mpTextBoxStories->getFc(n + 1));
1259 0 : aCpEnd += getEndnoteEndCp().getCp().get();
1260 0 : CpAndFc aCpAndFcEnd = mpPieceTable->createCpAndFc(aCpEnd, PROP_DOC);
1261 :
1262 : pResult = writerfilter::Reference<Stream>::Pointer_t
1263 0 : (new WW8DocumentImpl(*this, aCpAndFcStart, aCpAndFcEnd));
1264 : }
1265 : }
1266 :
1267 0 : return pResult;
1268 : }
1269 :
1270 0 : Id lcl_headerQName(sal_uInt32 nIndex)
1271 : {
1272 0 : Id qName = NS_rtf::LN_header;
1273 :
1274 0 : if (nIndex > 5)
1275 : {
1276 0 : switch ((nIndex - 6) % 6)
1277 : {
1278 : case 0:
1279 0 : qName = NS_rtf::LN_headerl;
1280 :
1281 0 : break;
1282 : case 1:
1283 0 : qName = NS_rtf::LN_headerr;
1284 :
1285 0 : break;
1286 : case 2:
1287 0 : qName = NS_rtf::LN_footerl;
1288 :
1289 0 : break;
1290 : case 3:
1291 0 : qName = NS_rtf::LN_footerr;
1292 :
1293 0 : break;
1294 : case 4:
1295 0 : qName = NS_rtf::LN_headerf;
1296 :
1297 0 : break;
1298 : case 5:
1299 0 : qName = NS_rtf::LN_footerf;
1300 :
1301 0 : break;
1302 : }
1303 : }
1304 :
1305 0 : return qName;
1306 : }
1307 :
1308 0 : Fc WW8DocumentImpl::cp2fc(const Cp & cp) const
1309 : {
1310 0 : return mpPieceTable->cp2fc(cp);
1311 : }
1312 :
1313 0 : CpAndFc WW8DocumentImpl::getCpAndFc(const Cp & cp, PropertyType type) const
1314 : {
1315 0 : Fc aFc = cp2fc(cp);
1316 :
1317 0 : return CpAndFc(cp, aFc, type);
1318 : }
1319 :
1320 0 : void WW8DocumentImpl::resolvePicture(Stream & rStream)
1321 : {
1322 0 : WW8Stream::Pointer_t pStream = getDataStream();
1323 :
1324 0 : if (pStream.get() != NULL)
1325 : {
1326 0 : WW8StructBase aStruct(*pStream, mfcPicLoc, 4);
1327 0 : sal_uInt32 nCount = aStruct.getU32(0);
1328 :
1329 : {
1330 0 : WW8PICF * pPicf = new WW8PICF(*pStream, mfcPicLoc, nCount);
1331 0 : pPicf->setDocument(this);
1332 :
1333 0 : writerfilter::Reference<Properties>::Pointer_t pProps(pPicf);
1334 :
1335 0 : rStream.props(pProps);
1336 0 : }
1337 0 : }
1338 0 : }
1339 :
1340 0 : void WW8DocumentImpl::resolveSpecialChar(sal_uInt32 nChar, Stream & rStream)
1341 : {
1342 0 : switch (nChar)
1343 : {
1344 : case 0x1:
1345 0 : resolvePicture(rStream);
1346 0 : break;
1347 : default:
1348 0 : break;
1349 : }
1350 0 : }
1351 :
1352 0 : void WW8DocumentImpl::text(Stream & rStream, const sal_uInt8 * data, size_t len)
1353 : {
1354 : #ifdef DEBUG_ELEMENT
1355 : OUString sText( (const sal_Char*) data, len, RTL_TEXTENCODING_MS_1252 );
1356 : debug_logger->startElement("text");
1357 : debug_logger->chars(OUStringToOString(sText, RTL_TEXTENCODING_ASCII_US).getStr());
1358 : debug_logger->endElement();
1359 : #endif
1360 0 : rStream.text(data, len);
1361 0 : }
1362 :
1363 0 : void WW8DocumentImpl::utext(Stream & rStream, const sal_uInt8 * data, size_t len)
1364 : {
1365 : #ifdef DEBUG_ELEMENT
1366 : debug_logger->startElement("utext");
1367 :
1368 : OUString sText;
1369 : OUStringBuffer aBuffer = ::rtl:: OUStringBuffer(len);
1370 : aBuffer.append( (const sal_Unicode *) data, len);
1371 : sText = aBuffer.makeStringAndClear();
1372 :
1373 : debug_logger->chars(OUStringToOString(sText, RTL_TEXTENCODING_ASCII_US).getStr());
1374 : debug_logger->endElement();
1375 : #endif
1376 0 : rStream.utext(data, len);
1377 0 : }
1378 :
1379 :
1380 0 : void WW8DocumentImpl::resolveText(WW8DocumentIterator::Pointer_t pIt,
1381 : Stream & rStream)
1382 : {
1383 0 : WW8Stream::Sequence aSeq = pIt->getText();
1384 :
1385 0 : sal_uInt32 nCount = aSeq.getCount();
1386 0 : bool bComplex = pIt->isComplex();
1387 :
1388 : /*
1389 : Assumption: Special characters are always at the beginning or end of a
1390 : run.
1391 : */
1392 0 : if (nCount > 0)
1393 : {
1394 0 : if (nCount == 1)
1395 0 : bComplex = true;
1396 :
1397 0 : if (bComplex)
1398 : {
1399 0 : sal_uInt32 nStartIndex = 0;
1400 0 : sal_uInt32 nEndIndex = nCount - 1;
1401 :
1402 0 : sal_uInt32 nCharFirst = aSeq[0];
1403 0 : sal_uInt32 nCharLast = aSeq[nEndIndex];
1404 :
1405 0 : if (isSpecial(nCharFirst))
1406 : {
1407 0 : nStartIndex += 1;
1408 0 : resolveSpecialChar(nCharFirst, rStream);
1409 0 : text(rStream, &aSeq[0], 1);
1410 : }
1411 :
1412 0 : if (!isSpecial(nCharLast))
1413 0 : nEndIndex += 1;
1414 :
1415 0 : if (nStartIndex < nEndIndex)
1416 : {
1417 0 : sal_uInt32 nChars = nEndIndex - nStartIndex;
1418 0 : text(rStream, &aSeq[nStartIndex], nChars);
1419 :
1420 0 : if (isSpecial(nCharLast))
1421 : {
1422 0 : resolveSpecialChar(nCharLast, rStream);
1423 0 : text(rStream, &aSeq[nEndIndex], 1);
1424 : }
1425 : }
1426 : }
1427 : else
1428 : {
1429 0 : sal_uInt32 nStartIndex = 0;
1430 0 : sal_uInt32 nEndIndex = nCount - 2;
1431 :
1432 0 : sal_uInt32 nCharFirst = aSeq[0] + (aSeq[1] << 8);
1433 0 : sal_uInt32 nCharLast = aSeq[nEndIndex] + (aSeq[nEndIndex + 1]);
1434 :
1435 0 : if (isSpecial(nCharFirst))
1436 : {
1437 0 : nStartIndex += 2;
1438 0 : resolveSpecialChar(nCharFirst, rStream);
1439 0 : utext(rStream, &aSeq[0], 1);
1440 : }
1441 :
1442 0 : if (!isSpecial(nCharLast))
1443 0 : nEndIndex += 2;
1444 :
1445 0 : if (nStartIndex < nEndIndex)
1446 : {
1447 0 : sal_uInt32 nChars = (nEndIndex - nStartIndex) / 2;
1448 0 : utext(rStream, &aSeq[nStartIndex], nChars);
1449 :
1450 0 : if (isSpecial(nCharLast))
1451 : {
1452 0 : resolveSpecialChar(nCharLast, rStream);
1453 0 : utext(rStream, &aSeq[nEndIndex], 1);
1454 : }
1455 : }
1456 : }
1457 0 : }
1458 0 : }
1459 :
1460 0 : void WW8DocumentImpl::startCharacterGroup(Stream & rStream)
1461 : {
1462 0 : if (mbInCharacterGroup)
1463 0 : endCharacterGroup(rStream);
1464 :
1465 : #ifdef DEBUG_ELEMENT
1466 : debug_logger->startElement("charactergroup");
1467 : #endif
1468 :
1469 0 : rStream.startCharacterGroup();
1470 0 : mbInCharacterGroup = true;
1471 0 : }
1472 :
1473 0 : void WW8DocumentImpl::endCharacterGroup(Stream & rStream)
1474 : {
1475 : #ifdef DEBUG_ELEMENT
1476 : debug_logger->endElement();
1477 : #endif
1478 :
1479 0 : rStream.endCharacterGroup();
1480 0 : mbInCharacterGroup = false;
1481 0 : }
1482 :
1483 0 : void WW8DocumentImpl::startParagraphGroup(Stream & rStream)
1484 : {
1485 0 : if (mbInParagraphGroup)
1486 0 : endParagraphGroup(rStream);
1487 :
1488 : #ifdef DEBUG_ELEMENT
1489 : debug_logger->startElement("paragraphgroup");
1490 : #endif
1491 :
1492 0 : rStream.startParagraphGroup();
1493 0 : mbInParagraphGroup = true;
1494 0 : }
1495 :
1496 0 : void WW8DocumentImpl::endParagraphGroup(Stream & rStream)
1497 : {
1498 0 : if (mbInCharacterGroup)
1499 0 : endCharacterGroup(rStream);
1500 :
1501 : #ifdef DEBUG_ELEMENT
1502 : debug_logger->endElement();
1503 : #endif
1504 0 : rStream.endParagraphGroup();
1505 0 : mbInParagraphGroup = false;
1506 0 : }
1507 :
1508 0 : void WW8DocumentImpl::startSectionGroup(Stream & rStream)
1509 : {
1510 0 : if (mbInSection)
1511 0 : endSectionGroup(rStream);
1512 :
1513 : #ifdef DEBUG_ELEMENT
1514 : debug_logger->startElement("sectiongroup");
1515 : #endif
1516 :
1517 0 : rStream.startSectionGroup();
1518 0 : mbInSection = true;
1519 0 : }
1520 :
1521 0 : void WW8DocumentImpl::endSectionGroup(Stream & rStream)
1522 : {
1523 0 : if (mbInParagraphGroup)
1524 0 : endParagraphGroup(rStream);
1525 :
1526 : #ifdef DEBUG_ELEMENT
1527 : debug_logger->endElement();
1528 : #endif
1529 0 : rStream.endSectionGroup();
1530 0 : mbInSection = false;
1531 0 : }
1532 :
1533 0 : void WW8DocumentImpl::resolve(Stream & rStream)
1534 : {
1535 0 : if (! bSubDocument)
1536 : {
1537 0 : output.addItem("<substream-names>");
1538 0 : output.addItem(mpStream->getSubStreamNames());
1539 0 : output.addItem("</substream-names>");
1540 :
1541 0 : if (mpDocStream.get() != NULL)
1542 : {
1543 0 : mpDocStream->dump(output);
1544 : }
1545 :
1546 0 : if (mpSummaryInformationStream.get() != NULL)
1547 : {
1548 0 : mpSummaryInformationStream->dump(output);
1549 : }
1550 :
1551 : writerfilter::Reference<Properties>::Pointer_t pFib
1552 0 : (new WW8Fib(*mpFib));
1553 0 : rStream.props(pFib);
1554 :
1555 0 : if (mpFibRgFcLcb2000.get() != NULL)
1556 : {
1557 : writerfilter::Reference<Properties>::Pointer_t pFibRgFcLcb2000
1558 0 : (new WW8FibRgFcLcb2000(*mpFibRgFcLcb2000));
1559 0 : rStream.props(pFibRgFcLcb2000);
1560 : }
1561 :
1562 0 : if (mpFib->get_lcbPlcftxbxBkd() > 0)
1563 : {
1564 0 : PLCF<WW8BKD> aPLCF(*mpTableStream,
1565 0 : mpFib->get_fcPlcftxbxBkd(),
1566 0 : mpFib->get_lcbPlcftxbxBkd());
1567 : }
1568 :
1569 0 : if (mpDffBlock.get() != NULL)
1570 : {
1571 0 : DffBlock * pTmp = new DffBlock(*mpDffBlock);
1572 : writerfilter::Reference<Properties>::Pointer_t pDffBlock =
1573 0 : writerfilter::Reference<Properties>::Pointer_t(pTmp);
1574 :
1575 0 : rStream.props(pDffBlock);
1576 : }
1577 :
1578 : {
1579 0 : rStream.info("headers");
1580 0 : sal_uInt32 nHeaderCount = getHeaderCount();
1581 0 : for (sal_uInt32 n = 0; n < nHeaderCount; ++n)
1582 : {
1583 0 : rStream.info(getHeaderCpAndFc(n).toString());
1584 : }
1585 0 : rStream.info("/headers");
1586 : }
1587 :
1588 0 : writerfilter::Reference<Table>::Pointer_t pSttbRgtplc = getListTplcs();
1589 :
1590 0 : if (pSttbRgtplc.get() != NULL)
1591 0 : rStream.table(NS_rtf::LN_SttbRgtplc, pSttbRgtplc);
1592 :
1593 0 : writerfilter::Reference<Table>::Pointer_t pFontTable = getFontTable();
1594 :
1595 0 : if (pFontTable.get() != NULL)
1596 0 : rStream.table(NS_rtf::LN_FONTTABLE, pFontTable);
1597 :
1598 : try
1599 : {
1600 0 : writerfilter::Reference<Table>::Pointer_t pStyleSheet = getStyleSheet();
1601 :
1602 0 : if (pStyleSheet.get() != NULL)
1603 0 : rStream.table(NS_rtf::LN_STYLESHEET, pStyleSheet);
1604 : }
1605 0 : catch (const Exception &e)
1606 : {
1607 0 : clog << e.getText() << endl;
1608 : }
1609 :
1610 0 : writerfilter::Reference<Table>::Pointer_t pAssocTable = getAssocTable();
1611 :
1612 0 : if (pAssocTable.get() != NULL)
1613 0 : rStream.table(NS_rtf::LN_SttbAssoc, pAssocTable);
1614 :
1615 0 : writerfilter::Reference<Table>::Pointer_t pListTable = getListTable();
1616 :
1617 0 : if (pListTable.get() != NULL)
1618 0 : rStream.table(NS_rtf::LN_LISTTABLE, pListTable);
1619 :
1620 0 : writerfilter::Reference<Table>::Pointer_t pLFOTable = getLFOTable();
1621 :
1622 0 : if (pLFOTable.get() != NULL)
1623 0 : rStream.table(NS_rtf::LN_LFOTABLE, pLFOTable);
1624 : }
1625 :
1626 0 : WW8DocumentIterator::Pointer_t pIt = begin();
1627 0 : WW8DocumentIterator::Pointer_t pItEnd = end();
1628 :
1629 0 : mbInParagraphGroup = false;
1630 0 : mbInCharacterGroup = false;
1631 0 : mbInSection = false;
1632 :
1633 0 : sal_uInt32 nSectionIndex = 0;
1634 :
1635 0 : rStream.info(pIt->toString());
1636 0 : rStream.info(pItEnd->toString());
1637 :
1638 0 : while (! pIt->equal(*pItEnd))
1639 : {
1640 : writerfilter::Reference<Properties>::Pointer_t
1641 0 : pProperties(pIt->getProperties());
1642 :
1643 0 : switch (pIt->getPropertyType())
1644 : {
1645 : case PROP_FOOTNOTE:
1646 : {
1647 0 : rStream.info(pIt->toString());
1648 : writerfilter::Reference<Stream>::Pointer_t
1649 0 : pFootnote(pIt->getSubDocument());
1650 :
1651 0 : if (pFootnote.get() != NULL)
1652 : {
1653 : #ifdef DEBUG_ELEMENT
1654 : debug_logger->startElement("substream");
1655 : #endif
1656 0 : rStream.substream(NS_rtf::LN_footnote, pFootnote);
1657 : #ifdef DEBUG_ELEMENT
1658 : debug_logger->endElement();
1659 : #endif
1660 0 : }
1661 : }
1662 0 : break;
1663 : case PROP_ENDNOTE:
1664 : {
1665 0 : rStream.info(pIt->toString());
1666 : writerfilter::Reference<Stream>::Pointer_t
1667 0 : pEndnote(pIt->getSubDocument());
1668 :
1669 0 : if (pEndnote.get() != NULL)
1670 : {
1671 : #ifdef DEBUG_ELEMENT
1672 : debug_logger->startElement("substream");
1673 : #endif
1674 0 : rStream.substream(NS_rtf::LN_endnote, pEndnote);
1675 : #ifdef DEBUG_ELEMENT
1676 : debug_logger->endElement();
1677 : #endif
1678 0 : }
1679 : }
1680 0 : break;
1681 : case PROP_ANNOTATION:
1682 : {
1683 0 : rStream.info(pIt->toString());
1684 : writerfilter::Reference<Stream>::Pointer_t
1685 0 : pAnnotation(pIt->getSubDocument());
1686 :
1687 0 : if (pAnnotation.get() != NULL)
1688 : {
1689 : #ifdef DEBUG_ELEMENT
1690 : debug_logger->startElement("substream");
1691 : #endif
1692 0 : rStream.substream(NS_rtf::LN_annotation, pAnnotation);
1693 : #ifdef DEBUG_ELEMENT
1694 : debug_logger->endElement();
1695 : #endif
1696 0 : }
1697 : }
1698 0 : break;
1699 : case PROP_CHP:
1700 : {
1701 0 : startCharacterGroup(rStream);
1702 : }
1703 :
1704 0 : break;
1705 : case PROP_PAP:
1706 : {
1707 0 : startParagraphGroup(rStream);
1708 0 : rStream.info(pIt->toString());
1709 : }
1710 :
1711 0 : break;
1712 : case PROP_SEC:
1713 : {
1714 0 : startSectionGroup(rStream);
1715 0 : rStream.info(pIt->toString());
1716 :
1717 0 : if (nSectionIndex == 0)
1718 0 : rStream.props(getDocumentProperties());
1719 :
1720 0 : sal_uInt32 nHeaderStartIndex = 6 + nSectionIndex * 6;
1721 0 : sal_uInt32 nHeaderEndIndex = nHeaderStartIndex + 6;
1722 :
1723 0 : if (nHeaderStartIndex >= getHeaderCount())
1724 0 : nHeaderStartIndex = getHeaderCount();
1725 :
1726 0 : if (nHeaderEndIndex >= getHeaderCount())
1727 0 : nHeaderEndIndex = getHeaderCount();
1728 :
1729 0 : for (sal_uInt32 n = nHeaderStartIndex; n < nHeaderEndIndex; ++n)
1730 : {
1731 : writerfilter::Reference<Stream>::Pointer_t
1732 0 : pHeader(getHeader(n));
1733 :
1734 0 : Id qName = lcl_headerQName(n);
1735 :
1736 0 : if (pHeader.get() != NULL)
1737 0 : rStream.substream(qName, pHeader);
1738 0 : }
1739 :
1740 0 : ++nSectionIndex;
1741 : }
1742 :
1743 0 : break;
1744 : default:
1745 0 : rStream.info(pIt->toString());
1746 : }
1747 :
1748 0 : if (pProperties.get() != NULL)
1749 : {
1750 : #ifdef DEBUG_PROPERTIES
1751 : debug_logger->propertySet(pProperties,
1752 : IdToString::Pointer_t(new WW8IdToString()));
1753 : #endif
1754 :
1755 0 : rStream.props(pProperties);
1756 : }
1757 :
1758 0 : if (pIt->getPropertyType() == PROP_PAP)
1759 : {
1760 0 : startCharacterGroup(rStream);
1761 : }
1762 :
1763 0 : resolveText(pIt, rStream);
1764 :
1765 0 : ++(*pIt);
1766 0 : }
1767 :
1768 0 : if (mbInCharacterGroup)
1769 0 : endCharacterGroup(rStream);
1770 :
1771 0 : if (mbInParagraphGroup)
1772 0 : endParagraphGroup(rStream);
1773 :
1774 0 : if (mbInSection)
1775 0 : endSectionGroup(rStream);
1776 :
1777 0 : }
1778 :
1779 : WW8Stream::Pointer_t
1780 0 : WW8DocumentFactory::createStream(uno::Reference<uno::XComponentContext> rContext,
1781 : uno::Reference<io::XInputStream> rStream)
1782 : {
1783 0 : return WW8Stream::Pointer_t(new WW8StreamImpl(rContext, rStream));
1784 : }
1785 :
1786 : WW8Document *
1787 0 : WW8DocumentFactory::createDocument(WW8Stream::Pointer_t rpStream)
1788 : {
1789 0 : return new WW8DocumentImpl(rpStream);
1790 : }
1791 :
1792 : writerfilter::Reference<Properties>::Pointer_t
1793 0 : WW8SED::get_sepx()
1794 : {
1795 0 : writerfilter::Reference<Properties>::Pointer_t pResult;
1796 :
1797 0 : if (get_fcSepx() != 0xffffffff)
1798 : {
1799 0 : WW8StructBase aTmp(*mpDoc->getDocStream(), get_fcSepx(), 2);
1800 : pResult = writerfilter::Reference<Properties>::Pointer_t
1801 : (new WW8PropertySetImpl
1802 0 : (*mpDoc->getDocStream(), get_fcSepx() + 2,
1803 0 : (sal_uInt32) aTmp.getU16(0), false));
1804 : }
1805 :
1806 0 : return pResult;
1807 : }
1808 :
1809 0 : void WW8DocumentImpl::insertCpAndFc(const CpAndFc & rCpAndFc)
1810 : {
1811 0 : mCpAndFcs.insert(rCpAndFc);
1812 0 : }
1813 :
1814 0 : string propertyTypeToString(PropertyType nType)
1815 : {
1816 0 : string result;
1817 :
1818 0 : switch (nType)
1819 : {
1820 : case PROP_SHP:
1821 0 : result = "SHP";
1822 :
1823 0 : break;
1824 : case PROP_FLD:
1825 0 : result = "FLD";
1826 :
1827 0 : break;
1828 : case PROP_BOOKMARKSTART:
1829 0 : result = "BOOKMARKSTART";
1830 :
1831 0 : break;
1832 : case PROP_BOOKMARKEND:
1833 0 : result = "BOOKMARKEND";
1834 :
1835 0 : break;
1836 : case PROP_ENDNOTE:
1837 0 : result = "ENDNOTE";
1838 :
1839 0 : break;
1840 : case PROP_FOOTNOTE:
1841 0 : result = "FOOTNOTE";
1842 :
1843 0 : break;
1844 : case PROP_ANNOTATION:
1845 0 : result = "ANNOTATION";
1846 :
1847 0 : break;
1848 : case PROP_DOC:
1849 0 : result = "DOC";
1850 :
1851 0 : break;
1852 :
1853 : case PROP_SEC:
1854 0 : result = "SEC";
1855 :
1856 0 : break;
1857 :
1858 : case PROP_PAP:
1859 0 : result = "PAP";
1860 :
1861 0 : break;
1862 :
1863 : case PROP_CHP:
1864 0 : result = "CHP";
1865 :
1866 0 : break;
1867 : default:
1868 0 : break;
1869 : }
1870 :
1871 0 : return result;
1872 : }
1873 :
1874 0 : string CpAndFc::toString() const
1875 : {
1876 0 : string result;
1877 :
1878 0 : result += "(";
1879 0 : result += getCp().toString();
1880 0 : result += ", ";
1881 0 : result += getFc().toString();
1882 0 : result += ", ";
1883 :
1884 0 : result += propertyTypeToString(getType());
1885 :
1886 0 : result += ")";
1887 :
1888 0 : return result;
1889 : }
1890 :
1891 :
1892 : // Bookmark
1893 :
1894 0 : Bookmark::Bookmark(writerfilter::Reference<Properties>::Pointer_t pBKF,
1895 : OUString & rName)
1896 0 : : mpBKF(pBKF), mName(rName)
1897 : {
1898 0 : }
1899 :
1900 0 : void Bookmark::resolve(Properties & rHandler)
1901 : {
1902 0 : mpBKF->resolve(rHandler);
1903 :
1904 0 : WW8Value::Pointer_t pValue = createValue(mName);
1905 0 : rHandler.attribute(NS_rtf::LN_BOOKMARKNAME, *pValue);
1906 0 : }
1907 :
1908 0 : string Bookmark::getType() const
1909 : {
1910 0 : return "Bookmark";
1911 : }
1912 :
1913 : // BookmarkHelper
1914 :
1915 0 : CpAndFc BookmarkHelper::getStartCpAndFc(sal_uInt32 nPos)
1916 : {
1917 0 : Cp aCp(mpStartCps->getFc(nPos));
1918 0 : Fc aFc(mpPieceTable->cp2fc(aCp));
1919 0 : CpAndFc aCpAndFc(aCp, aFc, PROP_BOOKMARKSTART);
1920 :
1921 0 : return aCpAndFc;
1922 : }
1923 :
1924 0 : CpAndFc BookmarkHelper::getEndCpAndFc(sal_uInt32 nPos)
1925 : {
1926 0 : Cp aCp(mpEndCps->getU32(nPos * 4));
1927 0 : Fc aFc(mpPieceTable->cp2fc(aCp));
1928 0 : CpAndFc aCpAndFc(aCp, aFc, PROP_BOOKMARKEND);
1929 :
1930 0 : return aCpAndFc;
1931 : }
1932 :
1933 0 : OUString BookmarkHelper::getName(sal_uInt32 nPos)
1934 : {
1935 0 : return mpNames->getEntry(nPos);
1936 : }
1937 :
1938 0 : sal_uInt32 BookmarkHelper::getIndex(const CpAndFc & rCpAndFc)
1939 : {
1940 0 : sal_uInt32 nResult = mpStartCps->getEntryCount();
1941 :
1942 0 : sal_uInt32 nCp = rCpAndFc.getCp().get();
1943 :
1944 : sal_uInt32 n;
1945 0 : switch (rCpAndFc.getType())
1946 : {
1947 : case PROP_BOOKMARKSTART:
1948 : {
1949 0 : sal_uInt32 nStartsCount = mpStartCps->getEntryCount();
1950 :
1951 0 : for (n = 0; n < nStartsCount; ++n)
1952 : {
1953 0 : if (nCp == mpStartCps->getFc(n))
1954 : {
1955 0 : nResult = n;
1956 :
1957 0 : break;
1958 : }
1959 : }
1960 :
1961 0 : if (n == nStartsCount)
1962 0 : throw ExceptionNotFound("BookmarkHelper::getIndex");
1963 : }
1964 :
1965 0 : break;
1966 :
1967 : case PROP_BOOKMARKEND:
1968 : {
1969 0 : sal_uInt32 nEndsCount = mpEndCps->getCount() / 4;
1970 0 : sal_uInt32 nIndex = nEndsCount;
1971 :
1972 0 : for (n = 0; n < nEndsCount; ++n)
1973 : {
1974 0 : if (nCp == mpEndCps->getU16(n * 4))
1975 : {
1976 0 : nIndex = n;
1977 :
1978 0 : break;
1979 : }
1980 : }
1981 :
1982 0 : if (n == nEndsCount)
1983 0 : throw ExceptionNotFound("BookmarkHelper::getIndex");
1984 :
1985 : {
1986 : {
1987 0 : sal_uInt32 nStartsCount = mpStartCps->getEntryCount();
1988 0 : for (n = 0; n < nStartsCount; ++n)
1989 : {
1990 0 : WW8BKF::Pointer_t pBKF(mpStartCps->getEntry(n));
1991 :
1992 0 : if (pBKF->get_ibkl() ==
1993 0 : sal::static_int_cast<sal_Int32>(nIndex))
1994 : {
1995 0 : nResult = n;
1996 :
1997 : break;
1998 : }
1999 0 : }
2000 :
2001 0 : if (n == nStartsCount)
2002 0 : throw ExceptionNotFound("BookmarkHelper::getIndex");
2003 : }
2004 : }
2005 : }
2006 :
2007 0 : break;
2008 : default:
2009 0 : break;
2010 : }
2011 :
2012 0 : return nResult;
2013 : }
2014 :
2015 0 : void BookmarkHelper::init()
2016 : {
2017 : {
2018 0 : sal_uInt32 nStartsCount = mpStartCps->getEntryCount();
2019 :
2020 0 : for (sal_uInt32 n = 0; n < nStartsCount; ++n)
2021 0 : mpDoc->insertCpAndFc(getStartCpAndFc(n));
2022 : }
2023 :
2024 : {
2025 0 : sal_uInt32 nEndsCount = mpEndCps->getCount() / 4;
2026 :
2027 0 : for (sal_uInt32 n = 0; n < nEndsCount; ++n)
2028 0 : mpDoc->insertCpAndFc(getEndCpAndFc(n));
2029 : }
2030 0 : }
2031 :
2032 : writerfilter::Reference<Properties>::Pointer_t
2033 0 : BookmarkHelper::getBKF(const CpAndFc & rCpAndFc)
2034 : {
2035 0 : sal_uInt32 nIndex = getIndex(rCpAndFc);
2036 :
2037 : return writerfilter::Reference<Properties>::Pointer_t
2038 0 : (mpStartCps->getEntryPointer(nIndex));
2039 : }
2040 :
2041 : writerfilter::Reference<Properties>::Pointer_t
2042 0 : BookmarkHelper::getBookmark(const CpAndFc & rCpAndFc)
2043 : {
2044 0 : writerfilter::Reference<Properties>::Pointer_t pResult;
2045 :
2046 : try
2047 : {
2048 0 : OUString aName = getName(rCpAndFc);
2049 :
2050 : pResult = writerfilter::Reference<Properties>::Pointer_t
2051 0 : (new Bookmark(getBKF(rCpAndFc), aName));
2052 : }
2053 0 : catch (const ExceptionNotFound &e)
2054 : {
2055 0 : clog << e.getText() << endl;
2056 : }
2057 :
2058 0 : return pResult;
2059 : }
2060 :
2061 0 : OUString BookmarkHelper::getName(const CpAndFc & rCpAndFc)
2062 : {
2063 0 : OUString sResult;
2064 :
2065 0 : sal_uInt32 nIndex = getIndex(rCpAndFc);
2066 :
2067 0 : sResult = getName(nIndex);
2068 :
2069 0 : return sResult;
2070 : }
2071 :
2072 : template <class T, class Helper>
2073 : struct ProcessPLCF2Map
2074 : {
2075 0 : void process(typename PLCF<T>::Pointer_t pPlcf,
2076 : typename Helper::Map_t & rMap,
2077 : PropertyType type,
2078 : WW8DocumentImpl * pDoc)
2079 : {
2080 0 : if (pPlcf.get() != NULL)
2081 : {
2082 0 : sal_uInt32 nCount = pPlcf->getEntryCount();
2083 :
2084 0 : for (sal_uInt32 n = 0; n < nCount; n++)
2085 : {
2086 0 : Cp aCp(pPlcf->getFc(n));
2087 0 : CpAndFc aCpAndFc(pDoc->getCpAndFc(aCp, type));
2088 0 : typename T::Pointer_t pT = pPlcf->getEntry(n);
2089 :
2090 0 : rMap[aCpAndFc] = pT;
2091 : }
2092 : }
2093 0 : }
2094 : };
2095 :
2096 0 : FieldHelper::FieldHelper(PLCF<WW8FLD>::Pointer_t pPlcffldMom,
2097 : WW8DocumentImpl * pDoc)
2098 0 : : mpDoc(pDoc)
2099 : {
2100 : ProcessPLCF2Map<WW8FLD, FieldHelper> process;
2101 0 : process.process(pPlcffldMom, mMap, PROP_FLD, pDoc);
2102 0 : }
2103 :
2104 0 : void FieldHelper::init()
2105 : {
2106 0 : Map_t::iterator aIt;
2107 :
2108 0 : for (aIt = mMap.begin(); aIt != mMap.end(); ++aIt)
2109 : {
2110 0 : mpDoc->insertCpAndFc(aIt->first);
2111 : }
2112 0 : }
2113 :
2114 0 : WW8FLD::Pointer_t FieldHelper::getWW8FLD(const CpAndFc & rCpAndFc)
2115 : {
2116 0 : WW8FLD::Pointer_t pFld = mMap[rCpAndFc];
2117 :
2118 0 : return pFld;
2119 : }
2120 :
2121 : writerfilter::Reference<Properties>::Pointer_t
2122 0 : FieldHelper::getField(const CpAndFc & rCpAndFc)
2123 : {
2124 0 : WW8FLD::Pointer_t pFLD = getWW8FLD(rCpAndFc);
2125 :
2126 : return writerfilter::Reference<Properties>::Pointer_t
2127 0 : (new WW8FLD(*pFLD));
2128 : }
2129 :
2130 0 : ShapeHelper::ShapeHelper(PLCF<WW8FSPA>::Pointer_t pPlcspaMom,
2131 : PLCF<WW8FSPA>::Pointer_t pPlcspaHdr,
2132 : WW8DocumentImpl * pDoc)
2133 0 : : mpDoc(pDoc)
2134 : {
2135 : ProcessPLCF2Map<WW8FSPA, ShapeHelper> process;
2136 0 : process.process(pPlcspaMom, mMap, PROP_SHP, pDoc);
2137 0 : process.process(pPlcspaHdr, mMap, PROP_SHP, pDoc);
2138 0 : }
2139 :
2140 0 : void ShapeHelper::init()
2141 : {
2142 0 : Map_t::iterator aIt;
2143 :
2144 0 : for (aIt = mMap.begin(); aIt != mMap.end(); ++aIt)
2145 : {
2146 0 : mpDoc->insertCpAndFc(aIt->first);
2147 0 : aIt->second->setDocument(mpDoc);
2148 : }
2149 0 : }
2150 :
2151 : writerfilter::Reference<Properties>::Pointer_t
2152 0 : ShapeHelper::getShape(const CpAndFc & rCpAndFc)
2153 : {
2154 0 : WW8FSPA::Pointer_t pFSPA = mMap[rCpAndFc];
2155 :
2156 : return writerfilter::Reference<Properties>::Pointer_t
2157 0 : (new WW8FSPA(*pFSPA));
2158 : }
2159 :
2160 0 : BreakHelper::BreakHelper(PLCF<WW8BKD>::Pointer_t pPlcfbkdMom,
2161 : WW8DocumentImpl * pDoc)
2162 0 : : mpDoc(pDoc)
2163 : {
2164 : ProcessPLCF2Map<WW8BKD, BreakHelper> process;
2165 0 : process.process(pPlcfbkdMom, mMap, PROP_BRK, pDoc);
2166 0 : }
2167 :
2168 0 : void BreakHelper::init()
2169 : {
2170 0 : Map_t::iterator aIt;
2171 :
2172 0 : for (aIt = mMap.begin(); aIt != mMap.end(); ++aIt)
2173 : {
2174 0 : mpDoc->insertCpAndFc(aIt->first);
2175 : }
2176 0 : }
2177 :
2178 : writerfilter::Reference<Properties>::Pointer_t
2179 0 : BreakHelper::getBreak(const CpAndFc & rCpAndFc)
2180 : {
2181 0 : WW8BKD::Pointer_t pBKD = mMap[rCpAndFc];
2182 :
2183 : return writerfilter::Reference<Properties>::Pointer_t
2184 0 : (new WW8BKD(*pBKD));
2185 : }
2186 :
2187 :
2188 15 : }}
2189 :
2190 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|