1
0
mirror of https://github.com/ONLYOFFICE/core.git synced 2025-04-18 14:04:06 +03:00

write alternative in binary

This commit is contained in:
ElenaSubbotina 2024-10-20 20:27:27 +03:00
parent 4578731001
commit 5b44611560
10 changed files with 145 additions and 122 deletions

View File

@ -609,7 +609,8 @@ extern int g_nCurFormatVersion;
delInstrText = 31,
linebreakClearAll = 32,
linebreakClearLeft = 33,
linebreakClearRight = 34
linebreakClearRight = 34,
pptxDrawingAlternative = 0x99
};}
namespace c_oSerVbaProjectTypes{enum c_oSerVbaProjectType
{

View File

@ -6705,7 +6705,7 @@ bool BinaryDocumentTableWriter::WriteDrawingPptx(OOX::WritingElement* item)
}
res = WriteDrawingPptx(we);
if (res == false || we == NULL)
if (res == false || we == NULL || m_oParamsWriter.bWriteAlternative)
{
if (false == pAlternateContent->m_arrFallbackItems.empty())
{
@ -6750,7 +6750,8 @@ bool BinaryDocumentTableWriter::WriteDrawingPptx(OOX::WritingElement* item)
}
else
{
int nCurPos = m_oBcw.WriteItemStart(c_oSerRunType::pptxDrawing);
int nCurPos = m_oBcw.WriteItemStart(m_oParamsWriter.bWriteAlternative ? c_oSerRunType::pptxDrawingAlternative : c_oSerRunType::pptxDrawing);
m_oParamsWriter.bWriteAlternative = false;
WriteDrawing(NULL, pGraphicDrawing, pGraphic);
m_oBcw.WriteItemEnd(nCurPos);
}
@ -6833,6 +6834,11 @@ void BinaryDocumentTableWriter::WriteDrawing(std::wstring* pXml, OOX::Logic::CDr
pGraphic->chartRec->toPPTY(&m_oBcw.m_oStream);
m_oBcw.WriteItemWithLengthEnd(nCurPos);
if (pGraphic->chartRec->m_bChartEx)
{
m_oParamsWriter.bWriteAlternative = true;
}
}
else
{
@ -6848,11 +6854,6 @@ void BinaryDocumentTableWriter::WriteDrawing(std::wstring* pXml, OOX::Logic::CDr
{
pGraphic->olePic->toPPTY(&m_oBcw.m_oStream);
}
//else if (pGraphic->smartArt.is_init())
//{
// pGraphic->smartArt->LoadDrawing(&m_oBcw.m_oStream);
// pGraphic->smartArt->toPPTY(&m_oBcw.m_oStream);
//}
else if (pGraphic->element.is_init())
{
pGraphic->element.toPPTY(&m_oBcw.m_oStream);

View File

@ -98,6 +98,8 @@ namespace BinDocxRW
NSFontCutter::CEmbeddedFontsManager* pEmbeddedFontsManager);
std::wstring AddEmbeddedStyle(const std::wstring & styleId);
bool bWriteAlternative = false;
};
class ParamsDocumentWriter
{

View File

@ -197,22 +197,24 @@ namespace NSBinPptxRW
#define SPTREE_TYPE_OLE 6
#define SPTREE_TYPE_VIDEO 7
#define SPTREE_TYPE_AUDIO 8
#define SPTREE_TYPE_LOCKED_CANVAS 9
#define SPTREE_TYPE_LOCKED_CANVAS 9
#define SPTREE_TYPE_ALTERNATIVE 0x99
#define DIAGRAM_LAYOUT_TYPE_NONE 0xB0
#define DIAGRAM_LAYOUT_TYPE_ALG 0xB1
#define DIAGRAM_LAYOUT_TYPE_CHOOSE 0xB2
#define DIAGRAM_LAYOUT_TYPE_CONSTRLST 0xB3
#define DIAGRAM_LAYOUT_TYPE_CONSTRLST 0xB3
#define DIAGRAM_LAYOUT_TYPE_FOREACH 0xB4
#define DIAGRAM_LAYOUT_TYPE_LAYOUTNODE 0xB5
#define DIAGRAM_LAYOUT_TYPE_LAYOUTNODE 0xB5
#define DIAGRAM_LAYOUT_TYPE_PRESOF 0xB6
#define DIAGRAM_LAYOUT_TYPE_RULELST 0xB7
#define DIAGRAM_LAYOUT_TYPE_SHAPE 0xB8
#define DIAGRAM_LAYOUT_TYPE_VARIABLELIST 0xB9
#define DIAGRAM_LAYOUT_TYPE_VARIABLELIST 0xB9
#define SPTREE_TYPE_MACRO 0xA1
#define SPTREE_TYPE_MACRO 0xA1
static BYTE SchemeClr_GetBYTECode(const std::wstring& sValue)

View File

@ -6547,9 +6547,18 @@ void BinaryWorksheetTableWriter::WriteDrawing(const OOX::Spreadsheet::CWorksheet
m_oBcw.m_oStream.WriteBYTE(c_oSer_DrawingType::pptxDrawing);
int nCurPos = m_oBcw.WriteItemWithLengthStart();
m_oBcw.m_oStream.StartRecord(0);
m_oBcw.m_oStream.WriteRecord2(1, pCellAnchor->m_oElement->GetElem());
m_oBcw.m_oStream.EndRecord();
if (pCellAnchor->m_oElement->GetElemAlternative().IsInit())
{
m_oBcw.m_oStream.StartRecord(0x99);
m_oBcw.m_oStream.WriteRecord2(1, pCellAnchor->m_oElement->GetElemAlternative());
m_oBcw.m_oStream.EndRecord();
}
m_oBcw.WriteItemWithLengthEnd(nCurPos);
m_oBcw.m_oStream.SetRels(oldRels);

View File

@ -543,63 +543,6 @@ namespace PPTX
xml_object_vml = GetVmlXmlBySpid(xml_object_rels);
}
//if (smartArt.is_init() && !table.is_init() && !chartRec.is_init() && !slicer.is_init() && !slicerExt.is_init() && !vmlSpid.is_init())
//{
// smartArt->LoadDrawing(pWriter);
//
// if (smartArt->m_diag.is_init())
// {
// if (nvGraphicFramePr.IsInit())
// {
// smartArt->m_diag->nvGrpSpPr.cNvPr = nvGraphicFramePr->cNvPr;
// smartArt->m_diag->nvGrpSpPr.nvPr = nvGraphicFramePr->nvPr;
// }
// bool bIsInitCoords = false;
// if (smartArt->m_diag->grpSpPr.xfrm.IsInit())
// {
// bIsInitCoords = true;
// }
// else if (xfrm.IsInit())
// {
// smartArt->m_diag->grpSpPr.xfrm = new PPTX::Logic::Xfrm();
// }
// PPTX::Logic::Xfrm* dst = smartArt->m_diag->grpSpPr.xfrm.GetPointer();
// PPTX::Logic::Xfrm* src = xfrm.GetPointer();
// if (dst && src)
// {
// dst->offX = src->offX;
// dst->offY = src->offY;
// dst->extX = src->extX;
// dst->extY = src->extY;
//
// if (!bIsInitCoords || !dst->chOffX.is_init() || !dst->chOffY.is_init() || !dst->chExtX.is_init() || !dst->chExtY.is_init())
// {
// dst->chOffX = 0;
// dst->chOffY = 0;
// dst->chExtX = src->extX;
// dst->chExtY = src->extY;
// }
//
// dst->flipH = src->flipH;
// dst->flipV = src->flipV;
// dst->rot = src->rot;
// }
// //удалим индекс плейсхолдера если он есть(p:nvPr) - он будет лишний так как будет имплементация объекта
// if (smartArt->m_diag->nvGrpSpPr.nvPr.ph.IsInit())
// {
// if(smartArt->m_diag->nvGrpSpPr.nvPr.ph->idx.IsInit())
// {
// smartArt->m_diag->nvGrpSpPr.nvPr.ph.reset();
// }
// }
// smartArt->toPPTY(pWriter);
// }
// return;
//}
if (false == xml_object_vml.empty() && !table.IsInit() && !chartRec.IsInit() && !slicer.IsInit() && !slicerExt.IsInit() && !smartArt.IsInit())
{
std::wstring temp = L"<v:object>";

View File

@ -432,47 +432,45 @@ namespace PPTX
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
nvGrpSpPr.fromPPTY(pReader);
break;
}
case 1:
{
grpSpPr.fromPPTY(pReader);
break;
}
case 2:
{
pReader->Skip(4); // len
ULONG _c = pReader->GetULong();
for (ULONG i = 0; i < _c; ++i)
case 0:
{
pReader->Skip(1); // type (0)
LONG nElemLength = pReader->GetLong(); // len
//SpTreeElem::fromPPTY сразу делает GetChar, а toPPTY ничего не пишет если не инициализирован
if (nElemLength > 0)
{
SpTreeElem elm;
elm.fromPPTY(pReader);
nvGrpSpPr.fromPPTY(pReader);
}break;
case 1:
{
grpSpPr.fromPPTY(pReader);
}break;
case 2:
{
pReader->Skip(4); // len
ULONG _c = pReader->GetULong();
if (elm.is_init())
for (ULONG i = 0; i < _c; ++i)
{
pReader->Skip(1); // type (0)
LONG nElemLength = pReader->GetLong(); // len
//SpTreeElem::fromPPTY сразу делает GetChar, а toPPTY ничего не пишет если не инициализирован
if (nElemLength > 0)
{
if (elm.getType() == OOX::et_p_ShapeTree)
SpTreeElem elm;
elm.fromPPTY(pReader);
if (elm.is_init())
{
smart_ptr<SpTree> e = elm.GetElem().smart_dynamic_cast<SpTree>();
e->m_lGroupIndex = m_lGroupIndex + 1;
if (elm.getType() == OOX::et_p_ShapeTree)
{
smart_ptr<SpTree> e = elm.GetElem().smart_dynamic_cast<SpTree>();
e->m_lGroupIndex = m_lGroupIndex + 1;
}
SpTreeElems.push_back(elm);
}
SpTreeElems.push_back(elm);
}
}
}
}
default:
{
break;
}
}break;
default:
{
pReader->SkipRecord();
}break;
}
}
pReader->Seek(_end_rec);

View File

@ -391,15 +391,30 @@ namespace PPTX
std::wstring name = XmlUtils::GetNameNoNS(oReader.GetName());
if (name == L"sp" || name == L"wsp")
m_elem.reset(new Logic::Shape(oReader));
{
if (m_bAlternative)
m_elem_alternative.reset(new Logic::Shape(oReader));
else
m_elem.reset(new Logic::Shape(oReader));
}
else if (name == L"pic")
m_elem.reset(new Logic::Pic(oReader));
{
if (m_bAlternative)
m_elem_alternative.reset(new Logic::Pic(oReader));
else
m_elem.reset(new Logic::Pic(oReader));
}
else if (name == L"cxnSp")
m_elem.reset(new Logic::CxnSp(oReader));
else if (name == L"lockedCanvas")
m_elem.reset(CreatePtrXmlContent<Logic::LockedCanvas>(oReader));
else if (name == L"grpSp" || name == L"wgp" || name == L"spTree" || name == L"wpc")
m_elem.reset(CreatePtrXmlContent<Logic::SpTree>(oReader));
{
if (m_bAlternative)
m_elem_alternative.reset(CreatePtrXmlContent<Logic::SpTree>(oReader));
else
m_elem.reset(CreatePtrXmlContent<Logic::SpTree>(oReader));
}
else if (name == L"graphicFrame")
{
Logic::GraphicFrame *pGraphic = new Logic::GraphicFrame();
@ -407,7 +422,12 @@ namespace PPTX
pGraphic->fromXML(oReader);
if (pGraphic && pGraphic->IsEmpty() == false)
m_elem.reset(pGraphic);
{
if (m_bAlternative)
m_elem_alternative.reset(pGraphic);
else
m_elem.reset(pGraphic);
}
else
RELEASEOBJECT(pGraphic);
}
@ -426,12 +446,15 @@ namespace PPTX
if (strName == L"mc:Choice")
{
ReadAttributesRequires(oReader);
oReader.ReadNextSiblingNode(nCurDepth + 1);
fromXML(oReader);
fromXML(oReader);
m_bAlternative = (L"cx1" == m_sRequires || L"cx2" == m_sRequires);
m_sRequires = L"";
if (m_elem.is_init())
if (m_elem.is_init() && !m_bAlternative)
break;
}
else if (strName == L"mc:Fallback")
@ -441,24 +464,44 @@ namespace PPTX
}
}
}
m_bAlternative = false;
}
void SpTreeElem::fromXML(XmlUtils::CXmlNode& node)
{
std::wstring name = XmlUtils::GetNameNoNS(node.GetName());
if (name == L"sp" || name == L"wsp")
m_elem.reset(new Logic::Shape(node));
{
if (m_bAlternative)
m_elem_alternative.reset(new Logic::Shape(node));
else
m_elem.reset(new Logic::Shape(node));
}
else if (name == L"pic")
m_elem.reset(new Logic::Pic(node));
{
if (m_bAlternative)
m_elem_alternative.reset(new Logic::Pic(node));
else
m_elem.reset(new Logic::Pic(node));
}
else if (name == L"cxnSp")
m_elem.reset(new Logic::CxnSp(node));
else if (name == L"lockedCanvas")
m_elem.reset(CreatePtrXmlContent<Logic::LockedCanvas>(node));
else if (name == L"grpSp" || name == L"wgp" || name == L"spTree" || name == L"wpc")
m_elem.reset(CreatePtrXmlContent<Logic::SpTree>(node));
{
if (m_bAlternative)
m_elem_alternative.reset(CreatePtrXmlContent<Logic::SpTree>(node));
else
m_elem.reset(CreatePtrXmlContent<Logic::SpTree>(node));
}
else if (name == L"graphicFrame")
{
m_elem.reset(new Logic::GraphicFrame(node));
if (m_bAlternative)
m_elem_alternative.reset(new Logic::GraphicFrame(node));
else
m_elem.reset(new Logic::GraphicFrame(node));
Logic::GraphicFrame *graphic_frame = dynamic_cast<Logic::GraphicFrame*>(m_elem.GetPointer());
if (graphic_frame)
@ -470,18 +513,21 @@ namespace PPTX
else if (name == L"AlternateContent")
{
bool isEmpty = true;
XmlUtils::CXmlNode oNodeChoice;
if (node.GetNode(L"mc:Choice", oNodeChoice))
{
XmlUtils::CXmlNode oNodeFall;
std::vector<XmlUtils::CXmlNode> oNodesC;
std::wstring sRequires;
//todo better check (a14 can be math, slicer)
if(oNodeChoice.GetAttributeIfExist(L"Requires", sRequires) && (L"a14" == sRequires || L"cx1" == sRequires))
oNodeChoice.GetAttributeIfExist(L"Requires", m_sRequires);
if (L"a14" == m_sRequires || L"cx1" == m_sRequires || L"cx2" == m_sRequires)
{
oNodeChoice.GetNodes(L"*", oNodesC);
if (1 == oNodesC.size())
if (oNodesC.size() > 0)
{
XmlUtils::CXmlNode & oNodeC = oNodesC[0];
@ -490,11 +536,12 @@ namespace PPTX
isEmpty = (false == m_elem.IsInit());
}
}
if (isEmpty && node.GetNode(L"mc:Fallback", oNodeFall))
m_bAlternative = (L"cx1" == m_sRequires || L"cx2" == m_sRequires);
if ((isEmpty || m_bAlternative) && node.GetNode(L"mc:Fallback", oNodeFall))
{
oNodeFall.GetNodes(L"*", oNodesC);
if (1 == oNodesC.size())
if (oNodesC.size() > 0)
{
XmlUtils::CXmlNode & oNodeC = oNodesC[0];
@ -503,7 +550,7 @@ namespace PPTX
}
}
}
if(isEmpty)
if (isEmpty)
{
m_elem.reset();
}
@ -514,6 +561,8 @@ namespace PPTX
m_binaryData = node;
}
else m_elem.reset();
m_bAlternative = false;
}
void SpTreeElem::ReadAttributesRequires(XmlUtils::CXmlLiteReader& oReader)
{
@ -627,6 +676,13 @@ namespace PPTX
{
if (m_elem.is_init())
m_elem->toPPTY(pWriter);
if (m_elem_alternative.is_init())
{
pWriter->StartRecord(SPTREE_TYPE_ALTERNATIVE);
m_elem_alternative->toPPTY(pWriter);
pWriter->EndRecord();
}
}
void SpTreeElem::InitElem(WrapperWritingElement* pElem)
{
@ -689,6 +745,10 @@ namespace PPTX
{
return m_elem;
}
smart_ptr<WrapperWritingElement> SpTreeElem::GetElemAlternative()
{
return m_elem_alternative;
}
void SpTreeElem::SetParentPointer(const WrapperWritingElement* pParent)
{
if (is_init())

View File

@ -93,15 +93,18 @@ namespace PPTX
std::wstring GetUriElem();
smart_ptr<WrapperWritingElement> GetElem();
smart_ptr<WrapperWritingElement> GetElemAlternative();
virtual void SetParentPointer(const WrapperWritingElement* pParent);
std::wstring GetSlicerRequires();
nullable<OOX::Logic::CBinData> m_binaryData;
std::wstring m_sRequires;//from mc:Choice
bool m_bAlternative = false;
private:
smart_ptr<WrapperWritingElement> m_elem;
smart_ptr<WrapperWritingElement> m_elem_alternative;
protected:
virtual void FillParentPointersForChilds();

View File

@ -24,11 +24,15 @@ DESTDIR = $$CORE_BUILDS_BINARY_PATH
HEADERS += \
$$PWD/../source/ECMACryptFile.h \
$$PWD/../source/CryptTransform.h \
$$PWD/../source/simple_xml_writer.h
$$PWD/../source/simple_xml_writer.h \
../../MsBinaryFile/XlsFile/Format/Logging/Log.h \
../../MsBinaryFile/XlsFile/Format/Logging/Logger.h
SOURCES += \
$$PWD/../source/ECMACryptFile.cpp \
$$PWD/../source/CryptTransform.cpp
$$PWD/../source/CryptTransform.cpp \
../../MsBinaryFile/XlsFile/Format/Logging/Log.cpp \
../../MsBinaryFile/XlsFile/Format/Logging/Logger.cpp
SOURCES += \
$$CORE_ROOT_DIR/Common/OfficeFileFormatChecker2.cpp \