diff --git a/MsBinaryFile/DocFile/BookmarkFirst.cpp b/MsBinaryFile/DocFile/BookmarkFirst.cpp index b7729ca2a2..9499907396 100644 --- a/MsBinaryFile/DocFile/BookmarkFirst.cpp +++ b/MsBinaryFile/DocFile/BookmarkFirst.cpp @@ -34,45 +34,67 @@ namespace DocFileFormat { + AtnBookmark::AtnBookmark() + { + } + AtnBookmark::~AtnBookmark() + { + } + ByteStructure* AtnBookmark::ConstructObject(VirtualStreamReader* reader, int length) + { + AtnBookmark *newObject = new AtnBookmark(); + + newObject->bmc = reader->ReadUInt16(); //0x0100 + newObject->lTag = reader->ReadUInt32(); + + unsigned int lTagOld = reader->ReadUInt32(); + + return static_cast(newObject); + } +//--------------------------------------------------------------------------------------------- + ProtInfoBookmark::ProtInfoBookmark() + { + } + ProtInfoBookmark::~ProtInfoBookmark() + { + } + ByteStructure* ProtInfoBookmark::ConstructObject(VirtualStreamReader* reader, int length) + { + ProtInfoBookmark *newObject = new ProtInfoBookmark(); + + newObject->id = reader->ReadUInt32(); + + newObject->uidSel = reader->ReadUInt16(); + newObject->iProt = reader->ReadUInt16(); + + newObject->i = reader->ReadUInt16(); + newObject->fUseMe = reader->ReadUInt16(); + + return static_cast(newObject); + } +//--------------------------------------------------------------------------------------------- BookmarkFirst::BookmarkFirst() { } - short BookmarkFirst::GetIndex() const - { - return this->ibkl; - } - short BookmarkFirst::GetInformation() const - { - return this->bkc; - } BookmarkFirst::~BookmarkFirst() { } - ByteStructure* BookmarkFirst::ConstructObject( VirtualStreamReader* reader, int length ) - { - BookmarkFirst *newObject = new BookmarkFirst(); - - newObject->ibkl = reader->ReadInt16(); - newObject->bkc = reader->ReadInt16(); - - return static_cast( newObject ); - } - - AtnBookmarkFirst::AtnBookmarkFirst() + ByteStructure* BookmarkFirst::ConstructObject(VirtualStreamReader* reader, int length) { - } - AtnBookmarkFirst::~AtnBookmarkFirst() - { - } - ByteStructure* AtnBookmarkFirst::ConstructObject( VirtualStreamReader* reader, int length ) - { - AtnBookmarkFirst *newObject = new AtnBookmarkFirst(); + BookmarkFirst *newObject = new BookmarkFirst(); - newObject->bmc = reader->ReadUInt16(); //0x0100 - newObject->lTag = reader->ReadUInt32(); - - unsigned int lTagOld = reader->ReadUInt32(); + newObject->id = reader->ReadUInt32(); + + newObject->itcFirst = reader->ReadByte(); + newObject->fPub = GETBIT(newObject->itcFirst, 7); + newObject->itcFirst = GETBITS(newObject->itcFirst, 0, 6); + + newObject->itcLim = reader->ReadByte(); + newObject->fNative = GETBIT(newObject->itcLim, 6); + newObject->fCol = GETBIT(newObject->itcLim, 7); + newObject->itcLim = GETBITS(newObject->itcLim, 0, 5); + + return static_cast(newObject); + } - return static_cast( newObject ); - } } diff --git a/MsBinaryFile/DocFile/BookmarkFirst.h b/MsBinaryFile/DocFile/BookmarkFirst.h index b5f3d8a6fc..7db2d64875 100644 --- a/MsBinaryFile/DocFile/BookmarkFirst.h +++ b/MsBinaryFile/DocFile/BookmarkFirst.h @@ -38,34 +38,50 @@ namespace DocFileFormat { class BookmarkFirst: public ByteStructure { - private: - short ibkl; - short bkc; + public: + _UINT32 id = 0; + unsigned char itcFirst = 0; + bool fPub = false; + unsigned char itcLim = 0; + bool fNative = false; + bool fCol = false; - public: - static const int STRUCTURE_SIZE = 4; + static const int STRUCTURE_SIZE = 6; BookmarkFirst(); - - short GetIndex() const; - short GetInformation() const; - virtual ~BookmarkFirst(); - virtual ByteStructure* ConstructObject( VirtualStreamReader* reader, int length ); + virtual ByteStructure* ConstructObject(VirtualStreamReader* reader, int length); }; - class AtnBookmarkFirst: public ByteStructure + class AtnBookmark : public ByteStructure { -public: - unsigned short bmc; - unsigned int lTag; + public: + unsigned short bmc = 0; + unsigned int lTag = 0; - static const int STRUCTURE_SIZE = 10; + static const int STRUCTURE_SIZE = 10; - AtnBookmarkFirst(); - virtual ~AtnBookmarkFirst(); + AtnBookmark(); + virtual ~AtnBookmark(); - virtual ByteStructure* ConstructObject( VirtualStreamReader* reader, int length ); + virtual ByteStructure* ConstructObject(VirtualStreamReader* reader, int length); + }; + + class ProtInfoBookmark : public ByteStructure + { + public: + _UINT32 id = 0; + + _UINT16 uidSel = 0; + _UINT16 iProt = 0; + + unsigned short i = 0; + unsigned short fUseMe = 0; + + ProtInfoBookmark(); + virtual ~ProtInfoBookmark(); + + virtual ByteStructure* ConstructObject(VirtualStreamReader* reader, int length); }; } diff --git a/MsBinaryFile/DocFile/DocumentMapping.cpp b/MsBinaryFile/DocFile/DocumentMapping.cpp index f0c29b2f63..dd3b431cf4 100644 --- a/MsBinaryFile/DocFile/DocumentMapping.cpp +++ b/MsBinaryFile/DocFile/DocumentMapping.cpp @@ -45,7 +45,7 @@ namespace DocFileFormat { DocumentMapping::DocumentMapping(ConversionContext* context, IMapping* caller) : _skipRuns(0), _lastValidPapx(NULL), _lastValidSepx(NULL), AbstractOpenXmlMapping( new XMLTools::CStringXmlWriter() ), _sectionNr(0), _footnoteNr(0), - _endnoteNr(0), _commentNr(1), _caller(caller) + _endnoteNr(0), _commentNr(1), _caller(caller), _permissionNr(1) { m_document = NULL; m_context = context; @@ -296,12 +296,10 @@ namespace DocFileFormat fcChpxEnd = fcEnd; } - //read the chars that are formatted via this CHPX std::vector* chpxChars = m_document->GetChars(fcChpxStart, fcChpxEnd, cp); - //search for bookmarks in the chars - std::vector annot = searchAnnot(chpxChars, cp); - if (!annot.empty()) + std::vector annot = searchAnnotation(chpxChars, cp); + if (false == annot.empty()) { std::list>* runs = splitCharList(chpxChars, &annot); if (runs) @@ -319,11 +317,9 @@ namespace DocFileFormat } else { - //search for bookmarks in the chars std::vector bookmarks = searchBookmarks(chpxChars, cp); - //if there are bookmarks in this run, split the run into several runs - if (!bookmarks.empty()) + if (false == bookmarks.empty()) { std::list>* runs = splitCharList(chpxChars, &bookmarks); if (runs) @@ -341,7 +337,28 @@ namespace DocFileFormat } else { - cp = writeRun(chpxChars, *cpeIter, cp); + std::vector permissions = searchPermission(chpxChars, cp); + + if (false == permissions.empty()) + { + std::list>* runs = splitCharList(chpxChars, &permissions); + if (runs) + { + for (std::list >::iterator iter = runs->begin(); iter != runs->end(); ++iter) + { + if (writePermissions(cp)) + { + cp = writeRun(&(*iter), *cpeIter, cp); + } + } + + RELEASEOBJECT(runs); + } + } + else + { + cp = writeRun(chpxChars, *cpeIter, cp); + } } } @@ -1086,11 +1103,11 @@ namespace DocFileFormat } else { - std::map::iterator pFind = m_document->mapCommentsBookmarks.find(atrdPre10->m_BookmarkId); - if (pFind == m_document->mapCommentsBookmarks.end()) + std::map::iterator pFind = m_document->mapAnnotBookmarks.find(atrdPre10->m_BookmarkId); + if (pFind == m_document->mapAnnotBookmarks.end()) { atrdPre10->m_CommentId = _commentNr++; - m_document->mapCommentsBookmarks.insert(std::make_pair(atrdPre10->m_BookmarkId, atrdPre10->m_CommentId)); + m_document->mapAnnotBookmarks.insert(std::make_pair(atrdPre10->m_BookmarkId, atrdPre10->m_CommentId)); } else { @@ -1211,8 +1228,7 @@ namespace DocFileFormat return ret; } - // Searches for bookmarks in the list of characters. - std::vector DocumentMapping::searchAnnot(std::vector* chars, int initialCp) + std::vector DocumentMapping::searchAnnotation(std::vector* chars, int initialCp) { std::vector ret; @@ -1235,7 +1251,27 @@ namespace DocFileFormat return ret; } + std::vector DocumentMapping::searchPermission(std::vector* chars, int initialCp) + { + std::vector ret; + if (m_document->BookmarkProtStartPlex->IsValid()) + { + int cp = initialCp; + + size_t count = chars->size(); + + for (size_t i = 0; i < count; ++i) + { + if ((m_document->BookmarkProtStartPlex->IsCpExists(cp)) || (m_document->BookmarkProtEndPlex->IsCpExists(cp))) + { + ret.push_back(i); + } + ++cp; + } + } + return ret; + } ParagraphPropertyExceptions* DocumentMapping::findValidPapx(int fc) { ParagraphPropertyExceptions* ret = NULL; @@ -1841,16 +1877,15 @@ namespace DocFileFormat bool DocumentMapping::writeBookmarks(int cp) { bool result = true; - int count = (int)m_document->BookmarkStartEndCPs.size(); - for (int b = 0; b < count; ++b) + for (size_t b = 0; b < m_document->BookmarkStartEndCPs.size(); ++b) { - if (m_document->BookmarkStartEndCPs[b].first == cp) + if (m_document->BookmarkStartEndCPs[b].start == cp) { result = writeBookmarkStart(b); } - if (m_document->BookmarkStartEndCPs[b].second == cp) + if (m_document->BookmarkStartEndCPs[b].end == cp) { result = writeBookmarkEnd(b); } @@ -1867,11 +1902,11 @@ namespace DocFileFormat if (m_document->AnnotStartEndCPs[i].start == cp) { int index = -1; - std::map::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId); - if (pFind == m_document->mapCommentsBookmarks.end()) + std::map::iterator pFind = m_document->mapAnnotBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId); + if (pFind == m_document->mapAnnotBookmarks.end()) { index = _commentNr++; - m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index )); + m_document->mapAnnotBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index )); } else index = pFind->second; @@ -1881,11 +1916,11 @@ namespace DocFileFormat if (m_document->AnnotStartEndCPs[i].end == cp) { int index = -1; - std::map::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId); - if (pFind == m_document->mapCommentsBookmarks.end()) + std::map::iterator pFind = m_document->mapAnnotBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId); + if (pFind == m_document->mapAnnotBookmarks.end()) { index = _commentNr++; - m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index )); + m_document->mapAnnotBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index )); } else index = pFind->second; @@ -1895,10 +1930,45 @@ namespace DocFileFormat return result; } + bool DocumentMapping::writePermissions(int cp) + { + bool result = true; + + for (size_t i = 0; i < m_document->BookmarkProtStartEndCPs.size(); i++) + { + if (m_document->BookmarkProtStartEndCPs[i].start == cp) + { + int index = -1; + std::map::iterator pFind = m_document->mapProtBookmarks.find(m_document->BookmarkProtStartEndCPs[i].bookmarkId); + if (pFind == m_document->mapProtBookmarks.end()) + { + index = _permissionNr++; + m_document->mapProtBookmarks.insert(std::make_pair(m_document->BookmarkProtStartEndCPs[i].bookmarkId, index)); + } + else index = pFind->second; + + result = writePermissionStart(index, i); + } + + if (m_document->BookmarkProtStartEndCPs[i].end == cp) + { + int index = -1; + std::map::iterator pFind = m_document->mapProtBookmarks.find(m_document->BookmarkProtStartEndCPs[i].bookmarkId); + if (pFind == m_document->mapProtBookmarks.end()) + { + index = _permissionNr++; + m_document->mapProtBookmarks.insert(std::make_pair(m_document->BookmarkProtStartEndCPs[i].bookmarkId, index)); + } + else index = pFind->second; + + result = writePermissionEnd(index); + } + } + + return result; + } bool DocumentMapping::writeBookmarkStart(short id) { - // write bookmark start - WideString* bookmarkName = static_cast(m_document->BookmarkNames->operator [](id)); if ((bookmarkName != NULL) && (*bookmarkName != L"_PictureBullets")) @@ -1912,7 +1982,6 @@ namespace DocFileFormat return true; } - return false; } @@ -1936,25 +2005,64 @@ namespace DocFileFormat bool DocumentMapping::writeAnnotationStart(short id) { XMLTools::XMLElement bookmarkElem(L"w:commentRangeStart"); - bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id)); - m_pXmlWriter->WriteString(bookmarkElem.GetXMLString()); return true; } - bool DocumentMapping::writeAnnotationEnd(short id) { - XMLTools::XMLElement bookmarkElem( L"w:commentRangeEnd" ); - - bookmarkElem.AppendAttribute( L"w:id", FormatUtils::IntToWideString( id )); - - m_pXmlWriter->WriteString( bookmarkElem.GetXMLString()); + XMLTools::XMLElement bookmarkElem(L"w:commentRangeEnd"); + bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id)); + m_pXmlWriter->WriteString(bookmarkElem.GetXMLString()); + + return true; + } + bool DocumentMapping::writePermissionStart(short id, size_t index) + { + XMLTools::XMLElement bookmarkElem(L"w:permStart"); + bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id)); + + ProtInfoBookmark *prot = static_cast(m_document->BkmkProt->operator[](index)); + BookmarkFirst *prot_base = static_cast(m_document->BookmarkProtStartPlex->GetStruct(index)); + + if (prot_base && prot_base->fCol) + { + bookmarkElem.AppendAttribute(L"w:colFirst", FormatUtils::IntToWideString(prot_base->itcFirst)); + bookmarkElem.AppendAttribute(L"w:colLast", FormatUtils::IntToWideString(prot_base->itcLim - 1)); + } + if (prot && (prot->uidSel == 0 || prot->uidSel > 0xfff0)) + { + switch (prot->uidSel) + { + case 0xFFFF: bookmarkElem.AppendAttribute(L"w:edGrp", L"everyone"); + case 0xFFFE: bookmarkElem.AppendAttribute(L"w:edGrp", L"administrators"); + case 0xFFFD: bookmarkElem.AppendAttribute(L"w:edGrp", L"contributors"); + case 0xFFFC: bookmarkElem.AppendAttribute(L"w:edGrp", L"owners"); + case 0xFFFB: bookmarkElem.AppendAttribute(L"w:edGrp", L"editors"); + case 0xFFFA: bookmarkElem.AppendAttribute(L"w:edGrp", L"current"); + case 0x0000: bookmarkElem.AppendAttribute(L"w:edGrp", L"none"); + } + } + if (prot && (prot->uidSel > 0 && prot->uidSel < 0xfff0)) + { + WideString* user = static_cast(m_document->BkmkProtUser->operator[](prot->uidSel - 1)); + + if (user && false == user->empty()) + bookmarkElem.AppendAttribute(L"w:ed", *user); + } + m_pXmlWriter->WriteString(bookmarkElem.GetXMLString()); + + return true; + } + bool DocumentMapping::writePermissionEnd(short id) + { + XMLTools::XMLElement bookmarkElem(L"w:permEnd"); + bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id)); + m_pXmlWriter->WriteString(bookmarkElem.GetXMLString()); return true; } - // Checks if the CHPX is special bool DocumentMapping::isSpecial(CharacterPropertyExceptions* chpx) { if (!chpx) return false; diff --git a/MsBinaryFile/DocFile/DocumentMapping.h b/MsBinaryFile/DocFile/DocumentMapping.h index 7def8071e9..5e68ef13c3 100644 --- a/MsBinaryFile/DocFile/DocumentMapping.h +++ b/MsBinaryFile/DocFile/DocumentMapping.h @@ -75,7 +75,6 @@ namespace DocFileFormat virtual ~DocumentMapping(); virtual void Apply( IVisitable* visited ) = 0; - //--------------------------------- 4571833.doc std::wstring m_shapeIdOwner; std::wstring getOLEObject() { return _lastOLEObject; } @@ -95,29 +94,24 @@ namespace DocFileFormat void writeTextElement ( const std::wstring& text, const std::wstring& textType ); void writeTextStart ( const std::wstring& textType, bool preserve_space); void writeTextEnd ( const std::wstring& textType ); - void writeField (const std::wstring& sFieldString, int cpFieldStart, int cpFieldEnd); - - - std::vector searchBookmarks( std::vector* chars, int initialCp ); - std::vector searchAnnot(std::vector* chars, int initialCp); - + void writeField (const std::wstring& sFieldString, int cpFieldStart, int cpFieldEnd); + ParagraphPropertyExceptions* findValidPapx( int fc ); - // Splits a list of characters into several lists std::list >* splitCharList( std::vector* chars, std::vector* splitIndices ); - // Writes the table starts at the given cp value int writeTable ( int initialCp, unsigned int nestingLevel ); - // Builds a list that contains the width of the several columns of the table. bool buildTableGrid( int initialCp, unsigned int nestingLevel, std::vector& grid); - // Finds the FC of the next row end mark. int findRowEndFc ( int initialCp, int& rowEndCp, unsigned int nestingLevel ); - // Finds the FC of the next row end mark. int findRowEndFc ( int initialCp, unsigned int nestingLevel ); - // Writes the table row that starts at the given cp value and ends at the next row end mark + int writeTableRow ( int initialCp, std::vector* grid, unsigned int nestingLevel ); - // Writes the table cell that starts at the given cp value and ends at the next cell end mark int writeTableCell ( int initialCp, TablePropertyExceptions* tapx, std::vector* grid, int& gridIndex, int cellIndex, unsigned int nestingLevel ); + int findCellEndCp ( int initialCp, unsigned int nestingLevel ); + std::vector searchBookmarks(std::vector* chars, int initialCp); + std::vector searchAnnotation(std::vector* chars, int initialCp); + std::vector searchPermission(std::vector* chars, int initialCp); + bool writeBookmarks ( int cp ); bool writeBookmarkStart ( short id ); bool writeBookmarkEnd ( short id ); @@ -127,11 +121,13 @@ namespace DocFileFormat bool writeAnnotations ( int cp ); bool writeAnnotationStart( short id ); bool writeAnnotationEnd ( short id ); - // Checks if the CHPX is special + + bool writePermissions(int cp); + bool writePermissionStart(short id, size_t index); + bool writePermissionEnd(short id); + bool isSpecial( CharacterPropertyExceptions* chpx ); - // Finds the SEPX that is valid for the given CP. SectionPropertyExceptions* findValidSepx( int cp ); - // Searches the given vector for the next FieldEnd character. int searchNextTextMark( std::vector* chars, int initialCp, wchar_t mark ); Symbol getSymbol ( const CharacterPropertyExceptions* chpx ); @@ -153,6 +149,7 @@ namespace DocFileFormat int _footnoteNr; int _endnoteNr; int _commentNr; + int _permissionNr; bool _isTextBoxContent; // int _isSectionPageBreak; //0 - not set, 1 -page break, 2 - continues, -1 - already bool _writeWebHidden; @@ -171,7 +168,7 @@ namespace DocFileFormat //bool bInstrText = false; bool bEnd = false; }; - std::vector _fieldLevels; - bool _bContentWrite; + std::vector _fieldLevels; + bool _bContentWrite; }; } diff --git a/MsBinaryFile/DocFile/FontFamilyName.h b/MsBinaryFile/DocFile/FontFamilyName.h index 16d35a3f81..c5a30cff38 100644 --- a/MsBinaryFile/DocFile/FontFamilyName.h +++ b/MsBinaryFile/DocFile/FontFamilyName.h @@ -56,33 +56,23 @@ namespace DocFileFormat friend class NumberingMapping; private: - /// When true, font is a TrueType font - bool fTrueType; - /// Font family id - unsigned char ff; - /// Base weight of font - short wWeight; - /// Character set identifier - unsigned char chs; - /// Pitch request - unsigned char prq; - /// Name of font - std::wstring xszFtn; - /// Alternative name of the font - std::wstring xszAlt; - /// Panose - unsigned char *panose; - /// Panose size - unsigned int panoseSize; - /// Font sinature - FontSignature fs; + bool fTrueType; // When true, font is a TrueType font + unsigned char ff; // Font family id + short wWeight; // Base weight of font + unsigned char chs; // Character set identifier + unsigned char prq; // Pitch request + std::wstring xszFtn; // Name of font + std::wstring xszAlt; // Alternative name of the font + unsigned char *panose; // Panose + unsigned int panoseSize; // Panose size + FontSignature fs; // Font sinature + long searchTerminationZero( VirtualStreamReader *reader ); public: FontFamilyName(); virtual ~FontFamilyName(); virtual ByteStructure* ConstructObject( VirtualStreamReader* reader, int length ); private: - long searchTerminationZero( VirtualStreamReader *reader ); }; } diff --git a/MsBinaryFile/DocFile/Plex.h b/MsBinaryFile/DocFile/Plex.h index 8b67ecfe4f..b04dd8fde2 100644 --- a/MsBinaryFile/DocFile/Plex.h +++ b/MsBinaryFile/DocFile/Plex.h @@ -48,7 +48,7 @@ namespace DocFileFormat std::vector Elements; bool m_bIsValid; - std::map mapCP; + std::map mapCP; public: Plex(int structureLength, POLE::Stream* stream, unsigned int fc, unsigned int lcb, int nWordVersion) : m_bIsValid(false), CP_LENGTH(/*nWordVersion == 2 ? 2 :*/ 4) @@ -80,7 +80,7 @@ namespace DocFileFormat { int val = reader.ReadInt32(); - mapCP.insert(std::make_pair(val, (int)CharacterPositions.size())); + mapCP.insert(std::make_pair(val, CharacterPositions.size())); CharacterPositions.push_back(val); } @@ -105,33 +105,29 @@ namespace DocFileFormat RELEASEOBJECT(Elements[i]); } } - - - // Retruns the struct that matches the given character position. - - inline ByteStructure* GetStruct(int cp) + inline ByteStructure* GetStruct(size_t index) { - int index = -1; - - std::map::iterator pFind = mapCP.find(cp); - - if (pFind != mapCP.end()) - { - index = pFind->second; - } - - if ((index >= 0) && (index < (int)Elements.size())) return this->Elements[index]; return NULL; } + inline ByteStructure* GetStruct(int cp) + { + std::map::iterator pFind = mapCP.find(cp); + + if (pFind != mapCP.end()) + { + return GetStruct(pFind->second); + } + return NULL; + } inline bool IsCpExists(int cp) const { bool result = false; - std::map::const_iterator pFind = mapCP.find(cp); + std::map::const_iterator pFind = mapCP.find(cp); if (pFind != mapCP.end()) { diff --git a/MsBinaryFile/DocFile/StringTable.h b/MsBinaryFile/DocFile/StringTable.h index 94e9e76501..d2f96db6df 100644 --- a/MsBinaryFile/DocFile/StringTable.h +++ b/MsBinaryFile/DocFile/StringTable.h @@ -39,6 +39,8 @@ namespace DocFileFormat { + template class StringTableEx; + template class StringTable: public IVisitable { friend class WordDocument; @@ -47,43 +49,41 @@ namespace DocFileFormat friend class StyleSheetMapping; friend class DocumentMapping; friend class NumberingMapping; + friend class StringTableEx; private: - bool fExtend; - int cbData; - unsigned short cbExtra; + bool fExtend = false; + int cbData = 0; + unsigned short cbExtra = 0; + int code_page = 1250; std::vector Data; - std::vector DataExtra; - int code_page; public: + StringTable() + { + } virtual ~StringTable() { - for ( size_t i = 0; i < this->Data.size(); ++i ) + for ( size_t i = 0; i < Data.size(); ++i ) { - RELEASEOBJECT( this->Data[i] ); + RELEASEOBJECT( Data[i] ); - if (false == this->DataExtra.empty()) + if (false == DataExtra.empty()) { - if (this->DataExtra[i]) + if (DataExtra[i]) { - delete []this->DataExtra[i]; - this->DataExtra[i] = NULL; + delete []DataExtra[i]; + DataExtra[i] = NULL; } } } - } - - StringTable( VirtualStreamReader *reader, int code_page_ ): - code_page(code_page_), fExtend(false), cbData(0), cbExtra(0) + StringTable( VirtualStreamReader *reader, int code_page_ ) : code_page(code_page_) { parse( reader, (unsigned int)reader->GetPosition(), 0, false ); } - - StringTable( POLE::Stream* tableStream, unsigned int fc, unsigned int lcb, int nWordVersion, bool bReadExta = false) : - code_page(1250), fExtend(false), cbData(0), cbExtra(0) + StringTable( POLE::Stream* tableStream, unsigned int fc, unsigned int lcb, int nWordVersion, bool bReadExta = false) { if ( lcb > 0 ) { @@ -97,9 +97,9 @@ namespace DocFileFormat ByteStructure* operator [] ( size_t index ) const { - if ( index < this->Data.size() ) + if ( index < Data.size() ) { - return this->Data.at( index ); + return Data.at( index ); } else { @@ -109,46 +109,38 @@ namespace DocFileFormat private: - void parse( VirtualStreamReader *reader, unsigned int fc, unsigned int lcb = 0, bool bReadExta = false ) + virtual void parse( VirtualStreamReader *reader, unsigned int fc, unsigned int lcb = 0, bool bReadExta = false ) { if ( reader == NULL ) return; if (fc > reader->GetSize()) return; - this->cbData = lcb; - + cbData = lcb; + int count_elements = 0; - //read fExtend + if ( reader->ReadUInt16() == 0xFFFF ) { //if the first 2 bytes are 0xFFFF the STTB contains unicode characters - this->fExtend = true; + fExtend = true; code_page = ENCODING_UTF16; } else { //else the STTB contains 1byte characters and the fExtend field is non-existend //seek back to the beginning - this->fExtend = false; + fExtend = false; code_page = ENCODING_WINDOWS_1250; reader->Seek( (int)fc, 0/*STREAM_SEEK_SET*/ ); } - //read cData long cDataStart = reader->GetPosition(); unsigned short cb = 0, elem_sz = 0; - //if (reader->nWordVersion == 2) - //{ - // unsigned char * bytes = reader->ReadBytes(lcb, true); - // reader->Seek( (int)fc, 0/*STREAM_SEEK_SET*/ ); - // delete []bytes; - //} - if (reader->nWordVersion > 0) { cb = reader->ReadUInt16(); - this->cbData = cb; // all size + cbData = cb; // all size } else if (reader->nWordVersion == 0) { @@ -159,35 +151,28 @@ namespace DocFileFormat } else { - //cData is a 4byte signed Integer, so we need to seek back reader->Seek( (int)( fc + cDataStart ), 0/*STREAM_SEEK_SET*/ ); - this->cbData = reader->ReadInt32(); + cbData = reader->ReadInt32(); } } - //read cbExtra if (reader->nWordVersion == 0) { - this->cbExtra = reader->ReadUInt16(); + cbExtra = reader->ReadUInt16(); } - if (lcb > 0 && (lcb/* - fc*/) != this->cbData + this->cbExtra) + while (true) { - //???? - } - - while(true) //read the strings and extra datas - { - if (reader->GetPosition() >= fc + this->cbData + this->cbExtra && count_elements < 1) + if (reader->GetPosition() >= fc + cbData + cbExtra && count_elements < 1) break; //1995 and older - if (this->Data.size() == count_elements && count_elements > 0) + if (Data.size() == count_elements && count_elements > 0) break; //1997 and newer int cchData = 0; int cbData = 0; - if ( this->fExtend ) + if ( fExtend ) { cchData = (int)reader->ReadUInt16(); cbData = cchData * 2; @@ -200,7 +185,7 @@ namespace DocFileFormat long posBeforeType = reader->GetPosition(); - this->Data.push_back( T().ConstructObject( reader, cbData ) ); + Data.push_back( T().ConstructObject( reader, cbData ) ); reader->Seek( (int)( posBeforeType + cbData ), 0/*STREAM_SEEK_SET */); @@ -216,4 +201,94 @@ namespace DocFileFormat } } }; + template class StringTableEx : public StringTable + { + public: + StringTableEx(VirtualStreamReader *reader, int code_page_) : StringTable::code_page(code_page_) + { + parse(reader, (unsigned int)reader->GetPosition(), 0, true); + } + + StringTableEx(POLE::Stream* tableStream, unsigned int fc, unsigned int lcb, int nWordVersion) + { + if (lcb > 0) + { + VirtualStreamReader reader(tableStream, fc, nWordVersion); + + parse(&reader, fc, lcb, true); + } + } + private: + virtual void parse(VirtualStreamReader *reader, unsigned int fc, unsigned int lcb = 0, bool bReadExta = false) + { + if (reader == NULL) return; + if (fc > reader->GetSize()) return; + + if (reader->ReadUInt16() == 0xFFFF) + { + fExtend = true; + code_page = ENCODING_UTF16; + } + else + { + fExtend = false; + code_page = ENCODING_WINDOWS_1250; + } + + _UINT32 cDataStart = reader->GetPosition(), count_elements = 0; + _UINT32 cb = 0, elem_sz = 0; + + cb = reader->ReadUInt32(); + if (cb != 0xFFFF) + { + count_elements = cb; + cbData = 0; + } + else + { + cbData = cb; + } + + cbExtra = reader->ReadUInt16(); + + while (true) + { + if (reader->GetPosition() >= fc + lcb) + break; + + int cchData = 0; + + if (fExtend) + { + cchData = (int)reader->ReadUInt16(); + if (cchData > 0) cchData -= 2; //??? cchData (2 bytes): This value MUST be 0 + } + else + { + cchData = (int)reader->ReadByte(); //?? + } + + if (cchData > 0) + { + Data.push_back(T().ConstructObject(reader, cchData)); + + if (bReadExta) + { + unsigned char* pData = reader->ReadBytes(cbExtra, true); + DataExtra.push_back(pData); + } + else + { + reader->ReadBytes(cbExtra, false); + } + } + else + { + Data.push_back(T().ConstructObject(reader, cbExtra)); + + } + } + reader->Seek((int)(fc + lcb), 0/*STREAM_SEEK_SET */); + } + }; } diff --git a/MsBinaryFile/DocFile/WordDocument.cpp b/MsBinaryFile/DocFile/WordDocument.cpp index 301ffa4761..0e685ecb98 100644 --- a/MsBinaryFile/DocFile/WordDocument.cpp +++ b/MsBinaryFile/DocFile/WordDocument.cpp @@ -87,11 +87,11 @@ namespace DocFileFormat EndnoteReferenceCharactersPlex(NULL), FieldsPlex(NULL), FootnoteDocumentFieldsPlex(NULL), EndnoteDocumentFieldsPlex(NULL), HeadersAndFootersDocumentFieldsPlex(NULL), HeaderStoriesPlex(NULL), AnnotationsFieldsPlex(NULL), AnnotationsReferencePlex(NULL), AnnotationsReferencesEx(NULL), IndividualCommentsPlex(NULL), TextboxBreakPlex(NULL), TextboxBreakPlexHeader(NULL), - TextboxIndividualPlex(NULL),AssocNames(NULL), BookmarkAnnotNames(NULL), Captions(NULL), AutoCaptions(NULL), ListPlex(NULL), + TextboxIndividualPlex(NULL),AssocNames(NULL), BkmkAnnotNames(NULL), Captions(NULL), AutoCaptions(NULL), ListPlex(NULL), OfficeDrawingPlex(NULL), OfficeDrawingPlexHeader(NULL), SectionPlex(NULL), BookmarkStartPlex(NULL), BookmarkEndPlex(NULL), AutoTextPlex(NULL), AllPapxFkps(NULL), AllChpxFkps(NULL), AllPapx(NULL), AllPapxVector(NULL), AllSepx(NULL), Styles(NULL), listTable(NULL), AnnotationOwners(NULL), DocProperties(NULL), listFormatOverrideTable(NULL), headerAndFooterTable(NULL), - AnnotStartPlex(NULL), AnnotEndPlex(NULL), encryptionHeader(NULL) + AnnotStartPlex(NULL), AnnotEndPlex(NULL), encryptionHeader(NULL), BkmkProt(NULL), BkmkProtUser(NULL), BookmarkProtStartPlex(NULL), BookmarkProtEndPlex(NULL) { m_sTempFolder = sTempFolder; m_nUserLCID = userLCID; @@ -310,21 +310,23 @@ namespace DocFileFormat m_pStorage->GetStream (L"WordDocument", &TableStream); } - RevisionAuthorTable = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfRMark, FIB->m_FibWord97.lcbSttbfRMark, nWordVersion); - FontTable = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfFfn, FIB->m_FibWord97.lcbSttbfFfn, nWordVersion); - BookmarkNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfBkmk, FIB->m_FibWord97.lcbSttbfBkmk, nWordVersion); - AutoTextNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfGlsy, FIB->m_FibWord97.lcbSttbfGlsy, nWordVersion); - AssocNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfAssoc, FIB->m_FibWord97.lcbSttbfAssoc, nWordVersion); - Captions = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfCaption, FIB->m_FibWord97.lcbSttbfCaption, nWordVersion); - AutoCaptions = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfAutoCaption, FIB->m_FibWord97.lcbSttbfAutoCaption, nWordVersion); + RevisionAuthorTable = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfRMark, FIB->m_FibWord97.lcbSttbfRMark, nWordVersion); + FontTable = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfFfn, FIB->m_FibWord97.lcbSttbfFfn, nWordVersion); + BookmarkNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfBkmk, FIB->m_FibWord97.lcbSttbfBkmk, nWordVersion); + AutoTextNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfGlsy, FIB->m_FibWord97.lcbSttbfGlsy, nWordVersion); + AssocNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfAssoc, FIB->m_FibWord97.lcbSttbfAssoc, nWordVersion); + Captions = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfCaption, FIB->m_FibWord97.lcbSttbfCaption, nWordVersion); + AutoCaptions = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfAutoCaption, FIB->m_FibWord97.lcbSttbfAutoCaption, nWordVersion); - BookmarkAnnotNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfAtnBkmk, FIB->m_FibWord97.lcbSttbfAtnBkmk, nWordVersion, true); + BkmkProt = new StringTableEx (TableStream, FIB->m_FibWord2003.fcSttbfBkmkProt, FIB->m_FibWord2003.lcbSttbfBkmkProt, nWordVersion); + BkmkProtUser = new StringTable (TableStream, FIB->m_FibWord2003.fcSttbProtUser, FIB->m_FibWord2003.lcbSttbProtUser, nWordVersion, true); + + BkmkAnnotNames = new StringTable (TableStream, FIB->m_FibWord97.fcSttbfAtnBkmk, FIB->m_FibWord97.lcbSttbfAtnBkmk, nWordVersion, true); - // Read all needed PLCFs if (FIB->m_RgLw97.ccpFtn > 0) { - FootnoteReferenceCharactersPlex = new Plex(FootnoteDescriptor::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcffndRef, FIB->m_FibWord97.lcbPlcffndRef, nWordVersion); - IndividualFootnotesPlex = new Plex(EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcffndTxt, FIB->m_FibWord97.lcbPlcffndTxt, nWordVersion); + FootnoteReferenceCharactersPlex = new Plex(FootnoteDescriptor::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcffndRef, FIB->m_FibWord97.lcbPlcffndRef, nWordVersion); + IndividualFootnotesPlex = new Plex(EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcffndTxt, FIB->m_FibWord97.lcbPlcffndTxt, nWordVersion); } if (nWordVersion > 0 && FIB->m_FibWord97.lcbPlcPad > 0) @@ -334,8 +336,8 @@ namespace DocFileFormat if (FIB->m_RgLw97.ccpEdn > 0) { - EndnoteReferenceCharactersPlex = new Plex(EndnoteDescriptor::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfendRef, FIB->m_FibWord97.lcbPlcfendRef, nWordVersion); - IndividualEndnotesPlex = new Plex(EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfendTxt, FIB->m_FibWord97.lcbPlcfendTxt, nWordVersion); + EndnoteReferenceCharactersPlex = new Plex(EndnoteDescriptor::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfendRef, FIB->m_FibWord97.lcbPlcfendRef, nWordVersion); + IndividualEndnotesPlex = new Plex(EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfendTxt, FIB->m_FibWord97.lcbPlcfendTxt, nWordVersion); } if (FIB->m_RgLw97.ccpHdr > 0) @@ -345,8 +347,8 @@ namespace DocFileFormat if (FIB->m_RgLw97.ccpAtn > 0) { - AnnotationsReferencePlex = new Plex(AnnotationReferenceDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcfandRef, FIB->m_FibWord97.lcbPlcfandRef, nWordVersion); - IndividualCommentsPlex = new Plex (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfandTxt, FIB->m_FibWord97.lcbPlcfandTxt, nWordVersion); + AnnotationsReferencePlex = new Plex(AnnotationReferenceDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcfandRef, FIB->m_FibWord97.lcbPlcfandRef, nWordVersion); + IndividualCommentsPlex = new Plex (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfandTxt, FIB->m_FibWord97.lcbPlcfandTxt, nWordVersion); } if (FIB->m_FibWord2002.lcbAtrdExtra > 0 && AnnotationsReferencePlex) @@ -354,55 +356,74 @@ namespace DocFileFormat size_t count = AnnotationsReferencePlex->Elements.size(); AnnotationsReferencesEx = new AnnotationReferenceExDescriptors(count, TableStream, FIB->m_FibWord2002.fcAtrdExtra, FIB->m_FibWord2002.lcbAtrdExtra); } - OfficeDrawingPlex = new Plex (Spa::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcSpaMom, FIB->m_FibWord97.lcbPlcSpaMom, nWordVersion); - OfficeDrawingPlexHeader = new Plex (Spa::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcSpaHdr, FIB->m_FibWord97.lcbPlcSpaHdr, nWordVersion); + OfficeDrawingPlex = new Plex (Spa::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcSpaMom, FIB->m_FibWord97.lcbPlcSpaMom, nWordVersion); + OfficeDrawingPlexHeader = new Plex (Spa::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcSpaHdr, FIB->m_FibWord97.lcbPlcSpaHdr, nWordVersion); - TextboxIndividualPlex = new Plex (FTXBXS::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcftxbxTxt, FIB->m_FibWord97.lcbPlcftxbxTxt, nWordVersion); + TextboxIndividualPlex = new Plex (FTXBXS::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcftxbxTxt, FIB->m_FibWord97.lcbPlcftxbxTxt, nWordVersion); - SectionPlex = new Plex (SectionDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcfSed,FIB->m_FibWord97.lcbPlcfSed, nWordVersion); + SectionPlex = new Plex (SectionDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcfSed,FIB->m_FibWord97.lcbPlcfSed, nWordVersion); + + TextboxBreakPlex = new Plex (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxBkd, FIB->m_FibWord97.lcbPlcfTxbxBkd, nWordVersion); + TextboxBreakPlexHeader = new Plex (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxHdrBkd, FIB->m_FibWord97.lcbPlcfTxbxHdrBkd, nWordVersion); - BookmarkStartPlex = new Plex (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkf, FIB->m_FibWord97.lcbPlcfBkf, nWordVersion); - BookmarkEndPlex = new Plex (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkl, FIB->m_FibWord97.lcbPlcfBkl, nWordVersion); + BookmarkStartPlex = new Plex (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkf, FIB->m_FibWord97.lcbPlcfBkf, nWordVersion); + BookmarkEndPlex = new Plex (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBkl, FIB->m_FibWord97.lcbPlcfBkl, nWordVersion); - TextboxBreakPlex = new Plex (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxBkd, FIB->m_FibWord97.lcbPlcfTxbxBkd, nWordVersion); - TextboxBreakPlexHeader = new Plex (Tbkd::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfTxbxHdrBkd, FIB->m_FibWord97.lcbPlcfTxbxHdrBkd, nWordVersion); - - AnnotStartPlex = new Plex (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkf, FIB->m_FibWord97.lcbPlcfAtnBkf, nWordVersion); - AnnotEndPlex = new Plex (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkl, FIB->m_FibWord97.lcbPlcfAtnBkl, nWordVersion); + AnnotStartPlex = new Plex (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkf, FIB->m_FibWord97.lcbPlcfAtnBkf, nWordVersion); + AnnotEndPlex = new Plex (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfAtnBkl, FIB->m_FibWord97.lcbPlcfAtnBkl, nWordVersion); + + BookmarkProtStartPlex = new Plex (BookmarkFirst::STRUCTURE_SIZE, TableStream, FIB->m_FibWord2003.fcPlcfBkfProt, FIB->m_FibWord2003.lcbPlcfBkfProt, nWordVersion); + BookmarkProtEndPlex = new Plex (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord2003.fcPlcfBklProt, FIB->m_FibWord2003.lcbPlcfBklProt, nWordVersion); - for (size_t i = 0; i < BookmarkStartPlex->Elements.size(); ++i) { BookmarkFirst* pBookmark = static_cast(BookmarkStartPlex->Elements[i]); if (pBookmark) { - BookmarkStartEndCPs.push_back(std::make_pair(BookmarkStartPlex->CharacterPositions[i], BookmarkEndPlex->CharacterPositions[pBookmark->GetIndex()])); + _bmkStartEnd bmk; + bmk.start = BookmarkStartPlex->CharacterPositions[i]; + bmk.end = BookmarkEndPlex->CharacterPositions[i]; + bmk.bookmarkId = pBookmark->id; + + BookmarkStartEndCPs.push_back(bmk); } } - std::vector & bookmarks = BookmarkAnnotNames->getDataExtra(); - + std::vector & bookmarks = BkmkAnnotNames->getDataExtra(); for (size_t i = 0; AnnotStartPlex && i < AnnotStartPlex->Elements.size(); ++i) { BookmarkFirst* pBookmark = static_cast(AnnotStartPlex->Elements[i]); if (pBookmark) { - short ind = pBookmark->GetIndex(); - short bmc = *((short*)bookmarks[i]); //0x0100 always тут _UINT32 lTag = *((_UINT32*)(bookmarks[i] + 2)); if (i < AnnotStartPlex->CharacterPositions.size() - 1 ) { - _annotStartEnd ann; - ann.start = AnnotStartPlex->CharacterPositions[i]; - ann.end = AnnotEndPlex->CharacterPositions[i/* + 1*/]; - ann.bookmarkId = lTag; + _bmkStartEnd bmk; + bmk.start = AnnotStartPlex->CharacterPositions[i]; + bmk.end = AnnotEndPlex->CharacterPositions[i]; + bmk.bookmarkId = lTag; - AnnotStartEndCPs.push_back(ann); + AnnotStartEndCPs.push_back(bmk); } } } + for (size_t i = 0; BookmarkProtStartPlex && i < BookmarkProtStartPlex->Elements.size(); ++i) + { + BookmarkFirst* pBookmark = static_cast(BookmarkProtStartPlex->Elements[i]); + if (pBookmark) + { + if (i < BookmarkProtStartPlex->CharacterPositions.size() - 1) + { + _bmkStartEnd bmk; + bmk.start = BookmarkProtStartPlex->CharacterPositions[i]; + bmk.end = BookmarkProtEndPlex->CharacterPositions[i]; + bmk.bookmarkId = pBookmark->id; + BookmarkProtStartEndCPs.push_back(bmk); + } + } + } AutoTextPlex = new Plex(EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfGlsy, FIB->m_FibWord97.lcbPlcfGlsy, nWordVersion); FieldsPlex = new Plex(FieldCharacter::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfFldMom, FIB->m_FibWord97.lcbPlcfFldMom, nWordVersion); @@ -414,8 +435,8 @@ namespace DocFileFormat ListPlex = new Plex (ListNumCache::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfBteLvc, FIB->m_FibWord97.lcbPlcfBteLvc, nWordVersion); // Read the FKPs - AllPapxFkps = FormattedDiskPagePAPX::GetAllPAPXFKPs (FIB, WordDocumentStream, TableStream, DataStream); - AllChpxFkps = FormattedDiskPageCHPX::GetAllCHPXFKPs (FIB, WordDocumentStream, TableStream); + AllPapxFkps = FormattedDiskPagePAPX::GetAllPAPXFKPs (FIB, WordDocumentStream, TableStream, DataStream); + AllChpxFkps = FormattedDiskPageCHPX::GetAllCHPXFKPs (FIB, WordDocumentStream, TableStream); // Read custom tables if (TableStream) @@ -493,7 +514,7 @@ namespace DocFileFormat if ( ( bookmarkName != NULL ) && ( *bookmarkName == L"_PictureBullets" ) ) { - for (size_t j = BookmarkStartEndCPs[i].first, k = 0; j < Text->size(); ++j, ++k ) + for (size_t j = BookmarkStartEndCPs[i].start, k = 0; j < Text->size(); ++j, ++k ) { if ( Text->at( j ) == 1 ) { @@ -825,7 +846,7 @@ namespace DocFileFormat RELEASEOBJECT(AutoTextNames); RELEASEOBJECT(AutoCaptions); RELEASEOBJECT(Captions); - RELEASEOBJECT(BookmarkAnnotNames); + RELEASEOBJECT(BkmkAnnotNames); RELEASEOBJECT(AssocNames); RELEASEOBJECT(IndividualFootnotesPlex); @@ -863,6 +884,10 @@ namespace DocFileFormat RELEASEOBJECT(listFormatOverrideTable); RELEASEOBJECT(headerAndFooterTable); RELEASEOBJECT(encryptionHeader); + RELEASEOBJECT(BkmkProt); + RELEASEOBJECT(BkmkProtUser); + RELEASEOBJECT(BookmarkProtStartPlex); + RELEASEOBJECT(BookmarkProtEndPlex); RELEASEOBJECT(m_pStorage); RELEASEOBJECT(officeArtContent); diff --git a/MsBinaryFile/DocFile/WordDocument.h b/MsBinaryFile/DocFile/WordDocument.h index 11347da8fc..db7328bd2f 100644 --- a/MsBinaryFile/DocFile/WordDocument.h +++ b/MsBinaryFile/DocFile/WordDocument.h @@ -169,17 +169,20 @@ namespace DocFileFormat std::map * AllSepx; // The value is the SEPX that formats the section. std::vector * AllPapxVector;// A vector to quick find in AllPapx - std::map PictureBulletsCPsMap; + std::map PictureBulletsCPsMap; - struct _annotStartEnd + struct _bmkStartEnd { int start; int end; _UINT32 bookmarkId; }; - std::vector> BookmarkStartEndCPs; - std::vector<_annotStartEnd> AnnotStartEndCPs; - std::map mapCommentsBookmarks; + std::vector<_bmkStartEnd> BookmarkStartEndCPs; + std::vector<_bmkStartEnd> BookmarkProtStartEndCPs; + std::vector<_bmkStartEnd> AnnotStartEndCPs; + + std::map mapAnnotBookmarks; //id, index + std::map mapProtBookmarks; FileInformationBlock * FIB; StyleSheet * Styles; // The style sheet of the document @@ -197,9 +200,12 @@ namespace DocFileFormat StringTable *BookmarkNames; StringTable *AutoTextNames; StringTable *AssocNames; - StringTable *BookmarkAnnotNames; + StringTable *BkmkAnnotNames; StringTable *Captions; StringTable *AutoCaptions; + + StringTableEx *BkmkProt; + StringTable *BkmkProtUser; Plex *IndividualFootnotesPlex; //A plex of locations of individual footnotes Plex *FootnoteReferenceCharactersPlex; //A plex of footnote reference characters @@ -226,6 +232,9 @@ namespace DocFileFormat Plex *AnnotStartPlex; Plex *AnnotEndPlex; + Plex *BookmarkProtStartPlex; + Plex *BookmarkProtEndPlex; + Plex *ListPlex; Plex *FieldsPlex; Plex *FootnoteDocumentFieldsPlex; @@ -235,6 +244,7 @@ namespace DocFileFormat Plex *AnnotationsReferencePlex; Plex *AutoTextPlex; + AnnotationReferenceExDescriptors *AnnotationsReferencesEx; //------------------------------------------------------------------------------ void CorrectColor(ODRAW::OfficeArtCOLORREF & color);