blob: 04519a0ec5473eb2c6c4f814dcc2258ec8767f8b [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_WW8_DOCUMENT_IMPL_HXX
#define INCLUDED_WW8_DOCUMENT_IMPL_HXX
#include <set>
#include <WW8PieceTable.hxx>
#include <WW8BinTable.hxx>
#include <resources.hxx>
#ifndef INCLUDED_WW8_RESOURCE_MODEL_HXX
#include <resourcemodel/WW8ResourceModel.hxx>
#endif
#include <PLCF.hxx>
#include <WW8Sttbf.hxx>
#include <XNoteHelper.hxx>
namespace writerfilter {
namespace doctok
{
class WW8DocumentImpl;
/**
A bookmark.
*/
class Bookmark : public writerfilter::Reference<Properties>
{
/// bookmark first descriptor
writerfilter::Reference<Properties>::Pointer_t mpBKF;
/// name of bookmark
rtl::OUString mName;
public:
Bookmark(writerfilter::Reference<Properties>::Pointer_t pBKF,
rtl::OUString & rName);
/**
Resolve bookmark to handler.
@param rHandler handler to send events to
*/
virtual void resolve(Properties & rHandler);
virtual string getType() const;
};
/**
A helper for bookmarks.
*/
class BookmarkHelper
{
/// PLCF containing Cps and BKFs for the bookmarks
PLCF<WW8BKF>::Pointer_t mpStartCps;
/// Cps of the ends of bookmarks
WW8StructBase::Pointer_t mpEndCps;
/// STTBF containing the names of bookmarks
WW8Sttbf::Pointer_t mpNames;
/// piece table for converting CPs to FCs
WW8PieceTable::Pointer_t mpPieceTable;
/// document to insert CpAndFcs to
WW8DocumentImpl * mpDoc;
/**
Return start CpAndFc for a bookmark.
@param nPos index of the bookmark
*/
CpAndFc getStartCpAndFc(sal_uInt32 nPos);
/**
Return end CpAndFc for a bookmark.
@param nPos index of the bookmark
*/
CpAndFc getEndCpAndFc(sal_uInt32 nPos);
/**
Return the name of a bookmark.
@param nPos index of the bookmark
*/
rtl::OUString getName(sal_uInt32 nPos);
/**
Return index of a bookmark.
@param rCpAndFc CpAndFc of the bookmark
*/
sal_uInt32 getIndex(const CpAndFc & rCpAndFc);
public:
typedef boost::shared_ptr<BookmarkHelper> Pointer_t;
BookmarkHelper(PLCF<WW8BKF>::Pointer_t pStartCps,
WW8StructBase::Pointer_t pEndCps,
WW8Sttbf::Pointer_t pNames,
WW8PieceTable::Pointer_t pPieceTable,
WW8DocumentImpl * pDoc)
: mpStartCps(pStartCps), mpEndCps(pEndCps), mpNames(pNames),
mpPieceTable(pPieceTable), mpDoc(pDoc)
{
}
/**
Initialize.
Inserts CpAndFcs for the bookmark starts and ends into the
document.
*/
void init();
/**
Return BKF of a bookmark.
@param rCpAndFc CpAndFc of the bookmark
*/
writerfilter::Reference<Properties>::Pointer_t getBKF
(const CpAndFc & rCpAndFc);
/**
Return the name of a bookmark.
@param rCpAndFc CpAndFc of the bookmark
*/
rtl::OUString getName(const CpAndFc & rCp);
/**
Return bookmark.
@param rCpAndFc CpAndFc of the bookmark
*/
writerfilter::Reference<Properties>::Pointer_t
getBookmark(const CpAndFc & rCpAndFc);
};
/**
Helper for shapes.
*/
class ShapeHelper
{
public:
typedef hash_map<CpAndFc, WW8FSPA::Pointer_t, CpAndFcHash> Map_t;
private:
WW8DocumentImpl * mpDoc;
Map_t mMap;
public:
typedef boost::shared_ptr<ShapeHelper> Pointer_t;
ShapeHelper(PLCF<WW8FSPA>::Pointer_t pPlcspaMom,
PLCF<WW8FSPA>::Pointer_t pPlcspaHdr,
WW8DocumentImpl * pDoc);
void init();
writerfilter::Reference<Properties>::Pointer_t
getShape(const CpAndFc & rCpAndFc);
};
/**
Helper for fields.
*/
class FieldHelper
{
public:
typedef hash_map<CpAndFc, WW8FLD::Pointer_t,
CpAndFcHash> Map_t;
private:
WW8DocumentImpl * mpDoc;
Map_t mMap;
public:
typedef boost::shared_ptr<FieldHelper> Pointer_t;
FieldHelper(PLCF<WW8FLD>::Pointer_t pPlcffldMom,
WW8DocumentImpl * pDoc);
void init();
writerfilter::Reference<Properties>::Pointer_t
getField(const CpAndFc & rCpAndFc);
WW8FLD::Pointer_t getWW8FLD(const CpAndFc & rCpAndFc);
};
/**
Helper for Breaks.
*/
class BreakHelper
{
public:
typedef hash_map<CpAndFc, WW8BKD::Pointer_t,
CpAndFcHash> Map_t;
private:
WW8DocumentImpl * mpDoc;
Map_t mMap;
public:
typedef boost::shared_ptr<BreakHelper> Pointer_t;
BreakHelper(PLCF<WW8BKD>::Pointer_t pPlcfbkdMom,
WW8DocumentImpl * pDoc);
void init();
writerfilter::Reference<Properties>::Pointer_t
getBreak(const CpAndFc & rCpAndFc);
};
/**
Implementation class for document.
*/
class WW8DocumentImpl : public WW8Document
{
/// true if the document is contained in another document
bool bSubDocument;
/// picture location
sal_uInt32 mfcPicLoc;
/// true if FFDATA structure is found at offset mfcPicLoc in data stream
bool mbPicIsData;
/// current field descriptor
WW8FLD::Pointer_t mpFLD;
/// CpAndFcs in the document where properties change
CpAndFcs mCpAndFcs;
/// CpAndFc pointing to the start of the document
CpAndFc mCpAndFcStart;
/// CpAndFc pointing to the end of the document
CpAndFc mCpAndFcEnd;
/// pointer to the cache of FKPs containing character properties
WW8FKPCache::Pointer_t mpCHPFKPCache;
/// pointer to the cache of FPKs containing paragraph properties
WW8FKPCache::Pointer_t mpPAPFKPCache;
/// pointer to the stream containing the whole document
WW8Stream::Pointer_t mpStream;
/// pointer to the substream of the document containing table like
/// structures
WW8Stream::Pointer_t mpTableStream;
/// pointer to the substream of the document containing the
/// document contents and formatting information
WW8Stream::Pointer_t mpDocStream;
/// pointer to the data stream of the document
WW8Stream::Pointer_t mpDataStream;
/// pointer to the compound object stream of the document
WW8Stream::Pointer_t mpCompObjStream;
/// pointer to the summayry information stream of the document
WW8Stream::Pointer_t mpSummaryInformationStream;
/// pointer to the piece table
WW8PieceTable::Pointer_t mpPieceTable;
/// pointer to the bin table for paragraph properties
WW8BinTable::Pointer_t mpBinTablePAPX;
/// pointer to the bin table for character properties
WW8BinTable::Pointer_t mpBinTableCHPX;
/// PLCF containing the section descriptions
PLCF<WW8SED>::Pointer_t mpSEDs;
/// pointer to the file information block
WW8Fib::Pointer_t mpFib;
/// pointer to the file information block for post 2000 documents
WW8FibRgFcLcb2000::Pointer_t mpFibRgFcLcb2000;
/// pointer to the offsets of headers/footers
WW8StructBase::Pointer_t mpHeaderOffsets;
/// pointer to the helper for footnotes
XNoteHelper<WW8FRD>::Pointer_t mpFootnoteHelper;
/// pointer to the helper for endnotes
XNoteHelper<WW8FRD>::Pointer_t mpEndnoteHelper;
/// pointer to the helper for annotations
XNoteHelper<WW8ATRD>::Pointer_t mpAnnotationHelper;
/// pointer to the helper for bookmarks
BookmarkHelper::Pointer_t mpBookmarkHelper;
/// pointer to the helper for fields
FieldHelper::Pointer_t mpFieldHelper;
/// pointer to the helper for shapes
ShapeHelper::Pointer_t mpShapeHelper;
/// pointer to the helper for breaks
BreakHelper::Pointer_t mpBreakHelper;
/// cache for the Cp where main text flow end
CpAndFc mDocumentEndCpAndFc;
/// cache for the Cp where footnotes section ends
CpAndFc mFootnoteEndCpAndFc;
/// cache for the Cp where header section ends
CpAndFc mHeaderEndCpAndFc;
/// cache for the Cp where annotation section ends
CpAndFc mAnnotationEndCpAndFc;
/// cache for the Cp where endnote section ends
CpAndFc mEndnoteEndCpAndFc;
/// cache for the Cp where textbox section ends
CpAndFc mTextboxEndCpAndFc;
/// cache for the Cp where textbox in header section ends
CpAndFc mTextboxHeaderEndCpAndFc;
/// DffBlock of document
DffBlock::Pointer_t mpDffBlock;
/// Textbox stories
PLCF<WW8FTXBXS>::Pointer_t mpTextBoxStories;
bool mbInSection;
bool mbInParagraphGroup;
bool mbInCharacterGroup;
bool isSpecial(sal_uInt32 nChar);
WW8Stream::Pointer_t getSubStream(const ::rtl::OUString & sId) const;
/**
Parse bin table and create CpAndFcs for all points in the
document where properties of the given type change.
@param rTable bin table to parse
@param eType_ type of CpAndFcs to create
*/
void parseBinTableCpAndFcs(WW8BinTable & rTable, PropertyType eType_);
void startCharacterGroup(Stream & rStream);
void endCharacterGroup(Stream & rStream);
void startParagraphGroup(Stream & rStream);
void endParagraphGroup(Stream & rStream);
void startSectionGroup(Stream & rStream);
void endSectionGroup(Stream & rStream);
void text(Stream & rStream, const sal_uInt8 * data, size_t len);
void utext(Stream & rStream, const sal_uInt8 * data, size_t len);
public:
WW8DocumentImpl(WW8Stream::Pointer_t rpStream);
WW8DocumentImpl(const WW8DocumentImpl & rSrc,
const CpAndFc & rStart, const CpAndFc & rEnd);
virtual ~WW8DocumentImpl();
virtual WW8DocumentImpl & Assign(const WW8DocumentImpl & rSrc);
virtual string getType() const;
virtual WW8Document::Pointer_t getSubDocument(SubDocumentId nId);
virtual WW8DocumentIterator::Pointer_t getIterator
(const CpAndFc & rCpAndFc);
virtual WW8DocumentIterator::Pointer_t begin();
virtual WW8DocumentIterator::Pointer_t end();
virtual WW8Stream::Sequence getText(const CpAndFc & rStart);
/**
Returns the document stream.
*/
WW8Stream::Pointer_t getDocStream() const;
/**
Returns the data stream.
*/
WW8Stream::Pointer_t getDataStream() const;
/**
Returns distance in bytes to next CpAndFc.
@param rCpAndFc CpAndFc to start at
*/
sal_uInt32 getByteLength(const CpAndFc & rCpAndFc) const;
/**
Returns first character position in document.
*/
const CpAndFc & getFirstCp() const;
/**
Returns last character position in document.
*/
const CpAndFc & getLastCp() const;
/**
Returns next character position with change in properties.
@param rCpAndFc position to start at
*/
CpAndFc getNextCp(const CpAndFc & rCpAndFc) const;
/**
Returns previous character position with change in properties.
@param rCpAndFc position to start at
*/
CpAndFc getPrevCp(const CpAndFc & rCpAndFc) const;
/**
Returns character position where main text flow ends.
*/
CpAndFc getDocumentEndCp() const;
/**
Returns character position where footnotes end.
*/
CpAndFc getFootnodeEndCp() const;
/**
Returns character position where headers end.
*/
CpAndFc getHeaderEndCp() const;
/**
Returns character position where annatations end.
*/
CpAndFc getAnnotationEndCp() const;
/**
Returns character position where endnotes end.
*/
CpAndFc getEndnoteEndCp() const;
/**
Returns character position where textboxes end.
*/
CpAndFc getTextboxEndCp() const;
/**
Returns character positoion where textboxes in headers end.
*/
CpAndFc getTextboxHeaderEndCp() const;
/**
Insert CpAndFc to set of CpAndFcs.
@param rCpAndFc CpAndFc to insert
*/
void insertCpAndFc(const CpAndFc & rCpAndFc);
/**
Return FKP for certain CpAndFc.
@param rCpAndFc CpAndFc for which the FKP is looked for
*/
WW8FKP::Pointer_t getFKP(const CpAndFc & rCpAndFc);
/**
Return FKP containing character properties.
@param nIndex index of FKP to return
@param bComplex true if FKP contains complex FCs
*/
WW8FKP::Pointer_t getFKPCHPX(sal_uInt32 nIndex, bool bComplex);
/**
Return FKP containing paragraph properties.
@param nIndex index of FKP to return
@param bComplex true if FKP contains complex FCs
*/
WW8FKP::Pointer_t getFKPPAPX(sal_uInt32 nIndex, bool bComplex);
/**
Return property set valid at a certain CpAndFc.
@param rCpAndFc CpAndFc to look at
*/
writerfilter::Reference<Properties>::Pointer_t
getProperties(const CpAndFc & rCpAndFc);
/**
Return subdocument referenced at a certain point in document.
@param rCpAndFc CpAndFc where subdocument is referenced
*/
writerfilter::Reference<Stream>::Pointer_t
getSubDocument(const CpAndFc & rCpAndFc);
/**
Return section description at a certain CpAndFc.
@param rCpAndFc CpAndFc to look at
*/
WW8SED * getSED(const CpAndFc & rCpAndFc) const;
/**
Return reference to list plcs.
*/
writerfilter::Reference<Table>::Pointer_t getListTplcs() const;
/**
Return reference to list table.
*/
writerfilter::Reference<Table>::Pointer_t getListTable() const;
/**
Return reference to table of list level overrides.
*/
writerfilter::Reference<Table>::Pointer_t getLFOTable() const;
/**
Return reference to font table.
*/
writerfilter::Reference<Table>::Pointer_t getFontTable() const;
/**
Return reference to style sheet.
*/
writerfilter::Reference<Table>::Pointer_t getStyleSheet() const;
/**
Return reference to associated data.
*/
writerfilter::Reference<Table>::Pointer_t getAssocTable() const;
/**
Return count of headers/footers.
*/
sal_uInt32 getHeaderCount() const;
/**
Return CpAndFc for a header or footer.
@param nPos index in the list of headers and footers
*/
CpAndFc getHeaderCpAndFc(sal_uInt32 nPos);
/**
Return subdocument for header/footer.
@param nPos index in the list of headers and footers
*/
writerfilter::Reference<Stream>::Pointer_t getHeader(sal_uInt32 nPos);
/**
Return count of footnotes.
*/
sal_uInt32 getFootnoteCount() const;
/**
Return subdocument for footnote.
@param nPos index of the footnote
*/
writerfilter::Reference<Stream>::Pointer_t getFootnote(sal_uInt32 nPos);
/**
Return subdocument for footnote at a certain position in document.
@param rCpAndFc position in document
*/
writerfilter::Reference<Stream>::Pointer_t getFootnote
(const CpAndFc & rCpAndFc);
/**
Return count of endnotes.
*/
sal_uInt32 getEndnoteCount() const;
/**
Return subdocument for an endnote.
@param nPos index of the endnote
*/
writerfilter::Reference<Stream>::Pointer_t getEndnote(sal_uInt32 nPos);
/**
Return subdocument for an endnote.
@param rCpAndFc CpAndFc where endnote is referenced
*/
writerfilter::Reference<Stream>::Pointer_t getEndnote
(const CpAndFc & rCpAndFc);
/**
Return count of annotations.
*/
sal_uInt32 getAnnotationCount() const;
/**
Return subdocument for an annotation.
@param nPos index of the annotation
*/
writerfilter::Reference<Stream>::Pointer_t getAnnotation(sal_uInt32 nPos);
/**
Return subdocument for an annotation.
@param rCpAndFc CpAndFc where annotation is referenced
*/
writerfilter::Reference<Stream>::Pointer_t getAnnotation
(const CpAndFc & rCpAndFc);
/**
Return bookmark.
@param rCpAndFc CpAndFc where bookmark begins or ends
*/
writerfilter::Reference<Properties>::Pointer_t
getBookmark(const CpAndFc & rCpAndFc) const;
/**
Return shape.
@param rCpAndFc CpAndFc of the shape
*/
writerfilter::Reference<Properties>::Pointer_t
getShape(const CpAndFc & rCpAndFc) const;
writerfilter::Reference<Properties>::Pointer_t
getShape(sal_uInt32 nSpid);
/**
Return blip.
@param nBlib number of the blip to return
*/
writerfilter::Reference<Properties>::Pointer_t
getBlip(sal_uInt32 nBlib);
/**
Return break descriptor.
@param rCpAndFc CpAndFc of the break
*/
writerfilter::Reference<Properties>::Pointer_t
getBreak(const CpAndFc & rCpAndFc) const;
/**
Return field.
@param rCpAndFc CpAndFc of the field
*/
writerfilter::Reference<Properties>::Pointer_t
getField(const CpAndFc & rCpAndFc) const;
/**
Return document properties.
*/
writerfilter::Reference<Properties>::Pointer_t
getDocumentProperties() const;
/**
Return current field descriptor.
*/
WW8FLD::Pointer_t getCurrentFLD() const;
/**
Return stream of text box.
@param nShpId shape id of text box
*/
writerfilter::Reference<Stream>::Pointer_t
getTextboxText(sal_uInt32 nShpId) const;
/**
Return file character position according to a character
position.
@param cp the character position
*/
Fc cp2fc(const Cp & cp) const;
/**
Return the character position according to file character
position.
@param fc the file character position
*/
Cp fc2cp(const Fc & fc) const;
/**
Return CpAndFc related to character position.
@param cp the character position
*/
CpAndFc getCpAndFc(const Cp & cp, PropertyType type = PROP_DOC) const;
/**
Return CpAndFc related to file character position.
@param fc the file character position
*/
CpAndFc getCpAndFc(const Fc & fc, PropertyType type = PROP_DOC) const;
sal_uInt32 getPicLocation() const;
void setPicLocation(sal_uInt32 fcPicLoc);
bool isPicData();
void setPicIsData(bool bPicIsData);
/**
Create events for the document.
@param rHandler handler to send the events to
*/
void resolve(Stream & rHandler);
/**
Resolve text.
The text of the given iterator is split at special
characters. Each run of non-special characters is send as one
event. Each run of special characters is send as one event.
@param pIt iterator whose text is to be resolved
@param rStream handler for the events
*/
void resolveText(WW8DocumentIterator::Pointer_t pIt, Stream & rStream);
/**
Resolve the picture at mfcPicLoc.
@param rStream
*/
void resolvePicture(Stream & rStream);
/**
Resolve special char.
@param nChar the special char
@param rStream the stream handler to resolve the special char to
*/
void resolveSpecialChar(sal_uInt32 nChar, Stream & rStream);
};
/**
Implentation class for an iterator in a document.
*/
class WW8DocumentIteratorImpl : public WW8DocumentIterator
{
/// pointer to the document
WW8DocumentImpl * mpDocument;
/// CpAndFc the iterator is pointing to
CpAndFc mCpAndFc;
public:
WW8DocumentIteratorImpl(WW8DocumentImpl * pDocument,
const CpAndFc & rCpAndFc)
: mpDocument(pDocument), mCpAndFc(rCpAndFc)
{
}
virtual ~WW8DocumentIteratorImpl();
/**
Increase the iterator to the next character position.
*/
WW8DocumentIterator & operator++();
/**
Decrease the iterator to the previous character position.
*/
WW8DocumentIterator & operator--();
virtual writerfilter::Reference<Properties>::Pointer_t getProperties()
const;
//void setAttributes(const IAttributeSet & aAttributeSet);
virtual writerfilter::Reference<Stream>::Pointer_t getSubDocument() const;
/** Return if the text the iterator points to is complex.
@attention The definition of a complex run of text in Word is
counter-intuitive: Complex runs use 8-bit encoding for characters,
non-complex ones use 16 bits.
*/
bool isComplex() const;
virtual PropertyType getPropertyType() const;
virtual WW8Stream::Sequence getText();
virtual bool equal(const WW8DocumentIterator & rIt) const;
virtual string toString() const;
virtual void dump(ostream & o) const;
/**
Return pointer to the shape at character position the iterator
is pointing to.
*/
virtual writerfilter::Reference<Properties>::Pointer_t getShape() const;
/**
Return pointer to section description at character position the
iterator points to.
*/
WW8SED * getSED() const;
};
/**
Return string for property type.
*/
string propertyTypeToString(PropertyType nType);
}}
#endif // INCLUDED_WW8_DOCUMENT_IMPL_HXX