Commit 2e61fcfd authored by ElenaSubbotina's avatar ElenaSubbotina

read/write pptm

parent 3df883cb
...@@ -125,6 +125,19 @@ namespace NSBinPptxRW ...@@ -125,6 +125,19 @@ namespace NSBinPptxRW
m_lIndexNextImage = 0; m_lIndexNextImage = 0;
m_lIndexCounter = 0; m_lIndexCounter = 0;
} }
void CImageManager2::SetDstFolder(const std::wstring& strDst)
{
m_strDstFolder = strDst;
m_strDstMedia = m_strDstFolder + FILE_SEPARATOR_STR + _T("media");
m_strDstEmbed = m_strDstFolder + FILE_SEPARATOR_STR + _T("embeddings");
NSDirectory::CreateDirectory(m_strDstMedia);
NSDirectory::CreateDirectory(m_strDstEmbed);
}
std::wstring CImageManager2::GetDstFolder()
{
return m_strDstFolder;
}
void CImageManager2::SetDstMedia(const std::wstring& strDst) void CImageManager2::SetDstMedia(const std::wstring& strDst)
{ {
m_strDstMedia = strDst; m_strDstMedia = strDst;
...@@ -1222,7 +1235,7 @@ namespace NSBinPptxRW ...@@ -1222,7 +1235,7 @@ namespace NSBinPptxRW
m_pWriter->WriteString(strRels); m_pWriter->WriteString(strRels);
} }
void CRelsGenerator::EndPresentationRels(const bool& bIsCommentsAuthors = false, const bool& bIsNotesMaster) void CRelsGenerator::EndPresentationRels(bool bIsCommentsAuthors, bool bIsNotesMaster, bool bIsVbaProject)
{ {
if (bIsNotesMaster) if (bIsNotesMaster)
{ {
...@@ -1247,6 +1260,12 @@ namespace NSBinPptxRW ...@@ -1247,6 +1260,12 @@ namespace NSBinPptxRW
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors\" Target=\"commentAuthors.xml\"/>"; L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors\" Target=\"commentAuthors.xml\"/>";
m_pWriter->WriteString(strRels4); m_pWriter->WriteString(strRels4);
} }
if (bIsVbaProject)
{
std::wstring strRels4 = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
L"\" Type=\"http://schemas.microsoft.com/office/2006/relationships/vbaProject\" Target=\"vbaProject.bin\"/>";
m_pWriter->WriteString(strRels4);
}
} }
int CRelsGenerator::GetNextId() int CRelsGenerator::GetNextId()
{ {
......
...@@ -178,8 +178,10 @@ namespace NSBinPptxRW ...@@ -178,8 +178,10 @@ namespace NSBinPptxRW
std::map<std::wstring, _imageManager2Info> m_mapImages; std::map<std::wstring, _imageManager2Info> m_mapImages;
_INT32 m_lIndexNextImage; _INT32 m_lIndexNextImage;
_INT32 m_lIndexCounter; _INT32 m_lIndexCounter;
std::wstring m_strDstMedia; std::wstring m_strDstMedia;
std::wstring m_strDstEmbed; std::wstring m_strDstEmbed;
std::wstring m_strDstFolder;
public: public:
int m_nDocumentType; int m_nDocumentType;
OOX::CContentTypes* m_pContentTypes; OOX::CContentTypes* m_pContentTypes;
...@@ -194,6 +196,9 @@ namespace NSBinPptxRW ...@@ -194,6 +196,9 @@ namespace NSBinPptxRW
void SetDstEmbed(const std::wstring& strDst); void SetDstEmbed(const std::wstring& strDst);
std::wstring GetDstEmbed(); std::wstring GetDstEmbed();
void SetDstFolder(const std::wstring& strDst);
std::wstring GetDstFolder();
int IsDisplayedImage(const std::wstring& strInput); int IsDisplayedImage(const std::wstring& strInput);
_imageManager2Info GenerateImage(const std::wstring& strInput, NSCommon::smart_ptr<OOX::File> & additionalFile, const std::wstring& oleData, std::wstring strBase64Image); _imageManager2Info GenerateImage(const std::wstring& strInput, NSCommon::smart_ptr<OOX::File> & additionalFile, const std::wstring& oleData, std::wstring strBase64Image);
...@@ -419,8 +424,8 @@ namespace NSBinPptxRW ...@@ -419,8 +424,8 @@ namespace NSBinPptxRW
int WriteChart (int nChartNumber, _INT32 lDocType); int WriteChart (int nChartNumber, _INT32 lDocType);
int WriteRels (const std::wstring& bsType, const std::wstring& bsTarget, const std::wstring& bsTargetMode); int WriteRels (const std::wstring& bsType, const std::wstring& bsTarget, const std::wstring& bsTargetMode);
int WriteHyperlink (const std::wstring& strLink, const bool& bIsActionInit); int WriteHyperlink (const std::wstring& strLink, const bool& bIsActionInit);
void EndPresentationRels (const bool& bIsCommentsAuthors, const bool& bIsNotesMaster = false); void EndPresentationRels (bool bIsCommentsAuthors = false, bool bIsNotesMaster = false, bool bIsVbaProject = false );
int GetNextId (); int GetNextId ();
void CloseRels (); void CloseRels ();
......
...@@ -100,7 +100,9 @@ namespace NSBinPptxRW ...@@ -100,7 +100,9 @@ namespace NSBinPptxRW
m_oImageManager.Clear(); m_oImageManager.Clear();
OOX::CPath pathMedia = pathPPT / _T("media"); m_oImageManager.SetDstFolder(pathPPT.GetPath());
OOX::CPath pathMedia = pathPPT / _T("media");
NSDirectory::CreateDirectory(pathMedia.GetPath()); NSDirectory::CreateDirectory(pathMedia.GetPath());
m_oImageManager.SetDstMedia(pathMedia.GetPath()); m_oImageManager.SetDstMedia(pathMedia.GetPath());
...@@ -809,7 +811,8 @@ namespace NSBinPptxRW ...@@ -809,7 +811,8 @@ namespace NSBinPptxRW
m_oPresentation.notesMasterIdLst[0].rid = (size_t)nCurrentRels; m_oPresentation.notesMasterIdLst[0].rid = (size_t)nCurrentRels;
++nCurrentRels; ++nCurrentRels;
} }
m_oReader.m_pRels->EndPresentationRels(m_oPresentation.commentAuthors.is_init(), bNotesMasterPresent);
m_oReader.m_pRels->EndPresentationRels(m_oPresentation.commentAuthors.is_init(), bNotesMasterPresent, m_oPresentation.m_pVbaProject.is_init());
m_oReader.m_pRels->CloseRels(); m_oReader.m_pRels->CloseRels();
oXmlWriter.ClearNoAttack(); oXmlWriter.ClearNoAttack();
...@@ -840,7 +843,16 @@ namespace NSBinPptxRW ...@@ -840,7 +843,16 @@ namespace NSBinPptxRW
// content types // content types
OOX::CContentTypes *pContentTypes = m_oImageManager.m_pContentTypes; OOX::CContentTypes *pContentTypes = m_oImageManager.m_pContentTypes;
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml", L"/ppt", L"presentation.xml"); pContentTypes->Registration(m_oPresentation.type().OverrideType(),
m_oPresentation.type().DefaultDirectory(),
m_oPresentation.type().DefaultFileName());
if (m_oPresentation.m_pVbaProject.IsInit())
{
pContentTypes->Registration(m_oPresentation.m_pVbaProject->type().OverrideType(),
m_oPresentation.type().DefaultDirectory() / m_oPresentation.m_pVbaProject->type().DefaultDirectory(),
m_oPresentation.m_pVbaProject->type().DefaultFileName());
}
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.presProps+xml", L"/ppt", L"presProps.xml"); pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.presProps+xml", L"/ppt", L"presProps.xml");
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml", L"/ppt", L"viewProps.xml"); pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml", L"/ppt", L"viewProps.xml");
pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml", L"/ppt", L"tableStyles.xml"); pContentTypes->Registration(L"application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml", L"/ppt", L"tableStyles.xml");
......
...@@ -84,7 +84,8 @@ namespace PPTX ...@@ -84,7 +84,8 @@ namespace PPTX
return smart_ptr<OOX::File>(new PPTX::App(filename, map)); return smart_ptr<OOX::File>(new PPTX::App(filename, map));
else if (relation.Type() == OOX::FileTypes::Core) else if (relation.Type() == OOX::FileTypes::Core)
return smart_ptr<OOX::File>(new PPTX::Core(filename, map)); return smart_ptr<OOX::File>(new PPTX::Core(filename, map));
else if (relation.Type() == OOX::Presentation::FileTypes::Presentation) else if (relation.Type() == OOX::Presentation::FileTypes::Presentation ||
relation.Type() == OOX::Presentation::FileTypes::PresentationMacro)
return smart_ptr<OOX::File>(new PPTX::Presentation(filename, map)); return smart_ptr<OOX::File>(new PPTX::Presentation(filename, map));
else if (relation.Type() == OOX::FileTypes::Theme) else if (relation.Type() == OOX::FileTypes::Theme)
return smart_ptr<OOX::File>(new PPTX::Theme(filename, map)); return smart_ptr<OOX::File>(new PPTX::Theme(filename, map));
...@@ -141,6 +142,8 @@ namespace PPTX ...@@ -141,6 +142,8 @@ namespace PPTX
return smart_ptr<OOX::File>(new OOX::OleObject(filename)); return smart_ptr<OOX::File>(new OOX::OleObject(filename));
else if (relation.Type() == OOX::FileTypes::MicrosoftOfficeUnknown) //ms package else if (relation.Type() == OOX::FileTypes::MicrosoftOfficeUnknown) //ms package
return smart_ptr<OOX::File>(new OOX::OleObject( filename, true )); return smart_ptr<OOX::File>(new OOX::OleObject( filename, true ));
else if (relation.Type() == OOX::FileTypes::VbaProject)
return smart_ptr<OOX::File>(new OOX::VbaProject( filename, filename ));
return smart_ptr<OOX::File>(new OOX::UnknowTypeFile()); return smart_ptr<OOX::File>(new OOX::UnknowTypeFile());
} }
......
...@@ -44,6 +44,9 @@ namespace Presentation ...@@ -44,6 +44,9 @@ namespace Presentation
const FileType Presentation (L"ppt", L"presentation.xml", const FileType Presentation (L"ppt", L"presentation.xml",
_T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"), _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"),
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument")); _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"));
const FileType PresentationMacro(L"ppt", L"presentation.xml",
_T("application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"),
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"));
const FileType Slide (L"slides", L"slide.xml", const FileType Slide (L"slides", L"slide.xml",
_T("application/vnd.openxmlformats-officedocument.presentationml.slide+xml"), _T("application/vnd.openxmlformats-officedocument.presentationml.slide+xml"),
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide")); _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide"));
......
...@@ -75,6 +75,12 @@ namespace PPTX ...@@ -75,6 +75,12 @@ namespace PPTX
if (_presentation.is_init()) if (_presentation.is_init())
{ {
_presentation->commentAuthors = _presentation->Get(OOX::Presentation::FileTypes::CommentAuthors).smart_dynamic_cast<PPTX::Authors>(); _presentation->commentAuthors = _presentation->Get(OOX::Presentation::FileTypes::CommentAuthors).smart_dynamic_cast<PPTX::Authors>();
if (_presentation->IsExist(OOX::FileTypes::VbaProject))
{
_presentation->m_bMacroEnabled = true;
_presentation->m_pVbaProject = _presentation->Get(OOX::FileTypes::VbaProject).smart_dynamic_cast<OOX::VbaProject>();
}
} }
for (std::map<std::wstring, smart_ptr<OOX::File>>::const_iterator pPair = map.m_map.begin(); pPair != map.m_map.end(); ++pPair) for (std::map<std::wstring, smart_ptr<OOX::File>>::const_iterator pPair = map.m_map.begin(); pPair != map.m_map.end(); ++pPair)
......
...@@ -50,6 +50,8 @@ ...@@ -50,6 +50,8 @@
#include "Logic/ExtP.h" #include "Logic/ExtP.h"
#include "Theme/ClrScheme.h" #include "Theme/ClrScheme.h"
#include "../../Common/DocxFormat/Source/DocxFormat/Media/VbaProject.h"
namespace PPTX namespace PPTX
{ {
class Presentation : public WrapperFile, public PPTX::FileContainer class Presentation : public WrapperFile, public PPTX::FileContainer
...@@ -57,16 +59,16 @@ namespace PPTX ...@@ -57,16 +59,16 @@ namespace PPTX
public: public:
Presentation() Presentation()
{ {
m_bMacroEnabled = false;
} }
Presentation(const OOX::CPath& filename, FileMap& map) Presentation(const OOX::CPath& filename, FileMap& map)
{ {
m_bMacroEnabled = false;
read(filename, map); read(filename, map);
} }
virtual ~Presentation() virtual ~Presentation()
{ {
} }
public:
virtual void read(const OOX::CPath& filename, FileMap& map) virtual void read(const OOX::CPath& filename, FileMap& map)
{ {
//FileContainer::read(filename, map); //FileContainer::read(filename, map);
...@@ -182,6 +184,7 @@ namespace PPTX ...@@ -182,6 +184,7 @@ namespace PPTX
} }
} }
} }
//smartTags (Smart Tags) //smartTags (Smart Tags)
Normalize(); Normalize();
} }
...@@ -222,6 +225,15 @@ namespace PPTX ...@@ -222,6 +225,15 @@ namespace PPTX
pWriter->WriteRecord2(6, commentAuthors); pWriter->WriteRecord2(6, commentAuthors);
pWriter->WriteRecord2(7, sectionLst); pWriter->WriteRecord2(7, sectionLst);
if (m_pVbaProject.IsInit())
{
pWriter->StartRecord(8);
{
m_pVbaProject->toPPTY(pWriter);
}
pWriter->EndRecord();
}
pWriter->EndRecord(); pWriter->EndRecord();
} }
virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
...@@ -318,22 +330,28 @@ namespace PPTX ...@@ -318,22 +330,28 @@ namespace PPTX
default: default:
return; return;
} }
} }
}break;
break;
}
case 6: case 6:
{ {
commentAuthors = new PPTX::Authors(); commentAuthors = new PPTX::Authors();
commentAuthors->fromPPTY(pReader); commentAuthors->fromPPTY(pReader);
break; }break;
}
case 7: case 7:
{ {
sectionLst = new nsPresentation::SectionLst(); sectionLst = new nsPresentation::SectionLst();
sectionLst->fromPPTY(pReader); sectionLst->fromPPTY(pReader);
break; }break;
} case 8:
{
m_pVbaProject = new OOX::VbaProject();
m_pVbaProject->fromPPTY(pReader);
smart_ptr<OOX::File> file = m_pVbaProject.smart_dynamic_cast<OOX::File>();
FileContainer::Add(file);
m_bMacroEnabled = true;
}break;
default: default:
{ {
pReader->Seek(_end_pos); pReader->Seek(_end_pos);
...@@ -397,10 +415,10 @@ namespace PPTX ...@@ -397,10 +415,10 @@ namespace PPTX
pWriter->EndNode(L"p:presentation"); pWriter->EndNode(L"p:presentation");
} }
public:
virtual const OOX::FileType type() const virtual const OOX::FileType type() const
{ {
return OOX::Presentation::FileTypes::Presentation; if (m_bMacroEnabled) return OOX::Presentation::FileTypes::PresentationMacro;
else return OOX::Presentation::FileTypes::Presentation;
} }
virtual const OOX::CPath DefaultDirectory() const virtual const OOX::CPath DefaultDirectory() const
{ {
...@@ -411,7 +429,6 @@ namespace PPTX ...@@ -411,7 +429,6 @@ namespace PPTX
return type().DefaultFileName(); return type().DefaultFileName();
} }
public:
//Childs //Childs
//custDataLst (Customer Data List) //custDataLst (Customer Data List)
//property<std::list<Presentation::CustShow> > custShowLst (List of Custom Shows) //property<std::list<Presentation::CustShow> > custShowLst (List of Custom Shows)
...@@ -446,9 +463,12 @@ namespace PPTX ...@@ -446,9 +463,12 @@ namespace PPTX
smart_ptr<PPTX::Authors> commentAuthors; smart_ptr<PPTX::Authors> commentAuthors;
private: private:
Logic::ClrMap m_clrMap; Logic::ClrMap m_clrMap;
nsTheme::ClrScheme m_clrScheme; nsTheme::ClrScheme m_clrScheme;
public: public:
bool m_bMacroEnabled;
smart_ptr<OOX::VbaProject> m_pVbaProject;
void SetClrMap(Logic::ClrMap map) {m_clrMap = map;}; void SetClrMap(Logic::ClrMap map) {m_clrMap = map;};
void SetClrScheme(nsTheme::ClrScheme scheme) {m_clrScheme = scheme;}; void SetClrScheme(nsTheme::ClrScheme scheme) {m_clrScheme = scheme;};
......
...@@ -363,7 +363,7 @@ namespace PPTX ...@@ -363,7 +363,7 @@ namespace PPTX
} }
if (IsExist(OOX::FileTypes::VmlDrawing)) if (IsExist(OOX::FileTypes::VmlDrawing))
{ {
Vml = FileContainer::Get(OOX::FileTypes::VmlDrawing).smart_dynamic_cast<OOX::CVmlDrawing>();//boost::shared_dynamic_cast<PPTX::VmlDrawing, PPTX::File>(FileContainer::get(OOX::Presentation::FileTypes::VmlDrawing)); Vml = FileContainer::Get(OOX::FileTypes::VmlDrawing).smart_dynamic_cast<OOX::CVmlDrawing>();
} }
} }
} }
......
...@@ -34,6 +34,9 @@ ...@@ -34,6 +34,9 @@
#define OOX_VBA_PROJECT_INCLUDE_H_ #define OOX_VBA_PROJECT_INCLUDE_H_
#include "Media.h" #include "Media.h"
#include "../../../../../ASCOfficePPTXFile/Editor/BinaryFileReaderWriter.h"
#include "../../../../../ASCOfficePPTXFile/Editor/imagemanager.h"
#include "../IFileContainer.h" #include "../IFileContainer.h"
#include "../../XlsxFormat/FileTypes_Spreadsheet.h" #include "../../XlsxFormat/FileTypes_Spreadsheet.h"
...@@ -72,6 +75,49 @@ namespace OOX ...@@ -72,6 +75,49 @@ namespace OOX
{ {
return m_filename.GetFilename(); return m_filename.GetFilename();
} }
virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteString1(0, m_filename.GetFilename());
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
copy_to(pWriter->m_pCommon->m_pImageManager->m_strDstMedia);
}
virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetLong() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
std::wstring file_name = pReader->GetString2();
OOX::CPath inputPath = pReader->m_strFolder + FILE_SEPARATOR_STR + _T("media") + FILE_SEPARATOR_STR + file_name;
OOX::CPath outputPath = pReader->m_pRels->m_pManager->GetDstFolder() + FILE_SEPARATOR_STR + _T("vbaProject.bin");
NSFile::CFileBinary::Copy(inputPath.GetPath(), outputPath.GetPath());
set_filename(outputPath.GetPath());
}break;
default:
break;
}
}
pReader->Seek(_end_rec);
}
protected: protected:
}; };
} // namespace OOX } // namespace OOX
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment