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:
parent
4578731001
commit
5b44611560
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -98,6 +98,8 @@ namespace BinDocxRW
|
||||
NSFontCutter::CEmbeddedFontsManager* pEmbeddedFontsManager);
|
||||
|
||||
std::wstring AddEmbeddedStyle(const std::wstring & styleId);
|
||||
|
||||
bool bWriteAlternative = false;
|
||||
};
|
||||
class ParamsDocumentWriter
|
||||
{
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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>";
|
||||
|
@ -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);
|
||||
|
@ -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())
|
||||
|
@ -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();
|
||||
|
@ -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 \
|
||||
|
Loading…
x
Reference in New Issue
Block a user