Files
core/ASCOfficeDocFile/DocDocxConverter/DocumentProperties.cpp
2018-04-03 15:28:08 +03:00

813 lines
41 KiB
C++

/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "DocumentProperties.h"
namespace DocFileFormat
{
WordDocumentProperties::~WordDocumentProperties()
{
RELEASEOBJECT( doptypography );
RELEASEOBJECT( dogrid );
RELEASEOBJECT( asumyi );
}
/*========================================================================================================*/
WordDocumentProperties::WordDocumentProperties(FileInformationBlock* fib, POLE::Stream* tableStream) :
doptypography(NULL), dogrid(NULL), asumyi(NULL), bDisplayBackgroundShape(false)
{
Initialize();
VirtualStreamReader tStream( tableStream, fib->m_FibWord97.fcDop, fib->m_nWordVersion);
//setDefaultCompatibilityOptions( fib->m_FibBase.nFib );
unsigned int size = fib->m_FibWord97.lcbDop;
unsigned char* bytes = NULL;
try
{
if (fib->m_nWordVersion == 2)
{
unsigned char* Temp = tStream.ReadBytes(size, true);
tStream.Seek(fib->m_FibWord97.fcDop, 0);
delete []Temp;
unsigned char flags1 = tStream.ReadByte();
fFacingPages = GETBIT(flags1, 0);
fWindowControl = GETBIT(flags1, 1);
Fpc = GETBITS(flags1, 5, 6);
bool fWide = GETBIT(flags1, 7);
grpfIhdt = tStream.ReadByte();
unsigned short flags2 = tStream.ReadUInt16();
rncFtn = GETBIT(flags2, 0);
nFtn = GETBITS(flags2, 1, 15);
unsigned char irmBar = tStream.ReadByte();
unsigned char flags3 = tStream.ReadByte();
unsigned char irmProps = GETBITS(flags3, 0, 6);
fRevMarking = GETBIT(flags3, 7);
unsigned short flags4 = tStream.ReadUInt16();
fBackup = GETBIT(flags4, 0);
fExactWords = GETBIT(flags4, 1);
fPagHidden = GETBIT(flags4, 2);
fPagResults = GETBIT(flags4, 3);
fLockAtn = GETBIT(flags4, 4);
fMirrorMargins = GETBIT(flags4, 5);
bool fKeepFileFormat = GETBIT(flags4, 6);
fDflttrueType = GETBIT(flags4, 7);
fPagSuppressTopSpacing = GETBIT(flags4, 8);
fMaybeRTLTables = GETBIT(flags4, 9);
bool fSpares = tStream.ReadUInt16();
dxaTab = tStream.ReadUInt16();
wSpare = tStream.ReadUInt16();//ftcDefaultBi
dxaHotZ = tStream.ReadUInt16();
wSpare2 = tStream.ReadUInt16();
wSpare3 = tStream.ReadUInt16();
dttmCreated = DateAndTime( tStream.ReadUInt32() );
dttmRevised = DateAndTime( tStream.ReadUInt32() );
dttmLastPrint = DateAndTime( tStream.ReadUInt32() );
nRevision = tStream.ReadUInt16();
tmEdited = tStream.ReadUInt32();
cWords = tStream.ReadUInt32();
cCh = tStream.ReadUInt32();
cPg = tStream.ReadUInt16();
unsigned short rgwSpareDocSum[2];
rgwSpareDocSum[0] = tStream.ReadUInt16();
rgwSpareDocSum[1] = tStream.ReadUInt16();
}
else if ( size > 0 )
{
bytes = tStream.ReadBytes( size, true );
fFacingPages = FormatUtils::GetBitFromBytes( bytes, 2, 0 );
fWindowControl = FormatUtils::GetBitFromBytes( bytes, 2, 1 );
fPMHMainDoc = FormatUtils::GetBitFromBytes( bytes, 2, 2 );
grfSuppression = (short)FormatUtils::GetUIntFromBytesBits( bytes, 2, 3, 2 );
Fpc = (short)FormatUtils::GetUIntFromBytesBits( bytes, 2, 5, 2 );
grpfIhdt = FormatUtils::BytesToUChar( bytes, 1, size );
rncFtn = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 2 ), 2, 0, 2 );
nFtn = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 2 ), 2, 2, 14 );
fOutlineDirtySave = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 0 );
fOnlyMacPics = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 8 );
fOnlyWinPics = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 9 );
fLabelDoc = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 10 );
fHyphCapitals = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 11 );
fAutoHyphen = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 12 );
fFormNoFields = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 13 );
fLinkStyles = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 14 );
fRevMarking = FormatUtils::GetBitFromBytes( ( bytes + 4 ), 2, 15 );
fBackup = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 0 );
fExactWords = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 1 );
fPagHidden = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 2 );
fPagResults = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 3 );
fLockAtn = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 4 );
fMirrorMargins = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 5 );
fDflttrueType = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 7 );
fProtEnabled = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 8 );
fDispFormFldSel = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 9 );
fRMView = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 10 );
fRMPrint = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 11 );
fLockRev = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 14 );
fEmbedFonts = FormatUtils::GetBitFromBytes( ( bytes + 6 ), 2, 15 );
fNoTabForInd = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 0 );
fNoSpaceRaiseLower = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 1 );
fSuppressSpbfAfterPageBreak = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 2 );
fWrapTrailSpaces = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 3 );
fMapPrintTextColor = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 4 );
fNoColumnBalance = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 5 );
fConvMailMergeEsc = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 6 );
fSuppressTopSpacing = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 7 );
fOrigWordTableRules = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 8 );
fTransparentMetafiles = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 9 );
fShowBreaksInFrames = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 10 );
fSwapBordersFacingPgs = FormatUtils::GetBitFromBytes( ( bytes + 8 ), 2, 11 );
dxaTab = FormatUtils::BytesToUInt16( bytes, 10, size );
dxaHotZ = FormatUtils::BytesToUInt16( bytes, 14, size );
cConsecHypLim = FormatUtils::BytesToUInt16( bytes, 16, size );
unsigned char createdbytes[4];
memcpy( createdbytes, ( bytes + 20 ), 4 );
dttmCreated = DateAndTime( createdbytes, 4 );
unsigned char revisedbytes[4];
memcpy( revisedbytes, ( bytes + 24 ), 4 );
dttmRevised = DateAndTime( revisedbytes, 4 );
unsigned char printbytes[4];
memcpy( printbytes, ( bytes + 28 ), 4 );
dttmLastPrint = DateAndTime( printbytes, 4 );
nRevision = FormatUtils::BytesToInt16( bytes, 32, size );
tmEdited = FormatUtils::BytesToInt32( bytes, 34, size );
cWords = FormatUtils::BytesToInt32( bytes, 38, size );
cCh = FormatUtils::BytesToInt32( bytes, 42, size );
cPg = FormatUtils::BytesToInt16( bytes, 46, size );
cParas = FormatUtils::BytesToInt32( bytes, 48, size );
rncEdn = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 52 ), 2, 0, 2 );
nEdn = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 52 ), 2, 2, 14 );
Epc = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 54 ), 2, 0, 2 );
nfcFtnRef = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 54 ), 2, 2, 4 );
nfcEdnRef = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 54 ), 2, 6, 4 );
fPrintFormData = FormatUtils::GetBitFromBytes( ( bytes + 54 ), 2, 10 );
fSaveFormData = FormatUtils::GetBitFromBytes( ( bytes + 54 ), 2, 11 );
fShadeFormData = FormatUtils::GetBitFromBytes( ( bytes + 54 ), 2, 12 );
fWCFtnEdn = FormatUtils::GetBitFromBytes( ( bytes + 54 ), 2, 15 );
cLines = FormatUtils::BytesToInt32( bytes, 56, size );
cWordsFtnEdn = FormatUtils::BytesToInt32( bytes, 60, size );
cChFtnEdn = FormatUtils::BytesToInt32( bytes, 64, size );
cPgFtnEdn = FormatUtils::BytesToInt16( bytes, 68, size );
cParasFtnEdn = FormatUtils::BytesToInt32( bytes, 70, size );
cLinesFtnEdn = FormatUtils::BytesToInt32( bytes, 74, size );
lKeyProtDoc = FormatUtils::BytesToInt32( bytes, 78, size );
wvkSaved = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 82 ), 2, 0, 3 );
wScaleSaved = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 82 ), 2, 3, 9 );
zkSaved = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 82 ), 2, 12, 2 );
fRotateFontW6 = FormatUtils::GetBitFromBytes( ( bytes + 82 ), 2, 14 );
iGutterPos = FormatUtils::GetBitFromBytes( ( bytes + 82 ), 2, 15 );
//compatibility options section
if ( size > 84 )
{
fNoTabForInd = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 0 );
fNoSpaceRaiseLower = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 1 );
fSuppressSpbfAfterPageBreak = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 2 );
fWrapTrailSpaces = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 3 );
fMapPrintTextColor = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 4 );
fNoColumnBalance = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 5 );
fConvMailMergeEsc = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 6 );
fSuppressTopSpacing = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 7 );
fOrigWordTableRules = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 8 );
fTransparentMetafiles = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 9 );
fShowBreaksInFrames = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 10 );
fSwapBordersFacingPgs = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 11 );
fSuppressTopSpacingMac5 = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 16 );
fTruncDxaExpand = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 17 );
fPrintBodyBeforeHdr = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 18 );
fNoLeading = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 19 );
fMWSmallCaps = FormatUtils::GetBitFromBytes( ( bytes + 84 ), 4, 21 );
if ( size > 88 )
{
adt = FormatUtils::BytesToUInt16( bytes, 88, size );
unsigned char doptypoBytes[310];
memcpy( doptypoBytes, ( bytes + 90 ), 310 );
doptypography = new DocumentTypographyInfo( doptypoBytes, 310 );
unsigned char dogridBytes[10];
memcpy( dogridBytes, ( bytes + 400 ), 10 );
dogrid = new DrawingObjectGrid( dogridBytes, 10 );
lvl = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 410 ), 2, 1, 4 );
fGramAllDone = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 5 );
fGramAllClean = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 6 );
fSubsetFonts = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 7 );
fHideLastVersion = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 8 );
fHtmlDoc = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 9 );
fSnapBorder = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 11 );
fIncludeHeader = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 12 );
fIncludeFooter = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 13 );
fForcePageSizePag = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 14 );
fMinFontSizePag = FormatUtils::GetBitFromBytes( ( bytes + 410 ), 2, 15 );
fHaveVersions = FormatUtils::GetBitFromBytes( ( bytes + 412 ), 2, 0 );
fAutoVersion = FormatUtils::GetBitFromBytes( ( bytes + 412 ), 2, 1 );
unsigned char asumybits[12];
memcpy( asumybits, ( bytes + 414 ), 12 );
asumyi = new AutoSummaryInfo( asumybits, 12 );
cChWS = FormatUtils::BytesToInt32( bytes, 426, size );
cChWSFtnEdn = FormatUtils::BytesToInt32( bytes, 430, size );
grfDocEvents = FormatUtils::BytesToInt32( bytes, 434, size );
fVirusPromted = FormatUtils::GetBitFromBytes( ( bytes + 438 ), 4, 0 );
fVirusLoadSafe = FormatUtils::GetBitFromBytes( ( bytes + 438 ), 4, 1 );
KeyVirusSession30 = (int)FormatUtils::GetUIntFromBytesBits( ( bytes + 438 ), 4, 2, 30 );
cDBC = FormatUtils::BytesToInt32( bytes, 480, size );
cDBCFtnEdn = FormatUtils::BytesToInt32( bytes, 484, size );
nfcEdnRef = FormatUtils::BytesToInt16( bytes, 492, size );
nfcFtnRef = FormatUtils::BytesToInt16( bytes, 494, size );
hpsZoonFontPag = FormatUtils::BytesToInt16( bytes, 496, size );
dywDispPag = FormatUtils::BytesToInt16( bytes, 498, size );
//WORD 2000, 2002, 2003 PART
if ( size > 500/* && fib->m_FibNew.nFibNew > Fib1997*/)
{
ilvlLastBulletMain = bytes[500];
ilvlLastNumberMain = bytes[501];
istdClickTypePara = FormatUtils::BytesToInt16( bytes, 502, size );
fLADAllDone = FormatUtils::GetBitFromBytes( ( bytes + 504 ), 2, 0 );
fEnvelopeVis = FormatUtils::GetBitFromBytes( ( bytes + 504 ), 2, 1 );
fMaybeTentativeListInDoc = FormatUtils::GetBitFromBytes( ( bytes + 504 ), 2, 2 );
fMaybeFitText = FormatUtils::GetBitFromBytes( ( bytes + 504 ), 2, 3 );
fRelyOnCss_WebOpt = FormatUtils::GetBitFromBytes( ( bytes + 504 ), 2, 9 );
fRelyOnVML_WebOpt = FormatUtils::GetBitFromBytes( ( bytes + 504 ), 2, 10 );
fAllowPNG_WebOpt = FormatUtils::GetBitFromBytes( ( bytes + 504 ), 2, 11 );
screenSize_WebOpt = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 504 ), 2, 12, 4 );
fOrganizeInFolder_WebOpt = FormatUtils::GetBitFromBytes( ( bytes + 506 ), 2, 0 );
fUseLongFileNames_WebOpt = FormatUtils::GetBitFromBytes( ( bytes + 506 ), 2, 1 );
iPixelsPerInch_WebOpt = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 506 ), 2, 2, 10 );
fWebOptionsInit = FormatUtils::GetBitFromBytes( ( bytes + 506 ), 2, 12 );
fMaybeFEL = FormatUtils::GetBitFromBytes( ( bytes + 506 ), 2, 13 );
fCharLineUnits = FormatUtils::GetBitFromBytes( ( bytes + 506 ), 2, 14 );
fMaybeRTLTables = FormatUtils::GetBitFromBytes( ( bytes + 506 ), 2, 15 );
fNoTabForInd = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 0 );
fNoSpaceRaiseLower = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 1 );
fSuppressSpbfAfterPageBreak = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 2 );
fWrapTrailSpaces = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 3 );
fMapPrintTextColor = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 4 );
fNoColumnBalance = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 5 );
fConvMailMergeEsc = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 6 );
fSuppressTopSpacing = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 7 );
fOrigWordTableRules = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 8 );
fTransparentMetafiles = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 9 );
fShowBreaksInFrames = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 10 );
fSwapBordersFacingPgs = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 11 );
fLeaveBackslashAlone = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 12 );
fExpShRtn = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 13 );
fDntULTrlSpc = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 14 );
fDntBlnSbDbWid = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 15 );
fSuppressTopSpacingMac5 = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 16 );
fTruncDxaExpand = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 17 );
fPrintBodyBeforeHdr = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 18 );
fNoLeading = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 19 );
fMakeSpaceForUL = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 20 );
fMWSmallCaps = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 21 );
f2ptExtLeadingOnly = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 22 );
fTruncFontHeight = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 23 );
fSubOnSize = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 24 );
fLineWrapLikeWord6 = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 25 );
fWW6BorderRules = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 26 );
fExactOnTop = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 27 );
fExtraAfter = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 28 );
fWPSpace = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 29 );
fWPJust = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 30 );
fPrintMet = FormatUtils::GetBitFromBytes( ( bytes + 508 ), 4, 31 );
//split bytes 512,513,514,515 into bits
fSpLayoutLikeWW8 = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 0 );
fFtnLayoutLikeWW8 = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 1 );
fDontUseHTMLParagraphAutoSpacing = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 2 );
fDontAdjustLineHeightInTable = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 3 );
fForgetLastTabAlign = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 4 );
fUseAutoSpaceForFullWidthAlpha = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 5 );
fAlignTablesRowByRow = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 6 );
fLayoutRawTableWidth = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 7 );
fLayoutTableRowsApart = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 8 );
fUserWord97LineBreakingRules = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 9 );
fDontBreakWrappedTables = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 10 );
fDontSnapToGridInCell = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 11 );
fDontAllowFieldEndSelect = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 12 );
fApplyBreakingRules = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 13 );
fDontWrapTextWithPunct = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 14 );
fDontUseAsianBreakRules = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 15 );
fUseWord2002TableStyleRules = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 16 );
fGrowAutofit = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 17 );
fUseNormalStyleForList = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 18 );
fDontUseIndentAsNumberingTabStop = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 19 );
fFELineBreak11 = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 20 );
fAllowSpaceOfSameStyleInTable = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 21 );
fWW11IndentRules = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 22 );
fDontAutofitConstrainedTables = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 23 );
fAutofitLikeWW11 = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 24 );
fUnderlineTabInNumList = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 25 );
fHangulWidthLikeWW11 = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 26 );
fSplitPgBreakAndParaMark = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 27 );
fDontVertAlignCellWithSp = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 28 );
fDontBreakConstrainedForcedTables = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 29 );
fDontVertAlignInTxbx = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 30 );
fWord11KerningPairs = FormatUtils::GetBitFromBytes( ( bytes + 512 ), 4, 31 );
fCachedColBalance = FormatUtils::GetBitFromBytes( ( bytes + 516 ), 4, 0 );
//bytes 517-539 are unused
verCompatPreW10 = (unsigned short)FormatUtils::GetUIntFromBytesBits( ( bytes + 540 ), 4, 0, 16 );
fNoMargPgvwSaved = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 16 );
fNoMargPgvWPag = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 17 );
fWebViewPag = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 18 );
fSeeDrawingsPag = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 19 );
fBulletProofed = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 20 );
fCorrupted = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 21 );
fSaveUim = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 22 );
fFilterPrivacy = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 23 );
fInFReplaceNoRM = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 24 );
fSeenRepairs = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 25 );
fHasXML = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 26 );
fSeeScriptAnchorsPag = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 27 );
fValidateXML = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 28 );
fSaveIfInvalidXML = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 29 );
fShowXMLErrors = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 30 );
fAlwaysMergeEmptyNamespace = FormatUtils::GetBitFromBytes( ( bytes + 540 ), 4, 31 );
if ( size > 544/* && fib->m_FibNew.nFibNew > Fib2000*/)
{
cpMaxListCacheMainDoc = FormatUtils::BytesToInt32( bytes, 544, size ); //unused
//split bytes 548,549 into bits
fDoNotEmbedSystemFont = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 0 );
fWordCompact = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 1 );
fLiveRecover = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 2 );
fEmbedFactoids = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 3 );
fFactoidXML = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 4 );
fFactoidAllDone = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 5 );
fFolioPrint = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 6 );
fReverseFolio = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 7 );
iTextLineEnding = (short)FormatUtils::GetUIntFromBytesBits( ( bytes + 548 ), 2, 8, 3 );
fHideFcc = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 11 );
fAcetateShowMarkup = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 12 );
fAcetateShowAtn = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 13 );
fAcetateShowInsDel = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 14 );
fAcetateShowProps = FormatUtils::GetBitFromBytes( ( bytes + 548 ), 2, 15 );
istdTableDflt = FormatUtils::BytesToUInt16( bytes, 550, size );
verCompat = FormatUtils::BytesToUInt16( bytes, 552, size );
grfFmtFilter = FormatUtils::BytesToUInt16( bytes, 554, size );
iFolioPages = FormatUtils::BytesToInt16 ( bytes, 556, size );
cpgText = FormatUtils::BytesToUInt16( bytes, 558, size );
cpMinRMText = FormatUtils::BytesToInt32 ( bytes, 560, size );
cpMinRMFtn = FormatUtils::BytesToInt32 ( bytes, 564, size );
cpMinRMHdd = FormatUtils::BytesToInt32 ( bytes, 568, size );
cpMinRMAtn = FormatUtils::BytesToInt32 ( bytes, 572, size );
cpMinRMEdn = FormatUtils::BytesToInt32 ( bytes, 576, size );
cpMinRMTxbx = FormatUtils::BytesToInt32 ( bytes, 580, size );
cpMinRMHdrTxbx = FormatUtils::BytesToInt32 ( bytes, 584, size );
rsidRoot = FormatUtils::BytesToInt32 ( bytes, 588, size );
//unused 2
if ( size > 594/* && fib->m_FibNew.nFibNew > Fib2002*/)
{
//split bytes 592,593,594,595 into bits
fTreatLockAtnAsReadOnly = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 0 );
fStyleLock = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 1 );
fAutoFmtOverride = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 2 );
fRemoveWordML = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 3 );
fApplyCustomXForm = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 4 );
fStyeLockEnforced = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 5 );
fFakeLockAtn = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 6 );
fIgnoreMixedContent = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 7 );
fShowPlaceholderText = FormatUtils::GetBitFromBytes( ( bytes + 592 ), 4, 8 );
grf = FormatUtils::GetUIntFromBytesBits( ( bytes + 592 ), 4, 9, 23 );
//split bytes 596 and 597 into bits
fReadingModeInkLockDown = FormatUtils::GetBitFromBytes( ( bytes + 596 ), 2, 0 );
fAcetateShowInkAtn = FormatUtils::GetBitFromBytes( ( bytes + 596 ), 2, 1 );
fFilterDttm = FormatUtils::GetBitFromBytes( ( bytes + 596 ), 2, 2 );
fEnforceDocProt = FormatUtils::GetBitFromBytes( ( bytes + 596 ), 2, 3 );
iDocProtCur = (unsigned short)FormatUtils::GetUIntFromBytesBits( ( bytes + 596 ), 2, 4, 3 );
fDispBkSpSaved = FormatUtils::GetBitFromBytes( ( bytes + 596 ), 2, 7 );
dxaPageLock = FormatUtils::BytesToInt16( bytes, 598, size );
dyaPageLock = FormatUtils::BytesToInt16( bytes, 600, size );
pctFontLock = FormatUtils::BytesToInt32( bytes, 602, size );
grfitbid = bytes[606];
//unsigned char 607 is unused
ilfoMacAtCleanup = FormatUtils::BytesToUInt16( bytes, 608, size );
if ( size > 616/* && fib->m_FibNew.nFibNew > Fib2003*/)
{
//4 bytes reserved
bool fRMTrackFormatting = FormatUtils::GetBitFromBytes( ( bytes + 620 ), 2, 0 );
bool fRMTrackMoves = FormatUtils::GetBitFromBytes( ( bytes + 620 ), 2, 1 );
//dopMth = 34 bytes from 624 = 658
if ( size > 674/* && fib->m_FibNew.nFibNew > Fib2007*/)
{
if ( size > 690/* && fib->m_FibNew.nFibNew > Fib2010*/)
{
}
}
}
}
}
}
}
}
}
}
catch (/*Exception*/...)
{
}
RELEASEARRAYOBJECTS( bytes );
}
void WordDocumentProperties::setDefaultCompatibilityOptions( FibVersion nFib )
{
if( nFib == Fib1997 )
{
//Word 97 default settings
fAlignTablesRowByRow = true;
fLayoutTableRowsApart = true;
fGrowAutofit = true;
fDontWrapTextWithPunct = true;
//ToDo: Don't autofit tables next to wrapped objects
//ToDo: Don't break constrained tables forced onto the page
fDontBreakWrappedTables = true;
fDontSnapToGridInCell = true;
fDontUseAsianBreakRules = true;
fNoTabForInd = true;
fDontUseHTMLParagraphAutoSpacing = true;
fForgetLastTabAlign = true;
fSpLayoutLikeWW8 = true;
fFtnLayoutLikeWW8 = true;
fLayoutRawTableWidth = true;
fDontAllowFieldEndSelect = true;
//ToDo: underline characters in numbered lists
fUseWord2002TableStyleRules = true;
fUserWord97LineBreakingRules = true;
}
else if ( nFib == Fib2000 )
{
//Word 2000 default settings
fGrowAutofit = true;
fDontWrapTextWithPunct = true;
//ToDo: Don't autofit tables next to wrapped objects
fDontBreakWrappedTables = true;
fDontSnapToGridInCell = true;
fDontUseAsianBreakRules = true;
fNoTabForInd = true;
fDontAllowFieldEndSelect = true;
//ToDo: underline characters in numbered lists
fUseWord2002TableStyleRules = true;
}
else if( nFib == Fib2002 )
{
//Word 2002 (XP)
fGrowAutofit = true;
//ToDo: Don't autofit tables next to wrapped objects
fDontBreakWrappedTables = true;
fNoTabForInd = true;
fUseWord2002TableStyleRules = true;
}
else if ( nFib == Fib2003 )
{
//Word 2003
//ToDo: Don't autofit tables next to wrapped objects
fDontBreakWrappedTables = true;
fNoTabForInd = true;
}
else if ( nFib < Fib1997 )
{
//throw new UnspportedFileVersionException();
}
}
void WordDocumentProperties::Initialize()
{
fFacingPages = false;
fWindowControl = false;
fPMHMainDoc = false;
grfSuppression = 0;
Fpc = 0;
grpfIhdt = 0;
rncFtn = 0;
nFtn = 0;
fOutlineDirtySave = false;
fOnlyMacPics = false;
fOnlyWinPics = false;
fLabelDoc = false;
fHyphCapitals = false;
fAutoHyphen = false;
fFormNoFields = false;
fLinkStyles = false;
fRevMarking = false;
fBackup = false;
fExactWords = false;
fPagHidden = false;
fPagResults = false;
fLockAtn = false;
fMirrorMargins = false;
fDflttrueType = false;
fPagSuppressTopSpacing = false;
fProtEnabled = false;
fDispFormFldSel = false;
fRMView = false;
fRMPrint = false;
fLockRev = false;
fEmbedFonts = false;
fNoTabForInd = false;
fNoSpaceRaiseLower = false;
fSuppressSpbfAfterPageBreak = false;
fWrapTrailSpaces = false;
fMapPrintTextColor = false;
fNoColumnBalance = false;
fConvMailMergeEsc = false;
fSuppressTopSpacing = false;
fOrigWordTableRules = false;
fTransparentMetafiles = false;
fShowBreaksInFrames = false;
fSwapBordersFacingPgs = false;
dxaTab = 0;
wSpare = 0;
wSpare3 = 0;
dxaHotZ = 0;
cConsecHypLim = 0;
wSpare2 = 0;
nRevision = 0;
tmEdited = 0;
cWords = 0;
cCh = 0;
cPg = 0;
cParas = 0;
rncEdn = 0;
nEdn = 0;
Epc = 0;
nfcFtnRef = 0;
nfcEdnRef = 0;
fPrintFormData = false;
fSaveFormData = false;
fShadeFormData = false;
fWCFtnEdn = false;
cLines = 0;
cWordsFtnEdn = 0;
cChFtnEdn = 0;
cPgFtnEdn = 0;
cParasFtnEdn = 0;
cLinesFtnEdn = 0;
lKeyProtDoc = 0;
wvkSaved = 0;
wScaleSaved = 0;
zkSaved = 0;
fRotateFontW6 = false;
iGutterPos = false;
fSuppressTopSpacingMac5 = false;
fTruncDxaExpand = false;
fPrintBodyBeforeHdr = false;
fNoLeading = false;
fMWSmallCaps = false;
adt = 0;
doptypography = NULL;
dogrid = NULL;
lvl = 0;
fGramAllDone = false;
fGramAllClean = false;
fSubsetFonts = false;
fHideLastVersion = false;
fHtmlDoc = false;
fSnapBorder = false;
fIncludeHeader = false;
fIncludeFooter = false;
fForcePageSizePag = false;
fMinFontSizePag = false;
fHaveVersions = false;
fAutoVersion = false;
asumyi = NULL;
cChWS = 0;
cChWSFtnEdn = 0;
grfDocEvents = 0;
fVirusPromted = false;
fVirusLoadSafe = false;
KeyVirusSession30 = 0;
cDBC = 0;
cDBCFtnEdn = 0;
hpsZoonFontPag = 0;
dywDispPag = 0;
ilvlLastBulletMain = 0;
ilvlLastNumberMain = 0;
istdClickTypePara = 0;
fLADAllDone = false;
fEnvelopeVis = false;
fMaybeTentativeListInDoc = false;
fMaybeFitText = false;
fRelyOnCss_WebOpt = false;
fRelyOnVML_WebOpt = false;
fAllowPNG_WebOpt = false;
screenSize_WebOpt = 0;
fOrganizeInFolder_WebOpt = false;
fUseLongFileNames_WebOpt = false;
iPixelsPerInch_WebOpt = 0;
fWebOptionsInit = false;
fMaybeFEL = false;
fCharLineUnits = false;
fMaybeRTLTables = false;
fLeaveBackslashAlone = false;
fExpShRtn = false;
fDntULTrlSpc = false;
fDntBlnSbDbWid = false;
fMakeSpaceForUL = false;
f2ptExtLeadingOnly = false;
fTruncFontHeight = false;
fSubOnSize = false;
fLineWrapLikeWord6 = false;
fWW6BorderRules = false;
fExactOnTop = false;
fExtraAfter = false;
fWPSpace = false;
fWPJust = false;
fPrintMet = false;
fSpLayoutLikeWW8 = false;
fFtnLayoutLikeWW8 = false;
fDontUseHTMLParagraphAutoSpacing = false;
fDontAdjustLineHeightInTable = false;
fForgetLastTabAlign = false;
fUseAutoSpaceForFullWidthAlpha = false;
fAlignTablesRowByRow = false;
fLayoutRawTableWidth = false;
fLayoutTableRowsApart = false;
fUserWord97LineBreakingRules = false;
fDontBreakWrappedTables = false;
fDontSnapToGridInCell = false;
fDontAllowFieldEndSelect = false;
fApplyBreakingRules = false;
fDontWrapTextWithPunct = false;
fDontUseAsianBreakRules = false;
fUseWord2002TableStyleRules = false;
fGrowAutofit = false;
fUseNormalStyleForList = false;
fDontUseIndentAsNumberingTabStop = false;
fFELineBreak11 = false;
fAllowSpaceOfSameStyleInTable = false;
fWW11IndentRules = false;
fDontAutofitConstrainedTables = false;
fAutofitLikeWW11 = false;
fUnderlineTabInNumList = false;
fHangulWidthLikeWW11 = false;
fSplitPgBreakAndParaMark = false;
fDontVertAlignCellWithSp = false;
fDontBreakConstrainedForcedTables = false;
fDontVertAlignInTxbx = false;
fWord11KerningPairs = false;
fCachedColBalance = false;
verCompatPreW10 = 0;
fNoMargPgvwSaved = false;
fNoMargPgvWPag = false;
fWebViewPag = false;
fSeeDrawingsPag = false;
fBulletProofed = false;
fCorrupted = false;
fSaveUim = false;
fFilterPrivacy = false;
fInFReplaceNoRM = false;
fSeenRepairs = false;
fHasXML = false;
fSeeScriptAnchorsPag = false;
fValidateXML = false;
fSaveIfInvalidXML = false;
fShowXMLErrors = false;
fAlwaysMergeEmptyNamespace = false;
cpMaxListCacheMainDoc = 0;
fDoNotEmbedSystemFont = false;
fWordCompact = false;
fLiveRecover = false;
fEmbedFactoids = false;
fFactoidXML = false;
fFactoidAllDone = false;
fFolioPrint = false;
fReverseFolio = false;
iTextLineEnding = false;
fHideFcc = false;
fAcetateShowMarkup = false;
fAcetateShowAtn = false;
fAcetateShowInsDel = false;
fAcetateShowProps = false;
istdTableDflt = 0;
verCompat = 0;
grfFmtFilter = 0;
iFolioPages = 0;
cpgText = 0;
cpMinRMText = 0;
cpMinRMFtn = 0;
cpMinRMHdd = 0;
cpMinRMAtn = 0;
cpMinRMEdn = 0;
cpMinRMTxbx = 0;
cpMinRMHdrTxbx = 0;
rsidRoot = 0;
fTreatLockAtnAsReadOnly = false;
fStyleLock = false;
fAutoFmtOverride = false;
fRemoveWordML = false;
fApplyCustomXForm = false;
fStyeLockEnforced = false;
fFakeLockAtn = false;
fIgnoreMixedContent = false;
fShowPlaceholderText = false;
grf = 0;
fReadingModeInkLockDown = false;
fAcetateShowInkAtn = false;
fFilterDttm = false;
fEnforceDocProt = false;
iDocProtCur = 0;
fDispBkSpSaved = false;
dxaPageLock = 0;
dyaPageLock = 0;
pctFontLock = 0;
grfitbid = 0;
ilfoMacAtCleanup = 0;
}
}
//кодировка 1251