mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
vsdx in ole
This commit is contained in:
@ -548,6 +548,7 @@ namespace NSBinPptxRW
|
||||
std::wstring m_strFolderThemes;
|
||||
std::wstring m_strFolderExternalThemes;
|
||||
|
||||
_INT32 m_nCountImage = 1;
|
||||
_INT32 m_nCountEmbedded = 1;
|
||||
_INT32 m_nCountCharts = 1;
|
||||
_INT32 m_nCountDiagram = 1;
|
||||
|
||||
@ -40,8 +40,13 @@
|
||||
#include "../../Binary/Document/BinReader/FileWriter.h"
|
||||
#include "../../Binary/Document/DocWrapper/FontProcessor.h"
|
||||
#include "../../Binary/Document/DocWrapper/XlsxSerializer.h"
|
||||
#include "../../Binary/Document/DocWrapper/VsdxSerializer.h"
|
||||
|
||||
#include "../../Binary/Sheets/Reader/BinaryWriterS.h"
|
||||
#include "../../Binary/Sheets/Writer/BinaryReaderS.h"
|
||||
#include "../../Binary/Draw/BinaryWriterV.h"
|
||||
#include "../../Binary/Draw/BinaryReaderV.h"
|
||||
|
||||
#include "../../Binary/MathEquation/MathEquation.h"
|
||||
|
||||
#include "SpTree.h"
|
||||
@ -401,11 +406,11 @@ namespace PPTX
|
||||
|
||||
oDrawingConverter.SetFontPicker(pWriter->m_pCommon->m_pFontPicker);
|
||||
|
||||
int type = 0;
|
||||
BYTE embedded_type = 0;
|
||||
if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX ||
|
||||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM)
|
||||
{
|
||||
type = 1;
|
||||
embedded_type = 1;
|
||||
BinDocxRW::CDocxSerializer* old_serializer = pWriter->m_pMainDocument;
|
||||
|
||||
BinDocxRW::CDocxSerializer oDocxSerializer;
|
||||
@ -421,7 +426,7 @@ namespace PPTX
|
||||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM ||
|
||||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB)
|
||||
{
|
||||
type = 2;
|
||||
embedded_type = 2;
|
||||
|
||||
BinXlsxRW::BinaryFileWriter xlsxBinaryWriter(oFontProcessor);
|
||||
OOX::Spreadsheet::CXlsx *pXlsxEmbedded = NULL;
|
||||
@ -464,7 +469,26 @@ namespace PPTX
|
||||
}
|
||||
//else if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX)
|
||||
//{ todooo
|
||||
// embedded_type = 3;
|
||||
//}
|
||||
else if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DRAW_VSDX ||
|
||||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DRAW_VSDM ||
|
||||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DRAW_VSTX)
|
||||
{
|
||||
embedded_type = 5;
|
||||
|
||||
BinVsdxRW::BinaryFileWriter oBinaryFileWriter(oFontProcessor);
|
||||
|
||||
NSBinPptxRW::CBinaryFileWriter& oBufferedStream = *oDrawingConverter.m_pBinaryWriter;
|
||||
oBufferedStream.m_strMainFolder = oDrawingConverter.m_pImageManager->GetDstFolder();
|
||||
|
||||
OOX::Draw::CVsdx* pVsdx = new OOX::Draw::CVsdx(oox_unpacked);
|
||||
|
||||
oBinaryFileWriter.WriteMainTableStart(oBufferedStream);
|
||||
oBinaryFileWriter.WriteContent(pVsdx, &oDrawingConverter);
|
||||
oBinaryFileWriter.WriteMainTableEnd();
|
||||
RELEASEOBJECT(pVsdx);
|
||||
}
|
||||
else
|
||||
{//unknown ms package
|
||||
oDrawingConverter.m_pBinaryWriter->WriteString1(2, ole_file->filename().GetFilename());
|
||||
@ -475,7 +499,7 @@ namespace PPTX
|
||||
oDrawingConverter.m_pBinaryWriter->m_pCommon->m_pMediaManager = old_manager;
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
pWriter->StartRecord(1);
|
||||
pWriter->WriteBYTE(type);
|
||||
pWriter->WriteBYTE(embedded_type);
|
||||
pWriter->EndRecord();
|
||||
|
||||
pWriter->StartRecord(2);
|
||||
@ -487,13 +511,14 @@ namespace PPTX
|
||||
}
|
||||
else if ( std::wstring::npos != sProgID.find(L"Equation"))
|
||||
{
|
||||
BYTE embedded_type = 4;
|
||||
|
||||
pWriter->StartRecord(1);
|
||||
pWriter->WriteBYTE(4);
|
||||
pWriter->WriteBYTE(embedded_type);
|
||||
pWriter->EndRecord();
|
||||
|
||||
MathEquation::CEquationReader oReader (ole_file->filename().GetPath().c_str());
|
||||
MathEquation::BinaryEquationWriter oBinEqWriter(pWriter);
|
||||
MathEquation::CEquationReader oReader (ole_file->filename().GetPath().c_str());
|
||||
MathEquation::BinaryEquationWriter oBinEqWriter(pWriter);
|
||||
|
||||
oReader.SetOutputDev(&oBinEqWriter);
|
||||
|
||||
@ -613,8 +638,12 @@ namespace PPTX
|
||||
}
|
||||
else if (embedded_type == 5)
|
||||
{
|
||||
ReadOoxmlZip(pReader, sDstEmbedded, pReader->GetData() + pReader->GetPos(), _embed_data_size);
|
||||
ReadVsdxBin(pReader, sDstEmbedded, pReader->GetData() + pReader->GetPos(), _embed_data_size);
|
||||
}
|
||||
else if (embedded_type == 6) //???
|
||||
{
|
||||
ReadOoxmlZip(pReader, sDstEmbedded, pReader->GetData() + pReader->GetPos(), _embed_data_size);
|
||||
}
|
||||
}
|
||||
pReader->Seek(_end_embed_data);
|
||||
}break;
|
||||
@ -1771,6 +1800,12 @@ namespace PPTX
|
||||
case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX: sTrueFilename = L"Microsoft_PowerPoint" + std::to_wstring(id) + L".potx"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: sTrueFilename = L"Microsoft_PowerPoint" + std::to_wstring(id) + L".potm"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: sTrueFilename = L"Microsoft_PowerPoint" + std::to_wstring(id) + L".ppsm"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_DRAW_VSDX: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vsdx"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_DRAW_VSDM: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vsdm"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_DRAW_VSSX: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vssx"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_DRAW_VSTX: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vstx"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_DRAW_VSSM: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vssm"; break;
|
||||
case AVS_OFFICESTUDIO_FILE_DRAW_VSTM: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vstm"; break;
|
||||
}
|
||||
}
|
||||
if (false == sTrueFilename.empty())
|
||||
@ -1903,6 +1938,50 @@ namespace PPTX
|
||||
|
||||
m_OleObjectFile->set_filename(sDstEmbedded + FILE_SEPARATOR_STR + sXlsxFilename, false);
|
||||
|
||||
NSDirectory::DeleteDirectory(sDstEmbeddedTemp);
|
||||
return true;
|
||||
}
|
||||
bool COLEObject::ReadVsdxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length)
|
||||
{
|
||||
m_OleObjectFile = new OOX::OleObject(NULL, true, pReader->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX);
|
||||
int id = pReader->m_nCountEmbedded++; //todoooo -> countEmbeddedObjects
|
||||
|
||||
std::wstring sDstEmbeddedTemp = sDstEmbedded + FILE_SEPARATOR_STR + L"Temp";
|
||||
NSDirectory::CreateDirectory(sDstEmbeddedTemp);
|
||||
|
||||
NSBinPptxRW::CDrawingConverter oDrawingConverter;
|
||||
|
||||
oDrawingConverter.m_pReader->Init(pData, 0, length);
|
||||
|
||||
std::wstring sXmlOptions, sMediaPath, sEmbedPath;
|
||||
BinVsdxRW::CVsdxSerializer::CreateVsdxFolders(sDstEmbeddedTemp, sMediaPath, sEmbedPath);
|
||||
|
||||
oDrawingConverter.SetDstPath(sDstEmbeddedTemp + FILE_SEPARATOR_STR + L"visio");
|
||||
oDrawingConverter.SetSrcPath(pReader->m_strFolder + FILE_SEPARATOR_STR, XMLWRITER_DOC_TYPE_VSDX);
|
||||
|
||||
oDrawingConverter.SetMediaDstPath(sMediaPath);
|
||||
oDrawingConverter.SetEmbedDstPath(sEmbedPath);
|
||||
|
||||
OOX::Draw::CVsdx oVsdx;
|
||||
boost::unordered_map<std::wstring, size_t> old_enum_map = oVsdx.m_mapEnumeratedGlobal;
|
||||
|
||||
BinVsdxRW::BinaryFileReader oEmbeddedReader;
|
||||
BinVsdxRW::SaveParams oSaveParams(true);
|
||||
oEmbeddedReader.ReadContent(oVsdx, *oDrawingConverter.m_pReader, pReader->m_strFolder, sDstEmbeddedTemp, oSaveParams);
|
||||
|
||||
OOX::CContentTypes oContentTypes;
|
||||
oVsdx.Write(sDstEmbeddedTemp, oContentTypes);
|
||||
|
||||
COfficeUtils oOfficeUtils(NULL);
|
||||
std::wstring sVsdxFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + (oSaveParams.bMacroEnabled ? L".vsdm" : L".vsdx");
|
||||
oOfficeUtils.CompressFileOrDirectory(sDstEmbeddedTemp, sDstEmbedded + FILE_SEPARATOR_STR + sVsdxFilename, true);
|
||||
|
||||
oVsdx.m_mapEnumeratedGlobal = old_enum_map;
|
||||
|
||||
pReader->m_pRels->m_pManager->m_pContentTypes->AddDefault(oSaveParams.bMacroEnabled ? L"vsdm" : L"vsdx");
|
||||
|
||||
m_OleObjectFile->set_filename(sDstEmbedded + FILE_SEPARATOR_STR + sVsdxFilename, false);
|
||||
|
||||
NSDirectory::DeleteDirectory(sDstEmbeddedTemp);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -100,6 +100,7 @@ namespace PPTX
|
||||
|
||||
nullable_string m_sAlternateContenteXml;
|
||||
private:
|
||||
bool ReadVsdxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);
|
||||
bool ReadXlsxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);
|
||||
bool ReadDocxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);
|
||||
bool ReadOoxmlZip(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);
|
||||
|
||||
@ -154,23 +154,17 @@ namespace OOX
|
||||
|
||||
if (Rel.IsInit() && Rel->Rid.IsInit())
|
||||
{
|
||||
CPath out = pWriter->m_strMainFolder + FILE_SEPARATOR_STR + L"media";
|
||||
CPath out = pWriter->m_pCommon->m_pMediaManager->m_strDstMedia;
|
||||
|
||||
smart_ptr<OOX::File> pFile = pWriter->GetRels()->Find(Rel->Rid->GetValue());
|
||||
OOX::OleObject* pOleObject = dynamic_cast<OOX::OleObject*>(pFile.GetPointer());
|
||||
|
||||
CPath image_path;
|
||||
CPath ole_path;
|
||||
if (pOleObject)
|
||||
{
|
||||
image_path = pOleObject->filename_cache();
|
||||
CPath ole = pOleObject->filename();
|
||||
|
||||
//todooo check correct path inside container
|
||||
NSFile::CFileBinary::Copy(ole.GetPath(), out.GetPath() + FILE_SEPARATOR_STR + ole.GetFilename());
|
||||
|
||||
pWriter->StartRecord(2);
|
||||
pWriter->WriteString(ole.GetFilename());
|
||||
pWriter->EndRecord();
|
||||
ole_path = pOleObject->filename();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -180,11 +174,11 @@ namespace OOX
|
||||
image_path = pMedia->filename();
|
||||
}
|
||||
}
|
||||
std::wstring image_name_new;
|
||||
if (false == image_path.GetPath().empty())
|
||||
{
|
||||
//todooo check correct path inside container
|
||||
|
||||
std::wstring image_name_new = image_path.GetFilename();
|
||||
image_name_new = image_path.GetFilename();
|
||||
std::wstring image_ext_new = image_path.GetExtention();
|
||||
|
||||
std::map<std::wstring, NSShapeImageGen::CMediaInfo>::iterator pFind = pWriter->m_pCommon->m_pMediaManager->m_mapMediaFiles.find(image_path.GetFilename());
|
||||
@ -193,8 +187,7 @@ namespace OOX
|
||||
NSShapeImageGen::CMediaInfo oInfo;
|
||||
oInfo.m_lID = ++pWriter->m_pCommon->m_pMediaManager->m_lNextIDImage;
|
||||
oInfo.m_sExt = image_path.GetExtention();
|
||||
oInfo.m_sName = L"image" + std::to_wstring(oInfo.m_lID);
|
||||
image_name_new = oInfo.m_sName;
|
||||
image_name_new = oInfo.m_sName = L"image" + std::to_wstring(oInfo.m_lID);
|
||||
|
||||
pWriter->m_pCommon->m_pMediaManager->m_mapMediaFiles.insert(std::make_pair(image_path.GetFilename(), oInfo));
|
||||
}
|
||||
@ -248,11 +241,29 @@ namespace OOX
|
||||
}
|
||||
}
|
||||
}
|
||||
if (false == ole_path.GetPath().empty())
|
||||
{
|
||||
if (image_name_new.empty())
|
||||
{
|
||||
NSShapeImageGen::CMediaInfo oInfo;
|
||||
oInfo.m_lID = ++pWriter->m_pCommon->m_pMediaManager->m_lNextIDImage;
|
||||
image_name_new = oInfo.m_sName = L"image" + std::to_wstring(oInfo.m_lID);
|
||||
|
||||
pWriter->m_pCommon->m_pMediaManager->m_mapMediaFiles.insert(std::make_pair(image_path.GetFilename(), oInfo));
|
||||
}
|
||||
std::wstring ole_name_new = image_name_new + ole_path.GetExtention();
|
||||
//todooo check correct path inside container
|
||||
NSFile::CFileBinary::Copy(ole_path.GetPath(), out.GetPath() + FILE_SEPARATOR_STR + ole_name_new);
|
||||
|
||||
pWriter->StartRecord(2);
|
||||
pWriter->WriteString(ole_name_new);
|
||||
pWriter->EndRecord();
|
||||
}
|
||||
}
|
||||
}
|
||||
void CForeignData::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
||||
{
|
||||
std::wstring media_filename, ole_filename;
|
||||
std::wstring image_filename, ole_filename;
|
||||
|
||||
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
||||
pReader->Skip(1); // start attributes
|
||||
@ -311,7 +322,7 @@ namespace OOX
|
||||
case 1:
|
||||
{
|
||||
pReader->Skip(4);
|
||||
media_filename = pReader->GetString2();
|
||||
image_filename = pReader->GetString2();
|
||||
}break;
|
||||
case 2:
|
||||
{
|
||||
@ -328,14 +339,20 @@ namespace OOX
|
||||
|
||||
if (ole_filename.empty() == false)
|
||||
{
|
||||
int idOle = pReader->m_nCountEmbedded++; //todoooo -> countEmbeddedObjects
|
||||
int idImage = pReader->m_nCountImage++;
|
||||
|
||||
std::wstring ole_filename_dst = L"oleObject" + std::to_wstring(idOle) + CPath(ole_filename).GetExtention();
|
||||
std::wstring image_filename_dst = L"image" + std::to_wstring(idImage) + CPath(image_filename).GetExtention();
|
||||
|
||||
std::wstring srcMedia = pReader->m_strFolder + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR;
|
||||
|
||||
NSFile::CFileBinary::Copy(srcMedia + ole_filename, pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename);
|
||||
NSFile::CFileBinary::Copy(srcMedia + media_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename);
|
||||
NSFile::CFileBinary::Copy(srcMedia + ole_filename, pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename_dst);
|
||||
NSFile::CFileBinary::Copy(srcMedia + image_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst);
|
||||
|
||||
OleObject* pOle = new OleObject(NULL, false, false);
|
||||
pOle->set_filename(pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename, false);
|
||||
pOle->set_filename_cache(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename);
|
||||
pOle->set_filename(pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename_dst, false);
|
||||
pOle->set_filename_cache(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst);
|
||||
|
||||
COfficeFileFormatChecker checker;
|
||||
if (checker.isOOXFormatFile(pOle->filename().GetPath()))
|
||||
@ -348,10 +365,10 @@ namespace OOX
|
||||
Rel.Init(); Rel->Rid.Init();
|
||||
Rel->Rid->SetValue(pReader->GetRels()->Add(oFile).get());
|
||||
|
||||
if (media_filename.empty() == false)
|
||||
if (image_filename_dst.empty() == false)
|
||||
{
|
||||
Image* pImage = new Image(NULL, false);
|
||||
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename, false);
|
||||
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst, false);
|
||||
|
||||
smart_ptr<OOX::File> oFileCache(pImage);
|
||||
pOle->Add(oFileCache);
|
||||
@ -360,11 +377,14 @@ namespace OOX
|
||||
else
|
||||
{
|
||||
std::wstring srcMedia = pReader->m_strFolder + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR;
|
||||
int idImage = pReader->m_nCountImage++;
|
||||
std::wstring image_filename_dst = L"image" + std::to_wstring(idImage) + CPath(image_filename).GetExtention();
|
||||
|
||||
NSFile::CFileBinary::Copy(srcMedia + media_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename);
|
||||
|
||||
NSFile::CFileBinary::Copy(srcMedia + image_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst);
|
||||
|
||||
Image* pImage = new Image(NULL, false);
|
||||
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename, false);
|
||||
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst, false);
|
||||
|
||||
smart_ptr<OOX::File> oFile(pImage);
|
||||
Rel.Init(); Rel->Rid.Init();
|
||||
|
||||
@ -1731,7 +1731,7 @@ namespace Draw
|
||||
if (pJsaProject->IsExist() && !pJsaProject->IsExternal())
|
||||
{
|
||||
std::wstring pathJsa = pJsaProject->filename().GetPath();
|
||||
if (std::wstring::npos != pathJsa.find(pWriter->m_strMainFolder))
|
||||
//if (std::wstring::npos != pathJsa.find(pWriter->m_strMainFolder)) //out path
|
||||
{
|
||||
BYTE* pData = NULL;
|
||||
DWORD nBytesCount;
|
||||
|
||||
Reference in New Issue
Block a user