861 lines
23 KiB
C++
861 lines
23 KiB
C++
/*
|
|
* (c) Copyright Ascensio System SIA 2010-2014
|
|
*
|
|
* 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 "stdafx.h"
|
|
#include "resource.h"
|
|
|
|
#include "../Common/OfficeFileTemplate.h"
|
|
#include "./PPTXFormat/Logic/SpTreeElem.h"
|
|
|
|
#include "../Common/DocxFormat/Source/Common/SimpleTypes_Base.h"
|
|
#include "../ASCPresentationEditor/OfficeDrawing/Shapes/Shape.h"
|
|
|
|
#include "./PPTXFormat/Logic/Geometry.h"
|
|
|
|
namespace PPTX
|
|
{
|
|
class CCSS
|
|
{
|
|
public:
|
|
CAtlMap<CString, CString> m_mapSettings;
|
|
CString m_strClassName;
|
|
|
|
public:
|
|
CCSS()
|
|
{
|
|
Clear();
|
|
}
|
|
~CCSS()
|
|
{
|
|
}
|
|
AVSINLINE void Clear()
|
|
{
|
|
m_strClassName = _T("");
|
|
m_mapSettings.RemoveAll();
|
|
}
|
|
|
|
public:
|
|
void LoadFromString(CString& strParams)
|
|
{
|
|
Clear();
|
|
|
|
|
|
TCHAR* pData = strParams.GetBuffer();
|
|
int nCount = strParams.GetLength();
|
|
|
|
int nPosition = 0;
|
|
TCHAR* pDataMem = pData;
|
|
|
|
while ((nPosition < nCount) && ((TCHAR(' ') == *pDataMem) || (TCHAR('\n') == *pDataMem) || (TCHAR('.') == *pDataMem)))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
int nPosNameStart = nPosition;
|
|
while ((nPosition < nCount) && (TCHAR(' ') != *pDataMem) && (TCHAR('{') != *pDataMem))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
m_strClassName = strParams.Mid(nPosNameStart, nPosition - nPosNameStart);
|
|
|
|
while (true)
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
|
|
|
|
while ((nPosition < nCount) && ((TCHAR(' ') == *pDataMem) || (TCHAR('{') == *pDataMem)))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
int nPosOld = nPosition;
|
|
|
|
|
|
while ((nPosition < nCount) && (TCHAR(':') != *pDataMem))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
if (nPosOld == nPosition)
|
|
{
|
|
|
|
break;
|
|
}
|
|
CString strName = strParams.Mid(nPosOld, nPosition - nPosOld);
|
|
|
|
|
|
++nPosition;
|
|
++pDataMem;
|
|
|
|
|
|
while ((nPosition < nCount) && (TCHAR(' ') == *pDataMem))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
nPosOld = nPosition;
|
|
|
|
|
|
while ((nPosition < nCount) && (TCHAR(';') != *pDataMem) && (TCHAR('}') != *pDataMem))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
CString strValue = strParams.Mid(nPosOld, nPosition - nPosOld);
|
|
|
|
m_mapSettings.SetAt(strName, strValue);
|
|
}
|
|
}
|
|
|
|
void LoadFromString2(CString& strParams)
|
|
{
|
|
Clear();
|
|
|
|
|
|
TCHAR* pData = strParams.GetBuffer();
|
|
int nCount = strParams.GetLength();
|
|
|
|
int nPosition = 0;
|
|
TCHAR* pDataMem = pData;
|
|
|
|
m_strClassName = _T("");
|
|
|
|
while (true)
|
|
{
|
|
|
|
while ((nPosition < nCount) && ((TCHAR(' ') == *pDataMem) || (TCHAR('{') == *pDataMem) || (TCHAR(';') == *pDataMem)))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
int nPosOld = nPosition;
|
|
|
|
|
|
while ((nPosition < nCount) && (TCHAR(':') != *pDataMem))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
if (nPosOld == nPosition)
|
|
{
|
|
|
|
break;
|
|
}
|
|
CString strName = strParams.Mid(nPosOld, nPosition - nPosOld);
|
|
|
|
|
|
++nPosition;
|
|
++pDataMem;
|
|
|
|
|
|
while ((nPosition < nCount) && (TCHAR(' ') == *pDataMem))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
nPosOld = nPosition;
|
|
|
|
|
|
while ((nPosition < nCount) && (TCHAR(';') != *pDataMem) && (TCHAR('}') != *pDataMem))
|
|
{
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
|
|
CString strValue = strParams.Mid(nPosOld, nPosition - nPosOld);
|
|
|
|
if (pData[nPosOld] == WCHAR('.'))
|
|
strValue = (_T("0") + strValue);
|
|
|
|
m_mapSettings.SetAt(strName, strValue);
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
class CStylesCSS
|
|
{
|
|
public:
|
|
CAtlArray<CCSS> m_arStyles;
|
|
|
|
public:
|
|
CStylesCSS() : m_arStyles()
|
|
{
|
|
}
|
|
~CStylesCSS()
|
|
{
|
|
}
|
|
AVSINLINE void Clear()
|
|
{
|
|
m_arStyles.RemoveAll();
|
|
}
|
|
|
|
public:
|
|
void LoadStyles(CString& strParams)
|
|
{
|
|
Clear();
|
|
|
|
TCHAR* pData = strParams.GetBuffer();
|
|
int nCount = strParams.GetLength();
|
|
|
|
int nPosition = 0;
|
|
int nPositionOld = 0;
|
|
TCHAR* pDataMem = pData;
|
|
|
|
while (nPosition < nCount)
|
|
{
|
|
if (*pDataMem == TCHAR('}'))
|
|
{
|
|
CString strTemp = strParams.Mid(nPositionOld, nPosition - nPositionOld + 1);
|
|
m_arStyles.Add();
|
|
m_arStyles[m_arStyles.GetCount() - 1].LoadFromString(strTemp);
|
|
|
|
nPositionOld = nPosition + 1;
|
|
}
|
|
|
|
++nPosition;
|
|
++pDataMem;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
[object, uuid("44B693E1-F4F9-4547-ACEF-0AE037C84485"), dual, pointer_default(unique)]
|
|
__interface IAVSODObjectProps : IDispatch
|
|
{
|
|
[id(1)] HRESULT GetProperty([in] LONG lId, [out, retval] VARIANT* pProp);
|
|
[id(2)] HRESULT SetProperty([in] LONG lId, [in] VARIANT prop);
|
|
|
|
[id(1000)] HRESULT SetAdditionalParam([in] BSTR ParamName, [in] VARIANT ParamValue);
|
|
[id(1001)] HRESULT GetAdditionalParam([in] BSTR ParamName, [out, retval] VARIANT* ParamValue);
|
|
};
|
|
|
|
|
|
[object, uuid("8E0FBC40-9B34-40bf-B68A-0FA320E1B004"), dual, pointer_default(unique)]
|
|
__interface IAVSOfficeDrawingConverter : IDispatch
|
|
{
|
|
[id(1)] HRESULT SetMainDocument([in] IUnknown* pDocument);
|
|
[id(2)] HRESULT SetRelsPath([in] BSTR bsRelsPath);
|
|
[id(3)] HRESULT SetMediaDstPath([in] BSTR bsMediaPath);
|
|
|
|
[id(9)] HRESULT AddShapeType([in] BSTR bsXml);
|
|
[id(10)] HRESULT AddObject([in] BSTR bsXml, [out] BSTR* pMainProps, [out, satype("BYTE")] SAFEARRAY** ppBinary);
|
|
[id(11)] HRESULT SaveObject([in, satype("BYTE")] SAFEARRAY* pBinaryObj, [in] LONG lStart, [in] LONG lLength, [in] BSTR bsMainProps, [out] BSTR* bsXml);
|
|
[id(12)] HRESULT SaveObjectEx([in, satype("BYTE")] SAFEARRAY* pBinaryObj, [in] LONG lStart, [in] LONG lLength, [in] BSTR bsMainProps, [in] LONG lDocType, [out] BSTR* bsXml);
|
|
|
|
[id(13)] HRESULT GetRecordBinary([in] LONG lRecordType, [in] BSTR bsXml, [out, satype("BYTE")] SAFEARRAY** ppBinary);
|
|
[id(14)] HRESULT GetRecordXml([in, satype("BYTE")] SAFEARRAY* pBinaryObj, [in] LONG lStart, [in] LONG lLength, [in] LONG lRecType, [in] LONG lDocType, [out] BSTR* bsXml);
|
|
|
|
[id(20)] HRESULT AddObject2([in] BSTR bsXml, [in, satype("BYTE")] SAFEARRAY* pBinaryObj, [out] BSTR* pXmlOutput);
|
|
|
|
[id(30)] HRESULT GetThemeBinary([in] BSTR bsThemeFilePath, [out, satype("BYTE")] SAFEARRAY** ppBinary);
|
|
[id(31)] HRESULT SaveThemeXml([in, satype("BYTE")] SAFEARRAY* pBinaryTheme, [in] LONG lStart, [in] LONG lLength, [in] BSTR bsThemePath);
|
|
|
|
[id(40)] HRESULT SetDstContentRels();
|
|
[id(41)] HRESULT SaveDstContentRels([in] BSTR bsRelsPath);
|
|
[id(42)] HRESULT WriteRels([in] BSTR bsType, [in] BSTR bsTarget, [in] BSTR bsTargetMode, [out] LONG* lId);
|
|
|
|
[id(50)] HRESULT LoadClrMap([in] BSTR bsXml);
|
|
|
|
[id(60)] HRESULT GetTxBodyBinary([in] BSTR bsXml, [out, satype("BYTE")] SAFEARRAY** ppBinary);
|
|
[id(61)] HRESULT GetTxBodyXml([in, satype("BYTE")] SAFEARRAY* pBinary, [in] LONG lStart, [in] LONG lLength, BSTR* pbstrXml);
|
|
[id(62)] HRESULT SetFontDir([in] BSTR bsFontDir);
|
|
|
|
[id(1000)] HRESULT SetAdditionalParam([in] BSTR ParamName, [in] VARIANT ParamValue);
|
|
[id(1001)] HRESULT GetAdditionalParam([in] BSTR ParamName, [out, retval] VARIANT* ParamValue);
|
|
};
|
|
|
|
class CSpTreeElemProps
|
|
{
|
|
public:
|
|
LONG X;
|
|
LONG Y;
|
|
LONG Width;
|
|
LONG Height;
|
|
|
|
bool IsTop;
|
|
|
|
public:
|
|
CSpTreeElemProps()
|
|
{
|
|
X = 0;
|
|
Y = 0;
|
|
Width = 0;
|
|
Height = 0;
|
|
|
|
IsTop = true;
|
|
}
|
|
};
|
|
|
|
class CElementProps
|
|
{
|
|
public:
|
|
CAtlMap<LONG, VARIANT> m_Properties;
|
|
|
|
public:
|
|
CElementProps() : m_Properties()
|
|
{
|
|
}
|
|
|
|
~CElementProps()
|
|
{
|
|
FinalRelease();
|
|
}
|
|
|
|
void FinalRelease()
|
|
{
|
|
POSITION pos = m_Properties.GetStartPosition();
|
|
while (pos != NULL)
|
|
{
|
|
CAtlMap<LONG, VARIANT>::CPair * pPair = m_Properties.GetNext(pos);
|
|
if (NULL != pPair)
|
|
{
|
|
if (pPair->m_value.vt == VT_BSTR)
|
|
SysFreeString(pPair->m_value.bstrVal);
|
|
}
|
|
}
|
|
m_Properties.RemoveAll();
|
|
}
|
|
|
|
public:
|
|
STDMETHOD(GetProperty)(LONG lId, VARIANT* pProp)
|
|
{
|
|
if (NULL == pProp)
|
|
return S_FALSE;
|
|
|
|
CAtlMap<LONG, VARIANT>::CPair * pPair = m_Properties.Lookup(lId);
|
|
if (NULL == pPair)
|
|
return S_FALSE;
|
|
|
|
bool bIsSupportProp = CopyProperty(*pProp, pPair->m_value);
|
|
|
|
if (!bIsSupportProp)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetProperty)(LONG lId, VARIANT prop)
|
|
{
|
|
VARIANT var;
|
|
bool bIsSupportProp = CopyProperty(var, prop);
|
|
if (!bIsSupportProp)
|
|
return S_FALSE;
|
|
|
|
CAtlMap<LONG, VARIANT>::CPair* pPair = m_Properties.Lookup(lId);
|
|
if (NULL != pPair)
|
|
{
|
|
if (pPair->m_value.vt == VT_BSTR)
|
|
SysFreeString(pPair->m_value.bstrVal);
|
|
}
|
|
|
|
m_Properties.SetAt(lId, var);
|
|
return S_OK;
|
|
}
|
|
|
|
public:
|
|
static bool CopyProperty(VARIANT& oDst, const VARIANT& oSrc)
|
|
{
|
|
oDst.vt = oSrc.vt;
|
|
switch (oDst.vt)
|
|
{
|
|
case VT_I4:
|
|
{
|
|
oDst.lVal = oSrc.lVal;
|
|
break;
|
|
}
|
|
case VT_R8:
|
|
{
|
|
oDst.dblVal = oSrc.dblVal;
|
|
break;
|
|
}
|
|
case VT_BSTR:
|
|
{
|
|
oDst.bstrVal = SysAllocString(oSrc.bstrVal);
|
|
break;
|
|
}
|
|
default:
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
[coclass, uuid("4AB04382-4B51-4674-A691-BE2691A5F387"), threading(apartment), vi_progid("AVSOfficePPTXFile.ODObjectProps"), progid("AVSOfficePPTXFile.ODObjectProps.1"), version(1.0), registration_script("control.rgs")]
|
|
class ATL_NO_VTABLE CAVSODObjectProps
|
|
: public IAVSODObjectProps
|
|
{
|
|
private:
|
|
CElementProps m_oProps;
|
|
|
|
public:
|
|
|
|
CAVSODObjectProps() : m_oProps()
|
|
{
|
|
}
|
|
|
|
~CAVSODObjectProps()
|
|
{
|
|
}
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
HRESULT FinalConstruct()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
void FinalRelease()
|
|
{
|
|
m_oProps.FinalRelease();
|
|
}
|
|
|
|
public:
|
|
STDMETHOD(GetProperty)(LONG lId, VARIANT* pProp)
|
|
{
|
|
return m_oProps.GetProperty(lId, pProp);
|
|
}
|
|
STDMETHOD(SetProperty)(LONG lId, VARIANT prop)
|
|
{
|
|
return m_oProps.SetProperty(lId, prop);
|
|
}
|
|
|
|
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
|
|
{
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
|
|
{
|
|
return S_OK;
|
|
}
|
|
};
|
|
|
|
|
|
[coclass, uuid("BA240E3F-CFE4-45d7-96BB-97CDD73F63C3"), event_source(com), threading(apartment), vi_progid("AVSOfficePPTXFile.ODConverter"), progid("AVSOfficePPTXFile.ODConverter.1"), version(1.0), registration_script("control.rgs")]
|
|
class ATL_NO_VTABLE CAVSOfficeDrawingConverter
|
|
: public IAVSOfficeDrawingConverter
|
|
{
|
|
public:
|
|
class CElement
|
|
{
|
|
public:
|
|
PPTX::WrapperWritingElement* m_pElement;
|
|
CElementProps* m_pProps;
|
|
|
|
public:
|
|
CElement()
|
|
{
|
|
m_pElement = NULL;
|
|
m_pProps = NULL;
|
|
}
|
|
~CElement()
|
|
{
|
|
RELEASEOBJECT(m_pElement);
|
|
RELEASEOBJECT(m_pProps);
|
|
}
|
|
|
|
CElement& operator=(const CElement& oSrc)
|
|
{
|
|
m_pElement = oSrc.m_pElement;
|
|
m_pProps = oSrc.m_pProps;
|
|
return *this;
|
|
}
|
|
CElement(const CElement& oSrc)
|
|
{
|
|
*this = oSrc;
|
|
}
|
|
};
|
|
|
|
|
|
CAtlMap<CString, CShape*> m_mapShapeTypes;
|
|
CAtlMap<CString, smart_ptr<PPTX::CCommonRels>> m_mapRels;
|
|
CString m_strCurrentRelsPath;
|
|
|
|
NSBinPptxRW::CBinaryFileWriter m_oBinaryWriter;
|
|
int m_lNextId;
|
|
|
|
int m_lCurrentObjectTop;
|
|
|
|
NSBinPptxRW::CBinaryFileReader m_oReader;
|
|
NSBinPptxRW::CImageManager2 m_oImageManager;
|
|
NSBinPptxRW::CXmlWriter m_oXmlWriter;
|
|
int m_nCurrentIndexObject;
|
|
|
|
IASCRenderer* m_pOOXToVMLRenderer;
|
|
BOOL m_bIsUseConvertion2007;
|
|
|
|
NSCommon::smart_ptr<PPTX::WrapperFile> m_oTheme;
|
|
NSCommon::smart_ptr<PPTX::WrapperWritingElement> m_oClrMap;
|
|
|
|
CString m_strFontDirectory;
|
|
|
|
public:
|
|
|
|
__event __interface _IAVSOfficeFileTemplateEvents2;
|
|
|
|
CAVSOfficeDrawingConverter()
|
|
{
|
|
m_nCurrentIndexObject = 0;
|
|
m_strFontDirectory = _T("");
|
|
}
|
|
|
|
~CAVSOfficeDrawingConverter()
|
|
{
|
|
}
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
HRESULT FinalConstruct()
|
|
{
|
|
m_strCurrentRelsPath = _T("");
|
|
m_lNextId = 1;
|
|
m_lCurrentObjectTop = 0;
|
|
|
|
m_pOOXToVMLRenderer = NULL;
|
|
m_bIsUseConvertion2007 = TRUE;
|
|
return S_OK;
|
|
}
|
|
|
|
void FinalRelease()
|
|
{
|
|
Clear();
|
|
RELEASEINTERFACE(m_pOOXToVMLRenderer);
|
|
}
|
|
|
|
public:
|
|
STDMETHOD(SetMainDocument)(IUnknown* pDocument)
|
|
{
|
|
m_oBinaryWriter.ClearNoAttack();
|
|
m_oBinaryWriter.m_oCommon.m_oImageManager.NewDocument();
|
|
m_oBinaryWriter.SetMainDocument(pDocument);
|
|
m_oReader.SetMainDocument(pDocument);
|
|
m_lNextId = 1;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetRelsPath)(BSTR bsRelsPath)
|
|
{
|
|
|
|
m_strCurrentRelsPath = bsRelsPath;
|
|
return SetCurrentRelsPath();
|
|
}
|
|
STDMETHOD(SetMediaDstPath)(BSTR bsMediaPath)
|
|
{
|
|
m_oBinaryWriter.m_oCommon.m_oImageManager.m_strDstMedia = (CString)bsMediaPath;
|
|
m_oImageManager.SetDstMedia(m_oBinaryWriter.m_oCommon.m_oImageManager.m_strDstMedia);
|
|
|
|
CreateDirectory(bsMediaPath, NULL);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(AddShapeType)(BSTR bsXml)
|
|
{
|
|
CString strXml = _T("<main ");
|
|
|
|
strXml += _T("\
|
|
xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" \
|
|
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \
|
|
xmlns:o=\"urn:schemas-microsoft-com:office:office\" \
|
|
xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \
|
|
xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" \
|
|
xmlns:v=\"urn:schemas-microsoft-com:vml\" \
|
|
xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \
|
|
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
|
|
xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" \
|
|
xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" \
|
|
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
|
|
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
|
|
xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" \
|
|
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
|
|
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
|
|
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
|
|
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
|
|
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
|
|
xmlns:a14=\"http://schemas.microsoft.com/office/drawing/2010/main\" \
|
|
xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"");
|
|
|
|
strXml += _T(">");
|
|
|
|
strXml += (CString)bsXml;
|
|
|
|
strXml += _T("</main>");
|
|
|
|
XmlUtils::CXmlNode oNode;
|
|
oNode.FromXmlString(strXml);
|
|
|
|
if (oNode.IsValid())
|
|
{
|
|
CPPTShape* pShape = new CPPTShape();
|
|
pShape->m_bIsShapeType = true;
|
|
|
|
XmlUtils::CXmlNode oNodeST = oNode.ReadNodeNoNS(_T("shapetype"));
|
|
|
|
CString strId = oNodeST.GetAttribute(_T("id"));
|
|
pShape->LoadFromXMLShapeType(oNodeST);
|
|
|
|
CShape* pS = new CShape(NSBaseShape::unknown, 0);
|
|
pS->m_pShape = pShape;
|
|
LoadCoordSize(oNodeST, pS);
|
|
|
|
m_mapShapeTypes.SetAt(strId, pS);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(AddObject)(BSTR bsXml, BSTR* pMainProps, SAFEARRAY** ppBinary)
|
|
{
|
|
CString strXml = _T("<main ");
|
|
|
|
strXml += _T("\
|
|
xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" \
|
|
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \
|
|
xmlns:o=\"urn:schemas-microsoft-com:office:office\" \
|
|
xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \
|
|
xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" \
|
|
xmlns:v=\"urn:schemas-microsoft-com:vml\" \
|
|
xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \
|
|
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
|
|
xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" \
|
|
xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" \
|
|
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
|
|
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
|
|
xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" \
|
|
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
|
|
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
|
|
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
|
|
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
|
|
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
|
|
xmlns:a14=\"http://schemas.microsoft.com/office/drawing/2010/main\" \
|
|
xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" \
|
|
xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\"");
|
|
|
|
strXml += _T(">");
|
|
|
|
strXml += (CString)bsXml;
|
|
|
|
strXml += _T("</main>");
|
|
|
|
m_oBinaryWriter.m_oCommon.CheckFontPicker();
|
|
|
|
++m_lCurrentObjectTop;
|
|
bool bResult = ParceObject(strXml, pMainProps, ppBinary);
|
|
--m_lCurrentObjectTop;
|
|
|
|
if (0 == m_lCurrentObjectTop)
|
|
{
|
|
m_oBinaryWriter.ClearNoAttack();
|
|
}
|
|
|
|
return bResult ? S_OK : S_FALSE;
|
|
}
|
|
|
|
STDMETHOD(AddObject2)(BSTR bsXml, SAFEARRAY* pBinaryObj, BSTR* pXmlOutput)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(GetThemeBinary)(BSTR bsThemeFilePath, SAFEARRAY** ppBinary);
|
|
|
|
STDMETHOD(SaveThemeXml)(SAFEARRAY* pBinaryTheme, LONG lStart, LONG lLength, BSTR bsThemePath);
|
|
STDMETHOD(SaveObject)(SAFEARRAY* pBinaryObj, LONG lStart, LONG lLength, BSTR bsMainProps, BSTR* bsXml);
|
|
STDMETHOD(SaveObjectEx)(SAFEARRAY* pBinaryObj, LONG lStart, LONG lLength, BSTR bsMainProps, LONG lDocType, BSTR* bsXml);
|
|
|
|
STDMETHOD(GetRecordBinary)(LONG lRecordType, BSTR bsXml, SAFEARRAY** ppBinary);
|
|
STDMETHOD(GetRecordXml)(SAFEARRAY* pBinaryObj, LONG lStart, LONG lLength, LONG lRecType, LONG lDocType, BSTR* bsXml);
|
|
|
|
STDMETHOD(SetDstContentRels)()
|
|
{
|
|
m_oReader.m_oRels.Clear();
|
|
m_oReader.m_oRels.StartRels();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SaveDstContentRels)(BSTR bsRelsPath)
|
|
{
|
|
m_oReader.m_oRels.CloseRels();
|
|
m_oReader.m_oRels.SaveRels((CString)bsRelsPath);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(WriteRels)(BSTR bsType, BSTR bsTarget, BSTR bsTargetMode, LONG* lId)
|
|
{
|
|
if (NULL == lId)
|
|
return S_FALSE;
|
|
|
|
*lId = m_oReader.m_oRels.WriteRels(bsType, bsTarget, bsTargetMode);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(LoadClrMap)(BSTR bsXml);
|
|
|
|
STDMETHOD(GetTxBodyBinary)(BSTR bsXml, SAFEARRAY** ppBinary);
|
|
STDMETHOD(GetTxBodyXml)(SAFEARRAY* pBinary, LONG lStart, LONG lLength, BSTR *pbstrXml);
|
|
STDMETHOD(SetFontDir)(BSTR bsFontDir);
|
|
|
|
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
|
|
{
|
|
CString name = (CString)ParamName;
|
|
if (name == _T("SourceFileDir"))
|
|
{
|
|
m_oReader.m_oRels.m_pManager = &m_oImageManager;
|
|
m_oImageManager.m_bIsWord = TRUE;
|
|
m_oReader.m_strFolder = CString(ParamValue.bstrVal);
|
|
}
|
|
else if (name == _T("UseConvertion2007"))
|
|
{
|
|
m_bIsUseConvertion2007 = (ParamValue.boolVal == VARIANT_TRUE) ? true : false;
|
|
}
|
|
else if (name == _T("SerializeImageManager"))
|
|
{
|
|
NSBinPptxRW::CBinaryFileReader oReader;
|
|
oReader.Deserialize(&m_oBinaryWriter.m_oCommon.m_oImageManager, ParamValue.parray);
|
|
}
|
|
else if (name == _T("SerializeImageManager2"))
|
|
{
|
|
NSBinPptxRW::CBinaryFileReader oReader;
|
|
oReader.Deserialize(&m_oImageManager, ParamValue.parray);
|
|
}
|
|
else if (name == _T("FontPicker") && ParamValue.vt == VT_UNKNOWN && NULL != ParamValue.punkVal)
|
|
{
|
|
IOfficeFontPicker* pFontPicker = NULL;
|
|
ParamValue.punkVal->QueryInterface(__uuidof(IOfficeFontPicker), (void**)&pFontPicker);
|
|
|
|
m_oBinaryWriter.m_oCommon.CreateFontPicker(pFontPicker);
|
|
RELEASEINTERFACE(pFontPicker);
|
|
}
|
|
else if (name == _T("DocumentChartsCount") && ParamValue.vt == VT_I4)
|
|
{
|
|
m_oReader.m_lChartNumber = ParamValue.lVal + 1;
|
|
}
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
|
|
{
|
|
CString name = (CString)ParamName;
|
|
if (name == _T("SerializeImageManager"))
|
|
{
|
|
NSBinPptxRW::CBinaryFileWriter oWriter;
|
|
|
|
ParamValue->vt = VT_ARRAY;
|
|
ParamValue->parray = oWriter.Serialize(&m_oBinaryWriter.m_oCommon.m_oImageManager);
|
|
}
|
|
else if (name == _T("SerializeImageManager2"))
|
|
{
|
|
NSBinPptxRW::CBinaryFileWriter oWriter;
|
|
|
|
ParamValue->vt = VT_ARRAY;
|
|
ParamValue->parray = oWriter.Serialize(&m_oImageManager);
|
|
}
|
|
else if (name == _T("FontPicker"))
|
|
{
|
|
ParamValue->vt = VT_UNKNOWN;
|
|
ParamValue->punkVal = NULL;
|
|
|
|
if (NULL != m_oBinaryWriter.m_oCommon.m_pFontPicker)
|
|
m_oBinaryWriter.m_oCommon.m_pFontPicker->QueryInterface(IID_IUnknown, (void**)&(ParamValue->punkVal));
|
|
}
|
|
else if (name == _T("DocumentChartsCount"))
|
|
{
|
|
ParamValue->vt = VT_I4;
|
|
ParamValue->lVal = m_oReader.m_lChartNumber;
|
|
}
|
|
else if (name == _T("ContentTypes"))
|
|
{
|
|
ParamValue->vt = VT_BSTR;
|
|
ParamValue->bstrVal = m_oReader.m_strContentTypes.AllocSysString();
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
protected:
|
|
bool ParceObject(CString& strXml, BSTR* pMainProps, SAFEARRAY** ppBinary);
|
|
void SendMainProps(CString& strMainProps, BSTR*& pMainProps);
|
|
|
|
PPTX::Logic::SpTreeElem doc_LoadShape(XmlUtils::CXmlNode& oNode, BSTR*& pMainProps, bool bIsTop = true);
|
|
PPTX::Logic::SpTreeElem doc_LoadGroup(XmlUtils::CXmlNode& oNode, BSTR*& pMainProps, bool bIsTop = true);
|
|
|
|
CString GetVMLShapeXml(CPPTShape* pPPTShape);
|
|
CString GetVMLShapeXml(PPTX::Logic::SpTreeElem& oElem);
|
|
|
|
void CheckBrushShape(PPTX::Logic::SpTreeElem& oElem, XmlUtils::CXmlNode& oNode, PPTShapes::ShapeType eType, CPPTShape* pPPTShape);
|
|
void CheckPenShape(PPTX::Logic::SpTreeElem& oElem, XmlUtils::CXmlNode& oNode, PPTShapes::ShapeType eType, CPPTShape* pPPTShape);
|
|
|
|
void LoadCoordSize(XmlUtils::CXmlNode& oNode, CShape* pShape);
|
|
CString GetDrawingMainProps(XmlUtils::CXmlNode& oNode, PPTX::CCSS& oCssStyles, CSpTreeElemProps& oProps);
|
|
|
|
void ConvertMainPropsToVML(BSTR bsMainProps, NSBinPptxRW::CXmlWriter& oWriter, PPTX::Logic::SpTreeElem& oElem);
|
|
void ConvertShapeVML(PPTX::Logic::SpTreeElem& oShape, BSTR bsMainProps, NSBinPptxRW::CXmlWriter& oWriter);
|
|
void ConvertGroupVML(PPTX::Logic::SpTreeElem& oGroup, BSTR bsMainProps, NSBinPptxRW::CXmlWriter& oWriter);
|
|
|
|
void Clear()
|
|
{
|
|
POSITION pos = m_mapShapeTypes.GetStartPosition();
|
|
while (NULL != pos)
|
|
{
|
|
CShape* pMem = m_mapShapeTypes.GetNextValue(pos);
|
|
RELEASEOBJECT(pMem);
|
|
}
|
|
m_mapShapeTypes.RemoveAll();
|
|
m_mapRels.RemoveAll();
|
|
}
|
|
|
|
HRESULT SetCurrentRelsPath()
|
|
{
|
|
CAtlMap<CString, smart_ptr<PPTX::CCommonRels>>::CPair* pPair = m_mapRels.Lookup(m_strCurrentRelsPath);
|
|
|
|
if (NULL == pPair)
|
|
{
|
|
smart_ptr<PPTX::CCommonRels> pCR = new PPTX::CCommonRels();
|
|
m_mapRels.SetAt(m_strCurrentRelsPath, pCR);
|
|
|
|
pPair = m_mapRels.Lookup(m_strCurrentRelsPath);
|
|
OOX::CPath filename = m_strCurrentRelsPath;
|
|
pPair->m_value->_read(filename);
|
|
}
|
|
|
|
m_oBinaryWriter.m_pCommonRels = pPair->m_value.smart_dynamic_cast<PPTX::FileContainer>();
|
|
return S_OK;
|
|
}
|
|
};
|