mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-11 10:26:00 +08:00
Compare commits
11 Commits
core-windo
...
core-windo
| Author | SHA1 | Date | |
|---|---|---|---|
| 65254b57b2 | |||
| 95899e23a8 | |||
| 5c8757d346 | |||
| 234e19d68a | |||
| 62145b7204 | |||
| 8bcc6d1501 | |||
| 09ef46f333 | |||
| 1839350526 | |||
| d7587e91b1 | |||
| 7b0a342cf9 | |||
| 3d01b0782e |
@ -54,7 +54,7 @@ int _tmain(int argc, _TCHAR* argv[])
|
||||
HRESULT hr = S_OK;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
std::wstring srcFileName = argv[1];
|
||||
std::wstring dstPath = argc > 2 ? argv[2] : srcFileName + L"-my.pptx"; //xlsx pptx docx
|
||||
std::wstring dstPath = argc > 2 ? argv[2] : srcFileName + L"-my.docx"; //xlsx pptx docx
|
||||
|
||||
std::wstring outputDir = NSDirectory::GetFolderPath(dstPath);
|
||||
|
||||
|
||||
@ -453,6 +453,7 @@ void draw_enhanced_geometry_attlist::add_attributes( const xml::attributes_wc_pt
|
||||
CP_APPLY_ATTR(L"draw:modifiers" , draw_modifiers_);
|
||||
CP_APPLY_ATTR(L"draw:text-path" , draw_text_path_);
|
||||
CP_APPLY_ATTR(L"draw:enhanced-path" , draw_enhanced_path_);
|
||||
CP_APPLY_ATTR(L"drawooo:enhanced-path" , drawooo_enhanced_path_);
|
||||
CP_APPLY_ATTR(L"drawooo:sub-view-size" , drawooo_sub_view_size_);
|
||||
}
|
||||
// draw:enhanced_geometry
|
||||
@ -485,6 +486,9 @@ void draw_enhanced_geometry::add_child_element( xml::sax * Reader, const std::ws
|
||||
}
|
||||
void draw_enhanced_geometry::find_draw_type_oox()
|
||||
{
|
||||
word_art_ = false;
|
||||
bOoxType_ = false;
|
||||
|
||||
if (draw_enhanced_geometry_attlist_.draw_text_path_ &&
|
||||
*draw_enhanced_geometry_attlist_.draw_text_path_ == true)
|
||||
{
|
||||
@ -501,7 +505,7 @@ void draw_enhanced_geometry::find_draw_type_oox()
|
||||
{
|
||||
int count = sizeof(_OO_OOX_wordart) / sizeof(_shape_converter);
|
||||
|
||||
for (long i=0; i< count; i++)
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
if (_OO_OOX_wordart[i].odf_reader == odf_type)
|
||||
{
|
||||
@ -518,7 +522,7 @@ void draw_enhanced_geometry::find_draw_type_oox()
|
||||
|
||||
if (pos < 0)
|
||||
{
|
||||
for (long i=0; i< count; i++)
|
||||
for (long i = 0; i< count; i++)
|
||||
{
|
||||
if (_OO_OOX_custom_shapes[i].odf_reader == odf_type)
|
||||
{
|
||||
@ -529,8 +533,9 @@ void draw_enhanced_geometry::find_draw_type_oox()
|
||||
}
|
||||
else
|
||||
{
|
||||
bOoxType_ = true;
|
||||
std::wstring oox_type = odf_type.substr(pos + 6);
|
||||
for (long i=0; i< count; i++)
|
||||
for (long i = 0; i< count; i++)
|
||||
{
|
||||
if (_OO_OOX_custom_shapes[i].oox == oox_type)
|
||||
{
|
||||
@ -547,18 +552,18 @@ void draw_enhanced_geometry::find_draw_type_oox()
|
||||
}
|
||||
std::wstringstream str;
|
||||
|
||||
BOOST_FOREACH(const office_element_ptr & parElement, draw_handle_)
|
||||
for (size_t i = 0; i < draw_handle_.size(); i++)
|
||||
{
|
||||
draw_handle * handle = dynamic_cast<draw_handle *>(parElement.get());
|
||||
|
||||
int min = -1;
|
||||
int max = -1;
|
||||
draw_handle * handle = dynamic_cast<draw_handle *>(draw_handle_[i].get());
|
||||
if (!handle) continue;
|
||||
|
||||
int min = -1, max = -1;
|
||||
|
||||
try
|
||||
{
|
||||
min = parsing(handle->draw_handle_attlist_.draw_handle_range_y_minimum_);//пока статик .. и выдается только цыфровое значение
|
||||
if (min<0)min = parsing(handle->draw_handle_attlist_.draw_handle_range_x_minimum_);
|
||||
if (min<0)min = parsing(handle->draw_handle_attlist_.draw_handle_radius_range_minimum_);
|
||||
if (min < 0) min = parsing(handle->draw_handle_attlist_.draw_handle_range_x_minimum_);
|
||||
if (min < 0) min = parsing(handle->draw_handle_attlist_.draw_handle_radius_range_minimum_);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
@ -574,7 +579,7 @@ void draw_enhanced_geometry::find_draw_type_oox()
|
||||
catch(...)
|
||||
{
|
||||
}
|
||||
draw_handle_geometry elm={min, max};
|
||||
draw_handle_geometry elm = {min, max};
|
||||
draw_handle_geometry_.push_back(elm);
|
||||
}
|
||||
}
|
||||
|
||||
@ -437,6 +437,7 @@ public:
|
||||
_CP_OPT(std::wstring) draw_modifiers_;
|
||||
_CP_OPT(bool) draw_text_path_;
|
||||
_CP_OPT(std::wstring) draw_enhanced_path_;
|
||||
_CP_OPT(std::wstring) drawooo_enhanced_path_;
|
||||
_CP_OPT(std::wstring) drawooo_sub_view_size_;
|
||||
};
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
@ -464,7 +465,9 @@ public:
|
||||
_CP_OPT(int) sub_type_;
|
||||
_CP_OPT(int) draw_type_oox_index_;
|
||||
_CP_OPT(std::wstring) svg_viewbox_;
|
||||
|
||||
bool word_art_;
|
||||
bool bOoxType_;
|
||||
|
||||
typedef std::pair<std::wstring,std::wstring> pair_string_value;
|
||||
|
||||
|
||||
@ -253,13 +253,19 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
|
||||
|
||||
set_shape = true;
|
||||
}
|
||||
|
||||
if (sub_type_)
|
||||
{
|
||||
shape->sub_type_ = sub_type_.get();
|
||||
set_shape = true;
|
||||
}
|
||||
std::wstring odf_path;
|
||||
if (draw_enhanced_geometry_attlist_.drawooo_enhanced_path_)
|
||||
odf_path = draw_enhanced_geometry_attlist_.drawooo_enhanced_path_.get();
|
||||
else if (draw_enhanced_geometry_attlist_.draw_enhanced_path_)
|
||||
odf_path = draw_enhanced_geometry_attlist_.draw_enhanced_path_.get();
|
||||
|
||||
if (draw_enhanced_geometry_attlist_.draw_enhanced_path_)
|
||||
if (!odf_path.empty())
|
||||
{
|
||||
std::vector<::svg_path::_polyline> o_Polyline;
|
||||
|
||||
@ -267,7 +273,7 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
|
||||
|
||||
try
|
||||
{
|
||||
res = ::svg_path::parseSvgD(o_Polyline, draw_enhanced_geometry_attlist_.draw_enhanced_path_.get(), true);
|
||||
res = ::svg_path::parseSvgD(o_Polyline, odf_path, true);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
@ -316,8 +322,8 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
|
||||
{
|
||||
if (draw_handle_geometry_[0].min < draw_handle_geometry_[0].max)
|
||||
{
|
||||
shape->additional_.push_back(_property(L"draw-modifiers-min",draw_handle_geometry_[0].min));
|
||||
shape->additional_.push_back(_property(L"draw-modifiers-max",draw_handle_geometry_[0].max));
|
||||
shape->additional_.push_back(_property(L"draw-modifiers-min", draw_handle_geometry_[0].min));
|
||||
shape->additional_.push_back(_property(L"draw-modifiers-max", draw_handle_geometry_[0].max));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -326,7 +332,6 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
|
||||
{
|
||||
shape->bad_shape_ = true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -336,6 +336,7 @@ void odf_drawing_context::set_background_state(bool Val)
|
||||
impl_->is_background_ = Val;
|
||||
|
||||
impl_->current_graphic_properties = new graphic_format_properties();
|
||||
start_area_properties();
|
||||
}
|
||||
|
||||
void odf_drawing_context::check_anchor()
|
||||
@ -473,6 +474,7 @@ void odf_drawing_context::start_drawing()
|
||||
}
|
||||
void odf_drawing_context::end_drawing_background(odf_types::common_draw_fill_attlist & common_draw_attlist)
|
||||
{
|
||||
end_area_properties();
|
||||
if (impl_->current_drawing_state_.elements_.empty() == false) return;
|
||||
|
||||
if (!impl_->is_background_ || !impl_->current_graphic_properties) return;
|
||||
@ -491,15 +493,13 @@ void odf_drawing_context::end_drawing()
|
||||
draw_base* draw = dynamic_cast<draw_base*>(impl_->current_drawing_state_.elements_[0].elm.get());
|
||||
if (draw)
|
||||
{
|
||||
if (impl_->is_presentation_)
|
||||
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
|
||||
draw_layer = L"backgroundobjects";
|
||||
//if (impl_->current_drawing_state_.presentation_class_)
|
||||
// draw_layer = L"backgroundobjects";
|
||||
//else draw_layer = L"layout";
|
||||
|
||||
if (!impl_->current_drawing_state_.presentation_class_)
|
||||
impl_->current_drawing_state_.presentation_class_ = presentation_class::outline;
|
||||
|
||||
@ -1186,10 +1186,14 @@ void odf_drawing_context::set_shadow(int type, std::wstring hexColor, _CP_OPT(do
|
||||
|
||||
void odf_drawing_context::set_placeholder_id (std::wstring val)
|
||||
{
|
||||
if (!impl_->is_presentation_) return;
|
||||
|
||||
impl_->current_drawing_state_.presentation_placeholder_ = val;
|
||||
}
|
||||
void odf_drawing_context::set_placeholder_type (int val)
|
||||
{
|
||||
if (!impl_->is_presentation_) return;
|
||||
|
||||
switch(val)
|
||||
{
|
||||
case 0: impl_->current_drawing_state_.presentation_class_ = presentation_class::outline; break;
|
||||
@ -1256,7 +1260,8 @@ _CP_OPT(odf_types::color) odf_drawing_context::get_line_color()
|
||||
}
|
||||
void odf_drawing_context::set_solid_fill(std::wstring hexColor)
|
||||
{
|
||||
if (!impl_->current_graphic_properties)return;
|
||||
if (!impl_->current_graphic_properties) return;
|
||||
if (hexColor.empty()) return;
|
||||
|
||||
int res = 0;
|
||||
if ((res = hexColor.find(L"#")) < 0) hexColor = std::wstring(L"#") + hexColor;
|
||||
@ -2173,27 +2178,47 @@ void odf_drawing_context::set_textarea_writing_mode(int mode)
|
||||
paragraph_properties = style_->content_.get_style_paragraph_properties();
|
||||
}
|
||||
}
|
||||
if (paragraph_properties == NULL && impl_->current_paragraph_properties == NULL)return;
|
||||
|
||||
switch(mode)
|
||||
if (paragraph_properties)
|
||||
{
|
||||
case 5://textverticaltypeWordArtVert:
|
||||
case 6://textverticaltypeWordArtVertRtl:
|
||||
case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст
|
||||
case 3://SimpleTypes::textverticaltypeVert:
|
||||
case 2://SimpleTypes::textverticaltypeMongolianVert:
|
||||
paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
impl_->current_paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
break;
|
||||
case 0://SimpleTypes::textverticaltypeEaVert:
|
||||
paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
impl_->current_paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
break;
|
||||
case 1://SimpleTypes::textverticaltypeHorz:
|
||||
default:
|
||||
paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::LrTb);
|
||||
impl_->current_paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::LrTb);
|
||||
break;
|
||||
switch(mode)
|
||||
{
|
||||
case 5://textverticaltypeWordArtVert:
|
||||
case 6://textverticaltypeWordArtVertRtl:
|
||||
case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст
|
||||
case 3://SimpleTypes::textverticaltypeVert:
|
||||
case 2://SimpleTypes::textverticaltypeMongolianVert:
|
||||
|
||||
paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
break;
|
||||
case 0://SimpleTypes::textverticaltypeEaVert:
|
||||
paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
break;
|
||||
case 1://SimpleTypes::textverticaltypeHorz:
|
||||
default:
|
||||
paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::LrTb);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (impl_->current_paragraph_properties)
|
||||
{
|
||||
switch(mode)
|
||||
{
|
||||
case 5://textverticaltypeWordArtVert:
|
||||
case 6://textverticaltypeWordArtVertRtl:
|
||||
case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст
|
||||
case 3://SimpleTypes::textverticaltypeVert:
|
||||
case 2://SimpleTypes::textverticaltypeMongolianVert:
|
||||
impl_->current_paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
break;
|
||||
case 0://SimpleTypes::textverticaltypeEaVert:
|
||||
impl_->current_paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl);
|
||||
break;
|
||||
case 1://SimpleTypes::textverticaltypeHorz:
|
||||
default:
|
||||
impl_->current_paragraph_properties->content_.style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::LrTb);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void odf_drawing_context::set_paragraph_properties(style_paragraph_properties *paragraph_properties)
|
||||
|
||||
@ -266,8 +266,11 @@ void odt_conversion_context::end_drawings()
|
||||
}
|
||||
else
|
||||
{
|
||||
text_context()->start_element(elm);
|
||||
text_context()->end_element();
|
||||
if (elm)
|
||||
{
|
||||
text_context()->start_element(elm);
|
||||
text_context()->end_element();
|
||||
}
|
||||
|
||||
drawing_context()->clear();
|
||||
drawing_context_.pop_back();
|
||||
|
||||
@ -207,6 +207,8 @@ void text_list::create_child_element(const std::wstring & Ns, const std::wstring
|
||||
}
|
||||
void text_list::add_child_element( const office_element_ptr & child_element)
|
||||
{
|
||||
if (!child_element) return;
|
||||
|
||||
ElementType type = child_element->get_type();
|
||||
|
||||
if (type == typeTextListHeader)
|
||||
|
||||
@ -30,6 +30,8 @@
|
||||
*
|
||||
*/
|
||||
#include "PptxConverter.h"
|
||||
#include "DocxConverter.h"
|
||||
|
||||
#include "../utils.h"
|
||||
|
||||
#include "../../../Common/DocxFormat/Source/DocxFormat/Diagram/DiagramDrawing.h"
|
||||
@ -267,7 +269,7 @@ void OoxConverter::convert(PPTX::Logic::SmartArt *oox_smart_art)
|
||||
|
||||
if (oox_smart_art->m_diag.IsInit())
|
||||
{
|
||||
_CP_OPT(double) x, y, width, height, cx, cy;
|
||||
_CP_OPT(double) x, y, width, height, cx = 1., cy= 1.;
|
||||
|
||||
odf_context()->drawing_context()->get_size (width, height);
|
||||
odf_context()->drawing_context()->get_position (x, y);
|
||||
@ -433,6 +435,8 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape)
|
||||
{
|
||||
if (oox_shape == NULL) return;
|
||||
|
||||
_CP_OPT(bool) bMasterPresentation = odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
odf_context()->drawing_context()->start_drawing();
|
||||
|
||||
int type = 1000; //custom
|
||||
@ -448,14 +452,20 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape)
|
||||
type = preset.GetValue();
|
||||
}
|
||||
|
||||
if (type == SimpleTypes::shapetypeRect && oox_shape->txBody.IsInit()) type = 2000;
|
||||
if (type == SimpleTypes::shapetypeRect && (oox_shape->txBody.IsInit() || oox_shape->oTextBoxShape.IsInit()))
|
||||
type = 2000;
|
||||
|
||||
if (type == 2000 && oox_shape->txBody->bodyPr.IsInit()
|
||||
&& oox_shape->txBody->bodyPr->fromWordArt.get_value_or(false))
|
||||
if (type == 2000)
|
||||
{
|
||||
int wordart_type = convert(oox_shape->txBody->bodyPr->prstTxWarp.GetPointer());
|
||||
|
||||
if (wordart_type > 0) type = wordart_type;
|
||||
PPTX::Logic::BodyPr *bodyPr = NULL;
|
||||
if (oox_shape->txBody.IsInit()) bodyPr = oox_shape->txBody->bodyPr.GetPointer();
|
||||
else bodyPr = oox_shape->oTextBoxBodyPr.GetPointer();
|
||||
|
||||
if (bodyPr && bodyPr->fromWordArt.get_value_or(false))
|
||||
{
|
||||
int wordart_type = convert(bodyPr->prstTxWarp.GetPointer());
|
||||
if (wordart_type > 0) type = wordart_type;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (oox_shape->nvSpPr.nvPr.ph.is_init())
|
||||
@ -473,7 +483,24 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape)
|
||||
|
||||
if (oox_shape->txXfrm.IsInit() == false)
|
||||
{
|
||||
convert(oox_shape->txBody.GetPointer(), oox_shape->style.GetPointer());
|
||||
if (oox_shape->oTextBoxShape.IsInit()) //docx sdt
|
||||
{
|
||||
DocxConverter *docx_converter = dynamic_cast<DocxConverter*>(this);
|
||||
if (docx_converter)
|
||||
{
|
||||
odf_context()->start_text_context();
|
||||
docx_converter->convert(oox_shape->oTextBoxShape.GetPointer());
|
||||
odf_context()->drawing_context()->set_text( odf_context()->text_context());
|
||||
|
||||
convert(oox_shape->oTextBoxBodyPr.GetPointer());
|
||||
|
||||
if (oox_shape->style.IsInit())
|
||||
convert(&oox_shape->style->fontRef);
|
||||
odf_context()->end_text_context();
|
||||
}
|
||||
}
|
||||
else
|
||||
convert(oox_shape->txBody.GetPointer(), oox_shape->style.GetPointer());
|
||||
}
|
||||
|
||||
odf_context()->drawing_context()->end_shape();
|
||||
@ -884,12 +911,19 @@ void OoxConverter::convert(PPTX::Logic::UniColor * color, std::wstring & hexStri
|
||||
if (!color) return;
|
||||
|
||||
convert(color, nARGB);
|
||||
|
||||
hexString = XmlUtils::IntToString(nARGB & 0x00FFFFFF, L"#%06X");
|
||||
|
||||
if ((nARGB >> 24) != 0xff)
|
||||
if (nARGB != 0)
|
||||
{
|
||||
hexString = XmlUtils::IntToString(nARGB & 0x00FFFFFF, L"#%06X");
|
||||
|
||||
if ((nARGB >> 24) != 0xff)
|
||||
{
|
||||
opacity = ((nARGB >> 24) /255.) * 100.;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
opacity = ((nARGB >> 24) /255.) * 100.;
|
||||
//not found in theme
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -70,7 +70,7 @@ void OoxConverter::convert(OOX::Vml::CShapeType *vml_shape_type)
|
||||
}
|
||||
//m_oPreferRelative//типо можно менять размер
|
||||
|
||||
for (unsigned int i=0 ; i < vml_shape_type->m_arrItems.size();i++)
|
||||
for (size_t i = 0; i < vml_shape_type->m_arrItems.size(); i++)
|
||||
{
|
||||
convert(vml_shape_type->m_arrItems[i]);
|
||||
}
|
||||
@ -86,6 +86,18 @@ void OoxConverter::convert(OOX::Vml::CShapeType *vml_shape_type)
|
||||
//m_arrItems
|
||||
//CVmlCommonElements
|
||||
}
|
||||
void OoxConverter::convert(OOX::Vml::CFormulas *vml_formulas)
|
||||
{
|
||||
if (vml_formulas == NULL) return;
|
||||
|
||||
for (size_t i = 0; i < vml_formulas->m_arrItems.size(); i++)
|
||||
{
|
||||
OOX::Vml::CF *cf = dynamic_cast<OOX::Vml::CF *>(vml_formulas->m_arrItems[i]);
|
||||
if (cf == NULL) continue;
|
||||
|
||||
//odf_context()->drawing_context()->add_formula(L"", cf->m_sEqn);
|
||||
}
|
||||
}
|
||||
|
||||
void OoxConverter::convert(SimpleTypes::Vml::CCssStyle *vml_style, bool group)
|
||||
{
|
||||
@ -95,7 +107,7 @@ void OoxConverter::convert(SimpleTypes::Vml::CCssStyle *vml_style, bool group)
|
||||
|
||||
_CP_OPT(int) anchor_type_x, anchor_type_y;
|
||||
|
||||
for (unsigned int i=0; i < vml_style->m_arrProperties.size(); i++)
|
||||
for (size_t i = 0; i < vml_style->m_arrProperties.size(); i++)
|
||||
{
|
||||
if (vml_style->m_arrProperties[i] == NULL) continue;
|
||||
|
||||
@ -693,17 +705,18 @@ void OoxConverter::convert(OOX::Vml::CTextbox *vml_textbox)
|
||||
odf_context()->drawing_context()->set_textarea_wrap(true);
|
||||
|
||||
DocxConverter *docx_converter = dynamic_cast<DocxConverter*>(this);
|
||||
|
||||
odf_context()->start_text_context();
|
||||
if (docx_converter)
|
||||
{
|
||||
for (unsigned int i=0 ; i < vml_textbox->m_oTxtbxContent->m_arrItems.size();i++)
|
||||
odf_context()->start_text_context();
|
||||
{
|
||||
if (docx_converter)
|
||||
for (size_t i = 0; i < vml_textbox->m_oTxtbxContent->m_arrItems.size(); i++)
|
||||
{
|
||||
docx_converter->convert(vml_textbox->m_oTxtbxContent->m_arrItems[i]);
|
||||
}
|
||||
odf_context()->drawing_context()->set_text( odf_context()->text_context());
|
||||
}
|
||||
odf_context()->drawing_context()->set_text( odf_context()->text_context());
|
||||
odf_context()->end_text_context();
|
||||
}
|
||||
odf_context()->end_text_context();
|
||||
|
||||
}
|
||||
void OoxConverter::convert(OOX::Vml::CTextPath *vml_textpath)
|
||||
@ -869,7 +882,7 @@ void OoxConverter::convert(OOX::Vml::CVmlCommonElements *vml_common)
|
||||
delete oRgbColor;
|
||||
}
|
||||
}
|
||||
for (unsigned int i=0 ; i < vml_common->m_arrItems.size();i++)
|
||||
for (size_t i = 0; i < vml_common->m_arrItems.size(); i++)
|
||||
{
|
||||
convert(vml_common->m_arrItems[i]);
|
||||
}
|
||||
@ -899,7 +912,7 @@ void OoxConverter::convert(OOX::Vml::CGroup *vml_group)
|
||||
odf_context()->drawing_context()->set_group_shift(vml_group->m_oCoordOrigin->GetX(), vml_group->m_oCoordOrigin->GetY());
|
||||
}
|
||||
|
||||
for (unsigned int i=0; i < vml_group->m_arrItems.size(); i++)
|
||||
for (size_t i = 0; i < vml_group->m_arrItems.size(); i++)
|
||||
{
|
||||
if (vml_group->m_arrItems[i] == NULL) continue;
|
||||
|
||||
|
||||
@ -130,6 +130,8 @@ bool OoxConverter::UpdateProgress(long nComplete)
|
||||
|
||||
void OoxConverter::set_fonts_directory(const std::wstring &fontsPath)
|
||||
{
|
||||
if (odf_context() == NULL) return;
|
||||
|
||||
odf_context()->set_fonts_directory(fontsPath);
|
||||
}
|
||||
|
||||
@ -143,18 +145,15 @@ void OoxConverter::convert(OOX::WritingElement *oox_unknown)
|
||||
{
|
||||
case OOX::et_graphicFrame:
|
||||
{
|
||||
PPTX::Logic::GraphicFrame* pGraphicFrame= dynamic_cast<PPTX::Logic::GraphicFrame*>(oox_unknown);
|
||||
convert(pGraphicFrame);
|
||||
convert(dynamic_cast<PPTX::Logic::GraphicFrame*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_pic:
|
||||
{
|
||||
PPTX::Logic::Pic* pPic= dynamic_cast<PPTX::Logic::Pic*>(oox_unknown);
|
||||
convert(pPic);
|
||||
convert(dynamic_cast<PPTX::Logic::Pic*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_dgm_DiagrammParts:
|
||||
{
|
||||
PPTX::Logic::SmartArt* pDiagrammParts = dynamic_cast<PPTX::Logic::SmartArt*>(oox_unknown);
|
||||
convert(pDiagrammParts);
|
||||
convert(dynamic_cast<PPTX::Logic::SmartArt*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_a_Shape:
|
||||
case OOX::et_p_Shape:
|
||||
@ -266,18 +265,19 @@ void OoxConverter::convert(OOX::WritingElement *oox_unknown)
|
||||
}break;
|
||||
case OOX::et_v_fill:
|
||||
{
|
||||
OOX::Vml::CFill *vml = dynamic_cast<OOX::Vml::CFill*>(oox_unknown);
|
||||
convert(vml);
|
||||
convert(dynamic_cast<OOX::Vml::CFill*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_v_stroke:
|
||||
{
|
||||
OOX::Vml::CStroke *vml = dynamic_cast<OOX::Vml::CStroke*>(oox_unknown);
|
||||
convert(vml);
|
||||
convert(dynamic_cast<OOX::Vml::CStroke*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_v_formulas:
|
||||
{
|
||||
convert(dynamic_cast<OOX::Vml::CFormulas*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_v_shadow:
|
||||
{
|
||||
OOX::Vml::CShadow *vml = dynamic_cast<OOX::Vml::CShadow*>(oox_unknown);
|
||||
convert(vml);
|
||||
convert(dynamic_cast<OOX::Vml::CShadow*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_v_image:
|
||||
{
|
||||
|
||||
@ -245,6 +245,7 @@ namespace OOX
|
||||
class CTextPath;
|
||||
class CGroup;
|
||||
class CVmlCommonElements;
|
||||
class CFormulas;
|
||||
}
|
||||
namespace VmlWord
|
||||
{
|
||||
@ -510,6 +511,7 @@ public:
|
||||
void convert(OOX::VmlWord::CWrap *vml_wrap);
|
||||
void convert(OOX::Vml::CGroup *vml_group);
|
||||
void convert(OOX::Vml::CVmlCommonElements *vml_attr);
|
||||
void convert(OOX::Vml::CFormulas *vml_formulas);
|
||||
};
|
||||
|
||||
} // namespace Oox2Odf
|
||||
|
||||
@ -317,16 +317,16 @@ void DocxConverter::convert(OOX::WritingElement *oox_unknown)
|
||||
// OOX::Logic::CShape* pShape = dynamic_cast<OOX::Logic::CShape*>(oox_unknown);
|
||||
// convert(pShape);
|
||||
//}break;
|
||||
//case OOX::et_w_pict:
|
||||
//{
|
||||
// OOX::Logic::CPicture* pPic = dynamic_cast<OOX::Logic::CPicture*>(oox_unknown);
|
||||
// convert(pPic);
|
||||
//}break;
|
||||
//case OOX::et_w_object:
|
||||
//{
|
||||
// OOX::Logic::CObject* pObj = dynamic_cast<OOX::Logic::CObject*>(oox_unknown);
|
||||
// convert(pObj);
|
||||
//}break;
|
||||
case OOX::et_w_pict:
|
||||
{
|
||||
OOX::Logic::CPicture* pPic = dynamic_cast<OOX::Logic::CPicture*>(oox_unknown);
|
||||
convert(pPic);
|
||||
}break;
|
||||
case OOX::et_w_object:
|
||||
{
|
||||
OOX::Logic::CObject* pObj = dynamic_cast<OOX::Logic::CObject*>(oox_unknown);
|
||||
convert(pObj);
|
||||
}break;
|
||||
case OOX::et_pic_pic:
|
||||
case OOX::et_pic:
|
||||
case OOX::et_p_pic:
|
||||
@ -353,23 +353,27 @@ void DocxConverter::convert(OOX::WritingElement *oox_unknown)
|
||||
}break;
|
||||
case OOX::et_w_commentReference:
|
||||
{
|
||||
OOX::Logic::CCommentReference* pCommRef = dynamic_cast<OOX::Logic::CCommentReference*>(oox_unknown);
|
||||
convert(pCommRef); //если нет Start - означает начало с предыдущего Run
|
||||
convert(dynamic_cast<OOX::Logic::CCommentReference*>(oox_unknown)); //если нет Start - означает начало с предыдущего Run
|
||||
}break;
|
||||
case OOX::et_w_footnoteReference:
|
||||
{
|
||||
OOX::Logic::CFootnoteReference* pRef= dynamic_cast<OOX::Logic::CFootnoteReference*>(oox_unknown);
|
||||
convert(pRef);
|
||||
convert(dynamic_cast<OOX::Logic::CFootnoteReference*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_w_endnoteReference:
|
||||
{
|
||||
OOX::Logic::CEndnoteReference* pRef= dynamic_cast<OOX::Logic::CEndnoteReference*>(oox_unknown);
|
||||
convert(pRef);
|
||||
convert(dynamic_cast<OOX::Logic::CEndnoteReference*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_w_endnoteRef:
|
||||
{
|
||||
//add ref ??? todoooo
|
||||
}break;
|
||||
case OOX::et_w_footnoteRef:
|
||||
{
|
||||
//add ref
|
||||
}break;
|
||||
case OOX::et_w_tbl:
|
||||
{
|
||||
OOX::Logic::CTbl* pTable= dynamic_cast<OOX::Logic::CTbl*>(oox_unknown);
|
||||
convert(pTable);
|
||||
convert(dynamic_cast<OOX::Logic::CTbl*>(oox_unknown));
|
||||
}break;
|
||||
case OOX::et_w_tr:
|
||||
{
|
||||
@ -381,6 +385,12 @@ void DocxConverter::convert(OOX::WritingElement *oox_unknown)
|
||||
OOX::Logic::CTc* pCell= dynamic_cast<OOX::Logic::CTc*>(oox_unknown);
|
||||
convert(pCell);
|
||||
}break;
|
||||
case OOX::et_w_bookmarkStart:
|
||||
{
|
||||
}break;
|
||||
case OOX::et_w_bookmarkEnd:
|
||||
{
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
OoxConverter::convert(oox_unknown);
|
||||
@ -394,12 +404,15 @@ void DocxConverter::convert(OOX::Logic::CSdt *oox_sdt)
|
||||
//nullable<OOX::Logic::CSdtEndPr > m_oSdtEndPr;
|
||||
//nullable<OOX::Logic::CSdtPr > m_oSdtPr;
|
||||
|
||||
if (oox_sdt->m_oSdtContent.IsInit())
|
||||
convert(oox_sdt->m_oSdtContent.GetPointer());
|
||||
}
|
||||
void DocxConverter::convert(OOX::Logic::CSdtContent *oox_sdt)
|
||||
{
|
||||
if (oox_sdt == NULL) return;
|
||||
|
||||
for (size_t i = 0; i < oox_sdt->m_arrItems.size(); i++)
|
||||
{
|
||||
for (unsigned int i=0; i< oox_sdt->m_oSdtContent->m_arrItems.size(); i++)
|
||||
{
|
||||
convert(oox_sdt->m_oSdtContent->m_arrItems[i]);
|
||||
}
|
||||
convert(oox_sdt->m_arrItems[i]);
|
||||
}
|
||||
}
|
||||
void DocxConverter::convert(OOX::Logic::CParagraph *oox_paragraph)
|
||||
@ -3017,7 +3030,7 @@ void DocxConverter::convert(OOX::Numbering::CAbstractNum* oox_num_style)
|
||||
if (oox_num_style->m_oAbstractNumId.IsInit() == false) return;
|
||||
|
||||
|
||||
odt_context->styles_context()->lists_styles().start_style(false, oox_num_style->m_oAbstractNumId->GetValue());
|
||||
odt_context->styles_context()->lists_styles().start_style(true, oox_num_style->m_oAbstractNumId->GetValue());
|
||||
//// Childs
|
||||
//std::vector<OOX::Numbering::CLvl > m_arrLvl;
|
||||
//nullable<ComplexTypes::Word::CMultiLevelType > m_oMultiLevelType;
|
||||
|
||||
@ -95,6 +95,7 @@ namespace OOX
|
||||
class CTcBorders;
|
||||
class CTblBorders;
|
||||
class CSdt;
|
||||
class CSdtContent;
|
||||
class CBackground;
|
||||
class CLockedCanvas;
|
||||
|
||||
@ -151,7 +152,8 @@ namespace Oox2Odf
|
||||
virtual std::wstring find_link_by_id (std::wstring sId, int t);
|
||||
virtual NSCommon::smart_ptr<OOX::File> find_file_by_id(std::wstring sId);
|
||||
|
||||
void convert(OOX::WritingElement *oox_unknown);
|
||||
void convert(OOX::WritingElement *oox_unknown);
|
||||
void convert(OOX::Logic::CSdtContent *oox_sdt);
|
||||
private:
|
||||
struct _section
|
||||
{
|
||||
@ -220,7 +222,7 @@ namespace Oox2Odf
|
||||
|
||||
void convert(OOX::Drawing::CAnchor *oox_anchor);
|
||||
void convert(OOX::Drawing::CInline *oox_inline);
|
||||
|
||||
|
||||
void convert(SimpleTypes::CTheme<> *oox_font_theme,_CP_OPT(std::wstring) & odf_font_name);
|
||||
void convert(ComplexTypes::Word::CColor *color, _CP_OPT(odf_types::color) & odf_color);
|
||||
void convert(SimpleTypes::CUniversalMeasure *oox_size, _CP_OPT(odf_types::length) & odf_size);
|
||||
|
||||
@ -60,7 +60,18 @@ namespace Oox2Odf
|
||||
{
|
||||
PptxConverter::PptxConverter(const std::wstring & path, const ProgressCallback* CallBack)
|
||||
{
|
||||
const OOX::CPath oox_path(std::wstring(path.c_str()));
|
||||
current_clrMap = NULL;
|
||||
current_slide = NULL;
|
||||
current_theme = NULL;
|
||||
current_tableStyles = NULL;
|
||||
|
||||
presentation = NULL;
|
||||
output_document = NULL;
|
||||
odp_context = NULL;
|
||||
|
||||
pCallBack = CallBack;
|
||||
|
||||
const OOX::CPath oox_path(std::wstring(path.c_str()));
|
||||
|
||||
pptx_document = new PPTX::Folder();
|
||||
if (!pptx_document->isValid(oox_path.GetPath())) // true ???
|
||||
@ -82,13 +93,6 @@ PptxConverter::PptxConverter(const std::wstring & path, const ProgressCallback*
|
||||
output_document = new odf_writer::package::odf_document(L"presentation");
|
||||
odp_context = new odf_writer::odp_conversion_context(output_document);
|
||||
|
||||
current_clrMap = NULL;
|
||||
current_slide = NULL;
|
||||
current_theme = NULL;
|
||||
current_tableStyles = NULL;
|
||||
|
||||
pCallBack = CallBack;
|
||||
|
||||
if (UpdateProgress(290000))return;
|
||||
}
|
||||
PptxConverter::~PptxConverter()
|
||||
@ -339,7 +343,7 @@ void PptxConverter::convert_slides()
|
||||
current_slide = slide->Master.operator->();
|
||||
|
||||
if (bShowLayoutMasterSp && bShowMasterSp)
|
||||
convert_slide(&slide->Master->cSld, current_txStyles, false);
|
||||
convert_slide(&slide->Master->cSld, current_txStyles, false, true);
|
||||
else
|
||||
convert(slide->Master->cSld.bg.GetPointer());
|
||||
|
||||
@ -347,7 +351,7 @@ void PptxConverter::convert_slides()
|
||||
current_clrMap = slide->Layout->clrMapOvr->overrideClrMapping.GetPointer();
|
||||
current_slide = slide->Layout.operator->();
|
||||
|
||||
convert_slide(&slide->Layout->cSld, current_txStyles, true);
|
||||
convert_slide(&slide->Layout->cSld, current_txStyles, true, bShowLayoutMasterSp);
|
||||
//add note master
|
||||
odp_context->end_master_slide();
|
||||
|
||||
@ -387,7 +391,7 @@ void PptxConverter::convert_slides()
|
||||
odp_context->current_slide().set_master_page (master_style_name);
|
||||
odp_context->current_slide().set_layout_page (layout_style_name);
|
||||
|
||||
convert_slide (slide->cSld.GetPointer(), current_txStyles);
|
||||
convert_slide (slide->cSld.GetPointer(), current_txStyles, true, bShowMasterSp);
|
||||
convert (slide->comments.operator->());
|
||||
convert (slide->Note.operator->());
|
||||
|
||||
@ -943,7 +947,7 @@ void PptxConverter::convert(PPTX::Logic::Bg *oox_background)
|
||||
odp_context->end_drawings();
|
||||
}
|
||||
|
||||
void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxStyles* txStyles, bool bPlaceholders)
|
||||
void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxStyles* txStyles, bool bPlaceholders, bool bFillUp)
|
||||
{
|
||||
if (oox_slide == NULL) return;
|
||||
|
||||
@ -966,14 +970,15 @@ void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxS
|
||||
{
|
||||
if (pShape->nvSpPr.nvPr.ph.is_init())
|
||||
{
|
||||
pShape->FillLevelUp();
|
||||
if (bFillUp)
|
||||
pShape->FillLevelUp();
|
||||
|
||||
if (pShape->nvSpPr.nvPr.ph->type.IsInit())
|
||||
{
|
||||
int ph_type = pShape->nvSpPr.nvPr.ph->type->GetBYTECode();
|
||||
|
||||
if (!bMaster && (ph_type == 5 || ph_type == 6 || ph_type == 7 || ph_type == 12))
|
||||
continue;
|
||||
//if (!bMaster && (ph_type == 5 || ph_type == 6 || ph_type == 7 || ph_type == 12))
|
||||
// continue;
|
||||
|
||||
odf_context()->drawing_context()->set_placeholder_type(ph_type);
|
||||
}
|
||||
|
||||
@ -106,7 +106,7 @@ namespace Oox2Odf
|
||||
|
||||
void convert(OOX::WritingElement *oox_unknown);
|
||||
|
||||
void convert_slide (PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxStyles* txStyles, bool bPlaceholders = true);
|
||||
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);
|
||||
|
||||
@ -120,21 +120,29 @@ namespace PPTX
|
||||
oAttr.Write(_T("noResize"), noResize);
|
||||
oAttr.Write(_T("noSelect"), noSelect);
|
||||
|
||||
return XmlUtils::CreateNode(m_namespace + L":cNvGraphicFramePr", oAttr.m_strValue.empty() ? L"" : XmlUtils::CreateNode(L"a:graphicFrameLocks", oAttr));
|
||||
std::wstring namespaceLocks = L"a";
|
||||
if (m_namespace == L"wp") namespaceLocks = L"wp";
|
||||
|
||||
return XmlUtils::CreateNode(m_namespace + L":cNvGraphicFramePr", oAttr.m_strValue.empty() ? L"" : XmlUtils::CreateNode(namespaceLocks + L":graphicFrameLocks", oAttr));
|
||||
}
|
||||
|
||||
virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
||||
{
|
||||
std::wstring namespace_ = m_namespace;
|
||||
std::wstring namespace_ = m_namespace;
|
||||
std::wstring namespaceLock_ = L"a";
|
||||
|
||||
if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_XLSX) namespace_ = L"xdr";
|
||||
if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX) namespace_ = L"wp";
|
||||
if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX)
|
||||
{
|
||||
namespaceLock_ = L"wp";
|
||||
namespace_ = L"wp";
|
||||
}
|
||||
|
||||
pWriter->StartNode(namespace_ + L":cNvGraphicFramePr");
|
||||
|
||||
pWriter->EndAttributes();
|
||||
|
||||
pWriter->StartNode(_T("a:graphicFrameLocks"));
|
||||
pWriter->StartNode(namespaceLock_ + L"graphicFrameLocks");
|
||||
|
||||
pWriter->StartAttributes();
|
||||
|
||||
@ -147,7 +155,7 @@ namespace PPTX
|
||||
|
||||
pWriter->EndAttributes();
|
||||
|
||||
pWriter->EndNode(_T("a:graphicFrameLocks"));
|
||||
pWriter->EndNode(namespaceLock_ + L":graphicFrameLocks");
|
||||
|
||||
pWriter->EndNode(namespace_ + L":cNvGraphicFramePr");
|
||||
}
|
||||
|
||||
@ -122,8 +122,8 @@ namespace PPTX
|
||||
|
||||
if (L"xfrm" == strName && strNamespace != L"xdr")
|
||||
xfrm = oReader;
|
||||
else if (L"nvGraphicFramePr" == strName)
|
||||
nvGraphicFramePr.fromXML( oReader );
|
||||
else if (L"cNvGraphicFramePr" == strName)
|
||||
nvGraphicFramePr.cNvGraphicFramePr.fromXML( oReader );
|
||||
|
||||
else if (L"graphic" == strName)
|
||||
{
|
||||
|
||||
@ -160,7 +160,8 @@ namespace PPTX
|
||||
if (pShape->nvSpPr.nvPr.ph->idx.IsInit())
|
||||
{
|
||||
//not found in layout !! 100818_건강보험과_보건의료_김용익_최종.pptx
|
||||
if (Master.IsInit())
|
||||
bool bShapeMaster = showMasterSp.get_value_or(true);
|
||||
if (Master.IsInit() && bShapeMaster)
|
||||
{
|
||||
Master->GetLevelUp(pShape);
|
||||
}
|
||||
|
||||
@ -246,4 +246,7 @@ HEADERS += docxformatlib.h \
|
||||
../Source/XlsxFormat/Worksheets/Sparkline.h \
|
||||
../Source/XlsxFormat/Ole/OleObjects.h \
|
||||
../Source/DocxFormat/Diagram/DiagramData.h \
|
||||
../Source/DocxFormat/Diagram/DiagramDrawing.h
|
||||
../Source/DocxFormat/Diagram/DiagramDrawing.h \
|
||||
../Source/XlsxFormat/Pivot/PivotTable.h \
|
||||
../Source/XlsxFormat/Pivot/PivotCacheDefinition.h \
|
||||
../Source/XlsxFormat/Pivot/PivotCacheRecords.h
|
||||
|
||||
@ -110,9 +110,11 @@ namespace OOX
|
||||
OOX::CPath oName = pFile->DefaultFileName();
|
||||
if(false == pFile->m_sOutputFilename.empty())
|
||||
oName.SetName(pFile->m_sOutputFilename, false);
|
||||
|
||||
OOX::CSystemUtility::CreateDirectories( oCurrent / oDefDir );
|
||||
pFile->write( oCurrent / oDefDir / oName, oDir / oDefDir, oContent );
|
||||
if(m_mNoWriteContainer.end() == m_mNoWriteContainer.find(pPair->first))
|
||||
{
|
||||
OOX::CSystemUtility::CreateDirectories( oCurrent / oDefDir );
|
||||
pFile->write( oCurrent / oDefDir / oName, oDir / oDefDir, oContent );
|
||||
}
|
||||
if(true != pFile->m_bDoNotAddRels)
|
||||
{
|
||||
if (oDefDir.GetPath().length() > 0)//todooo перенести в CPath
|
||||
@ -187,16 +189,18 @@ namespace OOX
|
||||
mNamepair [oName.m_strFilename] = 1;
|
||||
else
|
||||
oName = oName + pNamePair->first;
|
||||
|
||||
OOX::CSystemUtility::CreateDirectories( oCurrent / oDefDir );
|
||||
smart_ptr<OOX::IFileBuilder> pFileBuilder = pFile.smart_dynamic_cast<OOX::IFileBuilder>();
|
||||
if ( pFileBuilder.is_init() )
|
||||
if(m_mNoWriteContainer.end() == m_mNoWriteContainer.find(it->first))
|
||||
{
|
||||
pFileBuilder->Finalize( oCurrent / oDefDir / oName, oDir / oDefDir, oContent );
|
||||
}
|
||||
else
|
||||
{
|
||||
pFile->write( oCurrent / oDefDir / oName, oDir / oDefDir, oContent );
|
||||
OOX::CSystemUtility::CreateDirectories( oCurrent / oDefDir );
|
||||
smart_ptr<OOX::IFileBuilder> pFileBuilder = pFile.smart_dynamic_cast<OOX::IFileBuilder>();
|
||||
if ( pFileBuilder.is_init() )
|
||||
{
|
||||
pFileBuilder->Finalize( oCurrent / oDefDir / oName, oDir / oDefDir, oContent );
|
||||
}
|
||||
else
|
||||
{
|
||||
pFile->write( oCurrent / oDefDir / oName, oDir / oDefDir, oContent );
|
||||
}
|
||||
}
|
||||
|
||||
oRels.Registration( it->first, pFile->type(), oDefDir / oName );
|
||||
@ -386,6 +390,20 @@ namespace OOX
|
||||
m_mContainer [rId.get()] = pFile;
|
||||
}
|
||||
|
||||
const RId IFileContainer::AddNoWrite(const smart_ptr<OOX::File>& pFile)
|
||||
{
|
||||
const RId rId = GetMaxRId().next();
|
||||
AddNoWrite( rId, pFile );
|
||||
return rId;
|
||||
}
|
||||
|
||||
void IFileContainer::AddNoWrite (const OOX::RId& rId, const smart_ptr<OOX::File>& pFile)
|
||||
{
|
||||
m_lMaxRid = (std::max)( m_lMaxRid, rId.getNumber() );
|
||||
m_mContainer [rId.get()] = pFile;
|
||||
m_mNoWriteContainer[rId.get()] = true;
|
||||
}
|
||||
|
||||
smart_ptr<OOX::File> IFileContainer::Find(const FileType& oType) const
|
||||
{
|
||||
for (std::map<std::wstring, smart_ptr<OOX::File>>::const_iterator pPair = m_mContainer.begin(); pPair != m_mContainer.end(); ++pPair)
|
||||
|
||||
@ -67,6 +67,7 @@ namespace OOX
|
||||
static std::map<std::wstring, size_t> m_mapEnumeratedGlobal;
|
||||
protected:
|
||||
std::map<std::wstring, smart_ptr<OOX::File>> m_mContainer;
|
||||
std::map<std::wstring, bool> m_mNoWriteContainer;
|
||||
size_t m_lMaxRid;
|
||||
|
||||
void Read (const OOX::CRels& oRels, const OOX::CPath& oRootPath, const CPath& oPath);
|
||||
@ -103,6 +104,8 @@ namespace OOX
|
||||
|
||||
const RId Add(smart_ptr<OOX::File>& pFile);
|
||||
void Add(const OOX::RId& rId, smart_ptr<OOX::File>& pFile);
|
||||
const RId AddNoWrite(const smart_ptr<OOX::File>& pFile);
|
||||
void AddNoWrite(const OOX::RId& rId, const smart_ptr<OOX::File>& pFile);
|
||||
|
||||
template<typename T>
|
||||
T& Find();
|
||||
|
||||
@ -81,6 +81,18 @@ namespace OOX
|
||||
const FileType ExternalLinks (L"externalLinks", L"externalLink.xml",
|
||||
_T("application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml"),
|
||||
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink"), true, true);
|
||||
|
||||
const FileType PivotTable (L"../pivotTables", L"pivotTable.xml",
|
||||
_T("application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml"),
|
||||
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable"), true, true);
|
||||
|
||||
const FileType PivotCacheDefinition(L"pivotCache", L"pivotCacheDefinition.xml",
|
||||
_T("application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"),
|
||||
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition"), true);
|
||||
|
||||
const FileType PivotCacheRecords(L"", L"pivotCacheRecords.xml",
|
||||
_T("application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"),
|
||||
_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords"), true, true);
|
||||
|
||||
|
||||
} // namespace FileTypes
|
||||
|
||||
142
Common/DocxFormat/Source/XlsxFormat/Pivot/PivotCacheDefinition.h
Normal file
142
Common/DocxFormat/Source/XlsxFormat/Pivot/PivotCacheDefinition.h
Normal file
@ -0,0 +1,142 @@
|
||||
/*
|
||||
* (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
|
||||
#ifndef OOX_PIVOTCACHEDEFINITION_FILE_INCLUDE_H_
|
||||
#define OOX_PIVOTCACHEDEFINITION_FILE_INCLUDE_H_
|
||||
|
||||
#include "../CommonInclude.h"
|
||||
|
||||
|
||||
namespace OOX
|
||||
{
|
||||
namespace Spreadsheet
|
||||
{
|
||||
class CPivotCacheDefinition : public OOX::File, public OOX::IFileContainer
|
||||
{
|
||||
public:
|
||||
CPivotCacheDefinition()
|
||||
{
|
||||
m_bSpreadsheets = true;
|
||||
bIsWritten = false;
|
||||
m_pData = NULL;
|
||||
m_nDataLength = 0;
|
||||
}
|
||||
CPivotCacheDefinition(const CPath& oRootPath, const CPath& oPath)
|
||||
{
|
||||
m_bSpreadsheets = true;
|
||||
bIsWritten = false;
|
||||
m_pData = NULL;
|
||||
m_nDataLength = 0;
|
||||
read( oRootPath, oPath );
|
||||
}
|
||||
virtual ~CPivotCacheDefinition()
|
||||
{
|
||||
ClearItems();
|
||||
}
|
||||
public:
|
||||
|
||||
virtual void read(const CPath& oPath)
|
||||
{
|
||||
}
|
||||
virtual void read(const CPath& oRootPath, const CPath& oPath)
|
||||
{
|
||||
}
|
||||
virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const
|
||||
{
|
||||
if(m_nDataLength > 0 && !bIsWritten)
|
||||
{
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(oPath.GetPath());
|
||||
oFile.WriteFile(m_pData, m_nDataLength);
|
||||
oFile.CloseFile();
|
||||
|
||||
oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() );
|
||||
IFileContainer::Write( oPath, oDirectory, oContent );
|
||||
|
||||
//prevent repeated write
|
||||
bIsWritten = true;
|
||||
}
|
||||
}
|
||||
virtual const OOX::FileType type() const
|
||||
{
|
||||
return OOX::Spreadsheet::FileTypes::PivotCacheDefinition;
|
||||
}
|
||||
virtual const CPath DefaultDirectory() const
|
||||
{
|
||||
return type().DefaultDirectory();
|
||||
}
|
||||
virtual const CPath DefaultFileName() const
|
||||
{
|
||||
return type().DefaultFileName();
|
||||
}
|
||||
const CPath& GetReadPath()
|
||||
{
|
||||
return m_oReadPath;
|
||||
}
|
||||
void setData(BYTE* pData, long length, const std::wstring& srIdRecords)
|
||||
{
|
||||
if(srIdRecords.length() > 0)
|
||||
{
|
||||
const std::string srIdRecordsA( srIdRecords.begin(), srIdRecords.end() );
|
||||
std::string rIdAttr = " r:id=\""+ srIdRecordsA +"\"";
|
||||
m_nDataLength = length + rIdAttr.length();
|
||||
m_pData = new BYTE[m_nDataLength];
|
||||
long nTreshold = 220;
|
||||
memcpy(m_pData, pData, nTreshold);
|
||||
memcpy(m_pData + nTreshold, rIdAttr.c_str(), rIdAttr.length());
|
||||
memcpy(m_pData + nTreshold + rIdAttr.length(), pData + nTreshold, length - nTreshold);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
m_nDataLength = length;
|
||||
memcpy(m_pData, pData, length);
|
||||
}
|
||||
}
|
||||
private:
|
||||
CPath m_oReadPath;
|
||||
|
||||
void ClearItems()
|
||||
{
|
||||
m_nDataLength = 0;
|
||||
RELEASEARRAYOBJECTS(m_pData)
|
||||
}
|
||||
|
||||
public:
|
||||
mutable bool bIsWritten;
|
||||
BYTE* m_pData;
|
||||
long m_nDataLength;
|
||||
};
|
||||
} //Spreadsheet
|
||||
} // namespace OOX
|
||||
|
||||
#endif // OOX_PIVOTCACHEDEFINITION_FILE_INCLUDE_H_
|
||||
124
Common/DocxFormat/Source/XlsxFormat/Pivot/PivotCacheRecords.h
Normal file
124
Common/DocxFormat/Source/XlsxFormat/Pivot/PivotCacheRecords.h
Normal file
@ -0,0 +1,124 @@
|
||||
/*
|
||||
* (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
|
||||
#ifndef OOX_PIVOTCACHERECORDS_FILE_INCLUDE_H_
|
||||
#define OOX_PIVOTCACHERECORDS_FILE_INCLUDE_H_
|
||||
|
||||
#include "../CommonInclude.h"
|
||||
|
||||
|
||||
namespace OOX
|
||||
{
|
||||
namespace Spreadsheet
|
||||
{
|
||||
class CPivotCacheRecords : public OOX::File, public OOX::IFileContainer
|
||||
{
|
||||
public:
|
||||
CPivotCacheRecords()
|
||||
{
|
||||
m_bSpreadsheets = true;
|
||||
m_pData = NULL;
|
||||
m_nDataLength = 0;
|
||||
}
|
||||
CPivotCacheRecords(const CPath& oRootPath, const CPath& oPath)
|
||||
{
|
||||
m_bSpreadsheets = true;
|
||||
m_pData = NULL;
|
||||
m_nDataLength = 0;
|
||||
read( oRootPath, oPath );
|
||||
}
|
||||
virtual ~CPivotCacheRecords()
|
||||
{
|
||||
ClearItems();
|
||||
}
|
||||
public:
|
||||
|
||||
virtual void read(const CPath& oPath)
|
||||
{
|
||||
}
|
||||
virtual void read(const CPath& oRootPath, const CPath& oPath)
|
||||
{
|
||||
}
|
||||
virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const
|
||||
{
|
||||
if(m_nDataLength > 0)
|
||||
{
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(oPath.GetPath());
|
||||
oFile.WriteFile(m_pData, m_nDataLength);
|
||||
oFile.CloseFile();
|
||||
|
||||
oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename());
|
||||
|
||||
oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() );
|
||||
IFileContainer::Write( oPath, oDirectory, oContent );
|
||||
}
|
||||
}
|
||||
virtual const OOX::FileType type() const
|
||||
{
|
||||
return OOX::Spreadsheet::FileTypes::PivotCacheRecords;
|
||||
}
|
||||
virtual const CPath DefaultDirectory() const
|
||||
{
|
||||
return type().DefaultDirectory();
|
||||
}
|
||||
virtual const CPath DefaultFileName() const
|
||||
{
|
||||
return type().DefaultFileName();
|
||||
}
|
||||
const CPath& GetReadPath()
|
||||
{
|
||||
return m_oReadPath;
|
||||
}
|
||||
void setData(BYTE* pData, long length)
|
||||
{
|
||||
m_nDataLength = length;
|
||||
m_pData = new BYTE[length];
|
||||
memcpy(m_pData, pData, length);
|
||||
}
|
||||
private:
|
||||
CPath m_oReadPath;
|
||||
|
||||
void ClearItems()
|
||||
{
|
||||
m_nDataLength = 0;
|
||||
RELEASEARRAYOBJECTS(m_pData)
|
||||
}
|
||||
|
||||
public:
|
||||
BYTE* m_pData;
|
||||
long m_nDataLength;
|
||||
};
|
||||
} //Spreadsheet
|
||||
} // namespace OOX
|
||||
|
||||
#endif // OOX_PIVOTCACHERECORDS_FILE_INCLUDE_H_
|
||||
122
Common/DocxFormat/Source/XlsxFormat/Pivot/PivotTable.h
Normal file
122
Common/DocxFormat/Source/XlsxFormat/Pivot/PivotTable.h
Normal file
@ -0,0 +1,122 @@
|
||||
/*
|
||||
* (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
|
||||
#ifndef OOX_PIVOTTABLE_FILE_INCLUDE_H_
|
||||
#define OOX_PIVOTTABLE_FILE_INCLUDE_H_
|
||||
|
||||
#include "../CommonInclude.h"
|
||||
|
||||
|
||||
namespace OOX
|
||||
{
|
||||
namespace Spreadsheet
|
||||
{
|
||||
class CPivotTable : public OOX::File, public OOX::IFileContainer
|
||||
{
|
||||
public:
|
||||
CPivotTable()
|
||||
{
|
||||
m_bSpreadsheets = true;
|
||||
m_pData = NULL;
|
||||
m_nDataLength = 0;
|
||||
}
|
||||
CPivotTable(const CPath& oRootPath, const CPath& oPath)
|
||||
{
|
||||
m_bSpreadsheets = true;
|
||||
m_pData = NULL;
|
||||
m_nDataLength = 0;
|
||||
read( oRootPath, oPath );
|
||||
}
|
||||
virtual ~CPivotTable()
|
||||
{
|
||||
ClearItems();
|
||||
}
|
||||
public:
|
||||
|
||||
virtual void read(const CPath& oPath)
|
||||
{
|
||||
}
|
||||
virtual void read(const CPath& oRootPath, const CPath& oPath)
|
||||
{
|
||||
}
|
||||
virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const
|
||||
{
|
||||
if(m_nDataLength > 0)
|
||||
{
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(oPath.GetPath());
|
||||
oFile.WriteFile(m_pData, m_nDataLength);
|
||||
oFile.CloseFile();
|
||||
|
||||
oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() );
|
||||
IFileContainer::Write( oPath, oDirectory, oContent );
|
||||
}
|
||||
}
|
||||
virtual const OOX::FileType type() const
|
||||
{
|
||||
return OOX::Spreadsheet::FileTypes::PivotTable;
|
||||
}
|
||||
virtual const CPath DefaultDirectory() const
|
||||
{
|
||||
return type().DefaultDirectory();
|
||||
}
|
||||
virtual const CPath DefaultFileName() const
|
||||
{
|
||||
return type().DefaultFileName();
|
||||
}
|
||||
const CPath& GetReadPath()
|
||||
{
|
||||
return m_oReadPath;
|
||||
}
|
||||
void setData(BYTE* pData, long length)
|
||||
{
|
||||
m_nDataLength = length;
|
||||
m_pData = new BYTE[length];
|
||||
memcpy(m_pData, pData, length);
|
||||
}
|
||||
private:
|
||||
CPath m_oReadPath;
|
||||
|
||||
void ClearItems()
|
||||
{
|
||||
m_nDataLength = 0;
|
||||
RELEASEARRAYOBJECTS(m_pData)
|
||||
}
|
||||
|
||||
public:
|
||||
BYTE* m_pData;
|
||||
long m_nDataLength;
|
||||
};
|
||||
} //Spreadsheet
|
||||
} // namespace OOX
|
||||
|
||||
#endif // OOX_PIVOTTABLE_FILE_INCLUDE_H_
|
||||
@ -137,6 +137,8 @@ namespace OOX
|
||||
m_oDefinedNames->toXML(sXml);
|
||||
|
||||
sXml.WriteString(_T("<calcPr calcId=\"145621\"/>"));
|
||||
if(m_oPivotCachesXml.IsInit())
|
||||
sXml.WriteString(m_oPivotCachesXml.get());
|
||||
sXml.WriteString(_T("</workbook>"));
|
||||
|
||||
std::wstring sPath = oPath.GetPath();
|
||||
@ -208,7 +210,7 @@ namespace OOX
|
||||
nullable<OOX::Spreadsheet::CSheets> m_oSheets;
|
||||
nullable<OOX::Spreadsheet::CWorkbookPr> m_oWorkbookPr;
|
||||
nullable<OOX::Spreadsheet::CExternalReferences> m_oExternalReferences;
|
||||
|
||||
nullable<std::wstring> m_oPivotCachesXml;
|
||||
};
|
||||
} //Spreadsheet
|
||||
} // namespace OOX
|
||||
|
||||
@ -47,6 +47,9 @@
|
||||
#include "CalcChain/CalcChain.h"
|
||||
#include "ExternalLinks/ExternalLinks.h"
|
||||
#include "ExternalLinks/ExternalLinkPath.h"
|
||||
#include "Pivot/PivotTable.h"
|
||||
#include "Pivot/PivotCacheDefinition.h"
|
||||
#include "Pivot/PivotCacheRecords.h"
|
||||
|
||||
#include "../../../DesktopEditor/common/Directory.h"
|
||||
|
||||
|
||||
@ -45,7 +45,8 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#define U_TO_UTF8(val) NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(val.c_str(), val.length())
|
||||
#define U_TO_UTF8(val) NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(val.c_str(), (LONG)val.length())
|
||||
#define UTF8_TO_U(val) NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)val.c_str(), (LONG)val.length())
|
||||
|
||||
#if defined(__linux__) || defined(_MAC) && !defined(_IOS)
|
||||
#include <unistd.h>
|
||||
|
||||
@ -7,11 +7,14 @@
|
||||
#include <string>
|
||||
|
||||
#include "../../../common/File.h"
|
||||
#include "../../../common/Directory.h"
|
||||
#include "../../../common/BigInteger.h"
|
||||
|
||||
#include "../../../xml/include/xmlutils.h"
|
||||
#include "../../../xml/libxml2/include/libxml/c14n.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#pragma comment (lib, "crypt32.lib")
|
||||
#pragma comment (lib, "cryptui.lib")
|
||||
#pragma comment (lib, "Advapi32.lib")
|
||||
@ -93,18 +96,14 @@ class CXmlSigner
|
||||
{
|
||||
private:
|
||||
PCCERT_CONTEXT m_context;
|
||||
HCRYPTPROV m_hCryptProv;
|
||||
|
||||
public:
|
||||
CXmlSigner(PCCERT_CONTEXT pCertContext)
|
||||
{
|
||||
m_context = pCertContext;
|
||||
m_hCryptProv = NULL;
|
||||
m_context = pCertContext;
|
||||
}
|
||||
~CXmlSigner()
|
||||
{
|
||||
if (NULL != m_hCryptProv)
|
||||
CryptReleaseContext(m_hCryptProv, 0);
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
@ -115,20 +114,24 @@ public:
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
|
||||
if (NULL == m_hCryptProv)
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &m_hCryptProv, &dwKeySpec, NULL);
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return "";
|
||||
|
||||
bResult = CryptCreateHash(m_hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
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 "";
|
||||
}
|
||||
|
||||
@ -139,6 +142,7 @@ public:
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
@ -148,6 +152,7 @@ public:
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
@ -167,29 +172,36 @@ public:
|
||||
|
||||
delete[] pBase64;
|
||||
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
std::string GetHash(std::string& sXml)
|
||||
std::string GetHash(BYTE* pData, DWORD dwSize)
|
||||
{
|
||||
BOOL bResult = TRUE;
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
|
||||
if (NULL == m_hCryptProv)
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &m_hCryptProv, &dwKeySpec, NULL);
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return "";
|
||||
|
||||
bResult = CryptCreateHash(m_hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
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);
|
||||
bResult = CryptHashData(hHash, pData, dwSize, 0);
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
@ -199,6 +211,7 @@ public:
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
@ -206,11 +219,12 @@ public:
|
||||
|
||||
bResult = CryptGetHashParam(hHash, HP_HASHVAL, pDataHashRaw, &cbHashSize, 0);
|
||||
|
||||
delete[] pDataHashRaw;
|
||||
CryptDestroyHash(hHash);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return "";
|
||||
}
|
||||
|
||||
char* pBase64_hash = NULL;
|
||||
int nBase64Len_hash = 0;
|
||||
@ -219,21 +233,20 @@ public:
|
||||
std::string sReturn(pBase64_hash, nBase64Len_hash);
|
||||
delete [] pBase64_hash;
|
||||
|
||||
//delete [] pDataHashRaw;
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
std::string GetHash(std::string& sXml)
|
||||
{
|
||||
return GetHash((BYTE*)sXml.c_str(), (DWORD)sXml.length());
|
||||
}
|
||||
|
||||
std::string GetHash(std::wstring& sXmlFile)
|
||||
{
|
||||
BOOL bResult = TRUE;
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
|
||||
if (NULL == m_hCryptProv)
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &m_hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return "";
|
||||
|
||||
BYTE* pFileData = NULL;
|
||||
DWORD dwFileDataLen = 0;
|
||||
NSFile::CFileBinary::ReadAllBytes(sXmlFile, &pFileData, dwFileDataLen);
|
||||
@ -241,50 +254,9 @@ public:
|
||||
if (0 == dwFileDataLen)
|
||||
return "";
|
||||
|
||||
bResult = CryptCreateHash(m_hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
if (!bResult)
|
||||
{
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
return "";
|
||||
}
|
||||
|
||||
bResult = CryptHashData(hHash, pFileData, dwFileDataLen, 0);
|
||||
if (!bResult)
|
||||
{
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
CryptDestroyHash(hHash);
|
||||
return "";
|
||||
}
|
||||
|
||||
DWORD cbHashSize = 0, dwCount = sizeof(DWORD);
|
||||
bResult = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &dwCount, 0);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
CryptDestroyHash(hHash);
|
||||
return "";
|
||||
}
|
||||
std::string sReturn = GetHash(pFileData, dwFileDataLen);
|
||||
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
|
||||
BYTE* pDataHashRaw = new BYTE[dwCount];
|
||||
|
||||
bResult = CryptGetHashParam(hHash, HP_HASHVAL, pDataHashRaw, &cbHashSize, 0);
|
||||
|
||||
delete[] pDataHashRaw;
|
||||
CryptDestroyHash(hHash);
|
||||
|
||||
if (!bResult)
|
||||
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;
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
@ -294,17 +266,19 @@ public:
|
||||
HCRYPTHASH hHash = NULL;
|
||||
HCRYPTKEY hPubKey = NULL;
|
||||
|
||||
BOOL bResult = TRUE;
|
||||
if (NULL == m_hCryptProv)
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &m_hCryptProv, &dwKeySpec, NULL);
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
BOOL bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return FALSE;
|
||||
|
||||
bResult = CryptCreateHash(m_hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
bResult = CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BYTE* pDataHash = NULL;
|
||||
DWORD dwHashLen = 0;
|
||||
@ -320,7 +294,7 @@ public:
|
||||
bResult = CryptHashData(hHash, (BYTE*)sXml.c_str(), (DWORD)sXml.length(), 0);
|
||||
|
||||
// Get the public key from the certificate
|
||||
CryptImportPublicKeyInfo(m_hCryptProv, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, &m_context->pCertInfo->SubjectPublicKeyInfo, &hPubKey);
|
||||
CryptImportPublicKeyInfo(hCryptProv, m_context->dwCertEncodingType, &m_context->pCertInfo->SubjectPublicKeyInfo, &hPubKey);
|
||||
|
||||
BOOL bResultRet = CryptVerifySignature(hHash, pDataHashMem, dwHashLen, hPubKey, NULL, 0);
|
||||
|
||||
@ -329,12 +303,28 @@ public:
|
||||
bResult = CryptDestroyHash(hHash);
|
||||
|
||||
CryptDestroyKey(hPubKey);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return bResultRet && bResult;
|
||||
}
|
||||
|
||||
private:
|
||||
void ConvertEndian(const BYTE* src, BYTE* dst, DWORD size)
|
||||
std::string GetCertificateBase64()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
std::string GetCertificateHash()
|
||||
{
|
||||
return GetHash(m_context->pbCertEncoded, (int)m_context->cbCertEncoded);
|
||||
}
|
||||
|
||||
public:
|
||||
static void ConvertEndian(const BYTE* src, BYTE* dst, DWORD size)
|
||||
{
|
||||
for(BYTE* p = dst + size - 1; p >= dst; ++src, --p)
|
||||
(*p) = (*src);
|
||||
@ -346,6 +336,7 @@ void MyHandleError(char *s);
|
||||
|
||||
bool Sign(PCCERT_CONTEXT pCertContext, std::wstring sFileXml, std::wstring sSignatureFile);
|
||||
bool Verify(PCCERT_CONTEXT pCertContext, std::wstring sFileXml, std::wstring sSignatureFile);
|
||||
bool SignDocument(std::wstring sFolderOOXML, PCCERT_CONTEXT pCertContext);
|
||||
|
||||
void main(void)
|
||||
{
|
||||
@ -653,10 +644,19 @@ void main(void)
|
||||
MyHandleError("Select UI failed." );
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
bool bRes = true;
|
||||
bRes = Sign(pCertContext, NSFile::GetProcessDirectory() + L"/test.xml", NSFile::GetProcessDirectory() + L"/result.txt");
|
||||
bRes = Verify(pCertContext, NSFile::GetProcessDirectory() + L"/test.xml", NSFile::GetProcessDirectory() + L"/result.txt");
|
||||
if (false)
|
||||
{
|
||||
bool bRes = true;
|
||||
bRes = Sign(pCertContext, NSFile::GetProcessDirectory() + L"/test.xml", NSFile::GetProcessDirectory() + L"/result.txt");
|
||||
bRes = Verify(pCertContext, NSFile::GetProcessDirectory() + L"/test.xml", NSFile::GetProcessDirectory() + L"/result.txt");
|
||||
|
||||
CXmlSigner oSigner(pCertContext);
|
||||
std::string sCertBase64 = oSigner.GetCertificateBase64();
|
||||
std::string sCertHash = oSigner.GetCertificateHash();
|
||||
}
|
||||
|
||||
SignDocument(NSFile::GetProcessDirectory() + L"/ImageStamp", pCertContext);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CertFreeCertificateContext(pCertContext);
|
||||
@ -705,7 +705,293 @@ bool Verify(PCCERT_CONTEXT pCertContext, std::wstring sFileXml, std::wstring sSi
|
||||
return (TRUE == oSigner.Verify(sXmlUtf8Prepare, sXmlUtf8Signature));
|
||||
}
|
||||
|
||||
class COOXMLSigner
|
||||
{
|
||||
public:
|
||||
PCCERT_CONTEXT m_context;
|
||||
std::wstring m_sFolder;
|
||||
|
||||
CXmlSigner* m_signer;
|
||||
|
||||
public:
|
||||
COOXMLSigner(const std::wstring& sFolder, PCCERT_CONTEXT pContext)
|
||||
{
|
||||
m_sFolder = sFolder;
|
||||
m_context = pContext;
|
||||
m_signer = new CXmlSigner(pContext);
|
||||
}
|
||||
~COOXMLSigner()
|
||||
{
|
||||
RELEASEOBJECT(m_signer);
|
||||
}
|
||||
|
||||
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_signer->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_signer->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;
|
||||
}
|
||||
};
|
||||
|
||||
bool SignDocument(std::wstring sFolderOOXML, PCCERT_CONTEXT pCertContext)
|
||||
{
|
||||
std::wstring sFolder = NSFile::GetProcessDirectory();
|
||||
|
||||
COOXMLSigner oOOXMLSigner(sFolderOOXML, pCertContext);
|
||||
|
||||
std::string sSignedData;
|
||||
std::wstring sXmlData;
|
||||
|
||||
std::wstring sDataSign = L"2017-04-21T08:30:21Z";
|
||||
|
||||
sSignedData += "<CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\
|
||||
<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"/>";
|
||||
|
||||
if (true)
|
||||
{
|
||||
// idPackageObject
|
||||
std::wstring sXml = L"<Manifest>";
|
||||
|
||||
// TODO: rels
|
||||
if (true)
|
||||
{
|
||||
sXml += L"<Reference URI=\"/_rels/.rels?ContentType=application/vnd.openxmlformats-package.relationships+xml\">\
|
||||
<Transforms><Transform Algorithm=\"http://schemas.openxmlformats.org/package/2006/RelationshipTransform\">\
|
||||
<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"rId1\"/>\
|
||||
</Transform><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>\
|
||||
<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/>\
|
||||
<DigestValue>1vWU/YTF/7t6ZjnE44gAFTbZvvA=</DigestValue>\
|
||||
</Reference>";
|
||||
|
||||
sXml += L"<Reference URI=\"/word/_rels/document.xml.rels?ContentType=application/vnd.openxmlformats-package.relationships+xml\">\
|
||||
<Transforms><Transform Algorithm=\"http://schemas.openxmlformats.org/package/2006/RelationshipTransform\">\
|
||||
<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"rId3\"/>\
|
||||
<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"rId2\"/>\
|
||||
<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"rId1\"/>\
|
||||
<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"rId6\"/>\
|
||||
<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"rId5\"/>\
|
||||
<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"rId4\"/>\
|
||||
</Transform><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>\
|
||||
<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/>\
|
||||
<DigestValue>kVYCpjZZG3SU5+sOsB1PRnQSCzk=</DigestValue>\
|
||||
</Reference>";
|
||||
}
|
||||
|
||||
|
||||
sXml += oOOXMLSigner.GetReference(L"/word/document.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml");
|
||||
sXml += oOOXMLSigner.GetReference(L"/word/fontTable.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml");
|
||||
sXml += oOOXMLSigner.GetReference(L"/word/media/image1.emf", L"image/x-emf");
|
||||
sXml += oOOXMLSigner.GetReference(L"/word/settings.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml");
|
||||
sXml += oOOXMLSigner.GetReference(L"/word/styles.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml");
|
||||
sXml += oOOXMLSigner.GetReference(L"/word/theme/theme1.xml", L"application/vnd.openxmlformats-officedocument.theme+xml");
|
||||
sXml += oOOXMLSigner.GetReference(L"/word/webSettings.xml", L"application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml");
|
||||
|
||||
sXml += L"</Manifest>";
|
||||
|
||||
sXml += L"<SignatureProperties><SignatureProperty Id=\"idSignatureTime\" Target=\"#idPackageSignature\">";
|
||||
sXml += (L"<mdssi:SignatureTime xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\">\
|
||||
<mdssi:Format>YYYY-MM-DDThh:mm:ssTZD</mdssi:Format>\
|
||||
<mdssi:Value>" + sDataSign + L"</mdssi:Value>\
|
||||
</mdssi:SignatureTime></SignatureProperty></SignatureProperties>");
|
||||
|
||||
sXmlData += (L"<Object Id=\"idPackageObject\">" + sXml + L"</Object>");
|
||||
|
||||
sSignedData += ("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idPackageObject\">" +
|
||||
oOOXMLSigner.GetReferenceMain(sXml, L"idPackageObject", false) + "</Reference>");
|
||||
}
|
||||
|
||||
|
||||
std::wstring sImageValid = oOOXMLSigner.GetImageBase64(sFolder + L"/../../../resources/valid.png");
|
||||
std::wstring sImageInValid = oOOXMLSigner.GetImageBase64(sFolder + L"/../../../resources/invalid.png");
|
||||
|
||||
if (true)
|
||||
{
|
||||
// idOfficeObject
|
||||
std::wstring sXml = L"<SignatureProperties>\
|
||||
<SignatureProperty Id=\"idOfficeV1Details\" Target=\"#idPackageSignature\">\
|
||||
<SignatureInfoV1 xmlns=\"http://schemas.microsoft.com/office/2006/digsig\">\
|
||||
<SetupID>{39B6B9C7-60AD-45A2-9F61-40C74A24042E}</SetupID>\
|
||||
<SignatureText></SignatureText>\
|
||||
<SignatureImage>" + sImageValid + L"</SignatureImage>\
|
||||
<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>";
|
||||
|
||||
sXmlData += (L"<Object Id=\"idOfficeObject\">" + sXml + L"</Object>");
|
||||
|
||||
sSignedData += ("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idOfficeObject\">" +
|
||||
oOOXMLSigner.GetReferenceMain(sXml, L"idOfficeObject", false) + "</Reference>");
|
||||
}
|
||||
|
||||
if (true)
|
||||
{
|
||||
DWORD dwNameLen = CertGetNameStringW(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, NULL, 0);
|
||||
wchar_t* pNameData = new wchar_t[dwNameLen];
|
||||
CertGetNameStringW(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, pNameData, dwNameLen);
|
||||
std::wstring sName(pNameData);
|
||||
RELEASEARRAYOBJECTS(pNameData);
|
||||
|
||||
int nNumberLen = (int)pCertContext->pCertInfo->SerialNumber.cbData;
|
||||
BYTE* pNumberData = new BYTE[nNumberLen];
|
||||
CXmlSigner::ConvertEndian(pCertContext->pCertInfo->SerialNumber.pbData, pNumberData, (DWORD)nNumberLen);
|
||||
CBigInteger oInteger(pNumberData, nNumberLen);
|
||||
delete[] pNumberData;
|
||||
|
||||
std::string sKeyA = oInteger.ToString();
|
||||
std::wstring sKey = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)sKeyA.c_str(), (LONG)sKeyA.length());
|
||||
|
||||
std::wstring sXml = (L"<xd:SignedSignatureProperties>\
|
||||
<xd:SigningTime>" + sDataSign + 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>";
|
||||
|
||||
sXmlData += L"<Object><xd:QualifyingProperties xmlns:xd=\"http://uri.etsi.org/01903/v1.3.2#\" Target=\"#idPackageSignature\">\
|
||||
<xd:SignedProperties Id=\"idSignedProperties\">";
|
||||
sXmlData += sXml;
|
||||
sXmlData += L"</xd:SignedProperties></xd:QualifyingProperties></Object>";
|
||||
|
||||
sSignedData += "<Reference Type=\"http://uri.etsi.org/01903#SignedProperties\" URI=\"#idSignedProperties\">\
|
||||
<Transforms><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>\
|
||||
<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/><DigestValue>";
|
||||
|
||||
std::string sXmlTmp = CXmlCanonicalizator::Execute(U_TO_UTF8(sSignedXml), XML_C14N_1_0);
|
||||
sSignedData += oOOXMLSigner.m_signer->GetHash(sXmlTmp);
|
||||
|
||||
sSignedData += "</DigestValue></Reference>";
|
||||
}
|
||||
|
||||
if (true)
|
||||
{
|
||||
std::wstring sXml = sImageValid;
|
||||
|
||||
sXmlData += (L"<Object Id=\"idValidSigLnImg\">" + sXml + L"</Object>");
|
||||
|
||||
sSignedData += ("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idValidSigLnImg\">" +
|
||||
oOOXMLSigner.GetReferenceMain(sXml, L"idValidSigLnImg", false) + "</Reference>");
|
||||
}
|
||||
|
||||
if (true)
|
||||
{
|
||||
std::wstring sXml = sImageInValid;
|
||||
|
||||
sXmlData += (L"<Object Id=\"idInvalidSigLnImg\">" + sXml + L"</Object>");
|
||||
|
||||
sSignedData += ("<Reference Type=\"http://www.w3.org/2000/09/xmldsig#Object\" URI=\"#idInvalidSigLnImg\">" +
|
||||
oOOXMLSigner.GetReferenceMain(sXml, L"idInvalidSigLnImg", false) + "</Reference>");
|
||||
}
|
||||
|
||||
std::string sXmlPrepend = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\" Id=\"idPackageSignature\"><SignedInfo>");
|
||||
sXmlPrepend += sSignedData;
|
||||
sXmlPrepend += "</SignedInfo>";
|
||||
|
||||
sXmlPrepend += "<SignatureValue>";
|
||||
std::string sSignedInfo = "<SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" + sSignedData + "</SignedInfo>";
|
||||
sSignedInfo = CXmlCanonicalizator::Execute(sSignedInfo, XML_C14N_1_0);
|
||||
sXmlPrepend += oOOXMLSigner.m_signer->Sign(sSignedInfo);
|
||||
sXmlPrepend += "</SignatureValue>";
|
||||
sXmlPrepend += ("<KeyInfo><X509Data><X509Certificate>" + oOOXMLSigner.m_signer->GetCertificateBase64() + "</X509Certificate></X509Data></KeyInfo>");
|
||||
|
||||
sXmlData = (UTF8_TO_U(sXmlPrepend) + sXmlData);
|
||||
sXmlData += L"</Signature>";
|
||||
|
||||
std::wstring sDirectory = sFolderOOXML + L"/_xmlsignatures";
|
||||
NSDirectory::CreateDirectory(sDirectory);
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(sDirectory + L"/origin.sigs");
|
||||
oFile.CloseFile();
|
||||
|
||||
NSFile::CFileBinary::SaveToFile(sDirectory + L"/sig1.xml", sXmlData, false);
|
||||
|
||||
NSDirectory::CreateDirectory(sDirectory + L"/_rels");
|
||||
|
||||
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(sDirectory + L"/_rels/origin.sigs.rels", sRels, false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -122,13 +122,13 @@ namespace codegen
|
||||
|
||||
sb.AppendFormat("function {0}(){{\r\n", oGenClass.sName);
|
||||
ProcessProperty(sb, aAttributes, aMembers, bNeedTextNode, bNeedDoubleArray);
|
||||
sb.AppendFormat("}}\r\n", oGenClass.sName);
|
||||
sb.AppendFormat("}}\r\n");
|
||||
|
||||
if (aAttributes.Count > 0)
|
||||
{
|
||||
sb.AppendFormat("{0}.prototype.readAttributes = function(attr, uq) {{\r\n", oGenClass.sName);
|
||||
ProcessAttributesFromXml(sb, oGenClass, aAttributes);
|
||||
sb.AppendFormat("}};\r\n", oGenClass.sName);
|
||||
sb.AppendFormat("}};\r\n");
|
||||
}
|
||||
if (aMembers.Count > 0)
|
||||
{
|
||||
@ -144,19 +144,19 @@ namespace codegen
|
||||
sb.AppendFormat("newContext = null;\r\n");
|
||||
sb.AppendFormat("}}\r\n");
|
||||
sb.AppendFormat("return newContext;\r\n");
|
||||
sb.AppendFormat("}};\r\n", oGenClass.sName);
|
||||
sb.AppendFormat("}};\r\n");
|
||||
|
||||
if (bNeedTextNode)
|
||||
{
|
||||
sb.AppendFormat("{0}.prototype.onTextNode = function(text, uq) {{\r\n", oGenClass.sName);
|
||||
ProcessOnTextNodeFromXml(sb, oGenClass, aMembers);
|
||||
sb.AppendFormat("}};\r\n", oGenClass.sName);
|
||||
sb.AppendFormat("}};\r\n");
|
||||
}
|
||||
if (bNeedDoubleArray)
|
||||
{
|
||||
sb.AppendFormat("{0}.prototype.onEndNode = function(prevContext, elem) {{\r\n", oGenClass.sName);
|
||||
ProcessOnEndNodeFromXml(sb, oGenClass, aMembers);
|
||||
sb.AppendFormat("}};\r\n", oGenClass.sName);
|
||||
sb.AppendFormat("}};\r\n");
|
||||
}
|
||||
}
|
||||
if (aAttributes.Count > 0 || aMembers.Count > 0)
|
||||
@ -302,7 +302,9 @@ namespace codegen
|
||||
if (!string.IsNullOrEmpty(sName))
|
||||
{
|
||||
sb.AppendFormat("if(\"{0}\" === {1}){{\r\n", sName, sCodeName);
|
||||
sb.AppendFormat("newContext.readAttributes(attr, uq);\r\n", sName, sCodeName);
|
||||
sb.AppendFormat("if(newContext.readAttributes){{\r\n");
|
||||
sb.AppendFormat("newContext.readAttributes(attr, uq);\r\n");
|
||||
sb.AppendFormat("}}\r\n");
|
||||
sb.AppendFormat("}}\r\n", sName, sCodeName);
|
||||
return true;
|
||||
}
|
||||
@ -328,8 +330,8 @@ namespace codegen
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("//todo check name duplication\r\n", getNameWithPrefix(oGenClass, oGenMember), sCodeName);
|
||||
sb.AppendFormat("this.{0} = [];\r\n", oGenMember.sName);
|
||||
}
|
||||
sb.AppendFormat("this.{0} = [];\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("}}\r\n", getNameWithPrefix(oGenClass, oGenMember), sCodeName);
|
||||
nCounter++;
|
||||
}
|
||||
@ -481,6 +483,9 @@ namespace codegen
|
||||
sb.AppendFormat("else ");
|
||||
sb.AppendFormat("if(\"{0}\" === elem){{\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
sb.AppendFormat("if(this._curArray && this._curArray.length > 0){{\r\n");
|
||||
sb.AppendFormat("if(!this.{0}){{\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("this.{0} = [];\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("}}\r\n");
|
||||
sb.AppendFormat("this.{0}.push(this._curArray);\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("this._curArray = null;\r\n");
|
||||
sb.AppendFormat("}}\r\n");
|
||||
@ -586,29 +591,25 @@ namespace codegen
|
||||
{
|
||||
GenMemberPivot oGenMember = aMembers[i];
|
||||
bool bNullCheck = true;
|
||||
string sCodeElem;
|
||||
string sCodeElem = "this." + oGenMember.sName;
|
||||
if (oGenMember.nArrayRank > 0)
|
||||
{
|
||||
if (false == oGenMember.bIsArrayTypesHidden)
|
||||
{
|
||||
sb.AppendFormat("if(null !== {0}){{\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("if(null !== {0}){{\r\n", sCodeElem);
|
||||
}
|
||||
sb.AppendFormat("for(var i = 0; i < this.{0}.length; ++i){{\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("var elem = this.{0}[i];\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("for(var i = 0; i < {0}.length; ++i){{\r\n", sCodeElem);
|
||||
sb.AppendFormat("var elem = {0}[i];\r\n", sCodeElem);
|
||||
sCodeElem = "elem";
|
||||
bNullCheck = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
sCodeElem = "this." + oGenMember.sName;
|
||||
}
|
||||
if (null != oGenMember.aArrayTypes)
|
||||
{
|
||||
if (false == oGenMember.bIsArrayTypesHidden)
|
||||
{
|
||||
if (bNullCheck)
|
||||
sb.AppendFormat("if(null !== {0}){{\r\n", sCodeElem);
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd(\"{0}\", true);\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
sb.AppendFormat("writer.WriteXmlNodeStart(\"{0}\", true);\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
}
|
||||
if (oGenMember.nArrayRank.HasValue)
|
||||
{
|
||||
@ -669,7 +670,7 @@ namespace codegen
|
||||
sb.AppendFormat("}}\r\n");
|
||||
if (false == oGenMember.bIsArrayTypesHidden)
|
||||
{
|
||||
sb.AppendFormat("}}\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("}}\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -756,12 +757,12 @@ namespace codegen
|
||||
default:
|
||||
if (bAttribute)
|
||||
{
|
||||
sb.AppendFormat("writer.WriteXmlAttributeString(\"{0}\", {1});\r\n", sName, sVal);
|
||||
sb.AppendFormat("writer.WriteXmlAttributeStringEncode(\"{0}\", {1});\r\n", sName, sVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("writer.WriteXmlNodeStart(\"{0}\", true);\r\n", sName);
|
||||
sb.AppendFormat("writer.WriteXmlString({0});\r\n", sVal);
|
||||
sb.AppendFormat("writer.WriteXmlStringEncode({0});\r\n", sVal);
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd(\"{0}\");\r\n", sName);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -45,10 +45,35 @@ namespace TestDocsWithChart
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
getFilesAlternateContent();
|
||||
getFilesPivot();
|
||||
//getFilesAlternateContent();
|
||||
//getFiles();
|
||||
//convertFiles();
|
||||
}
|
||||
static void getFilesPivot()
|
||||
{
|
||||
string sDirInput = @"\\192.168.3.208\allusers\Files\XLSX";
|
||||
string sDirOutput = @"D:\Files\Pivot";
|
||||
String[] allfiles = System.IO.Directory.GetFiles(sDirInput, "*.*", System.IO.SearchOption.AllDirectories);
|
||||
for (var i = 0; i < allfiles.Length; ++i)
|
||||
{
|
||||
string file = allfiles[i];
|
||||
try
|
||||
{
|
||||
ZipArchive zip = ZipFile.OpenRead(file);
|
||||
foreach (ZipArchiveEntry entry in zip.Entries)
|
||||
{
|
||||
if (-1 != entry.FullName.IndexOf("pivotTable", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
System.IO.File.Copy(file, Path.Combine(sDirOutput, Path.GetFileName(file)), true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
|
||||
}
|
||||
}
|
||||
static void getFilesAlternateContent()
|
||||
{
|
||||
string sAlternateContent = ":Choice ";
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
QT -= core
|
||||
QT -= gui
|
||||
|
||||
VERSION = 2.4.450.0
|
||||
VERSION = 2.4.451.0
|
||||
DEFINES += INTVER=$$VERSION
|
||||
|
||||
TARGET = x2t
|
||||
|
||||
@ -185,8 +185,9 @@ namespace BinXlsxRW
|
||||
DefinedNames = 3,
|
||||
DefinedName = 4,
|
||||
ExternalReferences = 5,
|
||||
ExternalReference = 6
|
||||
|
||||
ExternalReference = 6,
|
||||
PivotCaches = 7,
|
||||
PivotCache = 8
|
||||
};}
|
||||
namespace c_oSerWorkbookPrTypes{enum c_oSerWorkbookPrTypes
|
||||
{
|
||||
@ -232,7 +233,8 @@ namespace BinXlsxRW
|
||||
SheetViews = 22,
|
||||
SheetView = 23,
|
||||
SheetPr = 24,
|
||||
SparklineGroups = 25
|
||||
SparklineGroups = 25,
|
||||
PivotTable = 26
|
||||
};}
|
||||
namespace c_oSerWorksheetPropTypes{enum c_oSerWorksheetPropTypes
|
||||
{
|
||||
@ -809,6 +811,14 @@ namespace BinXlsxRW
|
||||
AltText = 0,
|
||||
AltTextSummary = 1
|
||||
};}
|
||||
namespace c_oSer_PivotTypes{enum c_oSerPivotTypes
|
||||
{
|
||||
id = 0,
|
||||
cache = 1,
|
||||
record = 2,
|
||||
cacheId = 3,
|
||||
table = 4
|
||||
};}
|
||||
}
|
||||
|
||||
#endif //
|
||||
|
||||
@ -64,6 +64,27 @@ namespace BinXlsxRW {
|
||||
nIndex = _nIndex;
|
||||
}
|
||||
};
|
||||
class PivotCachesTemp
|
||||
{
|
||||
public:
|
||||
long nId;
|
||||
BYTE* pDefinitionData;
|
||||
long nDefinitionLength;
|
||||
OOX::Spreadsheet::CPivotCacheRecords* pRecords;
|
||||
long nCacheId;
|
||||
OOX::Spreadsheet::CPivotTable* pTable;
|
||||
public:
|
||||
PivotCachesTemp()
|
||||
{
|
||||
nId = -1;
|
||||
pDefinitionData = NULL;
|
||||
nDefinitionLength = 0;
|
||||
pRecords = NULL;
|
||||
nCacheId = -1;
|
||||
pTable = NULL;
|
||||
}
|
||||
};
|
||||
|
||||
class Binary_CommonReader2
|
||||
{
|
||||
protected:
|
||||
@ -1477,8 +1498,9 @@ namespace BinXlsxRW {
|
||||
class BinaryWorkbookTableReader : public Binary_CommonReader<BinaryWorkbookTableReader>
|
||||
{
|
||||
OOX::Spreadsheet::CWorkbook& m_oWorkbook;
|
||||
std::map<long, NSCommon::smart_ptr<OOX::File>>& m_mapPivotCacheDefinitions;
|
||||
public:
|
||||
BinaryWorkbookTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorkbook& oWorkbook):Binary_CommonReader(oBufferedStream), m_oWorkbook(oWorkbook)
|
||||
BinaryWorkbookTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorkbook& oWorkbook, std::map<long, NSCommon::smart_ptr<OOX::File>>& mapPivotCacheDefinitions):Binary_CommonReader(oBufferedStream), m_oWorkbook(oWorkbook), m_mapPivotCacheDefinitions(mapPivotCacheDefinitions)
|
||||
{
|
||||
}
|
||||
int Read()
|
||||
@ -1508,6 +1530,13 @@ namespace BinXlsxRW {
|
||||
m_oWorkbook.m_oExternalReferences.Init();
|
||||
res = Read1(length, &BinaryWorkbookTableReader::ReadExternalReferences, this, poResult);
|
||||
}
|
||||
else if(c_oSerWorkbookTypes::PivotCaches == type)
|
||||
{
|
||||
m_oWorkbook.m_oPivotCachesXml.Init();
|
||||
m_oWorkbook.m_oPivotCachesXml->append(L"<pivotCaches>");
|
||||
res = Read1(length, &BinaryWorkbookTableReader::ReadPivotCaches, this, poResult);
|
||||
m_oWorkbook.m_oPivotCachesXml->append(L"</pivotCaches>");
|
||||
}
|
||||
else
|
||||
res = c_oSerConstants::ReadUnknown;
|
||||
return res;
|
||||
@ -1633,7 +1662,67 @@ namespace BinXlsxRW {
|
||||
{
|
||||
pDefinedName->m_oComment.Init();
|
||||
pDefinedName->m_oComment->append(m_oBufferedStream.GetString4(length));
|
||||
}
|
||||
}
|
||||
else
|
||||
res = c_oSerConstants::ReadUnknown;
|
||||
return res;
|
||||
};
|
||||
int ReadPivotCaches(BYTE type, long length, void* poResult)
|
||||
{
|
||||
int res = c_oSerConstants::ReadOk;
|
||||
if(c_oSerWorkbookTypes::PivotCache == type)
|
||||
{
|
||||
PivotCachesTemp oPivotCachesTemp;
|
||||
res = Read1(length, &BinaryWorkbookTableReader::ReadPivotCache, this, &oPivotCachesTemp);
|
||||
if(-1 != oPivotCachesTemp.nId && NULL != oPivotCachesTemp.pDefinitionData)
|
||||
{
|
||||
OOX::Spreadsheet::CPivotCacheDefinition* pDefinition = new OOX::Spreadsheet::CPivotCacheDefinition();
|
||||
std::wstring srIdRecords;
|
||||
if(NULL != oPivotCachesTemp.pRecords)
|
||||
{
|
||||
NSCommon::smart_ptr<OOX::File> pFileRecords(oPivotCachesTemp.pRecords);
|
||||
srIdRecords = pDefinition->Add(pFileRecords).ToString();
|
||||
}
|
||||
pDefinition->setData(oPivotCachesTemp.pDefinitionData, oPivotCachesTemp.nDefinitionLength, srIdRecords);
|
||||
NSCommon::smart_ptr<OOX::File> pFileDefinition(pDefinition);
|
||||
OOX::RId rIdDefinition = m_oWorkbook.Add(pFileDefinition);
|
||||
m_oWorkbook.m_oPivotCachesXml->append(L"<pivotCache cacheId=\"");
|
||||
m_oWorkbook.m_oPivotCachesXml->append(std::to_wstring(oPivotCachesTemp.nId));
|
||||
m_oWorkbook.m_oPivotCachesXml->append(L"\" r:id=\"");
|
||||
m_oWorkbook.m_oPivotCachesXml->append(rIdDefinition.ToString());
|
||||
m_oWorkbook.m_oPivotCachesXml->append(L"\"/>");
|
||||
|
||||
m_mapPivotCacheDefinitions[oPivotCachesTemp.nId] = pFileDefinition;
|
||||
}
|
||||
else
|
||||
{
|
||||
RELEASEOBJECT(oPivotCachesTemp.pRecords);
|
||||
}
|
||||
}
|
||||
else
|
||||
res = c_oSerConstants::ReadUnknown;
|
||||
return res;
|
||||
};
|
||||
int ReadPivotCache(BYTE type, long length, void* poResult)
|
||||
{
|
||||
PivotCachesTemp* pPivotCachesTemp = static_cast<PivotCachesTemp*>(poResult);
|
||||
int res = c_oSerConstants::ReadOk;
|
||||
if(c_oSer_PivotTypes::id == type)
|
||||
{
|
||||
pPivotCachesTemp->nId = m_oBufferedStream.GetLong();
|
||||
}
|
||||
else if(c_oSer_PivotTypes::cache == type)
|
||||
{
|
||||
pPivotCachesTemp->pDefinitionData = m_oBufferedStream.GetPointer(length);
|
||||
pPivotCachesTemp->nDefinitionLength = length;
|
||||
}
|
||||
else if(c_oSer_PivotTypes::record == type)
|
||||
{
|
||||
pPivotCachesTemp->pRecords = new OOX::Spreadsheet::CPivotCacheRecords();
|
||||
pPivotCachesTemp->pRecords->setData(m_oBufferedStream.GetPointer(length), length);
|
||||
}
|
||||
else
|
||||
res = c_oSerConstants::ReadUnknown;
|
||||
return res;
|
||||
};
|
||||
};
|
||||
@ -1876,14 +1965,15 @@ namespace BinXlsxRW {
|
||||
NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter;
|
||||
|
||||
std::map<std::wstring, OOX::Spreadsheet::CWorksheet*>& m_mapWorksheets;
|
||||
std::map<long, NSCommon::smart_ptr<OOX::File>>& m_mapPivotCacheDefinitions;
|
||||
|
||||
public:
|
||||
BinaryWorksheetsTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorkbook& oWorkbook,
|
||||
OOX::Spreadsheet::CSharedStrings* pSharedStrings, std::map<std::wstring, OOX::Spreadsheet::CWorksheet*>& mapWorksheets,
|
||||
std::map<long, ImageObject*>& mapMedia, const std::wstring& sDestinationDir, const std::wstring& sMediaDir, SaveParams& oSaveParams,
|
||||
NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter)
|
||||
NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, std::map<long, NSCommon::smart_ptr<OOX::File>>& mapPivotCacheDefinitions)
|
||||
: Binary_CommonReader(oBufferedStream), m_oWorkbook(oWorkbook), m_oBcr2(oBufferedStream), m_sMediaDir(sMediaDir), m_oSaveParams(oSaveParams),
|
||||
m_mapMedia(mapMedia), m_sDestinationDir(sDestinationDir), m_mapWorksheets(mapWorksheets), m_pSharedStrings(pSharedStrings)
|
||||
m_mapMedia(mapMedia), m_sDestinationDir(sDestinationDir), m_mapWorksheets(mapWorksheets), m_pSharedStrings(pSharedStrings),m_mapPivotCacheDefinitions(mapPivotCacheDefinitions)
|
||||
{
|
||||
m_pCurSheet = NULL;
|
||||
m_pCurWorksheet = NULL;
|
||||
@ -2110,10 +2200,45 @@ namespace BinXlsxRW {
|
||||
m_pCurWorksheet->m_oExtLst.Init();
|
||||
m_pCurWorksheet->m_oExtLst->m_arrExt.push_back(pOfficeArtExtension);
|
||||
}
|
||||
else if(c_oSerWorksheetsTypes::PivotTable == type)
|
||||
{
|
||||
PivotCachesTemp oPivotCachesTemp;
|
||||
res = Read1(length, &BinaryWorksheetsTableReader::ReadPivotTable, this, &oPivotCachesTemp);
|
||||
std::map<long, NSCommon::smart_ptr<OOX::File>>::const_iterator pair = m_mapPivotCacheDefinitions.find(oPivotCachesTemp.nCacheId);
|
||||
if(m_mapPivotCacheDefinitions.end() != pair && NULL != oPivotCachesTemp.pTable)
|
||||
{
|
||||
NSCommon::smart_ptr<OOX::File> pFileTable(oPivotCachesTemp.pTable);
|
||||
oPivotCachesTemp.pTable->AddNoWrite(pair->second);
|
||||
m_pCurWorksheet->Add(pFileTable);
|
||||
}
|
||||
else
|
||||
{
|
||||
RELEASEOBJECT(oPivotCachesTemp.pTable);
|
||||
}
|
||||
}
|
||||
else
|
||||
res = c_oSerConstants::ReadUnknown;
|
||||
return res;
|
||||
}
|
||||
int ReadPivotTable(BYTE type, long length, void* poResult)
|
||||
{
|
||||
PivotCachesTemp* pPivotCachesTemp = static_cast<PivotCachesTemp*>(poResult);
|
||||
int res = c_oSerConstants::ReadOk;
|
||||
if(c_oSer_PivotTypes::cacheId == type)
|
||||
{
|
||||
pPivotCachesTemp->nCacheId =m_oBufferedStream.GetLong();
|
||||
}
|
||||
else if(c_oSer_PivotTypes::table == type)
|
||||
{
|
||||
OOX::Spreadsheet::CPivotTable* pPivotTable = new OOX::Spreadsheet::CPivotTable();
|
||||
pPivotTable->setData(m_oBufferedStream.GetPointer(length), length);
|
||||
pPivotCachesTemp->pTable = pPivotTable;
|
||||
}
|
||||
else
|
||||
res = c_oSerConstants::ReadUnknown;
|
||||
return res;
|
||||
}
|
||||
|
||||
int ReadWorksheetProp(BYTE type, long length, void* poResult)
|
||||
{
|
||||
int res = c_oSerConstants::ReadOk;
|
||||
@ -3841,6 +3966,7 @@ namespace BinXlsxRW {
|
||||
std::vector<long> aOffBits;
|
||||
long nOtherOffBits = -1;
|
||||
long nSharedStringsOffBits = -1;
|
||||
long nWorkbookOffBits = -1;
|
||||
BYTE mtLen = oBufferedStream.GetUChar();
|
||||
|
||||
for(int i = 0; i < mtLen; ++i)
|
||||
@ -3855,6 +3981,8 @@ namespace BinXlsxRW {
|
||||
nOtherOffBits = mtiOffBits;
|
||||
else if(c_oSerTableTypes::SharedStrings == mtiType)
|
||||
nSharedStringsOffBits = mtiOffBits;
|
||||
else if(c_oSerTableTypes::Workbook == mtiType)
|
||||
nWorkbookOffBits = mtiOffBits;
|
||||
else
|
||||
{
|
||||
aTypes.push_back(mtiType);
|
||||
@ -3883,8 +4011,16 @@ namespace BinXlsxRW {
|
||||
if(c_oSerConstants::ReadOk != res)
|
||||
return res;
|
||||
}
|
||||
|
||||
OOX::Spreadsheet::CWorkbook* pWorkbook = oXlsx.CreateWorkbook();
|
||||
std::map<long, NSCommon::smart_ptr<OOX::File>> m_mapPivotCacheDefinitions;
|
||||
if(-1 != nWorkbookOffBits)
|
||||
{
|
||||
oBufferedStream.Seek(nWorkbookOffBits);
|
||||
res = BinaryWorkbookTableReader(oBufferedStream, *pWorkbook, m_mapPivotCacheDefinitions).Read();
|
||||
if(c_oSerConstants::ReadOk != res)
|
||||
return res;
|
||||
}
|
||||
|
||||
for(size_t i = 0, length = aTypes.size(); i < length; ++i)
|
||||
{
|
||||
BYTE mtiType = aTypes[i];
|
||||
@ -3899,14 +4035,9 @@ namespace BinXlsxRW {
|
||||
res = BinaryStyleTableReader(oBufferedStream, *pStyles).Read();
|
||||
}
|
||||
break;
|
||||
case c_oSerTableTypes::Workbook:
|
||||
{
|
||||
res = BinaryWorkbookTableReader(oBufferedStream, *pWorkbook).Read();
|
||||
}
|
||||
break;
|
||||
case c_oSerTableTypes::Worksheets:
|
||||
{
|
||||
res = BinaryWorksheetsTableReader(oBufferedStream, *pWorkbook, pSharedStrings, oXlsx.GetWorksheets(), mapMedia, sOutDir, sMediaDir, oSaveParams, pOfficeDrawingConverter).Read();
|
||||
res = BinaryWorksheetsTableReader(oBufferedStream, *pWorkbook, pSharedStrings, oXlsx.GetWorksheets(), mapMedia, sOutDir, sMediaDir, oSaveParams, pOfficeDrawingConverter, m_mapPivotCacheDefinitions).Read();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user