Compare commits

...

13 Commits

Author SHA1 Message Date
cd12777c68 up 2017-06-22 18:27:00 +03:00
0708c1f45a . 2017-06-22 12:32:00 +03:00
ee577e629a DocFormat - fix user file 2017-06-21 19:50:02 +03:00
f230dc2555 add binary test (file as resource) 2017-06-21 18:36:06 +03:00
11c9d74e68 fix bug #35161 2017-06-21 17:16:00 +03:00
d61a955c38 . 2017-06-20 19:04:55 +03:00
acfb96e3c3 . 2017-06-20 17:53:11 +03:00
d2e3cc47f2 . 2017-06-20 17:16:27 +03:00
4f2f164af9 XlsFormat - pivot tables records 2017-06-20 14:09:53 +03:00
8addd6cb04 XlsFormat - pivot table records 2017-06-20 12:50:57 +03:00
92cda5bc80 fix bug #35146 2017-06-20 12:48:48 +03:00
1a377d8738 . 2017-06-20 10:53:21 +03:00
ed3e107db5 XlsFormatReader - pivot tables records 2017-06-19 19:31:46 +03:00
137 changed files with 1620 additions and 674 deletions

View File

@ -507,9 +507,9 @@ namespace DocFileFormat
class FileInformationBlock
{
public:
bool m_bOlderVersion;
int m_CodePage;
FibBase m_FibBase;
bool m_bOlderVersion;
int m_CodePage;
FibBase m_FibBase;
RgW97 m_RgW97;
RgLw97 m_RgLw97;

View File

@ -0,0 +1,60 @@
/*
* (c) Copyright Ascensio System SIA 2010-2017
*
* 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
*
*/
#pragma once
#include "RegularContainer.h"
namespace DocFileFormat
{
class OfficeArtFRITContainer: public RegularContainer
{
public:
static const unsigned short TYPE_CODE_0xF118 = 0xF118;
OfficeArtFRITContainer () : RegularContainer()
{
}
OfficeArtFRITContainer (IBinaryReader* _reader, unsigned int size, unsigned int typeCode, unsigned int version, unsigned int instance) : RegularContainer (_reader, size, typeCode, version, instance)
{
}
virtual ~OfficeArtFRITContainer()
{
}
virtual Record* NewObject (IBinaryReader* _reader, unsigned int bodySize, unsigned int typeCode, unsigned int version, unsigned int instance)
{
return new OfficeArtFRITContainer( _reader, bodySize, typeCode, version, instance );
}
};
}

View File

@ -50,6 +50,7 @@
#include "GroupShapeRecord.h"
#include "OfficeArtClientTextbox.h"
#include "UnknownRecord.h"
#include "OfficeArtFRITContainer.h"
namespace DocFileFormat
{
@ -135,6 +136,7 @@ namespace DocFileFormat
case GroupContainer::TYPE_CODE_0xF003 : return new GroupContainer();
case GroupShapeRecord::TYPE_CODE_0xF009 : return new GroupShapeRecord ();
case OfficeArtClientTextbox::TYPE_CODE_0xF00D : return new OfficeArtClientTextbox ();
case OfficeArtFRITContainer::TYPE_CODE_0xF118 : return new OfficeArtFRITContainer ();
default:
return new UnknownRecord();

View File

@ -247,9 +247,8 @@ namespace DocFileFormat
{
freeform = false;
m_pXmlWriter->WriteAttribute( L"type", (std::wstring(L"#") + VMLShapeTypeMapping::GenerateTypeId(pShape->GetShapeType())));
m_pXmlWriter->WriteAttribute( L"style", FormatUtils::XmlEncode(buildStyle(pShape, pAnchor, options, pContainer->Index)));
}
m_pXmlWriter->WriteAttribute( L"style", FormatUtils::XmlEncode(buildStyle(pShape, pAnchor, options, pContainer->Index)));
if (pShape->is<LineType>())
{
@ -446,7 +445,7 @@ namespace DocFileFormat
{
yCoord = iter->op;
}break;
// OUTLINE
// LINE
case lineColor:
{
RGBColor lineColor((int)iter->op, RedFirst);
@ -493,6 +492,21 @@ namespace DocFileFormat
{
appendValueAttribute(&m_stroke, L"startarrowwidth", getArrowWidth( iter->op ));
}break;
case cxstyle:
{
if (pShape->GetShapeType() == NULL)
{
freeform = false;
m_pXmlWriter->WriteAttribute(L"type", L"#_x0000_t32");
}
switch(iter->op)
{
case 0: m_pXmlWriter->WriteAttribute(L"o:connectortype", L"straight"); break;
case 1: m_pXmlWriter->WriteAttribute(L"o:connectortype", L"elbow"); break;
case 2: m_pXmlWriter->WriteAttribute(L"o:connectortype", L"curved"); break;
case 3: m_pXmlWriter->WriteAttribute(L"o:connectortype", L"none"); break;
}
}break;
// FILL
case fillColor:
{
@ -544,6 +558,14 @@ namespace DocFileFormat
appendValueAttribute(&m_fill, L"r:id", std::wstring(( L"rId" ) + FormatUtils::IntToWideString(m_nImageId) ));
}
}break;
case fillBlipName:
{
std::wstring name;
FormatUtils::GetSTLCollectionFromBytes<std::wstring>(&name, iter->opComplex.get(), iter->op, ENCODING_UTF16);
if (!name.empty())
appendValueAttribute(&m_fill, L"o:title", FormatUtils::XmlEncode(name));
}break;
case fillOpacity:
{
appendValueAttribute(&m_fill, L"opacity", ( FormatUtils::IntToWideString( iter->op ) + L"f" ));

View File

@ -64,7 +64,8 @@ long COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring
m_pReader = new CPPTFileReader(pStgFrom, m_strTempDirectory);
CPPTFileReader* pptReader = (CPPTFileReader*)m_pReader;
pptReader->m_oDocumentInfo.m_strFileDirectory= GetDirectory(sFileName.c_str());
pptReader->m_oDocumentInfo.m_strFileDirectory = GetDirectory(sFileName.c_str());
pptReader->m_oDocumentInfo.m_strPassword = password;
if (pptReader->IsPowerPoint() == false)
{
@ -73,14 +74,14 @@ long COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring
return AVS_ERROR_FILEFORMAT;
}
if (pptReader->ReadPersistDirectory() == false)
return AVS_ERROR_FILEFORMAT;
if (pptReader->ReadPersists() == false)
return AVS_ERROR_FILEFORMAT;
if (pptReader->IsEncrypted())
{
CEncryptionHeader *pEncryptionHeader = pptReader->GetEncryptionHeader();
if (password.empty()) return AVS_ERROR_DRM;
if (!pEncryptionHeader) return AVS_ERROR_FILEFORMAT;
if (password.empty()) return AVS_ERROR_DRM;
if (pEncryptionHeader->bStandard)
{
@ -92,7 +93,8 @@ long COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring
}
if (DecryptOfficeFile(&Decryptor) == false) return AVS_ERROR_DRM;
return OpenFile(m_sTempDecryptFileName, L"");
return AVS_ERROR_PASSWORD;
//return OpenFile(m_sTempDecryptFileName, L"");
}
else
{
@ -106,12 +108,15 @@ long COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring
}
if (DecryptOfficeFile(&Decryptor) == false) return AVS_ERROR_DRM;
return OpenFile(m_sTempDecryptFileName, L"");
return AVS_ERROR_PASSWORD;
pptReader->ReadDocument(&Decryptor);
//return OpenFile(m_sTempDecryptFileName, L"");
}
}
else
{
pptReader->ReadSlideList();
pptReader->ReadDocument(NULL);
m_Status = READMODE;
}

View File

@ -40,6 +40,7 @@ public:
std::vector<CPPTUserInfo*> m_arUsers;
std::wstring m_strFileDirectory;
std::map<int, std::wstring> m_mapStoreImageFile;
std::wstring m_strPassword;
CPPTDocumentInfo() : m_oCurrentUser(), m_arUsers()
{
@ -63,7 +64,7 @@ public:
}
}
bool ReadFromStream(CRecordCurrentUserAtom* pCurrentUser, POLE::Stream* pStream, std::wstring strFolderMem)
bool ReadFromStream(CRecordCurrentUserAtom* pCurrentUser, POLE::Stream* pStream)
{
m_oCurrentUser.FromAtom(pCurrentUser);
@ -86,8 +87,9 @@ public:
pInfo->m_strFileDirectory = m_strFileDirectory;
pInfo->m_bEncrypt = m_oCurrentUser.m_bIsEncrypt;
pInfo->m_strPassword = m_strPassword;
bool bResult = pInfo->ReadFromStream(&oUserAtom, pStream, strFolderMem);
bool bResult = pInfo->ReadFromStream(&oUserAtom, pStream);
offsetToEdit = pInfo->m_oUser.m_nOffsetLastEdit;
@ -104,13 +106,16 @@ public:
pInfo = NULL;
}
if (m_arUsers.empty() == false)
{
if (m_arUsers[0]->m_bEncrypt == false)
{
m_arUsers[0]->FromDocument();
}
}
return true;
}
bool LoadDocument(std::wstring strFolderMem)
{
if (m_arUsers.empty()) return false;
m_arUsers[0]->ReadExtenalObjects(strFolderMem);
m_arUsers[0]->FromDocument();
return true;
}
};

View File

@ -47,6 +47,7 @@ CPPTUserInfo::CPPTUserInfo() : CDocument(),
m_mapMasters(),
m_mapNotes(),
m_mapSlides(),
m_bEncrypt(false),
m_arOffsetPictures()
{
m_pDocumentInfo = NULL;
@ -128,7 +129,7 @@ void CPPTUserInfo::Clear()
m_arOffsetPictures.clear();
}
bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStream, std::wstring strFolderMem)
bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStream)
{
m_oUser.FromAtom(pUser);
@ -149,8 +150,9 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
oPersist.ReadFromStream(oHeader, pStream);
oPersist.ToMap(&m_mapOffsetInPIDs);
//--------------------------------------------------------------------------------------------------
CRYPT::ECMADecryptor *pDecryptor = NULL;
std::map<DWORD, DWORD>::iterator pPair = m_mapOffsetInPIDs.find(m_oUser.m_nEncryptRef);
if (pPair != m_mapOffsetInPIDs.end())
{
StreamUtils::StreamSeek(pPair->second, pStream);
@ -161,7 +163,17 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
m_bEncrypt = true;
m_oEncryptionHeader.ReadFromStream(oHeader, pStream);
return true;
pDecryptor = new CRYPT::ECMADecryptor();
pDecryptor->SetCryptData(m_oEncryptionHeader.crypt_data_aes);
if (pDecryptor->SetPassword(m_strPassword) == false)
{
delete pDecryptor;
pDecryptor = NULL;
//return true;
}
return true;//read persis decrypt
}
}
//--------------------------------------------------------------------------------------------------
@ -170,15 +182,45 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if (pPair == m_mapOffsetInPIDs.end())
return false;
StreamUtils::StreamSeek(pPair->second, pStream);
DWORD offset_stream = pPair->second;
StreamUtils::StreamSeek(offset_stream, pStream);
oHeader.ReadFromStream(pStream);
if (RECORD_TYPE_DOCUMENT != oHeader.RecType)
if (pDecryptor)
{
return false;
}
POLE::Storage *pStorageOut = NULL;
POLE::Stream *pStreamTmp = NULL;
m_oDocument.ReadFromStream(oHeader, pStream);
std::wstring sTemp = m_strFileDirectory + FILE_SEPARATOR_STR + L"~tempFile.ppt";
pStorageOut = new POLE::Storage(sTemp.c_str());
pStorageOut->open(true, true);
pStreamTmp = new POLE::Stream(pStorageOut, "Tmp", true, oHeader.RecLen);
unsigned char* data_stream = new unsigned char[oHeader.RecLen];
pStream->read(data_stream, oHeader.RecLen);
pDecryptor->Decrypt((char*)data_stream, oHeader.RecLen, m_oUser.m_nDocumentRef);
pStreamTmp->write(data_stream, oHeader.RecLen);
pStreamTmp->flush();
pStreamTmp->seek(0);
m_oDocument.ReadFromStream(oHeader, pStreamTmp);
delete pStream;
delete pStorageOut;
//NSFile::DeleteFile(sTemp);
}
else
{
if (RECORD_TYPE_DOCUMENT != oHeader.RecType)
{
return false;
}
m_oDocument.ReadFromStream(oHeader, pStream);
}
Clear();
@ -190,11 +232,12 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if (nIndexPsrRef != m_mapOffsetInPIDs.end())
{
long offset = (long)nIndexPsrRef->second;
offset_stream = nIndexPsrRef->second;
StreamUtils::StreamSeek(offset, pStream);
StreamUtils::StreamSeek(offset_stream, pStream);
oHeader.ReadFromStream(pStream);
CRecordSlide* pSlide = new CRecordSlide();
pSlide->ReadFromStream(oHeader, pStream);
pSlide->m_oPersist = m_oDocument.m_arMasterPersists[index];
@ -215,8 +258,8 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
{
long offset = (long)nIndexPsrRef->second;
StreamUtils::StreamSeek(offset, pStream);
offset_stream = nIndexPsrRef->second;
StreamUtils::StreamSeek(offset_stream, pStream);
oHeader.ReadFromStream(pStream);
CRecordSlide* pSlide = new CRecordSlide();
@ -240,9 +283,9 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
{
long offset = (long)nIndexPsrRef->second;
offset_stream = (long)nIndexPsrRef->second;
StreamUtils::StreamSeek(offset, pStream);
StreamUtils::StreamSeek(offset_stream, pStream);
oHeader.ReadFromStream(pStream);
@ -283,9 +326,9 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
{
long offset = (long)nIndexPsrRef->second;
offset_stream = nIndexPsrRef->second;
StreamUtils::StreamSeek(offset, pStream);
StreamUtils::StreamSeek(offset_stream, pStream);
oHeader.ReadFromStream(pStream);
@ -300,9 +343,9 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
{
long offset = (long)nIndexPsrRef->second;
offset_stream = nIndexPsrRef->second;
StreamUtils::StreamSeek(offset, pStream);
StreamUtils::StreamSeek(offset_stream, pStream);
oHeader.ReadFromStream(pStream);
@ -314,7 +357,11 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
m_mapHandoutMasters.insert( std::pair<DWORD, CRecordSlide*>(0, pSlide ));
}
}
return true;
}
//--------------------------------------------------------------------------------------------
void CPPTUserInfo::ReadExtenalObjects(std::wstring strFolderMem)
{
// так... теперь берем всю инфу о ExObject -----------------------------
m_oExMedia.m_strPresentationDirectory = strFolderMem;
m_oExMedia.m_strSourceDirectory = m_strFileDirectory;
@ -364,20 +411,12 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
m_arrFonts.push_back(oFont);
}
//FromDocument();
// FromDocument - должен вызываться после того, как загрузятся все (!!!) юзеры
// теперь заполним пустые картинки
//std::vector<CRecordBlipStoreContainer*> oArray;
m_oDocument.GetRecordsByType(&m_arrBlipStore, true, true);
if (0 < m_arrBlipStore.size())
{
m_bIsSetupEmpty = TRUE;
m_arrBlipStore[0]->SetUpPicturesInfos(&m_arOffsetPictures);
}
return TRUE;
}
void CPPTUserInfo::FromDocument()

View File

@ -50,6 +50,7 @@ public:
CEncryptionHeader m_oEncryptionHeader;
bool m_bEncrypt;
std::wstring m_strPassword;
std::map<DWORD, CRecordSlide*> m_mapSlides;
std::map<DWORD, CRecordSlide*> m_mapMasters;
@ -122,7 +123,8 @@ public:
void Clear();
bool ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStream, std::wstring strFolderMem);
bool ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStream);
void ReadExtenalObjects(std::wstring strFolderMem);
void FromDocument();
void NormalizeCoords(long lWidth, long lHeight);

View File

@ -56,7 +56,6 @@ public:
m_bIsPPTFile(false),
m_pDocStream(NULL),
m_pPictureStream(NULL),
m_lImagesCount(0),
m_strMemoryForder(strTemp),
m_oDocumentInfo()
{
@ -114,7 +113,7 @@ public:
if (m_oDocumentInfo.m_arUsers.empty())
return m_oDocumentInfo.m_oCurrentUser.m_bIsEncrypt; //wps не выставляет флаг!
return &m_oDocumentInfo.m_arUsers[0]->m_bEncrypt;
return m_oDocumentInfo.m_arUsers[0]->m_bEncrypt;
}
CEncryptionHeader* GetEncryptionHeader()
{
@ -122,26 +121,14 @@ public:
return &m_oDocumentInfo.m_arUsers[0]->m_oEncryptionHeader;
}
bool ReadPersistDirectory()
bool ReadPersists()
{
// нужно вызывать РОВНО один раз...
bool bRes = SavePictures();
return m_oDocumentInfo.ReadFromStream(&m_oCurrentUser, GetDocStream(), m_strMemoryForder);
return m_oDocumentInfo.ReadFromStream(&m_oCurrentUser, GetDocStream());
}
void ReadSlideList()
void ReadDocument(CRYPT::ECMADecryptor *pDecryptor)
{
if (m_oDocumentInfo.m_arUsers.size() > 0)
{
DWORD nPID = m_oDocumentInfo.m_arUsers[0]->m_oUser.m_nDocumentRef;
std::map<DWORD, DWORD>::iterator pPair = m_oDocumentInfo.m_arUsers[0]->m_mapOffsetInPIDs.find(nPID);
if (pPair == m_oDocumentInfo.m_arUsers[0]->m_mapOffsetInPIDs.end()) return;
DWORD offset = pPair->second;
StreamUtils::StreamSeek((long)offset, GetDocStream());
}
ReadPictures(pDecryptor);
m_oDocumentInfo.LoadDocument(m_strMemoryForder);
}
protected:
@ -194,20 +181,13 @@ protected:
return m_pPictureStream;
}
bool SavePictures()
void ReadPictures(CRYPT::ECMADecryptor *pDecryptor)
{
POLE::Stream* pStream = GetPictureStream();
if (NULL == pStream) return;
if (NULL == pStream)
{
return false;
}
SRecordHeader oHeader;
ULONG nRd = 0;
m_lImagesCount = 0;
// удаление картинок при завершении программы
while (true)
{
@ -220,11 +200,39 @@ protected:
art_blip.m_strMemoryForder = m_strMemoryForder;
art_blip.m_oDocumentInfo = &m_oDocumentInfo;
art_blip.ReadFromStream(oHeader, pStream);
if (pDecryptor)
{
POLE::Storage *pStorageOut = NULL;
POLE::Stream *pStreamTmp = NULL;
std::wstring sTemp = m_strMemoryForder + FILE_SEPARATOR_STR + L"~tempFile.ppt";
pStorageOut = new POLE::Storage(sTemp.c_str());
pStorageOut->open(true, true);
pStreamTmp = new POLE::Stream(pStorageOut, "Tmp", true, oHeader.RecLen);
unsigned char* data_stream = new unsigned char[oHeader.RecLen];
pStream->read(data_stream, oHeader.RecLen);
pDecryptor->Decrypt((char*)data_stream, oHeader.RecLen, 0);
pStreamTmp->write(data_stream, oHeader.RecLen);
pStreamTmp->flush();
pStreamTmp->seek(0);
art_blip.ReadFromStream(oHeader, pStreamTmp);
delete pStream;
delete pStorageOut;
//NSFile::DeleteFile(sTemp);
}
else
{
art_blip.ReadFromStream(oHeader, pStream);
}
}
return true;
}
private:
bool m_bDualStorage;
@ -239,7 +247,6 @@ public:
std::wstring m_strMemoryForder;
std::vector<bool> m_arLoadImageFlags;
DWORD m_lImagesCount;
CPPTDocumentInfo m_oDocumentInfo;
};

View File

@ -35,11 +35,13 @@
#include "../Reader/ReadStructures.h"
#include "../../../ASCOfficePPTXFile/Editor/Drawing/Shapes/BaseShape/PPTShape/Enums.h"
#include "../../../Common/3dParty/pole/pole.h"
#include "../../../OfficeCryptReader/source/CryptTransform.h"
using namespace NSPresentationEditor;
struct SRecordHeader
class SRecordHeader
{
public:
BYTE RecVersion;
USHORT RecInstance;
USHORT RecType;
@ -48,7 +50,8 @@ struct SRecordHeader
SRecordHeader()
{
RecVersion = 0;
RecInstance = RecType = 0;
RecInstance = 0;
RecType = 0;
RecLen = 0;
}

View File

@ -1155,8 +1155,8 @@ namespace NSBinPptxRW
str = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide\" Target=\"../notesSlides/notesSlide" +
std::to_wstring(nIndexNotes + 1) + L".xml\"/>";
m_pWriter->WriteString(str);
}
m_pWriter->WriteString(str);
}
void CRelsGenerator::StartNotes(int nIndexSlide)
{
@ -1209,10 +1209,14 @@ namespace NSBinPptxRW
m_pWriter->WriteString(strRels);
}
void CRelsGenerator::EndPresentationRels(const bool& bIsCommentsAuthors = false)
void CRelsGenerator::EndPresentationRels(const bool& bIsCommentsAuthors = false, const bool& bIsNotesMaster)
{
std::wstring strRels0 = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster\" Target=\"notesMasters/notesMaster1.xml\"/>";
if (bIsNotesMaster)
{
std::wstring strRels0 = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster\" Target=\"notesMasters/notesMaster1.xml\"/>";
m_pWriter->WriteString(strRels0);
}
std::wstring strRels1 = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/presProps\" Target=\"presProps.xml\" />";
std::wstring strRels2 = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
@ -1220,7 +1224,6 @@ namespace NSBinPptxRW
std::wstring strRels3 = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/viewProps\" Target=\"viewProps.xml\" />";
m_pWriter->WriteString(strRels0);
m_pWriter->WriteString(strRels1);
m_pWriter->WriteString(strRels2);
m_pWriter->WriteString(strRels3);

View File

@ -419,7 +419,7 @@ namespace NSBinPptxRW
int WriteRels (const std::wstring& bsType, const std::wstring& bsTarget, const std::wstring& bsTargetMode);
int WriteHyperlink (const std::wstring& strLink, const bool& bIsActionInit);
void EndPresentationRels (const bool& bIsCommentsAuthors);
void EndPresentationRels (const bool& bIsCommentsAuthors, const bool& bIsNotesMaster = false);
int GetNextId ();
void CloseRels ();

View File

@ -180,10 +180,11 @@ namespace NSBinPptxRW
CXmlWriter oXmlWriter;
// первым делом определим количество необходимого. если хоть одно из этих чисел - ноль, то ппту не корректный
LONG nCountThemes = 0;
LONG nCountMasters = 0;
LONG nCountLayouts = 0;
LONG nCountSlides = 0;
LONG nCountThemes = 0;
LONG nCountMasters = 0;
LONG nCountLayouts = 0;
LONG nCountSlides = 0;
bool bNotesMasterPresent = false;
pPair = m_mainTables.find(NSMainTables::Themes);
if (m_mainTables.end() != pPair)
@ -544,6 +545,7 @@ namespace NSBinPptxRW
m_oReader.m_pRels->Clear();
m_oReader.m_pRels->StartNotesMaster(m_arSlideMasters_Theme.size());
bNotesMasterPresent = true;
if (lCount > 0)
{
m_arNotesMasters.back().fromPPTY(&m_oReader);
@ -782,13 +784,16 @@ namespace NSBinPptxRW
}
m_oReader.m_pRels->WriteSlides(nCountSlides);
m_oReader.m_pRels->EndPresentationRels(m_oPresentation.commentAuthors.is_init());
m_oPresentation.notesMasterIdLst.clear();
m_oPresentation.notesMasterIdLst.push_back(PPTX::Logic::XmlId());
m_oPresentation.notesMasterIdLst[0].m_name = _T("notesMasterId");
m_oPresentation.notesMasterIdLst[0].rid = (size_t)nCurrentRels;
if (bNotesMasterPresent)
{
m_oPresentation.notesMasterIdLst.push_back(PPTX::Logic::XmlId());
m_oPresentation.notesMasterIdLst[0].m_name = _T("notesMasterId");
m_oPresentation.notesMasterIdLst[0].rid = (size_t)nCurrentRels;
++nCurrentRels;
}
m_oReader.m_pRels->EndPresentationRels(m_oPresentation.commentAuthors.is_init(), bNotesMasterPresent);
m_oReader.m_pRels->CloseRels();
oXmlWriter.ClearNoAttack();

View File

@ -56,11 +56,6 @@ void CrtMlFrt::readFields(CFRecord& record)
Log::error("CrtMlFrt record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
//
// if (cb > 0)
// {
// //XmlTkChain
// }
}
} // namespace XLS

View File

@ -54,7 +54,6 @@ void DBQueryExt::readFields(CFRecord& record)
{
#pragma message("####################### DBQueryExt record is not implemented")
Log::error("DBQueryExt record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -52,8 +52,7 @@ BaseObjectPtr DCon::clone()
void DCon::readFields(CFRecord& record)
{
#pragma message("####################### DCon record is not implemented")
//record >> iiftab >> fLeftCat >> fTopCat >> fLinkConsole;
record >> iiftab >> fLeftCat >> fTopCat >> fLinkConsole;
}
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of DCon record in BIFF8
class DCon: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(DCon)

View File

@ -53,9 +53,17 @@ BaseObjectPtr DConBin::clone()
void DConBin::readFields(CFRecord& record)
{
#pragma message("####################### DConBin record is not implemented")
Log::error("DConBin record is not implemented.");
//record >> some_value;
unsigned short reserved1;
unsigned char reserved2;
record >> nBuiltin >> reserved1 >> reserved2 >> cchFile;
if (cchFile > 0 && cchFile < 0xffff)
{
stFile.setSize(cchFile);
record >> stFile;
}
// skip unused
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -32,12 +32,11 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of DConBin record in BIFF8
class DConBin: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(DConBin)
@ -48,11 +47,13 @@ public:
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeDConBin;
static const ElementType type = typeDConBin;
unsigned char nBuiltin;
unsigned short cchFile;
XLUnicodeStringNoCch stFile;
};

View File

@ -54,7 +54,6 @@ void DbOrParamQry::readFields(CFRecord& record)
{
#pragma message("####################### DbOrParamQry record is not implemented")
Log::error("DbOrParamQry record is not implemented.");
//record >> some_value;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}

View File

@ -53,7 +53,7 @@ BaseObjectPtr FnGrp12::clone()
void FnGrp12::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> astFnGrp;
}

View File

@ -53,7 +53,7 @@ BaseObjectPtr ForceFullCalculation::clone()
void ForceFullCalculation::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
_UINT32 temp;
record >> temp;

View File

@ -53,7 +53,7 @@ BaseObjectPtr GUIDTypeLib::clone()
void GUIDTypeLib::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
_GUID_ guid_num;
record >> guid_num;
guid = STR::guid2bstr(guid_num);

View File

@ -35,7 +35,6 @@
namespace XLS
{
// Logical representation of IMDATA record in BIFF5
class IMDATA: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(IMDATA)
@ -45,11 +44,10 @@ public:
~IMDATA();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeIMDATA;
static const ElementType type = typeIMDATA;
_UINT16 cf;
_UINT16 env;

View File

@ -53,7 +53,7 @@ BaseObjectPtr MDB::clone()
void MDB::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
while(!record.isEOF())
{
MDirPtr element(new MDir);

View File

@ -53,7 +53,7 @@ BaseObjectPtr MDTInfo::clone()
void MDTInfo::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
_UINT32 flags;
record >> flags;

View File

@ -53,7 +53,7 @@ BaseObjectPtr MDXKPI::clone()
void MDXKPI::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> istrConnName >> tfnSrc >> kpiprop >> istrKPIName >> istrMbrKPI;
}

View File

@ -54,7 +54,7 @@ BaseObjectPtr MDXProp::clone()
void MDXProp::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> istrConnName >> tfnSrc >> istrMbr >> istrProp;
}

View File

@ -54,7 +54,7 @@ BaseObjectPtr MDXSet::clone()
void MDXSet::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> istrConnName >> tfnSrc >> sso >> istrSetDef >> cistr;
while(!record.isEOF())
{

View File

@ -54,7 +54,7 @@ BaseObjectPtr MDXStr::clone()
void MDXStr::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> st;
}

View File

@ -54,7 +54,7 @@ BaseObjectPtr MDXTuple::clone()
void MDXTuple::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> istrConnName >> tfnSrc >> cistr;
while(!record.isEOF())
{

View File

@ -53,7 +53,7 @@ BaseObjectPtr NameFnGrp12::clone()
void NameFnGrp12::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> cachName >> fgrp >> rgach;
}

View File

@ -53,7 +53,7 @@ BaseObjectPtr NamePublish::clone()
void NamePublish::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
unsigned short flags;
record >> flags >> strName;
fPublished = GETBIT(flags, 0);

View File

@ -52,9 +52,20 @@ BaseObjectPtr Qsir::clone()
void Qsir::readFields(CFRecord& record)
{
#pragma message("####################### Qsir record is not implemented")
Log::error("Qsir record is not implemented.");
//record >> some_value;
_UINT32 flags;
record >> frtRefHeaderU >> cbQsirSaved >> cbQsifSaved >> flags >> iSortCustom >> cQsif >> cpstDeleted >> idFieldNext >> ccolExtraLeft >> ccolExtraRight;
record >> idList >> rgbTitle;
fPersist = GETBIT(flags, 0);
fPersistSort = GETBIT(flags, 1);
fPersistAutoFilter = GETBIT(flags, 2);
fSorted = GETBIT(flags, 20);
fCaseSensSort = GETBIT(flags, 21);
fHdrRowSort = GETBIT(flags, 22);
fidWrapped = GETBIT(flags, 23);
fTitlesOld = GETBIT(flags, 25);
wVerBeforeRefreshAlert = GETBITS(flags, 26, 30);
}
} // namespace XLS

View File

@ -32,12 +32,12 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/FrtRefHeaderU.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of Qsir record in BIFF8
class Qsir: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(Qsir)
@ -47,11 +47,32 @@ public:
~Qsir();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeQsir;
static const ElementType type = typeQsir;
FrtRefHeaderU frtRefHeaderU;
unsigned short cbQsirSaved;
unsigned short cbQsifSaved;
bool fPersist;
bool fPersistSort;
bool fPersistAutoFilter;
bool fSorted;
bool fCaseSensSort;
bool fHdrRowSort;
bool fidWrapped;
bool fTitlesOld;
unsigned char wVerBeforeRefreshAlert;
_UINT32 iSortCustom;
_UINT32 cQsif;
_UINT32 cpstDeleted;
_UINT32 idFieldNext;
unsigned short ccolExtraLeft;
unsigned short ccolExtraRight;
_UINT32 idList; //options
XLUnicodeString rgbTitle;
};
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of RealTimeData record in BIFF8
class RealTimeData: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(RealTimeData)
@ -47,12 +45,10 @@ public:
~RealTimeData();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeRealTimeData;
static const ElementType type = typeRealTimeData;
};
} // namespace XLS

View File

@ -35,6 +35,19 @@
namespace XLS
{
BiffStructurePtr XLUnicodeStringSegmentedSXADDL::clone()
{
return BiffStructurePtr(new XLUnicodeStringSegmentedSXADDL(*this));
}
void XLUnicodeStringSegmentedSXADDL::load(CFRecord& record)
{
unsigned short reserved;
record >> cchTotal >> reserved;
record >> string;
}
//-----------------------------------------
SXAddl::SXAddl()
{
}
@ -58,6 +71,10 @@ void SXAddl::readFields(CFRecord& record)
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
}
//-------------------------------------------------------------------------------------------------------
BaseObjectPtr SXAddl_SXCCache_SXDId::clone()
{
return BaseObjectPtr(new SXAddl_SXCCache_SXDId(*this));
}
void SXAddl_SXCCache_SXDId::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
@ -65,7 +82,11 @@ void SXAddl_SXCCache_SXDId::readFields(CFRecord& record)
short reserved;
record >> idCache >> reserved;
}
//----------------------------------------------------------------------------
BaseObjectPtr SXAddl_SXCCache_SXDEnd::clone()
{
return BaseObjectPtr(new SXAddl_SXCCache_SXDEnd(*this));
}
void SXAddl_SXCCache_SXDEnd::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
@ -74,7 +95,26 @@ void SXAddl_SXCCache_SXDEnd::readFields(CFRecord& record)
short reserved2;
record >> reserved1 >> reserved2;
}
//----------------------------------------------------------------------------
BaseObjectPtr Continue_SxaddlSxString::clone()
{
return BaseObjectPtr(new Continue_SxaddlSxString(*this));
}
void Continue_SxaddlSxString::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
int sz = record.getDataSize() - record.getRdPtr();
if (sz > 0)
record >> stContinue;
}
//----------------------------------------------------------------------------
BaseObjectPtr SXAddl_SXCCache_SXDVer10Info::clone()
{
return BaseObjectPtr(new SXAddl_SXCCache_SXDVer10Info(*this));
}
void SXAddl_SXCCache_SXDVer10Info::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
@ -90,6 +130,11 @@ void SXAddl_SXCCache_SXDVer10Info::readFields(CFRecord& record)
record >> reserved2;
}
//----------------------------------------------------------------------------
BaseObjectPtr SXAddl_SXCCache_SXDInfo12::clone()
{
return BaseObjectPtr(new SXAddl_SXCCache_SXDInfo12(*this));
}
void SXAddl_SXCCache_SXDInfo12::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
@ -103,6 +148,11 @@ void SXAddl_SXCCache_SXDInfo12::readFields(CFRecord& record)
fSrvSupportAttribDrill = GETBIT(flags, 1);
fSrvSupportSubQuery = GETBIT(flags, 2);
}
//----------------------------------------------------------------------------
BaseObjectPtr SXAddl_SXCCache_SXDVerSXMacro::clone()
{
return BaseObjectPtr(new SXAddl_SXCCache_SXDVerSXMacro(*this));
}
void SXAddl_SXCCache_SXDVerSXMacro::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
@ -112,6 +162,17 @@ void SXAddl_SXCCache_SXDVerSXMacro::readFields(CFRecord& record)
record >> dwVer >> reserved1 >> reserved2 >> reserved3;
}
//----------------------------------------------------------------------------
BaseObjectPtr SXAddl_SXCView_SXDId::clone()
{
return BaseObjectPtr(new SXAddl_SXCView_SXDId(*this));
}
void SXAddl_SXCView_SXDId::readFields(CFRecord& record)
{
m_SXAddlHdr.load(record);
record >> stName;
}
} // namespace XLS

View File

@ -32,12 +32,29 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
class XLUnicodeStringSegmentedSXADDL : public BiffStructure
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(XLUnicodeStringSegmentedSXADDL)
public:
XLUnicodeStringSegmentedSXADDL(){}
~XLUnicodeStringSegmentedSXADDL(){}
BiffStructurePtr clone();
virtual void load(CFRecord& record);
static const ElementType type = typeStringSegmentedSXADDL;
_UINT32 cchTotal;
XLUnicodeString string;
};
// Logical representation of SXAddl record in BIFF8
class SXAddl: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXAddl)
@ -57,9 +74,8 @@ public:
SXAddl();
~SXAddl();
BaseObjectPtr clone();
virtual BaseObjectPtr clone();
virtual void readFields(CFRecord& record);
static const ElementType type = typeSXAddl;
@ -68,8 +84,10 @@ public:
class Continue_SxaddlSxString : public SXAddl
{
public:
//virtual void readFields(CFRecord& record);
virtual void readFields(CFRecord& record);
virtual BaseObjectPtr clone();
XLUnicodeStringSegmentedSXADDL stContinue;
};
class SXAddl_SXCAutoSort_SXDEnd : public SXAddl {};
class SXAddl_SXCAutoSort_SXDId : public SXAddl {};
@ -77,12 +95,14 @@ class SXAddl_SXCCache_SXDEnd : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
virtual BaseObjectPtr clone();
};
class SXAddl_SXCCache_SXDId : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
virtual BaseObjectPtr clone();
_UINT32 idCache;
};
@ -92,6 +112,7 @@ class SXAddl_SXCCache_SXDInfo12 : public SXAddl
public:
virtual void readFields(CFRecord& record);
virtual BaseObjectPtr clone();
bool fSheetData;
bool fSrvSupportAttribDrill;
@ -108,6 +129,7 @@ class SXAddl_SXCCache_SXDVer10Info : public SXAddl
public:
virtual void readFields(CFRecord& record);
virtual BaseObjectPtr clone();
_INT32 citmGhostMax;
unsigned char bVerCacheLastRefresh;
@ -119,8 +141,8 @@ public:
class SXAddl_SXCCache_SXDVerSXMacro : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
virtual BaseObjectPtr clone();
unsigned char dwVer;
};
@ -134,11 +156,13 @@ class SXAddl_SXCCacheField_SXDIfdbMpMapCount: public SXAddl {};
class SXAddl_SXCCacheField_SXDProperty : public SXAddl {};
class SXAddl_SXCCacheField_SXDPropName : public SXAddl {};
class SXAddl_SXCCacheField_SXDSxrmitmCount : public SXAddl {};
class SXAddl_SXCCacheItem_SXDEnd : public SXAddl {};
class SXAddl_SXCCacheItem_SXDId : public SXAddl {};
class SXAddl_SXCCacheItem_SXDItmMpMapCount : public SXAddl {};
class SXAddl_SXCCacheItem_SXDItmMpropMap : public SXAddl {};
class SXAddl_SXCCacheItem_SXDSxrmitmDisp : public SXAddl {};
class SXAddl_SXCField12_SXDAutoshow : public SXAddl {};
class SXAddl_SXCField12_SXDEnd : public SXAddl {};
class SXAddl_SXCField12_SXDId : public SXAddl {};
@ -146,16 +170,20 @@ class SXAddl_SXCField12_SXDISXTH : public SXAddl {};
class SXAddl_SXCField12_SXDMemberCaption : public SXAddl {};
class SXAddl_SXCField12_SXDVer12Info : public SXAddl {};
class SXAddl_SXCField12_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCField_SXDEnd : public SXAddl {};
class SXAddl_SXCField_SXDId : public SXAddl {};
class SXAddl_SXCField_SXDVer10Info : public SXAddl {};
class SXAddl_SXCGroup_SXDEnd : public SXAddl {};
class SXAddl_SXCGroup_SXDGrpInfo : public SXAddl {};
class SXAddl_SXCGroup_SXDId : public SXAddl {};
class SXAddl_SXCGroup_SXDMember : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDEnd : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDGrpLevelInfo : public SXAddl {};
class SXAddl_SXCGrpLevel_SXDId : public SXAddl {};
class SXAddl_SXCHierarchy_SXDDisplayFolder : public SXAddl {};
class SXAddl_SXCHierarchy_SXDEnd : public SXAddl {};
class SXAddl_SXCHierarchy_SXDFilterMember : public SXAddl {};
@ -175,13 +203,16 @@ class SXAddl_SXCHierarchy_SXDProperty : public SXAddl {};
class SXAddl_SXCHierarchy_SXDSXSetParentUnique : public SXAddl {};
class SXAddl_SXCHierarchy_SXDUserCaption : public SXAddl {};
class SXAddl_SXCHierarchy_SXDVerUpdInv : public SXAddl {};
class SXAddl_SXCQsi_SXDEnd : public SXAddl {};
class SXAddl_SXCQsi_SXDId : public SXAddl {};
class SXAddl_SXCQuery_SXDEnd : public SXAddl {};
class SXAddl_SXCQuery_SXDReconnCond : public SXAddl {};
class SXAddl_SXCQuery_SXDSrcConnFile : public SXAddl {};
class SXAddl_SXCQuery_SXDSrcDataFile : public SXAddl {};
class SXAddl_SXCQuery_SXDXMLSource : public SXAddl {};
class SXAddl_SXCSXCondFmt_SXDEnd : public SXAddl {};
class SXAddl_SXCSXCondFmt_SXDSXCondFmt : public SXAddl {};
class SXAddl_SXCSXCondFmts_SXDEnd : public SXAddl {};
@ -189,10 +220,12 @@ class SXAddl_SXCSXCondFmts_SXDId : public SXAddl {};
class SXAddl_SXCSXDH_SXDEnd : public SXAddl {};
class SXAddl_SXCSXDH_SXDId : public SXAddl {};
class SXAddl_SXCSXDH_SXDSxdh : public SXAddl {};
class SXAddl_SXCSXfilt_SXDEnd : public SXAddl {};
class SXAddl_SXCSXfilt_SXDId : public SXAddl {};
class SXAddl_SXCSXfilt_SXDSXfilt : public SXAddl {};
class SXAddl_SXCSXfilt_SXDSXItm : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDCaption : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDEnd : public SXAddl {};
class SXAddl_SXCSXFilter12_SXDId : public SXAddl {};
@ -205,21 +238,35 @@ class SXAddl_SXCSXFilter12_SXDXlsFilterValue1: public SXAddl {};
class SXAddl_SXCSXFilter12_SXDXlsFilterValue2: public SXAddl {};
class SXAddl_SXCSXFilters12_SXDEnd : public SXAddl {};
class SXAddl_SXCSXFilters12_SXDId : public SXAddl {};
class SXAddl_SXCSXMg_SXDEnd : public SXAddl {};
class SXAddl_SXCSXMg_SXDId : public SXAddl {};
class SXAddl_SXCSXMg_SXDUserCaption : public SXAddl {};
class SXAddl_SXCSXMgs_SXDEnd : public SXAddl {};
class SXAddl_SXCSXMgs_SXDId : public SXAddl {};
class SXAddl_SXCSXMgs_SXDMGrpSXDHMap : public SXAddl {};
class SXAddl_SXCSXrule_SXDEnd : public SXAddl {};
class SXAddl_SXCSXrule_SXDId : public SXAddl {};
class SXAddl_SXCSXrule_SXDSXrule : public SXAddl {};
class SXAddl_SXCView_SXDCalcMember : public SXAddl {};
class SXAddl_SXCView_SXDCalcMemString : public SXAddl {};
class SXAddl_SXCView_SXDCompactColHdr : public SXAddl {};
class SXAddl_SXCView_SXDCompactRwHdr : public SXAddl {};
class SXAddl_SXCView_SXDEnd : public SXAddl {};
class SXAddl_SXCView_SXDId : public SXAddl {};
class SXAddl_SXCView_SXDId : public SXAddl
{
public:
virtual void readFields(CFRecord& record);
virtual BaseObjectPtr clone();
XLUnicodeStringSegmentedSXADDL stName;
};
class SXAddl_SXCView_SXDSXPIIvmb : public SXAddl {};
class SXAddl_SXCView_SXDTableStyleClient : public SXAddl {};
class SXAddl_SXCView_SXDVer10Info : public SXAddl {};

View File

@ -52,9 +52,13 @@ BaseObjectPtr SXDI::clone()
void SXDI::readFields(CFRecord& record)
{
Log::error("SXDI record is not implemented.");
record >> isxvdData >> iiftab >> df >> isxvd >> isxvi >> ifmt >> cchName;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
if (cchName > 0 && cchName < 0xFFFF)
{
stName.setSize(cchName);
record >> stName;
}
}
} // namespace XLS

View File

@ -32,12 +32,11 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of SXDI record in BIFF8
class SXDI: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXDI)
@ -47,11 +46,19 @@ public:
~SXDI();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXDI;
static const ElementType type = typeSXDI;
short isxvdData;
short iiftab;
short df;
short isxvd;
short isxvi;
unsigned short ifmt;
unsigned short cchName;
XLUnicodeStringNoCch stName;
};
} // namespace XLS

View File

@ -44,17 +44,45 @@ SXLI::~SXLI()
{
}
BaseObjectPtr SXLI::clone()
{
return BaseObjectPtr(new SXLI(*this));
}
void SXLI::readFields(CFRecord& record)
{
Log::error("SXLI record is not implemented.");
{// 0 or 2 records SXLIItem
int size_item = (record.getDataSize() - record.getRdPtr()) / 2;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
if (size_item < 8)
{
//??
return;
}
for (int k = 0; k < 2; k++)
{
SXLIItem item;
unsigned short flags;
record >> item.cSic >> item.itmType >> item.isxviMac >> flags;
item.fMultiDataName = GETBIT(flags, 0);
item.iData = GETBITS(flags, 1, 8);
item.fSbt = GETBIT(flags, 9);
item.fBlock = GETBIT(flags, 10);
item.fGrand = GETBIT(flags, 11);
item.fMultiDataOnAxis = GETBIT(flags, 12);
int count = (size_item - 8) / 2;
for (int i = 0; i < count; i++)
{
short val; record >> val;
item.rgisxvi.push_back(val);
}
m_arItems.push_back(item);
}
}
} // namespace XLS

View File

@ -35,9 +35,21 @@
namespace XLS
{
struct SXLIItem
{
short cSic;
unsigned short itmType;
short isxviMac;
bool fMultiDataName;
unsigned char iData;
bool fSbt;
bool fBlock;
bool fGrand;
bool fMultiDataOnAxis;
std::vector<short> rgisxvi;
};
// Logical representation of SXLI record in BIFF8
class SXLI: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXLI)
@ -47,12 +59,12 @@ public:
~SXLI();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXLI;
static const ElementType type = typeSXLI;
std::vector<SXLIItem> m_arItems;
};
} // namespace XLS

View File

@ -52,9 +52,15 @@ BaseObjectPtr SXPI::clone()
void SXPI::readFields(CFRecord& record)
{
Log::error("SXPI record is not implemented.");
int size = (record.getDataSize() - record.getRdPtr()) / sizeof(SXPI_Item);
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
for (int i = 0; i < size; i++)
{
SXPI_Item item;
record >> item.isxvd >> item.isxvi >> item.idObj;
m_arItems.push_back(item);
}
}
} // namespace XLS

View File

@ -36,8 +36,13 @@
namespace XLS
{
struct SXPI_Item
{
short isxvd;
short isxvi;
short idObj;
};
// Logical representation of SXPI record in BIFF8
class SXPI: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXPI)
@ -48,11 +53,11 @@ public:
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXPI;
static const ElementType type = typeSXPI;
std::vector<SXPI_Item> m_arItems;
};

View File

@ -52,9 +52,7 @@ BaseObjectPtr SXPIEx::clone()
void SXPIEx::readFields(CFRecord& record)
{
Log::error("SXPIEx record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> frtHeaderOld >> isxth >> stUnique >> stDisplay;
}
} // namespace XLS

View File

@ -32,12 +32,12 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
#include "../Biff_structures/FrtHeaderOld.h"
namespace XLS
{
// Logical representation of SXPIEx record in BIFF8
class SXPIEx: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXPIEx)
@ -47,11 +47,15 @@ public:
~SXPIEx();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXPIEx;
static const ElementType type = typeSXPIEx;
FrtHeaderOld frtHeaderOld;
_UINT32 isxth;
XLUnicodeString stUnique;
XLUnicodeString stDisplay;
};
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SXStreamID record in BIFF8
class SXStreamID: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXStreamID)
@ -47,11 +45,10 @@ public:
~SXStreamID();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXStreamID;
static const ElementType type = typeSXStreamID;
short idStm;
};

View File

@ -53,9 +53,13 @@ BaseObjectPtr SXString::clone()
void SXString::readFields(CFRecord& record)
{
Log::error("SXString record is not implemented.");
record >> cch;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
if (cch > 0 && cch < 0xffff)
{
segment.setSize(cch);
record >> segment;
}
}
} // namespace XLS

View File

@ -32,12 +32,11 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of SXString record in BIFF8
class SXString: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXString)
@ -47,11 +46,13 @@ public:
~SXString();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXString;
static const ElementType type = typeSXString;
unsigned short cch;
XLUnicodeStringNoCch segment;
};
} // namespace XLS

View File

@ -53,9 +53,7 @@ BaseObjectPtr SXTBRGIITM::clone()
void SXTBRGIITM::readFields(CFRecord& record)
{
Log::error("SXTBRGIITM record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> cItems;
}
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SXTBRGIITM record in BIFF8
class SXTBRGIITM: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXTBRGIITM)
@ -47,11 +45,12 @@ public:
~SXTBRGIITM();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXTBRGIITM;
static const ElementType type = typeSXTBRGIITM;
unsigned short cItems;
};

View File

@ -44,7 +44,6 @@ SXTH::~SXTH()
{
}
BaseObjectPtr SXTH::clone()
{
return BaseObjectPtr(new SXTH(*this));
@ -53,9 +52,44 @@ BaseObjectPtr SXTH::clone()
void SXTH::readFields(CFRecord& record)
{
Log::error("SXTH record is not implemented.");
_UINT32 flags1;
unsigned short flags2;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> frtHeaderOld >> flags1 >> sxaxis >> isxvd >> csxvdXl >> flags2;
record >> stUnique >> stDisplay >> stDefault >> stAll >> stDimension;
record >> cisxvd;
for (int i = 0; i < cisxvd; i++)
{
_INT32 val;
record >> val;
rgisxvd.push_back(val);
}
record >> cHiddenMemberSets;
for (int i = 0; i < cHiddenMemberSets; i++)
{
HiddenMemberSet val;
record >> val;
rgHiddenMemberSets.push_back(val);
}
fMeasure = GETBIT(flags1, 0);
fOutlineMode = GETBIT(flags1, 2);
fEnableMultiplePageItems = GETBIT(flags1, 3);
fSubtotalAtTop = GETBIT(flags1, 4);
fSet = GETBIT(flags1, 5);
fDontShowFList = GETBIT(flags1, 6);
fAttributeHierarchy = GETBIT(flags1, 7);
fTimeHierarchy = GETBIT(flags1, 8);
fFilterInclusive = GETBIT(flags1, 9);
fKeyAttributeHierarchy = GETBIT(flags1, 11);
fKPI = GETBIT(flags1, 12);
fDragToRow = GETBIT(flags2, 0);
fDragToColumn = GETBIT(flags2, 1);
fDragToPage = GETBIT(flags2, 2);
fDragToData = GETBIT(flags2, 3);
fDragToHide = GETBIT(flags2, 4);
}
} // namespace XLS

View File

@ -33,11 +33,14 @@
#include "BiffRecordContinued.h"
#include "../Biff_structures/FrtHeaderOld.h"
#include "../Biff_structures/SxAxis.h"
#include "../Biff_structures/BiffString.h"
#include "../Biff_structures/HiddenMemberSet.h"
namespace XLS
{
// Logical representation of SXTH record in BIFF8
class SXTH: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXTH)
@ -47,13 +50,43 @@ public:
~SXTH();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXTH;
static const ElementType type = typeSXTH;
FrtHeaderOld frtHeaderOld;
bool fMeasure;
bool fOutlineMode;
bool fEnableMultiplePageItems;
bool fSubtotalAtTop;
bool fSet;
bool fDontShowFList;
bool fAttributeHierarchy;
bool fTimeHierarchy;
bool fFilterInclusive;
bool fKeyAttributeHierarchy;
bool fKPI;
SXAxis sxaxis;
_INT32 isxvd;
_INT32 csxvdXl;
bool fDragToRow;
bool fDragToColumn;
bool fDragToPage;
bool fDragToData;
bool fDragToHide;
XLUnicodeString stUnique;
XLUnicodeString stDisplay;
XLUnicodeString stDefault;
XLUnicodeString stAll;
XLUnicodeString stDimension;
_UINT32 cisxvd;
std::vector<_INT32> rgisxvd;
_UINT32 cHiddenMemberSets;
std::vector<HiddenMemberSet> rgHiddenMemberSets;
};
} // namespace XLS

View File

@ -39,12 +39,10 @@ SXTbl::SXTbl()
{
}
SXTbl::~SXTbl()
{
}
BaseObjectPtr SXTbl::clone()
{
return BaseObjectPtr(new SXTbl(*this));
@ -52,9 +50,10 @@ BaseObjectPtr SXTbl::clone()
void SXTbl::readFields(CFRecord& record)
{
Log::error("SXTbl record is not implemented.");
record >> cdref >> csxtbpg >> cPages;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
fAutoPage = GETBIT(cPages, 15);
cPages = GETBITS(cPages, 0, 14);
}
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SXTbl record in BIFF8
class SXTbl: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXTbl)
@ -47,12 +45,16 @@ public:
~SXTbl();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXTbl;
static const ElementType type = typeSXTbl;
unsigned short cdref;
unsigned short csxtbpg;
unsigned short cPages;
bool fAutoPage;
};
} // namespace XLS

View File

@ -39,12 +39,10 @@ SXVDEx::SXVDEx()
{
}
SXVDEx::~SXVDEx()
{
}
BaseObjectPtr SXVDEx::clone()
{
return BaseObjectPtr(new SXVDEx(*this));
@ -53,9 +51,40 @@ BaseObjectPtr SXVDEx::clone()
void SXVDEx::readFields(CFRecord& record)
{
Log::error("SXVDEx record is not implemented.");
unsigned short flags1;
unsigned char flags2;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> flags1 >> flags2 >> citmAutoShow >> isxdiAutoSort >> isxdiAutoShow >> ifmt;
fShowAllItems = GETBIT(flags1, 0);
fDragToRow = GETBIT(flags1, 1);
fDragToColumn = GETBIT(flags1, 2);
fDragToPage = GETBIT(flags1, 3);
fDragToHide = GETBIT(flags1, 4);
fNotDragToData = GETBIT(flags1, 5);
fServerBased = GETBIT(flags1, 7);
fAutoSort = GETBIT(flags1, 9);
fAscendSort = GETBIT(flags1, 10);
fAutoShow = GETBIT(flags1, 11);
fTopAutoShow = GETBIT(flags1, 12);
fCalculatedField = GETBIT(flags1, 13);
fPageBreaksBetweenItems = GETBIT(flags1, 14);
fHideNewItems = GETBIT(flags1, 15);
fOutline = GETBIT(flags2, 5);
fInsertBlankRow = GETBIT(flags2, 6);
fSubtotalAtTop = GETBIT(flags2, 7);
_UINT32 reserved1, reserved2;
record >> cchSubName >> reserved1 >> reserved2;
if (cchSubName > 0 && cchSubName < 0xffff)
{
stSubName.setSize(cchSubName);
record >> stSubName;
}
}
} // namespace XLS

View File

@ -32,12 +32,11 @@
#pragma once
#include "BiffRecordContinued.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of SXVDEx record in BIFF8
class SXVDEx: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXVDEx)
@ -47,11 +46,35 @@ public:
~SXVDEx();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXVDEx;
static const ElementType type = typeSXVDEx;
bool fShowAllItems;
bool fDragToRow;
bool fDragToColumn;
bool fDragToPage;
bool fDragToHide;
bool fNotDragToData;
bool fServerBased;
bool fAutoSort;
bool fAscendSort;
bool fAutoShow;
bool fTopAutoShow;
bool fCalculatedField;
bool fPageBreaksBetweenItems;
bool fHideNewItems;
bool fOutline;
bool fInsertBlankRow;
bool fSubtotalAtTop;
unsigned char citmAutoShow;
short isxdiAutoSort;
short isxdiAutoShow;
unsigned short ifmt;
unsigned short cchSubName;
XLUnicodeStringNoCch stSubName;
};

View File

@ -52,9 +52,21 @@ BaseObjectPtr SXVDTEx::clone()
void SXVDTEx::readFields(CFRecord& record)
{
Log::error("SXVDTEx record is not implemented.");
unsigned short flags;
record >> frtHeaderOld >> flags >> isxth >> isxtl >> csxvi;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
for (_INT32 i = 0; i < csxvi; i++)
{
SXVIFlags val;
record >> val;
rgsxvi.push_back(val);
}
fTensorSort = GETBIT(flags, 0);
fDrilledLevel = GETBIT(flags, 1);
fItemsDrilledByDefault = GETBIT(flags, 2);
fMemPropDisplayInReport = GETBIT(flags, 3);
fMemPropDisplayInTip = GETBIT(flags, 4);
fMemPropDisplayInCaption = GETBIT(flags, 5);
}
} // namespace XLS

View File

@ -32,12 +32,12 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/FrtHeaderOld.h"
#include "../Biff_structures/SXVIFlags.h"
namespace XLS
{
// Logical representation of SXVDTEx record in BIFF8
class SXVDTEx: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXVDTEx)
@ -47,13 +47,23 @@ public:
~SXVDTEx();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXVDTEx;
static const ElementType type = typeSXVDTEx;
FrtHeaderOld frtHeaderOld;
bool fTensorSort;
bool fDrilledLevel;
bool fItemsDrilledByDefault;
bool fMemPropDisplayInReport;
bool fMemPropDisplayInTip;
bool fMemPropDisplayInCaption;
short isxth;
_INT32 isxtl;
_INT32 csxvi;
std::vector<SXVIFlags> rgsxvi;
};
} // namespace XLS

View File

@ -52,9 +52,20 @@ BaseObjectPtr SXVI::clone()
void SXVI::readFields(CFRecord& record)
{
Log::error("SXVI record is not implemented.");
unsigned short flags;
record >> itmType>> flags >> iCache >> cchName;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
fHidden = GETBIT(flags, 0);
fHideDetail = GETBIT(flags, 1);
fFormula = GETBIT(flags, 4);
fMissing = GETBIT(flags, 5);
if (cchName > 0 && cchName < 0xFFFF)
{
stName.setSize(cchName);
stName.load(record);
}
}
} // namespace XLS

View File

@ -32,12 +32,10 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of SXVI record in BIFF8
class SXVI: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXVI)
@ -47,12 +45,34 @@ public:
~SXVI();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXVI;
static const ElementType type = typeSXVI;
unsigned short itmType; //enum
//0x0000 itmtypeData
//0x0001 itmtypeDEFAULT
//0x0002 itmtypeSUM
//0x0003 itmtypeCOUNTA
//0x0004 itmtypeAVERAGE
//0x0005 itmtypeMAX
//0x0006 itmtypeMIN
//0x0007 itmtypePRODUCT
//0x0008 itmtypeCOUNT
//0x0009 itmtypeSTDEV
//0x000A itmtypeSTDEVP
//0x000B itmtypeVAR
//0x000C itmtypeVARP
bool fHidden;
bool fHideDetail;
bool fFormula;
bool fMissing;
short iCache;
unsigned short cchName;
XLUnicodeStringNoCch stName;
};

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SXVS record in BIFF8
class SXVS: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXVS)
@ -50,7 +48,7 @@ public:
void readFields(CFRecord& record);
static const ElementType type = typeSXVS;
static const ElementType type = typeSXVS;
short sxvs;

View File

@ -37,8 +37,6 @@
namespace XLS
{
// Logical representation of SXViewEx record in BIFF8
class SXViewEx: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXViewEx)

View File

@ -39,7 +39,6 @@ SXViewEx9::SXViewEx9()
{
}
SXViewEx9::~SXViewEx9()
{
}
@ -53,9 +52,16 @@ BaseObjectPtr SXViewEx9::clone()
void SXViewEx9::readFields(CFRecord& record)
{
Log::error("SXViewEx9 record is not implemented.");
unsigned short flags;
_UINT32 reserved3, flags2;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> rt >> flags >> reserved3 >> flags2 >> itblAutoFmt >> chGrand;
fFrtAlert = GETBIT(flags, 1);
fPrintTitles = GETBIT(flags2, 1);
fLineMode = GETBIT(flags2, 2);
fRepeatItemsOnEachPrintedPage = GETBIT(flags2, 5);
}
} // namespace XLS

View File

@ -32,12 +32,11 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of SXViewEx9 record in BIFF8
class SXViewEx9: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXViewEx9)
@ -47,11 +46,18 @@ public:
~SXViewEx9();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXViewEx9;
static const ElementType type = typeSXViewEx9;
unsigned short rt;
bool fFrtAlert;
bool fPrintTitles;
bool fLineMode;
bool fRepeatItemsOnEachPrintedPage;
unsigned short itblAutoFmt;
XLUnicodeString chGrand;
};

View File

@ -52,9 +52,15 @@ BaseObjectPtr SXViewLink::clone()
void SXViewLink::readFields(CFRecord& record)
{
Log::error("SXViewLink record is not implemented.");
unsigned short unused, reserved;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> rt >> unused >> reserved >> cch;
if (cch > 0 && cch < 0xff)
{
stPivotTable.setSize(cch);
record >> stPivotTable;
}
}
} // namespace XLS

View File

@ -32,12 +32,11 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{
// Logical representation of SXViewLink record in BIFF8
class SXViewLink: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SXViewLink)
@ -47,13 +46,14 @@ public:
~SXViewLink();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSXViewLink;
static const ElementType type = typeSXViewLink;
unsigned short rt;
unsigned char cch;
XLUnicodeStringNoCch stPivotTable;
};

View File

@ -52,7 +52,7 @@ BaseObjectPtr SortData::clone()
void SortData::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
unsigned short flags;
record >> flags;

View File

@ -38,8 +38,6 @@
namespace XLS
{
// Logical representation of SortData record in BIFF8
class SortData: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SortData)
@ -49,11 +47,10 @@ public:
~SortData();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSortData;
static const ElementType type = typeSortData;
bool fCol;
bool fCaseSensitive;

View File

@ -53,7 +53,7 @@ BaseObjectPtr StyleExt::clone()
void StyleExt::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
unsigned char flags;
record >> flags;

View File

@ -32,7 +32,7 @@
#pragma once
#include "BiffRecord.h"
#include <Logic/Biff_structures/BiffString.h>
#include "../Biff_structures/BiffString.h"
namespace XLS
{

View File

@ -44,7 +44,6 @@ SxDXF::~SxDXF()
{
}
BaseObjectPtr SxDXF::clone()
{
return BaseObjectPtr(new SxDXF(*this));
@ -52,9 +51,7 @@ BaseObjectPtr SxDXF::clone()
void SxDXF::readFields(CFRecord& record)
{
Log::error("SxDXF record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> dxfn >> xfext;
}
} // namespace XLS

View File

@ -32,12 +32,12 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/DXFN.h"
#include "../Biff_structures/XFExtNoFRT.h"
namespace XLS
{
// Logical representation of SxDXF record in BIFF8
class SxDXF: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxDXF)
@ -47,11 +47,14 @@ public:
~SxDXF();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxDXF;
static const ElementType type = typeSxDXF;
DXFN dxfn;
XFExtNoFRT xfext;
};
} // namespace XLS

View File

@ -44,7 +44,6 @@ SxFilt::~SxFilt()
{
}
BaseObjectPtr SxFilt::clone()
{
return BaseObjectPtr(new SxFilt(*this));
@ -53,9 +52,18 @@ BaseObjectPtr SxFilt::clone()
void SxFilt::readFields(CFRecord& record)
{
Log::error("SxFilt record is not implemented.");
unsigned short flags1;
unsigned char flags2;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
record >> flags1 >> isxvd >> flags2 >> grbitSbt >> cisxvi;
sxaxisRw = GETBIT(flags1, 0);
sxaxisCol = GETBIT(flags1, 1);
sxaxisPage = GETBIT(flags1, 2);
sxaxisData = GETBIT(flags1, 3);
iDim = GETBITS(flags1, 4, 15);
fSelected = GETBIT(flags2, 0);
}
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SxFilt record in BIFF8
class SxFilt: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxFilt)
@ -50,8 +48,18 @@ public:
void readFields(CFRecord& record);
static const ElementType type = typeSxFilt;
static const ElementType type = typeSxFilt;
bool sxaxisRw;
bool sxaxisCol;
bool sxaxisPage;
bool sxaxisData;
unsigned short iDim;
unsigned short isxvd;
bool fSelected;
unsigned short grbitSbt;
unsigned short cisxvi;
};
} // namespace XLS

View File

@ -53,9 +53,10 @@ BaseObjectPtr SxFormat::clone()
void SxFormat::readFields(CFRecord& record)
{
Log::error("SxFormat record is not implemented.");
unsigned short flags;
record >> flags >> cbData;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
rlType = GETBITS(flags, 0, 3);
}
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SxFormat record in BIFF8
class SxFormat: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxFormat)
@ -47,11 +45,13 @@ public:
~SxFormat();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxFormat;
static const ElementType type = typeSxFormat;
unsigned char rlType;
unsigned short cbData;
};
} // namespace XLS

View File

@ -52,9 +52,14 @@ BaseObjectPtr SxItm::clone()
void SxItm::readFields(CFRecord& record)
{
Log::error("SxItm record is not implemented.");
int size = (record.getDataSize() - record.getRdPtr()) / 2;
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
for (int i = 0; i < size; i++)
{
unsigned short val;
record >> val;
rgisxvi.push_back(val);
}
}
} // namespace XLS

View File

@ -36,9 +36,7 @@
namespace XLS
{
// Logical representation of SxItm record in BIFF8
class SxItm: public BiffRecordContinued
class SxItm: public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxItm)
BASE_OBJECT_DEFINE_CLASS_NAME(SxItm)
@ -47,11 +45,12 @@ public:
~SxItm();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxItm;
static const ElementType type = typeSxItm;
std::vector<unsigned short> rgisxvi;
};
} // namespace XLS

View File

@ -51,9 +51,6 @@ void SxIvd::readFields(CFRecord& record)
record >> val;
rgSxivd.push_back(val);
}
int skip = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(skip);
}
} // namespace XLS

View File

@ -39,12 +39,10 @@ SxRule::SxRule()
{
}
SxRule::~SxRule()
{
}
BaseObjectPtr SxRule::clone()
{
return BaseObjectPtr(new SxRule(*this));
@ -53,9 +51,22 @@ BaseObjectPtr SxRule::clone()
void SxRule::readFields(CFRecord& record)
{
Log::error("SxRule record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
unsigned short flags, reserved;
record >> iDim >> isxvd >> flags >> reserved >> csxFilt >> irwFirst >> irwLast >> icolFirst >> icolLast;
sxaxisRw = GETBIT(flags, 0);
sxaxisCol = GETBIT(flags, 1);
sxaxisPage = GETBIT(flags, 2);
sxaxisData = GETBIT(flags, 3);
sxrType = GETBITS(flags, 4, 7);
fPart = GETBIT(flags, 8);
fDataOnly = GETBIT(flags, 9);
fLabelOnly = GETBIT(flags, 10);
fGrandRw = GETBIT(flags, 11);
fGrandCol = GETBIT(flags, 12);
fGrandRwSav = GETBIT(flags, 13);
fCacheBased = GETBIT(flags, 14);
fGrandColSav = GETBIT(flags, 15);
}
} // namespace XLS

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SxRule record in BIFF8
class SxRule: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxRule)
@ -50,7 +48,29 @@ public:
void readFields(CFRecord& record);
static const ElementType type = typeSxRule;
static const ElementType type = typeSxRule;
unsigned char iDim;
unsigned char isxvd;
bool sxaxisRw;
bool sxaxisCol;
bool sxaxisPage;
bool sxaxisData;
unsigned char sxrType;
bool fPart;
bool fDataOnly;
bool fLabelOnly;
bool fGrandRw;
bool fGrandCol;
bool fGrandRwSav;
bool fCacheBased;
bool fGrandColSav;
unsigned short csxFilt;
unsigned char irwFirst;
unsigned char irwLast;
unsigned char icolFirst;
unsigned char icolLast;
};
} // namespace XLS

View File

@ -53,9 +53,18 @@ BaseObjectPtr SxSelect::clone()
void SxSelect::readFields(CFRecord& record)
{
Log::error("SxSelect record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
short reserved1, flags;
unsigned char reserved2;
record >> reserved1 >> pnn >> reserved2 >> sxaxisAct >> iDimAct >> iLiStart >> iLiAct >> iLiMin >> iLiMax;
record >> rwClick >> colClick >> rwClickPrev >> colClickPrev >> flags;
cClick = GETBITS(flags, 0, 4);
fLabelOnly = GETBIT(flags, 5);
fDataOnly = GETBIT(flags, 6);
fToggleDataHeader = GETBIT(flags, 7);
fSelectionClick = GETBIT(flags, 8);
fExtendable = GETBIT(flags, 9);
}
} // namespace XLS

View File

@ -32,12 +32,11 @@
#pragma once
#include "BiffRecord.h"
#include "../Biff_structures/SxAxis.h"
namespace XLS
{
// Logical representation of SxSelect record in BIFF8
class SxSelect: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxSelect)
@ -51,6 +50,26 @@ public:
void readFields(CFRecord& record);
static const ElementType type = typeSxSelect;
unsigned char pnn; //enum PaneType
SXAxis sxaxisAct;
unsigned short iDimAct;
unsigned short iLiStart;
unsigned short iLiAct;
unsigned short iLiMin;
unsigned short iLiMax;
RwU rwClick;
ColU colClick;
RwU rwClickPrev;
ColU colClickPrev;
unsigned char cClick;
bool fLabelOnly;
bool fDataOnly;
bool fToggleDataHeader;
bool fSelectionClick;
bool fExtendable;
};
} // namespace XLS

View File

@ -53,9 +53,14 @@ BaseObjectPtr SxTbpg::clone()
void SxTbpg::readFields(CFRecord& record)
{
Log::error("SxTbpg record is not implemented.");
record.skipNunBytes(record.getDataSize() - record.getRdPtr());
int size = (record.getDataSize() - record.getRdPtr()) / 2;
for (int i = 0; i < size; i++)
{
short val;
record >> val;
rgiitem.push_back(val);
}
}

View File

@ -36,8 +36,6 @@
namespace XLS
{
// Logical representation of SxTbpg record in BIFF8
class SxTbpg: public BiffRecord
{
BIFF_RECORD_DEFINE_TYPE_INFO(SxTbpg)
@ -47,11 +45,12 @@ public:
~SxTbpg();
BaseObjectPtr clone();
void readFields(CFRecord& record);
static const ElementType type = typeSxTbpg;
static const ElementType type = typeSxTbpg;
std::vector<short> rgiitem;
};

View File

@ -34,21 +34,7 @@
namespace XLS
{
BiffStructurePtr SXAxis::clone()
{
return BiffStructurePtr(new SXAxis(*this));
}
void SXAxis::load(CFRecord& record)
{
unsigned short flags;
record >> flags;
bRw = GETBIT(flags, 0);
bCol = GETBIT(flags, 1);
bPage = GETBIT(flags, 2);
bData = GETBIT(flags, 3);
}
BaseObjectPtr SxView::clone()
{
return BaseObjectPtr(new SxView(*this));

View File

@ -34,29 +34,10 @@
#include "BiffRecord.h"
#include "../Biff_structures/BiffString.h"
#include "../Biff_structures/CellRangeRef.h"
#include "../Biff_structures/SxAxis.h"
namespace XLS
{
class SXAxis : public BiffStructure
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(SXAxis)
public:
SXAxis(){}
~SXAxis(){}
BiffStructurePtr clone();
virtual void load(CFRecord& record);
static const ElementType type = typeSXAxis;
bool bRw;
bool bCol;
bool bPage;
bool bData;
};
class SxView: public BiffRecord
{

View File

@ -31,7 +31,9 @@
*/
#pragma once
#include "SxView.h"
#include "BiffRecord.h"
#include "../Biff_structures/SxAxis.h"
#include "../Biff_structures/BiffString.h"
namespace XLS
{

View File

@ -53,7 +53,7 @@ BaseObjectPtr TableStyle::clone()
void TableStyle::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
unsigned short flags;
record >> flags;
fIsPivot = GETBIT(flags, 1);

View File

@ -54,7 +54,7 @@ BaseObjectPtr TableStyleElement::clone()
void TableStyleElement::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> tseType >> size >> index;
}

View File

@ -53,7 +53,7 @@ BaseObjectPtr TableStyles::clone()
void TableStyles::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
unsigned short cchDefTableStyle;
unsigned short cchDefPivotStyle;

View File

@ -31,8 +31,8 @@
*/
#pragma once
#include <Logic/Biff_structures/FrtHeader.h>
#include "BiffRecord.h"
#include "../Biff_structures/FrtHeader.h"
namespace XLS
{

View File

@ -55,7 +55,7 @@ BaseObjectPtr Theme::clone()
void Theme::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record >> dwThemeVersion;
if(!dwThemeVersion)

View File

@ -103,8 +103,10 @@ void Window2::readFields(CFRecord& record)
if (10 > record.getDataSize())
{
record >> wScaleSLV >> wScaleNormal;
record.skipNunBytes(4); // unused / reserved
}
int sz = record.getDataSize() - record.getRdPtr();
record.skipNunBytes(sz); // unused / reserved
}

View File

@ -53,7 +53,7 @@ BaseObjectPtr XFCRC::clone()
void XFCRC::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record.skipNunBytes(2); // reserved
record >> cxfs >> crc;
}

View File

@ -53,7 +53,7 @@ BaseObjectPtr XFExt::clone()
void XFExt::readFields(CFRecord& record)
{
record.skipNunBytes(12);
#pragma message("############################ frtHeader skipped here")
#pragma message(">>>>>>>>>>> frtHeader skipped here")
record.skipNunBytes(2); // reserved
record >> ixfe;
record.skipNunBytes(2); // reserved

View File

@ -32,7 +32,7 @@
#pragma once
#include "BiffStructure.h"
#include <Logic/Biff_structures/Boolean.h>
#include "Boolean.h"
namespace XLS
{

View File

@ -49,11 +49,10 @@ public:
BiffStructurePtr clone();
static const ElementType type = typeFrtHeaderOld;
static const ElementType type = typeFrtHeaderOld;
virtual void load(CFRecord& record);
CFRecordType::TypeId rt;
FrtFlags grbitFrt;
};

View File

@ -0,0 +1,58 @@
/*
* (c) Copyright Ascensio System SIA 2010-2017
*
* 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 "HiddenMemberSet.h"
#include "BiffString.h"
namespace XLS
{
BiffStructurePtr HiddenMemberSet::clone()
{
return BiffStructurePtr(new HiddenMemberSet(*this));
}
void HiddenMemberSet::load(CFRecord& record)
{
record >> cMemberName;
for (_UINT32 i = 0; i < cMemberName; i++)
{
XLUnicodeString val;
record >> val;
rgMemberName.push_back(val.value());
}
}
} // namespace XLS

Some files were not shown because too many files have changed in this diff Show More