mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-11 02:16:02 +08:00
Compare commits
15 Commits
core-windo
...
core/devel
| Author | SHA1 | Date | |
|---|---|---|---|
| 6e258b85d7 | |||
| 24e55018a0 | |||
| 2352ae5d88 | |||
| 2cba43e6f3 | |||
| abcf8d0246 | |||
| c18b955467 | |||
| 7896b75001 | |||
| 7d188b2213 | |||
| 79ead484cc | |||
| be65f18a0e | |||
| 60f61109a1 | |||
| 4201bcecc6 | |||
| 7b7bfbc5dd | |||
| a70255e500 | |||
| 7e9dede9b3 |
@ -7196,7 +7196,7 @@ namespace BinDocxRW
|
||||
}
|
||||
void WriteColorSchemeMapping(const PPTX::Logic::ClrMap& oColorSchemeMapping)
|
||||
{
|
||||
int re_index[] = {0, 1, 2, 3, 4, 5, 10, 11, 6, 7, 8, 9, 10, 6, 7};
|
||||
int re_index[] = {0, 1, 2, 3, 4, 5, 10, 11, 6, 7, 8, 9, 10, 11, 10, 6, 7};
|
||||
|
||||
int nCurPos = 0;
|
||||
std::map<std::wstring, PPTX::Limit::ColorSchemeIndex>::const_iterator pFind;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="windows-1251"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Version="8,00"
|
||||
Name="OdfFileReaderTest"
|
||||
ProjectGUID="{C2882DDD-07E6-4314-AD4B-48F43F38D722}"
|
||||
RootNamespace="ASCOfficeOdfFileTest"
|
||||
|
||||
@ -49,6 +49,8 @@ struct _rect
|
||||
|
||||
struct drawing_object_description
|
||||
{
|
||||
bool bNotes_;
|
||||
|
||||
oox::RelsType type_;
|
||||
|
||||
std::wstring name_;
|
||||
|
||||
@ -385,6 +385,7 @@ void _oox_drawing::serialize_shape(std::wostream & strm)
|
||||
odf_reader::GetProperty(additional, L"custom_path_w", w);
|
||||
odf_reader::GetProperty(additional, L"custom_path_h", h);
|
||||
|
||||
|
||||
CP_XML_NODE(L"a:pathLst")
|
||||
{
|
||||
CP_XML_NODE(L"a:path")
|
||||
@ -392,7 +393,10 @@ void _oox_drawing::serialize_shape(std::wostream & strm)
|
||||
CP_XML_ATTR(L"w", w ? *w : cx);
|
||||
CP_XML_ATTR(L"h", h ? *h : cy);
|
||||
|
||||
CP_XML_STREAM() << *sCustomPath;
|
||||
if (sCustomPath)
|
||||
{
|
||||
CP_XML_STREAM() << *sCustomPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -153,7 +153,9 @@ void pptx_conversion_context::process_master_pages()
|
||||
get_text_context().set_process_layouts(true);
|
||||
|
||||
//берем только актуальные
|
||||
for (size_t master_index =0; master_index < masters.content.size();master_index++)
|
||||
odf_reader::office_element_ptr master_notes_;
|
||||
|
||||
for (size_t master_index = 0; master_index < masters.content.size(); master_index++)
|
||||
{
|
||||
start_master(master_index);
|
||||
|
||||
@ -163,10 +165,21 @@ void pptx_conversion_context::process_master_pages()
|
||||
if (master)
|
||||
{
|
||||
master->pptx_convert(*this);
|
||||
|
||||
if (!master_notes_ && master->presentation_notes_)
|
||||
master_notes_ = master->presentation_notes_;
|
||||
}
|
||||
|
||||
|
||||
end_master();
|
||||
}
|
||||
|
||||
if (master_notes_)
|
||||
{
|
||||
start_master_notes();
|
||||
master_notes_->pptx_convert(*this);
|
||||
end_master_notes();
|
||||
}
|
||||
process_masters_ = false;
|
||||
get_text_context().set_process_layouts(false);
|
||||
|
||||
@ -180,15 +193,15 @@ void pptx_conversion_context::process_theme(std::wstring name)
|
||||
{
|
||||
int current = themes_.size() + 1;
|
||||
|
||||
if (name.length()<1)
|
||||
if (name.empty())
|
||||
{
|
||||
name = L"User Theme: " + boost::lexical_cast<std::wstring>(current);
|
||||
}
|
||||
start_theme(name);
|
||||
//
|
||||
pptx_serialize_clrScheme(current_theme().clrSchemeData());
|
||||
pptx_serialize_fmtScheme(current_theme().fmtSchemeData());
|
||||
pptx_serialize_fontScheme(current_theme().fontSchemeData());
|
||||
pptx_serialize_clrScheme (current_theme().clrSchemeData());
|
||||
pptx_serialize_fmtScheme (current_theme().fmtSchemeData());
|
||||
pptx_serialize_fontScheme (current_theme().fontSchemeData());
|
||||
//
|
||||
end_theme();
|
||||
|
||||
@ -209,8 +222,6 @@ void pptx_conversion_context::start_document()
|
||||
|
||||
void pptx_conversion_context::end_document()
|
||||
{
|
||||
unsigned int count = 1;
|
||||
|
||||
for (size_t i = 0; i < slideMasters_.size(); i++)
|
||||
{
|
||||
pptx_xml_slideMaster_ptr& slideM = slideMasters_[i];
|
||||
@ -230,10 +241,11 @@ void pptx_conversion_context::end_document()
|
||||
CP_XML_ATTR(L"r:id", slideM->rId());
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
if (!slideMasters_.empty())
|
||||
presentation_.slidesProperties() << slideMasters_[0]->Sizes().str();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
count=0;
|
||||
for (size_t i = 0; i < slides_.size(); i++)
|
||||
{
|
||||
pptx_xml_slide_ptr& slide = slides_[i];
|
||||
@ -249,13 +261,12 @@ void pptx_conversion_context::end_document()
|
||||
{
|
||||
CP_XML_NODE(L"p:sldId")
|
||||
{
|
||||
CP_XML_ATTR(L"id", 0x100 + count);
|
||||
CP_XML_ATTR(L"id", 0x100 + i);
|
||||
CP_XML_ATTR(L"r:id", slide->rId());
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
//----------------------------------------------------------------------------------
|
||||
for (size_t i = 0; i < slideLayouts_.size(); i++)
|
||||
{
|
||||
pptx_xml_slideLayout_ptr& slideL = slideLayouts_[i];
|
||||
@ -267,30 +278,42 @@ void pptx_conversion_context::end_document()
|
||||
|
||||
output_document_->get_ppt_files().add_slideLayout(content);//slideMaster.xml
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//размеры страниц в презентации
|
||||
odf_reader::odf_read_context & context = root()->odf_context();
|
||||
odf_reader::page_layout_container & pageLayouts = context.pageLayoutContainer();
|
||||
|
||||
if ((pageLayouts.master_pages().size() > 0) && (pageLayouts.master_pages()[0]->attlist_.style_name_))//default
|
||||
{
|
||||
const std::wstring masterStyleName = pageLayouts.master_pages()[0]->attlist_.style_name_.get();
|
||||
const std::wstring pageProperties = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(masterStyleName);
|
||||
//----------------------------------------------------------------------------------
|
||||
for (size_t i = 0; i < notes_.size(); i++)
|
||||
{
|
||||
pptx_xml_slideNotes_ptr& slideN = notes_[i];
|
||||
|
||||
odf_reader::page_layout_instance *pages_layouts = root()->odf_context().pageLayoutContainer().page_layout_by_name(pageProperties);
|
||||
|
||||
if (pages_layouts)pages_layouts->pptx_convert(*this);
|
||||
package::slide_content_ptr content = package::slide_content::create();
|
||||
|
||||
slideN->write_to(content->content());
|
||||
content->add_rels(slideN->Rels());//media & links rels
|
||||
|
||||
output_document_->get_ppt_files().add_notes(content);
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
pptx_serialize_size(current_presentation().notesSlidesSize(),6858000,9144000,L"p:notesSz");
|
||||
if (slideNotesMaster_)
|
||||
{
|
||||
package::slide_content_ptr content = package::slide_content::create();
|
||||
|
||||
slideNotesMaster_->write_to(content->content());
|
||||
content->add_rels(slideNotesMaster_->Rels());//media & links rels
|
||||
|
||||
output_document_->get_ppt_files().add_notesMaster(content);
|
||||
|
||||
CP_XML_WRITER(presentation_.slideNotesMastersData())//presentation.xml
|
||||
{
|
||||
CP_XML_NODE(L"p:notesMasterId")
|
||||
{
|
||||
CP_XML_ATTR(L"r:id", slideNotesMaster_->rId());
|
||||
}
|
||||
}
|
||||
}
|
||||
//else
|
||||
pptx_serialize_size(current_presentation().slidesNotesProperties(), 6858000, 9144000, L"p:notesSz");
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//добавляем диаграммы
|
||||
|
||||
count = 0;
|
||||
for (size_t i = 0; i < charts_.size(); i++)
|
||||
{
|
||||
count++;
|
||||
package::chart_content_ptr content = package::chart_content::create();
|
||||
|
||||
charts_[i]->serialize(content->content());
|
||||
@ -300,7 +323,6 @@ void pptx_conversion_context::end_document()
|
||||
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//добавляем темы
|
||||
for (size_t i=0; i < themes_.size(); i++)
|
||||
{
|
||||
output_document_->get_ppt_files().add_theme(themes_[i]);
|
||||
@ -308,10 +330,10 @@ void pptx_conversion_context::end_document()
|
||||
}
|
||||
package::ppt_comments_files_ptr comments = package::ppt_comments_files::create(comments_context_handle_.content());
|
||||
|
||||
output_document_->get_ppt_files().set_presentation(presentation_);
|
||||
output_document_->get_ppt_files().set_comments(comments);
|
||||
output_document_->get_ppt_files().set_authors_comments(authors_comments_);
|
||||
output_document_->get_ppt_files().set_media(get_mediaitems(), applicationFonts_);
|
||||
output_document_->get_ppt_files().set_presentation (presentation_);
|
||||
output_document_->get_ppt_files().set_comments (comments);
|
||||
output_document_->get_ppt_files().set_authors_comments (authors_comments_);
|
||||
output_document_->get_ppt_files().set_media (get_mediaitems(), applicationFonts_);
|
||||
|
||||
output_document_->get_content_types_file().set_media(get_mediaitems());
|
||||
}
|
||||
@ -321,7 +343,28 @@ void pptx_conversion_context::start_body()
|
||||
|
||||
void pptx_conversion_context::end_body()
|
||||
{}
|
||||
|
||||
pptx_xml_slideNotesMaster & pptx_conversion_context::current_notesMaster()
|
||||
{
|
||||
if (slideNotesMaster_)
|
||||
{
|
||||
return *slideNotesMaster_;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::runtime_error("internal error");
|
||||
}
|
||||
}
|
||||
pptx_xml_slideNotes & pptx_conversion_context::current_notes()
|
||||
{
|
||||
if (!notes_.empty())
|
||||
{
|
||||
return *notes_.back().get();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::runtime_error("internal error");
|
||||
}
|
||||
}
|
||||
pptx_xml_slide & pptx_conversion_context::current_slide()
|
||||
{
|
||||
if (!slides_.empty())
|
||||
@ -384,9 +427,18 @@ pptx_xml_slideMaster & pptx_conversion_context::current_master()
|
||||
}
|
||||
void pptx_conversion_context::create_new_slide(std::wstring const & name)
|
||||
{
|
||||
pptx_xml_slide_ptr s = pptx_xml_slide::create(name,slides_.size()+1);
|
||||
pptx_xml_slide_ptr s = pptx_xml_slide::create(name,slides_.size() + 1);
|
||||
slides_.push_back(s);
|
||||
}
|
||||
void pptx_conversion_context::create_new_slideNotes()
|
||||
{
|
||||
pptx_xml_slideNotes_ptr s = pptx_xml_slideNotes::create( notes_.size() + 1);
|
||||
notes_.push_back(s);
|
||||
}
|
||||
void pptx_conversion_context::create_new_slideNotesMaster()
|
||||
{
|
||||
slideNotesMaster_ = pptx_xml_slideNotesMaster::create();
|
||||
}
|
||||
void pptx_conversion_context::create_new_slideLayout(int id)
|
||||
{
|
||||
pptx_xml_slideLayout_ptr s = pptx_xml_slideLayout::create(id);
|
||||
@ -397,7 +449,6 @@ void pptx_conversion_context::create_new_slideMaster(int id)
|
||||
pptx_xml_slideMaster_ptr s = pptx_xml_slideMaster::create(id);
|
||||
slideMasters_.push_back(s);
|
||||
}
|
||||
|
||||
bool pptx_conversion_context::start_page(const std::wstring & pageName, const std::wstring & pageStyleName,
|
||||
const std::wstring & pageLayoutName,
|
||||
const std::wstring & pageMasterName)
|
||||
@ -414,7 +465,7 @@ bool pptx_conversion_context::start_page(const std::wstring & pageName, const st
|
||||
root()->odf_context().styleContainer().presentation_layouts().add_or_find(pageLayoutName,pageMasterName);
|
||||
|
||||
current_slide().Rels().add(relationship(layout_id.second, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout",
|
||||
std::wstring(L"../slideLayouts/slideLayout") + boost::lexical_cast<std::wstring>(layout_id.first) + L".xml"));
|
||||
std::wstring(L"../slideLayouts/slideLayout") + std::to_wstring(layout_id.first) + L".xml"));
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -506,6 +557,14 @@ bool pptx_conversion_context::start_master(int master_index)
|
||||
current_master().add_layout(masters.content[master_index].layouts[i].Id, masters.content[master_index].layouts[i].rId, 0x80000000 + last_uniq_big_id++);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
//размеры страниц в презентации
|
||||
const std::wstring pageProperties = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(masters.content[master_index].master_name);
|
||||
|
||||
odf_reader::page_layout_instance *pages_layouts = root()->odf_context().pageLayoutContainer().page_layout_by_name(pageProperties);
|
||||
|
||||
if (pages_layouts)
|
||||
pages_layouts->pptx_serialize(current_master().Sizes(), *this);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -530,6 +589,59 @@ void pptx_conversion_context::end_page()
|
||||
|
||||
get_slide_context().end_slide();
|
||||
}
|
||||
bool pptx_conversion_context::start_page_notes()
|
||||
{
|
||||
create_new_slideNotes( );
|
||||
|
||||
current_slide().Rels().add(relationship(notes_.back()->rId(), L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide",
|
||||
L"../notesSlides/notesSlide" + std::to_wstring(notes_.size()) + L".xml"));
|
||||
|
||||
get_slide_context().start_slide();
|
||||
|
||||
current_notes().Rels().add(relationship(L"nId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide",
|
||||
L"../slides/slide" + std::to_wstring(slides_.size()) + L".xml"));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void pptx_conversion_context::end_page_notes()
|
||||
{
|
||||
get_slide_context().serialize_background(current_notes().Background());
|
||||
get_slide_context().serialize_objects(current_notes().Data());
|
||||
|
||||
get_slide_context().dump_rels(current_notes().Rels());//hyperlinks, mediaitems, ...
|
||||
|
||||
get_slide_context().end_slide();
|
||||
}
|
||||
bool pptx_conversion_context::start_master_notes()
|
||||
{
|
||||
create_new_slideNotesMaster( );
|
||||
|
||||
get_slide_context().start_slide();
|
||||
|
||||
process_theme(L"");//add default theme - одинаковые но под разными именами
|
||||
current_notesMaster().add_theme(current_theme().id(), L"tId1");
|
||||
|
||||
get_slide_context().start_slide();
|
||||
return true;
|
||||
}
|
||||
|
||||
void pptx_conversion_context::end_master_notes()
|
||||
{
|
||||
get_slide_context().serialize_background(current_notesMaster().Background());
|
||||
get_slide_context().serialize_objects(current_notesMaster().Data());
|
||||
|
||||
get_slide_context().dump_rels(current_notesMaster().Rels());//hyperlinks, mediaitems, ...
|
||||
|
||||
get_slide_context().end_slide();
|
||||
|
||||
for (size_t i = 0; i < notes_.size(); i++)
|
||||
{
|
||||
notes_[i]->Rels().add(relationship(L"nmId1",
|
||||
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster",
|
||||
L"../notesMasters/notesMaster1.xml"));
|
||||
}
|
||||
}
|
||||
void pptx_conversion_context::end_layout()
|
||||
{
|
||||
get_slide_context().serialize_objects(current_layout().Data());
|
||||
|
||||
@ -88,6 +88,12 @@ public:
|
||||
const std::wstring & pageMasterName);
|
||||
void end_page();
|
||||
|
||||
bool start_page_notes();
|
||||
void end_page_notes();
|
||||
|
||||
bool start_master_notes();
|
||||
void end_master_notes();
|
||||
|
||||
bool start_layout( int layout_index);
|
||||
void end_layout();
|
||||
|
||||
@ -107,10 +113,13 @@ public:
|
||||
return odf_document_;
|
||||
}
|
||||
|
||||
pptx_xml_slide & current_slide();
|
||||
pptx_xml_slideLayout & current_layout();
|
||||
pptx_xml_slideMaster & current_master();
|
||||
pptx_xml_theme & current_theme();
|
||||
pptx_xml_slide & current_slide();
|
||||
pptx_xml_slideLayout & current_layout();
|
||||
pptx_xml_slideMaster & current_master();
|
||||
pptx_xml_theme & current_theme();
|
||||
pptx_xml_slideNotes & current_notes();
|
||||
pptx_xml_slideNotesMaster & current_notesMaster();
|
||||
|
||||
pptx_xml_presentation & current_presentation();//собственно она одна
|
||||
|
||||
oox_chart_context & current_chart();
|
||||
@ -138,6 +147,8 @@ private:
|
||||
void create_new_slide(std::wstring const & name);
|
||||
void create_new_slideLayout(int id);
|
||||
void create_new_slideMaster(int id);
|
||||
void create_new_slideNotes();
|
||||
void create_new_slideNotesMaster();
|
||||
|
||||
package::pptx_document * output_document_;
|
||||
odf_reader::odf_document * odf_document_;
|
||||
@ -152,10 +163,12 @@ private:
|
||||
std::vector<oox_chart_context_ptr> charts_;
|
||||
|
||||
std::vector<pptx_xml_slide_ptr> slides_;
|
||||
std::vector<pptx_xml_slideNotes_ptr> notes_;
|
||||
std::vector<pptx_xml_slideMaster_ptr> slideMasters_;
|
||||
std::vector<pptx_xml_slideLayout_ptr> slideLayouts_;
|
||||
std::vector<pptx_xml_theme_ptr> themes_;
|
||||
|
||||
pptx_xml_slideNotesMaster_ptr slideNotesMaster_;
|
||||
pptx_xml_authors_comments_ptr authors_comments_;
|
||||
pptx_xml_presentation presentation_;
|
||||
|
||||
|
||||
@ -41,7 +41,7 @@
|
||||
namespace cpdoccore {
|
||||
namespace oox {
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
std::wstring pptx_xml_slide::name() const
|
||||
{
|
||||
return name_;
|
||||
@ -53,7 +53,7 @@ std::wstring pptx_xml_slide::rId() const
|
||||
|
||||
pptx_xml_slide_ptr pptx_xml_slide::create(std::wstring const & name,int id)
|
||||
{
|
||||
const std::wstring rId = std::wstring(L"sId") + boost::lexical_cast<std::wstring>(id);
|
||||
const std::wstring rId = std::wstring(L"sId") + std::to_wstring(id);
|
||||
return boost::make_shared<pptx_xml_slide>(name,rId);
|
||||
}
|
||||
|
||||
@ -68,15 +68,15 @@ pptx_xml_slide::~pptx_xml_slide()
|
||||
}
|
||||
std::wostream & pptx_xml_slide::Data()
|
||||
{
|
||||
return slideData_;
|
||||
return strmData_;
|
||||
}
|
||||
std::wostream & pptx_xml_slide::Background()
|
||||
{
|
||||
return slideBackground_;
|
||||
return strmBackground_;
|
||||
}
|
||||
std::wostream & pptx_xml_slide::Timing()
|
||||
{
|
||||
return slideTiming_;
|
||||
return strmTiming_;
|
||||
}
|
||||
rels & pptx_xml_slide::Rels()
|
||||
{
|
||||
@ -100,14 +100,14 @@ void pptx_xml_slide::write_to(std::wostream & strm)
|
||||
{
|
||||
CP_XML_ATTR(L"name", name());
|
||||
|
||||
CP_XML_STREAM() << slideBackground_.str();
|
||||
CP_XML_STREAM() << strmBackground_.str();
|
||||
|
||||
CP_XML_NODE(L"p:spTree")
|
||||
{
|
||||
CP_XML_STREAM() << slideData_.str();
|
||||
CP_XML_STREAM() << strmData_.str();
|
||||
}
|
||||
}
|
||||
CP_XML_STREAM() << slideTiming_.str();
|
||||
CP_XML_STREAM() << strmTiming_.str();
|
||||
CP_XML_NODE(L"p:clrMapOvr")
|
||||
{
|
||||
CP_XML_NODE(L"a:masterClrMapping");
|
||||
@ -115,7 +115,7 @@ void pptx_xml_slide::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
std::wstring pptx_xml_slideLayout::rId() const
|
||||
{
|
||||
return rId_;
|
||||
@ -123,7 +123,7 @@ std::wstring pptx_xml_slideLayout::rId() const
|
||||
|
||||
pptx_xml_slideLayout_ptr pptx_xml_slideLayout::create(int id)
|
||||
{
|
||||
const std::wstring rId = std::wstring(L"lrId") + boost::lexical_cast<std::wstring>(id);
|
||||
const std::wstring rId = std::wstring(L"lrId") + std::to_wstring(id);
|
||||
return boost::make_shared<pptx_xml_slideLayout>(rId);
|
||||
}
|
||||
|
||||
@ -137,7 +137,7 @@ pptx_xml_slideLayout::~pptx_xml_slideLayout()
|
||||
}
|
||||
std::wostream & pptx_xml_slideLayout::Data()
|
||||
{
|
||||
return slideLayoutData_;
|
||||
return strmData_;
|
||||
}
|
||||
rels & pptx_xml_slideLayout::Rels()
|
||||
{
|
||||
@ -166,7 +166,7 @@ void pptx_xml_slideLayout::write_to(std::wostream & strm)
|
||||
{
|
||||
CP_XML_NODE(L"p:spTree")
|
||||
{
|
||||
CP_XML_STREAM() << slideLayoutData_.str();
|
||||
CP_XML_STREAM() << strmData_.str();
|
||||
|
||||
//в slideLayoutData_
|
||||
//contentPart (Content Part) §19.3.1.14
|
||||
@ -189,7 +189,7 @@ void pptx_xml_slideLayout::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
std::wstring pptx_xml_slideMaster::rId() const
|
||||
{
|
||||
return rId_;
|
||||
@ -197,7 +197,7 @@ std::wstring pptx_xml_slideMaster::rId() const
|
||||
|
||||
pptx_xml_slideMaster_ptr pptx_xml_slideMaster::create(int id)
|
||||
{
|
||||
const std::wstring rId = std::wstring(L"smId") + boost::lexical_cast<std::wstring>(id);
|
||||
const std::wstring rId = std::wstring(L"smId") + std::to_wstring(id);
|
||||
return boost::make_shared<pptx_xml_slideMaster>(rId,id);
|
||||
}
|
||||
|
||||
@ -212,15 +212,19 @@ pptx_xml_slideMaster::~pptx_xml_slideMaster()
|
||||
}
|
||||
std::wostream & pptx_xml_slideMaster::Data()
|
||||
{
|
||||
return slideMasterData_;
|
||||
return strmData_;
|
||||
}
|
||||
std::wostream & pptx_xml_slideMaster::DataExtra()
|
||||
{
|
||||
return slideMasterDataExtra_;
|
||||
return strmDataExtra_;
|
||||
}
|
||||
std::wostream & pptx_xml_slideMaster::Background()
|
||||
{
|
||||
return slideMasterBackground_;
|
||||
return strmBackground_;
|
||||
}
|
||||
std::wstringstream & pptx_xml_slideMaster::Sizes()
|
||||
{
|
||||
return strmSizes_;
|
||||
}
|
||||
rels & pptx_xml_slideMaster::Rels()
|
||||
{
|
||||
@ -229,7 +233,7 @@ rels & pptx_xml_slideMaster::Rels()
|
||||
void pptx_xml_slideMaster::add_theme(int id, const std::wstring & tId)
|
||||
{
|
||||
rels_.add(relationship( tId, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
|
||||
std::wstring(L"../theme/theme") + boost::lexical_cast<std::wstring>(id) + L".xml"));
|
||||
std::wstring(L"../theme/theme") + std::to_wstring(id) + L".xml"));
|
||||
}
|
||||
|
||||
void pptx_xml_slideMaster::add_layout(int id, const std::wstring & rId, const unsigned int & uniqId)
|
||||
@ -237,7 +241,7 @@ void pptx_xml_slideMaster::add_layout(int id, const std::wstring & rId, const un
|
||||
layoutsId_.push_back(std::pair<std::wstring, unsigned int>(rId, uniqId));
|
||||
|
||||
rels_.add(relationship( rId,L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout",
|
||||
std::wstring(L"../slideLayouts/slideLayout") + boost::lexical_cast<std::wstring>(id) + L".xml"));
|
||||
std::wstring(L"../slideLayouts/slideLayout") + std::to_wstring(id) + L".xml"));
|
||||
}
|
||||
|
||||
void pptx_xml_slideMaster::write_to(std::wostream & strm)
|
||||
@ -255,11 +259,11 @@ void pptx_xml_slideMaster::write_to(std::wostream & strm)
|
||||
|
||||
CP_XML_NODE(L"p:cSld")
|
||||
{
|
||||
CP_XML_STREAM() << slideMasterBackground_.str();
|
||||
CP_XML_STREAM() << strmBackground_.str();
|
||||
|
||||
CP_XML_NODE(L"p:spTree")
|
||||
{
|
||||
CP_XML_STREAM() << slideMasterData_.str();
|
||||
CP_XML_STREAM() << strmData_.str();
|
||||
}
|
||||
}
|
||||
CP_XML_NODE(L"p:clrMap")
|
||||
@ -288,7 +292,7 @@ void pptx_xml_slideMaster::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
}
|
||||
CP_XML_STREAM() << slideMasterDataExtra_.str();
|
||||
CP_XML_STREAM() << strmDataExtra_.str();
|
||||
CP_XML_NODE(L"p:txStyles")
|
||||
{
|
||||
CP_XML_NODE(L"p:titleStyle");
|
||||
@ -299,6 +303,7 @@ void pptx_xml_slideMaster::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
pptx_xml_theme_ptr pptx_xml_theme::create(std::wstring const & name,int id)
|
||||
{
|
||||
return boost::make_shared<pptx_xml_theme>(name,id);
|
||||
@ -336,6 +341,7 @@ void pptx_xml_theme::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
pptx_xml_authors_comments_ptr pptx_xml_authors_comments::create()
|
||||
{
|
||||
return boost::make_shared<pptx_xml_authors_comments>();
|
||||
@ -399,6 +405,7 @@ void pptx_xml_authors_comments::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
void pptx_xml_presentation::write_to(std::wostream & strm)
|
||||
{
|
||||
CP_XML_WRITER(strm)
|
||||
@ -412,14 +419,18 @@ void pptx_xml_presentation::write_to(std::wostream & strm)
|
||||
CP_XML_NODE(L"p:sldMasterIdLst")
|
||||
{
|
||||
CP_XML_STREAM() << slideMastersData_.str();
|
||||
}
|
||||
}
|
||||
CP_XML_NODE(L"p:notesMasterIdLst")
|
||||
{
|
||||
CP_XML_STREAM() << slideNotesMastersData_.str();
|
||||
}
|
||||
CP_XML_NODE(L"p:sldIdLst")
|
||||
{
|
||||
CP_XML_STREAM() << slidesData_.str();
|
||||
}
|
||||
CP_XML_STREAM() << slidesProperties_.str();
|
||||
|
||||
CP_XML_STREAM() << notesSlidesSize_.str();
|
||||
CP_XML_STREAM() << slidesNotesProperties_.str();
|
||||
|
||||
CP_XML_NODE(L"p:defaultTextStyle")//??
|
||||
{
|
||||
@ -428,5 +439,155 @@ void pptx_xml_presentation::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
std::wstring pptx_xml_slideNotes::rId() const
|
||||
{
|
||||
return rId_;
|
||||
}
|
||||
|
||||
pptx_xml_slideNotes_ptr pptx_xml_slideNotes::create(int id)
|
||||
{
|
||||
const std::wstring rId = std::wstring(L"nId") + std::to_wstring(id);
|
||||
return boost::make_shared<pptx_xml_slideNotes>(rId);
|
||||
}
|
||||
|
||||
pptx_xml_slideNotes::pptx_xml_slideNotes(std::wstring const & id)
|
||||
{
|
||||
rId_ = id;
|
||||
}
|
||||
|
||||
pptx_xml_slideNotes::~pptx_xml_slideNotes()
|
||||
{
|
||||
}
|
||||
std::wostream & pptx_xml_slideNotes::Data()
|
||||
{
|
||||
return strmData_;
|
||||
}
|
||||
std::wostream & pptx_xml_slideNotes::Background()
|
||||
{
|
||||
return strmBackground_;
|
||||
}
|
||||
|
||||
rels & pptx_xml_slideNotes::Rels()
|
||||
{
|
||||
return rels_;
|
||||
}
|
||||
|
||||
void pptx_xml_slideNotes::write_to(std::wostream & strm)
|
||||
{
|
||||
CP_XML_WRITER(strm)
|
||||
{
|
||||
CP_XML_NODE(L"p:notes")
|
||||
{
|
||||
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
|
||||
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
|
||||
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
|
||||
CP_XML_ATTR(L"xmlns:p14", L"http://schemas.microsoft.com/office/powerpoint/2010/main");
|
||||
CP_XML_ATTR(L"xmlns:p15", L"http://schemas.microsoft.com/office/powerpoint/2012/main");
|
||||
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
|
||||
|
||||
CP_XML_NODE(L"p:cSld")
|
||||
{
|
||||
CP_XML_STREAM() << strmBackground_.str();
|
||||
|
||||
CP_XML_NODE(L"p:spTree")
|
||||
{
|
||||
CP_XML_STREAM() << strmData_.str();
|
||||
}
|
||||
}
|
||||
CP_XML_NODE(L"p:clrMapOvr")
|
||||
{
|
||||
CP_XML_NODE(L"a:masterClrMapping");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
std::wstring pptx_xml_slideNotesMaster::rId() const
|
||||
{
|
||||
return rId_;
|
||||
}
|
||||
|
||||
pptx_xml_slideNotesMaster_ptr pptx_xml_slideNotesMaster::create()
|
||||
{
|
||||
const std::wstring rId = std::wstring(L"nmId1");
|
||||
return boost::make_shared<pptx_xml_slideNotesMaster>(rId, 1);
|
||||
}
|
||||
|
||||
pptx_xml_slideNotesMaster::pptx_xml_slideNotesMaster(std::wstring const & rId, int id)
|
||||
{
|
||||
rId_ = rId;
|
||||
id_ = id;
|
||||
}
|
||||
|
||||
pptx_xml_slideNotesMaster::~pptx_xml_slideNotesMaster()
|
||||
{
|
||||
}
|
||||
std::wostream & pptx_xml_slideNotesMaster::Data()
|
||||
{
|
||||
return strmData_;
|
||||
}
|
||||
std::wostream & pptx_xml_slideNotesMaster::Background()
|
||||
{
|
||||
return strmBackground_;
|
||||
}
|
||||
std::wostream & pptx_xml_slideNotesMaster::Sizes()
|
||||
{
|
||||
return strmSizes_;
|
||||
}
|
||||
rels & pptx_xml_slideNotesMaster::Rels()
|
||||
{
|
||||
return rels_;
|
||||
}
|
||||
void pptx_xml_slideNotesMaster::add_theme(int id, const std::wstring & tId)
|
||||
{
|
||||
rels_.add(relationship( tId, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
|
||||
std::wstring(L"../theme/theme") + std::to_wstring(id) + L".xml"));
|
||||
}
|
||||
|
||||
void pptx_xml_slideNotesMaster::write_to(std::wostream & strm)
|
||||
{
|
||||
CP_XML_WRITER(strm)
|
||||
{
|
||||
CP_XML_NODE(L"p:notesMaster")
|
||||
{
|
||||
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
|
||||
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
|
||||
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
|
||||
CP_XML_ATTR(L"xmlns:p14", L"http://schemas.microsoft.com/office/powerpoint/2010/main");
|
||||
CP_XML_ATTR(L"xmlns:p15", L"http://schemas.microsoft.com/office/powerpoint/2012/main");
|
||||
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
|
||||
|
||||
CP_XML_NODE(L"p:cSld")
|
||||
{
|
||||
CP_XML_STREAM() << strmBackground_.str();
|
||||
|
||||
CP_XML_NODE(L"p:spTree")
|
||||
{
|
||||
CP_XML_STREAM() << strmData_.str();
|
||||
}
|
||||
}
|
||||
CP_XML_NODE(L"p:clrMap")
|
||||
{
|
||||
CP_XML_ATTR(L"folHlink",L"folHlink");
|
||||
CP_XML_ATTR(L"hlink",L"hlink");
|
||||
CP_XML_ATTR(L"accent6",L"accent6");
|
||||
CP_XML_ATTR(L"accent5",L"accent5");
|
||||
CP_XML_ATTR(L"accent4",L"accent4");
|
||||
CP_XML_ATTR(L"accent3",L"accent5");
|
||||
CP_XML_ATTR(L"accent2",L"accent2");
|
||||
CP_XML_ATTR(L"accent1",L"accent1");
|
||||
CP_XML_ATTR(L"tx2",L"dk2");
|
||||
CP_XML_ATTR(L"tx1",L"dk1");
|
||||
CP_XML_ATTR(L"bg2",L"lt2");
|
||||
CP_XML_ATTR(L"bg1",L"lt1");
|
||||
}
|
||||
CP_XML_NODE(L"p:notesStyle")
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
}
|
||||
}
|
||||
|
||||
@ -49,7 +49,7 @@ class pptx_xml_slide: noncopyable
|
||||
public:
|
||||
pptx_xml_slide(std::wstring const & name,std::wstring const & id);
|
||||
~pptx_xml_slide();
|
||||
public:
|
||||
|
||||
std::wstring name() const;
|
||||
std::wstring rId() const;
|
||||
|
||||
@ -65,41 +65,68 @@ public:
|
||||
|
||||
private:
|
||||
std::wstring name_;
|
||||
std::wstringstream slideData_;
|
||||
std::wstringstream slideBackground_;
|
||||
std::wstringstream slideTiming_;
|
||||
std::wstringstream strmData_;
|
||||
std::wstringstream strmBackground_;
|
||||
std::wstringstream strmTiming_;
|
||||
std::wstring rId_;
|
||||
|
||||
rels rels_;
|
||||
};
|
||||
////////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------------
|
||||
class pptx_xml_slideNotes;
|
||||
typedef _CP_PTR(pptx_xml_slideNotes) pptx_xml_slideNotes_ptr;
|
||||
|
||||
class pptx_xml_slideNotes: noncopyable
|
||||
{
|
||||
public:
|
||||
pptx_xml_slideNotes(std::wstring const & id);
|
||||
~pptx_xml_slideNotes();
|
||||
|
||||
std::wstring rId() const;
|
||||
|
||||
std::wostream & Data();
|
||||
std::wostream & Background();
|
||||
|
||||
rels & Rels();
|
||||
|
||||
void write_to(std::wostream & strm);
|
||||
|
||||
static pptx_xml_slideNotes_ptr create(int id);
|
||||
|
||||
private:
|
||||
std::wstringstream strmData_;
|
||||
std::wstringstream strmBackground_;
|
||||
std::wstring rId_;
|
||||
|
||||
rels rels_;
|
||||
};
|
||||
//------------------------------------------------------------------------------------
|
||||
class pptx_xml_presentation: noncopyable
|
||||
{
|
||||
public:
|
||||
pptx_xml_presentation(){}
|
||||
~pptx_xml_presentation(){}
|
||||
|
||||
std::wstringstream & slidesData(){return slidesData_;}
|
||||
std::wstringstream & slideMastersData(){return slideMastersData_;}
|
||||
std::wstringstream & notesSlidesData(){return notesSlidesData_;}
|
||||
std::wstringstream & slidesData() {return slidesData_;}
|
||||
std::wstringstream & slideMastersData() {return slideMastersData_;}
|
||||
std::wstringstream & slideNotesMastersData() {return slideNotesMastersData_;}
|
||||
|
||||
std::wstringstream & slidesProperties(){return slidesProperties_;}
|
||||
std::wstringstream & notesSlidesSize(){return notesSlidesSize_;}
|
||||
std::wstringstream & slidesProperties() {return slidesProperties_;}
|
||||
std::wstringstream & slidesNotesProperties() {return slidesNotesProperties_;}
|
||||
|
||||
void write_to(std::wostream & strm);
|
||||
|
||||
private:
|
||||
std::wstringstream slidesProperties_;
|
||||
std::wstringstream notesSlidesSize_;
|
||||
|
||||
std::wstringstream slidesNotesProperties_;
|
||||
|
||||
std::wstringstream slidesData_;
|
||||
std::wstringstream slideMastersData_;
|
||||
std::wstringstream notesSlidesData_;
|
||||
std::wstringstream handoutMasterData_;
|
||||
std::wstringstream slideNotesMastersData_;
|
||||
std::wstringstream slideHandoutMasterData_;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------------
|
||||
class pptx_xml_slideLayout;
|
||||
typedef _CP_PTR(pptx_xml_slideLayout) pptx_xml_slideLayout_ptr;
|
||||
|
||||
@ -121,12 +148,12 @@ public:
|
||||
static pptx_xml_slideLayout_ptr create(int id);
|
||||
|
||||
private:
|
||||
std::wstringstream slideLayoutData_;
|
||||
std::wstringstream strmData_;
|
||||
std::wstring rId_;
|
||||
|
||||
rels rels_;
|
||||
};
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------------
|
||||
class pptx_xml_slideMaster;
|
||||
typedef _CP_PTR(pptx_xml_slideMaster) pptx_xml_slideMaster_ptr;
|
||||
|
||||
@ -135,12 +162,13 @@ class pptx_xml_slideMaster: noncopyable
|
||||
public:
|
||||
pptx_xml_slideMaster(std::wstring const & rId, int id);
|
||||
~pptx_xml_slideMaster();
|
||||
public:
|
||||
|
||||
std::wstring rId() const;
|
||||
|
||||
std::wostream & Data();
|
||||
std::wostream & DataExtra();
|
||||
std::wostream & Background();
|
||||
std::wostream & Data();
|
||||
std::wostream & DataExtra();
|
||||
std::wostream & Background();
|
||||
std::wstringstream & Sizes();
|
||||
rels & Rels();
|
||||
|
||||
void add_layout(int id, const std::wstring & rId, const unsigned int & uniqId);
|
||||
@ -151,9 +179,10 @@ public:
|
||||
static pptx_xml_slideMaster_ptr create(int id);
|
||||
|
||||
private:
|
||||
std::wstringstream slideMasterData_;
|
||||
std::wstringstream slideMasterDataExtra_;
|
||||
std::wstringstream slideMasterBackground_;
|
||||
std::wstringstream strmData_;
|
||||
std::wstringstream strmDataExtra_;
|
||||
std::wstringstream strmBackground_;
|
||||
std::wstringstream strmSizes_;
|
||||
|
||||
std::vector<std::pair<std::wstring, unsigned int>> layoutsId_;
|
||||
std::wstring rId_;
|
||||
@ -163,7 +192,42 @@ private:
|
||||
|
||||
rels rels_;
|
||||
};
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------------
|
||||
class pptx_xml_slideNotesMaster;
|
||||
typedef _CP_PTR(pptx_xml_slideNotesMaster) pptx_xml_slideNotesMaster_ptr;
|
||||
|
||||
class pptx_xml_slideNotesMaster: noncopyable
|
||||
{
|
||||
public:
|
||||
pptx_xml_slideNotesMaster(std::wstring const & rId, int id);
|
||||
~pptx_xml_slideNotesMaster();
|
||||
|
||||
std::wstring rId() const;
|
||||
|
||||
std::wostream & Data();
|
||||
std::wostream & Background();
|
||||
std::wostream & Sizes();
|
||||
rels & Rels();
|
||||
|
||||
void add_theme(int id, const std::wstring & tId);
|
||||
|
||||
void write_to(std::wostream & strm);
|
||||
|
||||
static pptx_xml_slideNotesMaster_ptr create();
|
||||
|
||||
private:
|
||||
std::wstringstream strmData_;
|
||||
std::wstringstream strmBackground_;
|
||||
std::wstringstream strmSizes_;
|
||||
|
||||
std::wstring rId_;
|
||||
int id_;
|
||||
|
||||
std::wstring themeId_;
|
||||
|
||||
rels rels_;
|
||||
};
|
||||
//------------------------------------------------------------------------------------
|
||||
class pptx_xml_theme;
|
||||
typedef _CP_PTR(pptx_xml_theme) pptx_xml_theme_ptr;
|
||||
|
||||
@ -192,7 +256,7 @@ private:
|
||||
std::wstring name_;
|
||||
int id_;
|
||||
};
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------------
|
||||
class pptx_xml_authors_comments;
|
||||
typedef _CP_PTR(pptx_xml_authors_comments) pptx_xml_authors_comments_ptr;
|
||||
|
||||
|
||||
@ -105,10 +105,11 @@ void slide_content::add_rels(rels & _r)
|
||||
rels_->get_rels().add(r[i]);
|
||||
}
|
||||
}
|
||||
////////////
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
slides_files::slides_files()
|
||||
{}
|
||||
{
|
||||
rels_ = NULL;
|
||||
}
|
||||
|
||||
void slides_files::add_slide(slide_content_ptr slide)
|
||||
{
|
||||
@ -127,13 +128,13 @@ void slides_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
if (!slides_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"slide") + boost::lexical_cast<std::wstring>( i + 1 ) + L".xml";
|
||||
const std::wstring fileName = std::wstring(L"slide") + std::to_wstring( i + 1 ) + L".xml";
|
||||
|
||||
contentTypes->add_override(std::wstring(L"/ppt/slides/") + fileName, kWSConType);
|
||||
|
||||
if (rels_)
|
||||
{
|
||||
const std::wstring id = std::wstring(L"sId") + boost::lexical_cast<std::wstring>( i + 1);
|
||||
const std::wstring id = std::wstring(L"sId") + std::to_wstring( i + 1);
|
||||
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide";
|
||||
const std::wstring fileRef = std::wstring(L"slides/") + fileName;
|
||||
rels_->add(id, kWSRel, fileRef);
|
||||
@ -149,7 +150,42 @@ void slides_files::write(const std::wstring & RootPath)
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////
|
||||
//---------------------------------------------------------------------------
|
||||
void notes_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"notesSlides" ;
|
||||
NSDirectory::CreateDirectory(path.c_str());
|
||||
|
||||
content_type_content * contentTypes = this->get_main_document()->get_content_types_file().content();
|
||||
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml";
|
||||
|
||||
for (int i = 0; i < slides_.size(); i++)
|
||||
{
|
||||
if (!slides_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"notesSlide") + std::to_wstring( i + 1 ) + L".xml";
|
||||
|
||||
contentTypes->add_override(std::wstring(L"/ppt/notesSlides/") + fileName, kWSConType);
|
||||
|
||||
if (rels_)
|
||||
{
|
||||
const std::wstring id = std::wstring(L"nId") + std::to_wstring( i + 1);
|
||||
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide";
|
||||
const std::wstring fileRef = std::wstring(L"notesSlides/") + fileName;
|
||||
rels_->add(id, kWSRel, fileRef);
|
||||
}
|
||||
|
||||
slides_[i]->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
|
||||
|
||||
rels_files relFiles;
|
||||
relFiles.add_rel_file(slides_[i]->get_rel_file());
|
||||
relFiles.write(path);
|
||||
|
||||
package::simple_element(fileName, slides_[i]->str()).write(path);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
slideMasters_files::slideMasters_files()
|
||||
{}
|
||||
|
||||
@ -170,12 +206,12 @@ void slideMasters_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
if (!slides_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"slideMaster") + boost::lexical_cast<std::wstring>( i + 1 ) + L".xml";
|
||||
const std::wstring fileName = std::wstring(L"slideMaster") + std::to_wstring( i + 1 ) + L".xml";
|
||||
contentTypes->add_override(std::wstring(L"/ppt/slideMasters/") + fileName, kWSConType);
|
||||
|
||||
if (rels_)
|
||||
{
|
||||
const std::wstring id = std::wstring(L"smId") + boost::lexical_cast<std::wstring>( i + 1);
|
||||
const std::wstring id = std::wstring(L"smId") + std::to_wstring( i + 1);
|
||||
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster";
|
||||
const std::wstring fileRef = std::wstring(L"slideMasters/") + fileName;
|
||||
rels_->add(id, kWSRel, fileRef);
|
||||
@ -191,7 +227,41 @@ void slideMasters_files::write(const std::wstring & RootPath)
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////
|
||||
//---------------------------------------------------------------------------
|
||||
void notesMaster_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"notesMasters" ;
|
||||
NSDirectory::CreateDirectory(path.c_str());
|
||||
|
||||
content_type_content * contentTypes = this->get_main_document()->get_content_types_file().content();
|
||||
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml";
|
||||
|
||||
for (int i = 0; i < slides_.size(); i++)
|
||||
{
|
||||
if (!slides_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"notesMaster") + std::to_wstring( i + 1 ) + L".xml";
|
||||
contentTypes->add_override(std::wstring(L"/ppt/notesMasters/") + fileName, kWSConType);
|
||||
|
||||
if (rels_)
|
||||
{
|
||||
const std::wstring id = std::wstring(L"nmId") + std::to_wstring( i + 1);
|
||||
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster";
|
||||
const std::wstring fileRef = std::wstring(L"notesMasters/") + fileName;
|
||||
rels_->add(id, kWSRel, fileRef);
|
||||
}
|
||||
|
||||
slides_[i]->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
|
||||
|
||||
rels_files relFiles;
|
||||
relFiles.add_rel_file(slides_[i]->get_rel_file());
|
||||
relFiles.write(path);
|
||||
|
||||
package::simple_element(fileName, slides_[i]->str()).write(path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
slideLayouts_files::slideLayouts_files()
|
||||
{}
|
||||
|
||||
@ -209,7 +279,7 @@ void slideLayouts_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
if (!slides_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"slideLayout") + boost::lexical_cast<std::wstring>( i + 1 ) + L".xml";
|
||||
const std::wstring fileName = std::wstring(L"slideLayout") + std::to_wstring( i + 1 ) + L".xml";
|
||||
const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml";
|
||||
|
||||
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
|
||||
@ -225,7 +295,7 @@ void slideLayouts_files::write(const std::wstring & RootPath)
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------------
|
||||
authors_comments_element::authors_comments_element(pptx_xml_authors_comments_ptr & authors_comments) : authors_comments_(authors_comments)
|
||||
{
|
||||
}
|
||||
@ -261,7 +331,7 @@ void ppt_charts_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
if (!charts_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"chart") + boost::lexical_cast<std::wstring>( i + 1 ) + L".xml";
|
||||
const std::wstring fileName = std::wstring(L"chart") + std::to_wstring( i + 1 ) + L".xml";
|
||||
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
|
||||
|
||||
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.drawingml.chart+xml";
|
||||
@ -291,7 +361,7 @@ void ppt_themes_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
if (!themes_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"theme") + boost::lexical_cast<std::wstring>( i + 1) + L".xml";
|
||||
const std::wstring fileName = std::wstring(L"theme") + std::to_wstring( i + 1) + L".xml";
|
||||
const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.theme+xml";
|
||||
|
||||
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
|
||||
@ -345,6 +415,12 @@ void ppt_files::write(const std::wstring & RootPath)
|
||||
slideMasters_files_.set_main_document( this->get_main_document() );
|
||||
slideMasters_files_.write(path);
|
||||
|
||||
notes_files_.set_main_document( this->get_main_document() );
|
||||
notes_files_.write(path);
|
||||
|
||||
notesMaster_files_.set_rels(&rels_files_);
|
||||
notesMaster_files_.set_main_document( this->get_main_document() );
|
||||
notesMaster_files_.write(path);
|
||||
|
||||
//rels_files_.add( relationship( L"hId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", L"ppt/presentation.xml" ) );
|
||||
|
||||
@ -412,6 +488,10 @@ void ppt_files::add_slide(slide_content_ptr slide)
|
||||
{
|
||||
slides_files_.add_slide(slide);
|
||||
}
|
||||
void ppt_files::add_notes(slide_content_ptr slide)
|
||||
{
|
||||
notes_files_.add_slide(slide);
|
||||
}
|
||||
void ppt_files::add_slideLayout(slide_content_ptr slide)
|
||||
{
|
||||
slideLayouts_files_.add_slide(slide);
|
||||
@ -420,7 +500,10 @@ void ppt_files::add_slideMaster(slide_content_ptr slide)
|
||||
{
|
||||
slideMasters_files_.add_slide(slide);
|
||||
}
|
||||
|
||||
void ppt_files::add_notesMaster(slide_content_ptr slide)
|
||||
{
|
||||
notesMaster_files_.add_slide(slide);
|
||||
}
|
||||
void ppt_files::set_media(mediaitems & _Mediaitems, CApplicationFonts *pAppFonts)
|
||||
{
|
||||
if (_Mediaitems.count_image + _Mediaitems.count_media > 0)
|
||||
|
||||
@ -41,8 +41,10 @@ namespace cpdoccore {
|
||||
namespace oox {
|
||||
|
||||
class pptx_xml_presentation;
|
||||
|
||||
class pptx_xml_theme;
|
||||
typedef _CP_PTR(pptx_xml_theme) pptx_xml_theme_ptr;
|
||||
|
||||
class pptx_xml_authors_comments;
|
||||
typedef _CP_PTR(pptx_xml_authors_comments) pptx_xml_authors_comments_ptr;
|
||||
|
||||
@ -55,7 +57,7 @@ public:
|
||||
};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------
|
||||
class slide_content;
|
||||
typedef _CP_PTR(slide_content) slide_content_ptr;
|
||||
|
||||
@ -72,11 +74,10 @@ public:
|
||||
static _CP_PTR(slide_content) create();
|
||||
|
||||
private:
|
||||
std::wstringstream content_;
|
||||
rels_file_ptr rels_;
|
||||
std::wstringstream content_;
|
||||
rels_file_ptr rels_;
|
||||
};
|
||||
|
||||
// slides_files
|
||||
//------------------------------------------------------------------------------
|
||||
class slides_files : public element
|
||||
{
|
||||
public:
|
||||
@ -92,12 +93,18 @@ public:
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
void set_slide_ref(const std::wstring & ref_file_path,const std::wstring & ref_file_name);
|
||||
|
||||
public:
|
||||
std::vector<slide_content_ptr> slides_;
|
||||
rels_files * rels_;
|
||||
|
||||
};
|
||||
// slideLayouts_files
|
||||
//------------------------------------------------------------------------------
|
||||
class notes_files : public slides_files
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
};
|
||||
//------------------------------------------------------------------------------
|
||||
class slideLayouts_files : public element
|
||||
{
|
||||
public:
|
||||
@ -107,12 +114,9 @@ public:
|
||||
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
|
||||
public:
|
||||
std::vector<slide_content_ptr> slides_;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
class authors_comments_element : public element
|
||||
{
|
||||
public:
|
||||
@ -123,9 +127,7 @@ private:
|
||||
pptx_xml_authors_comments_ptr & authors_comments_;
|
||||
|
||||
};
|
||||
/////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// slideMasters_files
|
||||
//------------------------------------------------------------------------------
|
||||
class slideMasters_files : public element
|
||||
{
|
||||
public:
|
||||
@ -140,16 +142,19 @@ public:
|
||||
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
|
||||
public:
|
||||
std::vector<slide_content_ptr> slides_;
|
||||
rels_files * rels_;
|
||||
};
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
class notesMaster_files : public slideMasters_files
|
||||
{
|
||||
public:
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
};
|
||||
//------------------------------------------------------------------------------
|
||||
class ppt_comments_files;
|
||||
typedef _CP_PTR(ppt_comments_files) ppt_comments_files_ptr;
|
||||
|
||||
// ppt_comments
|
||||
class ppt_comments_files: public element
|
||||
{
|
||||
public:
|
||||
@ -165,9 +170,7 @@ private:
|
||||
const std::vector<pptx_comment_elm> & comments_;
|
||||
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// ppt_charts_files
|
||||
//------------------------------------------------------------------------------
|
||||
class ppt_charts_files : public element
|
||||
{
|
||||
public:
|
||||
@ -179,8 +182,8 @@ public:
|
||||
std::vector<chart_content_ptr> charts_;
|
||||
|
||||
};
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// ppt_theme_files
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
class ppt_themes_files : public element
|
||||
{
|
||||
public:
|
||||
@ -192,13 +195,12 @@ public:
|
||||
std::vector<pptx_xml_theme_ptr> themes_;
|
||||
|
||||
};
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//------------------------------------------------------------------------------
|
||||
class ppt_files : public element
|
||||
{
|
||||
public:
|
||||
ppt_files();
|
||||
|
||||
public:
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
|
||||
void set_presentation(pptx_xml_presentation & presentation);
|
||||
@ -206,9 +208,11 @@ public:
|
||||
void set_styles(element_ptr Element);
|
||||
void set_comments(element_ptr Element);
|
||||
|
||||
void add_slide(slide_content_ptr sheet);
|
||||
void add_slide (slide_content_ptr sheet);
|
||||
void add_slideLayout(slide_content_ptr sheet);
|
||||
void add_slideMaster(slide_content_ptr sheet);
|
||||
void add_notes (slide_content_ptr sheet);
|
||||
void add_notesMaster(slide_content_ptr sheet);
|
||||
|
||||
void set_media(mediaitems & _Mediaitems, CApplicationFonts *pAppFonts);
|
||||
void add_charts(chart_content_ptr chart);
|
||||
@ -217,25 +221,21 @@ public:
|
||||
void set_authors_comments(pptx_xml_authors_comments_ptr & authors_comments);
|
||||
|
||||
private:
|
||||
rels_files rels_files_;
|
||||
rels_files rels_files_;
|
||||
|
||||
slides_files slides_files_;
|
||||
slideLayouts_files slideLayouts_files_;
|
||||
slideMasters_files slideMasters_files_;
|
||||
slides_files slides_files_;
|
||||
slideLayouts_files slideLayouts_files_;
|
||||
slideMasters_files slideMasters_files_;
|
||||
notes_files notes_files_;
|
||||
notesMaster_files notesMaster_files_;
|
||||
|
||||
//slides_files handoutMasters_files_;
|
||||
ppt_themes_files themes_files_;
|
||||
|
||||
ppt_charts_files charts_files_;
|
||||
//slides_files notesSlides_files_;
|
||||
//slides_files notesMasters_files_;
|
||||
//slides_files handoutMasters_files_;
|
||||
|
||||
element_ptr authors_comments_;
|
||||
|
||||
element_ptr authors_comments_;
|
||||
element_ptr presentation_;
|
||||
|
||||
element_ptr tableStyles_;
|
||||
|
||||
element_ptr comments_;
|
||||
element_ptr media_;
|
||||
element_ptr embeddings_;
|
||||
@ -247,7 +247,6 @@ class pptx_document : public document
|
||||
public:
|
||||
pptx_document();
|
||||
|
||||
public:
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
|
||||
virtual content_types_file & get_content_types_file() { return content_type_file_; }
|
||||
|
||||
@ -53,7 +53,6 @@ typedef _CP_PTR(pptx_drawings) pptx_drawings_ptr;
|
||||
class pptx_slide_context::Impl
|
||||
{
|
||||
public:
|
||||
|
||||
struct _transition
|
||||
{
|
||||
bool Enabled;
|
||||
@ -66,7 +65,7 @@ public:
|
||||
bool onClick;
|
||||
};
|
||||
|
||||
Impl(const std::wstring & odfPacket) : mediaitems_(odfPacket),odfPacket_(odfPacket)
|
||||
Impl(const std::wstring & odfPacket) : mediaitems_(odfPacket), odfPacket_(odfPacket)
|
||||
{
|
||||
clear();
|
||||
}
|
||||
@ -75,24 +74,17 @@ public:
|
||||
std::vector<drawing_object_description> objects_;
|
||||
|
||||
_CP_OPT(_oox_fill) background_fill_;
|
||||
|
||||
_transition transition_;
|
||||
bool use_image_replacement_;
|
||||
|
||||
bool header, footer, date_time, slideNum;
|
||||
|
||||
void add_drawing(_pptx_drawing const & d,
|
||||
bool isInternal,
|
||||
std::wstring const & rid,
|
||||
std::wstring const & ref,
|
||||
RelsType type)
|
||||
void add_drawing(_pptx_drawing const & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type)
|
||||
{
|
||||
pptx_drawings_->add(d, isInternal, rid, ref, type);
|
||||
}
|
||||
void add_additional_rels(
|
||||
bool isInternal,
|
||||
std::wstring const & rid,
|
||||
std::wstring const & ref,
|
||||
RelsType type)
|
||||
void add_additional_rels (bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type)
|
||||
{
|
||||
pptx_drawings_->add(isInternal, rid, ref, type);
|
||||
}
|
||||
@ -107,16 +99,16 @@ public:
|
||||
{
|
||||
objects_.clear();
|
||||
|
||||
background_fill_ = boost::none;
|
||||
background_fill_ = boost::none;
|
||||
|
||||
header=false;
|
||||
footer=false;
|
||||
date_time=false;
|
||||
slideNum=false;
|
||||
header = false;
|
||||
footer = false;
|
||||
date_time = false;
|
||||
slideNum = false;
|
||||
|
||||
rId_ = 1;
|
||||
|
||||
pptx_drawings_ = pptx_drawings::create();
|
||||
pptx_drawings_ = pptx_drawings::create();
|
||||
|
||||
transition_.Enabled = false;
|
||||
transition_.Speed = boost::none;
|
||||
@ -127,7 +119,6 @@ public:
|
||||
{
|
||||
return rId_++;;
|
||||
}
|
||||
|
||||
pptx_drawings_ptr get_drawings()
|
||||
{
|
||||
return pptx_drawings_;
|
||||
@ -137,7 +128,7 @@ public:
|
||||
void process_drawings();
|
||||
|
||||
private:
|
||||
void process_common_properties(drawing_object_description& obj,_pptx_drawing & drawing);
|
||||
void process_common_properties(drawing_object_description& obj, _pptx_drawing & drawing);
|
||||
|
||||
void process_shape (drawing_object_description& obj, _pptx_drawing & drawing);
|
||||
void process_image (drawing_object_description& obj, _pptx_drawing & drawing);
|
||||
@ -145,14 +136,15 @@ private:
|
||||
void process_table (drawing_object_description& obj, _pptx_drawing & drawing);
|
||||
void process_object (drawing_object_description& obj, _pptx_drawing & drawing);
|
||||
|
||||
size_t rId_;
|
||||
mediaitems mediaitems_;
|
||||
pptx_drawings_ptr pptx_drawings_;
|
||||
size_t rId_;
|
||||
mediaitems mediaitems_;
|
||||
pptx_drawings_ptr pptx_drawings_;
|
||||
pptx_drawings_ptr pptx_notes_drawings_;
|
||||
};
|
||||
|
||||
void pptx_slide_context::Impl::process_drawings()
|
||||
{
|
||||
for (int i = 0; i < objects_.size(); i++)
|
||||
for (size_t i = 0; i < objects_.size(); i++)
|
||||
{
|
||||
_pptx_drawing drawing =_pptx_drawing();
|
||||
|
||||
@ -175,17 +167,19 @@ void pptx_slide_context::Impl::process_drawings()
|
||||
}
|
||||
|
||||
pptx_slide_context::pptx_slide_context(pptx_conversion_context & Context)
|
||||
: impl_(new pptx_slide_context::Impl(Context.root()->get_folder()))
|
||||
: impl_(new pptx_slide_context::Impl(Context.root()->get_folder()))
|
||||
{
|
||||
hlinks_size_ = 0;
|
||||
hlinks_size_ = 0;
|
||||
}
|
||||
void pptx_slide_context::start_slide()
|
||||
{
|
||||
impl_->clear(); // objects
|
||||
hlinks_size_ = 0;
|
||||
|
||||
hlinks_size_ = 0;
|
||||
|
||||
default_set(); //for current object
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void pptx_slide_context::start_slide_animation()
|
||||
{
|
||||
@ -202,10 +196,10 @@ void pptx_slide_context::start_slide_animation()
|
||||
|
||||
void pptx_slide_context::set_transitionFilter(std::wstring & type,_CP_OPT(std::wstring) & dir,_CP_OPT(std::wstring) & dop,_CP_OPT(int) & time)
|
||||
{
|
||||
impl_->transition_.Type = type;
|
||||
impl_->transition_.Time = time; // не путать длительность перехода с длительностью эффекта перехода (в oo его нет)
|
||||
impl_->transition_.Dir = dir;
|
||||
impl_->transition_.Param = dop;
|
||||
impl_->transition_.Type = type;
|
||||
impl_->transition_.Time = time; // не путать длительность перехода с длительностью эффекта перехода (в oo его нет)
|
||||
impl_->transition_.Dir = dir;
|
||||
impl_->transition_.Param = dop;
|
||||
}
|
||||
|
||||
void pptx_slide_context::set_transitionAction(bool val)
|
||||
@ -215,8 +209,8 @@ void pptx_slide_context::set_transitionAction(bool val)
|
||||
|
||||
void pptx_slide_context::set_transitionSpeed(std::wstring val)
|
||||
{
|
||||
if (val == L"medium")impl_->transition_.Speed=L"med";
|
||||
else impl_->transition_.Speed= val;//fast / slow
|
||||
if (val == L"medium") impl_->transition_.Speed = L"med";
|
||||
else impl_->transition_.Speed = val;//fast / slow
|
||||
}
|
||||
|
||||
|
||||
@ -227,6 +221,7 @@ void pptx_slide_context::default_set()
|
||||
impl_->object_description_.name_ = L"";
|
||||
impl_->object_description_.descriptor_ = L"";
|
||||
impl_->object_description_.anchor_ = L"";
|
||||
|
||||
impl_->object_description_.additional_.clear();
|
||||
|
||||
impl_->object_description_.clipping_string_= L"";
|
||||
@ -247,10 +242,10 @@ void pptx_slide_context::set_use_image_replacement()
|
||||
|
||||
void pptx_slide_context::set_placeHolder_type(std::wstring typeHolder)
|
||||
{
|
||||
if (typeHolder == L"ftr") impl_->footer= true;
|
||||
if (typeHolder == L"hdr") impl_->header= true;
|
||||
if (typeHolder == L"dt") impl_->date_time= true;
|
||||
if (typeHolder == L"sldNum")impl_->slideNum= true;
|
||||
if (typeHolder == L"ftr") impl_->footer = true;
|
||||
if (typeHolder == L"hdr") impl_->header = true;
|
||||
if (typeHolder == L"dt") impl_->date_time = true;
|
||||
if (typeHolder == L"sldNum")impl_->slideNum = true;
|
||||
|
||||
impl_->object_description_.additional_.push_back(odf_reader::_property(L"PlaceHolderType",typeHolder));
|
||||
}
|
||||
@ -445,7 +440,7 @@ void pptx_slide_context::process_drawings()
|
||||
return impl_->process_drawings();
|
||||
}
|
||||
|
||||
void pptx_slide_context::Impl::process_image(drawing_object_description& pic, _pptx_drawing & drawing)
|
||||
void pptx_slide_context::Impl::process_image(drawing_object_description& obj, _pptx_drawing & drawing)
|
||||
{
|
||||
int pos_replaicement = 0, pos_preview = 0;
|
||||
|
||||
@ -453,22 +448,22 @@ void pptx_slide_context::Impl::process_image(drawing_object_description& pic, _p
|
||||
drawing.fill.type = 2;
|
||||
|
||||
_CP_OPT(std::wstring) sTextContent;
|
||||
GetProperty(pic.additional_, L"text-content", sTextContent);
|
||||
GetProperty(obj.additional_, L"text-content", sTextContent);
|
||||
if (sTextContent)//в ms office на картинке нельзя сделать надпись - меняем тип на рект с заливкой картинкой
|
||||
{
|
||||
drawing.type = typeShape;
|
||||
drawing.sub_type = 2;//rect
|
||||
}
|
||||
|
||||
std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + pic.xlink_href_;
|
||||
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(pic.clipping_string_,fileName,drawing.fill.bitmap->cropRect, NULL);
|
||||
std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + obj.xlink_href_;
|
||||
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, fileName, drawing.fill.bitmap->cropRect, NULL);
|
||||
drawing.fill.bitmap->bStretch = true;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
std::wstring ref;/// это ссылка на выходной внешний объект
|
||||
bool isMediaInternal = false;
|
||||
|
||||
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(pic.xlink_href_, typeImage, isMediaInternal, ref);
|
||||
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(obj.xlink_href_, typeImage, isMediaInternal, ref);
|
||||
|
||||
if (drawing.type == typeShape)
|
||||
{
|
||||
@ -476,11 +471,13 @@ void pptx_slide_context::Impl::process_image(drawing_object_description& pic, _p
|
||||
|
||||
isMediaInternal = true;
|
||||
std::wstring rId = get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
|
||||
|
||||
add_drawing(drawing, isMediaInternal, rId, ref, typeShape);//объект
|
||||
|
||||
}else if (!drawing.fill.bitmap->rId.empty())
|
||||
}
|
||||
else if (!drawing.fill.bitmap->rId.empty())
|
||||
{
|
||||
add_drawing(drawing, isMediaInternal, drawing.fill.bitmap->rId , ref, drawing.type);//объект
|
||||
add_drawing(drawing, isMediaInternal, drawing.fill.bitmap->rId, ref, drawing.type);//объект
|
||||
}
|
||||
}
|
||||
void pptx_slide_context::Impl::process_chart(drawing_object_description & obj, _pptx_drawing & drawing)
|
||||
@ -488,8 +485,9 @@ void pptx_slide_context::Impl::process_chart(drawing_object_description & obj, _
|
||||
std::wstring ref;
|
||||
bool isMediaInternal = true;
|
||||
|
||||
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
|
||||
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
|
||||
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
|
||||
|
||||
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
|
||||
}
|
||||
|
||||
void pptx_slide_context::Impl::process_table(drawing_object_description & obj, _pptx_drawing & drawing)
|
||||
@ -499,6 +497,7 @@ void pptx_slide_context::Impl::process_table(drawing_object_description & obj, _
|
||||
std::wstring rId = get_mediaitems().add_or_find(L"", obj.type_, isMediaInternal, ref);
|
||||
|
||||
add_drawing(drawing, isMediaInternal, rId, ref, drawing.type);
|
||||
|
||||
}
|
||||
|
||||
void pptx_slide_context::Impl::process_shape(drawing_object_description & obj, _pptx_drawing & drawing)
|
||||
@ -511,6 +510,7 @@ void pptx_slide_context::Impl::process_shape(drawing_object_description & obj, _
|
||||
if (drawing.fill.bitmap)
|
||||
{
|
||||
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
|
||||
|
||||
add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);
|
||||
}
|
||||
|
||||
@ -541,11 +541,12 @@ void pptx_slide_context::Impl::process_object(drawing_object_description& obj, _
|
||||
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
|
||||
drawing.objectProgId = obj.descriptor_;
|
||||
|
||||
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
|
||||
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
|
||||
|
||||
if (drawing.fill.bitmap)
|
||||
{
|
||||
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
|
||||
|
||||
add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);
|
||||
}
|
||||
}
|
||||
@ -575,7 +576,6 @@ void pptx_slide_context::Impl::process_common_properties(drawing_object_descript
|
||||
drawing.fill = pic.fill_;
|
||||
}
|
||||
|
||||
|
||||
void pptx_slide_context::dump_rels(rels & Rels)
|
||||
{
|
||||
impl_->get_drawings()->dump_rels(Rels);
|
||||
@ -590,6 +590,7 @@ void pptx_slide_context::add_rels( bool isInternal, std::wstring const & rid, st
|
||||
{
|
||||
impl_->add_additional_rels(isInternal, rid, ref, type);
|
||||
}
|
||||
|
||||
void pptx_slide_context::set_footer()
|
||||
{
|
||||
impl_->footer = true;
|
||||
@ -608,7 +609,7 @@ void pptx_slide_context::set_date_time()
|
||||
}
|
||||
void pptx_slide_context::serialize_background(std::wostream & strm, bool always)
|
||||
{
|
||||
if (!always && ( (!impl_->background_fill_) || (impl_->background_fill_->type==0))) return;
|
||||
if (!always && ( (!impl_->background_fill_) || (impl_->background_fill_->type == 0))) return;
|
||||
|
||||
CP_XML_WRITER(strm)
|
||||
{
|
||||
@ -618,7 +619,7 @@ void pptx_slide_context::serialize_background(std::wostream & strm, bool always)
|
||||
{
|
||||
if (impl_->background_fill_)
|
||||
{
|
||||
oox_serialize_fill(CP_XML_STREAM(),impl_->background_fill_.get());
|
||||
oox_serialize_fill(CP_XML_STREAM(), impl_->background_fill_.get());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -689,7 +690,6 @@ void pptx_slide_context::serialize_HeaderFooter(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void pptx_slide_context::serialize_objects(std::wostream & strm)
|
||||
{
|
||||
int next_id = impl_->next_rId();
|
||||
@ -701,8 +701,8 @@ void pptx_slide_context::serialize_objects(std::wostream & strm)
|
||||
{
|
||||
CP_XML_NODE(L"p:cNvPr")
|
||||
{
|
||||
CP_XML_ATTR(L"name",L"noGroup");
|
||||
CP_XML_ATTR(L"id",next_id);
|
||||
CP_XML_ATTR(L"name", L"noGroup");
|
||||
CP_XML_ATTR(L"id", next_id);
|
||||
}
|
||||
CP_XML_NODE(L"p:cNvGrpSpPr");
|
||||
CP_XML_NODE(L"p:nvPr");
|
||||
|
||||
@ -89,16 +89,19 @@ public:
|
||||
void end_table();
|
||||
|
||||
void start_shape(int type);
|
||||
void end_shape();
|
||||
void end_shape ();
|
||||
|
||||
void set_use_image_replacement();
|
||||
|
||||
bool empty() const;
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void serialize_objects(std::wostream & strm);
|
||||
void serialize_HeaderFooter(std::wostream & strm);
|
||||
void serialize_background(std::wostream & strm, bool always=false);
|
||||
void serialize_animations(std::wostream & strm);
|
||||
|
||||
void serialize_HeaderFooter (std::wostream & strm);
|
||||
void serialize_animations (std::wostream & strm);
|
||||
|
||||
void serialize_objects (std::wostream & strm);
|
||||
|
||||
void serialize_background (std::wostream & strm, bool always = false);
|
||||
|
||||
void dump_rels(rels & Rels);
|
||||
|
||||
@ -106,7 +109,7 @@ public:
|
||||
|
||||
mediaitems & get_mediaitems();
|
||||
|
||||
void add_background(_oox_fill & fill);
|
||||
void add_background (_oox_fill & fill);
|
||||
|
||||
void add_rels( bool isInternal,
|
||||
std::wstring const & rid,
|
||||
|
||||
@ -32,18 +32,14 @@
|
||||
|
||||
#include "anim_elements.h"
|
||||
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <cpdoccore/xml/xmlchar.h>
|
||||
|
||||
#include <cpdoccore/xml/attributes.h>
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "serialize_elements.h"
|
||||
#include "odfcontext.h"
|
||||
#include <cpdoccore/odf/odf_document.h>
|
||||
|
||||
|
||||
#include "draw_common.h"
|
||||
|
||||
#include <cpdoccore/xml/simple_xml_writer.h>
|
||||
@ -74,16 +70,16 @@ void anim_par::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
}
|
||||
///////////////////////// последовательности .. (если один элемент - основная последовательность, иное - взаимодействующая анимация)
|
||||
//slide_context().animation_context().start_sequence();
|
||||
BOOST_FOREACH(const office_element_ptr& elm, anim_seq_array_)
|
||||
for (size_t i = 0; i < anim_seq_array_.size(); i++)
|
||||
{
|
||||
elm->pptx_convert(Context);
|
||||
anim_seq_array_[i]->pptx_convert(Context);
|
||||
}
|
||||
//slide_context().animation_context().end_sequence();
|
||||
/////////////////////////////////////////////////////////////////
|
||||
//внутренние эффекты - те что внутри одной последовательности
|
||||
BOOST_FOREACH(const office_element_ptr& elm, content_)
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
elm->pptx_convert(Context);
|
||||
content_[i]->pptx_convert(Context);
|
||||
}
|
||||
}
|
||||
void anim_par::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
@ -106,9 +102,9 @@ void anim_seq::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
|
||||
void anim_seq::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
{
|
||||
BOOST_FOREACH(const office_element_ptr& elm, anim_par_array_)
|
||||
for (size_t i = 0; i < anim_par_array_.size(); i++)
|
||||
{
|
||||
elm->pptx_convert(Context);
|
||||
anim_par_array_[i]->pptx_convert(Context);
|
||||
}
|
||||
}
|
||||
void anim_seq::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
|
||||
@ -126,13 +126,15 @@ std::wstring presentation_class::get_type_ms()
|
||||
res = L"sldNum";
|
||||
break;
|
||||
case subtitle:
|
||||
case page:
|
||||
case notes:
|
||||
case handout:
|
||||
case outline:
|
||||
case text:
|
||||
res = L"body";
|
||||
break;
|
||||
case page:
|
||||
res = L"sldImg";
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -32,13 +32,9 @@
|
||||
|
||||
#include "draw_page.h"
|
||||
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <cpdoccore/xml/xmlchar.h>
|
||||
|
||||
#include <cpdoccore/xml/attributes.h>
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "serialize_elements.h"
|
||||
#include "odfcontext.h"
|
||||
#include <cpdoccore/odf/odf_document.h>
|
||||
@ -78,13 +74,15 @@ void draw_page::add_child_element( xml::sax * Reader, const std::wstring & Ns, c
|
||||
{
|
||||
if CP_CHECK_NAME(L"anim", L"par")
|
||||
CP_CREATE_ELEMENT(animation_);
|
||||
else if (L"presentation" == Ns && L"notes" == Name)
|
||||
CP_CREATE_ELEMENT(presentation_notes_);
|
||||
else
|
||||
CP_CREATE_ELEMENT(content_);
|
||||
}
|
||||
|
||||
void draw_page::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
draw_page_attr_.add_attributes(Attributes);
|
||||
attlist_.add_attributes(Attributes);
|
||||
}
|
||||
|
||||
void draw_page::pptx_convert_placeHolder(oox::pptx_conversion_context & Context, std::wstring styleName, presentation_class::type PresentationClass)
|
||||
@ -96,7 +94,7 @@ void draw_page::pptx_convert_placeHolder(oox::pptx_conversion_context & Context,
|
||||
|
||||
int index=-1;
|
||||
|
||||
const std::wstring masterName = draw_page_attr_.master_page_name_.get_value_or(L"");
|
||||
const std::wstring masterName = attlist_.master_page_name_.get_value_or(L"");
|
||||
style_master_page * master = Context.root()->odf_context().pageLayoutContainer().master_page_by_name(masterName);
|
||||
|
||||
if (master)
|
||||
@ -129,16 +127,16 @@ void draw_page::pptx_convert_placeHolder(oox::pptx_conversion_context & Context,
|
||||
|
||||
void draw_page::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
{
|
||||
const std::wstring pageStyleName = draw_page_attr_.draw_style_name_.get_value_or(L"");
|
||||
const std::wstring pageName = draw_page_attr_.draw_name_.get_value_or(L"");
|
||||
const std::wstring layoutName = draw_page_attr_.page_layout_name_.get_value_or(L"");
|
||||
const std::wstring masterName = draw_page_attr_.master_page_name_.get_value_or(L"");
|
||||
const std::wstring pageStyleName = attlist_.draw_style_name_.get_value_or(L"");
|
||||
const std::wstring pageName = attlist_.draw_name_.get_value_or(L"");
|
||||
const std::wstring layoutName = attlist_.page_layout_name_.get_value_or(L"");
|
||||
const std::wstring masterName = attlist_.master_page_name_.get_value_or(L"");
|
||||
|
||||
_CP_LOG << L"[info][xlsx] process page(slide) \"" << pageName /*L"" */<< L"\"" << std::endl;
|
||||
_CP_LOG << L"[info][pptx] process page(slide) \"" << pageName /*L"" */<< L"\"" << std::endl;
|
||||
|
||||
Context.start_page(pageName, pageStyleName, layoutName,masterName);
|
||||
|
||||
if (draw_page_attr_.draw_style_name_)
|
||||
if (attlist_.draw_style_name_)
|
||||
{
|
||||
style_instance * style_inst = Context.root()->odf_context().styleContainer().style_by_name(pageStyleName,style_family::DrawingPage,false);
|
||||
|
||||
@ -191,23 +189,30 @@ void draw_page::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
animation_->pptx_convert(Context);
|
||||
}
|
||||
/////////////////////////
|
||||
BOOST_FOREACH(const office_element_ptr& elm, content_)
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
elm->pptx_convert(Context);
|
||||
content_[i]->pptx_convert(Context);
|
||||
}
|
||||
|
||||
if (draw_page_attr_.use_footer_name_)//from master_page
|
||||
if (attlist_.use_footer_name_)//from master_page
|
||||
{
|
||||
std::wstring name = L"footer:" + *draw_page_attr_.use_footer_name_;
|
||||
std::wstring name = L"footer:" + *attlist_.use_footer_name_;
|
||||
pptx_convert_placeHolder(Context, name, presentation_class::footer);
|
||||
}
|
||||
if (draw_page_attr_.use_date_time_name_)//from master_page
|
||||
if (attlist_.use_date_time_name_)//from master_page
|
||||
{
|
||||
std::wstring name = L"datetime:" + *draw_page_attr_.use_date_time_name_;
|
||||
std::wstring name = L"datetime:" + *attlist_.use_date_time_name_;
|
||||
pptx_convert_placeHolder(Context, name, presentation_class::date_time);
|
||||
}
|
||||
|
||||
Context.end_page();
|
||||
|
||||
Context.end_page();
|
||||
if (presentation_notes_)
|
||||
{
|
||||
Context.start_page_notes();
|
||||
presentation_notes_->pptx_convert(Context);
|
||||
Context.end_page_notes();
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
const wchar_t * presentation_footer_decl::ns = L"presentation";
|
||||
@ -243,6 +248,117 @@ void presentation_date_time_decl::pptx_convert(oox::pptx_conversion_context & Co
|
||||
{
|
||||
Context.get_text_context().add_text(text_);
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
const wchar_t * presentation_notes::ns = L"presentation";
|
||||
const wchar_t * presentation_notes::name = L"notes";
|
||||
|
||||
void presentation_notes::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
{
|
||||
CP_CREATE_ELEMENT(content_);
|
||||
}
|
||||
|
||||
void presentation_notes::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
attlist_.add_attributes(Attributes);
|
||||
}
|
||||
|
||||
void presentation_notes::pptx_convert_placeHolder(oox::pptx_conversion_context & Context, std::wstring styleName, presentation_class::type PresentationClass)
|
||||
{
|
||||
office_element_ptr elm = Context.root()->odf_context().drawStyles().find_by_style_name(styleName);
|
||||
//todooo если это элемент datatime -нужно вытащить формат поля
|
||||
|
||||
if (!elm)return;
|
||||
|
||||
int index=-1;
|
||||
|
||||
const std::wstring masterName = attlist_.master_page_name_.get_value_or(L"");
|
||||
style_master_page * master = Context.root()->odf_context().pageLayoutContainer().master_page_by_name(masterName);
|
||||
|
||||
//if (master)
|
||||
// index = master->find_placeHolderIndex(PresentationClass, Context.last_idx_placeHolder);
|
||||
|
||||
|
||||
Context.get_slide_context().start_shape(1);
|
||||
Context.get_slide_context().set_placeHolder_type(presentation_class(PresentationClass).get_type_ms());
|
||||
Context.get_slide_context().set_placeHolder_idx(index);
|
||||
|
||||
Context.get_text_context().start_object();
|
||||
|
||||
if (PresentationClass == presentation_class::date_time)
|
||||
{
|
||||
Context.get_text_context().start_field(oox::datetime, L"");
|
||||
}
|
||||
|
||||
elm->pptx_convert(Context);
|
||||
|
||||
std::wstring text_content_ = Context.get_text_context().end_object();
|
||||
|
||||
if (text_content_.length()>0)
|
||||
{
|
||||
Context.get_slide_context().set_property(_property(L"text-content",text_content_));
|
||||
}
|
||||
Context.get_slide_context().set_property(_property(L"no_rect",true));
|
||||
Context.get_slide_context().end_shape();
|
||||
|
||||
}
|
||||
|
||||
void presentation_notes::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
{
|
||||
const std::wstring pageStyleName = attlist_.draw_style_name_.get_value_or(L"");
|
||||
const std::wstring layoutName = attlist_.page_layout_name_.get_value_or(L"");
|
||||
const std::wstring masterName = attlist_.master_page_name_.get_value_or(L"");
|
||||
|
||||
_CP_LOG << L"[info][pptx] process note slide" << std::endl;
|
||||
|
||||
if (attlist_.draw_style_name_)
|
||||
{
|
||||
style_instance * style_inst = Context.root()->odf_context().styleContainer().style_by_name(pageStyleName, style_family::DrawingPage, Context.process_masters_);
|
||||
|
||||
if ((style_inst) && (style_inst->content()))
|
||||
{
|
||||
const style_drawing_page_properties * properties = style_inst->content()->get_style_drawing_page_properties();
|
||||
|
||||
if (properties)
|
||||
{
|
||||
oox::_oox_fill fill;
|
||||
Compute_GraphicFill(properties->content().common_draw_fill_attlist_, office_element_ptr(),
|
||||
Context.root()->odf_context().drawStyles() ,fill);
|
||||
Context.get_slide_context().add_background(fill);
|
||||
|
||||
////////////////////////////////////////////////
|
||||
if ((properties->content().presentation_display_footer_) && (*properties->content().presentation_display_footer_))
|
||||
Context.get_slide_context().set_footer();
|
||||
|
||||
if ((properties->content().presentation_display_header_) && (*properties->content().presentation_display_header_))
|
||||
Context.get_slide_context().set_header();
|
||||
|
||||
if ((properties->content().presentation_display_page_number_) && (*properties->content().presentation_display_page_number_))
|
||||
Context.get_slide_context().set_page_number();
|
||||
|
||||
if ((properties->content().presentation_display_date_time_) && (*properties->content().presentation_display_date_time_))
|
||||
Context.get_slide_context().set_date_time();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
content_[i]->pptx_convert(Context);
|
||||
}
|
||||
|
||||
if (attlist_.use_footer_name_)//from master_page_notes
|
||||
{
|
||||
std::wstring name = L"footer:" + *attlist_.use_footer_name_;
|
||||
pptx_convert_placeHolder(Context, name, presentation_class::footer);
|
||||
}
|
||||
if (attlist_.use_date_time_name_)//from master_page_notes
|
||||
{
|
||||
std::wstring name = L"datetime:" + *attlist_.use_date_time_name_;
|
||||
pptx_convert_placeHolder(Context, name, presentation_class::date_time);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,11 +79,11 @@ private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
|
||||
|
||||
private:
|
||||
office_element_ptr_array content_;
|
||||
office_element_ptr animation_;
|
||||
office_element_ptr_array content_;
|
||||
office_element_ptr animation_;
|
||||
office_element_ptr presentation_notes_;
|
||||
|
||||
draw_page_attr draw_page_attr_;
|
||||
draw_page_attr attlist_;
|
||||
};
|
||||
|
||||
CP_REGISTER_OFFICE_ELEMENT2(draw_page);
|
||||
@ -139,5 +139,28 @@ private:
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(presentation_date_time_decl);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//presentation:date-time-decl
|
||||
class presentation_notes : public office_element_impl<presentation_notes>
|
||||
{
|
||||
public:
|
||||
static const wchar_t * ns;
|
||||
static const wchar_t * name;
|
||||
static const xml::NodeType xml_type = xml::typeElement;
|
||||
static const ElementType type = typePresentationNotes;
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
virtual void pptx_convert(oox::pptx_conversion_context & Context);
|
||||
|
||||
private:
|
||||
void pptx_convert_placeHolder(oox::pptx_conversion_context & Context, std::wstring styleName, odf_types::presentation_class::type PresentationClass);
|
||||
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
|
||||
|
||||
office_element_ptr_array content_;
|
||||
draw_page_attr attlist_;
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(presentation_notes);
|
||||
}
|
||||
}
|
||||
|
||||
@ -360,11 +360,11 @@ void page_layout_instance::docx_convert_serialize(std::wostream & strm, oox::doc
|
||||
if (props)
|
||||
props->docx_convert_serialize(strm, Context);
|
||||
}
|
||||
void page_layout_instance::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
void page_layout_instance::pptx_serialize(std::wostream & strm, oox::pptx_conversion_context & Context)
|
||||
{
|
||||
style_page_layout_properties * props = properties();
|
||||
if (props)
|
||||
props->pptx_convert(Context);
|
||||
props->pptx_serialize(strm, Context);
|
||||
}
|
||||
|
||||
void page_layout_container::add_page_layout(const style_page_layout * StylePageLayout)
|
||||
|
||||
@ -195,7 +195,7 @@ public:
|
||||
|
||||
void docx_convert_serialize (std::wostream & strm, oox::docx_conversion_context & Context);
|
||||
void xlsx_serialize (std::wostream & strm, oox::xlsx_conversion_context & Context);
|
||||
void pptx_convert (oox::pptx_conversion_context & Context);
|
||||
void pptx_serialize (std::wostream & strm, oox::pptx_conversion_context & Context);
|
||||
|
||||
const style_page_layout * style_page_layout_;
|
||||
|
||||
|
||||
@ -316,6 +316,7 @@ enum ElementType
|
||||
typeDrawPage,
|
||||
typePresentationFooterDecl,
|
||||
typePresentationDateTimeDecl,
|
||||
typePresentationNotes,
|
||||
|
||||
typeAnimPar,
|
||||
typeAnimSeq,
|
||||
|
||||
@ -1378,6 +1378,50 @@ void style_page_layout_properties::pptx_convert(oox::pptx_conversion_context & C
|
||||
attlist_.pptx_convert(Context);
|
||||
}
|
||||
|
||||
void style_page_layout_properties::pptx_serialize(std::wostream & strm, oox::pptx_conversion_context & Context)
|
||||
{
|
||||
if (attlist_.fo_page_width_ || attlist_.fo_page_height_ || attlist_.style_print_orientation_)
|
||||
{
|
||||
std::wstring w_w, w_h;
|
||||
|
||||
_INT64 h = 0, w = 0;
|
||||
|
||||
if (attlist_.fo_page_width_)
|
||||
{
|
||||
w = attlist_.fo_page_width_->get_value_unit(length::emu);
|
||||
if (w < 914400) w = 914400;
|
||||
|
||||
w_w = boost::lexical_cast<std::wstring>(w);
|
||||
}
|
||||
if (attlist_.fo_page_height_)
|
||||
{
|
||||
h = attlist_.fo_page_height_->get_value_unit(length::emu);
|
||||
if (h < 914400) h = 914400;
|
||||
|
||||
w_h = std::to_wstring(h);
|
||||
}
|
||||
|
||||
std::wstring w_orient = L"custom";
|
||||
|
||||
//if (w && h)
|
||||
//{
|
||||
// double ratio = (double)w/(double)h;
|
||||
// if (abs(ratio - 16./9.)<0.01) w_orient = L"screen16x9";
|
||||
// if (abs(ratio - 4./3.)<0.01) w_orient = L"screen4x3";
|
||||
//}
|
||||
|
||||
strm << L"<p:sldSz ";
|
||||
if (!w_h.empty())
|
||||
strm << L"cy=\"" << w_h << L"\" ";
|
||||
|
||||
if (!w_w.empty())
|
||||
strm << L"cx=\"" << w_w << L"\" ";
|
||||
|
||||
strm << L"type=\"" << w_orient << L"\" ";
|
||||
|
||||
strm << L"/>";
|
||||
}
|
||||
}
|
||||
|
||||
// style-page-layout-properties-elements
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -1519,10 +1563,11 @@ void style_master_page::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_FOREACH(office_element_ptr elm, content_)
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
elm->pptx_convert(Context);
|
||||
content_[i]->pptx_convert(Context);
|
||||
}
|
||||
|
||||
}
|
||||
////////////////
|
||||
|
||||
@ -1698,9 +1743,9 @@ void style_presentation_page_layout::add_child_element( xml::sax * Reader, const
|
||||
}
|
||||
void style_presentation_page_layout::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
{
|
||||
BOOST_FOREACH(office_element_ptr elm, content_)
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
elm->pptx_convert(Context);
|
||||
content_[i]->pptx_convert(Context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -980,6 +980,7 @@ public:
|
||||
|
||||
bool docx_background_serialize(std::wostream & strm, oox::docx_conversion_context & Context, oox::_oox_fill & fill, int id);
|
||||
void xlsx_serialize(std::wostream & strm, oox::xlsx_conversion_context & Context);
|
||||
void pptx_serialize(std::wostream & strm, oox::pptx_conversion_context & Context);
|
||||
|
||||
style_page_layout_properties() { }
|
||||
|
||||
|
||||
@ -46,17 +46,17 @@ namespace odf_writer {
|
||||
|
||||
void draw_page_attr::serialize(CP_ATTR_NODE)
|
||||
{
|
||||
CP_XML_ATTR_OPT(L"draw:id", draw_id_);
|
||||
CP_XML_ATTR_OPT(L"draw:id", draw_id_);
|
||||
|
||||
CP_XML_ATTR_OPT(L"draw:name", draw_name_);
|
||||
CP_XML_ATTR_OPT(L"draw:style-name", draw_style_name_);
|
||||
CP_XML_ATTR_OPT(L"draw:name", draw_name_);
|
||||
CP_XML_ATTR_OPT(L"draw:style-name", draw_style_name_);
|
||||
CP_XML_ATTR_OPT(L"draw:master-page-name", draw_master_page_name_);
|
||||
|
||||
CP_XML_ATTR_OPT(L"presentation:presentation-page-layout-name", page_layout_name_);
|
||||
CP_XML_ATTR_OPT(L"draw:master-page-name", master_page_name_);
|
||||
|
||||
CP_XML_ATTR_OPT(L"presentation:use-date-time-name", use_date_time_name_);
|
||||
CP_XML_ATTR_OPT(L"presentation:use-footer-name", use_footer_name_);
|
||||
|
||||
CP_XML_ATTR_OPT(L"style:page-layout-name", style_page_layout_name_);
|
||||
|
||||
CP_XML_ATTR_OPT(L"presentation:presentation-page-layout-name", presentation_page_layout_name_);
|
||||
CP_XML_ATTR_OPT(L"presentation:use-date-time-name", presentation_use_date_time_name_);
|
||||
CP_XML_ATTR_OPT(L"presentation:use-footer-name", presentation_use_footer_name_);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -54,12 +54,13 @@ public:
|
||||
_CP_OPT(std::wstring) draw_name_;
|
||||
_CP_OPT(std::wstring) draw_id_;
|
||||
_CP_OPT(std::wstring) draw_style_name_;
|
||||
_CP_OPT(std::wstring) draw_master_page_name_;
|
||||
|
||||
_CP_OPT(std::wstring) page_layout_name_;
|
||||
_CP_OPT(std::wstring) master_page_name_;
|
||||
_CP_OPT(std::wstring) style_page_layout_name_;
|
||||
|
||||
_CP_OPT(std::wstring) use_footer_name_;
|
||||
_CP_OPT(std::wstring) use_date_time_name_;
|
||||
_CP_OPT(std::wstring) presentation_use_footer_name_;
|
||||
_CP_OPT(std::wstring) presentation_use_date_time_name_;
|
||||
_CP_OPT(std::wstring) presentation_page_layout_name_;
|
||||
};
|
||||
|
||||
class draw_page : public office_element_impl<draw_page>
|
||||
|
||||
@ -264,7 +264,7 @@ public:
|
||||
bool is_footer_;
|
||||
bool is_header_;
|
||||
bool is_background_;
|
||||
_CP_OPT(bool) is_presentation_;
|
||||
_CP_OPT(int) is_presentation_;
|
||||
|
||||
void create_draw_base(int type);
|
||||
office_element_ptr create_draw_element(int type);
|
||||
@ -312,12 +312,12 @@ void odf_drawing_context::set_styles_context(odf_style_context* styles_context)
|
||||
impl_->styles_context_ = styles_context;
|
||||
}
|
||||
|
||||
void odf_drawing_context::set_presentation (bool bMaster)
|
||||
void odf_drawing_context::set_presentation (int type)
|
||||
{
|
||||
impl_->is_presentation_ = bMaster;
|
||||
impl_->is_presentation_ = type;
|
||||
}
|
||||
|
||||
_CP_OPT(bool) odf_drawing_context::get_presentation ()
|
||||
_CP_OPT(int) odf_drawing_context::get_presentation ()
|
||||
{
|
||||
return impl_->is_presentation_;
|
||||
}
|
||||
@ -500,8 +500,8 @@ void odf_drawing_context::end_drawing()
|
||||
if (impl_->current_drawing_state_.presentation_class_ || impl_->current_drawing_state_.presentation_placeholder_)
|
||||
{
|
||||
_CP_OPT(std::wstring) draw_layer;
|
||||
if (impl_->is_presentation_.get() == true)
|
||||
{//master
|
||||
if (impl_->is_presentation_.get() > 0)
|
||||
{//masters
|
||||
draw_layer = L"backgroundobjects";
|
||||
|
||||
if (!impl_->current_drawing_state_.presentation_class_)
|
||||
@ -1207,7 +1207,15 @@ void odf_drawing_context::set_placeholder_type (int val)
|
||||
|
||||
switch(val)
|
||||
{
|
||||
case 0: impl_->current_drawing_state_.presentation_class_ = presentation_class::outline; break;
|
||||
case 0:
|
||||
{
|
||||
if (impl_->is_presentation_ == 2) //notes master
|
||||
impl_->current_drawing_state_.presentation_class_ = presentation_class::notes;
|
||||
else if (impl_->is_presentation_ == 3) //handout master
|
||||
impl_->current_drawing_state_.presentation_class_ = presentation_class::handout;
|
||||
else
|
||||
impl_->current_drawing_state_.presentation_class_ = presentation_class::outline;
|
||||
}break;
|
||||
case 1: impl_->current_drawing_state_.presentation_class_ = presentation_class::chart; break;
|
||||
case 2: impl_->current_drawing_state_.presentation_class_ = presentation_class::graphic; break;
|
||||
case 3: impl_->current_drawing_state_.presentation_class_ = presentation_class::title; break;
|
||||
@ -1218,7 +1226,7 @@ void odf_drawing_context::set_placeholder_type (int val)
|
||||
case 8: impl_->current_drawing_state_.presentation_class_ = presentation_class::object; break;
|
||||
case 9: impl_->current_drawing_state_.presentation_class_ = presentation_class::object; break;
|
||||
case 10: impl_->current_drawing_state_.presentation_class_ = presentation_class::graphic; break;
|
||||
case 11: impl_->current_drawing_state_.presentation_class_ = presentation_class::graphic; break;
|
||||
case 11: impl_->current_drawing_state_.presentation_class_ = presentation_class::page; break;
|
||||
case 12: impl_->current_drawing_state_.presentation_class_ = presentation_class::page_number;break;
|
||||
case 13: impl_->current_drawing_state_.presentation_class_ = presentation_class::subtitle; break;
|
||||
case 14: impl_->current_drawing_state_.presentation_class_ = presentation_class::table; break;
|
||||
@ -2619,15 +2627,15 @@ void odf_drawing_context::set_gradient_angle(double angle)
|
||||
draw_gradient * gradient = dynamic_cast<draw_gradient *>(impl_->styles_context_->last_state(style_family::Gradient)->get_office_element().get());
|
||||
if (!gradient) return;
|
||||
|
||||
gradient->draw_angle_ = (270- angle) * 10;//(int)((360 - angle)/180. * 3.14159265358979323846);
|
||||
gradient->draw_angle_ = (270 - angle) * 10;//(int)((360 - angle)/180. * 3.14159265358979323846);
|
||||
}
|
||||
void odf_drawing_context::set_gradient_rect(double l, double t, double r,double b)
|
||||
void odf_drawing_context::set_gradient_rect(double l, double t, double r, double b)
|
||||
{
|
||||
draw_gradient * gradient = dynamic_cast<draw_gradient *>(impl_->styles_context_->last_state(style_family::Gradient)->get_office_element().get());
|
||||
if (!gradient) return;
|
||||
|
||||
gradient->draw_cy_ = percent((b-t)/2. + 50.);
|
||||
gradient->draw_cx_ = percent((r-l)/2. + 50.);
|
||||
gradient->draw_cy_ = percent((b - t)/2. + 50.);
|
||||
gradient->draw_cx_ = percent((r - l)/2. + 50.);
|
||||
}
|
||||
void odf_drawing_context::set_gradient_center(double cx, double cy)
|
||||
{
|
||||
|
||||
@ -60,8 +60,8 @@ public:
|
||||
odf_drawing_context (odf_conversion_context *odf_context);
|
||||
~odf_drawing_context ();
|
||||
|
||||
void set_presentation (bool bMaster);
|
||||
_CP_OPT(bool) get_presentation ();
|
||||
void set_presentation (int type);
|
||||
_CP_OPT(int) get_presentation ();
|
||||
|
||||
void set_drawings_rect (_CP_OPT(double) x_pt, _CP_OPT(double) y_pt, _CP_OPT(double) width_pt, _CP_OPT(double) height_pt);
|
||||
void clear ();
|
||||
|
||||
@ -584,7 +584,8 @@ void odf_page_layout_context::set_pages_mirrored(bool val)
|
||||
|
||||
style_page_layout_properties * odf_page_layout_context::get_properties()
|
||||
{
|
||||
if (layout_state_list_.size() < 1) return NULL;
|
||||
if (layout_state_list_.empty()) return NULL;
|
||||
|
||||
style_page_layout_properties * props = layout_state_list_.back().get_properties();
|
||||
if (props == NULL)
|
||||
{
|
||||
|
||||
@ -36,6 +36,7 @@
|
||||
|
||||
#include "odp_conversion_context.h"
|
||||
#include "office_presentation.h"
|
||||
#include "draw_page.h"
|
||||
|
||||
#include "styles.h"
|
||||
#include "style_table_properties.h"
|
||||
@ -95,7 +96,7 @@ void odp_conversion_context::start_slide()
|
||||
create_element(L"draw", L"page", root_presentation_->pages_, this);
|
||||
slide_context_.start_page(root_presentation_->pages_.back());
|
||||
|
||||
drawing_context()->set_presentation(false);
|
||||
drawing_context()->set_presentation(0);
|
||||
}
|
||||
void odp_conversion_context::end_slide()
|
||||
{
|
||||
@ -108,7 +109,7 @@ void odp_conversion_context::start_master_slide(std::wstring name)
|
||||
page_layout_context()->add_master_page(name);
|
||||
slide_context_.start_page(page_layout_context()->last_master()->get_root());
|
||||
|
||||
drawing_context()->set_presentation(true);
|
||||
drawing_context()->set_presentation(1);
|
||||
}
|
||||
void odp_conversion_context::end_master_slide()
|
||||
{
|
||||
@ -122,7 +123,7 @@ void odp_conversion_context::start_layout_slide()
|
||||
|
||||
slide_context_.start_page(elm);
|
||||
|
||||
drawing_context()->set_presentation(true);
|
||||
drawing_context()->set_presentation(1);
|
||||
}
|
||||
void odp_conversion_context::end_layout_slide()
|
||||
{
|
||||
@ -147,7 +148,7 @@ void odp_conversion_context::end_drawings()
|
||||
{
|
||||
current_slide().drawing_context()->clear();
|
||||
}
|
||||
void odp_conversion_context::start_note()
|
||||
void odp_conversion_context::start_note(bool bMaster)
|
||||
{
|
||||
office_element_ptr note_elm;
|
||||
create_element(L"presentation", L"notes", note_elm, this);
|
||||
@ -156,6 +157,18 @@ void odp_conversion_context::start_note()
|
||||
current_slide().drawing_context()->start_element(note_elm);
|
||||
|
||||
slide_context_.start_page(note_elm);
|
||||
|
||||
if (bMaster)
|
||||
{
|
||||
page_layout_context()->create_layout_page();
|
||||
|
||||
odf_writer::presentation_notes* notes = dynamic_cast<odf_writer::presentation_notes*>(note_elm.get());
|
||||
notes->attlist_.style_page_layout_name_ = page_layout_context()->last_layout()->get_name();
|
||||
|
||||
drawing_context()->set_presentation(2);
|
||||
}
|
||||
else
|
||||
drawing_context()->set_presentation(0);
|
||||
}
|
||||
void odp_conversion_context::start_comment(int oox_comm_id)
|
||||
{
|
||||
|
||||
@ -77,7 +77,7 @@ public:
|
||||
void start_comment_content ();
|
||||
void end_comment_content ();
|
||||
|
||||
void start_note();
|
||||
void start_note(bool bMaster = false);
|
||||
void end_note();
|
||||
|
||||
private:
|
||||
|
||||
@ -88,7 +88,7 @@ void odp_page_state::set_layout_page(std::wstring name)
|
||||
draw_page* page = dynamic_cast<draw_page*>(page_elm_.get());
|
||||
if (page == NULL)return;
|
||||
|
||||
page->attlist_.page_layout_name_ = name;
|
||||
page->attlist_.presentation_page_layout_name_ = name;
|
||||
}
|
||||
|
||||
void odp_page_state::set_master_page(std::wstring name)
|
||||
@ -98,7 +98,7 @@ void odp_page_state::set_master_page(std::wstring name)
|
||||
draw_page* page = dynamic_cast<draw_page*>(page_elm_.get());
|
||||
if (page == NULL)return;
|
||||
|
||||
page->attlist_.master_page_name_ = name;
|
||||
page->attlist_.draw_master_page_name_ = name;
|
||||
}
|
||||
|
||||
void odp_page_state::set_page_style(office_element_ptr & elm)
|
||||
|
||||
@ -437,8 +437,6 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape)
|
||||
{
|
||||
if (oox_shape == NULL) return;
|
||||
|
||||
_CP_OPT(bool) bMasterPresentation = odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
if (oox_shape->txXfrm.IsInit())
|
||||
{
|
||||
odf_context()->drawing_context()->start_group();
|
||||
@ -856,10 +854,10 @@ void OoxConverter::convert(PPTX::Logic::GradFill *oox_grad_fill, DWORD nARGB)
|
||||
}
|
||||
if (oox_grad_fill->path->rect.IsInit())
|
||||
{
|
||||
odf_context()->drawing_context()->set_gradient_rect( XmlUtils::GetInteger(oox_grad_fill->path->rect->l.get_value_or(L"")),
|
||||
XmlUtils::GetInteger(oox_grad_fill->path->rect->t.get_value_or(L"")),
|
||||
XmlUtils::GetInteger(oox_grad_fill->path->rect->r.get_value_or(L"")),
|
||||
XmlUtils::GetInteger(oox_grad_fill->path->rect->b.get_value_or(L"")));
|
||||
odf_context()->drawing_context()->set_gradient_rect( XmlUtils::GetInteger(oox_grad_fill->path->rect->l.get_value_or(L"")) / 1000.,
|
||||
XmlUtils::GetInteger(oox_grad_fill->path->rect->t.get_value_or(L"")) / 1000.,
|
||||
XmlUtils::GetInteger(oox_grad_fill->path->rect->r.get_value_or(L"")) / 1000.,
|
||||
XmlUtils::GetInteger(oox_grad_fill->path->rect->b.get_value_or(L"")) / 1000.);
|
||||
}
|
||||
}
|
||||
odf_context()->drawing_context()->set_gradient_type(grad_style);
|
||||
@ -1424,9 +1422,9 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T
|
||||
|
||||
if (list_local)
|
||||
{
|
||||
_CP_OPT(bool) inStyles = odf_context()->drawing_context()->get_presentation();
|
||||
_CP_OPT(int) inStyles = odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
odf_context()->styles_context()->lists_styles().start_style(inStyles && *inStyles);
|
||||
odf_context()->styles_context()->lists_styles().start_style(inStyles && *inStyles > 0);
|
||||
convert_list_level(oox_paragraph->pPr.GetPointer(), list_level /*- 1*/);
|
||||
odf_context()->styles_context()->lists_styles().end_style();
|
||||
|
||||
@ -1926,9 +1924,9 @@ void OoxConverter::convert(PPTX::Logic::TextListStyle *oox_list_style)
|
||||
if (!oox_list_style) return;
|
||||
if (oox_list_style->IsListStyleEmpty()) return;
|
||||
|
||||
_CP_OPT(bool) inStyles = odf_context()->drawing_context()->get_presentation();
|
||||
_CP_OPT(int) inStyles = odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
odf_context()->styles_context()->lists_styles().start_style(inStyles && *inStyles);
|
||||
odf_context()->styles_context()->lists_styles().start_style(inStyles && *inStyles > 0); // masters
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
OoxConverter::convert_list_level(oox_list_style->levels[i].GetPointer(), i);
|
||||
|
||||
@ -35,6 +35,7 @@
|
||||
#include "../../../ASCOfficePPTXFile/PPTXFormat/Folder.h"
|
||||
#include "../../../ASCOfficePPTXFile/PPTXFormat/Presentation.h"
|
||||
#include "../../../ASCOfficePPTXFile/PPTXFormat/Slide.h"
|
||||
#include "../../../ASCOfficePPTXFile/PPTXFormat/NotesMaster.h"
|
||||
|
||||
#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/Table.h"
|
||||
|
||||
@ -359,7 +360,14 @@ void PptxConverter::convert_slides()
|
||||
current_clrMap = slide->Layout->clrMapOvr->overrideClrMapping.GetPointer();
|
||||
current_slide = slide->Layout.operator->();
|
||||
|
||||
convert_slide(&slide->Layout->cSld, current_txStyles, true, bShowLayoutMasterSp);
|
||||
convert_slide(&slide->Layout->cSld, current_txStyles, true, bShowLayoutMasterSp);
|
||||
|
||||
if (!presentation->notesMasterIdLst.empty())
|
||||
{
|
||||
rId = presentation->notesMasterIdLst[0].rid.get();
|
||||
smart_ptr<PPTX::NotesMaster> notes_master = ((*presentation)[rId]).smart_dynamic_cast<PPTX::NotesMaster>();
|
||||
convert(notes_master.operator->());
|
||||
}
|
||||
//add note master
|
||||
odp_context->end_master_slide();
|
||||
|
||||
@ -409,21 +417,67 @@ void PptxConverter::convert_slides()
|
||||
odp_context->end_slide();
|
||||
}
|
||||
}
|
||||
void PptxConverter::convert(PPTX::NotesSlide *oox_note)
|
||||
void PptxConverter::convert(PPTX::NotesMaster *oox_notes)
|
||||
{
|
||||
if (!oox_note) return;
|
||||
if (!oox_notes) return;
|
||||
|
||||
odp_context->start_note();
|
||||
odp_context->start_note(true);
|
||||
|
||||
current_slide = dynamic_cast<OOX::IFileContainer*>(oox_note);
|
||||
PPTX::Theme* old_theme = current_theme;
|
||||
PPTX::Logic::ClrMap* old_clrMap = current_clrMap;
|
||||
|
||||
if (oox_note->clrMapOvr.IsInit() && oox_note->clrMapOvr->overrideClrMapping.IsInit())
|
||||
current_clrMap = oox_note->clrMapOvr->overrideClrMapping.GetPointer();
|
||||
//current_txStyles = oox_note->Master->txStyles.GetPointer();
|
||||
current_theme = oox_notes->theme_.operator->();
|
||||
current_clrMap = &oox_notes->clrMap;
|
||||
|
||||
convert_slide(&oox_note->cSld, NULL, true, true);
|
||||
current_slide = dynamic_cast<OOX::IFileContainer*>(oox_notes);
|
||||
//PPTX::Logic::TxStyles* current_txStyles = oox_notes->notesStyle.GetPointer();
|
||||
|
||||
if (presentation->notesSz.IsInit())
|
||||
{
|
||||
_CP_OPT(odf_types::length) width = odf_types::length(presentation->notesSz->cx / 12700., odf_types::length::pt);
|
||||
_CP_OPT(odf_types::length) height = odf_types::length(presentation->notesSz->cy / 12700., odf_types::length::pt);
|
||||
|
||||
odf_context()->page_layout_context()->set_page_size(width, height);
|
||||
}
|
||||
convert_slide(&oox_notes->cSld, NULL, true, true);
|
||||
|
||||
odp_context->end_note();
|
||||
|
||||
current_clrMap = old_clrMap;
|
||||
current_theme = old_theme;
|
||||
}
|
||||
void PptxConverter::convert(PPTX::NotesSlide *oox_notes)
|
||||
{
|
||||
if (!oox_notes) return;
|
||||
|
||||
PPTX::Theme* old_theme = current_theme;
|
||||
PPTX::Logic::ClrMap* old_clrMap = current_clrMap;
|
||||
|
||||
smart_ptr<PPTX::NotesMaster> notes_master;
|
||||
if (!presentation->notesMasterIdLst.empty())
|
||||
{
|
||||
std::wstring rId = presentation->notesMasterIdLst[0].rid.get();
|
||||
notes_master = ((*presentation)[rId]).smart_dynamic_cast<PPTX::NotesMaster>();
|
||||
}
|
||||
odp_context->start_note();
|
||||
|
||||
if (notes_master.IsInit())
|
||||
{
|
||||
current_theme = notes_master->theme_.operator->();
|
||||
current_clrMap = ¬es_master->clrMap;
|
||||
}
|
||||
|
||||
current_slide = dynamic_cast<OOX::IFileContainer*>(oox_notes);
|
||||
|
||||
if (oox_notes->clrMapOvr.IsInit() && oox_notes->clrMapOvr->overrideClrMapping.IsInit())
|
||||
current_clrMap = oox_notes->clrMapOvr->overrideClrMapping.GetPointer();
|
||||
|
||||
convert_slide(&oox_notes->cSld, NULL, true, true);
|
||||
|
||||
odp_context->end_note();
|
||||
|
||||
current_clrMap = old_clrMap;
|
||||
current_theme = old_theme;
|
||||
}
|
||||
|
||||
void PptxConverter::convert(OOX::WritingElement *oox_unknown)
|
||||
@ -979,8 +1033,6 @@ void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxS
|
||||
|
||||
convert(oox_slide->bg.GetPointer());
|
||||
|
||||
bool bMaster = *odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
for (size_t i = 0 ; i < oox_slide->spTree.SpTreeElems.size(); i++)
|
||||
{
|
||||
smart_ptr<PPTX::WrapperWritingElement> pElem = oox_slide->spTree.SpTreeElems[i].GetElem();
|
||||
@ -999,9 +1051,6 @@ void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxS
|
||||
{
|
||||
int ph_type = pShape->nvSpPr.nvPr.ph->type->GetBYTECode();
|
||||
|
||||
//if (!bMaster && (ph_type == 5 || ph_type == 6 || ph_type == 7 || ph_type == 12))
|
||||
// continue;
|
||||
|
||||
odf_context()->drawing_context()->set_placeholder_type(ph_type);
|
||||
}
|
||||
else
|
||||
|
||||
@ -48,6 +48,7 @@ namespace PPTX
|
||||
{
|
||||
class TableStyles;
|
||||
class NotesSlide;
|
||||
class NotesMaster;
|
||||
class Presentation;
|
||||
class Comments;
|
||||
class Folder;
|
||||
@ -110,7 +111,8 @@ namespace Oox2Odf
|
||||
void convert_slide (PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxStyles* txStyles, bool bPlaceholders, bool bFillUp);
|
||||
void convert_layout (PPTX::Logic::CSld *oox_slide);
|
||||
void convert (PPTX::Comments *oox_comments);
|
||||
void convert (PPTX::NotesSlide *oox_note);
|
||||
void convert (PPTX::NotesSlide *oox_notes);
|
||||
void convert (PPTX::NotesMaster *oox_notes);
|
||||
|
||||
void convert(PPTX::Logic::Bg *oox_background);
|
||||
void convert(PPTX::Logic::Timing *oox_timing, PPTX::Logic::Transition *oox_transition);
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="windows-1251"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8,00"
|
||||
Version="8.00"
|
||||
Name="Oox2OdfConverter"
|
||||
ProjectGUID="{BEE01B53-244A-44E6-8947-ED9342D9247E}"
|
||||
RootNamespace="Oox2OdfConverter"
|
||||
|
||||
@ -208,40 +208,48 @@ void NSPresentationEditor::CPPTXWriter::WriteContentTypes()
|
||||
<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\" />\
|
||||
<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\" />");
|
||||
|
||||
int nThemes = (int)m_pDocument->m_arThemes.size();
|
||||
int nIndexLayout = 0;
|
||||
for (int nT = 0; nT < nThemes; ++nT)
|
||||
int nIndexLayout = 1, nIndexTheme = 1;
|
||||
|
||||
for (size_t nT = 0; nT < m_pDocument->m_arThemes.size(); nT++, nIndexTheme++)
|
||||
{
|
||||
strContentTypes += L"<Override PartName=\"/ppt/theme/theme" + std::to_wstring(nT + 1) +
|
||||
L".xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\" />\
|
||||
<Override PartName=\"/ppt/slideMasters/slideMaster" + std::to_wstring(nT + 1) +
|
||||
strContentTypes += L"<Override PartName=\"/ppt/theme/theme" + std::to_wstring(nIndexTheme) + \
|
||||
L".xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\" />";
|
||||
|
||||
strContentTypes += L"<Override PartName=\"/ppt/slideMasters/slideMaster" + std::to_wstring(nIndexTheme) + \
|
||||
L".xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml\"/>";
|
||||
|
||||
|
||||
int nCountL = (int)m_pDocument->m_arThemes[nT].m_arLayouts.size();
|
||||
for (int nL = 0; nL < nCountL; ++nL, ++nIndexLayout)
|
||||
for (size_t nL = 0; nL < m_pDocument->m_arThemes[nT].m_arLayouts.size(); nL++, nIndexLayout++)
|
||||
{
|
||||
strContentTypes += L"<Override PartName=\"/ppt/slideLayouts/slideLayout" + std::to_wstring(nIndexLayout + 1) +
|
||||
strContentTypes += L"<Override PartName=\"/ppt/slideLayouts/slideLayout" + std::to_wstring(nIndexLayout) +
|
||||
L".xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\"/>";
|
||||
}
|
||||
}
|
||||
std::wstring strNotesTheme = L"<Override PartName=\"/ppt/theme/theme" + std::to_wstring(nThemes + 1) + L".xml\" \
|
||||
ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>";
|
||||
|
||||
if (m_pDocument->m_pNotesMaster)
|
||||
{
|
||||
strContentTypes += L"<Override PartName=\"/ppt/theme/theme" + std::to_wstring(nIndexTheme++) + L".xml\" \
|
||||
ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>";
|
||||
strContentTypes += L"<Override PartName=\"/ppt/notesMasters/notesMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml\"/>";
|
||||
}
|
||||
if (m_pDocument->m_pHandoutMaster)
|
||||
{
|
||||
strContentTypes += L"<Override PartName=\"/ppt/theme/theme" + std::to_wstring(nIndexTheme++) + L".xml\" \
|
||||
ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>";
|
||||
strContentTypes += L"<Override PartName=\"/ppt/handoutMasters/handoutMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml\"/>";
|
||||
}
|
||||
|
||||
strContentTypes += strNotesTheme;
|
||||
strContentTypes += _T("<Override PartName=\"/ppt/notesMasters/notesMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml\"/>");
|
||||
|
||||
int nCountS = (int)m_pDocument->m_arSlides.size();
|
||||
for (int nS = 0; nS < nCountS; ++nS)
|
||||
for (size_t nS = 0; nS < m_pDocument->m_arSlides.size(); ++nS)
|
||||
{
|
||||
strContentTypes += L"<Override PartName=\"/ppt/slides/slide" + std::to_wstring( nS + 1)
|
||||
+ L".xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>";
|
||||
}
|
||||
|
||||
for (size_t nS = 0; nS < m_pDocument->m_arNotes.size(); ++nS)
|
||||
{
|
||||
strContentTypes += L"<Override PartName=\"/ppt/notesSlides/notesSlide" + std::to_wstring( nS + 1)
|
||||
+ L".xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml\"/>";
|
||||
}
|
||||
|
||||
strContentTypes += _T("</Types>");
|
||||
|
||||
CFile oFile;
|
||||
@ -264,9 +272,9 @@ void NSPresentationEditor::CPPTXWriter::WriteApp(CFile& oFile)
|
||||
oFile.WriteStringUTF8(str1);
|
||||
|
||||
oFile.WriteStringUTF8(L"<Slides>" + std::to_wstring(m_pDocument->m_arSlides.size()) + L"</Slides>");
|
||||
oFile.WriteStringUTF8(L"<Notes>" + std::to_wstring(m_pDocument->m_arNotes.size()) + L"</Notes>");
|
||||
|
||||
oFile.WriteStringUTF8(L"<Notes>0</Notes>\
|
||||
<HiddenSlides>0</HiddenSlides>\
|
||||
oFile.WriteStringUTF8(L"<HiddenSlides>0</HiddenSlides>\
|
||||
<MMClips>2</MMClips>\
|
||||
<ScaleCrop>false</ScaleCrop>\
|
||||
<HeadingPairs>\
|
||||
@ -301,7 +309,7 @@ void NSPresentationEditor::CPPTXWriter::WriteApp(CFile& oFile)
|
||||
<LinksUpToDate>false</LinksUpToDate>\
|
||||
<SharedDoc>false</SharedDoc>\
|
||||
<HyperlinksChanged>false</HyperlinksChanged>\
|
||||
<AppVersion>1.0000</AppVersion>\
|
||||
<AppVersion>4.4000</AppVersion>\
|
||||
</Properties>");
|
||||
|
||||
strMemory += str5;
|
||||
@ -344,12 +352,14 @@ void NSPresentationEditor::CPPTXWriter::WritePresInfo()
|
||||
// presentation.xml + _rels/presentation.xml.rels
|
||||
std::wstring strPresRels;
|
||||
|
||||
std::wstring strPresMasters = _T("");
|
||||
std::wstring strPresSlides = _T("");
|
||||
std::wstring strPresMasters;
|
||||
std::wstring strPresSlides;
|
||||
std::wstring strNotesIDs;
|
||||
std::wstring strHandoutIDs;
|
||||
|
||||
size_t nCountLayouts = 0;
|
||||
size_t nCountThemes = m_pDocument->m_arThemes.size();
|
||||
for (size_t nIndexTheme = 0; nIndexTheme < nCountThemes; ++nIndexTheme)
|
||||
|
||||
for (size_t nIndexTheme = 0; nIndexTheme < m_pDocument->m_arThemes.size(); ++nIndexTheme)
|
||||
{
|
||||
strPresRels += L"<Relationship Id=\"rId" + std::to_wstring(2 * nIndexTheme + 1) +
|
||||
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster\" Target=\"slideMasters/slideMaster" +
|
||||
@ -365,9 +375,21 @@ void NSPresentationEditor::CPPTXWriter::WritePresInfo()
|
||||
nCountLayouts += 1;
|
||||
}
|
||||
|
||||
int nCurrentRels = (int)(2 * nCountThemes + 1);
|
||||
size_t nCountSlides = m_pDocument->m_arSlides.size();
|
||||
for (size_t nIndexSlide = 0; nIndexSlide < nCountSlides; ++nIndexSlide, ++nCurrentRels)
|
||||
int nCurrentRels = (int)(2 * m_pDocument->m_arThemes.size() + 1);
|
||||
|
||||
if (m_pDocument->m_pNotesMaster)
|
||||
{
|
||||
strNotesIDs = L"<p:notesMasterIdLst><p:notesMasterId r:id=\"rId" + std::to_wstring(nCurrentRels) + L"\"/></p:notesMasterIdLst>";
|
||||
strPresRels += L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster\" Target=\"notesMasters/notesMaster1.xml\"/>";
|
||||
++nCurrentRels;
|
||||
}
|
||||
if (m_pDocument->m_pHandoutMaster)
|
||||
{
|
||||
strHandoutIDs = L"<p:handoutMasterIdLst><p:handoutMasterId r:id=\"rId" + std::to_wstring(nCurrentRels) + L"\"/></p:handoutMasterIdLst>";
|
||||
strPresRels += L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/handoutMaster\" Target=\"handoutMasters/handoutMaster1.xml\"/>";
|
||||
++nCurrentRels;
|
||||
}
|
||||
for (size_t nIndexSlide = 0; nIndexSlide < m_pDocument->m_arSlides.size(); ++nIndexSlide, ++nCurrentRels)
|
||||
{
|
||||
strPresRels += L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels) +
|
||||
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide\" Target=\"slides/slide" +
|
||||
@ -376,17 +398,12 @@ void NSPresentationEditor::CPPTXWriter::WritePresInfo()
|
||||
strPresSlides += L"<p:sldId id=\"" + std::to_wstring(256 + nIndexSlide) + L"\" r:id=\"rId" + std::to_wstring(nCurrentRels) + L"\"/>";
|
||||
}
|
||||
|
||||
std::wstring strNotesIDs = L"<p:notesMasterIdLst><p:notesMasterId r:id=\"rId" + std::to_wstring(nCurrentRels) + L"\"/></p:notesMasterIdLst>";
|
||||
strPresRels += L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/presProps\" Target=\"presProps.xml\"/>";
|
||||
strPresRels += L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableStyles\" Target=\"tableStyles.xml\"/>";
|
||||
strPresRels += L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/viewProps\" Target=\"viewProps.xml\"/>";
|
||||
|
||||
std::wstring strRels0 = L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster\" Target=\"notesMasters/notesMaster1.xml\"/>";
|
||||
|
||||
++nCurrentRels;
|
||||
|
||||
std::wstring strRels1 = L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/presProps\" Target=\"presProps.xml\"/>";
|
||||
std::wstring strRels2 = L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableStyles\" Target=\"tableStyles.xml\"/>";
|
||||
std::wstring strRels3 = L"<Relationship Id=\"rId" + std::to_wstring(nCurrentRels++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/viewProps\" Target=\"viewProps.xml\"/>";
|
||||
|
||||
strPresRels = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">") + strPresRels + strRels0 + strRels1 + strRels2 + strRels3 + _T("</Relationships>");
|
||||
strPresRels = L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">"
|
||||
+ strPresRels + L"</Relationships>";
|
||||
|
||||
std::wstring strPptRels = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("_rels");
|
||||
|
||||
@ -401,7 +418,8 @@ void NSPresentationEditor::CPPTXWriter::WritePresInfo()
|
||||
L"\" cy=\"" + std::to_wstring(m_pDocument->m_oInfo.m_lUnitsHor) + L"\"/>";
|
||||
|
||||
std::wstring strDefaultTextStyle = _T("<p:defaultTextStyle>");
|
||||
if (m_pDocument->m_arThemes.size() > 0)
|
||||
|
||||
if (m_pDocument->m_arThemes.size() > 0)
|
||||
{
|
||||
strDefaultTextStyle += CStylesWriter::ConvertStyles(m_pDocument->m_arThemes[0].m_pStyles[0], m_pDocument->m_oInfo, 9);
|
||||
}
|
||||
@ -416,6 +434,7 @@ void NSPresentationEditor::CPPTXWriter::WritePresInfo()
|
||||
strPres += _T(">");
|
||||
strPres += _T("<p:sldMasterIdLst>") + strPresMasters + _T("</p:sldMasterIdLst>");
|
||||
strPres += strNotesIDs ;
|
||||
strPres += strHandoutIDs ;
|
||||
strPres +=_T("<p:sldIdLst>") + strPresSlides + _T("</p:sldIdLst>");
|
||||
strPres += strSizePres;
|
||||
strPres += strDefaultTextStyle;
|
||||
@ -437,79 +456,73 @@ void NSPresentationEditor::CPPTXWriter::WriteAll()
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("slideLayouts"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("slideLayouts") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("slides"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("slides") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
|
||||
std::wstring strNotesTheme = L"theme" + std::to_wstring((int)m_pDocument->m_arThemes.size() + 1) + L".xml";
|
||||
strNotesTheme = strPptDirectory + _T("theme") + FILE_SEPARATOR_STR + strNotesTheme;
|
||||
|
||||
Writers::DefaultNotesThemeWriter writerNotesTheme;
|
||||
writerNotesTheme.Write( strNotesTheme);
|
||||
|
||||
std::wstring strNotesMaster = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("notesMaster1.xml");
|
||||
Writers::DefaultNotesMasterWriter writerNotesMaster;
|
||||
writerNotesMaster.Write(strNotesMaster);
|
||||
|
||||
std::wstring strNotesMasterRels = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR +_T("_rels");
|
||||
NSDirectory::CreateDirectory(strNotesMasterRels);
|
||||
|
||||
std::wstring strThemeNotesNum = std::to_wstring((int)m_pDocument->m_arThemes.size() + 1);
|
||||
|
||||
std::wstring strVal = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\
|
||||
<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\
|
||||
<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"../theme/theme") + strThemeNotesNum + _T(".xml\"/></Relationships>");
|
||||
|
||||
std::wstring strNotesMasterRelsFile = strNotesMasterRels+ FILE_SEPARATOR_STR + _T("notesMaster1.xml.rels");
|
||||
CFile oFileRels;
|
||||
oFileRels.CreateFile(strNotesMasterRelsFile);
|
||||
oFileRels.WriteStringUTF8(strVal);
|
||||
oFileRels.CloseFile();
|
||||
// -----------------------------------------------------
|
||||
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("slides") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
|
||||
if (m_pDocument->m_pHandoutMaster)
|
||||
{
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("handoutMasters"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
}
|
||||
if (m_pDocument->m_pNotesMaster)
|
||||
{
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
}
|
||||
if (!m_pDocument->m_arNotes.empty())
|
||||
{
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides"));
|
||||
NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides") + FILE_SEPARATOR_STR + _T("_rels"));
|
||||
}
|
||||
WriteThemes();
|
||||
|
||||
WriteSlides();
|
||||
WriteNotes();
|
||||
}
|
||||
|
||||
void NSPresentationEditor::CPPTXWriter::WriteThemes()
|
||||
{
|
||||
std::wstring strPptDirectory = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR ;
|
||||
int nStartLayout = 0, nIndexTheme = 0;
|
||||
|
||||
int nCount = (int)m_pDocument->m_arThemes.size();
|
||||
int nStartLayout = 0;
|
||||
|
||||
for (int nIndexTheme = 0; nIndexTheme < nCount; ++nIndexTheme)
|
||||
for (size_t i = 0; i < m_pDocument->m_arThemes.size(); i++)
|
||||
{
|
||||
CTheme* pTheme = &m_pDocument->m_arThemes[nIndexTheme];
|
||||
|
||||
std::wstring strThemeFile = L"theme" + std::to_wstring(nIndexTheme + 1) + L".xml";
|
||||
strThemeFile = strPptDirectory + _T("theme") + FILE_SEPARATOR_STR + strThemeFile;
|
||||
|
||||
CFile oFile;
|
||||
oFile.CreateFile(strThemeFile);
|
||||
WriteTheme(&m_pDocument->m_arThemes[i], nIndexTheme, nStartLayout, 1);
|
||||
}
|
||||
|
||||
NSPresentationEditor::CStringWriter oStringWriter;
|
||||
WriteTheme(m_pDocument->m_pNotesMaster, nIndexTheme, nStartLayout, 2);
|
||||
WriteTheme(m_pDocument->m_pHandoutMaster, nIndexTheme, nStartLayout, 3);
|
||||
}
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\""));
|
||||
oStringWriter.WriteStringXML(pTheme->m_sThemeName);
|
||||
oStringWriter.WriteString(std::wstring(L"\"><a:themeElements>"));
|
||||
void NSPresentationEditor::CPPTXWriter::WriteTheme(CTheme* pTheme, int & nIndexTheme, int & nStartLayout, int Type)
|
||||
{
|
||||
if (!pTheme) return;
|
||||
|
||||
std::wstring strPptDirectory = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR ;
|
||||
|
||||
WriteColorScheme(oStringWriter, L"Default", pTheme->m_arColorScheme);
|
||||
std::wstring strThemeFile = L"theme" + std::to_wstring(nIndexTheme + 1) + L".xml";
|
||||
strThemeFile = strPptDirectory + _T("theme") + FILE_SEPARATOR_STR + strThemeFile;
|
||||
|
||||
CFile oFile;
|
||||
oFile.CreateFile(strThemeFile);
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"<a:fontScheme name=\"default\"><a:majorFont><a:latin typeface=\""));
|
||||
oStringWriter.WriteStringXML(pTheme->m_arFonts[0].Name);
|
||||
oStringWriter.WriteString(std::wstring(L"\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont>"));
|
||||
NSPresentationEditor::CStringWriter oStringWriter;
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"<a:minorFont><a:latin typeface=\""));
|
||||
|
||||
if (pTheme->m_arFonts.size() >1 ) oStringWriter.WriteString(pTheme->m_arFonts[1].Name);
|
||||
else oStringWriter.WriteStringXML(pTheme->m_arFonts[0].Name);
|
||||
oStringWriter.WriteString(std::wstring(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\""));
|
||||
oStringWriter.WriteStringXML(pTheme->m_sThemeName);
|
||||
oStringWriter.WriteString(std::wstring(L"\"><a:themeElements>"));
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont>"));
|
||||
oStringWriter.WriteString(std::wstring(L"</a:fontScheme>"));
|
||||
WriteColorScheme(oStringWriter, L"Default", pTheme->m_arColorScheme);
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"<a:fontScheme name=\"default\"><a:majorFont><a:latin typeface=\""));
|
||||
oStringWriter.WriteStringXML(pTheme->m_arFonts[0].Name);
|
||||
oStringWriter.WriteString(std::wstring(L"\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont>"));
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"<a:minorFont><a:latin typeface=\""));
|
||||
|
||||
if (pTheme->m_arFonts.size() > 1 ) oStringWriter.WriteString (pTheme->m_arFonts[1].Name);
|
||||
else oStringWriter.WriteStringXML(pTheme->m_arFonts[0].Name);
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont>"));
|
||||
oStringWriter.WriteString(std::wstring(L"</a:fontScheme>"));
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"<a:fmtScheme name=\"Default\">\
|
||||
<a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\">\
|
||||
@ -538,58 +551,67 @@ void NSPresentationEditor::CPPTXWriter::WriteThemes()
|
||||
<a:shade val=\"30000\"/><a:satMod val=\"200000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\">\
|
||||
<a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>"));
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"</a:themeElements><a:objectDefaults/>"));
|
||||
oStringWriter.WriteString(std::wstring(L"<a:extraClrSchemeLst>"));
|
||||
oStringWriter.WriteString(std::wstring(L"</a:themeElements><a:objectDefaults/>"));
|
||||
oStringWriter.WriteString(std::wstring(L"<a:extraClrSchemeLst>"));
|
||||
|
||||
for (size_t i = 0 ; i < pTheme->m_arExtraColorScheme.size(); i++)
|
||||
{
|
||||
std::wstring str = L" " + std::to_wstring(i + 1);
|
||||
WriteColorScheme(oStringWriter, pTheme->m_sThemeName + str, pTheme->m_arExtraColorScheme[i], true); //extra
|
||||
}
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"</a:extraClrSchemeLst>"));
|
||||
oStringWriter.WriteString(std::wstring(L"</a:theme>"));
|
||||
|
||||
oFile.WriteStringUTF8(oStringWriter.GetData());
|
||||
oFile.CloseFile();
|
||||
|
||||
CRelsGenerator oRels(&m_oManager);
|
||||
int nCountLayouts = (int)pTheme->m_arLayouts.size();
|
||||
oRels.StartMaster(nIndexTheme, nStartLayout, nCountLayouts);
|
||||
|
||||
for (int i = 0 ; i < pTheme->m_arExtraColorScheme.size(); i++)
|
||||
{
|
||||
std::wstring str = L" " + std::to_wstring(i + 1);
|
||||
WriteColorScheme(oStringWriter, pTheme->m_sThemeName + str, pTheme->m_arExtraColorScheme[i], true); //extra
|
||||
}
|
||||
|
||||
oStringWriter.WriteString(std::wstring(L"</a:extraClrSchemeLst>"));
|
||||
oStringWriter.WriteString(std::wstring(L"</a:theme>"));
|
||||
CStringWriter oWriter;
|
||||
oWriter.WriteString(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>");
|
||||
|
||||
if (Type == 1)
|
||||
{
|
||||
oWriter.WriteString(L"<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">");
|
||||
}
|
||||
else if (Type == 2)
|
||||
{
|
||||
oWriter.WriteString(L"<p:notesMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">");
|
||||
}
|
||||
else if (Type == 3)
|
||||
{
|
||||
oWriter.WriteString(L"<p:handoutMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">");
|
||||
}
|
||||
oWriter.WriteString(L"<p:cSld>");
|
||||
|
||||
oFile.WriteStringUTF8(oStringWriter.GetData());
|
||||
oFile.CloseFile();
|
||||
|
||||
// теперь masterslide
|
||||
CRelsGenerator oRels(&m_oManager);
|
||||
int nCountLayouts = (int)pTheme->m_arLayouts.size();
|
||||
|
||||
oRels.StartMaster(nIndexTheme, nStartLayout, nCountLayouts);
|
||||
|
||||
CStringWriter oWriter;
|
||||
std::wstring str1 = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\
|
||||
<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\
|
||||
<p:cSld>");
|
||||
oWriter.WriteString(str1);
|
||||
|
||||
if (pTheme->m_bIsBackground)
|
||||
{
|
||||
WriteBackground(oWriter, oRels, pTheme->m_oBackground);
|
||||
}
|
||||
std::wstring strElems = _T("<p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr>\
|
||||
if (pTheme->m_bIsBackground)
|
||||
{
|
||||
WriteBackground(oWriter, oRels, pTheme->m_oBackground);
|
||||
}
|
||||
oWriter.WriteString(L"<p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr>\
|
||||
<a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr>");
|
||||
oWriter.WriteString(strElems);
|
||||
|
||||
size_t nElements = pTheme->m_arElements.size();
|
||||
for (size_t nEl = 0; nEl < nElements; ++nEl)
|
||||
{
|
||||
if (isBodyPlaceholder(pTheme->m_arElements[nEl]->m_lPlaceholderType))
|
||||
pTheme->m_arElements[nEl]->m_lPlaceholderType =100; //body тип прописывать !!
|
||||
for (size_t nEl = 0; nEl < pTheme->m_arElements.size(); ++nEl)
|
||||
{
|
||||
if (isBodyPlaceholder(pTheme->m_arElements[nEl]->m_lPlaceholderType))
|
||||
pTheme->m_arElements[nEl]->m_lPlaceholderType =100; //body тип прописывать !!
|
||||
|
||||
if (pTheme->m_arElements[nEl]->m_bBoundsEnabled == false)
|
||||
continue;
|
||||
|
||||
WriteElement(oWriter, oRels, pTheme->m_arElements[nEl]);
|
||||
}
|
||||
if (pTheme->m_arElements[nEl]->m_bBoundsEnabled == false)
|
||||
continue;
|
||||
|
||||
WriteElement(oWriter, oRels, pTheme->m_arElements[nEl]);
|
||||
}
|
||||
|
||||
oWriter.WriteString(std::wstring(L"</p:spTree></p:cSld>"));
|
||||
oWriter.WriteString(std::wstring(L"</p:spTree></p:cSld>"));
|
||||
|
||||
std::wstring strOverrideColorScheme = _T("<p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>");
|
||||
oWriter.WriteString(strOverrideColorScheme);
|
||||
std::wstring strOverrideColorScheme = _T("<p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>");
|
||||
oWriter.WriteString(strOverrideColorScheme);
|
||||
|
||||
if (Type == 1)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"<p:sldLayoutIdLst>"));
|
||||
|
||||
size_t __nCountLayouts = 0;
|
||||
@ -601,17 +623,19 @@ void NSPresentationEditor::CPPTXWriter::WriteThemes()
|
||||
}
|
||||
|
||||
oWriter.WriteString(std::wstring(L"</p:sldLayoutIdLst>"));
|
||||
}
|
||||
|
||||
if (pTheme->m_bHasDate || pTheme->m_bHasFooter || pTheme->m_bHasSlideNumber)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"<p:hf"));
|
||||
if (!pTheme->m_bHasDate) oWriter.WriteString(std::wstring(L" dt=\"0\""));
|
||||
if (!pTheme->m_bHasSlideNumber) oWriter.WriteString(std::wstring(L" sldNum=\"0\""));
|
||||
oWriter.WriteString(std::wstring(L" hdr=\"0\""));
|
||||
if (!pTheme->m_bHasFooter) oWriter.WriteString(std::wstring(L" ftr=\"0\""));
|
||||
oWriter.WriteString(std::wstring(L"/>"));
|
||||
}
|
||||
|
||||
if (pTheme->m_bHasDate || pTheme->m_bHasFooter || pTheme->m_bHasSlideNumber)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"<p:hf"));
|
||||
if (!pTheme->m_bHasDate) oWriter.WriteString(std::wstring(L" dt=\"0\""));
|
||||
if (!pTheme->m_bHasSlideNumber) oWriter.WriteString(std::wstring(L" sldNum=\"0\""));
|
||||
oWriter.WriteString(std::wstring(L" hdr=\"0\""));
|
||||
if (!pTheme->m_bHasFooter) oWriter.WriteString(std::wstring(L" ftr=\"0\""));
|
||||
oWriter.WriteString(std::wstring(L"/>"));
|
||||
}
|
||||
if (Type == 1)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"<p:txStyles>"));
|
||||
|
||||
oWriter.WriteString(std::wstring(L"<p:titleStyle>"));
|
||||
@ -626,25 +650,57 @@ void NSPresentationEditor::CPPTXWriter::WriteThemes()
|
||||
CStylesWriter::ConvertStyles(pTheme->m_pStyles[3], pTheme->m_oInfo, oWriter, 9);
|
||||
oWriter.WriteString(std::wstring(L"</p:otherStyle>"));
|
||||
|
||||
oWriter.WriteString(std::wstring(L"</p:txStyles></p:sldMaster>"));
|
||||
|
||||
std::wstring strSlideMasterFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml";
|
||||
strSlideMasterFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + strSlideMasterFile;
|
||||
|
||||
oFile.CreateFile(strSlideMasterFile);
|
||||
std::wstring strMaster = oWriter.GetData();
|
||||
oFile.WriteStringUTF8(strMaster);
|
||||
oFile.CloseFile();
|
||||
|
||||
oRels.CloseRels();
|
||||
|
||||
std::wstring strSlideMasterRelsFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml.rels";
|
||||
strSlideMasterRelsFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile;
|
||||
|
||||
oRels.SaveRels(strSlideMasterRelsFile);
|
||||
|
||||
nStartLayout += nCountLayouts;
|
||||
oWriter.WriteString(std::wstring(L"</p:txStyles>"));
|
||||
}
|
||||
else if (Type == 2)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"<p:notesStyle>"));
|
||||
CStylesWriter::ConvertStyles(pTheme->m_pStyles[1], pTheme->m_oInfo, oWriter, 9);
|
||||
oWriter.WriteString(std::wstring(L"</p:notesStyle>"));
|
||||
}
|
||||
|
||||
std::wstring strSlideMasterFile;
|
||||
std::wstring strSlideMasterRelsFile;
|
||||
if (Type == 1)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"</p:sldMaster>"));
|
||||
|
||||
strSlideMasterFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml";
|
||||
strSlideMasterFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + strSlideMasterFile;
|
||||
|
||||
strSlideMasterRelsFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml.rels";
|
||||
strSlideMasterRelsFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile;
|
||||
}
|
||||
else if (Type == 2)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"</p:notesMaster>"));
|
||||
|
||||
strSlideMasterFile = L"notesMaster1.xml";
|
||||
strSlideMasterFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + strSlideMasterFile;
|
||||
|
||||
strSlideMasterRelsFile = L"notesMaster1.xml.rels";
|
||||
strSlideMasterRelsFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile;
|
||||
}
|
||||
else if (Type == 3)
|
||||
{
|
||||
oWriter.WriteString(std::wstring(L"</p:handoutMaster>"));
|
||||
|
||||
strSlideMasterFile = L"handoutMaster1.xml";
|
||||
strSlideMasterFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + strSlideMasterFile;
|
||||
|
||||
strSlideMasterRelsFile = L"handoutMaster1.xml.rels";
|
||||
strSlideMasterRelsFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile;
|
||||
}
|
||||
oFile.CreateFile(strSlideMasterFile);
|
||||
std::wstring strMaster = oWriter.GetData();
|
||||
oFile.WriteStringUTF8(strMaster);
|
||||
oFile.CloseFile();
|
||||
|
||||
oRels.CloseRels();
|
||||
oRels.SaveRels(strSlideMasterRelsFile);
|
||||
|
||||
nStartLayout += nCountLayouts;
|
||||
nIndexTheme++;
|
||||
}
|
||||
|
||||
void NSPresentationEditor::CPPTXWriter::WriteColorScheme(CStringWriter& oStringWriter, const std::wstring & name, const std::vector<CColor> & colors, bool extra)
|
||||
@ -826,14 +882,14 @@ void NSPresentationEditor::CPPTXWriter::WriteSlide(int nIndexSlide)
|
||||
CSlide* pSlide = m_pDocument->m_arSlides[nIndexSlide];
|
||||
|
||||
if (0 == pSlide->m_lThemeID)
|
||||
oRels.StartSlide(pSlide->m_lLayoutID, nIndexSlide);
|
||||
oRels.StartSlide(pSlide->m_lLayoutID, pSlide->m_lNotesID);
|
||||
else
|
||||
{
|
||||
int nLayout = pSlide->m_lLayoutID;
|
||||
for (int i = 0; i < pSlide->m_lThemeID; ++i)
|
||||
nLayout += (int)m_pDocument->m_arThemes[i].m_arLayouts.size();
|
||||
|
||||
oRels.StartSlide(nLayout, nIndexSlide);
|
||||
oRels.StartSlide(nLayout, pSlide->m_lNotesID);
|
||||
}
|
||||
|
||||
oWriter.WriteString(std::wstring(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"));
|
||||
@ -881,15 +937,66 @@ void NSPresentationEditor::CPPTXWriter::WriteSlide(int nIndexSlide)
|
||||
strFile = L"slide" + std::to_wstring(nIndexSlide + 1) + L".xml.rels";
|
||||
oRels.SaveRels(strFileSlidePath + _T("_rels") + FILE_SEPARATOR_STR + strFile);
|
||||
}
|
||||
void NSPresentationEditor::CPPTXWriter::WriteNotes(int nIndexNotes)
|
||||
{
|
||||
CStringWriter oWriter;
|
||||
CRelsGenerator oRels(&m_oManager);
|
||||
|
||||
CSlide* pNotes = m_pDocument->m_arNotes[nIndexNotes];
|
||||
|
||||
oRels.StartNotes(pNotes->m_lSlideID, m_pDocument->m_pNotesMaster != NULL);
|
||||
|
||||
oWriter.WriteString(std::wstring(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"));
|
||||
oWriter.WriteString(std::wstring(L"<p:notes xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\""));
|
||||
if (!pNotes->m_bShowMasterShapes)
|
||||
oWriter.WriteString(std::wstring(L" showMasterSp=\"0\""));
|
||||
oWriter.WriteString(std::wstring(L">"));
|
||||
|
||||
oWriter.WriteString(std::wstring(L"<p:cSld>"));
|
||||
|
||||
if (pNotes->m_bIsBackground)
|
||||
{
|
||||
WriteBackground(oWriter, oRels, pNotes->m_oBackground);
|
||||
}
|
||||
|
||||
oWriter.WriteString(std::wstring(L"<p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr>\
|
||||
<a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr>"));
|
||||
|
||||
for (size_t nEl = 0; nEl < pNotes->m_arElements.size(); ++nEl)
|
||||
{
|
||||
WriteElement(oWriter, oRels, pNotes->m_arElements[nEl], NULL);
|
||||
}
|
||||
oWriter.WriteString(std::wstring(L"</p:spTree></p:cSld>"));
|
||||
|
||||
oWriter.WriteString(std::wstring(L"<p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>"));
|
||||
oWriter.WriteString(std::wstring(L"</p:notes>"));
|
||||
|
||||
oRels.CloseRels();
|
||||
|
||||
std::wstring strXml = oWriter.GetData();
|
||||
std::wstring strFile = L"notesSlide" + std::to_wstring(nIndexNotes + 1) + L".xml";
|
||||
std::wstring strFileSlidePath = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("notesSlides") + FILE_SEPARATOR_STR;
|
||||
|
||||
CFile oFile;
|
||||
oFile.CreateFile(strFileSlidePath + strFile);
|
||||
oFile.WriteStringUTF8(strXml);
|
||||
oFile.CloseFile();
|
||||
|
||||
strFile = L"notesSlide" + std::to_wstring(nIndexNotes + 1) + L".xml.rels";
|
||||
oRels.SaveRels(strFileSlidePath + _T("_rels") + FILE_SEPARATOR_STR + strFile);
|
||||
}
|
||||
|
||||
void NSPresentationEditor::CPPTXWriter::WriteSlides()
|
||||
{
|
||||
size_t nCountSlides = m_pDocument->m_arSlides.size();
|
||||
|
||||
for (size_t nIndexS = 0; nIndexS < nCountSlides; ++nIndexS)
|
||||
for (size_t nIndexS = 0; nIndexS < m_pDocument->m_arSlides.size(); ++nIndexS)
|
||||
{
|
||||
CRelsGenerator::StartNotes((int)nIndexS, m_strTempDirectory, m_pDocument->m_arSlides[nIndexS]->m_strComment);
|
||||
WriteSlide((int)nIndexS);
|
||||
}
|
||||
}
|
||||
void NSPresentationEditor::CPPTXWriter::WriteNotes()
|
||||
{
|
||||
for (size_t nIndexS = 0; nIndexS < m_pDocument->m_arNotes.size(); ++nIndexS)
|
||||
{
|
||||
WriteNotes((int)nIndexS);
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,8 +54,6 @@ namespace NSPresentationEditor
|
||||
|
||||
CShapeWriter* m_pShapeWriter;
|
||||
|
||||
|
||||
public:
|
||||
CPPTXWriter();
|
||||
~CPPTXWriter();
|
||||
|
||||
@ -74,9 +72,12 @@ namespace NSPresentationEditor
|
||||
void WritePresInfo ();
|
||||
void WriteAll ();
|
||||
void WriteThemes ();
|
||||
void WriteTheme (CTheme* pTheme, int & nIndexTheme, int & nStartLayout, int Type = 1);
|
||||
void WriteSlides ();
|
||||
void WriteNotes ();
|
||||
void WriteLayout (CLayout& oLayout, int nIndexLayout, int nStartLayout, int nIndexTheme);
|
||||
void WriteSlide (int nIndexSlide);
|
||||
void WriteNotes (int nIndexNotes);
|
||||
|
||||
void WriteColorScheme (CStringWriter& oWriter, const std::wstring & name, const std::vector<CColor> & colors, bool extra = false);
|
||||
void WriteBackground (CStringWriter& oWriter, CRelsGenerator& oRels, CBrush& oBackground);
|
||||
|
||||
@ -170,12 +170,11 @@ namespace NSPresentationEditor
|
||||
|
||||
m_oWriter.WriteString(str1);
|
||||
|
||||
int nCurrent = nStartLayoutIndex;
|
||||
for (int i = 0; i < nCountLayouts; ++i)
|
||||
{
|
||||
std::wstring str = L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout"
|
||||
+ std::to_wstring(nCurrent + 1) + L".xml\"/>";
|
||||
++nCurrent;
|
||||
+ std::to_wstring(nStartLayoutIndex + 1) + L".xml\"/>";
|
||||
nStartLayoutIndex++;
|
||||
m_oWriter.WriteString(str);
|
||||
}
|
||||
|
||||
@ -196,7 +195,23 @@ namespace NSPresentationEditor
|
||||
|
||||
m_oWriter.WriteString(str);
|
||||
}
|
||||
inline void StartSlide(int nIndexLayout, int nIndexSlide)
|
||||
inline void StartNotes(int nIndexSlide, bool bMaster)
|
||||
{
|
||||
m_oWriter.WriteString(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\
|
||||
<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
|
||||
if (bMaster)
|
||||
{
|
||||
m_oWriter.WriteString(L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
|
||||
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster\" Target=\"../notesMasters/notesMaster1.xml\"/>");
|
||||
}
|
||||
if (nIndexSlide >= 0)
|
||||
{
|
||||
m_oWriter.WriteString(L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
|
||||
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide\" Target=\"../slides/slide"
|
||||
+ std::to_wstring(nIndexSlide + 1) + L".xml\"/>");
|
||||
}
|
||||
}
|
||||
inline void StartSlide(int nIndexLayout, int nIndexNotes)
|
||||
{
|
||||
m_oWriter.WriteString(L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\
|
||||
<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
|
||||
@ -204,51 +219,14 @@ namespace NSPresentationEditor
|
||||
m_oWriter.WriteString(L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout"
|
||||
+ std::to_wstring(nIndexLayout + 1) + L".xml\"/>");
|
||||
|
||||
m_oWriter.WriteString(L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
|
||||
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide\" Target=\"../notesSlides/notesSlide"
|
||||
+ std::to_wstring(nIndexSlide + 1) + L".xml\"/>");
|
||||
if (nIndexNotes >= 0)
|
||||
{
|
||||
m_oWriter.WriteString(L"<Relationship Id=\"rId" + std::to_wstring(m_lNextRelsID++) +
|
||||
L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide\" Target=\"../notesSlides/notesSlide"
|
||||
+ std::to_wstring(nIndexNotes + 1) + L".xml\"/>");
|
||||
}
|
||||
}
|
||||
static inline void StartNotes(int nIndexSlide, std::wstring strDirectory, std::wstring strComment)
|
||||
{
|
||||
std::wstring sNum = std::to_wstring( nIndexSlide + 1);
|
||||
|
||||
std::wstring strNoteSlideRels = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\
|
||||
<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\
|
||||
<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide\" Target=\"../slides/slide") + sNum + _T(".xml\"/>\
|
||||
<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster\" Target=\"../notesMasters/notesMaster1.xml\"/>\
|
||||
</Relationships>");
|
||||
|
||||
std::wstring strNoteRels = strDirectory + FILE_SEPARATOR_STR + _T("ppt") +
|
||||
+ FILE_SEPARATOR_STR + _T("notesSlides")
|
||||
+ FILE_SEPARATOR_STR + _T("_rels")
|
||||
+ FILE_SEPARATOR_STR + _T("notesSlide") + sNum + _T(".xml.rels");
|
||||
CFile oFile;
|
||||
oFile.CreateFile(strNoteRels);
|
||||
oFile.WriteStringUTF8(strNoteSlideRels);
|
||||
oFile.CloseFile();
|
||||
|
||||
std::wstring strNoteSlide = strDirectory + FILE_SEPARATOR_STR + _T("ppt") +
|
||||
+ FILE_SEPARATOR_STR + _T("notesSlides")
|
||||
+ FILE_SEPARATOR_STR + _T("notesSlide") + sNum + _T(".xml");
|
||||
oFile.CreateFile(strNoteSlide);
|
||||
|
||||
std::wstring strW1 = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\
|
||||
<p:notes xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\
|
||||
<p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/>\
|
||||
<a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id=\"100000\" name=\"\"/>\
|
||||
<p:cNvSpPr><a:spLocks noGrp=\"1\" noChangeArrowheads=\"1\"/></p:cNvSpPr><p:nvPr><p:ph type=\"body\" idx=\"1\"/></p:nvPr></p:nvSpPr><p:spPr/>\
|
||||
<p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr smtClean=\"0\"/><a:t>");
|
||||
std::wstring strW2 = _T("</a:t></a:r><a:endParaRPr/></a:p></p:txBody></p:sp></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:notes>");
|
||||
|
||||
CorrectXmlString(strComment);
|
||||
|
||||
oFile.WriteStringUTF8(strW1);
|
||||
oFile.WriteStringUTF8(strComment);
|
||||
oFile.WriteStringUTF8(strW2);
|
||||
|
||||
oFile.CloseFile();
|
||||
}
|
||||
inline void CloseRels()
|
||||
inline void CloseRels()
|
||||
{
|
||||
std::wstring str = _T("</Relationships>");
|
||||
m_oWriter.WriteString(str);
|
||||
|
||||
@ -68,9 +68,6 @@ void CStylesWriter::ConvertStyleLevel(NSPresentationEditor::CTextStyleLevel& oLe
|
||||
{
|
||||
std::wstring strProp = std::to_wstring(pPF->leftMargin.get());
|
||||
oWriter.WriteString(L" marL=\"" + strProp + L"\"");
|
||||
|
||||
if (pPF->indent.is_init() == false)
|
||||
pPF->indent = (LONG)0;
|
||||
}
|
||||
if (pPF->indent.is_init())
|
||||
{
|
||||
@ -296,21 +293,79 @@ NSPresentationEditor::CShapeWriter::CShapeWriter()
|
||||
m_pImageElement = NULL;
|
||||
m_pShapeElement = NULL;
|
||||
}
|
||||
std::wstring NSPresentationEditor::CShapeWriter::ConvertLine(CPen & pen)
|
||||
std::wstring NSPresentationEditor::CShapeWriter::ConvertLine(CPen & pen)
|
||||
{
|
||||
NSPresentationEditor::CStringWriter line_writer;
|
||||
|
||||
std::wstring str = std::to_wstring( (int)(pen.Size * 36000));
|
||||
line_writer.WriteString(L"<a:ln w=\"" + str + L"\">");
|
||||
std::wstring strL;
|
||||
switch(pen.LineStyle)
|
||||
{
|
||||
case 1: strL = L" cmpd=\"dbl\""; break;
|
||||
case 2: strL = L" cmpd=\"thickThin\""; break;
|
||||
case 3: strL = L" cmpd=\"thinThick\""; break;
|
||||
case 4: strL = L" cmpd=\"tri\""; break;
|
||||
}
|
||||
line_writer.WriteString(L"<a:ln w=\"" + std::to_wstring((int)(pen.Size * 36000)) + L"\"" + strL + L">");
|
||||
|
||||
line_writer.WriteString(L"<a:solidFill>");
|
||||
line_writer.WriteString(ConvertColor(pen.Color, pen.Alpha));
|
||||
line_writer.WriteString(L"</a:solidFill>");
|
||||
|
||||
line_writer.WriteString(L"<a:round/><a:headEnd/><a:tailEnd/></a:ln>");
|
||||
switch(pen.DashStyle)
|
||||
{
|
||||
case 1: line_writer.WriteString(L"<a:prstDash val=\"sysDash\"/>"); break;
|
||||
case 2: line_writer.WriteString(L"<a:prstDash val=\"sysDot\"/>"); break;
|
||||
case 3: line_writer.WriteString(L"<a:prstDash val=\"sysDashDot\"/>"); break;
|
||||
case 4: line_writer.WriteString(L"<a:prstDash val=\"sysDashDotDot\"/>"); break;
|
||||
case 5: line_writer.WriteString(L"<a:prstDash val=\"dot\"/>"); break;
|
||||
case 6: line_writer.WriteString(L"<a:prstDash val=\"dash\"/>"); break;
|
||||
case 7: line_writer.WriteString(L"<a:prstDash val=\"lgDash\"/>"); break;
|
||||
case 8: line_writer.WriteString(L"<a:prstDash val=\"dashDot\"/>"); break;
|
||||
case 9: line_writer.WriteString(L"<a:prstDash val=\"lgDashDot\"/>"); break;
|
||||
case 10:line_writer.WriteString(L"<a:prstDash val=\"lgDashDotDot\"/>"); break;
|
||||
}
|
||||
switch(pen.LineJoin)
|
||||
{
|
||||
case 0: line_writer.WriteString(L"<a:bevel/>"); break;
|
||||
case 1: line_writer.WriteString(L"<a:miter/>"); break;
|
||||
case 2: line_writer.WriteString(L"<a:round/>"); break;
|
||||
}
|
||||
|
||||
line_writer.WriteString(L"<a:headEnd" + ConvertLineEnd(pen.LineStartCap, pen.LineStartLength, pen.LineStartWidth) + L"/>");
|
||||
line_writer.WriteString(L"<a:tailEnd" + ConvertLineEnd(pen.LineEndCap, pen.LineEndLength, pen.LineEndWidth) + L"/>");
|
||||
|
||||
line_writer.WriteString(L"</a:ln>");
|
||||
|
||||
return line_writer.GetData();
|
||||
}
|
||||
std::wstring NSPresentationEditor::CShapeWriter::ConvertLineEnd(unsigned char cap, unsigned char length, unsigned char width)
|
||||
{
|
||||
if (cap < 1) return L"";
|
||||
|
||||
std::wstring sResult;
|
||||
|
||||
switch(cap)
|
||||
{
|
||||
case 1: sResult += L" type=\"triangle\""; break;
|
||||
case 2: sResult += L" type=\"stealth\""; break;
|
||||
case 3: sResult += L" type=\"diamond\""; break;
|
||||
case 4: sResult += L" type=\"oval\""; break;
|
||||
case 5: sResult += L" type=\"arrow\""; break;
|
||||
}
|
||||
switch(length)
|
||||
{
|
||||
case 0: sResult += L" len=\"sm\""; break;
|
||||
case 1: sResult += L" len=\"med\""; break;
|
||||
case 2: sResult += L" len=\"lg\""; break;
|
||||
}
|
||||
switch(width)
|
||||
{
|
||||
case 0: sResult += L" w=\"sm\""; break;
|
||||
case 1: sResult += L" w=\"med\""; break;
|
||||
case 2: sResult += L" w=\"lg\""; break;
|
||||
}
|
||||
return sResult;
|
||||
}
|
||||
std::wstring NSPresentationEditor::CShapeWriter::ConvertBrush(CBrush & brush)
|
||||
{
|
||||
NSPresentationEditor::CStringWriter brush_writer;
|
||||
@ -798,11 +853,7 @@ void NSPresentationEditor::CShapeWriter::WriteTextInfo()
|
||||
if (pPF->leftMargin.is_init())
|
||||
{
|
||||
std::wstring strProp = std::to_wstring( pPF->leftMargin.get() );
|
||||
m_oWriter.WriteString(L" marL=\"" + strProp + L"\"");
|
||||
|
||||
if (pPF->indent.is_init() == false)
|
||||
pPF->indent = (LONG)0;
|
||||
|
||||
m_oWriter.WriteString(L" marL=\"" + strProp + L"\"");
|
||||
}
|
||||
if (pPF->indent.is_init())
|
||||
{
|
||||
|
||||
@ -213,6 +213,7 @@ namespace NSPresentationEditor
|
||||
std::wstring ConvertShadow (CShadow & shadow);
|
||||
std::wstring ConvertBrush (CBrush & brush);
|
||||
static std::wstring ConvertColor (CColor & color, long alpha);
|
||||
std::wstring ConvertLineEnd(unsigned char cap, unsigned char length, unsigned char width);
|
||||
// тип рендерера-----------------------------------------------------------------------------
|
||||
virtual HRESULT get_Type(LONG* lType) ;
|
||||
//-------- Функции для работы со страницей --------------------------------------------------
|
||||
|
||||
@ -52,8 +52,11 @@ CPPTUserInfo::CPPTUserInfo() : CDocument(),
|
||||
m_pDocumentInfo = NULL;
|
||||
m_lIndexThisUser = -1;
|
||||
|
||||
m_nWriteSlideTimeOffset = 0.0;
|
||||
m_nWriteSlideTime = 0.0;
|
||||
m_pNotesMasterWrapper = NULL;
|
||||
m_pHandoutMasterWrapper = NULL;
|
||||
|
||||
m_nWriteSlideTimeOffset = 0.0;
|
||||
m_nWriteSlideTime = 0.0;
|
||||
|
||||
m_strFileDirectory = _T("");
|
||||
m_bIsSetupEmpty = false;
|
||||
@ -90,6 +93,21 @@ void CPPTUserInfo::Clear()
|
||||
m_mapMasters.clear();
|
||||
m_arrMastersOrder.clear();
|
||||
|
||||
for (std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapNotesMasters.begin(); pPair != m_mapNotesMasters.end(); ++pPair)
|
||||
{
|
||||
RELEASEINTERFACE(pPair->second);
|
||||
}
|
||||
m_mapNotesMasters.clear();
|
||||
|
||||
for (std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapHandoutMasters.begin(); pPair != m_mapHandoutMasters.end(); ++pPair)
|
||||
{
|
||||
RELEASEINTERFACE(pPair->second);
|
||||
}
|
||||
m_mapHandoutMasters.clear();
|
||||
|
||||
RELEASEOBJECT(m_pNotesMasterWrapper);
|
||||
RELEASEOBJECT(m_pHandoutMasterWrapper);
|
||||
|
||||
for (std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapNotes.begin(); pPair != m_mapNotes.end(); ++pPair)
|
||||
{
|
||||
RELEASEINTERFACE(pPair->second);
|
||||
@ -97,11 +115,10 @@ void CPPTUserInfo::Clear()
|
||||
m_mapNotes.clear();
|
||||
m_arrNotesOrder.clear();
|
||||
|
||||
|
||||
m_oExMedia.Clear();
|
||||
m_arrFonts.clear();
|
||||
|
||||
for (int nIndex = 0; nIndex < m_mapAnimations.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < m_mapAnimations.size(); ++nIndex)
|
||||
{
|
||||
RELEASEOBJECT ( m_mapAnimations[nIndex]);
|
||||
}
|
||||
@ -148,13 +165,15 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
|
||||
|
||||
Clear();
|
||||
|
||||
std::map<DWORD, DWORD>::iterator nIndexPsrRef;
|
||||
|
||||
for (size_t index = 0; index < m_oDocument.m_arMasterPersists.size(); ++index)
|
||||
{
|
||||
std::map<DWORD, DWORD>::iterator nPsrRef = m_mapOffsetInPIDs.find(m_oDocument.m_arMasterPersists[index].m_nPsrRef);
|
||||
nIndexPsrRef = m_mapOffsetInPIDs.find(m_oDocument.m_arMasterPersists[index].m_nPsrRef);
|
||||
|
||||
if (nPsrRef != m_mapOffsetInPIDs.end())
|
||||
if (nIndexPsrRef != m_mapOffsetInPIDs.end())
|
||||
{
|
||||
long offset = (long)nPsrRef->second;
|
||||
long offset = (long)nIndexPsrRef->second;
|
||||
|
||||
StreamUtils::StreamSeek(offset, pStream);
|
||||
|
||||
@ -173,10 +192,9 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
|
||||
}
|
||||
m_arrMastersOrder.push_back(m_oDocument.m_arMasterPersists[index].m_nSlideID);
|
||||
}
|
||||
|
||||
for (size_t index = 0; index < m_oDocument.m_arNotePersists.size(); ++index)
|
||||
{
|
||||
std::map<DWORD, DWORD>::iterator nIndexPsrRef = m_mapOffsetInPIDs.find(m_oDocument.m_arNotePersists[index].m_nPsrRef);
|
||||
nIndexPsrRef = m_mapOffsetInPIDs.find(m_oDocument.m_arNotePersists[index].m_nPsrRef);
|
||||
|
||||
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
|
||||
{
|
||||
@ -201,7 +219,7 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
|
||||
|
||||
for (size_t index = 0; index < m_oDocument.m_arSlidePersists.size(); ++index)
|
||||
{
|
||||
std::map<DWORD, DWORD>::iterator nIndexPsrRef = m_mapOffsetInPIDs.find(m_oDocument.m_arSlidePersists[index].m_nPsrRef);
|
||||
nIndexPsrRef = m_mapOffsetInPIDs.find(m_oDocument.m_arSlidePersists[index].m_nPsrRef);
|
||||
|
||||
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
|
||||
{
|
||||
@ -239,7 +257,47 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
|
||||
}
|
||||
m_arrSlidesOrder.push_back(m_oDocument.m_arSlidePersists[index].m_nSlideID);
|
||||
}
|
||||
std::vector<CRecordDocumentAtom*> oArrayDoc;
|
||||
m_oDocument.GetRecordsByType(&oArrayDoc, true, true);
|
||||
|
||||
if (!oArrayDoc.empty())
|
||||
{
|
||||
nIndexPsrRef = m_mapOffsetInPIDs.find(oArrayDoc[0]->m_nNotesMasterPersistIDRef);
|
||||
|
||||
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
|
||||
{
|
||||
long offset = (long)nIndexPsrRef->second;
|
||||
|
||||
StreamUtils::StreamSeek(offset, pStream);
|
||||
|
||||
oHeader.ReadFromStream(pStream);
|
||||
|
||||
CRecordSlide* pSlide = new CRecordSlide();
|
||||
pSlide->ReadFromStream(oHeader, pStream);
|
||||
pSlide->m_oPersist.m_nPsrRef = oArrayDoc[0]->m_nNotesMasterPersistIDRef;
|
||||
pSlide->m_Index = 0;
|
||||
|
||||
m_mapNotesMasters.insert( std::pair<DWORD, CRecordSlide*>(0, pSlide ));
|
||||
}
|
||||
nIndexPsrRef = m_mapOffsetInPIDs.find(oArrayDoc[0]->m_nHandoutMasterPersistIDRef);
|
||||
|
||||
if (m_mapOffsetInPIDs.end() != nIndexPsrRef)
|
||||
{
|
||||
long offset = (long)nIndexPsrRef->second;
|
||||
|
||||
StreamUtils::StreamSeek(offset, pStream);
|
||||
|
||||
oHeader.ReadFromStream(pStream);
|
||||
|
||||
CRecordSlide* pSlide = new CRecordSlide();
|
||||
pSlide->ReadFromStream(oHeader, pStream);
|
||||
pSlide->m_oPersist.m_nPsrRef = oArrayDoc[0]->m_nHandoutMasterPersistIDRef;
|
||||
pSlide->m_Index = 0;
|
||||
|
||||
m_mapHandoutMasters.insert( std::pair<DWORD, CRecordSlide*>(0, pSlide ));
|
||||
}
|
||||
}
|
||||
//--------------------------------------------------------------------------------------------
|
||||
// так... теперь берем всю инфу о ExObject -----------------------------
|
||||
m_oExMedia.m_strPresentationDirectory = strFolderMem;
|
||||
m_oExMedia.m_strSourceDirectory = m_strFileDirectory;
|
||||
@ -271,7 +329,7 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
|
||||
std::vector<CRecordFontEntityAtom*> oArrayFonts;
|
||||
m_oDocument.GetRecordsByType(&oArrayFonts, true);
|
||||
|
||||
for (int nIndex = 0; nIndex < oArrayFonts.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayFonts.size(); ++nIndex)
|
||||
{
|
||||
CFont oFont;
|
||||
oFont.Name = oArrayFonts[nIndex]->m_strFaceName;
|
||||
@ -371,7 +429,7 @@ void CPPTUserInfo::FromDocument()
|
||||
double DurationSlide = PPT_DEFAULT_SLIDE_DURATION;
|
||||
|
||||
m_arSlides.reserve(m_arrSlidesOrder.size());
|
||||
for (int i=0; i< m_arrSlidesOrder.size(); i++)
|
||||
for (size_t i = 0; i < m_arrSlidesOrder.size(); i++)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapSlides.find(m_arrSlidesOrder[i]);
|
||||
|
||||
@ -382,12 +440,10 @@ void CPPTUserInfo::FromDocument()
|
||||
|
||||
DurationSlide = PPT_DEFAULT_SLIDE_DURATION;
|
||||
|
||||
CSlide *elm = new CSlide();
|
||||
m_arSlides.push_back(elm);
|
||||
// тут его заполняем...
|
||||
m_arSlides.push_back(new CSlide());
|
||||
|
||||
// если на слайде есть анимации
|
||||
std::map <DWORD, Animations::CSlideTimeLine*>::iterator pTimeLine = m_mapAnimations.find( pPair->first);
|
||||
std::map <DWORD, Animations::CSlideTimeLine*>::iterator pTimeLine = m_mapAnimations.find( pPair->first);
|
||||
|
||||
if ( m_mapAnimations.end() != pTimeLine )
|
||||
{
|
||||
@ -409,12 +465,196 @@ void CPPTUserInfo::FromDocument()
|
||||
pSlide->m_lWidth = (LONG)(c_dMasterUnitsToMillimetreKoef * lOriginWidth);
|
||||
pSlide->m_lHeight = (LONG)(c_dMasterUnitsToMillimetreKoef * lOriginHeight);
|
||||
|
||||
LoadSlide ( pPair->first, m_arSlides.back());
|
||||
LoadSlide ( pPair->first, pSlide);
|
||||
}
|
||||
|
||||
m_arNotes.reserve(m_arrNotesOrder.size());
|
||||
for (size_t i = 0; i< m_arrNotesOrder.size(); i++)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapNotes.find(m_arrNotesOrder[i]);
|
||||
|
||||
if (pPair == m_mapNotes.end())
|
||||
continue;
|
||||
|
||||
LoadNotesFromPrevUsers ( pPair->first );
|
||||
|
||||
DurationSlide = PPT_DEFAULT_SLIDE_DURATION;
|
||||
|
||||
m_arNotes.push_back(new CSlide());
|
||||
|
||||
CSlide* pSlide = m_arNotes.back();
|
||||
|
||||
pSlide->m_lOriginalWidth = lOriginWidth;
|
||||
pSlide->m_lOriginalHeight = lOriginHeight;
|
||||
|
||||
pSlide->m_lWidth = (LONG)(c_dMasterUnitsToMillimetreKoef * lOriginWidth);
|
||||
pSlide->m_lHeight = (LONG)(c_dMasterUnitsToMillimetreKoef * lOriginHeight);
|
||||
|
||||
LoadNotes ( pPair->first, pSlide);
|
||||
}
|
||||
|
||||
CalculateEditor(m_oInfo);
|
||||
}
|
||||
|
||||
void CPPTUserInfo::LoadNotes(DWORD dwNoteID, CSlide* pNotes)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPairNotes = m_mapNotes.find(dwNoteID);
|
||||
|
||||
if (pPairNotes == m_mapNotes.end()) return;
|
||||
|
||||
CRecordSlide* pRecordSlide = pPairNotes->second;
|
||||
|
||||
if (NULL == pRecordSlide) return;
|
||||
|
||||
pNotes->m_bUseLayoutColorScheme = true;
|
||||
|
||||
CSlideInfo slide_info;
|
||||
m_arNotesWrapper.push_back(slide_info);
|
||||
|
||||
CSlideInfo* pNotesWrapper = &m_arNotesWrapper.back();
|
||||
|
||||
int indexUser = pRecordSlide->m_IndexUser;
|
||||
|
||||
pNotesWrapper->m_parEmptyPictures = &m_pDocumentInfo->m_arUsers[indexUser]->m_arOffsetPictures;
|
||||
pNotesWrapper->m_mapFilePictures = &m_pDocumentInfo->m_mapStoreImageFile;
|
||||
|
||||
//грузим placeholder
|
||||
pNotesWrapper->m_arTextPlaceHolders = pRecordSlide->m_oPersist.m_arTextAttrs;
|
||||
|
||||
std::vector<CRecordNotesAtom*> oArrayNotesAtoms;
|
||||
pRecordSlide->GetRecordsByType(&oArrayNotesAtoms, false, true);
|
||||
if (0 == oArrayNotesAtoms.size())
|
||||
{
|
||||
// ошибка!!!
|
||||
return;
|
||||
}
|
||||
bool bMasterColorScheme = oArrayNotesAtoms[0]->m_bMasterScheme;
|
||||
bool bMasterBackGround = oArrayNotesAtoms[0]->m_bMasterBackground;
|
||||
bool bMasterObjects = oArrayNotesAtoms[0]->m_bMasterObjects;
|
||||
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPairSlide = m_mapSlides.find(oArrayNotesAtoms[0]->m_nSlideIDRef);
|
||||
|
||||
if (pPairSlide == m_mapSlides.end())
|
||||
{
|
||||
//????? у заметок нет слайда !!!
|
||||
}
|
||||
//-----------------------------------------------------
|
||||
CSlide* pSlide = m_arSlides[pPairSlide->second->m_Index];
|
||||
|
||||
pNotes->m_lSlideID = pPairSlide->second->m_Index;
|
||||
pSlide->m_lNotesID = m_arNotes.size() - 1;
|
||||
//-----------------------------------------------------
|
||||
|
||||
CTheme * pTheme = m_pNotesMaster;
|
||||
CSlideInfo * pThemeWrapper = m_pNotesMasterWrapper;
|
||||
|
||||
CLayout* pLayout = NULL;
|
||||
//-----------------------------------------------------
|
||||
std::vector<NSPresentationEditor::CColor>* pArrayColorScheme = pTheme ? &pTheme->m_arColorScheme : NULL;
|
||||
|
||||
// читаем цветовую схему -----------------------------------------------------------
|
||||
pNotes->m_bUseLayoutColorScheme = true;
|
||||
if (!bMasterColorScheme)
|
||||
{
|
||||
std::vector<CRecordColorSchemeAtom*> oArrayColors;
|
||||
pRecordSlide->GetRecordsByType(&oArrayColors, false);
|
||||
|
||||
for (size_t i = 0; i < oArrayColors.size(); ++i)
|
||||
{
|
||||
if (0x01 == oArrayColors[i]->m_oHeader.RecInstance)
|
||||
{
|
||||
pNotes->m_bUseLayoutColorScheme = false;
|
||||
oArrayColors[i]->ToArray(&pNotes->m_arColorScheme);
|
||||
CorrectColorScheme(pNotes->m_arColorScheme);
|
||||
|
||||
// проверим на совпадение
|
||||
size_t nCountC = pNotes->m_arColorScheme.size();
|
||||
size_t nIndexC = 0;
|
||||
if (pArrayColorScheme && nCountC == pArrayColorScheme->size())
|
||||
{
|
||||
for (; nIndexC < nCountC; ++nIndexC)
|
||||
{
|
||||
if (pNotes->m_arColorScheme[i].IsEqual(pArrayColorScheme->at(i)))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (nIndexC == nCountC)
|
||||
{
|
||||
pNotes->m_bUseLayoutColorScheme = true;
|
||||
pNotes->m_arColorScheme.clear();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------------
|
||||
bool bHasDate = false;
|
||||
bool bHasSlideNumber = false;
|
||||
bool bHasFooter = false;
|
||||
int nFormatDate = 1;
|
||||
|
||||
std::vector<CRecordHeadersFootersContainer*> oArrayHeadersFootersInfo;
|
||||
pRecordSlide->GetRecordsByType(&oArrayHeadersFootersInfo, true, false);
|
||||
|
||||
if (!oArrayHeadersFootersInfo.empty())
|
||||
{
|
||||
if (oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom)
|
||||
{
|
||||
bHasDate = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasDate ||
|
||||
oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate ||
|
||||
oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate;
|
||||
bHasFooter = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasFooter;
|
||||
bHasSlideNumber = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasSlideNumber;
|
||||
|
||||
if (oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate) nFormatDate = 2;
|
||||
}
|
||||
for (int i = 0 ; i < 3; i++)
|
||||
pNotes->m_PlaceholdersReplaceString[i] = oArrayHeadersFootersInfo[0]->m_HeadersFootersString[i];
|
||||
}
|
||||
//------------- читаем все элементы ------------------------------------------------------------------------------------------
|
||||
pNotes->m_bIsBackground = false;
|
||||
|
||||
std::vector<CRecordShapeContainer*> oArrayShapes;
|
||||
pRecordSlide->GetRecordsByType(&oArrayShapes, true);
|
||||
|
||||
for (size_t nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
{
|
||||
IElement* pElement = NULL;
|
||||
|
||||
oArrayShapes[nShape]->GetElement(&pElement, &m_oExMedia, pNotes->m_lOriginalWidth, pNotes->m_lOriginalHeight,
|
||||
pTheme, pLayout, pThemeWrapper, pNotesWrapper, pNotes);
|
||||
|
||||
if (NULL != pElement)
|
||||
{
|
||||
if (pElement->m_bIsBackground && !pElement->m_bHaveAnchor && !bMasterBackGround)
|
||||
{
|
||||
CShapeElement* pShape = dynamic_cast<CShapeElement*>(pElement);
|
||||
if (NULL != pShape)
|
||||
{
|
||||
pShape->SetupProperties(pNotes, pTheme, pLayout);
|
||||
|
||||
pNotes->m_bIsBackground = true;
|
||||
pNotes->m_oBackground = pShape->m_oBrush;
|
||||
}
|
||||
RELEASEOBJECT(pElement);
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
if (pElement->m_bHaveAnchor)
|
||||
{
|
||||
pNotes->m_arElements.push_back(pElement);
|
||||
}
|
||||
if ( pElement->m_lPlaceholderType >0)
|
||||
{
|
||||
pNotes->m_mapPlaceholders.insert(std::pair<int, int>(pElement->m_lPlaceholderType, pNotes->m_arElements.size()-1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide)
|
||||
{
|
||||
@ -562,7 +802,7 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide)
|
||||
std::vector<CRecordColorSchemeAtom*> oArrayColors;
|
||||
pRecordSlide->GetRecordsByType(&oArrayColors, false);
|
||||
|
||||
for (int i = 0; i < oArrayColors.size(); ++i)
|
||||
for (size_t i = 0; i < oArrayColors.size(); ++i)
|
||||
{
|
||||
if (0x01 == oArrayColors[i]->m_oHeader.RecInstance)
|
||||
{
|
||||
@ -573,7 +813,7 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide)
|
||||
// проверим на совпадение
|
||||
size_t nCountC = pSlide->m_arColorScheme.size();
|
||||
size_t nIndexC = 0;
|
||||
if (nCountC == pArrayColorScheme->size())
|
||||
if (pArrayColorScheme && nCountC == pArrayColorScheme->size())
|
||||
{
|
||||
for (; nIndexC < nCountC; ++nIndexC)
|
||||
{
|
||||
@ -628,7 +868,7 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide)
|
||||
std::vector<CRecordCString*> oArrayStrings;
|
||||
pRecordSlide->GetRecordsByType(&oArrayStrings, false, false);
|
||||
|
||||
for (int i=0; i < oArrayStrings.size(); i++)
|
||||
for (size_t i = 0; i < oArrayStrings.size(); i++)
|
||||
{
|
||||
if (oArrayStrings[i]->m_oHeader.RecType == 0x0fba)
|
||||
{
|
||||
@ -642,7 +882,7 @@ void CPPTUserInfo::LoadSlide(DWORD dwSlideID, CSlide* pSlide)
|
||||
|
||||
pSlide->m_bIsBackground = false;
|
||||
|
||||
for (int nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
for (size_t nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
{
|
||||
IElement* pElement = NULL;
|
||||
|
||||
@ -1029,7 +1269,8 @@ void CPPTUserInfo::LoadMainMaster(DWORD dwMasterID, const LONG& lOriginWidth, co
|
||||
}
|
||||
std::vector<CRecordCString*> oArrayStrings;
|
||||
pMaster->GetRecordsByType(&oArrayStrings, false, false);
|
||||
for (int i=0; i < oArrayStrings.size(); i++)
|
||||
|
||||
for (size_t i = 0; i < oArrayStrings.size(); i++)
|
||||
{
|
||||
if (oArrayStrings[i]->m_oHeader.RecType == 0x0fba)
|
||||
{
|
||||
@ -1100,7 +1341,7 @@ void CPPTUserInfo::LoadMainMaster(DWORD dwMasterID, const LONG& lOriginWidth, co
|
||||
std::vector<CRecordTextMasterStyleAtom*> oArrayTextMasters;
|
||||
pMaster->GetRecordsByType(&oArrayTextMasters, true, false);
|
||||
|
||||
for (int i = 0; i < oArrayTextMasters.size(); ++i)
|
||||
for (size_t i = 0; i < oArrayTextMasters.size(); ++i)
|
||||
{
|
||||
LONG lType = (LONG)oArrayTextMasters[i]->m_oHeader.RecInstance;
|
||||
if ((0 > lType) || (lType > 8))
|
||||
@ -1142,7 +1383,7 @@ void CPPTUserInfo::LoadMainMaster(DWORD dwMasterID, const LONG& lOriginWidth, co
|
||||
|
||||
CLayout* pLayout = NULL; // ну нету тут разметок ...!!
|
||||
|
||||
for (int nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
for (size_t nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
{
|
||||
NSPresentationEditor::IElement* pElement = NULL;
|
||||
oArrayShapes[nShape]->GetElement(&pElement, &m_oExMedia, lOriginWidth, lOriginHeight, pTheme, pLayout, pMasterWrapper, pMasterWrapper);
|
||||
@ -1177,7 +1418,7 @@ void CPPTUserInfo::LoadMainMaster(DWORD dwMasterID, const LONG& lOriginWidth, co
|
||||
|
||||
void CPPTUserInfo::LoadMasters(const LONG& lOriginWidth, const LONG& lOriginHeight)
|
||||
{
|
||||
for (long i=0; i< m_arrMastersOrder.size(); i++)
|
||||
for (size_t i = 0; i< m_arrMastersOrder.size(); i++)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapMasters.find(m_arrMastersOrder[i]);
|
||||
if (pPair == m_mapMasters.end())continue;
|
||||
@ -1185,15 +1426,244 @@ void CPPTUserInfo::LoadMasters(const LONG& lOriginWidth, const LONG& lOriginHeig
|
||||
LoadMainMaster(pPair->first, lOriginWidth, lOriginHeight);
|
||||
}
|
||||
|
||||
for (long i=0; i< m_arrMastersOrder.size(); i++)
|
||||
for (size_t i = 0; i< m_arrMastersOrder.size(); i++)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapMasters.find(m_arrMastersOrder[i]);
|
||||
if (pPair == m_mapMasters.end())continue;
|
||||
|
||||
LoadNoMainMaster(pPair->first, lOriginWidth, lOriginHeight);
|
||||
}
|
||||
}
|
||||
|
||||
LoadNotesMasterFromPrevUsers(0);
|
||||
if (!m_mapNotesMasters.empty())
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapNotesMasters.begin();
|
||||
|
||||
LoadMaster(pPair->second, m_pNotesMasterWrapper, m_pNotesMaster);
|
||||
}
|
||||
|
||||
LoadHandoutMasterFromPrevUsers(0);
|
||||
if (!m_mapHandoutMasters.empty())
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapHandoutMasters.begin();
|
||||
|
||||
LoadMaster(pPair->second, m_pHandoutMasterWrapper, m_pHandoutMaster);
|
||||
}
|
||||
}
|
||||
void CPPTUserInfo::LoadMaster(CRecordSlide* pMaster, CSlideInfo *& pMasterWrapper, CTheme *& pTheme)
|
||||
{
|
||||
if (pMaster == NULL)
|
||||
return;
|
||||
|
||||
LONG lOriginWidth = 0, lOriginHeight = 0;
|
||||
|
||||
bool bMasterColorScheme = false;
|
||||
bool bMasterBackGround = false;
|
||||
bool bMasterObjects = false;
|
||||
|
||||
DWORD dwID = 0;
|
||||
|
||||
std::vector<CRecordSlideAtom*> oArraySlideAtoms;
|
||||
pMaster->GetRecordsByType(&oArraySlideAtoms, true);
|
||||
|
||||
if (!oArraySlideAtoms.empty())
|
||||
{
|
||||
dwID = (DWORD)oArraySlideAtoms[0]->m_nMasterIDRef;
|
||||
|
||||
bMasterColorScheme = oArraySlideAtoms[0]->m_bMasterScheme;
|
||||
bMasterBackGround = oArraySlideAtoms[0]->m_bMasterBackground;
|
||||
bMasterObjects = oArraySlideAtoms[0]->m_bMasterObjects;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::vector<CRecordNotesAtom*> oArrayNotesAtoms;
|
||||
pMaster->GetRecordsByType(&oArrayNotesAtoms, true);
|
||||
|
||||
if (!oArrayNotesAtoms.empty())
|
||||
{
|
||||
dwID = (DWORD)oArrayNotesAtoms[0]->m_nSlideIDRef;
|
||||
|
||||
bMasterColorScheme = oArrayNotesAtoms[0]->m_bMasterScheme;
|
||||
bMasterBackGround = oArrayNotesAtoms[0]->m_bMasterBackground;
|
||||
bMasterObjects = oArrayNotesAtoms[0]->m_bMasterObjects;
|
||||
}
|
||||
}
|
||||
|
||||
pTheme = new CTheme();
|
||||
|
||||
pTheme->m_lOriginalWidth = lOriginWidth;
|
||||
pTheme->m_lOriginalHeight = lOriginHeight;
|
||||
|
||||
std::vector<CRecordHeadersFootersContainer*> oArrayHeadersFootersInfo;
|
||||
pMaster->GetRecordsByType(&oArrayHeadersFootersInfo, true, false);
|
||||
|
||||
if (0 != oArrayHeadersFootersInfo.size())
|
||||
{
|
||||
if (oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom)
|
||||
{
|
||||
pTheme->m_bHasDate = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasDate ||
|
||||
oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate ||
|
||||
oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate;
|
||||
pTheme->m_bHasFooter = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasFooter;
|
||||
pTheme->m_bHasSlideNumber = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasSlideNumber;
|
||||
|
||||
if (oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate ) pTheme->m_nFormatDate = 2;
|
||||
}
|
||||
for(int i = 0 ; i< 3; i++) pTheme->m_PlaceholdersReplaceString[i] = oArrayHeadersFootersInfo[0]->m_HeadersFootersString[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
pTheme->m_bHasDate = m_bHasDate;
|
||||
pTheme->m_bHasFooter = m_bHasFooter;
|
||||
pTheme->m_bHasSlideNumber = m_bHasSlideNumber;
|
||||
pTheme->m_nFormatDate = m_nFormatDate;
|
||||
for (int i = 0 ; i < 3; i++) pTheme->m_PlaceholdersReplaceString[i] = m_PlaceholdersReplaceString[i];
|
||||
}
|
||||
std::vector<CRecordCString*> oArrayStrings;
|
||||
pMaster->GetRecordsByType(&oArrayStrings, false, false);
|
||||
|
||||
for (size_t i = 0; i < oArrayStrings.size(); i++)
|
||||
{
|
||||
if (oArrayStrings[i]->m_oHeader.RecType == 0x0fba)
|
||||
{
|
||||
pTheme->m_sThemeName = oArrayStrings[i]->m_strText;
|
||||
}
|
||||
}
|
||||
|
||||
pMasterWrapper = new CSlideInfo();
|
||||
|
||||
// записываем шрифты ---------------------------------------------------------------
|
||||
int nCountFonts = m_arrFonts.size();
|
||||
for (int i = 0; i < nCountFonts; ++i)
|
||||
{
|
||||
pTheme->m_arFonts.push_back(m_arrFonts[i]);
|
||||
}
|
||||
// ---------------------------------------------------------------------------------
|
||||
|
||||
// читаем цветовую схему -----------------------------------------------------------
|
||||
std::vector<CRecordColorSchemeAtom*> oArrayColors;
|
||||
pMaster->GetRecordsByType(&oArrayColors, false);
|
||||
|
||||
int nColorCount = oArrayColors.size();
|
||||
for (int i = 0; i < nColorCount; ++i)
|
||||
{
|
||||
if (0x01 == oArrayColors[i]->m_oHeader.RecInstance)
|
||||
{
|
||||
if ( m_oSchemeColors.empty())
|
||||
{
|
||||
oArrayColors[i]->ToArray(&m_oSchemeColors);
|
||||
CorrectColorScheme(m_oSchemeColors);//??
|
||||
}
|
||||
if ( pTheme->m_arColorScheme.empty())
|
||||
{
|
||||
oArrayColors[i]->ToArray(&pTheme->m_arColorScheme);
|
||||
CorrectColorScheme(pTheme->m_arColorScheme);
|
||||
}
|
||||
}
|
||||
|
||||
if (0x06 == oArrayColors[i]->m_oHeader.RecInstance)
|
||||
{
|
||||
std::vector<CColor> extra;
|
||||
oArrayColors[i]->ToArray(&extra);
|
||||
|
||||
CorrectColorScheme(extra);
|
||||
pTheme->m_arExtraColorScheme.push_back(extra);
|
||||
}
|
||||
}
|
||||
if (pTheme->m_arColorScheme.empty() && !pTheme->m_arExtraColorScheme.empty())
|
||||
{
|
||||
pTheme->m_arColorScheme = pTheme->m_arExtraColorScheme[0];
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------
|
||||
int indexUser = 0;
|
||||
//std::map<DWORD, CRecordSlide*>::iterator pPairMaster1 = m_mapMasters.find(dwMasterID);
|
||||
//if (pPairMaster1 != m_mapMasters.end())
|
||||
//{
|
||||
// indexUser = pPairMaster1->second->m_IndexUser;
|
||||
// pMasterWrapper->m_arTextPlaceHolders = pPairMaster1->second->m_oPersist.m_arTextAttrs;
|
||||
//}
|
||||
pMasterWrapper->m_parEmptyPictures = &m_pDocumentInfo->m_arUsers[indexUser]->m_arOffsetPictures;
|
||||
pMasterWrapper->m_mapFilePictures = &m_pDocumentInfo->m_mapStoreImageFile;
|
||||
|
||||
// читаем настройки текстовых стилей -----------------------------------------------
|
||||
std::vector<CRecordTextMasterStyleAtom*> oArrayTextMasters;
|
||||
pMaster->GetRecordsByType(&oArrayTextMasters, true, false);
|
||||
|
||||
for (size_t i = 0; i < oArrayTextMasters.size(); ++i)
|
||||
{
|
||||
LONG lType = (LONG)oArrayTextMasters[i]->m_oHeader.RecInstance;
|
||||
if ((0 > lType) || (lType > 8))
|
||||
continue;
|
||||
|
||||
pMasterWrapper->m_pStyles[lType] = new NSPresentationEditor::CTextStyles();
|
||||
pMasterWrapper->m_pStyles[lType]->SetStyles((NSPresentationEditor::CTextStyles*)oArrayTextMasters[i]);
|
||||
|
||||
CTheme::CalculateStyle(pTheme, pMasterWrapper->m_pStyles[lType].get());
|
||||
}
|
||||
if (pMasterWrapper->m_pStyles[3].is_init())
|
||||
pMasterWrapper->m_pStyles[3]->ApplyBefore(m_oDefaultTextStyle);
|
||||
else
|
||||
pMasterWrapper->m_pStyles[3] = m_oDefaultTextStyle;
|
||||
|
||||
CTextStyles oPPTDefaultStyle;
|
||||
CreateDefaultStyle(oPPTDefaultStyle, pTheme);
|
||||
oPPTDefaultStyle.ApplyAfter(m_oDefaultTextStyle);
|
||||
|
||||
// выставим стили теме
|
||||
pTheme->m_pStyles[0] = oPPTDefaultStyle;
|
||||
pTheme->m_pStyles[1] = oPPTDefaultStyle;
|
||||
pTheme->m_pStyles[2] = oPPTDefaultStyle;
|
||||
pTheme->m_pStyles[3] = oPPTDefaultStyle;
|
||||
|
||||
if (pMasterWrapper->m_pStyles[0].is_init())
|
||||
pTheme->m_pStyles[1].ApplyAfter(pMasterWrapper->m_pStyles[0].get());
|
||||
if (pMasterWrapper->m_pStyles[1].is_init())
|
||||
pTheme->m_pStyles[2].ApplyAfter(pMasterWrapper->m_pStyles[1].get());
|
||||
if (pMasterWrapper->m_pStyles[2].is_init())
|
||||
pTheme->m_pStyles[3].ApplyAfter(pMasterWrapper->m_pStyles[3].get());
|
||||
|
||||
// ---------------------------------------------------------------------------------
|
||||
// читаем все элементы...-----------------------------------------------------------
|
||||
std::vector<CRecordShapeContainer*> oArrayShapes;
|
||||
pMaster->GetRecordsByType(&oArrayShapes, true);
|
||||
|
||||
pTheme->CalculateStyles();
|
||||
|
||||
CLayout* pLayout = NULL; // ну нету тут разметок ...!!
|
||||
|
||||
for (size_t nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
{
|
||||
NSPresentationEditor::IElement* pElement = NULL;
|
||||
oArrayShapes[nShape]->GetElement(&pElement, &m_oExMedia, lOriginWidth, lOriginHeight, pTheme, pLayout, pMasterWrapper, pMasterWrapper);
|
||||
|
||||
if (NULL != pElement)
|
||||
{
|
||||
//AddAnimation ( dwMasterID, lOriginWidth, lOriginHeight, pElement );
|
||||
|
||||
if (pElement->m_bIsBackground && !pElement->m_bHaveAnchor)
|
||||
{
|
||||
CShapeElement* pShape = dynamic_cast<CShapeElement*>(pElement);
|
||||
if (NULL != pShape)
|
||||
{
|
||||
pShape->SetupProperties(NULL, pTheme, pLayout);
|
||||
|
||||
pTheme->m_bIsBackground = true;
|
||||
pTheme->m_oBackground = pShape->m_oBrush;
|
||||
}
|
||||
|
||||
RELEASEINTERFACE(pElement);
|
||||
continue;
|
||||
}
|
||||
pTheme->m_arElements.push_back(pElement);
|
||||
|
||||
if ( pElement->m_lPlaceholderType > 0)
|
||||
{
|
||||
pTheme->m_mapPlaceholders.insert(std::pair<int, int>(pElement->m_lPlaceholderType, pTheme->m_arElements.size()-1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void CPPTUserInfo::LoadNoMainMaster(DWORD dwMasterID, const LONG& lOriginWidth, const LONG& lOriginHeight)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapMasters.find(dwMasterID);
|
||||
@ -1266,10 +1736,10 @@ void CPPTUserInfo::LoadNoMainMaster(DWORD dwMasterID, const LONG& lOriginWidth,
|
||||
|
||||
CLayout* pLayout = NULL;
|
||||
|
||||
int lLayoutID = AddNewLayout(pTheme, pCurMaster, false, false);
|
||||
int lLayoutID = AddNewLayout(pTheme, pCurMaster, false, false);
|
||||
|
||||
pLayout = &pTheme->m_arLayouts[lLayoutID];
|
||||
pLayout->m_bShowMasterShapes = false;
|
||||
pLayout->m_bShowMasterShapes = false;
|
||||
|
||||
pTheme->m_mapTitleLayout[dwMasterID] = lLayoutID;
|
||||
|
||||
@ -1281,7 +1751,7 @@ void CPPTUserInfo::LoadNoMainMaster(DWORD dwMasterID, const LONG& lOriginWidth,
|
||||
pCurMaster->GetRecordsByType(&oArrayColors, false);
|
||||
|
||||
pLayout->m_arColorScheme.clear();
|
||||
for (int i = 0; i < oArrayColors.size(); ++i)
|
||||
for (size_t i = 0; i < oArrayColors.size(); ++i)
|
||||
{
|
||||
if (0x01 == oArrayColors[i]->m_oHeader.RecInstance)
|
||||
{
|
||||
@ -1292,7 +1762,7 @@ void CPPTUserInfo::LoadNoMainMaster(DWORD dwMasterID, const LONG& lOriginWidth,
|
||||
// проверим на совпадение
|
||||
size_t nCountC = pLayout->m_arColorScheme.size();
|
||||
size_t nIndexC = 0;
|
||||
if (nCountC == pArrayColorScheme->size())
|
||||
if (pArrayColorScheme && nCountC == pArrayColorScheme->size())
|
||||
{
|
||||
for (; nIndexC < nCountC; ++nIndexC)
|
||||
{
|
||||
@ -1341,7 +1811,7 @@ void CPPTUserInfo::LoadNoMainMaster(DWORD dwMasterID, const LONG& lOriginWidth,
|
||||
std::vector<CRecordCString*> oArrayStrings;
|
||||
pCurMaster->GetRecordsByType(&oArrayStrings, false, false);
|
||||
|
||||
for (int i=0; i < oArrayStrings.size(); i++)
|
||||
for (size_t i = 0; i < oArrayStrings.size(); i++)
|
||||
{
|
||||
if (oArrayStrings[i]->m_oHeader.RecType == 0x0fba)
|
||||
{
|
||||
@ -1352,7 +1822,7 @@ void CPPTUserInfo::LoadNoMainMaster(DWORD dwMasterID, const LONG& lOriginWidth,
|
||||
std::vector<CRecordShapeContainer*> oArrayShapes;
|
||||
pCurMaster->GetRecordsByType(&oArrayShapes, true);
|
||||
|
||||
for (int nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
for (size_t nShape = 0; nShape < oArrayShapes.size(); ++nShape)
|
||||
{
|
||||
IElement* pElement = NULL;
|
||||
oArrayShapes[nShape]->GetElement(&pElement, &m_oExMedia, lOriginWidth, lOriginHeight, pTheme, pLayout, pThemeWrapper, pMasterWrapper);
|
||||
@ -1467,7 +1937,7 @@ void CPPTUserInfo::LoadMasterFromPrevUsers(DWORD dwMasterID)
|
||||
|
||||
size_t lUsersCount = m_pDocumentInfo->m_arUsers.size();
|
||||
|
||||
for (int lIndexUser = m_lIndexThisUser + 1; lIndexUser < lUsersCount; ++lIndexUser)
|
||||
for (size_t lIndexUser = m_lIndexThisUser + 1; lIndexUser < lUsersCount; ++lIndexUser)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapMasters.find(dwMasterID);
|
||||
|
||||
@ -1496,23 +1966,21 @@ void CPPTUserInfo::LoadMasterFromPrevUsers(DWORD dwMasterID)
|
||||
}
|
||||
}
|
||||
}
|
||||
void CPPTUserInfo::LoadNoteFromPrevUsers(DWORD dwSlideID)
|
||||
void CPPTUserInfo::LoadNotesFromPrevUsers(DWORD dwSlideID)
|
||||
{
|
||||
if ((NULL == m_pDocumentInfo) || (-1 == m_lIndexThisUser))
|
||||
return;
|
||||
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_mapNotes.find(dwSlideID);
|
||||
if (pPair != m_mapNotes.end())
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPairSlide = m_mapNotes.find(dwSlideID);
|
||||
|
||||
if (pPairSlide != m_mapNotes.end() && pPairSlide->second)
|
||||
return; //есть
|
||||
|
||||
|
||||
size_t lUsersCount = m_pDocumentInfo->m_arUsers.size();
|
||||
|
||||
// у нас чем раньше - тем больше индекс
|
||||
for (size_t lIndexUser = m_lIndexThisUser + 1; lIndexUser < lUsersCount; lIndexUser++)
|
||||
//for (size_t lIndexUser = lUsersCount - 1; lIndexUser > m_lIndexThisUser; lIndexUser--)
|
||||
{
|
||||
pPair = m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapNotes.find(dwSlideID);
|
||||
|
||||
for (size_t lIndexUser = m_lIndexThisUser + 1; lIndexUser < lUsersCount; ++lIndexUser)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapNotes.find(dwSlideID);
|
||||
if (pPair == m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapNotes.end())
|
||||
continue;
|
||||
|
||||
@ -1520,13 +1988,103 @@ void CPPTUserInfo::LoadNoteFromPrevUsers(DWORD dwSlideID)
|
||||
if (NULL != pSlideCur)
|
||||
{
|
||||
pSlideCur->AddRef();
|
||||
m_mapNotes.insert(std::pair<DWORD, CRecordSlide*>(dwSlideID, pSlideCur));
|
||||
m_arrNotesOrder.push_back(dwSlideID);
|
||||
|
||||
pSlideCur->m_IndexUser = lIndexUser;
|
||||
|
||||
if (pPairSlide != m_mapNotes.end())
|
||||
{
|
||||
pPairSlide->second = pSlideCur;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_mapNotes.insert(m_mapSlides.end(), std::pair<DWORD, CRecordSlide*>(dwSlideID, pSlideCur));
|
||||
m_arrNotesOrder.push_back(dwSlideID);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CPPTUserInfo::LoadNotesMasterFromPrevUsers(DWORD dwMasterID)
|
||||
{
|
||||
if ((NULL == m_pDocumentInfo) || (-1 == m_lIndexThisUser))
|
||||
return;
|
||||
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPairMaster = m_mapNotesMasters.find(dwMasterID);
|
||||
|
||||
if (pPairMaster != m_mapNotesMasters.end() && pPairMaster->second)
|
||||
return;//есть
|
||||
|
||||
size_t lUsersCount = m_pDocumentInfo->m_arUsers.size();
|
||||
|
||||
for (size_t lIndexUser = m_lIndexThisUser + 1; lIndexUser < lUsersCount; ++lIndexUser)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapNotesMasters.find(dwMasterID);
|
||||
|
||||
if (pPair == m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapNotesMasters.end())
|
||||
continue;
|
||||
|
||||
CRecordSlide* pSlideCur = pPair->second;
|
||||
if (NULL != pSlideCur)
|
||||
{
|
||||
pSlideCur->AddRef();
|
||||
|
||||
//для каждого пользователя СВОИ активные картинки !!!
|
||||
pSlideCur->m_IndexUser = lIndexUser;
|
||||
|
||||
if (pPairMaster != m_mapNotesMasters.end())
|
||||
{
|
||||
//был найден ранее нулевым
|
||||
pPairMaster->second = pSlideCur;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_mapNotesMasters.insert(m_mapNotesMasters.end(), std::pair<DWORD, CRecordSlide*>(dwMasterID, pSlideCur));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
void CPPTUserInfo::LoadHandoutMasterFromPrevUsers(DWORD dwMasterID)
|
||||
{
|
||||
if ((NULL == m_pDocumentInfo) || (-1 == m_lIndexThisUser))
|
||||
return;
|
||||
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPairMaster = m_mapHandoutMasters.find(dwMasterID);
|
||||
|
||||
if (pPairMaster != m_mapHandoutMasters.end() && pPairMaster->second)
|
||||
return;//есть
|
||||
|
||||
size_t lUsersCount = m_pDocumentInfo->m_arUsers.size();
|
||||
|
||||
for (size_t lIndexUser = m_lIndexThisUser + 1; lIndexUser < lUsersCount; ++lIndexUser)
|
||||
{
|
||||
std::map<DWORD, CRecordSlide*>::iterator pPair = m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapHandoutMasters.find(dwMasterID);
|
||||
|
||||
if (pPair == m_pDocumentInfo->m_arUsers[lIndexUser]->m_mapHandoutMasters.end())
|
||||
continue;
|
||||
|
||||
CRecordSlide* pSlideCur = pPair->second;
|
||||
if (NULL != pSlideCur)
|
||||
{
|
||||
pSlideCur->AddRef();
|
||||
|
||||
//для каждого пользователя СВОИ активные картинки !!!
|
||||
pSlideCur->m_IndexUser = lIndexUser;
|
||||
|
||||
if (pPairMaster != m_mapHandoutMasters.end())
|
||||
{
|
||||
//был найден ранее нулевым
|
||||
pPairMaster->second = pSlideCur;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_mapHandoutMasters.insert(m_mapHandoutMasters.end(), std::pair<DWORD, CRecordSlide*>(dwMasterID, pSlideCur));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects)
|
||||
{
|
||||
// читаем SoundCollection
|
||||
@ -1569,7 +2127,7 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects)
|
||||
std::vector<CRecordExVideoContainer*> oArray;
|
||||
pExObjects->GetRecordsByType(&oArray, true);
|
||||
|
||||
for (int nIndex = 0; nIndex < oArray.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArray.size(); ++nIndex)
|
||||
{
|
||||
LoadExVideo(oArray[nIndex]);
|
||||
}
|
||||
@ -1588,15 +2146,15 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects)
|
||||
pExObjects->GetRecordsByType(&oArrayWAVLink , true);
|
||||
pExObjects->GetRecordsByType(&oArrayAudioEmbedded , true);
|
||||
|
||||
for (int nIndex = 0; nIndex < oArrayAudioMIDI.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayAudioMIDI.size(); ++nIndex)
|
||||
{
|
||||
LoadExAudio(oArrayAudioMIDI[nIndex]);
|
||||
}
|
||||
for (int nIndex = 0; nIndex < oArrayWAVLink.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayWAVLink.size(); ++nIndex)
|
||||
{
|
||||
LoadExAudio(oArrayWAVLink[nIndex]);
|
||||
}
|
||||
for (int nIndex = 0; nIndex < oArrayAudioEmbedded.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayAudioEmbedded.size(); ++nIndex)
|
||||
{
|
||||
DWORD dwKeySound = oArrayAudioEmbedded[nIndex]->m_nSoundID;
|
||||
DWORD dwKeyObj = oArrayAudioEmbedded[nIndex]->m_oMedia.m_nExObjID;
|
||||
@ -1613,7 +2171,7 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects)
|
||||
m_oExMedia.m_arAudios.push_back(oAudio);
|
||||
}
|
||||
}
|
||||
for (int nIndex = 0; nIndex < oArrayAudioCD.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayAudioCD.size(); ++nIndex)
|
||||
{
|
||||
DWORD dwKeyObj = oArrayAudioCD[nIndex]->m_oMedia.m_nExObjID;
|
||||
|
||||
@ -1633,7 +2191,7 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects)
|
||||
|
||||
pExObjects->GetRecordsByType(&oArrayHyperlinkContainer , true);
|
||||
|
||||
for (int nIndex = 0; nIndex < oArrayHyperlinkContainer.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayHyperlinkContainer.size(); ++nIndex)
|
||||
{
|
||||
std::vector<CRecordExHyperlinkAtom*> oArrayHyperlink;
|
||||
std::vector<CRecordCString*> oArrayCString;
|
||||
@ -1645,8 +2203,8 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects)
|
||||
{
|
||||
NSPresentationEditor::CExFilesInfo oInfo;
|
||||
|
||||
oInfo.m_dwID = oArrayHyperlink[0]->m_nHyperlinkID;
|
||||
for (int i = 0 ; i < oArrayCString.size(); i++)
|
||||
oInfo.m_dwID = oArrayHyperlink[0]->m_nHyperlinkID;
|
||||
for (size_t i = 0 ; i < oArrayCString.size(); i++)
|
||||
{
|
||||
if (oArrayCString[i]->m_oHeader.RecInstance == 1)
|
||||
oInfo.m_strFilePath = oArrayCString[i]->m_strText;
|
||||
|
||||
@ -47,12 +47,13 @@ public:
|
||||
std::map<DWORD, DWORD> m_mapOffsetInPIDs;
|
||||
CRecordDocument m_oDocument;
|
||||
|
||||
//todooo при переходе на C++11 использовать НУЖНЫЙ здесь unsorted_map - m_arr .. Order уберутся
|
||||
|
||||
std::map<DWORD, CRecordSlide*> m_mapSlides;
|
||||
std::map<DWORD, CRecordSlide*> m_mapMasters;
|
||||
std::map<DWORD, CRecordSlide*> m_mapNotes;
|
||||
|
||||
std::map<DWORD, CRecordSlide*> m_mapNotesMasters;
|
||||
std::map<DWORD, CRecordSlide*> m_mapHandoutMasters;
|
||||
|
||||
std::vector<DWORD> m_arrSlidesOrder;
|
||||
std::vector<DWORD> m_arrMastersOrder;
|
||||
std::vector<DWORD> m_arrNotesOrder;
|
||||
@ -66,6 +67,10 @@ public:
|
||||
// это как бы ППT-шная обертка над слайдом
|
||||
std::vector<CSlideInfo> m_arSlideWrapper;
|
||||
std::vector<CSlideInfo> m_arMasterWrapper;
|
||||
std::vector<CSlideInfo> m_arNotesWrapper;
|
||||
|
||||
CSlideInfo* m_pNotesMasterWrapper;
|
||||
CSlideInfo* m_pHandoutMasterWrapper;
|
||||
|
||||
// эти параметры - одни на весь документ.
|
||||
// чтобы поддержать нашу схему (пптх) - копируем их в темы
|
||||
@ -106,8 +111,8 @@ public:
|
||||
nullable<WORD> m_wLanguage; // язык пользователя (редактора)
|
||||
bool m_bRtl;
|
||||
bool m_bShowComments;
|
||||
public:
|
||||
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
CPPTUserInfo();
|
||||
~CPPTUserInfo();
|
||||
|
||||
@ -119,15 +124,20 @@ public:
|
||||
void NormalizeCoords(long lWidth, long lHeight);
|
||||
|
||||
void LoadSlide(DWORD dwSlideID, CSlide* pSlide);
|
||||
void LoadNotes(DWORD dwNotesID, CSlide* pSlide);
|
||||
|
||||
void LoadMasters(const LONG& lOriginWidth, const LONG& lOriginHeight);
|
||||
|
||||
void LoadNoMainMaster (DWORD dwMasterID, const LONG& lOriginWidth, const LONG& lOriginHeight);
|
||||
void LoadMainMaster (DWORD dwMasterID, const LONG& lOriginWidth, const LONG& lOriginHeight);
|
||||
|
||||
void LoadMaster(CRecordSlide* pMaster, CSlideInfo *& pMasterWrapper, CTheme *& pTheme);
|
||||
|
||||
void LoadSlideFromPrevUsers (DWORD dwSlideID);
|
||||
void LoadMasterFromPrevUsers(DWORD dwSlideID);
|
||||
void LoadNoteFromPrevUsers (DWORD dwSlideID);
|
||||
void LoadSlideFromPrevUsers (DWORD dwSlideID);
|
||||
void LoadMasterFromPrevUsers (DWORD dwSlideID);
|
||||
void LoadNotesFromPrevUsers (DWORD dwSlideID);
|
||||
void LoadNotesMasterFromPrevUsers (DWORD dwSlideID);
|
||||
void LoadHandoutMasterFromPrevUsers (DWORD dwSlideID);
|
||||
|
||||
void LoadExternal(CRecordExObjListContainer* pExObjects);
|
||||
|
||||
@ -169,7 +179,6 @@ public:
|
||||
|
||||
oScheme = oArrayMem;
|
||||
}
|
||||
|
||||
|
||||
std::wstring ConvertLayoutType(INT nGeom, BYTE* pPlaceholders)
|
||||
{
|
||||
@ -287,6 +296,7 @@ public:
|
||||
return _T("blank");
|
||||
}
|
||||
|
||||
|
||||
void AddAnimation (DWORD dwSlideID, double Width, double Height, IElement* pElement);
|
||||
void AddAudioTransition (DWORD dwSlideID, CTransition* pTransition, const std::wstring& strFilePath);
|
||||
|
||||
|
||||
@ -73,10 +73,26 @@ typedef BYTE BOOL1;
|
||||
#define RECORD_TYPE_EXOBJLIST_ATOM 1034
|
||||
#define RECORD_TYPE_PPDRAWING_GROUP 1035
|
||||
#define RECORD_TYPE_PPDRAWING 1036
|
||||
#define RT_RoundTripTheme12Atom 1038
|
||||
#define RT_RoundTripColorMapping12Atom 1039
|
||||
#define RECORD_TYPE_NAMEDSHOWS 1040
|
||||
#define RECORD_TYPE_NAMEDSHOW 1041
|
||||
#define RECORD_TYPE_NAMEDSHOW_SLIDES 1042
|
||||
#define RECORD_TYPE_SHEET_PROPERTIES 1044
|
||||
|
||||
#define RECORD_TYPE_ORIGINALMAINMASTERID 1052
|
||||
#define RECORD_TYPE_COMPOSITEMASTERID 1053
|
||||
#define RECORD_TYPE_ROUNDTRIPCONTENTMASTERINFO12 1054
|
||||
#define RECORD_TYPE_ROUNDTRIPSHAPEID12 1055
|
||||
#define RECORD_TYPE_ROUNDTRIPHFPLACEHOLDER12 1056
|
||||
#define RECORD_TYPE_ROUNDTRIPCONTENTMASTERID 1058
|
||||
#define RECORD_TYPE_ROUNDTRIPOARTTEXTSTYLES12 1059
|
||||
#define RECORD_TYPE_ROUNDTRIPHEADERFOOTERDEFAULTS12ATOM 1060
|
||||
#define RECORD_TYPE_ROUNDTRIPDOCFLAGS12 1061
|
||||
#define RECORD_TYPE_ROUNDTRIPSHAPECHECKSUMFORCUSTOMLAYOUTS12 1062
|
||||
#define RECORD_TYPE_ROUNDTRIPNOTESMASTERTEXTSTYLES12 1063
|
||||
#define RECORD_TYPE_ROUNDTRIPCUSTOMTABLESTYLES12 1064
|
||||
|
||||
#define RECORD_TYPE_LIST 2000
|
||||
#define RECORD_TYPE_FONTCOLLECTION 2005
|
||||
#define RECORD_TYPE_BOOKMARKCOLLECTION 2019
|
||||
@ -182,19 +198,6 @@ typedef BYTE BOOL1;
|
||||
// Records ~12050 seem to be related to Document Encryption
|
||||
#define RECORD_TYPE_DOCUMENT_ENCRYPTION_ATOM 12052
|
||||
|
||||
#define RECORD_TYPE_ORIGINALMAINMASTERID 1052
|
||||
#define RECORD_TYPE_COMPOSITEMASTERID 1053
|
||||
#define RECORD_TYPE_ROUNDTRIPCONTENTMASTERINFO12 1054
|
||||
#define RECORD_TYPE_ROUNDTRIPSHAPEID12 1055
|
||||
#define RECORD_TYPE_ROUNDTRIPHFPLACEHOLDER12 1056
|
||||
#define RECORD_TYPE_ROUNDTRIPCONTENTMASTERID 1058
|
||||
#define RECORD_TYPE_ROUNDTRIPOARTTEXTSTYLES12 1059
|
||||
#define RECORD_TYPE_ROUNDTRIPHEADERFOOTERDEFAULTS12ATOM 1060
|
||||
#define RECORD_TYPE_ROUNDTRIPDOCFLAGS12 1061
|
||||
#define RECORD_TYPE_ROUNDTRIPSHAPECHECKSUMFORCUSTOMLAYOUTS12 1062
|
||||
#define RECORD_TYPE_ROUNDTRIPNOTESMASTERTEXTSTYLES12 1063
|
||||
#define RECORD_TYPE_ROUNDTRIPCUSTOMTABLESTYLES12 1064
|
||||
|
||||
//records greater then 0xF000 belong to with Microsoft Office Drawing format also known as Escher
|
||||
#define RECORD_TYPE_ESCHER_DGG_CONTAINER 0xF000
|
||||
#define RECORD_TYPE_ESCHER_DGG 0xF006
|
||||
@ -398,48 +401,47 @@ static std::string GetRecordName(DWORD dwType)
|
||||
case RECORD_TYPE_ROUNDTRIPNOTESMASTERTEXTSTYLES12 : { strName = ("RoundTripNotesMasterTextStyles12"); break; }
|
||||
case RECORD_TYPE_ROUNDTRIPCUSTOMTABLESTYLES12 : { strName = ("RoundTripCustomTableStyles12"); break; }
|
||||
|
||||
//records greater then 0xF000 belong to with Microsoft Office Drawing format also known as Escher
|
||||
case RECORD_TYPE_ESCHER_DGG_CONTAINER : { strName = ("Escher_DrawingGroupContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_DGG : { strName = ("Escher_DrawingGroupRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLSID : { strName = ("Escher_CLSID_Record"); break; }
|
||||
case RECORD_TYPE_ESCHER_OPT : { strName = ("Escher_OPT"); break; }
|
||||
case RECORD_TYPE_ESCHER_BSTORE_CONTAINER : { strName = ("Escher_BlipStoreContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_BSE : { strName = ("Escher_BlipStoreEntry"); break; }
|
||||
case RECORD_TYPE_ESCHER_BLIP_START : { strName = ("Escher_BlipStart"); break; }
|
||||
case RECORD_TYPE_ESCHER_BLIP_END : { strName = ("Escher_BlipEnd"); break; }
|
||||
case RECORD_TYPE_ESCHER_DG_CONTAINER : { strName = ("Escher_DrawingContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_DG : { strName = ("Escher_DrawingRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_REGROUPITEMS : { strName = ("Escher_RegGroupItems"); break; }
|
||||
case RECORD_TYPE_ESCHER_COLORSCHEME : { strName = ("Escher_ColorSheme"); break; }
|
||||
case RECORD_TYPE_ESCHER_SPGR_CONTAINER : { strName = ("Escher_GroupShapeContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_SP_CONTAINER : { strName = ("Escher_ShapeContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_SPGR : { strName = ("Escher_GroupShapeRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_SP : { strName = ("Escher_ShapeRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_TEXTBOX : { strName = ("Escher_TextBox"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTTEXTBOX : { strName = ("Escher_ClientTextBox"); break; }
|
||||
case RECORD_TYPE_ESCHER_ANCHOR : { strName = ("Escher_Anchor"); break; }
|
||||
case RECORD_TYPE_ESCHER_CHILDANCHOR : { strName = ("Escher_ChildAnchor"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTANCHOR : { strName = ("Escher_ClientAnchor"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTDATA : { strName = ("Escher_ClientData"); break; }
|
||||
case RECORD_TYPE_ESCHER_SOLVERCONTAINER : { strName = ("Escher_SolverContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_CONNECTORRULE : { strName = ("Escher_ConnectorRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_ALIGNRULE : { strName = ("Escher_AlignRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_ARCRULE : { strName = ("Escher_ArcRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTRULE : { strName = ("Escher_ClientRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_CALLOUTRULE : { strName = ("Escher_CallOutRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_SELECTION : { strName = ("Escher_Selection"); break; }
|
||||
case RECORD_TYPE_ESCHER_COLORMRU : { strName = ("Escher_ColorMRU"); break; }
|
||||
case RECORD_TYPE_ESCHER_DELETEDPSPL : { strName = ("Escher_DeletedPSPL"); break; }
|
||||
case RECORD_TYPE_ESCHER_SPLITMENUCOLORS : { strName = ("Escher_SplitMenuColors"); break; }
|
||||
case RECORD_TYPE_ESCHER_OLEOBJECT : { strName = ("Escher_OleObject"); break; }
|
||||
case RECORD_TYPE_ESCHER_SECONDARY_OPT : { strName = ("Escher_SecondaryOPT"); break; }
|
||||
case RECORD_TYPE_ESCHER_TETRIARY_OPT : { strName = ("Escher_TetriaryOPT"); break; }
|
||||
case RECORD_TYPE_ESCHER_DGG_CONTAINER : { strName = ("DrawingGroupContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_DGG : { strName = ("DrawingGroupRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLSID : { strName = ("CLSID_Record"); break; }
|
||||
case RECORD_TYPE_ESCHER_OPT : { strName = ("OPT"); break; }
|
||||
case RECORD_TYPE_ESCHER_BSTORE_CONTAINER : { strName = ("BlipStoreContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_BSE : { strName = ("BlipStoreEntry"); break; }
|
||||
case RECORD_TYPE_ESCHER_BLIP_START : { strName = ("BlipStart"); break; }
|
||||
case RECORD_TYPE_ESCHER_BLIP_END : { strName = ("BlipEnd"); break; }
|
||||
case RECORD_TYPE_ESCHER_DG_CONTAINER : { strName = ("DrawingContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_DG : { strName = ("DrawingRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_REGROUPITEMS : { strName = ("RegGroupItems"); break; }
|
||||
case RECORD_TYPE_ESCHER_COLORSCHEME : { strName = ("ColorSheme"); break; }
|
||||
case RECORD_TYPE_ESCHER_SPGR_CONTAINER : { strName = ("GroupShapeContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_SP_CONTAINER : { strName = ("ShapeContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_SPGR : { strName = ("GroupShapeRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_SP : { strName = ("ShapeRecord"); break; }
|
||||
case RECORD_TYPE_ESCHER_TEXTBOX : { strName = ("TextBox"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTTEXTBOX : { strName = ("ClientTextBox"); break; }
|
||||
case RECORD_TYPE_ESCHER_ANCHOR : { strName = ("Anchor"); break; }
|
||||
case RECORD_TYPE_ESCHER_CHILDANCHOR : { strName = ("ChildAnchor"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTANCHOR : { strName = ("ClientAnchor"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTDATA : { strName = ("ClientData"); break; }
|
||||
case RECORD_TYPE_ESCHER_SOLVERCONTAINER : { strName = ("SolverContainer"); break; }
|
||||
case RECORD_TYPE_ESCHER_CONNECTORRULE : { strName = ("ConnectorRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_ALIGNRULE : { strName = ("AlignRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_ARCRULE : { strName = ("ArcRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_CLIENTRULE : { strName = ("ClientRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_CALLOUTRULE : { strName = ("CallOutRule"); break; }
|
||||
case RECORD_TYPE_ESCHER_SELECTION : { strName = ("Selection"); break; }
|
||||
case RECORD_TYPE_ESCHER_COLORMRU : { strName = ("ColorMRU"); break; }
|
||||
case RECORD_TYPE_ESCHER_DELETEDPSPL : { strName = ("DeletedPSPL"); break; }
|
||||
case RECORD_TYPE_ESCHER_SPLITMENUCOLORS : { strName = ("SplitMenuColors"); break; }
|
||||
case RECORD_TYPE_ESCHER_OLEOBJECT : { strName = ("OleObject"); break; }
|
||||
case RECORD_TYPE_ESCHER_SECONDARY_OPT : { strName = ("SecondaryOPT"); break; }
|
||||
case RECORD_TYPE_ESCHER_TETRIARY_OPT : { strName = ("TetriaryOPT"); break; }
|
||||
default: break;
|
||||
};
|
||||
|
||||
if ((dwType > RECORD_TYPE_ESCHER_BLIP_START) && (dwType < RECORD_TYPE_ESCHER_BLIP_END))
|
||||
{
|
||||
strName = ("Escher_Blip");
|
||||
strName = ("Blip");
|
||||
}
|
||||
|
||||
return strName;
|
||||
|
||||
@ -95,8 +95,8 @@ IRecord* CreateByType(SRecordHeader oHeader)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_DOC_ROUTING_SLIP , CRecordDocRoutingSlipAtom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_EXOBJLIST_ATOM , CRecordExObjListAtom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_UNKNOWN , CRecordGridSpacing10Atom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_UNKNOWN , CRecordRoundTripThemeAtom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_UNKNOWN , CRecordRoundTripColorMappingAtom)
|
||||
CREATE_BY_TYPE(RT_RoundTripTheme12Atom , CRecordRoundTripThemeAtom)
|
||||
CREATE_BY_TYPE(RT_RoundTripColorMapping12Atom , CRecordRoundTripColorMappingAtom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_NAMEDSHOW_SLIDES , CRecordNamedShowSlidesAtom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_SHEET_PROPERTIES , CRecordNormalViewSetInfoAtom)
|
||||
|
||||
@ -109,10 +109,10 @@ IRecord* CreateByType(SRecordHeader oHeader)
|
||||
CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPHFPLACEHOLDER12 , CRecordRoundTripHFPlaceholder12Atom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPCONTENTMASTERID , CRecordRoundTripContentMasterId12Atom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPOARTTEXTSTYLES12 , CRecordRoundTripOArtTextStyles12Atom)
|
||||
CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPHEADERFOOTERDEFAULTS12ATOM , CRecordRoundTripHeaderFooterDefaults12Atom)
|
||||
CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPHEADERFOOTERDEFAULTS12ATOM , CRecordRoundTripHeaderFooterDefaults12Atom)
|
||||
CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPNOTESMASTERTEXTSTYLES12 , CRecordRoundTripNotesMasterTextStyles12Atom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPDOCFLAGS12 , CRecordRoundTripDocFlags12Atom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPSHAPECHECKSUMFORCUSTOMLAYOUTS12 , CRecordRoundTripShapeCheckSumForCustomLayouts12Atom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPNOTESMASTERTEXTSTYLES12 , CRecordRoundTripNotesMasterTextStyles12Atom)
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPCUSTOMTABLESTYLES12 , CRecordRoundTripCustomTableStyles12Atom)
|
||||
|
||||
//CREATE_BY_TYPE(RECORD_TYPE_BOOKMARK_SEED_ATOM , CRecordBookmarkSeedAtom)
|
||||
|
||||
@ -182,7 +182,7 @@ public:
|
||||
return;
|
||||
|
||||
// возвращаем указатели, их не удалять наверху!!!!
|
||||
for (int nIndex = 0; nIndex < m_arRecords.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < m_arRecords.size(); ++nIndex)
|
||||
{
|
||||
T pRec = dynamic_cast<T>(m_arRecords[nIndex]);
|
||||
if (NULL != pRec)
|
||||
|
||||
@ -85,7 +85,6 @@ public:
|
||||
std::map<int, std::wstring>* m_mapFilePictures;
|
||||
nullable_base<NSPresentationEditor::CTextStyles> m_pStyles[9];
|
||||
|
||||
public:
|
||||
CSlideInfo()
|
||||
{
|
||||
}
|
||||
|
||||
@ -206,7 +206,7 @@ namespace Animations
|
||||
std::vector<std::wstring> arMovePath;
|
||||
boost::algorithm::split(arMovePath, MovePath, boost::algorithm::is_any_of(L" "), boost::algorithm::token_compress_on);
|
||||
|
||||
for (int i = 0 ; i < arMovePath.size(); i++)
|
||||
for (size_t i = 0 ; i < arMovePath.size(); i++)
|
||||
{
|
||||
ActionPoint aPoint;
|
||||
aPoint.TYPE = arMovePath[i++][0];
|
||||
@ -245,7 +245,7 @@ namespace Animations
|
||||
{
|
||||
std::wstring MovePath;
|
||||
|
||||
for ( int i = 0; i < m_Points.size(); ++i )
|
||||
for ( size_t i = 0; i < m_Points.size(); ++i )
|
||||
{
|
||||
std::wstring NextPoint;
|
||||
|
||||
|
||||
@ -39,9 +39,7 @@ public:
|
||||
std::vector<SSlidePersist> m_arNotePersists;
|
||||
std::vector<SSlidePersist> m_arSlidePersists;
|
||||
|
||||
public:
|
||||
|
||||
CRecordDocument() : m_arMasterPersists(), m_arNotePersists(), m_arSlidePersists()
|
||||
CRecordDocument()
|
||||
{
|
||||
}
|
||||
|
||||
@ -52,84 +50,6 @@ public:
|
||||
m_arSlidePersists.clear();
|
||||
}
|
||||
|
||||
/*virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream)
|
||||
{
|
||||
m_oHeader = oHeader;
|
||||
|
||||
m_arMasterPersists.clear();
|
||||
m_arNotePersists.clear();
|
||||
m_arSlidePersists.clear();
|
||||
|
||||
m_arRecords.clear();
|
||||
|
||||
UINT lCurLen = 0;
|
||||
ULONG lReadLen = 0;
|
||||
SRecordHeader oRec;
|
||||
while (lCurLen < m_oHeader.RecLen)
|
||||
{
|
||||
pStream->Read(&oRec, sizeof(oRec), &lReadLen);
|
||||
if (0 >= lReadLen)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (RECORD_TYPE_SLIDELISTWITHTEXT == oRec.RecType)
|
||||
{
|
||||
CRecordSlideListWithText* pAtom = new CRecordSlideListWithText();
|
||||
pAtom->ReadFromStream(oRec, pStream);
|
||||
std::vector<SSlidePersist>* pArray = NULL;
|
||||
|
||||
switch (pAtom->m_Type)
|
||||
{
|
||||
case CRecordSlideListWithText::CollectionOfMasterSlides:
|
||||
{
|
||||
pArray = &m_arMasterPersists;
|
||||
break;
|
||||
}
|
||||
|
||||
case CRecordSlideListWithText::CollectionOfNotesSlides:
|
||||
{
|
||||
pArray = &m_arNotePersists;
|
||||
break;
|
||||
}
|
||||
|
||||
case CRecordSlideListWithText::CollectionOfSlides:
|
||||
{
|
||||
pArray = &m_arSlidePersists;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// этого не может быть...
|
||||
lCurLen += (8 + oRec.RecLen);
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
size_t nCountItems = pAtom->m_arSlides.size();
|
||||
for (size_t index = 0; index < nCountItems; ++index)
|
||||
{
|
||||
SSlidePersist oPersist;
|
||||
oPersist.m_nPsrRef = pAtom->m_arSlides[index]->m_nPsrRef;
|
||||
oPersist.m_nSlideID = pAtom->m_arSlides[index]->m_nSlideID;
|
||||
|
||||
oPersist.m_arTextAttrs += pAtom->m_arTextPlaceHolders[index];
|
||||
|
||||
pArray->Add(oPersist);
|
||||
}
|
||||
|
||||
delete pAtom;
|
||||
}
|
||||
else
|
||||
{
|
||||
IRecord* pRecord = CreateByType(oRec);
|
||||
pRecord->ReadFromStream(oRec, pStream);
|
||||
m_arRecords.Add(pRecord);
|
||||
}
|
||||
lCurLen += (8 + oRec.RecLen);
|
||||
}
|
||||
}*/
|
||||
|
||||
virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream)
|
||||
{
|
||||
m_oHeader = oHeader;
|
||||
@ -145,31 +65,26 @@ public:
|
||||
std::vector<CRecordSlideListWithText*> oArraySlideWithText;
|
||||
this->GetRecordsByType(&oArraySlideWithText, true, false);
|
||||
|
||||
for (int nIndexList = 0; nIndexList < oArraySlideWithText.size(); ++nIndexList)
|
||||
for (size_t nIndexList = 0; nIndexList < oArraySlideWithText.size(); ++nIndexList)
|
||||
{
|
||||
CRecordSlideListWithText* pAtom = oArraySlideWithText[nIndexList];
|
||||
std::vector<SSlidePersist>* pArray = NULL;
|
||||
|
||||
switch (pAtom->m_Type)
|
||||
{
|
||||
case CRecordSlideListWithText::CollectionOfMasterSlides:
|
||||
case CRecordSlideListWithText::CollectionOfMasterSlides:
|
||||
{
|
||||
pArray = &m_arMasterPersists;
|
||||
break;
|
||||
}
|
||||
|
||||
case CRecordSlideListWithText::CollectionOfNotesSlides:
|
||||
pArray = &m_arMasterPersists;
|
||||
}break;
|
||||
case CRecordSlideListWithText::CollectionOfNotesSlides:
|
||||
{
|
||||
pArray = &m_arNotePersists;
|
||||
break;
|
||||
}
|
||||
|
||||
case CRecordSlideListWithText::CollectionOfSlides:
|
||||
pArray = &m_arNotePersists;
|
||||
}break;
|
||||
case CRecordSlideListWithText::CollectionOfSlides:
|
||||
{
|
||||
pArray = &m_arSlidePersists;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
pArray = &m_arSlidePersists;
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
// этого не может быть...
|
||||
continue;
|
||||
|
||||
@ -53,7 +53,7 @@ public:
|
||||
pArray->clear();
|
||||
|
||||
std::map<DWORD, int> image_map;
|
||||
for (int nIndex = 0; nIndex < m_arRecords.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < m_arRecords.size(); ++nIndex)
|
||||
{
|
||||
CRecordBlipStoreEntry* pEntry = dynamic_cast<CRecordBlipStoreEntry*>(m_arRecords[nIndex]);
|
||||
if (NULL != pEntry)
|
||||
|
||||
@ -71,7 +71,7 @@ public:
|
||||
oArrayShapes[0]->bGroupShape = true;//тут описание самой группы
|
||||
|
||||
int nIndexBreak = -1;
|
||||
for (int nIndex = 0; nIndex < oArrayShapes.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayShapes.size(); ++nIndex)
|
||||
{
|
||||
std::vector<CRecordGroupShape*> oArrayGroupShapes;
|
||||
oArrayShapes[nIndex]->GetRecordsByType(&oArrayGroupShapes, false, true);
|
||||
@ -120,7 +120,7 @@ public:
|
||||
bool bIsRecalc = ((lW1 > 0) && (lH1 > 0) && (lW2 > 0) && (lH2 > 0));
|
||||
if (bIsRecalc)
|
||||
{
|
||||
for (int nIndex = 0; nIndex < oArrayShapes.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < oArrayShapes.size(); ++nIndex)
|
||||
{
|
||||
if (nIndex != nIndexBreak)
|
||||
{
|
||||
|
||||
@ -575,212 +575,134 @@ public:
|
||||
}
|
||||
// line --------------------------------------------------------
|
||||
case lineBoolean: //Line Style Boolean Properties
|
||||
{
|
||||
bool bNoLineDrawDash = GETBIT(pProperty->m_lValue, 0);
|
||||
bool bLineFillShape = GETBIT(pProperty->m_lValue, 1);
|
||||
bool bHitTestLine = GETBIT(pProperty->m_lValue, 2);
|
||||
bool bLine = GETBIT(pProperty->m_lValue, 3);
|
||||
bool bArrowheadsOK = GETBIT(pProperty->m_lValue, 4);
|
||||
bool bInsetPenOK = GETBIT(pProperty->m_lValue, 5);
|
||||
bool bInsetPen = GETBIT(pProperty->m_lValue, 6);
|
||||
bool bLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 9);
|
||||
{
|
||||
bool bNoLineDrawDash = GETBIT(pProperty->m_lValue, 0);
|
||||
bool bLineFillShape = GETBIT(pProperty->m_lValue, 1);
|
||||
bool bHitTestLine = GETBIT(pProperty->m_lValue, 2);
|
||||
bool bLine = GETBIT(pProperty->m_lValue, 3);
|
||||
bool bArrowheadsOK = GETBIT(pProperty->m_lValue, 4);
|
||||
bool bInsetPenOK = GETBIT(pProperty->m_lValue, 5);
|
||||
bool bInsetPen = GETBIT(pProperty->m_lValue, 6);
|
||||
bool bLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 9);
|
||||
|
||||
bool bUsefNoLineDrawDash = GETBIT(pProperty->m_lValue, 16);
|
||||
bool bUsefLineFillShape = GETBIT(pProperty->m_lValue, 17);
|
||||
bool bUsefHitTestLine = GETBIT(pProperty->m_lValue, 18);
|
||||
bool bUsefLine = GETBIT(pProperty->m_lValue, 19);
|
||||
bool bUsefArrowheadsOK = GETBIT(pProperty->m_lValue, 20);
|
||||
bool bUsefInsetPenOK = GETBIT(pProperty->m_lValue, 21);
|
||||
bool bUsefInsetPen = GETBIT(pProperty->m_lValue, 22);
|
||||
bool bUsefLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 25);
|
||||
bool bUsefNoLineDrawDash = GETBIT(pProperty->m_lValue, 16);
|
||||
bool bUsefLineFillShape = GETBIT(pProperty->m_lValue, 17);
|
||||
bool bUsefHitTestLine = GETBIT(pProperty->m_lValue, 18);
|
||||
bool bUsefLine = GETBIT(pProperty->m_lValue, 19);
|
||||
bool bUsefArrowheadsOK = GETBIT(pProperty->m_lValue, 20);
|
||||
bool bUsefInsetPenOK = GETBIT(pProperty->m_lValue, 21);
|
||||
bool bUsefInsetPen = GETBIT(pProperty->m_lValue, 22);
|
||||
bool bUsefLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 25);
|
||||
|
||||
if (bUsefLine)
|
||||
pElement->m_bLine = bLine;
|
||||
}break;
|
||||
case lineStyle:
|
||||
if (bUsefLine)
|
||||
pElement->m_bLine = bLine;
|
||||
}break;
|
||||
case lineDashStyle://from Complex
|
||||
{
|
||||
pElement->m_bLine = true;
|
||||
}break;
|
||||
{
|
||||
pElement->m_bLine = true;
|
||||
}break;
|
||||
case lineColor:
|
||||
{
|
||||
SColorAtom oAtom;
|
||||
oAtom.FromValue(pProperty->m_lValue);
|
||||
|
||||
if (oAtom.bSysIndex)
|
||||
pElement->m_oPen.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme);
|
||||
else
|
||||
oAtom.ToColor(&pElement->m_oPen.Color);
|
||||
break;
|
||||
}
|
||||
{
|
||||
SColorAtom oAtom;
|
||||
oAtom.FromValue(pProperty->m_lValue);
|
||||
|
||||
if (oAtom.bSysIndex)
|
||||
pElement->m_oPen.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme);
|
||||
else
|
||||
oAtom.ToColor(&pElement->m_oPen.Color);
|
||||
}break;
|
||||
case lineOpacity:
|
||||
{
|
||||
pElement->m_oPen.Alpha = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255));
|
||||
break;
|
||||
}
|
||||
{
|
||||
pElement->m_oPen.Alpha = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255));
|
||||
}break;
|
||||
case lineBackColor:
|
||||
{
|
||||
SColorAtom oAtom;
|
||||
oAtom.FromValue(pProperty->m_lValue);
|
||||
|
||||
if (oAtom.bSysIndex)
|
||||
pElement->m_oPen.Color2 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme);
|
||||
else
|
||||
oAtom.ToColor(&pElement->m_oPen.Color2);
|
||||
{
|
||||
SColorAtom oAtom;
|
||||
oAtom.FromValue(pProperty->m_lValue);
|
||||
|
||||
if (oAtom.bSysIndex)
|
||||
pElement->m_oPen.Color2 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme);
|
||||
else
|
||||
oAtom.ToColor(&pElement->m_oPen.Color2);
|
||||
|
||||
}break;
|
||||
}break;
|
||||
case lineWidth:
|
||||
{
|
||||
pElement->m_oPen.Size = (double)pProperty->m_lValue / EMU_MM;
|
||||
pElement->m_bLine = true;
|
||||
break;
|
||||
}
|
||||
{
|
||||
pElement->m_oPen.Size = (double)pProperty->m_lValue / EMU_MM;
|
||||
pElement->m_bLine = true;
|
||||
}break;
|
||||
case lineStyle:
|
||||
{
|
||||
pElement->m_bLine = true;
|
||||
pElement->m_oPen.LineStyle = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineDashing:
|
||||
{
|
||||
BYTE nDashStyle = 0;
|
||||
switch (pProperty->m_lValue)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
nDashStyle = 0; // solid
|
||||
}break;
|
||||
case 1:
|
||||
case 6:
|
||||
case 7:
|
||||
{
|
||||
nDashStyle = 1; // dash
|
||||
}break;
|
||||
case 2:
|
||||
case 5:
|
||||
{
|
||||
nDashStyle = 2; // dot
|
||||
}break;
|
||||
case 3:
|
||||
case 8:
|
||||
case 9:
|
||||
{
|
||||
nDashStyle = 3; // dashdot
|
||||
}break;
|
||||
case 4:
|
||||
case 10:
|
||||
{
|
||||
nDashStyle = 4;// dashdotdot
|
||||
}break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
pElement->m_bLine = true;
|
||||
pElement->m_oPen.DashStyle = nDashStyle;
|
||||
break;
|
||||
}
|
||||
{
|
||||
pElement->m_bLine = true;
|
||||
pElement->m_oPen.DashStyle = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineJoinStyle:
|
||||
{
|
||||
BYTE nLineJoin = 2;
|
||||
switch (pProperty->m_lValue)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
nLineJoin = 1; // bevel
|
||||
}break;
|
||||
case 1:
|
||||
{
|
||||
nLineJoin = 1; // Miter
|
||||
}break;
|
||||
case 2:
|
||||
{
|
||||
nLineJoin = 2; // round
|
||||
}break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
pElement->m_oPen.LineJoin = nLineJoin;
|
||||
break;
|
||||
}
|
||||
{
|
||||
pElement->m_oPen.LineJoin = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineStartArrowLength:
|
||||
{
|
||||
pElement->m_oPen.LineStartLength = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineEndArrowLength:
|
||||
{
|
||||
pElement->m_oPen.LineEndLength = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineStartArrowWidth:
|
||||
{
|
||||
pElement->m_oPen.LineStartWidth = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineEndArrowWidth:
|
||||
{
|
||||
pElement->m_oPen.LineEndWidth = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineStartArrowhead:
|
||||
{
|
||||
BYTE nStartCap = 0;
|
||||
switch (pProperty->m_lValue)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
case 5:
|
||||
{
|
||||
nStartCap = 0x14;
|
||||
}break;
|
||||
case 3:
|
||||
case 4:
|
||||
|
||||
{
|
||||
nStartCap = 2;
|
||||
}break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
pElement->m_oPen.LineStartCap = nStartCap;
|
||||
|
||||
break;
|
||||
}
|
||||
{
|
||||
pElement->m_oPen.LineStartCap = pProperty->m_lValue;
|
||||
}break;
|
||||
case lineEndArrowhead:
|
||||
{
|
||||
BYTE nEndCap = 0;
|
||||
switch (pProperty->m_lValue)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
case 5:
|
||||
{
|
||||
nEndCap = 0x14;
|
||||
}break;
|
||||
case 3:
|
||||
case 4:
|
||||
|
||||
{
|
||||
nEndCap = 2;
|
||||
}break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
pElement->m_oPen.LineEndCap = nEndCap;
|
||||
break;
|
||||
}
|
||||
{
|
||||
pElement->m_oPen.LineEndCap = pProperty->m_lValue;
|
||||
}break;
|
||||
case shadowType:
|
||||
{
|
||||
pElement->m_oShadow.Type = pProperty->m_lValue;
|
||||
|
||||
}break;
|
||||
{
|
||||
pElement->m_oShadow.Type = pProperty->m_lValue;
|
||||
}break;
|
||||
case shadowOriginX://in emu, relative from center shape
|
||||
{
|
||||
pElement->m_oShadow.OriginX = FixedPointToDouble(pProperty->m_lValue);
|
||||
}break;
|
||||
{
|
||||
pElement->m_oShadow.OriginX = FixedPointToDouble(pProperty->m_lValue);
|
||||
}break;
|
||||
case shadowOriginY:
|
||||
{
|
||||
pElement->m_oShadow.OriginY = FixedPointToDouble(pProperty->m_lValue);
|
||||
}break;
|
||||
{
|
||||
pElement->m_oShadow.OriginY = FixedPointToDouble(pProperty->m_lValue);
|
||||
}break;
|
||||
case shadowColor:
|
||||
{
|
||||
SColorAtom oAtom;
|
||||
oAtom.FromValue(pProperty->m_lValue);
|
||||
{
|
||||
SColorAtom oAtom;
|
||||
oAtom.FromValue(pProperty->m_lValue);
|
||||
|
||||
if (oAtom.bSysIndex)
|
||||
pElement->m_oShadow.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme);
|
||||
else
|
||||
oAtom.ToColor(&pElement->m_oShadow.Color);
|
||||
if (oAtom.bSysIndex)
|
||||
pElement->m_oShadow.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme);
|
||||
else
|
||||
oAtom.ToColor(&pElement->m_oShadow.Color);
|
||||
|
||||
}break;
|
||||
}break;
|
||||
case shadowWeight:
|
||||
{
|
||||
}break;
|
||||
case shadowOpacity:
|
||||
{
|
||||
pElement->m_oShadow.Alpha = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255));
|
||||
}break;
|
||||
{
|
||||
pElement->m_oShadow.Alpha = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255));
|
||||
}break;
|
||||
case shadowHighlight:
|
||||
{
|
||||
//оттенок двойной тени
|
||||
}break;
|
||||
{
|
||||
//оттенок двойной тени
|
||||
}break;
|
||||
case shadowOffsetX:
|
||||
{
|
||||
pElement->m_oShadow.DistanceX = ((int)pProperty->m_lValue) / EMU_MM;
|
||||
@ -1890,7 +1812,7 @@ protected:
|
||||
|
||||
if (master_levels)
|
||||
{
|
||||
for (int i = 0; i < pText->m_arParagraphs.size(); i++)
|
||||
for (size_t i = 0; i < pText->m_arParagraphs.size(); i++)
|
||||
{
|
||||
if (i >= master_levels->m_arrProps.size()) break;
|
||||
|
||||
@ -2198,7 +2120,7 @@ protected:
|
||||
pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get());
|
||||
}
|
||||
}
|
||||
if (eTypeOwn != NSOfficePPT::NoPresent && eTypeOwn != NSOfficePPT::Other && eTypeOwn != eTypePersist && eTypeOwn != eTypeMaster)
|
||||
if (eTypeOwn != NSOfficePPT::NoPresent/* && eTypeOwn != NSOfficePPT::Other*/ && eTypeOwn != eTypePersist && eTypeOwn != eTypeMaster)
|
||||
{
|
||||
int nIndexType = (int)eTypeOwn;
|
||||
|
||||
|
||||
@ -198,7 +198,7 @@ public:
|
||||
{
|
||||
CRecordsContainer::ReadFromStream(oHeader, pStream);
|
||||
|
||||
for (int i = 0 ; i < m_arRecords.size(); i++)
|
||||
for (size_t i = 0 ; i < m_arRecords.size(); i++)
|
||||
{
|
||||
switch(m_arRecords[i]->m_oHeader.RecType)
|
||||
{
|
||||
|
||||
@ -34,13 +34,12 @@
|
||||
|
||||
class CRecordNotesAtom : public CUnknownRecord
|
||||
{
|
||||
public:
|
||||
UINT m_nSlideIDRef;
|
||||
|
||||
bool m_bMasterObjects;
|
||||
bool m_bMasterScheme;
|
||||
bool m_bMasterBackground;
|
||||
|
||||
public:
|
||||
|
||||
CRecordNotesAtom()
|
||||
{
|
||||
@ -54,11 +53,11 @@ public:
|
||||
{
|
||||
m_oHeader = oHeader;
|
||||
|
||||
m_nSlideIDRef = (UINT)StreamUtils::ReadDWORD(pStream);
|
||||
m_nSlideIDRef = (UINT)StreamUtils::ReadDWORD(pStream);
|
||||
|
||||
USHORT nFlag = StreamUtils::ReadWORD(pStream);
|
||||
m_bMasterObjects = ((nFlag & 0x01) == 0x01);
|
||||
m_bMasterScheme = ((nFlag & 0x02) == 0x02);
|
||||
USHORT nFlag = StreamUtils::ReadWORD(pStream);
|
||||
m_bMasterObjects = ((nFlag & 0x01) == 0x01);
|
||||
m_bMasterScheme = ((nFlag & 0x02) == 0x02);
|
||||
m_bMasterBackground = ((nFlag & 0x04) == 0x04);
|
||||
|
||||
StreamUtils::StreamSkip(2, pStream);
|
||||
|
||||
@ -91,6 +91,7 @@
|
||||
#include "RoundTripColorMappingAtom.h"
|
||||
#include "RoundTripNewPlaceholderId12Atom.h"
|
||||
#include "RoundTripThemeAtom.h"
|
||||
#include "RoundTripNotesMasterTextStyles12Atom.h"
|
||||
#include "TextRulerAtom.h"
|
||||
#include "ShapeFlags10Atom.h"
|
||||
#include "ShapeFlagsAtom.h"
|
||||
|
||||
@ -34,9 +34,8 @@
|
||||
|
||||
class CRecordRoundTripColorMappingAtom : public CUnknownRecord
|
||||
{
|
||||
std::wstring m_pString;
|
||||
|
||||
public:
|
||||
std::string m_strData;
|
||||
|
||||
CRecordRoundTripColorMappingAtom()
|
||||
{
|
||||
@ -48,6 +47,7 @@ public:
|
||||
|
||||
virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream)
|
||||
{
|
||||
return CUnknownRecord::ReadFromStream(oHeader, pStream);
|
||||
m_oHeader = oHeader;
|
||||
m_strData = StreamUtils::ReadStringA(pStream, (long)m_oHeader.RecLen);
|
||||
}
|
||||
};
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* (c) Copyright Ascensio System SIA 2010-2017
|
||||
*
|
||||
* 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 "../Reader/Records.h"
|
||||
|
||||
class CRecordRoundTripNotesMasterTextStyles12Atom : public CUnknownRecord
|
||||
{
|
||||
public:
|
||||
std::string m_strData;
|
||||
|
||||
CRecordRoundTripNotesMasterTextStyles12Atom()
|
||||
{
|
||||
}
|
||||
|
||||
~CRecordRoundTripNotesMasterTextStyles12Atom()
|
||||
{
|
||||
}
|
||||
|
||||
virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream)
|
||||
{
|
||||
m_oHeader = oHeader;
|
||||
m_strData = StreamUtils::ReadStringA(pStream, (long)m_oHeader.RecLen);
|
||||
}
|
||||
};
|
||||
@ -34,9 +34,8 @@
|
||||
|
||||
class CRecordRoundTripThemeAtom : public CUnknownRecord
|
||||
{
|
||||
std::wstring m_strData;
|
||||
|
||||
public:
|
||||
std::string m_strData;
|
||||
|
||||
CRecordRoundTripThemeAtom()
|
||||
{
|
||||
@ -48,6 +47,7 @@ public:
|
||||
|
||||
virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream)
|
||||
{
|
||||
return CUnknownRecord::ReadFromStream(oHeader, pStream);
|
||||
m_oHeader = oHeader;
|
||||
m_strData = StreamUtils::ReadStringA(pStream, (long)m_oHeader.RecLen);
|
||||
}
|
||||
};
|
||||
|
||||
@ -129,7 +129,7 @@ public:
|
||||
|
||||
bool IsSlide()
|
||||
{
|
||||
for (int nIndex = 0; nIndex < m_arRecords.size(); ++nIndex)
|
||||
for (size_t nIndex = 0; nIndex < m_arRecords.size(); ++nIndex)
|
||||
{
|
||||
if ((RECORD_TYPE_SLIDE == m_arRecords[nIndex]->m_oHeader.RecType) ||
|
||||
(RECORD_TYPE_MAINMASTER == m_arRecords[nIndex]->m_oHeader.RecType) ||
|
||||
|
||||
@ -59,7 +59,7 @@ public:
|
||||
{
|
||||
pStream->read(pUTF16_low, m_oHeader.RecLen);
|
||||
|
||||
for (int i = 0 ; i < m_oHeader.RecLen; i++)
|
||||
for (UINT i = 0 ; i < m_oHeader.RecLen; i++)
|
||||
{
|
||||
pUTF16[i] = pUTF16_low[i];
|
||||
}
|
||||
|
||||
@ -86,11 +86,12 @@ public:
|
||||
|
||||
int pos_text = 0, pos_si = 0;
|
||||
int ind = 0;
|
||||
for (int i = 0; i < pText->m_arParagraphs.size(); i++)
|
||||
|
||||
for (size_t i = 0; i < pText->m_arParagraphs.size(); i++)
|
||||
{
|
||||
if (ind >= m_arrSIs.size()) break;
|
||||
|
||||
for (int j = 0 ; j < pText->m_arParagraphs[i].m_arSpans.size(); j++)
|
||||
for (size_t j = 0 ; j < pText->m_arParagraphs[i].m_arSpans.size(); j++)
|
||||
{
|
||||
if (pos_text + pText->m_arParagraphs[i].m_arSpans[j].m_strText.length() > pos_si + m_arrSIs[ind].lCount )
|
||||
{
|
||||
|
||||
@ -462,10 +462,6 @@
|
||||
RelativePath="..\Reader\ClassesAtom.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\ASCPresentationEditor\OfficeDrawing\Document.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Reader\PPTDocumentInfo.h"
|
||||
>
|
||||
@ -998,6 +994,10 @@
|
||||
RelativePath="..\..\..\ASCOfficePPTXFile\Editor\Drawing\Metric.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\ASCOfficePPTXFile\Editor\Drawing\Shapes\BaseShape\PPTShape\PPTShape.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\ASCOfficePPTXFile\Editor\Drawing\Slide.h"
|
||||
>
|
||||
|
||||
@ -31,22 +31,30 @@
|
||||
*/
|
||||
// PptFormatTest.cpp : Defines the entry point for the console application.
|
||||
//
|
||||
#include "../../PPTFormatLib/PPTFormatLib.h"
|
||||
#include "../../../OfficeUtils/src/OfficeUtils.h"
|
||||
#include "../PPTFormatLib/PPTFormatLib.h"
|
||||
#include "../../OfficeUtils/src/OfficeUtils.h"
|
||||
|
||||
#include "../../../Common/DocxFormat/Source/SystemUtility/FileSystem/Directory.h"
|
||||
#include "../../DesktopEditor/common/Directory.h"
|
||||
|
||||
#include <tchar.h>
|
||||
|
||||
#if defined(_WIN64)
|
||||
#pragma comment(lib, "../../build/bin/icu/win_64/icuuc.lib")
|
||||
#elif defined (_WIN32)
|
||||
#pragma comment(lib, "../../build/bin/icu/win_32/icuuc.lib")
|
||||
#endif
|
||||
|
||||
int _tmain(int argc, _TCHAR* argv[])
|
||||
{
|
||||
if (argc < 2) return 1;
|
||||
|
||||
std::wstring sSrcPpt = argv[1];
|
||||
std::wstring sDstPptx = argc > 2 ? argv[2] : sSrcDoc + L"-my.pptx";
|
||||
std::wstring sDstPptx = argc > 2 ? argv[2] : sSrcPpt + L"-my.pptx";
|
||||
|
||||
std::wstring outputDir = FileSystem::Directory::GetFolderPath(sDstPptx);
|
||||
std::wstring dstTempPath = FileSystem::Directory::CreateDirectoryWithUniqueName(outputDir);
|
||||
std::wstring outputDir = NSDirectory::GetFolderPath(sDstPptx);
|
||||
std::wstring dstTempPath = NSDirectory::CreateDirectoryWithUniqueName(outputDir);
|
||||
|
||||
std::wstring tempPath = FileSystem::Directory::CreateDirectoryWithUniqueName(outputDir);
|
||||
std::wstring tempPath = NSDirectory::CreateDirectoryWithUniqueName(outputDir);
|
||||
|
||||
COfficePPTFile pptFile;
|
||||
|
||||
@ -60,8 +68,8 @@ int _tmain(int argc, _TCHAR* argv[])
|
||||
hRes = oCOfficeUtils.CompressFileOrDirectory(dstTempPath.c_str(), sDstPptx, -1);
|
||||
}
|
||||
|
||||
FileSystem::Directory::DeleteDirectory(dstTempPath);
|
||||
FileSystem::Directory::DeleteDirectory(tempPath);
|
||||
NSDirectory::DeleteDirectory(dstTempPath);
|
||||
NSDirectory::DeleteDirectory(tempPath);
|
||||
|
||||
return hRes;
|
||||
}
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\Common\OfficeDrawing;"..\..\DesktopEditor\freetype-2.5.2\include";..\..\Common\OfficeDrawing\Shapes"
|
||||
PreprocessorDefinitions="_DEBUG;_CONSOLE;USE_ATL_CSTRINGS;_USE_MATH_DEFINES;PPTX_DEF;PPT_DEF;ENABLE_PPT_TO_PPTX_CONVERT;PPT_FORMAT;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;_PRESENTATION_WRITER_;_SVG_CONVERT_TO_IMAGE_"
|
||||
PreprocessorDefinitions="_DEBUG;_CONSOLE;USE_ATL_CSTRINGS;_USE_MATH_DEFINES;PPTX_DEF;PPT_DEF;ENABLE_PPT_TO_PPTX_CONVERT;PPT_FORMAT;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;_PRESENTATION_WRITER_;_SVG_CONVERT_TO_IMAGE_;DONT_WRITE_EMBEDDED_FONTS"
|
||||
MinimalRebuild="false"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
@ -340,14 +340,34 @@
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<File
|
||||
RelativePath="..\..\ASCOfficeDocxFile2\BinWriter\BinWriters.cpp"
|
||||
<Filter
|
||||
Name="common"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\build\bin\icu\win_32\icuuc.lib"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ASCOfficeDocxFile2\BinWriter\BinWriters.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\Common\OfficeFileFormatChecker2.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ASCOfficeDocxFile2\BinReader\Readers.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\UnicodeConverter\UnicodeConverter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\DesktopEditor\xml\src\xmldom.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\DesktopEditor\xml\src\xmllight.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="PptFormatTest.cpp"
|
||||
>
|
||||
|
||||
@ -478,10 +478,17 @@ namespace NSPresentationEditor
|
||||
long Alpha;
|
||||
double Size;
|
||||
|
||||
BYTE DashStyle;
|
||||
BYTE LineStartCap;
|
||||
BYTE LineEndCap;
|
||||
BYTE LineJoin;
|
||||
unsigned char DashStyle;
|
||||
unsigned char LineStyle;
|
||||
unsigned char LineJoin;
|
||||
|
||||
unsigned char LineEndCap;
|
||||
unsigned char LineEndLength;
|
||||
unsigned char LineEndWidth;
|
||||
|
||||
unsigned char LineStartCap;
|
||||
unsigned char LineStartLength;
|
||||
unsigned char LineStartWidth;
|
||||
|
||||
double* DashPattern;
|
||||
long Count;
|
||||
@ -492,9 +499,8 @@ namespace NSPresentationEditor
|
||||
double MiterLimit;
|
||||
|
||||
CColor Color2; //backLine
|
||||
public:
|
||||
|
||||
void GetDashPattern(double* arrDashPattern, long& nCount) const
|
||||
void GetDashPattern(double* arrDashPattern, long& nCount) const
|
||||
{
|
||||
if (nCount == Count)
|
||||
{
|
||||
@ -579,10 +585,16 @@ namespace NSPresentationEditor
|
||||
Alpha = 255;
|
||||
Size = 0.26458;
|
||||
|
||||
DashStyle = 0;
|
||||
LineStartCap = 0;
|
||||
LineEndCap = 0;
|
||||
LineJoin = 0;
|
||||
LineStyle = 0; //single(Simple)
|
||||
DashStyle = 0; //Solid
|
||||
LineJoin = 2; //round
|
||||
|
||||
LineStartCap = 0;
|
||||
LineEndCap = 0;
|
||||
LineEndLength = 1; //med
|
||||
LineStartLength = 1;
|
||||
LineEndWidth = 1;
|
||||
LineStartWidth = 1;
|
||||
|
||||
DashPattern = NULL;
|
||||
Count = 0;
|
||||
|
||||
@ -41,82 +41,59 @@ namespace NSPresentationEditor
|
||||
public:
|
||||
std::vector<CTheme> m_arThemes;
|
||||
std::vector<CSlide*> m_arSlides;
|
||||
std::vector<CSlide*> m_arNotes;
|
||||
|
||||
CTheme* m_pNotesMaster;
|
||||
CTheme* m_pHandoutMaster;
|
||||
|
||||
CMetricInfo m_oInfo;
|
||||
|
||||
public:
|
||||
|
||||
CDocument() : m_arThemes(), m_arSlides()
|
||||
{
|
||||
m_pHandoutMaster = NULL;
|
||||
m_pNotesMaster = NULL;
|
||||
}
|
||||
|
||||
~CDocument()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
CDocument& operator=(const CDocument& oSrc)
|
||||
{
|
||||
m_arThemes = oSrc.m_arThemes;
|
||||
m_arSlides = oSrc.m_arSlides;
|
||||
|
||||
m_oInfo = oSrc.m_oInfo;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
CDocument(const CDocument& oSrc)
|
||||
{
|
||||
*this = oSrc;
|
||||
}
|
||||
|
||||
public:
|
||||
inline void Clear()
|
||||
{
|
||||
ClearThemes();
|
||||
m_arThemes.clear();
|
||||
try
|
||||
{
|
||||
ClearSlides();
|
||||
ClearNotes();
|
||||
|
||||
RELEASEOBJECT(m_pHandoutMaster);
|
||||
RELEASEOBJECT(m_pNotesMaster);
|
||||
}catch(...)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
// работа с темами
|
||||
inline void ClearThemes()
|
||||
{
|
||||
m_arThemes.clear();
|
||||
}
|
||||
inline void AddTheme(const CTheme& oTheme)
|
||||
{
|
||||
m_arThemes.push_back(oTheme);
|
||||
}
|
||||
inline void UpdateTheme(size_t nIndex, const CTheme& oTheme)
|
||||
{
|
||||
if (nIndex >= m_arThemes.size())
|
||||
return;
|
||||
|
||||
m_arThemes[nIndex] = oTheme;
|
||||
}
|
||||
// работа со слайдом
|
||||
inline void ClearSlides()
|
||||
{
|
||||
for (int i = 0 ; i < m_arSlides.size(); i++)
|
||||
for (size_t i = 0 ; i < m_arSlides.size(); i++)
|
||||
{
|
||||
RELEASEOBJECT(m_arSlides[i]);
|
||||
}
|
||||
m_arSlides.clear();
|
||||
}
|
||||
inline void AddSlide(CSlide* oSlide)
|
||||
inline void ClearNotes()
|
||||
{
|
||||
m_arSlides.push_back(oSlide);
|
||||
for (size_t i = 0 ; i < m_arNotes.size(); i++)
|
||||
{
|
||||
RELEASEOBJECT(m_arNotes[i]);
|
||||
}
|
||||
m_arNotes.clear();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
// функция производит расчет по теме и слайдам
|
||||
std::wstring GetXmlSlideTransition ( CSlide& oSlide/*, CAudioOverlay& oAudioOverlay*/ )
|
||||
#if defined (_DEBUG)
|
||||
std::wstring GetXmlSlideTransition ( CSlide& oSlide/*, CAudioOverlay& oAudioOverlay*/ )
|
||||
{
|
||||
std::wstring Source = std::wstring ( _T("") );
|
||||
std::wstring Source = std::wstring ( _T("") );
|
||||
|
||||
int EffectID = 1;
|
||||
int lEffectDirection = oSlide.m_oSlideShow.m_oTransition.m_nEffectDirection;
|
||||
@ -314,7 +291,7 @@ namespace NSPresentationEditor
|
||||
break;
|
||||
}
|
||||
|
||||
Source = L"<VideoCompose Time=\"" + std::to_wstring(oSlide.m_oSlideShow.m_oTransition.m_dSpeed) + L"\" effectid=\"" + std::to_wstring(EffectID) + L"\"/>";
|
||||
Source = L"<VideoCompose Time=\"" + std::to_wstring(oSlide.m_oSlideShow.m_oTransition.m_dSpeed) + L"\" effectid=\"" + std::to_wstring(EffectID) + L"\"/>";
|
||||
|
||||
/*
|
||||
|
||||
@ -338,7 +315,7 @@ namespace NSPresentationEditor
|
||||
|
||||
return Source;
|
||||
}
|
||||
|
||||
#endif
|
||||
double CalculateTimes(CAudioOverlay& oAudioOverlay)
|
||||
{
|
||||
CaclulateSlideTimes();
|
||||
@ -486,7 +463,6 @@ namespace NSPresentationEditor
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
void ResetAutoText(IElement *pElement, vector_string const (&placeholdersReplaceString)[3])
|
||||
{
|
||||
CShapeElement* pShape = dynamic_cast<CShapeElement*>(pElement);
|
||||
|
||||
@ -41,6 +41,9 @@ namespace NSPresentationEditor
|
||||
LONG m_lThemeID;
|
||||
LONG m_lLayoutID;
|
||||
|
||||
LONG m_lSlideID; //for notes rels
|
||||
LONG m_lNotesID; //for slide rels
|
||||
|
||||
std::vector<IElement*> m_arElements;
|
||||
CSlideShowInfo m_oSlideShow;
|
||||
std::multimap<int,int> m_mapPlaceholders;
|
||||
@ -91,6 +94,8 @@ namespace NSPresentationEditor
|
||||
|
||||
m_lThemeID = -1;
|
||||
m_lLayoutID = -1;
|
||||
m_lSlideID = -1;
|
||||
m_lNotesID = -1;
|
||||
|
||||
m_lWidth = 270;
|
||||
m_lHeight = 190;
|
||||
@ -125,6 +130,8 @@ namespace NSPresentationEditor
|
||||
|
||||
m_lThemeID = oSrc.m_lThemeID;
|
||||
m_lLayoutID = oSrc.m_lLayoutID;
|
||||
m_lNotesID = oSrc.m_lNotesID;
|
||||
m_lSlideID = oSrc.m_lSlideID;
|
||||
|
||||
m_lWidth = oSrc.m_lWidth;
|
||||
m_lHeight = oSrc.m_lHeight;
|
||||
|
||||
@ -32,7 +32,6 @@
|
||||
#pragma once
|
||||
#include "Structures.h"
|
||||
#include "Layout.h"
|
||||
//#include "../PPTXWriter/CSS.h"
|
||||
|
||||
namespace NSPresentationEditor
|
||||
{
|
||||
|
||||
@ -326,7 +326,7 @@ private:
|
||||
if (differenceInLength < 0)
|
||||
differenceInLength = -differenceInLength;
|
||||
|
||||
for (int i = number1.size() - 1; i >= 0; --i)
|
||||
for (int i = (int)(number1.size()) - 1; i >= 0; --i)
|
||||
{
|
||||
add[i] = ((carry-'0')+(number1[i]-'0')+(number2[i]-'0')) + '0';
|
||||
|
||||
@ -364,7 +364,7 @@ private:
|
||||
if (differenceInLength < 0)
|
||||
differenceInLength = -differenceInLength;
|
||||
|
||||
for (int i = number1.length() - 1; i >= 0; --i)
|
||||
for (int i = (int)(number1.length()) - 1; i >= 0; --i)
|
||||
{
|
||||
if (number1[i] < number2[i])
|
||||
{
|
||||
@ -386,13 +386,13 @@ private:
|
||||
n1.swap(n2);
|
||||
|
||||
std::string res = "0";
|
||||
for (int i = n1.length() - 1; i >= 0; --i)
|
||||
for (int i = (int)(n1.length()) - 1; i >= 0; --i)
|
||||
{
|
||||
std::string temp = n2;
|
||||
int currentDigit = n1[i] - '0';
|
||||
int carry = 0;
|
||||
|
||||
for (int j = temp.length() - 1; j >= 0; --j)
|
||||
for (int j = (int)(temp.length()) - 1; j >= 0; --j)
|
||||
{
|
||||
temp[j] = ((temp[j]-'0') * currentDigit) + carry;
|
||||
|
||||
|
||||
@ -11,6 +11,19 @@ TEMPLATE = lib
|
||||
CONFIG += staticlib
|
||||
QMAKE_CXXFLAGS += -Wall -g
|
||||
|
||||
DEFINES += \
|
||||
LIBXML_READER_ENABLED \
|
||||
LIBXML_PUSH_ENABLED \
|
||||
LIBXML_HTML_ENABLED \
|
||||
LIBXML_XPATH_ENABLED \
|
||||
LIBXML_OUTPUT_ENABLED \
|
||||
LIBXML_C14N_ENABLED \
|
||||
LIBXML_SAX1_ENABLED \
|
||||
LIBXML_TREE_ENABLED \
|
||||
LIBXML_XPTR_ENABLED \
|
||||
IN_LIBXML \
|
||||
LIBXML_STATIC
|
||||
|
||||
CORE_ROOT_DIR = $$PWD/../../../..
|
||||
PWD_ROOT_DIR = $$PWD
|
||||
include(../../../../Common/base.pri)
|
||||
|
||||
563
DesktopEditor/xmlsec/src/OOXMLSigner.h
Normal file
563
DesktopEditor/xmlsec/src/OOXMLSigner.h
Normal file
@ -0,0 +1,563 @@
|
||||
#ifndef _XML_OOXMLSIGNER_H_
|
||||
#define _XML_OOXMLSIGNER_H_
|
||||
|
||||
#include "./XmlCanonicalizator.h"
|
||||
#include "./XmlSignerBase.h"
|
||||
#include "./XmlTransform.h"
|
||||
|
||||
class COOXMLSigner
|
||||
{
|
||||
public:
|
||||
ICertificate* m_certificate;
|
||||
std::wstring m_sFolder;
|
||||
|
||||
std::wstring m_date;
|
||||
|
||||
std::map<std::wstring, std::wstring> m_content_types;
|
||||
std::vector<std::wstring> m_rels;
|
||||
std::vector<std::wstring> m_files;
|
||||
|
||||
NSStringUtils::CStringBuilderA m_signed_info;
|
||||
|
||||
std::wstring m_image_valid;
|
||||
std::wstring m_image_invalid;
|
||||
|
||||
std::wstring m_guid;
|
||||
|
||||
public:
|
||||
COOXMLSigner(const std::wstring& sFolder, ICertificate* pContext)
|
||||
{
|
||||
m_sFolder = sFolder;
|
||||
m_certificate = pContext;
|
||||
|
||||
m_date = L"2017-04-21T08:30:21Z";
|
||||
|
||||
m_signed_info.WriteString("<CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>");
|
||||
m_signed_info.WriteString("<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"/>");
|
||||
}
|
||||
~COOXMLSigner()
|
||||
{
|
||||
}
|
||||
|
||||
std::wstring GetReference(const std::wstring& file, const std::wstring& content_type)
|
||||
{
|
||||
std::wstring sXml = L"<Reference URI=\"" + file + L"?ContentType=" + content_type + L"\">";
|
||||
sXml += L"<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/>";
|
||||
sXml += L"<DigestValue>";
|
||||
sXml += UTF8_TO_U(m_certificate->GetHash(m_sFolder + file));
|
||||
sXml += L"</DigestValue>";
|
||||
sXml += L"</Reference>";
|
||||
return sXml;
|
||||
}
|
||||
|
||||
std::string GetHashXml(const std::wstring& xml)
|
||||
{
|
||||
std::string sXmlSigned = U_TO_UTF8(xml);
|
||||
sXmlSigned = CXmlCanonicalizator::Execute(sXmlSigned, XML_C14N_1_0);
|
||||
return m_certificate->GetHash(sXmlSigned);
|
||||
}
|
||||
|
||||
std::string GetReferenceMain(const std::wstring& xml, const std::wstring& id, const bool& isCannon = true)
|
||||
{
|
||||
std::wstring sXml1 = L"<Object xmlns=\"http://www.w3.org/2000/09/xmldsig#\"";
|
||||
if (id.empty())
|
||||
sXml1 += L">";
|
||||
else
|
||||
sXml1 += (L" Id=\"" + id + L"\">");
|
||||
sXml1 += xml;
|
||||
sXml1 += L"</Object>";
|
||||
|
||||
std::string sHash = GetHashXml(sXml1);
|
||||
|
||||
std::string sRet;
|
||||
if (isCannon)
|
||||
sRet = "<Transforms><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>";
|
||||
|
||||
sRet += ("<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/><DigestValue>" + sHash + "</DigestValue>");
|
||||
|
||||
return sRet;
|
||||
}
|
||||
|
||||
std::wstring GetImageBase64(const std::wstring& file)
|
||||
{
|
||||
BYTE* pData = NULL;
|
||||
DWORD dwLen = 0;
|
||||
if (!NSFile::CFileBinary::ReadAllBytes(file, &pData, dwLen))
|
||||
return L"";
|
||||
|
||||
char* pDataC = NULL;
|
||||
int nLen = 0;
|
||||
NSFile::CBase64Converter::Encode(pData, (int)dwLen, pDataC, nLen, NSBase64::B64_BASE64_FLAG_NOCRLF);
|
||||
|
||||
std::wstring sReturn = NSFile::CUtf8Converter::GetUnicodeFromCharPtr(pDataC, (LONG)nLen, FALSE);
|
||||
|
||||
RELEASEARRAYOBJECTS(pData);
|
||||
RELEASEARRAYOBJECTS(pDataC);
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
std::wstring GetRelsReference(const std::wstring& file)
|
||||
{
|
||||
COOXMLRelationships oRels(m_sFolder + file, true);
|
||||
|
||||
if (L"/_rels/.rels" == file)
|
||||
{
|
||||
oRels.CheckOriginSigs(m_sFolder + file);
|
||||
|
||||
// удалим все лишнее
|
||||
std::vector<COOXMLRelationship>::iterator i = oRels.rels.begin();
|
||||
while (i != oRels.rels.end())
|
||||
{
|
||||
if (0 == i->target.find(L"docProps/"))
|
||||
i = oRels.rels.erase(i);
|
||||
else if (0 == i->target.find(L"_xmlsignatures/"))
|
||||
i = oRels.rels.erase(i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
NSStringUtils::CStringBuilder builder;
|
||||
builder.WriteString(L"<Reference URI=\"");
|
||||
builder.WriteString(file);
|
||||
builder.WriteString(L"?ContentType=application/vnd.openxmlformats-package.relationships+xml\">");
|
||||
builder.WriteString(oRels.GetTransforms());
|
||||
builder.WriteString(L"<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/><DigestValue>");
|
||||
|
||||
std::wstring sXml = oRels.GetXml();
|
||||
std::string sHash = GetHashXml(sXml);
|
||||
|
||||
std::wstring sHashW = UTF8_TO_U(sHash);
|
||||
builder.WriteString(sHashW);
|
||||
|
||||
builder.WriteString(L"</DigestValue></Reference>");
|
||||
|
||||
return builder.GetData();
|
||||
}
|
||||
|
||||
int GetCountSigns(const std::wstring& file)
|
||||
{
|
||||
if (!NSFile::CFileBinary::Exists(file))
|
||||
{
|
||||
std::wstring sRels = L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\
|
||||
<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\
|
||||
<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature\" Target=\"sig1.xml\"/>\
|
||||
</Relationships>";
|
||||
|
||||
NSFile::CFileBinary::SaveToFile(file, sRels, false);
|
||||
return 1;
|
||||
}
|
||||
|
||||
XmlUtils::CXmlNode oNode;
|
||||
oNode.FromXmlFile(file);
|
||||
|
||||
XmlUtils::CXmlNodes oNodes;
|
||||
oNode.GetNodes(L"Relationship", oNodes);
|
||||
|
||||
int rId = oNodes.GetCount() + 1;
|
||||
|
||||
std::string sXmlA;
|
||||
NSFile::CFileBinary::ReadAllTextUtf8A(file, sXmlA);
|
||||
|
||||
std::string::size_type pos = sXmlA.rfind("</Relationships>");
|
||||
if (pos == std::string::npos)
|
||||
return 1;
|
||||
|
||||
std::string sRet = sXmlA.substr(0, pos);
|
||||
sRet += ("<Relationship Id=\"rId" + std::to_string(rId) + "\" \
|
||||
Type=\"http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature\" Target=\"sig" + std::to_string(rId) + ".xml\"/>\
|
||||
</Relationships>");
|
||||
|
||||
NSFile::CFileBinary::Remove(file);
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(file);
|
||||
oFile.WriteFile((BYTE*)sRet.c_str(), (DWORD)sRet.length());
|
||||
oFile.CloseFile();
|
||||
|
||||
return rId;
|
||||
}
|
||||
|
||||
void ParseContentTypes()
|
||||
{
|
||||
std::wstring file = m_sFolder + L"/[Content_Types].xml";
|
||||
XmlUtils::CXmlNode oNode;
|
||||
oNode.FromXmlFile(file);
|
||||
|
||||
XmlUtils::CXmlNodes nodesDefaults;
|
||||
oNode.GetNodes(L"Default", nodesDefaults);
|
||||
|
||||
XmlUtils::CXmlNodes nodesOverrides;
|
||||
oNode.GetNodes(L"Override", nodesOverrides);
|
||||
|
||||
int nCount = nodesDefaults.GetCount();
|
||||
for (int i = 0; i < nCount; ++i)
|
||||
{
|
||||
XmlUtils::CXmlNode node;
|
||||
nodesDefaults.GetAt(i, node);
|
||||
|
||||
m_content_types.insert(std::pair<std::wstring, std::wstring>(node.GetAttribute("Extension"), node.GetAttribute("ContentType")));
|
||||
}
|
||||
|
||||
nCount = nodesOverrides.GetCount();
|
||||
for (int i = 0; i < nCount; ++i)
|
||||
{
|
||||
XmlUtils::CXmlNode node;
|
||||
nodesOverrides.GetAt(i, node);
|
||||
|
||||
m_content_types.insert(std::pair<std::wstring, std::wstring>(node.GetAttribute("PartName"), node.GetAttribute("ContentType")));
|
||||
}
|
||||
}
|
||||
|
||||
void Parse()
|
||||
{
|
||||
// 1) Parse Content_Types.xml
|
||||
ParseContentTypes();
|
||||
|
||||
// 2) Parse files in directory
|
||||
std::vector<std::wstring> files = NSDirectory::GetFiles(m_sFolder, true);
|
||||
|
||||
// 3) Check each file
|
||||
std::wstring sFolder = m_sFolder;
|
||||
NSStringUtils::string_replace(sFolder, L"\\", L"/");
|
||||
for (std::vector<std::wstring>::iterator i = files.begin(); i != files.end(); i++)
|
||||
{
|
||||
std::wstring sCheckFile = *i;
|
||||
NSStringUtils::string_replace(sCheckFile, L"\\", L"/");
|
||||
|
||||
if (0 != sCheckFile.find(sFolder))
|
||||
continue;
|
||||
|
||||
// make cool filename
|
||||
sCheckFile = sCheckFile.substr(sFolder.length());
|
||||
|
||||
// check needed file
|
||||
if (0 == sCheckFile.find(L"/_xmlsignatures") ||
|
||||
0 == sCheckFile.find(L"/docProps") ||
|
||||
0 == sCheckFile.find(L"/[Content_Types].xml"))
|
||||
continue;
|
||||
|
||||
// check rels and add to needed array
|
||||
std::wstring::size_type posExt = sCheckFile.rfind(L".");
|
||||
if (std::wstring::npos == posExt)
|
||||
continue;
|
||||
|
||||
std::wstring sExt = sCheckFile.substr(posExt + 1);
|
||||
if (sExt == L"rels")
|
||||
m_rels.push_back(sCheckFile);
|
||||
else
|
||||
m_files.push_back(sCheckFile);
|
||||
}
|
||||
|
||||
std::sort(m_rels.begin(), m_rels.end());
|
||||
std::sort(m_files.begin(), m_files.end());
|
||||
}
|
||||
|
||||
void WriteRelsReferences(NSStringUtils::CStringBuilder& builder)
|
||||
{
|
||||
for (std::vector<std::wstring>::iterator i = m_rels.begin(); i != m_rels.end(); i++)
|
||||
{
|
||||
builder.WriteString(GetRelsReference(*i));
|
||||
}
|
||||
}
|
||||
|
||||
void WriteFilesReferences(NSStringUtils::CStringBuilder& builder)
|
||||
{
|
||||
for (std::vector<std::wstring>::iterator i = m_files.begin(); i != m_files.end(); i++)
|
||||
{
|
||||
std::wstring sFile = *i;
|
||||
std::wstring sContentType = L"application/xml";
|
||||
|
||||
std::map<std::wstring, std::wstring>::iterator _find = m_content_types.find(sFile);
|
||||
if (_find != m_content_types.end())
|
||||
{
|
||||
sContentType = _find->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::wstring::size_type posExt = sFile.rfind(L".");
|
||||
if (std::wstring::npos != posExt)
|
||||
{
|
||||
std::wstring sExt = sFile.substr(posExt + 1);
|
||||
|
||||
_find = m_content_types.find(sExt);
|
||||
if (_find != m_content_types.end())
|
||||
sContentType = _find->second;
|
||||
}
|
||||
}
|
||||
|
||||
builder.WriteString(GetReference(sFile, sContentType));
|
||||
}
|
||||
}
|
||||
|
||||
void WriteManifest(NSStringUtils::CStringBuilder& builder)
|
||||
{
|
||||
builder.WriteString(L"<Manifest>");
|
||||
WriteRelsReferences(builder);
|
||||
WriteFilesReferences(builder);
|
||||
builder.WriteString(L"</Manifest>");
|
||||
}
|
||||
|
||||
void CorrectContentTypes(int nCountSigsNeeds)
|
||||
{
|
||||
std::wstring file = m_sFolder + L"/[Content_Types].xml";
|
||||
XmlUtils::CXmlNode oNode;
|
||||
oNode.FromXmlFile(file);
|
||||
|
||||
XmlUtils::CXmlNodes nodesDefaults;
|
||||
oNode.GetNodes(L"Default", nodesDefaults);
|
||||
|
||||
XmlUtils::CXmlNodes nodesOverrides;
|
||||
oNode.GetNodes(L"Override", nodesOverrides);
|
||||
|
||||
std::string sAddition = "";
|
||||
|
||||
bool bIsSigsExist = false;
|
||||
int nCount = nodesDefaults.GetCount();
|
||||
for (int i = 0; i < nCount; ++i)
|
||||
{
|
||||
XmlUtils::CXmlNode node;
|
||||
nodesDefaults.GetAt(i, node);
|
||||
|
||||
if ("sigs" == node.GetAttributeA("Extension") &&
|
||||
"application/vnd.openxmlformats-package.digital-signature-origin" == node.GetAttributeA("ContentType"))
|
||||
{
|
||||
bIsSigsExist = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bIsSigsExist)
|
||||
sAddition += "<Default Extension=\"sigs\" ContentType=\"application/vnd.openxmlformats-package.digital-signature-origin\"/>";
|
||||
|
||||
int nCountSigs = 0;
|
||||
nCount = nodesOverrides.GetCount();
|
||||
for (int i = 0; i < nCount; ++i)
|
||||
{
|
||||
XmlUtils::CXmlNode node;
|
||||
nodesOverrides.GetAt(i, node);
|
||||
|
||||
if ("application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml" == node.GetAttributeA("ContentType"))
|
||||
{
|
||||
++nCountSigs;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = nCountSigs; i < nCountSigsNeeds; ++i)
|
||||
{
|
||||
sAddition += "<Override PartName=\"/_xmlsignatures/sig";
|
||||
sAddition += std::to_string(i + 1);
|
||||
sAddition += ".xml\" ContentType=\"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml\"/>";
|
||||
}
|
||||
|
||||
std::string sXmlA;
|
||||
NSFile::CFileBinary::ReadAllTextUtf8A(file, sXmlA);
|
||||
|
||||
std::string::size_type pos = sXmlA.rfind("</Types>");
|
||||
if (pos == std::string::npos)
|
||||
return;
|
||||
|
||||
std::string sRet = sXmlA.substr(0, pos);
|
||||
sRet += sAddition;
|
||||
sRet += "</Types>";
|
||||
|
||||
NSFile::CFileBinary::Remove(file);
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(file);
|
||||
oFile.WriteFile((BYTE*)sRet.c_str(), (DWORD)sRet.length());
|
||||
oFile.CloseFile();
|
||||
}
|
||||
|
||||
void SetGuid(const std::wstring& guid)
|
||||
{
|
||||
m_guid = guid;
|
||||
}
|
||||
void SetImageValid(const std::wstring& file)
|
||||
{
|
||||
m_image_valid = GetImageBase64(file);
|
||||
}
|
||||
void SetImageInvalid(const std::wstring& file)
|
||||
{
|
||||
m_image_invalid = GetImageBase64(file);
|
||||
}
|
||||
|
||||
std::wstring GeneratePackageObject()
|
||||
{
|
||||
NSStringUtils::CStringBuilder builder;
|
||||
WriteManifest(builder);
|
||||
|
||||
builder.WriteString(L"<SignatureProperties><SignatureProperty Id=\"idSignatureTime\" Target=\"#idPackageSignature\">");
|
||||
builder.WriteString(L"<mdssi:SignatureTime xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\">");
|
||||
builder.WriteString(L"<mdssi:Format>YYYY-MM-DDThh:mm:ssTZD</mdssi:Format>");
|
||||
builder.WriteString(L"<mdssi:Value>");
|
||||
builder.WriteString(m_date);
|
||||
builder.WriteString(L"</mdssi:Value>");
|
||||
builder.WriteString(L"</mdssi:SignatureTime></SignatureProperty></SignatureProperties>");
|
||||
|
||||
std::wstring sXml = builder.GetData();
|
||||
|
||||
m_signed_info.WriteString("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idPackageObject\">");
|
||||
m_signed_info.WriteString(GetReferenceMain(sXml, L"idPackageObject", false));
|
||||
m_signed_info.WriteString("</Reference>");
|
||||
|
||||
return (L"<Object Id=\"idPackageObject\">" + sXml + L"</Object>");
|
||||
}
|
||||
std::wstring GenerateOfficeObject()
|
||||
{
|
||||
NSStringUtils::CStringBuilder builder;
|
||||
|
||||
builder.WriteString(L"<SignatureProperties><SignatureProperty Id=\"idOfficeV1Details\" Target=\"#idPackageSignature\">");
|
||||
builder.WriteString(L"<SignatureInfoV1 xmlns=\"http://schemas.microsoft.com/office/2006/digsig\">");
|
||||
builder.WriteString(L"<SetupID>");
|
||||
builder.WriteString(m_guid);
|
||||
builder.WriteString(L"</SetupID>");
|
||||
builder.WriteString(L"<SignatureText></SignatureText>");
|
||||
builder.WriteString(L"<SignatureImage>");
|
||||
builder.WriteString(m_image_valid);
|
||||
builder.WriteString(L"</SignatureImage>");
|
||||
builder.WriteString(L"<SignatureComments/>\
|
||||
<WindowsVersion>10.0</WindowsVersion>\
|
||||
<OfficeVersion>16.0</OfficeVersion>\
|
||||
<ApplicationVersion>16.0</ApplicationVersion>\
|
||||
<Monitors>2</Monitors>\
|
||||
<HorizontalResolution>1680</HorizontalResolution>\
|
||||
<VerticalResolution>1050</VerticalResolution>\
|
||||
<ColorDepth>32</ColorDepth>\
|
||||
<SignatureProviderId>{00000000-0000-0000-0000-000000000000}</SignatureProviderId>\
|
||||
<SignatureProviderUrl/>\
|
||||
<SignatureProviderDetails>9</SignatureProviderDetails>\
|
||||
<SignatureType>2</SignatureType>\
|
||||
</SignatureInfoV1>\
|
||||
</SignatureProperty>\
|
||||
</SignatureProperties>");
|
||||
|
||||
m_signed_info.WriteString("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idOfficeObject\">");
|
||||
m_signed_info.WriteString(GetReferenceMain(builder.GetData(), L"idOfficeObject", false));
|
||||
m_signed_info.WriteString("</Reference>");
|
||||
|
||||
return (L"<Object Id=\"idOfficeObject\">" + builder.GetData() + L"</Object>");
|
||||
}
|
||||
|
||||
std::wstring GenerateImageObject()
|
||||
{
|
||||
if (m_image_valid.empty())
|
||||
return L"";
|
||||
|
||||
m_signed_info.WriteString("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idValidSigLnImg\">");
|
||||
m_signed_info.WriteString(GetReferenceMain(m_image_valid, L"idValidSigLnImg", false));
|
||||
m_signed_info.WriteString("</Reference>");
|
||||
|
||||
m_signed_info.WriteString("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idInvalidSigLnImg\">");
|
||||
m_signed_info.WriteString(GetReferenceMain(m_image_invalid, L"idInvalidSigLnImg", false));
|
||||
m_signed_info.WriteString("</Reference>");
|
||||
|
||||
return (L"<Object Id=\"idValidSigLnImg\">" + m_image_valid + L"</Object><Object Id=\"idInvalidSigLnImg\">" + m_image_invalid + L"</Object>");
|
||||
}
|
||||
|
||||
std::wstring GenerateSignPropertiesObject()
|
||||
{
|
||||
std::wstring sName = m_certificate->GetSignerName();
|
||||
|
||||
std::string sKeyA = m_certificate->GetNumber();
|
||||
std::wstring sKey = UTF8_TO_U(sKeyA);
|
||||
|
||||
std::wstring sXml = (L"<xd:SignedSignatureProperties>\
|
||||
<xd:SigningTime>" + m_date + L"</xd:SigningTime>\
|
||||
<xd:SigningCertificate>\
|
||||
<xd:Cert>\
|
||||
<xd:CertDigest>\
|
||||
<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/>\
|
||||
<DigestValue>MJJT2Y0iMxaPGVXBmOLb9bY60pA=</DigestValue>\
|
||||
</xd:CertDigest>\
|
||||
<xd:IssuerSerial>\
|
||||
<X509IssuerName>CN=" + sName + L"</X509IssuerName>\
|
||||
<X509SerialNumber>" + sKey + L"</X509SerialNumber>\
|
||||
</xd:IssuerSerial>\
|
||||
</xd:Cert>\
|
||||
</xd:SigningCertificate>\
|
||||
<xd:SignaturePolicyIdentifier>\
|
||||
<xd:SignaturePolicyImplied/>\
|
||||
</xd:SignaturePolicyIdentifier>\
|
||||
</xd:SignedSignatureProperties>");
|
||||
|
||||
std::wstring sSignedXml = L"<xd:SignedProperties xmlns=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:xd=\"http://uri.etsi.org/01903/v1.3.2#\" Id=\"idSignedProperties\">";
|
||||
sSignedXml += sXml;
|
||||
sSignedXml += L"</xd:SignedProperties>";
|
||||
|
||||
std::string sXmlTmp = CXmlCanonicalizator::Execute(U_TO_UTF8(sSignedXml), XML_C14N_1_0);
|
||||
|
||||
m_signed_info.WriteString("<Reference Type=\"http://uri.etsi.org/01903#SignedProperties\" URI=\"#idSignedProperties\">");
|
||||
m_signed_info.WriteString("<Transforms><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>");
|
||||
m_signed_info.WriteString("<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/><DigestValue>");
|
||||
m_signed_info.WriteString(m_certificate->GetHash(sXmlTmp));
|
||||
m_signed_info.WriteString("</DigestValue></Reference>");
|
||||
|
||||
return (L"<Object><xd:QualifyingProperties xmlns:xd=\"http://uri.etsi.org/01903/v1.3.2#\" Target=\"#idPackageSignature\">\
|
||||
<xd:SignedProperties Id=\"idSignedProperties\">" + sXml + L"</xd:SignedProperties></xd:QualifyingProperties></Object>");
|
||||
}
|
||||
|
||||
int AddSignatureReference()
|
||||
{
|
||||
std::wstring sDirectory = m_sFolder + L"/_xmlsignatures";
|
||||
|
||||
if (!NSDirectory::Exists(sDirectory))
|
||||
NSDirectory::CreateDirectory(sDirectory);
|
||||
|
||||
if (!NSFile::CFileBinary::Exists(sDirectory + L"/origin.sigs"))
|
||||
{
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(sDirectory + L"/origin.sigs");
|
||||
oFile.CloseFile();
|
||||
}
|
||||
|
||||
if (!NSDirectory::Exists(sDirectory + L"/_rels"))
|
||||
NSDirectory::CreateDirectory(sDirectory + L"/_rels");
|
||||
|
||||
int nSignNum = GetCountSigns(sDirectory + L"/_rels/origin.sigs.rels");
|
||||
|
||||
CorrectContentTypes(nSignNum);
|
||||
|
||||
return nSignNum;
|
||||
}
|
||||
|
||||
void Sign()
|
||||
{
|
||||
Parse();
|
||||
|
||||
std::string sSignedData;
|
||||
|
||||
NSStringUtils::CStringBuilder builderMain;
|
||||
|
||||
builderMain.WriteString(GeneratePackageObject());
|
||||
builderMain.WriteString(GenerateOfficeObject());
|
||||
builderMain.WriteString(GenerateSignPropertiesObject());
|
||||
builderMain.WriteString(GenerateImageObject());
|
||||
|
||||
std::string sSignedInfoData = m_signed_info.GetData();
|
||||
std::string sSignedXml = "<SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" + sSignedInfoData + "</SignedInfo>";
|
||||
sSignedXml = CXmlCanonicalizator::Execute(sSignedXml, XML_C14N_1_0);
|
||||
sSignedXml = m_certificate->Sign(sSignedXml);
|
||||
|
||||
NSStringUtils::CStringBuilder builderResult;
|
||||
builderResult.WriteString(L"<?xml version=\"1.0\" encoding=\"UTF-8\"?><Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\" Id=\"idPackageSignature\"><SignedInfo>");
|
||||
builderResult.WriteString(UTF8_TO_U(sSignedInfoData));
|
||||
builderResult.WriteString(L"</SignedInfo>");
|
||||
builderResult.WriteString(L"<SignatureValue>");
|
||||
builderResult.WriteString(UTF8_TO_U(sSignedXml));
|
||||
builderResult.WriteString(L"</SignatureValue>");
|
||||
builderResult.WriteString(L"<KeyInfo><X509Data><X509Certificate>");
|
||||
builderResult.WriteString(UTF8_TO_U(m_certificate->GetCertificateBase64()));
|
||||
builderResult.WriteString(L"</X509Certificate></X509Data></KeyInfo>");
|
||||
|
||||
builderResult.Write(builderMain);
|
||||
builderResult.WriteString(L"</Signature>");
|
||||
|
||||
int nSignNum = AddSignatureReference();
|
||||
|
||||
NSFile::CFileBinary::SaveToFile(m_sFolder + L"/_xmlsignatures/sig" + std::to_wstring(nSignNum) + L".xml", builderResult.GetData(), false);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //_XML_OOXMLSIGNER_H_
|
||||
88
DesktopEditor/xmlsec/src/XmlCanonicalizator.h
Normal file
88
DesktopEditor/xmlsec/src/XmlCanonicalizator.h
Normal file
@ -0,0 +1,88 @@
|
||||
#ifndef _XML_CANONICALIZATOR_H_
|
||||
#define _XML_CANONICALIZATOR_H_
|
||||
|
||||
#include "../../common/File.h"
|
||||
#include "../../common/Directory.h"
|
||||
|
||||
#include "../../common/StringBuilder.h"
|
||||
#include "../../xml/include/xmlutils.h"
|
||||
#include "../../xml/libxml2/include/libxml/c14n.h"
|
||||
|
||||
#ifndef XML_UNUSED
|
||||
#define XML_UNUSED( arg ) ( (arg) = (arg) )
|
||||
#endif
|
||||
|
||||
class CXmlCanonicalizator
|
||||
{
|
||||
private:
|
||||
class CXmlBuffer
|
||||
{
|
||||
public:
|
||||
NSStringUtils::CStringBuilderA builder;
|
||||
|
||||
public:
|
||||
CXmlBuffer()
|
||||
{
|
||||
}
|
||||
~CXmlBuffer()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
static int buffer_xmlBufferIOWrite(CXmlBuffer* buf, const char* buffer, int len)
|
||||
{
|
||||
buf->builder.WriteString(buffer, (size_t)len);
|
||||
return len;
|
||||
}
|
||||
|
||||
static int buffer_xmlBufferIOClose(CXmlBuffer* buf)
|
||||
{
|
||||
XML_UNUSED(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int buffer_xmlC14NIsVisibleCallback(void * user_data, xmlNodePtr node, xmlNodePtr parent)
|
||||
{
|
||||
XML_UNUSED(user_data);
|
||||
XML_UNUSED(parent);
|
||||
if (node->type == XML_TEXT_NODE)
|
||||
{
|
||||
const char* cur = (char*)node->content;
|
||||
size_t size = strlen(cur);
|
||||
for (size_t i = 0; i < size; ++i, ++cur)
|
||||
{
|
||||
if (*cur != '\n' && *cur != '\r' && *cur != '\t')
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
public:
|
||||
static std::string Execute(const std::string& sXml, int mode = XML_C14N_1_0, bool withComments = false)
|
||||
{
|
||||
xmlDocPtr xmlDoc = xmlParseMemory((char*)sXml.c_str(), (int)sXml.length());
|
||||
|
||||
CXmlBuffer bufferC14N;
|
||||
xmlOutputBufferPtr _buffer = xmlOutputBufferCreateIO((xmlOutputWriteCallback)buffer_xmlBufferIOWrite,
|
||||
(xmlOutputCloseCallback)buffer_xmlBufferIOClose,
|
||||
&bufferC14N,
|
||||
NULL);
|
||||
|
||||
xmlC14NExecute(xmlDoc, buffer_xmlC14NIsVisibleCallback, NULL, mode, NULL, withComments ? 1 : 0, _buffer);
|
||||
|
||||
xmlOutputBufferClose(_buffer);
|
||||
|
||||
return bufferC14N.builder.GetData();
|
||||
}
|
||||
|
||||
static std::string Execute(const std::wstring& sXmlFile, int mode = XML_C14N_1_0, bool withComments = false)
|
||||
{
|
||||
std::string sXml;
|
||||
NSFile::CFileBinary::ReadAllTextUtf8A(sXmlFile, sXml);
|
||||
return Execute(sXml, mode, withComments);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //_XML_CANONICALIZATOR_H_
|
||||
199
DesktopEditor/xmlsec/src/XmlRels.h
Normal file
199
DesktopEditor/xmlsec/src/XmlRels.h
Normal file
@ -0,0 +1,199 @@
|
||||
#ifndef _XML_RELS_H_
|
||||
#define _XML_RELS_H_
|
||||
|
||||
#include "./XmlCanonicalizator.h"
|
||||
|
||||
class COOXMLRelationship
|
||||
{
|
||||
public:
|
||||
std::wstring rid;
|
||||
std::wstring type;
|
||||
std::wstring target;
|
||||
std::wstring target_mode;
|
||||
|
||||
public:
|
||||
|
||||
COOXMLRelationship()
|
||||
{
|
||||
}
|
||||
|
||||
COOXMLRelationship(XmlUtils::CXmlNode& node)
|
||||
{
|
||||
rid = node.GetAttribute("Id");
|
||||
type = node.GetAttribute("Type");
|
||||
target = node.GetAttribute("Target");
|
||||
|
||||
CheckTargetMode();
|
||||
}
|
||||
|
||||
std::wstring GetXml()
|
||||
{
|
||||
NSStringUtils::CStringBuilder builder;
|
||||
builder.WriteString(L"<Relationship Id=\"");
|
||||
builder.WriteEncodeXmlString(rid);
|
||||
builder.WriteString(L"\" Type=\"");
|
||||
builder.WriteEncodeXmlString(type);
|
||||
builder.WriteString(L"\" Target=\"");
|
||||
builder.WriteEncodeXmlString(target);
|
||||
builder.WriteString(L"\" TargetMode=\"");
|
||||
builder.WriteEncodeXmlString(target_mode);
|
||||
builder.WriteString(L"\" />");
|
||||
return builder.GetData();
|
||||
}
|
||||
|
||||
static bool Compare(const COOXMLRelationship& i, const COOXMLRelationship& j)
|
||||
{
|
||||
return i.rid < j.rid;
|
||||
}
|
||||
|
||||
protected:
|
||||
void CheckTargetMode()
|
||||
{
|
||||
if (0 == target.find(L"http") || 0 == target.find(L"www") || 0 == target.find(L"ftp"))
|
||||
target_mode = L"External";
|
||||
else
|
||||
target_mode = L"Internal";
|
||||
}
|
||||
};
|
||||
|
||||
class COOXMLRelationships
|
||||
{
|
||||
public:
|
||||
std::vector<COOXMLRelationship> rels;
|
||||
|
||||
public:
|
||||
|
||||
COOXMLRelationships()
|
||||
{
|
||||
}
|
||||
|
||||
COOXMLRelationships(const std::string& xml, std::map<std::wstring, bool>* check_need = NULL)
|
||||
{
|
||||
XmlUtils::CXmlNode oNode;
|
||||
if (!oNode.FromXmlStringA(xml))
|
||||
return;
|
||||
|
||||
FromXmlNode(oNode, check_need);
|
||||
}
|
||||
|
||||
COOXMLRelationships(const std::wstring& xml, const bool& is_file, std::map<std::wstring, bool>* check_need = NULL)
|
||||
{
|
||||
XmlUtils::CXmlNode oNode;
|
||||
|
||||
if (!is_file)
|
||||
{
|
||||
if (!oNode.FromXmlString(xml))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!oNode.FromXmlFile(xml))
|
||||
return;
|
||||
}
|
||||
|
||||
FromXmlNode(oNode, check_need);
|
||||
}
|
||||
|
||||
void FromXmlNode(XmlUtils::CXmlNode& oNode, std::map<std::wstring, bool>* check_need = NULL)
|
||||
{
|
||||
XmlUtils::CXmlNodes oNodes;
|
||||
if (!oNode.GetNodes(L"Relationship", oNodes))
|
||||
return;
|
||||
|
||||
int nCount = oNodes.GetCount();
|
||||
for (int i = 0; i < nCount; ++i)
|
||||
{
|
||||
XmlUtils::CXmlNode oRel;
|
||||
oNodes.GetAt(i, oRel);
|
||||
|
||||
if (NULL == check_need)
|
||||
{
|
||||
rels.push_back(COOXMLRelationship(oRel));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::wstring sRid = oRel.GetAttribute("Id");
|
||||
if (check_need->find(sRid) != check_need->end())
|
||||
rels.push_back(COOXMLRelationship(oRel));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::wstring GetXml()
|
||||
{
|
||||
NSStringUtils::CStringBuilder builder;
|
||||
|
||||
builder.WriteString(L"<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
|
||||
|
||||
// sort by rId
|
||||
std::sort(rels.begin(), rels.end(), COOXMLRelationship::Compare);
|
||||
|
||||
for (std::vector<COOXMLRelationship>::iterator i = rels.begin(); i != rels.end(); i++)
|
||||
builder.WriteString(i->GetXml());
|
||||
|
||||
builder.WriteString(L"</Relationships>");
|
||||
|
||||
return builder.GetData();
|
||||
}
|
||||
|
||||
std::wstring GetTransforms()
|
||||
{
|
||||
NSStringUtils::CStringBuilder builder;
|
||||
|
||||
builder.WriteString(L"<Transforms><Transform Algorithm=\"http://schemas.openxmlformats.org/package/2006/RelationshipTransform\">");
|
||||
|
||||
for (std::vector<COOXMLRelationship>::iterator i = rels.begin(); i != rels.end(); i++)
|
||||
{
|
||||
builder.WriteString(L"<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"");
|
||||
builder.WriteEncodeXmlString(i->rid);
|
||||
builder.WriteString(L"\" />");
|
||||
}
|
||||
|
||||
builder.WriteString(L"</Transform><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>");
|
||||
|
||||
return builder.GetData();
|
||||
}
|
||||
|
||||
void CheckOriginSigs(std::wstring& file)
|
||||
{
|
||||
int rId = 0;
|
||||
std::vector<COOXMLRelationship>::iterator i = rels.begin();
|
||||
while (i != rels.end())
|
||||
{
|
||||
if (0 == i->target.find(L"_xmlsignatures/"))
|
||||
return;
|
||||
|
||||
std::wstring rid = i->rid;
|
||||
rid = rid.substr(3);
|
||||
|
||||
int nTemp = std::stoi(rid);
|
||||
|
||||
if (nTemp > rId)
|
||||
rId = nTemp;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
std::string sXmlA;
|
||||
NSFile::CFileBinary::ReadAllTextUtf8A(file, sXmlA);
|
||||
|
||||
std::string::size_type pos = sXmlA.rfind("</Relationships>");
|
||||
if (pos == std::string::npos)
|
||||
return;
|
||||
|
||||
rId++;
|
||||
std::string sRet = sXmlA.substr(0, pos);
|
||||
sRet += ("<Relationship Id=\"rId" + std::to_string(rId) + "\" \
|
||||
Type=\"http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin\" Target=\"_xmlsignatures/origin.sigs\"/>\
|
||||
</Relationships>");
|
||||
|
||||
NSFile::CFileBinary::Remove(file);
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(file);
|
||||
oFile.WriteFile((BYTE*)sRet.c_str(), (DWORD)sRet.length());
|
||||
oFile.CloseFile();
|
||||
}
|
||||
};
|
||||
|
||||
#endif //_XML_RELS_H_
|
||||
40
DesktopEditor/xmlsec/src/XmlSignerBase.h
Normal file
40
DesktopEditor/xmlsec/src/XmlSignerBase.h
Normal file
@ -0,0 +1,40 @@
|
||||
#ifndef _XMLSIGNER_BASE_H_
|
||||
#define _XMLSIGNER_BASE_H_
|
||||
|
||||
#include "../../common/File.h"
|
||||
#include "../../common/BigInteger.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
class ICertificate
|
||||
{
|
||||
public:
|
||||
ICertificate()
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~ICertificate()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual std::string GetNumber() = 0;
|
||||
virtual std::wstring GetSignerName() = 0;
|
||||
|
||||
virtual std::string GetCertificateBase64() = 0;
|
||||
virtual std::string GetCertificateHash() = 0;
|
||||
|
||||
public:
|
||||
virtual std::string Sign(std::string sXml) = 0;
|
||||
virtual std::string GetHash(unsigned char* pData, unsigned int nSize) = 0;
|
||||
virtual std::string GetHash(std::string& sXml) = 0;
|
||||
virtual std::string GetHash(std::wstring& sXmlFile) = 0;
|
||||
virtual bool Verify(std::string& sXml, std::string& sXmlSignature) = 0;
|
||||
|
||||
public:
|
||||
virtual bool ShowSelectDialog() = 0;
|
||||
};
|
||||
|
||||
#endif // _XMLSIGNER_BASE_H_
|
||||
314
DesktopEditor/xmlsec/src/XmlSigner_mscrypto.h
Normal file
314
DesktopEditor/xmlsec/src/XmlSigner_mscrypto.h
Normal file
@ -0,0 +1,314 @@
|
||||
#ifndef _XMLSIGNER_MSCRYPTO_H_
|
||||
#define _XMLSIGNER_MSCRYPTO_H_
|
||||
|
||||
#include "./XmlSignerBase.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
#include <cryptuiapi.h>
|
||||
|
||||
class CCertificate_mscrypto : public ICertificate
|
||||
{
|
||||
public:
|
||||
HCERTSTORE m_store;
|
||||
PCCERT_CONTEXT m_context;
|
||||
|
||||
public:
|
||||
CCertificate_mscrypto() : ICertificate()
|
||||
{
|
||||
m_store = NULL;
|
||||
m_context = NULL;
|
||||
}
|
||||
CCertificate_mscrypto(PCCERT_CONTEXT ctx) : ICertificate()
|
||||
{
|
||||
m_store = NULL;
|
||||
m_context = ctx;
|
||||
}
|
||||
|
||||
virtual ~CCertificate_mscrypto()
|
||||
{
|
||||
if (m_store != NULL)
|
||||
{
|
||||
if (NULL != m_context)
|
||||
CertFreeCertificateContext(m_context);
|
||||
|
||||
CertCloseStore(m_store, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
virtual std::string GetNumber()
|
||||
{
|
||||
if (!m_context)
|
||||
return "";
|
||||
|
||||
int nNumberLen = (int)m_context->pCertInfo->SerialNumber.cbData;
|
||||
BYTE* pNumberData = new BYTE[nNumberLen];
|
||||
ConvertEndian(m_context->pCertInfo->SerialNumber.pbData, pNumberData, (DWORD)nNumberLen);
|
||||
CBigInteger oInteger(pNumberData, nNumberLen);
|
||||
delete[] pNumberData;
|
||||
|
||||
return oInteger.ToString();
|
||||
}
|
||||
|
||||
virtual std::wstring GetSignerName()
|
||||
{
|
||||
if (!m_context)
|
||||
return L"";
|
||||
|
||||
DWORD dwNameLen = CertGetNameStringW(m_context, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, NULL, 0);
|
||||
wchar_t* pNameData = new wchar_t[dwNameLen];
|
||||
CertGetNameStringW(m_context, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, pNameData, dwNameLen);
|
||||
std::wstring sName(pNameData);
|
||||
RELEASEARRAYOBJECTS(pNameData);
|
||||
return sName;
|
||||
}
|
||||
|
||||
virtual std::string GetCertificateBase64()
|
||||
{
|
||||
if (!m_context)
|
||||
return "";
|
||||
|
||||
char* pData = NULL;
|
||||
int nDataLen = 0;
|
||||
NSFile::CBase64Converter::Encode(m_context->pbCertEncoded, (int)m_context->cbCertEncoded, pData, nDataLen, NSBase64::B64_BASE64_FLAG_NOCRLF);
|
||||
std::string sReturn(pData, nDataLen);
|
||||
RELEASEARRAYOBJECTS(pData);
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
virtual std::string GetCertificateHash()
|
||||
{
|
||||
return GetHash(m_context->pbCertEncoded, (unsigned int)m_context->cbCertEncoded);
|
||||
}
|
||||
|
||||
public:
|
||||
virtual std::string Sign(std::string sXml)
|
||||
{
|
||||
BOOL bResult = TRUE;
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return "";
|
||||
|
||||
bResult = CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
if (!bResult)
|
||||
{
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
bResult = CryptHashData(hHash, (BYTE*)sXml.c_str(), (DWORD)sXml.length(), 0);
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
DWORD dwSigLen = 0;
|
||||
BYTE* pbSignature = NULL;
|
||||
bResult = CryptSignHash(hHash, dwKeySpec, NULL, 0, NULL, &dwSigLen);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
pbSignature = new BYTE[dwSigLen];
|
||||
bResult = CryptSignHash(hHash, dwKeySpec, NULL, 0, pbSignature, &dwSigLen);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
BYTE* pbSignatureMem = new BYTE[dwSigLen];
|
||||
ConvertEndian(pbSignature, pbSignatureMem, dwSigLen);
|
||||
|
||||
char* pBase64 = NULL;
|
||||
int nBase64Len = 0;
|
||||
NSFile::CBase64Converter::Encode(pbSignatureMem, (int)dwSigLen, pBase64, nBase64Len, NSBase64::B64_BASE64_FLAG_NONE);
|
||||
|
||||
delete[] pbSignature;
|
||||
delete[] pbSignatureMem;
|
||||
|
||||
bResult = CryptDestroyHash(hHash);
|
||||
|
||||
std::string sReturn(pBase64, nBase64Len);
|
||||
|
||||
delete[] pBase64;
|
||||
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
virtual std::string GetHash(unsigned char* pData, unsigned int nSize)
|
||||
{
|
||||
BOOL bResult = TRUE;
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
|
||||
DWORD dwSize = (DWORD)nSize;
|
||||
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return "";
|
||||
|
||||
bResult = CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
if (!bResult)
|
||||
{
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
bResult = CryptHashData(hHash, pData, dwSize, 0);
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
DWORD cbHashSize = 0, dwCount = sizeof(DWORD);
|
||||
bResult = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &dwCount, 0);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
BYTE* pDataHashRaw = new BYTE[dwCount];
|
||||
|
||||
bResult = CryptGetHashParam(hHash, HP_HASHVAL, pDataHashRaw, &cbHashSize, 0);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
char* pBase64_hash = NULL;
|
||||
int nBase64Len_hash = 0;
|
||||
NSFile::CBase64Converter::Encode(pDataHashRaw, (int)cbHashSize, pBase64_hash, nBase64Len_hash, NSBase64::B64_BASE64_FLAG_NOCRLF);
|
||||
|
||||
std::string sReturn(pBase64_hash, nBase64Len_hash);
|
||||
delete [] pBase64_hash;
|
||||
|
||||
//delete [] pDataHashRaw;
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
virtual std::string GetHash(std::string& sXml)
|
||||
{
|
||||
return GetHash((BYTE*)sXml.c_str(), (DWORD)sXml.length());
|
||||
}
|
||||
|
||||
virtual std::string GetHash(std::wstring& sXmlFile)
|
||||
{
|
||||
BYTE* pFileData = NULL;
|
||||
DWORD dwFileDataLen = 0;
|
||||
NSFile::CFileBinary::ReadAllBytes(sXmlFile, &pFileData, dwFileDataLen);
|
||||
|
||||
if (0 == dwFileDataLen)
|
||||
return "";
|
||||
|
||||
std::string sReturn = GetHash(pFileData, dwFileDataLen);
|
||||
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
virtual bool Verify(std::string& sXml, std::string& sXmlSignature)
|
||||
{
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
HCRYPTKEY hPubKey = NULL;
|
||||
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
BOOL bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return FALSE;
|
||||
|
||||
bResult = CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BYTE* pDataHash = NULL;
|
||||
DWORD dwHashLen = 0;
|
||||
int nTmp = 0;
|
||||
NSFile::CBase64Converter::Decode((char*)sXmlSignature.c_str(), (int)sXmlSignature.length(), pDataHash, nTmp);
|
||||
dwHashLen = (DWORD)nTmp;
|
||||
|
||||
BYTE* pDataHashMem = new BYTE[dwHashLen];
|
||||
ConvertEndian(pDataHash, pDataHashMem, dwHashLen);
|
||||
|
||||
RELEASEARRAYOBJECTS(pDataHash);
|
||||
|
||||
bResult = CryptHashData(hHash, (BYTE*)sXml.c_str(), (DWORD)sXml.length(), 0);
|
||||
|
||||
// Get the public key from the certificate
|
||||
CryptImportPublicKeyInfo(hCryptProv, m_context->dwCertEncodingType, &m_context->pCertInfo->SubjectPublicKeyInfo, &hPubKey);
|
||||
|
||||
BOOL bResultRet = CryptVerifySignature(hHash, pDataHashMem, dwHashLen, hPubKey, NULL, 0);
|
||||
|
||||
delete[] pDataHashMem;
|
||||
|
||||
bResult = CryptDestroyHash(hHash);
|
||||
|
||||
CryptDestroyKey(hPubKey);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return bResultRet && bResult;
|
||||
}
|
||||
|
||||
public:
|
||||
virtual bool ShowSelectDialog()
|
||||
{
|
||||
m_store = CertOpenSystemStoreA(NULL, "MY");
|
||||
if (!m_store)
|
||||
return false;
|
||||
|
||||
m_context = CryptUIDlgSelectCertificateFromStore(m_store, NULL, NULL, NULL, CRYPTUI_SELECT_LOCATION_COLUMN, 0, NULL);
|
||||
if (!m_context)
|
||||
{
|
||||
CertCloseStore(m_store, 0);
|
||||
m_store = NULL;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
void ConvertEndian(const BYTE* src, BYTE* dst, DWORD size)
|
||||
{
|
||||
for(BYTE* p = dst + size - 1; p >= dst; ++src, --p)
|
||||
(*p) = (*src);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // _XMLSIGNER_MSCRYPTO_H_
|
||||
186
DesktopEditor/xmlsec/src/XmlTransform.h
Normal file
186
DesktopEditor/xmlsec/src/XmlTransform.h
Normal file
@ -0,0 +1,186 @@
|
||||
#ifndef _XML_TRANSFORM_H_
|
||||
#define _XML_TRANSFORM_H_
|
||||
|
||||
#include "./XmlRels.h"
|
||||
|
||||
class IXmlTransform
|
||||
{
|
||||
protected:
|
||||
std::string m_algorithm;
|
||||
|
||||
public:
|
||||
IXmlTransform()
|
||||
{
|
||||
m_algorithm = "";
|
||||
}
|
||||
virtual ~IXmlTransform()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual std::string Transform(const std::string& sXml) = 0;
|
||||
virtual void LoadFromXml(XmlUtils::CXmlNode& node) = 0;
|
||||
|
||||
static IXmlTransform* GetFromType(const std::string& alg);
|
||||
};
|
||||
|
||||
class CXmlTransformRelationship : public IXmlTransform
|
||||
{
|
||||
protected:
|
||||
std::map<std::wstring, bool> m_arIds;
|
||||
|
||||
public:
|
||||
CXmlTransformRelationship() : IXmlTransform()
|
||||
{
|
||||
m_algorithm = "http://schemas.openxmlformats.org/package/2006/RelationshipTransform";
|
||||
}
|
||||
|
||||
virtual std::string Transform(const std::string& xml)
|
||||
{
|
||||
COOXMLRelationships _rels(xml, &m_arIds);
|
||||
return U_TO_UTF8(_rels.GetXml());
|
||||
}
|
||||
|
||||
virtual void LoadFromXml(XmlUtils::CXmlNode& node)
|
||||
{
|
||||
XmlUtils::CXmlNodes oNodesIds;
|
||||
node.GetChilds(oNodesIds);
|
||||
|
||||
int nCount = oNodesIds.GetCount();
|
||||
for (int i = 0; i < nCount; ++i)
|
||||
{
|
||||
XmlUtils::CXmlNode _node;
|
||||
oNodesIds.GetAt(i, _node);
|
||||
|
||||
std::wstring sType = _node.GetAttribute("SourceId");
|
||||
if (!sType.empty())
|
||||
m_arIds.insert(std::pair<std::wstring, bool>(sType, true));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class CXmlTransformC14N : public IXmlTransform
|
||||
{
|
||||
protected:
|
||||
int m_mode;
|
||||
bool m_comments;
|
||||
|
||||
public:
|
||||
CXmlTransformC14N() : IXmlTransform()
|
||||
{
|
||||
m_mode = -1;
|
||||
m_comments = false;
|
||||
}
|
||||
|
||||
bool CheckC14NTransform(const std::string& alg)
|
||||
{
|
||||
m_mode = -1;
|
||||
if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315" == alg)
|
||||
{
|
||||
m_mode = XML_C14N_1_0;
|
||||
m_comments = false;
|
||||
}
|
||||
else if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments" == alg)
|
||||
{
|
||||
m_mode = XML_C14N_1_0;
|
||||
m_comments = true;
|
||||
}
|
||||
else if ("http://www.w3.org/2006/12/xml-c14n11" == alg)
|
||||
{
|
||||
m_mode = XML_C14N_1_1;
|
||||
m_comments = false;
|
||||
}
|
||||
else if ("http://www.w3.org/2006/12/xml-c14n11#WithComments" == alg)
|
||||
{
|
||||
m_mode = XML_C14N_1_1;
|
||||
m_comments = true;
|
||||
}
|
||||
else if ("http://www.w3.org/2001/10/xml-exc-c14n#" == alg)
|
||||
{
|
||||
m_mode = XML_C14N_EXCLUSIVE_1_0;
|
||||
m_comments = false;
|
||||
}
|
||||
else if ("http://www.w3.org/2001/10/xml-exc-c14n#WithComments" == alg)
|
||||
{
|
||||
m_mode = XML_C14N_EXCLUSIVE_1_0;
|
||||
m_comments = true;
|
||||
}
|
||||
return (-1 != m_mode) ? true : false;
|
||||
}
|
||||
|
||||
virtual std::string Transform(const std::string& xml)
|
||||
{
|
||||
// TODO
|
||||
return xml;
|
||||
}
|
||||
|
||||
virtual void LoadFromXml(XmlUtils::CXmlNode& node)
|
||||
{
|
||||
// none
|
||||
XML_UNUSED(node);
|
||||
}
|
||||
};
|
||||
|
||||
IXmlTransform* IXmlTransform::GetFromType(const std::string& alg)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
CXmlTransformRelationship* transform = new CXmlTransformRelationship();
|
||||
if (transform->m_algorithm == alg)
|
||||
return transform;
|
||||
RELEASEOBJECT(transform);
|
||||
}
|
||||
if (true)
|
||||
{
|
||||
CXmlTransformC14N* transform = new CXmlTransformC14N();
|
||||
if (transform->CheckC14NTransform(alg))
|
||||
return transform;
|
||||
RELEASEOBJECT(transform);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
class CXmlTransforms
|
||||
{
|
||||
protected:
|
||||
std::vector<IXmlTransform*> m_transforms;
|
||||
bool m_valid;
|
||||
|
||||
public:
|
||||
CXmlTransforms(XmlUtils::CXmlNode& node)
|
||||
{
|
||||
m_valid = true;
|
||||
|
||||
XmlUtils::CXmlNodes oNodes = node.GetNodes(L"Transform");
|
||||
int nCount = oNodes.GetCount();
|
||||
for (int i = 0; i < nCount; ++i)
|
||||
{
|
||||
XmlUtils::CXmlNode nodeTransform;
|
||||
oNodes.GetAt(i, nodeTransform);
|
||||
|
||||
IXmlTransform* pTransform = IXmlTransform::GetFromType(nodeTransform.GetAttributeA("Algorithm"));
|
||||
if (NULL == pTransform)
|
||||
{
|
||||
m_valid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
pTransform->LoadFromXml(nodeTransform);
|
||||
m_transforms.push_back(pTransform);
|
||||
}
|
||||
}
|
||||
|
||||
~CXmlTransforms()
|
||||
{
|
||||
for (std::vector<IXmlTransform*>::iterator i = m_transforms.begin(); i != m_transforms.end(); i++)
|
||||
{
|
||||
IXmlTransform* t = *i;
|
||||
RELEASEOBJECT(t);
|
||||
}
|
||||
m_transforms.clear();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif //_XML_TRANSFORM_H_
|
||||
@ -6,7 +6,9 @@ TEMPLATE = app
|
||||
CONFIG += console
|
||||
CONFIG -= app_bundle
|
||||
|
||||
DEFINES += UNICODE
|
||||
DEFINES -= \
|
||||
UNICODE \
|
||||
_UNICODE
|
||||
|
||||
CORE_ROOT_DIR = $$PWD/../../../..
|
||||
PWD_ROOT_DIR = $$PWD
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,7 @@
|
||||
QT -= core
|
||||
QT -= gui
|
||||
|
||||
VERSION = 2.4.455.0
|
||||
VERSION = 2.4.456.0
|
||||
DEFINES += INTVER=$$VERSION
|
||||
|
||||
TARGET = x2t
|
||||
|
||||
Reference in New Issue
Block a user