read themes in incorrect vsdx

This commit is contained in:
ElenaSubbotina
2025-05-13 20:35:14 +03:00
parent 490180dbba
commit c2de8a822a
6 changed files with 166 additions and 132 deletions

View File

@ -39,64 +39,63 @@ namespace OOX
{ {
CExtensionTable::CExtensionTable() CExtensionTable::CExtensionTable()
{ {
m_mTable.insert( std::make_pair( _T("bmp"), _T("image/bmp"))); m_mTable.insert(std::make_pair(L"bmp", L"image/bmp"));
m_mTable.insert( std::make_pair( _T("gif"), _T("image/gif"))); m_mTable.insert(std::make_pair(L"gif", L"image/gif"));
m_mTable.insert( std::make_pair( _T("png"), _T("image/png"))); m_mTable.insert(std::make_pair(L"png", L"image/png"));
m_mTable.insert( std::make_pair( _T("tif"), _T("image/tiff"))); m_mTable.insert(std::make_pair(L"tif", L"image/tiff"));
m_mTable.insert( std::make_pair( _T("tiff"), _T("image/tiff"))); m_mTable.insert(std::make_pair(L"tiff", L"image/tiff"));
m_mTable.insert( std::make_pair( _T("jpeg"), _T("image/jpeg"))); m_mTable.insert(std::make_pair(L"jpeg", L"image/jpeg"));
m_mTable.insert( std::make_pair( _T("jpg"), _T("image/jpeg"))); m_mTable.insert(std::make_pair(L"jpg", L"image/jpeg"));
m_mTable.insert( std::make_pair( _T("jpe"), _T("image/jpeg"))); m_mTable.insert(std::make_pair(L"jpe", L"image/jpeg"));
m_mTable.insert( std::make_pair( _T("jfif"), _T("image/jpeg"))); m_mTable.insert(std::make_pair(L"jfif", L"image/jpeg"));
m_mTable.insert( std::make_pair( _T("rels"), _T("application/vnd.openxmlformats-package.relationships+xml"))); m_mTable.insert(std::make_pair(L"rels", L"application/vnd.openxmlformats-package.relationships+xml"));
m_mTable.insert( std::make_pair( _T("bin"), _T("application/vnd.openxmlformats-officedocument.oleObject"))); m_mTable.insert(std::make_pair(L"bin", L"application/vnd.openxmlformats-officedocument.oleObject"));
m_mTable.insert( std::make_pair( _T("xml"), _T("application/xml"))); m_mTable.insert(std::make_pair(L"xml", L"application/xml"));
m_mTable.insert( std::make_pair( _T("emf"), _T("image/x-emf"))); m_mTable.insert(std::make_pair(L"emf", L"image/x-emf"));
m_mTable.insert( std::make_pair( _T("emz"), _T("image/x-emz"))); m_mTable.insert(std::make_pair(L"emz", L"image/x-emz"));
m_mTable.insert( std::make_pair( _T("wmf"), _T("image/x-wmf"))); m_mTable.insert(std::make_pair(L"wmf", L"image/x-wmf"));
m_mTable.insert( std::make_pair( _T("svg"), _T("image/svg+xml"))); m_mTable.insert(std::make_pair(L"svg", L"image/svg+xml"));
m_mTable.insert( std::make_pair( _T("svm"), _T("image/svm"))); m_mTable.insert(std::make_pair(L"svm", L"image/svm"));
m_mTable.insert( std::make_pair( _T("wdp"), _T("image/vnd.ms-photo"))); m_mTable.insert(std::make_pair(L"wdp", L"image/vnd.ms-photo"));
m_mTable.insert( std::make_pair( _T("wav"), _T("audio/wav"))); m_mTable.insert(std::make_pair(L"wav", L"audio/wav"));
m_mTable.insert( std::make_pair( _T("wma"), _T("audio/x-wma"))); m_mTable.insert(std::make_pair(L"wma", L"audio/x-wma"));
m_mTable.insert( std::make_pair( _T("m4a"), _T("audio/unknown"))); m_mTable.insert(std::make_pair(L"m4a", L"audio/unknown"));
m_mTable.insert( std::make_pair( _T("mp3"), _T("audio/mpeg"))); m_mTable.insert(std::make_pair(L"mp3", L"audio/mpeg"));
m_mTable.insert( std::make_pair( _T("mp4"), _T("video/unknown"))); m_mTable.insert(std::make_pair(L"mp4", L"video/unknown"));
m_mTable.insert( std::make_pair( _T("mov"), _T("video/unknown"))); m_mTable.insert(std::make_pair(L"mov", L"video/unknown"));
m_mTable.insert( std::make_pair( _T("m4v"), _T("video/unknown"))); m_mTable.insert(std::make_pair(L"m4v", L"video/unknown"));
m_mTable.insert( std::make_pair( _T("mkv"), _T("video/unknown"))); m_mTable.insert(std::make_pair(L"mkv", L"video/unknown"));
m_mTable.insert( std::make_pair( _T("avi"), _T("video/avi"))); m_mTable.insert(std::make_pair(L"avi", L"video/avi"));
m_mTable.insert( std::make_pair( _T("flv"), _T("video/x-flv"))); m_mTable.insert(std::make_pair(L"flv", L"video/x-flv"));
m_mTable.insert( std::make_pair( _T("wmv"), _T("video/x-wmv"))); m_mTable.insert(std::make_pair(L"wmv", L"video/x-wmv"));
m_mTable.insert( std::make_pair( _T("webm"), _T("video/webm"))); m_mTable.insert(std::make_pair(L"webm", L"video/webm"));
m_mTable.insert( std::make_pair( _T("xls"), _T("application/vnd.ms-excel"))); m_mTable.insert(std::make_pair(L"xls", L"application/vnd.ms-excel"));
m_mTable.insert( std::make_pair( _T("xlsm"), _T("application/vnd.ms-excel.sheet.macroEnabled.12"))); m_mTable.insert(std::make_pair(L"xlsm", L"application/vnd.ms-excel.sheet.macroEnabled.12"));
m_mTable.insert( std::make_pair( _T("xlsb"), _T("application/vnd.ms-excel.sheet.binary.macroEnabled.12"))); m_mTable.insert(std::make_pair(L"xlsb", L"application/vnd.ms-excel.sheet.binary.macroEnabled.12"));
m_mTable.insert( std::make_pair( _T("xlsx"), _T("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))); m_mTable.insert(std::make_pair(L"xlsx", L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
m_mTable.insert( std::make_pair( _T("ppt"), _T("application/vnd.ms-powerpoint"))); m_mTable.insert(std::make_pair(L"ppt", L"application/vnd.ms-powerpoint"));
m_mTable.insert( std::make_pair( _T("pptm"), _T("application/vnd.ms-powerpoint.presentation.macroEnabled.12"))); m_mTable.insert(std::make_pair(L"pptm", L"application/vnd.ms-powerpoint.presentation.macroEnabled.12"));
m_mTable.insert( std::make_pair( _T("pptx"), _T("application/vnd.openxmlformats-officedocument.presentationml.presentation"))); m_mTable.insert(std::make_pair(L"pptx", L"application/vnd.openxmlformats-officedocument.presentationml.presentation"));
m_mTable.insert( std::make_pair( _T("sldm"), _T("application/vnd.ms-powerpoint.slide.macroEnabled.12"))); m_mTable.insert(std::make_pair(L"sldm", L"application/vnd.ms-powerpoint.slide.macroEnabled.12"));
m_mTable.insert( std::make_pair( _T("sldx"), _T("application/vnd.openxmlformats-officedocument.presentationml.slide"))); m_mTable.insert(std::make_pair(L"sldx", L"application/vnd.openxmlformats-officedocument.presentationml.slide"));
m_mTable.insert( std::make_pair( _T("doc"), _T("application/msword"))); m_mTable.insert(std::make_pair(L"doc", L"application/msword"));
m_mTable.insert( std::make_pair( _T("docm"), _T("application/vnd.ms-word.document.macroEnabled.12"))); m_mTable.insert(std::make_pair(L"docm", L"application/vnd.ms-word.document.macroEnabled.12"));
m_mTable.insert( std::make_pair( _T("docx"), _T("application/vnd.openxmlformats-officedocument.wordprocessingml.document"))); m_mTable.insert(std::make_pair(L"docx", L"application/vnd.openxmlformats-officedocument.wordprocessingml.document"));
m_mTable.insert( std::make_pair( _T("vml"), _T("application/vnd.openxmlformats-officedocument.vmlDrawing"))); m_mTable.insert(std::make_pair(L"vml", L"application/vnd.openxmlformats-officedocument.vmlDrawing"));
m_mTable.insert( std::make_pair( _T("vsd"), _T("application/vnd.visio"))); m_mTable.insert(std::make_pair(L"vsd", L"application/vnd.visio"));
m_mTable.insert( std::make_pair( _T("vsdx"), _T("application/vnd.ms-visio.drawing"))); m_mTable.insert(std::make_pair(L"vsdx", L"application/vnd.ms-visio.drawing"));
} }
const std::wstring CExtensionTable::operator[] (const std::wstring& sExtension) const const std::wstring CExtensionTable::operator[] (const std::wstring& sExtension) const
{ {
std::map<std::wstring, std::wstring>::const_iterator it = m_mTable.find(sExtension); std::map<std::wstring, std::wstring>::const_iterator it = m_mTable.find(sExtension);
if (it == m_mTable.end()) if (it == m_mTable.end())
return _T("application/unknown"); return L"application/unknown";
return it->second; return it->second;
} }
CDefault::CDefault() CDefault::CDefault()
{ {
m_sExtension = _T("");
} }
CDefault::CDefault(const std::wstring& sExtension) : m_sExtension(sExtension) CDefault::CDefault(const std::wstring& sExtension) : m_sExtension(sExtension)
{ {
@ -106,13 +105,13 @@ namespace OOX
} }
void CDefault::fromXML(XmlUtils::CXmlNode& oNode) void CDefault::fromXML(XmlUtils::CXmlNode& oNode)
{ {
m_sExtension = oNode.GetAttribute(_T("Extension")); m_sExtension = oNode.GetAttribute(L"Extension");
} }
void CDefault::fromXML(XmlUtils::CXmlLiteReader& oReader) void CDefault::fromXML(XmlUtils::CXmlLiteReader& oReader)
{ {
ReadAttributes( oReader ); ReadAttributes(oReader);
if ( !oReader.IsEmptyNode() ) if (!oReader.IsEmptyNode())
oReader.ReadTillEnd(); oReader.ReadTillEnd();
} }
std::wstring CDefault::toXML() const std::wstring CDefault::toXML() const
@ -120,10 +119,10 @@ namespace OOX
static const CExtensionTable oTable; static const CExtensionTable oTable;
XmlUtils::CAttribute oAttr; XmlUtils::CAttribute oAttr;
oAttr.Write( _T("Extension"), m_sExtension ); oAttr.Write(L"Extension", m_sExtension);
oAttr.Write( _T("ContentType"), oTable[m_sExtension] ); oAttr.Write(L"ContentType", oTable[m_sExtension]);
return XmlUtils::CreateNode(_T("Default"), oAttr ); return XmlUtils::CreateNode(L"Default", oAttr);
} }
EElementType CDefault::getType() const EElementType CDefault::getType() const
{ {
@ -132,9 +131,9 @@ namespace OOX
void CDefault::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CDefault::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты // Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start(oReader)
WritingElement_ReadAttributes_ReadSingle( oReader, _T("Extension"), m_sExtension ) WritingElement_ReadAttributes_ReadSingle(oReader, L"Extension", m_sExtension)
WritingElement_ReadAttributes_End( oReader ) WritingElement_ReadAttributes_End(oReader)
} }
COverride::COverride() COverride::COverride()
@ -148,14 +147,14 @@ namespace OOX
} }
void COverride::fromXML(XmlUtils::CXmlNode& oNode) void COverride::fromXML(XmlUtils::CXmlNode& oNode)
{ {
m_oPart = oNode.GetAttribute(_T("PartName")); m_oPart = oNode.GetAttribute(L"PartName");
m_sType = oNode.GetAttribute(_T("ContentType")); m_sType = oNode.GetAttribute(L"ContentType");
} }
void COverride::fromXML(XmlUtils::CXmlLiteReader& oReader) void COverride::fromXML(XmlUtils::CXmlLiteReader& oReader)
{ {
ReadAttributes( oReader ); ReadAttributes(oReader);
if ( !oReader.IsEmptyNode() ) if (!oReader.IsEmptyNode())
oReader.ReadTillEnd(); oReader.ReadTillEnd();
} }
std::wstring COverride::toXML() const std::wstring COverride::toXML() const
@ -165,10 +164,10 @@ namespace OOX
XmlUtils::replace_all(sPartName, L"\\", L"/"); XmlUtils::replace_all(sPartName, L"\\", L"/");
oAttr.Write( _T("PartName"), _T("/") + sPartName); oAttr.Write(L"PartName", L"/" + sPartName);
oAttr.Write( _T("ContentType"), m_sType ); oAttr.Write(L"ContentType", m_sType);
return XmlUtils::CreateNode(_T("Override"), oAttr); return XmlUtils::CreateNode(L"Override", oAttr);
} }
EElementType COverride::getType() const EElementType COverride::getType() const
{ {
@ -176,20 +175,19 @@ namespace OOX
} }
void COverride::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void COverride::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты WritingElement_ReadAttributes_Start(oReader)
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if(oReader, L"PartName", m_oPart)
WritingElement_ReadAttributes_Read_if ( oReader, _T("PartName"), m_oPart ) WritingElement_ReadAttributes_Read_else_if(oReader, L"ContentType", m_sType)
WritingElement_ReadAttributes_Read_else_if( oReader, _T("ContentType"), m_sType ) WritingElement_ReadAttributes_End(oReader)
WritingElement_ReadAttributes_End( oReader )
} }
const std::wstring COverride::type() const const std::wstring COverride::type() const
{ {
return m_sType; return m_sType;
} }
const OOX::CPath COverride::filename() const const OOX::CPath COverride::filename() const
{ {
return m_oPart; return m_oPart;
} }
} // namespace ContentTypes } // namespace ContentTypes
@ -201,69 +199,72 @@ namespace OOX
AddDefault(L"png"); AddDefault(L"png");
AddDefault(L"wmf"); AddDefault(L"wmf");
//AddDefault(L"bmp"); //AddDefault(L"bmp");
//AddDefault(OOX::CPath(_T(".jpg"))); //AddDefault(OOX::CPath(L".jpg"));
//AddDefault(OOX::CPath(_T(".jpe"))); //AddDefault(OOX::CPath(L".jpe"));
//AddDefault(OOX::CPath(_T(".gif"))); //AddDefault(OOX::CPath(L".gif"));
//AddDefault(OOX::CPath(_T(".emf"))); //AddDefault(OOX::CPath(L".emf"));
//AddDefault(OOX::CPath(_T(".xlsx"))); //AddDefault(OOX::CPath(L".xlsx"));
} }
CContentTypes::CContentTypes(const CPath& oPath) CContentTypes::CContentTypes(const CPath& oPath)
{ {
Read( oPath ); Read(oPath);
} }
CContentTypes::~CContentTypes() CContentTypes::~CContentTypes()
{ {
} }
bool CContentTypes::Read (const CPath& oDirPath) bool CContentTypes::Read(const CPath& oDirPath)
{ {
OOX::CPath oFullPath = oDirPath / c_oContentTypeFileName; OOX::CPath oFullPath = oDirPath / c_oContentTypeFileName;
XmlUtils::CXmlLiteReader oReader; XmlUtils::CXmlLiteReader oReader;
if ( !oReader.FromFile( oFullPath.m_strFilename ) ) if (!oReader.FromFile(oFullPath.m_strFilename))
return false; return false;
return ReadFromReader(oReader); return ReadFromReader(oReader);
} }
bool CContentTypes::ReadFromString (std::wstring& sXml) bool CContentTypes::ReadFromString(std::wstring& sXml)
{ {
XmlUtils::CXmlLiteReader oReader; XmlUtils::CXmlLiteReader oReader;
if ( !oReader.FromString( sXml ) ) if (!oReader.FromString(sXml))
return false; return false;
return ReadFromReader(oReader); return ReadFromReader(oReader);
} }
void CContentTypes::Merge(CContentTypes * pSrcContentTypes) void CContentTypes::Merge(CContentTypes* pSrcContentTypes)
{ {
if (pSrcContentTypes == NULL) return; if (pSrcContentTypes == NULL) return;
for (boost::unordered_map<std::wstring, ContentTypes::CDefault>::iterator it = pSrcContentTypes->m_mapDefaults.begin(); it != pSrcContentTypes->m_mapDefaults.end(); ++it) for (std::unordered_map<std::wstring, ContentTypes::CDefault>::iterator it = pSrcContentTypes->m_mapDefaults.begin(); it != pSrcContentTypes->m_mapDefaults.end(); ++it)
{ {
AddDefault(it->first); AddDefault(it->first);
} }
for (boost::unordered_map<std::wstring, ContentTypes::COverride>::iterator it = pSrcContentTypes->m_mapOverrides.begin(); it != pSrcContentTypes->m_mapOverrides.end(); ++it) for (std::unordered_map<std::wstring, smart_ptr<ContentTypes::COverride>>::iterator it = pSrcContentTypes->m_mapOverrides.begin(); it != pSrcContentTypes->m_mapOverrides.end(); ++it)
{ {
if (m_mapOverrides.find(it->first) == m_mapOverrides.end()) if (m_mapOverrides.find(it->first) == m_mapOverrides.end())
{ {
m_mapOverrides [it->first] = it->second; m_mapOverrides[it->first] = it->second;
} }
} }
} }
bool CContentTypes::Write(const CPath& oDirPath) const bool CContentTypes::Write(const CPath& oDirPath) const
{ {
std::wstring sXml = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">"); std::wstring sXml = L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">";
for (boost::unordered_map<std::wstring, ContentTypes::CDefault>::const_iterator it = m_mapDefaults.begin(); it != m_mapDefaults.end(); ++it) for (std::unordered_map<std::wstring, ContentTypes::CDefault>::const_iterator it = m_mapDefaults.begin(); it != m_mapDefaults.end(); ++it)
{ {
sXml += it->second.toXML(); sXml += it->second.toXML();
} }
for (boost::unordered_map<std::wstring, ContentTypes::COverride>::const_iterator it = m_mapOverrides.begin(); it != m_mapOverrides.end(); ++it) for (std::unordered_map<std::wstring, smart_ptr<ContentTypes::COverride>>::const_iterator it = m_mapOverrides.begin(); it != m_mapOverrides.end(); ++it)
{ {
sXml += it->second.toXML(); if (it->second.IsInit())
{
sXml += it->second->toXML();
}
} }
sXml += _T("</Types>"); sXml += L"</Types>";
OOX::CPath oFullPath = oDirPath / c_oContentTypeFileName; OOX::CPath oFullPath = oDirPath / c_oContentTypeFileName;
XmlUtils::SaveToFile( oFullPath.m_strFilename, sXml ); XmlUtils::SaveToFile(oFullPath.m_strFilename, sXml);
return true; return true;
} }
@ -271,8 +272,8 @@ namespace OOX
{ {
OOX::CPath oFullPath = oDirectory / oFilename; OOX::CPath oFullPath = oDirectory / oFilename;
AddOverride( sType, oFullPath.m_strFilename ); AddOverride(sType, oFullPath.m_strFilename);
AddDefault ( oFullPath.GetExtention(false) ); AddDefault(oFullPath.GetExtention(false));
} }
void CContentTypes::Registration(const std::wstring& sType, const std::wstring& sDirectory, const std::wstring& sFilename) void CContentTypes::Registration(const std::wstring& sType, const std::wstring& sDirectory, const std::wstring& sFilename)
{ {
@ -286,46 +287,54 @@ namespace OOX
if (sExt[0] == L'.') sExt = sExt.substr(1); if (sExt[0] == L'.') sExt = sExt.substr(1);
if (m_mapDefaults.find (sExt) == m_mapDefaults.end()) if (m_mapDefaults.find(sExt) == m_mapDefaults.end())
{ {
m_mapDefaults [sExt] = ContentTypes::CDefault( sExt ); m_mapDefaults[sExt] = ContentTypes::CDefault(sExt);
} }
} }
bool CContentTypes::ReadFromReader (XmlUtils::CXmlLiteReader& oReader) bool CContentTypes::ReadFromReader(XmlUtils::CXmlLiteReader& oReader)
{ {
std::wstring sName; std::wstring sName;
if ( !oReader.ReadNextNode() || _T("Types") != ( sName = oReader.GetName() ) || oReader.IsEmptyNode() ) if (!oReader.ReadNextNode() || L"Types" != (sName = oReader.GetName()) || oReader.IsEmptyNode())
return false; return false;
int nTypesDepth = oReader.GetDepth(); int nTypesDepth = oReader.GetDepth();
while ( oReader.ReadNextSiblingNode( nTypesDepth ) ) while (oReader.ReadNextSiblingNode(nTypesDepth))
{ {
sName = oReader.GetName(); sName = oReader.GetName();
if ( _T("Default") == sName ) if (L"Default" == sName)
{ {
ContentTypes::CDefault oDefault; ContentTypes::CDefault oDefault;
oDefault = oReader; oDefault = oReader;
m_mapDefaults [ oDefault.m_sExtension] = oDefault ; m_mapDefaults[oDefault.m_sExtension] = oDefault;
} }
else if ( _T("Override") == sName ) else if (L"Override" == sName)
{ {
ContentTypes::COverride oOverride; smart_ptr<ContentTypes::COverride> oOverride = new ContentTypes::COverride();
oOverride = oReader;
m_mapOverrides [oOverride.filename().GetPath()] = oOverride; if (oOverride.IsInit())
{
oOverride->fromXML(oReader);
m_mapOverrides.insert(std::make_pair(oOverride->filename().GetPath(), oOverride));
m_mapOverridesByType.insert(std::make_pair(oOverride->m_sType, oOverride));
}
} }
} }
return true; return true;
} }
void CContentTypes::AddOverride(const std::wstring& sType, std::wstring sPath) void CContentTypes::AddOverride(const std::wstring& sType, std::wstring sPath)
{
if (sPath[0] == FILE_SEPARATOR_CHAR)
{ {
if (sPath[0] == FILE_SEPARATOR_CHAR) sPath.erase(0, 1);
{
sPath.erase(0, 1);
}
ContentTypes::COverride oOverride( sType, sPath );
m_mapOverrides [oOverride.filename().GetPath()] = oOverride;
} }
smart_ptr<ContentTypes::COverride> oOverride = new ContentTypes::COverride(sType, sPath);
m_mapOverrides.insert(std::make_pair(oOverride->filename().GetPath(), oOverride));
m_mapOverridesByType.insert(std::make_pair(oOverride->m_sType, oOverride));
}
} // namespace OOX } // namespace OOX

View File

@ -30,13 +30,12 @@
* *
*/ */
#pragma once #pragma once
#ifndef OOX_CONTENT_TYPES_INCLUDE_H_
#define OOX_CONTENT_TYPES_INCLUDE_H_
#include "../SystemUtility/SystemUtility.h" #include "../SystemUtility/SystemUtility.h"
#include "WritingElement.h" #include "WritingElement.h"
#include <boost/unordered_map.hpp> #include <unordered_map>
#include <map>
namespace OOX namespace OOX
{ {
@ -82,28 +81,23 @@ namespace OOX
COverride(const std::wstring& sType, const CPath& oPath); COverride(const std::wstring& sType, const CPath& oPath);
virtual ~COverride(); virtual ~COverride();
public:
virtual void fromXML(XmlUtils::CXmlNode& oNode); virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
virtual std::wstring toXML() const; virtual std::wstring toXML() const;
virtual EElementType getType() const; virtual EElementType getType() const;
private:
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader);
public:
const std::wstring type() const; const std::wstring type() const;
const OOX::CPath filename() const; const OOX::CPath filename() const;
private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader);
std::wstring m_sType;
std::wstring m_sType;
OOX::CPath m_oPart; OOX::CPath m_oPart;
}; };
} // namespace ContentTypes } // namespace ContentTypes
static const CPath c_oContentTypeFileName (_T("[Content_Types].xml")); static const CPath c_oContentTypeFileName (L"[Content_Types].xml");
class CContentTypes class CContentTypes
{ {
@ -128,10 +122,10 @@ namespace OOX
void AddOverride(const std::wstring& sType, std::wstring sPath); void AddOverride(const std::wstring& sType, std::wstring sPath);
public: public:
boost::unordered_map<std::wstring, ContentTypes::CDefault> m_mapDefaults; std::unordered_map<std::wstring, ContentTypes::CDefault> m_mapDefaults;
boost::unordered_map<std::wstring, ContentTypes::COverride> m_mapOverrides; std::unordered_map<std::wstring, smart_ptr<ContentTypes::COverride>> m_mapOverrides;
std::multimap<std::wstring, smart_ptr<ContentTypes::COverride>> m_mapOverridesByType;
}; };
} // namespace OOX } // namespace OOX
#endif // OOX_CONTENT_TYPES_INCLUDE_H_

View File

@ -218,7 +218,10 @@ namespace OOX
if (pMetafile->LoadFromFile(image_path.GetPath().c_str())) if (pMetafile->LoadFromFile(image_path.GetPath().c_str()))
{ {
// пробуем сохранить в svg напрямую из метафайлов // пробуем сохранить в svg напрямую из метафайлов
std::wstring sInternalSvg = pMetafile->ConvertToSvg(ObjectWidth.get_value_or(0), ObjectHeight.get_value_or(0)); double w = ObjectWidth.get_value_or(0);
double h = ObjectHeight.get_value_or(0);
std::wstring sInternalSvg = pMetafile->ConvertToSvg(w > 1 ? w : 0, h > 1 ? h : 0);
if (!sInternalSvg.empty()) if (!sInternalSvg.empty())
{ {

View File

@ -29,6 +29,7 @@
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
* *
*/ */
#include "Vsdx.h"
#include "VisioDocument.h" #include "VisioDocument.h"
#include "VisioPages.h" #include "VisioPages.h"
#include "VisioConnections.h" #include "VisioConnections.h"
@ -1676,6 +1677,7 @@ namespace Draw
pWindows->toPPTY(pWriter); pWindows->toPPTY(pWriter);
pWriter->EndRecord(); pWriter->EndRecord();
} }
bool bThemes = false;
std::vector<smart_ptr<OOX::File>>& container = ((OOX::IFileContainer*)(this))->GetContainer(); std::vector<smart_ptr<OOX::File>>& container = ((OOX::IFileContainer*)(this))->GetContainer();
for (size_t k = 0; k < container.size(); ++k) for (size_t k = 0; k < container.size(); ++k)
{ {
@ -1686,8 +1688,34 @@ namespace Draw
pWriter->StartRecord(15); pWriter->StartRecord(15);
pTheme->toPPTY(pWriter); pTheme->toPPTY(pWriter);
pWriter->EndRecord(); pWriter->EndRecord();
bThemes = true;
} }
} }
if (false == bThemes)
{//некорректный контейнер ???
OOX::Draw::CVsdx *vsdx = dynamic_cast<OOX::Draw::CVsdx*>(((OOX::File*)this)->m_pMainDocument);
if (vsdx && vsdx->m_pContentTypes.IsInit())
{
typedef std::multimap<std::wstring, smart_ptr<ContentTypes::COverride>> _mapContentTypes;
std::pair<_mapContentTypes::iterator, _mapContentTypes::iterator> oFind;
oFind = vsdx->m_pContentTypes->m_mapOverridesByType.equal_range(L"application/vnd.openxmlformats-officedocument.theme+xml");
for (_mapContentTypes::iterator it = oFind.first; it != oFind.second; ++it)
{
if (it->second.IsInit())
{
PPTX::Theme oTheme(vsdx, vsdx->m_sDocumentPath + FILE_SEPARATOR_STR + it->second->filename());
pWriter->StartRecord(15);
oTheme.toPPTY(pWriter);
pWriter->EndRecord();
}
}
}
}
pFile = this->Find(OOX::FileTypes::VbaProject); pFile = this->Find(OOX::FileTypes::VbaProject);
OOX::VbaProject *pVbaProject = dynamic_cast<OOX::VbaProject*>(pFile.GetPointer()); OOX::VbaProject *pVbaProject = dynamic_cast<OOX::VbaProject*>(pFile.GetPointer());
if (pVbaProject) if (pVbaProject)

View File

@ -65,14 +65,13 @@ bool OOX::Draw::CVsdx::Read(const CPath& oFilePath)
m_pDocument = Find(FileTypes::Document).smart_dynamic_cast<Draw::CDocumentFile>(); m_pDocument = Find(FileTypes::Document).smart_dynamic_cast<Draw::CDocumentFile>();
m_pApp = Find(OOX::FileTypes::App).smart_dynamic_cast<CApp>(); m_pApp = Find(OOX::FileTypes::App).smart_dynamic_cast<CApp>();
m_pCore = Find(OOX::FileTypes::Core).smart_dynamic_cast<CCore>(); m_pCore = Find(OOX::FileTypes::Core).smart_dynamic_cast<CCore>();
m_pContentTypes = new CContentTypes(m_sDocumentPath);
return true; return true;
} }
bool OOX::Draw::CVsdx::Write(const CPath& oDirPath, OOX::CContentTypes &oContentTypes) bool OOX::Draw::CVsdx::Write(const CPath& oDirPath, OOX::CContentTypes &oContentTypes)
{ {
//CPath oVisioPath = oDirPath / m_pWorkbook->DefaultDirectory(); IFileContainer::Write(oDirPath / L"" , OOX::CPath(L""), oContentTypes);
//WriteWorkbook(oVisioPath);
IFileContainer::Write(oDirPath / L"" , OOX::CPath(_T("")), oContentTypes);
oContentTypes.Write(oDirPath); oContentTypes.Write(oDirPath);
return true; return true;

View File

@ -57,6 +57,7 @@ namespace OOX
smart_ptr<CApp> m_pApp; smart_ptr<CApp> m_pApp;
smart_ptr<CCore> m_pCore; smart_ptr<CCore> m_pCore;
smart_ptr<CContentTypes> m_pContentTypes;
std::map<unsigned int, smart_ptr<OOX::File>> mapMastersByID; std::map<unsigned int, smart_ptr<OOX::File>> mapMastersByID;
std::map<unsigned int, smart_ptr<OOX::File>> mapPagesByID; std::map<unsigned int, smart_ptr<OOX::File>> mapPagesByID;