Add future metadata bynary reading

This commit is contained in:
Viktor Andreev
2024-07-22 14:16:52 +06:00
parent d48e3ab6e0
commit 16324b7bf1
6 changed files with 88 additions and 10 deletions

View File

@ -930,6 +930,7 @@ enum ElementType
typeTABLESLICERCACHEIDS,
typeSLICERCACHEID,
typeTABLESLICERCACHEID,
typeFMD
};

View File

@ -1185,6 +1185,32 @@ namespace OOX
m_arrExt.push_back( oExt );
}
}
}
else if (obj->get_type() == XLS::typeFMD)
{
auto ptr = static_cast<XLSB::FMD*>(obj.get());
if (ptr != nullptr)
{
if (ptr->m_DYNAMICARRAYMETADATA != nullptr)
{
OOX::Drawing::COfficeArtExtension *oExt = new OOX::Drawing::COfficeArtExtension();
oExt->m_sUri = L"{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}";
oExt->m_sAdditionalNamespace = L"xmlns:xda=\"http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray\"";
oExt->m_oDynamicArrayProperties = ptr->m_DYNAMICARRAYMETADATA;
if (oExt)
m_arrExt.push_back( oExt );
}
else if(ptr->m_RICHDATAMETADATA != nullptr)
{
OOX::Drawing::COfficeArtExtension *oExt = new OOX::Drawing::COfficeArtExtension();
oExt->m_sUri = L"{3E2802C4-A4D2-4D8B-9148-E3BE6C30E623}";
oExt->m_sAdditionalNamespace = L"xmlns:xlrd=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\"";
oExt->m_oRichValueBlock = ptr->m_RICHDATAMETADATA;
if (oExt)
m_arrExt.push_back( oExt );
}
}
}
}
EElementType COfficeArtExtensionList::getType() const

View File

@ -36,21 +36,22 @@
namespace XLSB
{
class FMD: public XLS::CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(FMD)
public:
FMD();
~FMD();
class FMD: public XLS::CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(FMD)
public:
FMD();
~FMD();
XLS::BaseObjectPtr clone();
XLS::BaseObjectPtr clone();
const bool loadContent(XLS::BinProcessor& proc) override;
const bool saveContent(XLS::BinProcessor& proc) override;
static const XLS::ElementType type = XLS::typeFMD;
bool m_BrtBeginFmd;
XLS::BaseObjectPtr m_DYNAMICARRAYMETADATA;
XLS::BaseObjectPtr m_RICHDATAMETADATA;
XLS::BaseObjectPtr m_DYNAMICARRAYMETADATA;
XLS::BaseObjectPtr m_RICHDATAMETADATA;
bool m_bBrtEndFmd;
};

View File

@ -117,6 +117,10 @@ const bool MetadataStream::loadContent(BinProcessor& proc)
elements_.pop_back();
}
}break;
case rt_EndMetadata:
{
return true;
}break;
default://skip
{
proc.SkipRecord();

View File

@ -44,6 +44,8 @@
#include "../../XlsbFormat/Biff12_unions/MDXMBRPROP.h"
#include "../../XlsbFormat/Biff12_unions/MDXSET.h"
#include "../../XlsbFormat/Biff12_unions/MDXTUPLE.h"
#include "../../XlsbFormat/Biff12_unions/DYNAMICARRAYMETADATA.h"
#include "../../XlsbFormat/Biff12_unions/RICHDATAMETADATA.h"
#include "../../XlsbFormat/Biff12_records/Str.h"
#include "../../XlsbFormat/Biff12_records/Mdtinfo.h"
@ -1162,6 +1164,11 @@ namespace OOX
{
return m_oExtLst->toBinMetadata();
}
void CFutureMetadataBlock::fromBin(XLS::BaseObjectPtr& obj)
{
m_oExtLst = OOX::Drawing::COfficeArtExtensionList();
m_oExtLst->fromBin(obj);
}
//-------------------------------------------------------------------------------------
CFutureMetadata::CFutureMetadata() {}
CFutureMetadata::~CFutureMetadata()
@ -1237,6 +1244,20 @@ namespace OOX
ptr->FMDs.push_back(i->toBin());
return objectPtr;
}
void CFutureMetadata::fromBin(XLS::BaseObjectPtr& obj)
{
auto ptr = static_cast<XLSB::ESFMD*>(obj.get());
if(ptr->m_BrtBeginEsfmd != nullptr)
{
auto beginPtr = static_cast<XLSB::BeginEsfmd*>(ptr->m_BrtBeginEsfmd.get());
m_oName = beginPtr->stName;
}
for(auto i : ptr->FMDs)
{
m_arrItems.push_back(new CFutureMetadataBlock(i));
}
m_oCount = m_arrItems.size();
}
//--------------------------------------------------------------------------------------------------------
CMetadata::CMetadata() {}
CMetadata::~CMetadata()
@ -1269,6 +1290,8 @@ namespace OOX
m_oValueMetadata = streamPtr->m_ValueMetadataBlocks;
if(streamPtr->m_CellMetadataBlocks != nullptr)
m_oCellMetadata = streamPtr->m_CellMetadataBlocks;
for(auto i : streamPtr->m_ESFMDs)
m_arFutureMetadata.push_back(new CFutureMetadata(i));
}
XLS::BaseObjectPtr CMetadata::toBin() const
{
@ -1518,6 +1541,13 @@ xmlns:xda=\"http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray\
ptr->fCollapsed = m_oFCollapsed.get();
return objectPtr;
}
void CDynamicArrayProperties::fromBin(XLS::BaseObjectPtr& obj)
{
auto ptr = static_cast<XLSB::DYNAMICARRAYMETADATA*>(obj.get());
auto endPtr = static_cast<XLSB::EndDynamicArrayPr*>(ptr->m_EndDynamicArrayPr.get());
m_oFDynamic = endPtr->fDynamic;
m_oFCollapsed = endPtr->fCollapsed;
}
//-------------------------------------------------------------------------------------------------------------------------------------
CRichValueBlock::CRichValueBlock() {}
CRichValueBlock::~CRichValueBlock() {}
@ -1561,6 +1591,14 @@ xmlns:xda=\"http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray\
ptr->irv = 0;
return objectPtr;
}
void CRichValueBlock::fromBin(XLS::BaseObjectPtr& obj)
{
auto ptr = static_cast<XLSB::RICHDATAMETADATA*>(obj.get());
if(ptr->m_BeginRichValueBlock == nullptr)
return;
auto ptr1 = static_cast<XLSB::BeginRichValueBlock*>(ptr->m_BeginRichValueBlock.get());
m_oI = ptr1->irv;
}
}
} // namespace OOX

View File

@ -261,6 +261,7 @@ namespace OOX
class CFutureMetadataBlock : public WritingElement
{
public:
WritingElement_XlsbConstructors(CFutureMetadataBlock)
WritingElement_AdditionMethods(CFutureMetadataBlock)
CFutureMetadataBlock();
virtual ~CFutureMetadataBlock();
@ -268,6 +269,7 @@ namespace OOX
virtual void fromXML(XmlUtils::CXmlNode& node);
virtual std::wstring toXML() const;
void fromBin(XLS::BaseObjectPtr& obj);
XLS::BaseObjectPtr toBin() const;
virtual void toXML(NSStringUtils::CStringBuilder& writer) const;
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
@ -414,6 +416,7 @@ namespace OOX
class CFutureMetadata : public WritingElementWithChilds<CFutureMetadataBlock>
{
public:
WritingElement_XlsbConstructors(CFutureMetadata)
WritingElement_AdditionMethods(CFutureMetadata)
CFutureMetadata();
virtual ~CFutureMetadata();
@ -421,6 +424,7 @@ namespace OOX
virtual void fromXML(XmlUtils::CXmlNode& node);
virtual std::wstring toXML() const;
void fromBin(XLS::BaseObjectPtr& obj);
XLS::BaseObjectPtr toBin() const;
virtual void toXML(NSStringUtils::CStringBuilder& writer) const;
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
@ -492,6 +496,7 @@ namespace OOX
class CDynamicArrayProperties : public WritingElement
{
public:
WritingElement_XlsbConstructors(CDynamicArrayProperties)
WritingElement_AdditionMethods(CDynamicArrayProperties)
CDynamicArrayProperties();
virtual ~CDynamicArrayProperties();
@ -499,6 +504,7 @@ namespace OOX
virtual void fromXML(XmlUtils::CXmlNode& node);
virtual std::wstring toXML() const;
void fromBin(XLS::BaseObjectPtr& obj);
XLS::BaseObjectPtr toBin();
virtual void toXML(NSStringUtils::CStringBuilder& writer) const;
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
@ -516,6 +522,7 @@ namespace OOX
class CRichValueBlock : public WritingElement
{
public:
WritingElement_XlsbConstructors(CRichValueBlock)
WritingElement_AdditionMethods(CRichValueBlock)
CRichValueBlock();
virtual ~CRichValueBlock();
@ -523,6 +530,7 @@ namespace OOX
virtual void fromXML(XmlUtils::CXmlNode& node);
virtual std::wstring toXML() const;
void fromBin(XLS::BaseObjectPtr& obj);
XLS::BaseObjectPtr toBin();
virtual void toXML(NSStringUtils::CStringBuilder& writer) const;
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);