mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-12 10:55:49 +08:00
Compare commits
10 Commits
core/devel
...
core-windo
| Author | SHA1 | Date | |
|---|---|---|---|
| fecfcfa7d2 | |||
| 29b5fa513a | |||
| f9a19badbf | |||
| d2630ea73c | |||
| a4a58c4782 | |||
| 29a3d80071 | |||
| 598bb419c0 | |||
| 087da9d2ce | |||
| c505aced48 | |||
| 959d5e5fcd |
@ -136,14 +136,18 @@ namespace DocFileFormat
|
||||
}
|
||||
return btWin32;
|
||||
}
|
||||
bool ParseEmbeddedEquation( const std::string & xmlString, std::wstring & newXmlString)
|
||||
bool VMLPictureMapping::ParseEmbeddedEquation( const std::string & xmlString, std::wstring & newXmlString)
|
||||
{
|
||||
newXmlString.clear();
|
||||
std::wstring sTempXmlFile = NSDirectory::CreateTempFileWithUniqueName(
|
||||
NSDirectory::GetTempPath(), L"emb");
|
||||
|
||||
sTempXmlFile += L".xml";
|
||||
|
||||
std::wstring sTempFolder = m_ctx->_doc->m_sTempFolder;
|
||||
if (sTempFolder.empty())
|
||||
{
|
||||
sTempFolder = NSFile::CFileBinary::GetTempPath();
|
||||
}
|
||||
|
||||
std::wstring sTempXmlFile = NSDirectory::CreateTempFileWithUniqueName(sTempFolder, L"emb");
|
||||
|
||||
NSFile::CFileBinary file;
|
||||
file.CreateFileW(sTempXmlFile);
|
||||
file.WriteFile((BYTE*)xmlString.c_str(), xmlString.size());
|
||||
@ -186,6 +190,7 @@ namespace DocFileFormat
|
||||
if (res) break;
|
||||
}
|
||||
}
|
||||
NSFile::CFileBinary::Remove(sTempXmlFile);
|
||||
return res;
|
||||
}
|
||||
//---------------------------------------------------------------
|
||||
@ -297,8 +302,13 @@ namespace DocFileFormat
|
||||
case metroBlob:
|
||||
{
|
||||
//встроенная неведомая хуйня
|
||||
m_isEmbedded = true;
|
||||
m_embeddedData = std::string((char*)iter->opComplex, iter->op);
|
||||
m_isEmbedded = true;
|
||||
m_embeddedData = std::string((char*)iter->opComplex, iter->op);
|
||||
|
||||
//if (ParseEmbeddedBlob( m_embeddedData, m_blobXml)) // todoooo
|
||||
//{
|
||||
// m_isEmbedded = false;
|
||||
//}
|
||||
}break;
|
||||
//BORDERS
|
||||
case borderBottomColor:
|
||||
|
||||
@ -46,7 +46,6 @@ namespace DocFileFormat
|
||||
{
|
||||
class OleObject;
|
||||
|
||||
bool ParseEmbeddedEquation( const std::string & xmlString, std::wstring & newXmlString );
|
||||
|
||||
class VMLPictureMapping: public PropertiesMapping, public IMapping
|
||||
{
|
||||
@ -58,6 +57,7 @@ namespace DocFileFormat
|
||||
/// Writes a border element
|
||||
void writePictureBorder (const std::wstring & name, const BorderCode* brc);
|
||||
void appendStyleProperty( std::wstring* b, const std::wstring& propName, const std::wstring& propValue ) const;
|
||||
bool ParseEmbeddedEquation( const std::string & xmlString, std::wstring & newXmlString );
|
||||
protected:
|
||||
/// Copies the picture from the binary stream to the zip archive
|
||||
/// and creates the relationships for the image.
|
||||
|
||||
@ -86,6 +86,7 @@ namespace DocFileFormat
|
||||
friend class Table;
|
||||
friend class TableRow;
|
||||
friend class VMLShapeMapping;
|
||||
friend class VMLPictureMapping;
|
||||
friend class OpenXmlPackage;
|
||||
friend class TextboxMapping;
|
||||
|
||||
|
||||
@ -291,8 +291,9 @@ office_element_ptr odf_conversion_context::start_tabs()
|
||||
}
|
||||
std::wstring odf_conversion_context::add_image(const std::wstring & image_file_name)
|
||||
{
|
||||
std::wstring odf_ref_name ;
|
||||
if (image_file_name.empty()) return L"";
|
||||
|
||||
std::wstring odf_ref_name ;
|
||||
mediaitems()->add_or_find(image_file_name,_mediaitems::typeImage, odf_ref_name);
|
||||
|
||||
return odf_ref_name;
|
||||
|
||||
@ -317,6 +317,11 @@ void odf_drawing_context::set_presentation (bool bMaster)
|
||||
impl_->is_presentation_ = bMaster;
|
||||
}
|
||||
|
||||
_CP_OPT(bool) odf_drawing_context::get_presentation ()
|
||||
{
|
||||
return impl_->is_presentation_;
|
||||
}
|
||||
|
||||
void odf_drawing_context::set_footer_state(bool Val)
|
||||
{
|
||||
impl_->is_footer_ = Val;
|
||||
@ -491,14 +496,20 @@ void odf_drawing_context::end_drawing()
|
||||
_CP_OPT(std::wstring) draw_layer;
|
||||
if (impl_->is_presentation_.get() == true)
|
||||
{//master
|
||||
if (impl_->current_drawing_state_.presentation_class_)
|
||||
draw_layer = L"backgroundobjects";
|
||||
else draw_layer = L"layout";
|
||||
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;
|
||||
|
||||
draw->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_.presentation_user_transformed_ = true;
|
||||
draw->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_.presentation_placeholder_ = false;
|
||||
}
|
||||
else
|
||||
{//slide
|
||||
if (impl_->current_drawing_state_.presentation_class_)
|
||||
draw_layer = L"layout";
|
||||
draw_layer = L"layout";
|
||||
}
|
||||
draw->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_.presentation_class_ = impl_->current_drawing_state_.presentation_class_;
|
||||
draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_layer_ = draw_layer;
|
||||
@ -696,7 +707,10 @@ void odf_drawing_context::Impl::create_draw_base(int type)
|
||||
draw_base* draw = dynamic_cast<draw_base*>(draw_elm.get());
|
||||
if (draw == NULL)return;
|
||||
//////////
|
||||
styles_context_->create_style(L"", style_family::Graphic, true, false, -1);
|
||||
if (is_presentation_ && current_drawing_state_.presentation_class_)
|
||||
styles_context_->create_style(L"", style_family::Presentation, true, false, -1);
|
||||
else
|
||||
styles_context_->create_style(L"", style_family::Graphic, true, false, -1);
|
||||
|
||||
office_element_ptr & style_shape_elm = styles_context_->last_state()->get_office_element();
|
||||
std::wstring style_name;
|
||||
@ -708,7 +722,10 @@ void odf_drawing_context::Impl::create_draw_base(int type)
|
||||
current_graphic_properties = style_->content_.get_graphic_properties();
|
||||
}
|
||||
|
||||
draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_style_name_ = style_name;
|
||||
if (is_presentation_ && current_drawing_state_.presentation_class_)
|
||||
draw->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_.presentation_style_name_ = style_name;
|
||||
else
|
||||
draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_style_name_ = style_name;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
int level = current_level_.size();
|
||||
@ -1175,16 +1192,16 @@ void odf_drawing_context::set_placeholder_type (int val)
|
||||
{
|
||||
switch(val)
|
||||
{
|
||||
case 0: impl_->current_drawing_state_.presentation_class_ = presentation_class::text; break;
|
||||
case 1: impl_->current_drawing_state_.presentation_class_ = presentation_class::chart; break;
|
||||
case 0: impl_->current_drawing_state_.presentation_class_ = presentation_class::outline; break;
|
||||
case 1: impl_->current_drawing_state_.presentation_class_ = presentation_class::chart; break;
|
||||
case 2: impl_->current_drawing_state_.presentation_class_ = presentation_class::graphic; break;
|
||||
case 3: impl_->current_drawing_state_.presentation_class_ = presentation_class::title; break;
|
||||
case 4: impl_->current_drawing_state_.presentation_class_ = presentation_class::graphic; break;
|
||||
case 5: impl_->current_drawing_state_.presentation_class_ = presentation_class::date_time; break;
|
||||
case 6: impl_->current_drawing_state_.presentation_class_ = presentation_class::footer; break;
|
||||
case 7: impl_->current_drawing_state_.presentation_class_ = presentation_class::header; break;
|
||||
case 8: impl_->current_drawing_state_.presentation_class_ = presentation_class::object; break;
|
||||
case 9: impl_->current_drawing_state_.presentation_class_ = presentation_class::object; break;
|
||||
case 6: impl_->current_drawing_state_.presentation_class_ = presentation_class::footer; break;
|
||||
case 7: impl_->current_drawing_state_.presentation_class_ = presentation_class::header; break;
|
||||
case 8: impl_->current_drawing_state_.presentation_class_ = presentation_class::object; break;
|
||||
case 9: impl_->current_drawing_state_.presentation_class_ = presentation_class::object; break;
|
||||
case 10: impl_->current_drawing_state_.presentation_class_ = presentation_class::graphic; break;
|
||||
case 11: impl_->current_drawing_state_.presentation_class_ = presentation_class::graphic; break;
|
||||
case 12: impl_->current_drawing_state_.presentation_class_ = presentation_class::page_number;break;
|
||||
@ -1192,7 +1209,7 @@ void odf_drawing_context::set_placeholder_type (int val)
|
||||
case 14: impl_->current_drawing_state_.presentation_class_ = presentation_class::table; break;
|
||||
case 15: impl_->current_drawing_state_.presentation_class_ = presentation_class::title; break;
|
||||
default:
|
||||
impl_->current_drawing_state_.presentation_class_ = presentation_class::text; break;
|
||||
impl_->current_drawing_state_.presentation_class_ = presentation_class::outline; break;
|
||||
}
|
||||
//todooo draw_layer for master for sldnum, datetime ...
|
||||
}
|
||||
@ -1730,8 +1747,8 @@ void odf_drawing_context::set_group_position(_CP_OPT(double) x, _CP_OPT(double)
|
||||
impl_->current_group_->x = *change_x ;
|
||||
impl_->current_group_->y = *change_y ;
|
||||
|
||||
impl_->current_group_->shift_x = (*x - *change_x) ;
|
||||
impl_->current_group_->shift_y = (*y - *change_y) ;
|
||||
impl_->current_group_->shift_x = (*x /impl_->current_group_->scale_cx - *change_x) ;
|
||||
impl_->current_group_->shift_y = (*y /impl_->current_group_->scale_cy - *change_y) ;
|
||||
}
|
||||
|
||||
void odf_drawing_context::set_group_size( _CP_OPT(double) cx, _CP_OPT(double) cy, _CP_OPT(double) change_cx, _CP_OPT(double) change_cy)
|
||||
@ -2455,7 +2472,7 @@ void odf_drawing_context::set_text(odf_text_context* text_context)
|
||||
{
|
||||
if (text_context == NULL || impl_->current_level_.size() < 1 ) return;
|
||||
|
||||
if (impl_->is_presentation_ && *impl_->is_presentation_) return;
|
||||
//if (impl_->is_presentation_ && *impl_->is_presentation_) return;
|
||||
|
||||
for (size_t i = 0; i < text_context->text_elements_list_.size(); i++)
|
||||
{
|
||||
|
||||
@ -60,7 +60,8 @@ public:
|
||||
odf_drawing_context (odf_conversion_context *odf_context);
|
||||
~odf_drawing_context ();
|
||||
|
||||
void set_presentation (bool bMaster);
|
||||
void set_presentation (bool bMaster);
|
||||
_CP_OPT(bool) get_presentation ();
|
||||
|
||||
void set_drawings_rect (_CP_OPT(double) x_pt, _CP_OPT(double) y_pt, _CP_OPT(double) width_pt, _CP_OPT(double) height_pt);
|
||||
void clear ();
|
||||
|
||||
@ -108,7 +108,7 @@ std::wstring odf_lists_styles_context::get_style_name(int oox_style_num)
|
||||
return L"";
|
||||
}
|
||||
}
|
||||
void odf_lists_styles_context::start_style(int based_number)
|
||||
void odf_lists_styles_context::start_style(bool bMaster, int based_number)
|
||||
{
|
||||
list_format_state state;
|
||||
|
||||
@ -120,14 +120,13 @@ void odf_lists_styles_context::start_style(int based_number)
|
||||
{
|
||||
state.oox_based_number = lists_format_array_.size();
|
||||
state.odf_list_style_name = std::wstring(L"L") + boost::lexical_cast<std::wstring>(state.oox_based_number + 1);
|
||||
state.automatic = true; //document automatic style
|
||||
}
|
||||
else
|
||||
{
|
||||
state.oox_based_number = based_number;
|
||||
state.odf_list_style_name = std::wstring(L"WWNum") + boost::lexical_cast<std::wstring>(state.oox_based_number + 1);
|
||||
state.automatic = false; //office style
|
||||
}
|
||||
state.automatic = !bMaster;
|
||||
|
||||
text_list_style *style = dynamic_cast<text_list_style *>(elm.get());
|
||||
if (style == NULL)return;
|
||||
|
||||
@ -64,7 +64,7 @@ public:
|
||||
odf_lists_styles_context();
|
||||
void set_odf_context(odf_conversion_context * Context);
|
||||
|
||||
void start_style(int abstract_number = -1);
|
||||
void start_style(bool bMaster, int abstract_number = -1);
|
||||
int start_style_level(int level, int type);
|
||||
style_list_level_properties * get_list_level_properties();
|
||||
style_list_level_label_alignment * get_list_level_alignment_properties();
|
||||
|
||||
@ -154,13 +154,35 @@ void odf_text_context::add_text_content(const std::wstring & text)
|
||||
std::wstring last = text.substr(pos);
|
||||
if (last.length() > 0)current_level_.back().elm->add_text(last);
|
||||
}
|
||||
void odf_text_context::add_text_date(const std::wstring & text)
|
||||
{
|
||||
office_element_ptr s_elm;
|
||||
create_element(L"text", L"date", s_elm, odf_context_);
|
||||
|
||||
text_date* s = dynamic_cast<text_date*>(s_elm.get());
|
||||
if (s) s->add_text(text);
|
||||
|
||||
if (current_level_.size()>0)
|
||||
current_level_.back().elm->add_child_element(s_elm);
|
||||
}
|
||||
void odf_text_context::add_text_page_number(const std::wstring & text)
|
||||
{
|
||||
office_element_ptr s_elm;
|
||||
create_element(L"text", L"page-number", s_elm, odf_context_);
|
||||
|
||||
text_page_number* s = dynamic_cast<text_page_number*>(s_elm.get());
|
||||
if (s) s->add_text(text);
|
||||
|
||||
if (current_level_.size()>0)
|
||||
current_level_.back().elm->add_child_element(s_elm);
|
||||
}
|
||||
void odf_text_context::add_text_space(int count)
|
||||
{
|
||||
office_element_ptr s_elm;
|
||||
create_element(L"text", L"s", s_elm, odf_context_);
|
||||
|
||||
text_s* s = dynamic_cast<text_s*>(s_elm.get());
|
||||
if (s)s->text_c_ = count;
|
||||
if (s) s->text_c_ = count;
|
||||
|
||||
//необязательно хранить..
|
||||
//int level = current_level_.size();
|
||||
|
||||
@ -67,8 +67,10 @@ public:
|
||||
|
||||
void add_text_content (const std::wstring & text);
|
||||
void add_text_space (int count);
|
||||
|
||||
void set_symbol_font (const std::wstring & font);
|
||||
void add_text_date (const std::wstring & text);
|
||||
void add_text_page_number(const std::wstring & text);
|
||||
|
||||
void set_symbol_font (const std::wstring & font);
|
||||
void set_symbol_text (int sym);
|
||||
|
||||
void start_paragraph (bool styled = false);
|
||||
|
||||
@ -208,23 +208,25 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture)
|
||||
}
|
||||
}
|
||||
|
||||
std::wstring pathImage;
|
||||
std::wstring odf_ref;
|
||||
std::wstring pathImage;
|
||||
if (oox_picture->blipFill.blip.IsInit())
|
||||
{
|
||||
std::wstring sID;
|
||||
|
||||
bool bEmbedded = true;
|
||||
if (oox_picture->blipFill.blip->embed.IsInit())
|
||||
{
|
||||
sID = oox_picture->blipFill.blip->embed->get();
|
||||
std::wstring sID = oox_picture->blipFill.blip->embed->get();
|
||||
pathImage = find_link_by_id(sID, 1);
|
||||
|
||||
odf_ref = odf_context()->add_image(pathImage);
|
||||
}
|
||||
else if (oox_picture->blipFill.blip->link.IsInit())
|
||||
{
|
||||
pathImage = oox_picture->blipFill.blip->link->get();
|
||||
odf_ref = oox_picture->blipFill.blip->link->get();
|
||||
bEmbedded = false;
|
||||
}
|
||||
}
|
||||
std::wstring odf_ref = odf_context()->add_image(pathImage);
|
||||
|
||||
|
||||
odf_context()->drawing_context()->start_drawing();
|
||||
odf_context()->drawing_context()->start_image(odf_ref);
|
||||
{
|
||||
@ -1098,16 +1100,7 @@ void OoxConverter::convert(PPTX::Logic::NvPr *oox_nvPr)
|
||||
{
|
||||
if (!oox_nvPr) return;
|
||||
|
||||
if (oox_nvPr->ph.is_init())
|
||||
{
|
||||
if (oox_nvPr->ph->type.IsInit())
|
||||
odf_context()->drawing_context()->set_placeholder_type(oox_nvPr->ph->type->GetBYTECode());
|
||||
if (oox_nvPr->ph->idx.IsInit())
|
||||
odf_context()->drawing_context()->set_placeholder_id(oox_nvPr->ph->idx.get());
|
||||
//nullable_bool hasCustomPrompt;
|
||||
//nullable_limit<Limit::Orient> orient;
|
||||
//nullable_limit<Limit::PlaceholderSize> sz;
|
||||
}
|
||||
//ph уровнем выше
|
||||
}
|
||||
|
||||
void OoxConverter::convert_list_level(PPTX::Logic::TextParagraphPr *oox_para_props, int level)
|
||||
@ -1154,25 +1147,39 @@ void OoxConverter::convert_list_level(PPTX::Logic::TextParagraphPr *oox_para_pro
|
||||
}
|
||||
if (bullet.is<PPTX::Logic::BuBlip>())
|
||||
{
|
||||
odf_list_type = 1000;
|
||||
|
||||
const PPTX::Logic::BuBlip & buBlip = bullet.as<PPTX::Logic::BuBlip>();
|
||||
std::wstring pathImage;
|
||||
std::wstring sID;
|
||||
|
||||
std::wstring odf_ref;
|
||||
bool bEmbedded = true;
|
||||
|
||||
if (buBlip.blip.embed.IsInit())
|
||||
{
|
||||
sID = buBlip.blip.embed->get();
|
||||
pathImage = find_link_by_id(sID, 1);
|
||||
std::wstring sID = buBlip.blip.embed->get();
|
||||
std::wstring pathImage = find_link_by_id(sID, 1);
|
||||
|
||||
if (pathImage.empty())
|
||||
pathImage = buBlip.blip.GetFullPicName(); // only for presentation merge shapes !!
|
||||
|
||||
odf_ref = odf_context()->add_image(pathImage);
|
||||
}
|
||||
else if (buBlip.blip.link.IsInit())
|
||||
{
|
||||
pathImage = buBlip.blip.link->get();
|
||||
odf_ref = buBlip.blip.link->get();
|
||||
bEmbedded = false;
|
||||
}
|
||||
std::wstring odf_ref = odf_context()->add_image(pathImage);
|
||||
|
||||
odf_context()->styles_context()->lists_styles().start_style_level(level, odf_list_type );
|
||||
odf_context()->styles_context()->lists_styles().set_bullet_image(odf_ref);
|
||||
if (!odf_ref.empty())
|
||||
{
|
||||
odf_list_type = 1000;
|
||||
odf_context()->styles_context()->lists_styles().start_style_level(level, odf_list_type );
|
||||
odf_context()->styles_context()->lists_styles().set_bullet_image(odf_ref);
|
||||
}
|
||||
else
|
||||
{
|
||||
odf_list_type = 5;
|
||||
odf_context()->styles_context()->lists_styles().start_style_level(level, odf_list_type );
|
||||
odf_context()->styles_context()->lists_styles().set_bullet_char(L"\x2022");
|
||||
}
|
||||
}
|
||||
|
||||
//odf_writer::style_list_level_label_alignment * aligment_props = odf_context()->styles_context()->lists_styles().get_list_level_alignment_properties();
|
||||
@ -1181,7 +1188,7 @@ void OoxConverter::convert_list_level(PPTX::Logic::TextParagraphPr *oox_para_pro
|
||||
|
||||
convert(oox_para_props->defRPr.GetPointer(), text_properties);
|
||||
|
||||
if (oox_para_props->indent.IsInit())
|
||||
if (oox_para_props->indent.IsInit() && level_props)
|
||||
{
|
||||
level_props->text_min_label_width_ = odf_types::length(- oox_para_props->indent.get() / 12700., odf_types::length::pt);
|
||||
level_props->text_space_before_ = odf_types::length(1, odf_types::length::pt);
|
||||
@ -1208,7 +1215,7 @@ void OoxConverter::convert_list_level(PPTX::Logic::TextParagraphPr *oox_para_pro
|
||||
{
|
||||
int res = 0;
|
||||
if ((res = hexColor.find(L"#")) < 0) hexColor = std::wstring(L"#") + hexColor;
|
||||
text_properties->content_.fo_color_ = odf_types::color(hexColor);
|
||||
if (text_properties) text_properties->content_.fo_color_ = odf_types::color(hexColor);
|
||||
}
|
||||
}
|
||||
//-----------------------------------
|
||||
@ -1289,18 +1296,6 @@ void OoxConverter::convert_list_level(PPTX::Logic::TextParagraphPr *oox_para_pro
|
||||
odf_context()->styles_context()->lists_styles().end_style_level();
|
||||
}
|
||||
|
||||
void OoxConverter::convert_list (PPTX::Logic::TextListStyle *oox_list_style)
|
||||
{
|
||||
if (!oox_list_style) return;
|
||||
|
||||
odf_context()->styles_context()->lists_styles().start_style();
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
convert_list_level(oox_list_style->levels[0].GetPointer(), i);
|
||||
}
|
||||
odf_context()->styles_context()->lists_styles().end_style();
|
||||
}
|
||||
|
||||
void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::TextListStyle *oox_list_style)
|
||||
{
|
||||
if (!oox_paragraph)return;
|
||||
@ -1311,7 +1306,7 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T
|
||||
bool list_present = false;
|
||||
std::wstring list_style_name;
|
||||
|
||||
int list_level = 0;
|
||||
int list_level = 0;//-1;
|
||||
|
||||
NSCommon::nullable<PPTX::Logic::TextParagraphPr> paraPr;
|
||||
|
||||
@ -1323,10 +1318,12 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T
|
||||
list_local = true;
|
||||
}
|
||||
|
||||
if (oox_list_style && list_level >= 0 && list_level < 10)
|
||||
if (oox_list_style)
|
||||
{
|
||||
if (oox_list_style->levels[list_level].IsInit())
|
||||
oox_list_style->levels[list_level]->Merge(paraPr);
|
||||
int i = (list_level >= 0 && list_level < 10) ? list_level : 0;
|
||||
|
||||
if (oox_list_style->levels[i].IsInit())
|
||||
oox_list_style->levels[i]->Merge(paraPr);
|
||||
}
|
||||
if (oox_paragraph->pPr.IsInit())
|
||||
oox_paragraph->pPr->Merge(paraPr);
|
||||
@ -1341,7 +1338,6 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T
|
||||
list_present = true;
|
||||
if (paraPr->ParagraphBullet.is<PPTX::Logic::BuNone>())
|
||||
list_present = false;
|
||||
else if (list_level == 0) list_level = 1;
|
||||
}
|
||||
//свойства могут быть приписаны не только к параграфу, но и к самому объекту
|
||||
odf_writer::style_paragraph_properties* paragraph_properties = odf_context()->text_context()->get_paragraph_properties();
|
||||
@ -1377,33 +1373,32 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T
|
||||
odf_context()->text_context()->list_state_.style_name = L"";
|
||||
}
|
||||
|
||||
if (odf_context()->text_context()->list_state_.started_list == false)
|
||||
if (list_local)
|
||||
{
|
||||
if (list_local)
|
||||
_CP_OPT(bool) inStyles = odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
odf_context()->styles_context()->lists_styles().start_style(inStyles && *inStyles);
|
||||
convert_list_level(oox_paragraph->pPr.GetPointer(), list_level /*- 1*/);
|
||||
odf_context()->styles_context()->lists_styles().end_style();
|
||||
|
||||
}
|
||||
list_style_name = odf_context()->styles_context()->lists_styles().get_style_name(); //last added
|
||||
|
||||
list_level++;
|
||||
|
||||
if (odf_context()->text_context()->list_state_.levels.size() < list_level)
|
||||
{
|
||||
while (odf_context()->text_context()->list_state_.levels.size() < list_level)
|
||||
{
|
||||
odf_context()->styles_context()->lists_styles().start_style();
|
||||
convert_list_level(oox_paragraph->pPr.GetPointer(), list_level - 1);
|
||||
odf_context()->styles_context()->lists_styles().end_style();
|
||||
|
||||
list_style_name = odf_context()->styles_context()->lists_styles().get_style_name(); //last added
|
||||
odf_context()->text_context()->start_list(list_style_name);
|
||||
odf_context()->text_context()->start_list_item();
|
||||
|
||||
if (odf_context()->text_context()->list_state_.style_name == list_style_name)
|
||||
list_style_name = L"";
|
||||
}
|
||||
else
|
||||
{
|
||||
// !!!
|
||||
}
|
||||
|
||||
odf_context()->text_context()->start_list(list_style_name);
|
||||
}
|
||||
odf_context()->text_context()->start_list_item();
|
||||
|
||||
if (odf_context()->text_context()->list_state_.style_name == list_style_name)
|
||||
list_style_name = L"";
|
||||
|
||||
while (odf_context()->text_context()->list_state_.levels.size() < list_level)
|
||||
{
|
||||
odf_context()->text_context()->start_list(list_style_name);
|
||||
else
|
||||
odf_context()->text_context()->start_list_item();
|
||||
}
|
||||
}
|
||||
else if (odf_context()->text_context()->list_state_.started_list == true)
|
||||
{
|
||||
@ -1417,10 +1412,10 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T
|
||||
}
|
||||
odf_context()->text_context()->end_paragraph();
|
||||
|
||||
if(list_present)
|
||||
{
|
||||
odf_context()->text_context()->end_list_item();
|
||||
}
|
||||
//if(list_present)
|
||||
//{
|
||||
// odf_context()->text_context()->end_list_item();
|
||||
//}
|
||||
}
|
||||
void OoxConverter::convert(PPTX::Logic::TextListStyle *oox_list_style, int level, odf_writer::style_paragraph_properties * paragraph_properties
|
||||
, odf_writer::style_text_properties * text_properties)
|
||||
@ -1732,6 +1727,45 @@ void OoxConverter::convert(PPTX::Logic::Run *oox_run)
|
||||
void OoxConverter::convert(PPTX::Logic::Fld *oox_fld)
|
||||
{
|
||||
if (!oox_fld) return;
|
||||
|
||||
bool styled = false;
|
||||
|
||||
if (oox_fld->rPr.IsInit())
|
||||
{
|
||||
odf_writer::style_text_properties * text_properties = odf_context()->text_context()->get_text_properties();
|
||||
|
||||
if (!text_properties)
|
||||
{
|
||||
odf_context()->styles_context()->create_style(L"", odf_types::style_family::Text, true, false, -1);
|
||||
text_properties = odf_context()->styles_context()->last_state()->get_text_properties();
|
||||
styled = true;
|
||||
}
|
||||
convert(oox_fld->rPr.GetPointer(), text_properties);
|
||||
}
|
||||
|
||||
odf_context()->text_context()->start_span(styled);
|
||||
|
||||
std::wstring fld_type = oox_fld->type.get_value_or(L"");
|
||||
|
||||
if ((oox_fld->rPr.IsInit()) && (oox_fld->rPr->hlinkClick.IsInit()) && (oox_fld->rPr->hlinkClick->id.IsInit()))
|
||||
{
|
||||
std::wstring hlink = find_link_by_id(oox_fld->rPr->hlinkClick->id.get(), 2);
|
||||
odf_context()->text_context()->add_hyperlink(hlink, oox_fld->GetText());
|
||||
|
||||
}
|
||||
else if (fld_type == L"slidenum")
|
||||
{
|
||||
odf_context()->text_context()->add_text_page_number( oox_fld->GetText());
|
||||
}
|
||||
else if (fld_type == L"datetime1")
|
||||
{
|
||||
odf_context()->text_context()->add_text_date( oox_fld->GetText());
|
||||
}
|
||||
else
|
||||
{
|
||||
odf_context()->text_context()->add_text_content( oox_fld->GetText());
|
||||
}
|
||||
odf_context()->text_context()->end_span();
|
||||
}
|
||||
void OoxConverter::convert(PPTX::Logic::Br *oox_br)
|
||||
{
|
||||
@ -1758,7 +1792,20 @@ void OoxConverter::convert(PPTX::Logic::MoveTo *oox_geom_path)
|
||||
|
||||
odf_context()->drawing_context()->add_path_element(std::wstring(L"M"), path_elm);
|
||||
}
|
||||
void OoxConverter::convert(PPTX::Logic::TextListStyle *oox_list_style)
|
||||
{
|
||||
if (!oox_list_style) return;
|
||||
if (oox_list_style->IsListStyleEmpty()) return;
|
||||
|
||||
_CP_OPT(bool) inStyles = odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
odf_context()->styles_context()->lists_styles().start_style(inStyles && *inStyles);
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
OoxConverter::convert_list_level(oox_list_style->levels[i].GetPointer(), i);
|
||||
}
|
||||
odf_context()->styles_context()->lists_styles().end_style();
|
||||
}
|
||||
void OoxConverter::convert(PPTX::Logic::TxBody *oox_txBody, PPTX::Logic::ShapeStyle* oox_style)
|
||||
{
|
||||
if (!oox_txBody) return;
|
||||
@ -1766,6 +1813,8 @@ void OoxConverter::convert(PPTX::Logic::TxBody *oox_txBody, PPTX::Logic::ShapeSt
|
||||
|
||||
odf_context()->start_text_context();
|
||||
|
||||
convert(oox_txBody->lstStyle.GetPointer());
|
||||
|
||||
for (size_t i = 0; i < oox_txBody->Paragrs.size(); i++)
|
||||
{
|
||||
convert(&oox_txBody->Paragrs[i], oox_txBody->lstStyle.GetPointer());
|
||||
|
||||
@ -405,9 +405,9 @@ public:
|
||||
void convert(PPTX::Logic::NvGrpSpPr *oox_nvSpPr);
|
||||
void convert(PPTX::Logic::NvPr *oox_nvPr);
|
||||
void convert(PPTX::Logic::Paragraph *oox_para, PPTX::Logic::TextListStyle *oox_list_style = NULL);
|
||||
void convert(PPTX::Logic::TextListStyle *oox_list_style);
|
||||
|
||||
void convert_list_level (PPTX::Logic::TextParagraphPr *oox_para_props, int level);
|
||||
void convert_list (PPTX::Logic::TextListStyle *oox_list_style);
|
||||
|
||||
void convert(PPTX::Logic::TextListStyle *oox_list_style, int level, cpdoccore::odf_writer::style_paragraph_properties *paragraph_properties,
|
||||
cpdoccore::odf_writer::style_text_properties *text_properties);
|
||||
|
||||
@ -3017,7 +3017,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(oox_num_style->m_oAbstractNumId->GetValue());
|
||||
odt_context->styles_context()->lists_styles().start_style(false, oox_num_style->m_oAbstractNumId->GetValue());
|
||||
//// Childs
|
||||
//std::vector<OOX::Numbering::CLvl > m_arrLvl;
|
||||
//nullable<ComplexTypes::Word::CMultiLevelType > m_oMultiLevelType;
|
||||
|
||||
@ -259,6 +259,8 @@ void PptxConverter::convert_styles()
|
||||
odp_context->page_layout_context()->create_layer_sets();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void PptxConverter::convert_settings()
|
||||
{
|
||||
|
||||
@ -317,12 +319,15 @@ void PptxConverter::convert_slides()
|
||||
if (pFind == m_mapMasters.end())
|
||||
{
|
||||
master_style_name = L"MasterPage";
|
||||
if (bShowMasterSp)
|
||||
{
|
||||
if (slide->Master->cSld.attrName.IsInit()) master_style_name = slide->Master->cSld.attrName.get();
|
||||
else if (current_theme->name.IsInit()) master_style_name = current_theme->name.get();
|
||||
}
|
||||
|
||||
bool bShowLayoutMasterAnim = slide->Layout->showMasterPhAnim.get_value_or(true);
|
||||
bool bShowLayoutMasterSp = slide->Layout->showMasterSp.get_value_or(true);
|
||||
|
||||
if (slide->Master->cSld.attrName.IsInit()) master_style_name = slide->Master->cSld.attrName.get();
|
||||
else if (current_theme->name.IsInit()) master_style_name = current_theme->name.get();
|
||||
|
||||
master_style_name += L"_" ;
|
||||
|
||||
if (slide->Layout->cSld.attrName.IsInit()) master_style_name += slide->Layout->cSld.attrName.get();
|
||||
else if (slide->Layout->attrType.IsInit()) master_style_name += slide->Layout->attrType->get();
|
||||
else
|
||||
@ -332,7 +337,8 @@ void PptxConverter::convert_slides()
|
||||
convert_common();
|
||||
|
||||
current_slide = slide->Master.operator->();
|
||||
if (bShowMasterSp)
|
||||
|
||||
if (bShowLayoutMasterSp && bShowMasterSp)
|
||||
convert_slide(&slide->Master->cSld, current_txStyles, false);
|
||||
else
|
||||
convert(slide->Master->cSld.bg.GetPointer());
|
||||
@ -340,7 +346,9 @@ void PptxConverter::convert_slides()
|
||||
if (slide->Layout->clrMapOvr.IsInit() && slide->Layout->clrMapOvr->overrideClrMapping.IsInit())
|
||||
current_clrMap = slide->Layout->clrMapOvr->overrideClrMapping.GetPointer();
|
||||
current_slide = slide->Layout.operator->();
|
||||
|
||||
convert_slide(&slide->Layout->cSld, current_txStyles, true);
|
||||
//add note master
|
||||
odp_context->end_master_slide();
|
||||
|
||||
m_mapMasters.insert(std::make_pair(master_name, master_style_name));
|
||||
@ -379,7 +387,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, true);
|
||||
convert_slide (slide->cSld.GetPointer(), current_txStyles);
|
||||
convert (slide->comments.operator->());
|
||||
convert (slide->Note.operator->());
|
||||
|
||||
@ -946,63 +954,86 @@ void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxS
|
||||
odp_context->current_slide().set_page_name(oox_slide->attrName.get());
|
||||
|
||||
convert(oox_slide->bg.GetPointer());
|
||||
|
||||
bool bMaster = *odf_context()->drawing_context()->get_presentation();
|
||||
|
||||
for (size_t i = 0 ; i < oox_slide->spTree.SpTreeElems.size(); i++)
|
||||
{
|
||||
smart_ptr<PPTX::WrapperWritingElement> pElem = oox_slide->spTree.SpTreeElems[i].GetElem();
|
||||
smart_ptr<PPTX::Logic::Shape> pShape = pElem.smart_dynamic_cast<PPTX::Logic::Shape>();
|
||||
|
||||
if (pShape.IsInit() && pShape->nvSpPr.nvPr.ph.is_init())
|
||||
if (pShape.IsInit())
|
||||
{
|
||||
pShape->FillLevelUp();
|
||||
|
||||
if (!bPlaceholders)
|
||||
continue;
|
||||
|
||||
PPTX::Logic::TextListStyle * listMasterStyle = NULL;
|
||||
|
||||
if (txStyles)
|
||||
if (pShape->nvSpPr.nvPr.ph.is_init())
|
||||
{
|
||||
std::wstring type = pShape->nvSpPr.nvPr.ph->type.get_value_or(_T("body"));
|
||||
if ((type == L"title") || (type == L"ctrTitle"))
|
||||
listMasterStyle = txStyles->titleStyle.GetPointer();
|
||||
else if ((type == L"body") || (type == L"subTitle") || (type == L"obj"))
|
||||
listMasterStyle = txStyles->bodyStyle.GetPointer();
|
||||
else if (type != L"")
|
||||
listMasterStyle = txStyles->otherStyle.GetPointer();
|
||||
}
|
||||
PPTX::Logic::Shape update_shape;
|
||||
|
||||
if (listMasterStyle)
|
||||
{
|
||||
update_shape.txBody = new PPTX::Logic::TxBody();
|
||||
pShape->FillLevelUp();
|
||||
|
||||
PPTX::Logic::TextListStyle *newListStyle = new PPTX::Logic::TextListStyle();
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
if (pShape->nvSpPr.nvPr.ph->type.IsInit())
|
||||
{
|
||||
if(listMasterStyle->levels[i].is_init())
|
||||
listMasterStyle->levels[i]->Merge(newListStyle->levels[i]);
|
||||
int ph_type = pShape->nvSpPr.nvPr.ph->type->GetBYTECode();
|
||||
|
||||
if (!bMaster && (ph_type == 5 || ph_type == 6 || ph_type == 7 || ph_type == 12))
|
||||
continue;
|
||||
|
||||
odf_context()->drawing_context()->set_placeholder_type(ph_type);
|
||||
}
|
||||
update_shape.txBody->lstStyle.reset(newListStyle);
|
||||
else
|
||||
odf_context()->drawing_context()->set_placeholder_type(0);
|
||||
|
||||
if (pShape->nvSpPr.nvPr.ph->idx.IsInit())
|
||||
odf_context()->drawing_context()->set_placeholder_id(pShape->nvSpPr.nvPr.ph->idx.get());
|
||||
|
||||
if (!bPlaceholders)
|
||||
continue;
|
||||
|
||||
PPTX::Logic::TextListStyle * listMasterStyle = NULL;
|
||||
|
||||
if (txStyles)
|
||||
{
|
||||
std::wstring type = pShape->nvSpPr.nvPr.ph->type.get_value_or(_T("body"));
|
||||
if ((type == L"title") || (type == L"ctrTitle"))
|
||||
listMasterStyle = txStyles->titleStyle.GetPointer();
|
||||
else if ((type == L"body") || (type == L"subTitle") || (type == L"obj"))
|
||||
listMasterStyle = txStyles->bodyStyle.GetPointer();
|
||||
else if (type != L"")
|
||||
listMasterStyle = txStyles->otherStyle.GetPointer();
|
||||
}
|
||||
PPTX::Logic::Shape update_shape;
|
||||
|
||||
if (listMasterStyle)
|
||||
{
|
||||
update_shape.txBody = new PPTX::Logic::TxBody();
|
||||
|
||||
PPTX::Logic::TextListStyle *newListStyle = new PPTX::Logic::TextListStyle();
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
if(listMasterStyle->levels[i].is_init())
|
||||
listMasterStyle->levels[i]->Merge(newListStyle->levels[i]);
|
||||
}
|
||||
update_shape.txBody->lstStyle.reset(newListStyle);
|
||||
}
|
||||
pShape->Merge(update_shape);
|
||||
OoxConverter::convert(&update_shape);
|
||||
}
|
||||
|
||||
pShape->Merge(update_shape);
|
||||
else if (pShape->txBody.IsInit() && presentation->defaultTextStyle.IsInit())
|
||||
{//default text style with master clrScheme
|
||||
PPTX::Logic::Shape update_shape;
|
||||
|
||||
update_shape.txBody = new PPTX::Logic::TxBody();
|
||||
|
||||
//if (pShape->IsListStyleEmpty() == false)
|
||||
//{
|
||||
// //create list style
|
||||
//}else if (listMasterStyle)
|
||||
//{
|
||||
//}
|
||||
presentation->defaultTextStyle->Merge(update_shape.txBody->lstStyle);
|
||||
|
||||
OoxConverter::convert(&update_shape);
|
||||
pShape->Merge(update_shape);
|
||||
OoxConverter::convert(&update_shape);
|
||||
}
|
||||
else
|
||||
OoxConverter::convert(pShape.operator->());
|
||||
}
|
||||
else
|
||||
{
|
||||
OoxConverter::convert(pElem.operator->());
|
||||
}
|
||||
//convert(oox_slide->spTree.SpTreeElems[i].GetElem().operator->());
|
||||
}
|
||||
convert(oox_slide->controls.GetPointer());
|
||||
}
|
||||
@ -1030,7 +1061,11 @@ void PptxConverter::convert_layout(PPTX::Logic::CSld *oox_slide)
|
||||
odf_context()->drawing_context()->start_drawing();
|
||||
odf_context()->drawing_context()->start_element(elm);
|
||||
|
||||
OoxConverter::convert(&pShape->nvSpPr.nvPr);
|
||||
odf_context()->drawing_context()->set_placeholder_type(type);
|
||||
|
||||
if (pShape->nvSpPr.nvPr.ph->idx.IsInit())
|
||||
odf_context()->drawing_context()->set_placeholder_id(*pShape->nvSpPr.nvPr.ph->idx);
|
||||
|
||||
OoxConverter::convert(pShape->spPr.xfrm.GetPointer());
|
||||
|
||||
odf_context()->drawing_context()->end_element();
|
||||
|
||||
@ -457,13 +457,8 @@ namespace PPTX
|
||||
|
||||
if (txBody.IsInit() == false) return true;
|
||||
if (txBody->lstStyle.IsInit() == false) return true;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
if (txBody->lstStyle->levels[i].IsInit())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
return txBody->lstStyle->IsListStyleEmpty();
|
||||
}
|
||||
|
||||
void Shape::Merge(Shape& shape, bool bIsSlidePlaceholder)
|
||||
|
||||
@ -171,6 +171,20 @@ namespace PPTX
|
||||
|
||||
pReader->Seek(_end_rec);
|
||||
}
|
||||
bool IsListStyleEmpty()
|
||||
{
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
if (levels[i].IsInit())
|
||||
{
|
||||
if (levels[i]->ParagraphBullet.is_init() == false) continue;
|
||||
if (levels[i]->ParagraphBullet.is<PPTX::Logic::BuNone>())continue;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void Merge(nullable<TextListStyle>& lstStyle)const
|
||||
{
|
||||
|
||||
@ -156,6 +156,15 @@ namespace PPTX
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pShape->nvSpPr.nvPr.ph->idx.IsInit())
|
||||
{
|
||||
//not found in layout !! 100818_건강보험과_보건의료_김용익_최종.pptx
|
||||
if (Master.IsInit())
|
||||
{
|
||||
Master->GetLevelUp(pShape);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
virtual std::wstring GetMediaFullPathNameFromRId(const OOX::RId& rid)const
|
||||
|
||||
@ -16,50 +16,330 @@
|
||||
#pragma comment (lib, "cryptui.lib")
|
||||
#pragma comment (lib, "Advapi32.lib")
|
||||
|
||||
//#define ENUMS_CERTS
|
||||
|
||||
//////////////////////
|
||||
class CXmlBuffer
|
||||
class CXmlCanonicalizator
|
||||
{
|
||||
public:
|
||||
NSStringUtils::CStringBuilderA builder;
|
||||
private:
|
||||
class CXmlBuffer
|
||||
{
|
||||
public:
|
||||
NSStringUtils::CStringBuilderA builder;
|
||||
|
||||
public:
|
||||
CXmlBuffer()
|
||||
{
|
||||
}
|
||||
~CXmlBuffer()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
static int buffer_xmlBufferIOWrite(CXmlBuffer* buf, const char* buffer, int len)
|
||||
{
|
||||
buf->builder.WriteString(buffer, (size_t)len);
|
||||
return len;
|
||||
}
|
||||
|
||||
static int buffer_xmlBufferIOClose(CXmlBuffer* buf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int buffer_xmlC14NIsVisibleCallback(void * user_data, xmlNodePtr node, xmlNodePtr parent)
|
||||
{
|
||||
if (node->type == XML_TEXT_NODE)
|
||||
{
|
||||
const char* cur = (char*)node->content;
|
||||
size_t size = strlen(cur);
|
||||
for (size_t i = 0; i < size; ++i, ++cur)
|
||||
{
|
||||
if (*cur != '\n' && *cur != '\r' && *cur != '\t')
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
public:
|
||||
CXmlBuffer()
|
||||
static std::string Execute(const std::string& sXml, int mode)
|
||||
{
|
||||
xmlDocPtr xmlDoc = xmlParseMemory((char*)sXml.c_str(), (int)sXml.length());
|
||||
|
||||
CXmlBuffer bufferC14N;
|
||||
xmlOutputBufferPtr _buffer = xmlOutputBufferCreateIO((xmlOutputWriteCallback)buffer_xmlBufferIOWrite,
|
||||
(xmlOutputCloseCallback)buffer_xmlBufferIOClose,
|
||||
&bufferC14N,
|
||||
NULL);
|
||||
|
||||
xmlC14NExecute(xmlDoc, buffer_xmlC14NIsVisibleCallback, NULL, mode, NULL, 0, _buffer);
|
||||
|
||||
xmlOutputBufferClose(_buffer);
|
||||
|
||||
return bufferC14N.builder.GetData();
|
||||
}
|
||||
~CXmlBuffer()
|
||||
|
||||
static std::string Execute(const std::wstring& sXmlFile, int mode)
|
||||
{
|
||||
std::string sXml;
|
||||
NSFile::CFileBinary::ReadAllTextUtf8A(sXmlFile, sXml);
|
||||
|
||||
xmlDocPtr xmlDoc = xmlParseMemory((char*)sXml.c_str(), (int)sXml.length());
|
||||
|
||||
return Execute(sXml, mode);
|
||||
}
|
||||
};
|
||||
|
||||
static int xmlBufferIOWrite(CXmlBuffer* buf, const char* buffer, int len)
|
||||
class CXmlSigner
|
||||
{
|
||||
buf->builder.WriteString(buffer, (size_t)len);
|
||||
return len;
|
||||
}
|
||||
private:
|
||||
PCCERT_CONTEXT m_context;
|
||||
HCRYPTPROV m_hCryptProv;
|
||||
|
||||
static int xmlBufferIOClose(CXmlBuffer* buf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xmlC14NIsVisibleCallbackMy(void * user_data, xmlNodePtr node, xmlNodePtr parent)
|
||||
{
|
||||
if (node->type == XML_TEXT_NODE)
|
||||
public:
|
||||
CXmlSigner(PCCERT_CONTEXT pCertContext)
|
||||
{
|
||||
std::string sTmp((char*)node->content);
|
||||
if (std::string::npos != sTmp.find('\n') ||
|
||||
std::string::npos != sTmp.find('\r') ||
|
||||
std::string::npos != sTmp.find('\t'))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
m_context = pCertContext;
|
||||
m_hCryptProv = NULL;
|
||||
}
|
||||
~CXmlSigner()
|
||||
{
|
||||
if (NULL != m_hCryptProv)
|
||||
CryptReleaseContext(m_hCryptProv, 0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
//////////////////////
|
||||
public:
|
||||
|
||||
std::string Sign(std::string sXml)
|
||||
{
|
||||
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 "";
|
||||
|
||||
bResult = CryptCreateHash(m_hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
if (!bResult)
|
||||
return "";
|
||||
|
||||
bResult = CryptHashData(hHash, (BYTE*)sXml.c_str(), (DWORD)sXml.length(), 0);
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
return "";
|
||||
}
|
||||
|
||||
DWORD dwSigLen = 0;
|
||||
BYTE* pbSignature = NULL;
|
||||
bResult = CryptSignHash(hHash, dwKeySpec, NULL, 0, NULL, &dwSigLen);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
return "";
|
||||
}
|
||||
|
||||
pbSignature = new BYTE[dwSigLen];
|
||||
bResult = CryptSignHash(hHash, dwKeySpec, NULL, 0, pbSignature, &dwSigLen);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
return "";
|
||||
}
|
||||
|
||||
BYTE* pbSignatureMem = new BYTE[dwSigLen];
|
||||
ConvertEndian(pbSignature, pbSignatureMem, dwSigLen);
|
||||
|
||||
char* pBase64 = NULL;
|
||||
int nBase64Len = 0;
|
||||
NSFile::CBase64Converter::Encode(pbSignatureMem, (int)dwSigLen, pBase64, nBase64Len, NSBase64::B64_BASE64_FLAG_NONE);
|
||||
|
||||
delete[] pbSignature;
|
||||
delete[] pbSignatureMem;
|
||||
|
||||
bResult = CryptDestroyHash(hHash);
|
||||
|
||||
std::string sReturn(pBase64, nBase64Len);
|
||||
|
||||
delete[] pBase64;
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
std::string GetHash(std::string& sXml)
|
||||
{
|
||||
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 "";
|
||||
|
||||
bResult = CryptCreateHash(m_hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
if (!bResult)
|
||||
return "";
|
||||
|
||||
bResult = CryptHashData(hHash, (BYTE*)sXml.c_str(), (DWORD)sXml.length(), 0);
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
return "";
|
||||
}
|
||||
|
||||
DWORD cbHashSize = 0, dwCount = sizeof(DWORD);
|
||||
bResult = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &dwCount, 0);
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
CryptDestroyHash(hHash);
|
||||
return "";
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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 "";
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
BOOL Verify(std::string& sXml, std::string& sXmlSignature)
|
||||
{
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
HCRYPTKEY hPubKey = NULL;
|
||||
|
||||
BOOL bResult = TRUE;
|
||||
if (NULL == m_hCryptProv)
|
||||
bResult = CryptAcquireCertificatePrivateKey(m_context, 0, NULL, &m_hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
if (!bResult)
|
||||
return FALSE;
|
||||
|
||||
bResult = CryptCreateHash(m_hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
|
||||
if (!bResult)
|
||||
return FALSE;
|
||||
|
||||
BYTE* pDataHash = NULL;
|
||||
DWORD dwHashLen = 0;
|
||||
int nTmp = 0;
|
||||
NSFile::CBase64Converter::Decode((char*)sXmlSignature.c_str(), (int)sXmlSignature.length(), pDataHash, nTmp);
|
||||
dwHashLen = (DWORD)nTmp;
|
||||
|
||||
BYTE* pDataHashMem = new BYTE[dwHashLen];
|
||||
ConvertEndian(pDataHash, pDataHashMem, dwHashLen);
|
||||
|
||||
RELEASEARRAYOBJECTS(pDataHash);
|
||||
|
||||
bResult = CryptHashData(hHash, (BYTE*)sXml.c_str(), (DWORD)sXml.length(), 0);
|
||||
|
||||
// Get the public key from the certificate
|
||||
CryptImportPublicKeyInfo(m_hCryptProv, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, &m_context->pCertInfo->SubjectPublicKeyInfo, &hPubKey);
|
||||
|
||||
BOOL bResultRet = CryptVerifySignature(hHash, pDataHashMem, dwHashLen, hPubKey, NULL, 0);
|
||||
|
||||
delete[] pDataHashMem;
|
||||
|
||||
bResult = CryptDestroyHash(hHash);
|
||||
|
||||
CryptDestroyKey(hPubKey);
|
||||
|
||||
return bResultRet && bResult;
|
||||
}
|
||||
|
||||
private:
|
||||
void ConvertEndian(const BYTE* src, BYTE* dst, DWORD size)
|
||||
{
|
||||
for(BYTE* p = dst + size - 1; p >= dst; ++src, --p)
|
||||
(*p) = (*src);
|
||||
}
|
||||
};
|
||||
|
||||
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
|
||||
void MyHandleError(char *s);
|
||||
@ -67,12 +347,6 @@ 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);
|
||||
|
||||
void ConvertEndian(const BYTE* src, BYTE* dst, DWORD size)
|
||||
{
|
||||
for(BYTE* p = dst + size - 1; p >= dst; ++src, --p)
|
||||
(*p) = (*src);
|
||||
}
|
||||
|
||||
void main(void)
|
||||
{
|
||||
if (false)
|
||||
@ -401,141 +675,37 @@ void MyHandleError(LPTSTR psz)
|
||||
|
||||
bool Sign(PCCERT_CONTEXT pCertContext, std::wstring sFileXml, std::wstring sSignatureFile)
|
||||
{
|
||||
// Variables
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
std::string sXmlPrepare = CXmlCanonicalizator::Execute(sFileXml, XML_C14N_1_0);
|
||||
|
||||
BOOL bResult = FALSE;
|
||||
|
||||
DWORD dwSigLen = 0;
|
||||
BYTE* pbSignature = NULL;
|
||||
|
||||
bResult = CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &dwKeySpec, NULL);
|
||||
|
||||
bool bIsResult = ((dwKeySpec & AT_SIGNATURE) == AT_SIGNATURE);
|
||||
|
||||
// Create the hash object.
|
||||
bResult = CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
|
||||
BYTE* pDataSrc = NULL;
|
||||
DWORD dwFileSrcLen = 0;
|
||||
NSFile::CFileBinary::ReadAllBytes(sFileXml, &pDataSrc, dwFileSrcLen);
|
||||
|
||||
xmlDocPtr xmlDoc = xmlParseMemory((char*)pDataSrc, (int)dwFileSrcLen);
|
||||
|
||||
CXmlBuffer _bufferC14N;
|
||||
xmlOutputBufferPtr _buffer = xmlOutputBufferCreateIO((xmlOutputWriteCallback)xmlBufferIOWrite,
|
||||
(xmlOutputCloseCallback)xmlBufferIOClose,
|
||||
&_bufferC14N,
|
||||
NULL);
|
||||
|
||||
xmlC14NExecute(xmlDoc, xmlC14NIsVisibleCallbackMy, NULL, XML_C14N_1_0, NULL, 0, _buffer);
|
||||
|
||||
xmlOutputBufferClose(_buffer);
|
||||
|
||||
NSFile::CFileBinary oFileDump;
|
||||
oFileDump.CreateFileW(NSFile::GetProcessDirectory() + L"/123.txt");
|
||||
oFileDump.WriteFile((BYTE*)_bufferC14N.builder.GetBuffer(), (DWORD)_bufferC14N.builder.GetCurSize());
|
||||
oFileDump.CloseFile();
|
||||
|
||||
//bResult = CryptHashData(hHash, pDataSrc, dwFileSrcLen, 0);
|
||||
bResult = CryptHashData(hHash, (BYTE*)_bufferC14N.builder.GetBuffer(), (DWORD)_bufferC14N.builder.GetCurSize(), 0);
|
||||
|
||||
if (true)
|
||||
{
|
||||
DWORD cbHashSize = 0, dwCount = sizeof(DWORD);
|
||||
|
||||
BOOL b1 = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &dwCount, 0);
|
||||
|
||||
BYTE* pDataHashRaw = new BYTE[dwCount];
|
||||
|
||||
BOOL b2 = CryptGetHashParam(hHash, HP_HASHVAL, pDataHashRaw, &cbHashSize, 0);
|
||||
|
||||
char* pBase64_hash = NULL;
|
||||
int nBase64Len_hash = 0;
|
||||
NSFile::CBase64Converter::Encode(pDataHashRaw, (int)cbHashSize, pBase64_hash, nBase64Len_hash, NSBase64::B64_BASE64_FLAG_NONE);
|
||||
|
||||
delete [] pBase64_hash;
|
||||
}
|
||||
|
||||
// Sign the hash object
|
||||
dwSigLen = 0;
|
||||
bResult = CryptSignHash(hHash, dwKeySpec, NULL, 0, NULL, &dwSigLen);
|
||||
|
||||
pbSignature = new BYTE[dwSigLen];
|
||||
bResult = CryptSignHash(hHash, dwKeySpec, NULL, 0, pbSignature, &dwSigLen);
|
||||
|
||||
NSFile::CFileBinary oFileTmp;
|
||||
oFileTmp.CreateFileW(NSFile::GetProcessDirectory() + L"/HASH.bin");
|
||||
oFileTmp.WriteFile(pbSignature, dwSigLen);
|
||||
oFileTmp.CloseFile();
|
||||
|
||||
BYTE* pbSignatureMem = new BYTE[dwSigLen];
|
||||
ConvertEndian(pbSignature, pbSignatureMem, dwSigLen);
|
||||
CXmlSigner oSigner(pCertContext);
|
||||
std::string sXmlSigned = oSigner.Sign(sXmlPrepare);
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
oFile.CreateFileW(sSignatureFile);
|
||||
|
||||
//oFile.WriteFile(pbSignature, dwSigLen);
|
||||
char* pBase64 = NULL;
|
||||
int nBase64Len = 0;
|
||||
NSFile::CBase64Converter::Encode(pbSignatureMem, (int)dwSigLen, pBase64, nBase64Len, NSBase64::B64_BASE64_FLAG_NONE);
|
||||
oFile.WriteFile((BYTE*)pBase64, (DWORD)nBase64Len);
|
||||
|
||||
oFile.WriteFile((BYTE*)sXmlSigned.c_str(), (DWORD)sXmlSigned.length());
|
||||
oFile.CloseFile();
|
||||
|
||||
delete[] pbSignature;
|
||||
delete[] pbSignatureMem;
|
||||
delete[] pDataSrc;
|
||||
|
||||
bResult = CryptDestroyHash(hHash);
|
||||
|
||||
return (bResult == TRUE);
|
||||
return (!sXmlSigned.empty());
|
||||
}
|
||||
|
||||
bool Verify(PCCERT_CONTEXT pCertContext, std::wstring sFileXml, std::wstring sSignatureFile)
|
||||
{
|
||||
DWORD dwKeySpec = 0;
|
||||
HCRYPTPROV hCryptProv = NULL;
|
||||
HCRYPTHASH hHash = NULL;
|
||||
HCRYPTKEY hPubKey = NULL;
|
||||
std::string sXmlUtf8;
|
||||
NSFile::CFileBinary::ReadAllTextUtf8A(sFileXml, sXmlUtf8);
|
||||
|
||||
BOOL bResult = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
|
||||
std::string sXmlUtf8Prepare = CXmlCanonicalizator::Execute(sXmlUtf8, XML_C14N_1_0);
|
||||
|
||||
// Create the hash object.
|
||||
bResult = CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash);
|
||||
std::string sXmlUtf8Signature;
|
||||
NSFile::CFileBinary::ReadAllTextUtf8A(sSignatureFile, sXmlUtf8Signature);
|
||||
|
||||
BYTE* pDataSrc = NULL;
|
||||
DWORD dwFileSrcLen = 0;
|
||||
NSFile::CFileBinary::ReadAllBytes(sFileXml, &pDataSrc, dwFileSrcLen);
|
||||
if (sXmlUtf8Prepare.empty() || sXmlUtf8Signature.empty())
|
||||
return false;
|
||||
|
||||
BYTE* pDataHashBase64 = NULL;
|
||||
DWORD dwFileHashSrcLenBase64 = 0;
|
||||
NSFile::CFileBinary::ReadAllBytes(sSignatureFile, &pDataHashBase64, dwFileHashSrcLenBase64);
|
||||
|
||||
BYTE* pDataHash = NULL;
|
||||
DWORD dwHashLen = 0;
|
||||
int nTmp = 0;
|
||||
NSFile::CBase64Converter::Decode((char*)pDataHashBase64, (int)dwFileHashSrcLenBase64, pDataHash, nTmp);
|
||||
dwHashLen = (DWORD)nTmp;
|
||||
|
||||
BYTE* pDataHashMem = new BYTE[dwHashLen];
|
||||
ConvertEndian(pDataHash, pDataHashMem, dwHashLen);
|
||||
|
||||
bResult = CryptHashData(hHash, pDataSrc, dwFileSrcLen, 0);
|
||||
|
||||
// Get the public key from the certificate
|
||||
CryptImportPublicKeyInfo(hCryptProv, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, &pCertContext->pCertInfo->SubjectPublicKeyInfo, &hPubKey);
|
||||
|
||||
BOOL bResultRet = CryptVerifySignature(hHash, pDataHashMem, dwHashLen, hPubKey, NULL, 0);
|
||||
|
||||
delete[] pDataSrc;
|
||||
delete[] pDataHash;
|
||||
delete[] pDataHashMem;
|
||||
delete[] pDataHashBase64;
|
||||
|
||||
bResult = CryptDestroyHash(hHash);
|
||||
|
||||
return bResultRet && bResult;
|
||||
CXmlSigner oSigner(pCertContext);
|
||||
return (TRUE == oSigner.Verify(sXmlUtf8Prepare, sXmlUtf8Signature));
|
||||
}
|
||||
|
||||
bool SignDocument(std::wstring sFolderOOXML, PCCERT_CONTEXT pCertContext)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -75,23 +75,23 @@ namespace codegen
|
||||
}
|
||||
public void merge(GenMemberPivot val)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(val.sName))
|
||||
if (string.IsNullOrEmpty(this.sName))
|
||||
sName = val.sName;
|
||||
if (!string.IsNullOrEmpty(val.sNamespace))
|
||||
if (string.IsNullOrEmpty(this.sNamespace))
|
||||
sNamespace = val.sNamespace;
|
||||
if (!string.IsNullOrEmpty(val.sType))
|
||||
if (string.IsNullOrEmpty(this.sType))
|
||||
sType = val.sType;
|
||||
if (null != val.oSystemType)
|
||||
if (null == this.oSystemType)
|
||||
oSystemType = val.oSystemType;
|
||||
if (val.bIsAttribute.HasValue)
|
||||
if (!this.bIsAttribute.HasValue)
|
||||
bIsAttribute = val.bIsAttribute;
|
||||
if (!string.IsNullOrEmpty(val.sDefAttribute))
|
||||
if (string.IsNullOrEmpty(this.sDefAttribute))
|
||||
sDefAttribute = val.sDefAttribute;
|
||||
if (val.bQualified.HasValue)
|
||||
if (!this.bQualified.HasValue)
|
||||
bQualified = val.bQualified;
|
||||
if (val.nArrayRank.HasValue)
|
||||
if (!this.nArrayRank.HasValue)
|
||||
nArrayRank = val.nArrayRank;
|
||||
if (val.bIsArrayTypesHidden.HasValue)
|
||||
if (!this.bIsArrayTypesHidden.HasValue)
|
||||
bIsArrayTypesHidden = val.bIsArrayTypesHidden;
|
||||
}
|
||||
public void completeDefaults()
|
||||
@ -105,7 +105,7 @@ namespace codegen
|
||||
|
||||
//[System.Xml.Serialization.XmlElementAttribute("c")]
|
||||
//public CT_CalcCell[] c {
|
||||
//bIsArray=true;aArrayTypes=[CT_CalcCell]
|
||||
//nArrayRank=0;aArrayTypes=[CT_CalcCell];bIsArrayTypesHidden=true
|
||||
|
||||
//[System.Xml.Serialization.XmlElementAttribute("b", typeof(CT_Boolean))]
|
||||
//[System.Xml.Serialization.XmlElementAttribute("d", typeof(CT_DateTime))]
|
||||
@ -114,9 +114,18 @@ namespace codegen
|
||||
//[System.Xml.Serialization.XmlElementAttribute("n", typeof(CT_Number))]
|
||||
//[System.Xml.Serialization.XmlElementAttribute("s", typeof(CT_String))]
|
||||
//public object[] Items {
|
||||
//nArrayRank=0;aArrayTypes=[CT_Boolean, CT_DateTime, CT_Error, CT_Missing, CT_Number, CT_String];bIsArrayTypesHidden=true
|
||||
|
||||
//[System.Xml.Serialization.XmlElementAttribute("consolidation", typeof(CT_Consolidation))]
|
||||
//[System.Xml.Serialization.XmlElementAttribute("extLst", typeof(CT_ExtensionList))]
|
||||
//[System.Xml.Serialization.XmlElementAttribute("worksheetSource", typeof(CT_WorksheetSource))]
|
||||
//public object Item
|
||||
//{
|
||||
//nArrayRank=null;aArrayTypes=[CT_Consolidation, CT_ExtensionList, CT_WorksheetSource];bIsArrayTypesHidden=true
|
||||
|
||||
//[System.Xml.Serialization.XmlArrayItemAttribute("author", IsNullable=false)]
|
||||
//public string[] authors {
|
||||
//nArrayRank=0;aArrayTypes=[string];bIsArrayTypesHidden=false
|
||||
|
||||
//[System.Xml.Serialization.XmlArrayItemAttribute("b", typeof(CT_Boolean), IsNullable=false)]
|
||||
//[System.Xml.Serialization.XmlArrayItemAttribute("d", typeof(CT_DateTime), IsNullable=false)]
|
||||
@ -126,12 +135,7 @@ namespace codegen
|
||||
//[System.Xml.Serialization.XmlArrayItemAttribute("s", typeof(CT_String), IsNullable=false)]
|
||||
//[System.Xml.Serialization.XmlArrayItemAttribute("x", typeof(CT_Index), IsNullable=false)]
|
||||
//public object[][] r {
|
||||
|
||||
//[System.Xml.Serialization.XmlElementAttribute("consolidation", typeof(CT_Consolidation))]
|
||||
//[System.Xml.Serialization.XmlElementAttribute("extLst", typeof(CT_ExtensionList))]
|
||||
//[System.Xml.Serialization.XmlElementAttribute("worksheetSource", typeof(CT_WorksheetSource))]
|
||||
//public object Item
|
||||
//{
|
||||
//nArrayRank=1;aArrayTypes=[CT_Boolean, CT_DateTime, CT_Error, CT_Missing, CT_Number, CT_String, CT_Index];bIsArrayTypesHidden=false
|
||||
|
||||
public class GenClassPivot
|
||||
{
|
||||
@ -222,6 +226,9 @@ namespace codegen
|
||||
Queue<GenClassPivot> aTemp = new Queue<GenClassPivot>();
|
||||
List<GenClassPivot> aRes = new List<GenClassPivot>();
|
||||
string[] aTargetTypes = new string[] { "CT_PivotCacheDefinition", "CT_PivotCacheRecords", "CT_pivotTableDefinition" };
|
||||
//string[] aTargetTypes = new string[] { "CT_Workbook" };
|
||||
//string[] aTargetTypes = new string[] { "CT_Comments" };
|
||||
|
||||
Dictionary<string, bool> mapTargetSubTypes = new Dictionary<string, bool>();
|
||||
Dictionary<string, bool> namspaces = new Dictionary<string, bool>();
|
||||
|
||||
@ -419,16 +426,19 @@ namespace codegen
|
||||
{
|
||||
if (1 == aTempMemebers.Count)
|
||||
{
|
||||
oGenMember.merge(aTempMemebers[0]);
|
||||
GenMemberPivot TempMember = aTempMemebers[0];
|
||||
TempMember.merge(oGenMember);
|
||||
TempMember.nArrayRank = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
oGenMember.aArrayTypes = aTempMemebers;
|
||||
if (bXmlElementAttribute)
|
||||
oGenMember.bIsArrayTypesHidden = true;
|
||||
else
|
||||
oGenMember.bIsArrayTypesHidden = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
oGenMember.nArrayRank = null;
|
||||
}
|
||||
oGenMember.completeDefaults();
|
||||
return oGenMember;
|
||||
|
||||
@ -59,10 +59,10 @@ namespace codegen
|
||||
m_mapProcessedClasses[oGenClass.sName] = oGenClass;
|
||||
}
|
||||
string sFileJs = "PivotTables.js";
|
||||
//string sFileJs = "Workbook.js";
|
||||
oJsSer.AppendFormat("\"use strict\";\r\n");
|
||||
oJsSer.AppendFormat(Utils.gc_sFilePrefix);
|
||||
oJsSer.AppendFormat("function getBoolFromXml(val){{return \"0\"!==val && \"false\"!==val && \"off\"!==val;}}\r\n");
|
||||
oJsSer.AppendFormat("function getXmlFromBool(val){{return val ? \"1\" : \"0\";}}\r\n");
|
||||
|
||||
//enums
|
||||
ProcessEnums(oJsSer, aEnums);
|
||||
@ -163,11 +163,11 @@ namespace codegen
|
||||
{
|
||||
if (oGenClass.isRoot())
|
||||
{
|
||||
sb.AppendFormat("{0}.prototype.toXml = function() {{\r\n", oGenClass.sName);
|
||||
sb.AppendFormat("{0}.prototype.toXml = function(writer) {{\r\n", oGenClass.sName);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("{0}.prototype.toXml = function(name) {{\r\n", oGenClass.sName);
|
||||
sb.AppendFormat("{0}.prototype.toXml = function(writer, name) {{\r\n", oGenClass.sName);
|
||||
}
|
||||
sb.AppendFormat("var res = \"\";\r\n");
|
||||
ProcessToXml(sb, oGenClass);
|
||||
@ -190,28 +190,40 @@ namespace codegen
|
||||
{
|
||||
bNeedDoubleArray = true;
|
||||
}
|
||||
if (null == oGenMember.aArrayTypes)
|
||||
|
||||
if (null != oGenMember.aArrayTypes)
|
||||
{
|
||||
if (null != oGenMember.oSystemType)
|
||||
for (int j = 0; j < oGenMember.aArrayTypes.Count; ++j)
|
||||
{
|
||||
bNeedTextNode = true;
|
||||
}
|
||||
else if (null != oGenMember.sType)
|
||||
{
|
||||
GenClassPivot oTemp;
|
||||
if (m_mapProcessedClasses.TryGetValue(oGenMember.sType, out oTemp))
|
||||
{
|
||||
if (oTemp.bIsEnum)
|
||||
{
|
||||
bNeedTextNode = true;
|
||||
}
|
||||
}
|
||||
InfoFromMemberElem(oGenMember.aArrayTypes[j], ref bNeedTextNode);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
InfoFromMemberElem(oGenMember, ref bNeedTextNode);
|
||||
}
|
||||
aMembers.Add(oGenMember);
|
||||
}
|
||||
}
|
||||
}
|
||||
public void InfoFromMemberElem(GenMemberPivot oGenMember, ref bool bNeedTextNode)
|
||||
{
|
||||
if (null != oGenMember.oSystemType)
|
||||
{
|
||||
bNeedTextNode = true;
|
||||
}
|
||||
else if (null != oGenMember.sType)
|
||||
{
|
||||
GenClassPivot oTemp;
|
||||
if (m_mapProcessedClasses.TryGetValue(oGenMember.sType, out oTemp))
|
||||
{
|
||||
if (oTemp.bIsEnum)
|
||||
{
|
||||
bNeedTextNode = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void ProcessProperty(StringBuilder sb, List<GenMemberPivot> aAttributes, List<GenMemberPivot> aMembers, bool bNeedTextNode, bool bNeedDoubleArray)
|
||||
{
|
||||
if (aAttributes.Count > 0)
|
||||
@ -237,7 +249,12 @@ namespace codegen
|
||||
{
|
||||
GenMemberPivot oGenMember = aMembers[i];
|
||||
if (oGenMember.nArrayRank.HasValue)
|
||||
sb.AppendFormat("this.{0} = [];\r\n", oGenMember.sName);
|
||||
{
|
||||
if (false != oGenMember.bIsArrayTypesHidden)
|
||||
sb.AppendFormat("this.{0} = [];\r\n", oGenMember.sName);
|
||||
else
|
||||
sb.AppendFormat("this.{0} = null;\r\n", oGenMember.sName);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (null != oGenMember.aArrayTypes)
|
||||
@ -310,8 +327,9 @@ namespace codegen
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("//todo check\r\n", getNameWithPrefix(oGenClass, oGenMember), sCodeName);
|
||||
sb.AppendFormat("//todo check name duplication\r\n", getNameWithPrefix(oGenClass, oGenMember), sCodeName);
|
||||
}
|
||||
sb.AppendFormat("this.{0} = [];\r\n", oGenMember.sName);
|
||||
sb.AppendFormat("}}\r\n", getNameWithPrefix(oGenClass, oGenMember), sCodeName);
|
||||
nCounter++;
|
||||
}
|
||||
@ -383,30 +401,26 @@ namespace codegen
|
||||
for (int i = 0; i < aMembers.Count; ++i)
|
||||
{
|
||||
GenMemberPivot oGenMember = aMembers[i];
|
||||
nCounter = ProcessOnTextNodeFromXmlMember(sb, oGenClass, oGenMember, null, nCounter);
|
||||
}
|
||||
}
|
||||
int ProcessOnTextNodeFromXmlMember(StringBuilder sb, GenClassPivot oGenClass, GenMemberPivot oGenMember, GenMemberPivot oGenMemberContainer, int nCounter)
|
||||
{
|
||||
if (0 != nCounter)
|
||||
sb.AppendFormat("else ");
|
||||
sb.AppendFormat("if(\"{0}\" === this._curElem){{\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
|
||||
if (null != oGenMember.oSystemType)
|
||||
{
|
||||
if (oGenMember.nArrayRank.HasValue)
|
||||
if (null != oGenMember.aArrayTypes)
|
||||
{
|
||||
if (oGenMember.nArrayRank > 0)
|
||||
for (int j = 0; j < oGenMember.aArrayTypes.Count; ++j)
|
||||
{
|
||||
sb.AppendFormat("this._curArray.push({0});\r\n", ProcessJsTypeFromXml(oGenMember.oSystemType, "text"));
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("this.{0}.push({1});\r\n", oGenMember.sName, ProcessJsTypeFromXml(oGenMember.oSystemType, "text"));
|
||||
nCounter = ProcessOnTextNodeFromXmlMember(sb, oGenClass, oGenMember.aArrayTypes[j], nCounter);
|
||||
}
|
||||
}
|
||||
else
|
||||
sb.AppendFormat("this.{0} = {1};\r\n", oGenMember.sName, ProcessJsTypeFromXml(oGenMember.oSystemType, "text"));
|
||||
{
|
||||
nCounter = ProcessOnTextNodeFromXmlMember(sb, oGenClass, oGenMember, nCounter);
|
||||
}
|
||||
}
|
||||
}
|
||||
int ProcessOnTextNodeFromXmlMember(StringBuilder sb, GenClassPivot oGenClass, GenMemberPivot oGenMember, int nCounter)
|
||||
{
|
||||
if (null != oGenMember.oSystemType)
|
||||
{
|
||||
ProcessOnTextNodeFromXmlMemberPrefix(sb, oGenClass, oGenMember, nCounter);
|
||||
ProcessOnTextNodeFromXmlMemberElem(sb, oGenMember, ProcessJsTypeFromXml(oGenMember.oSystemType, "text"));
|
||||
nCounter = ProcessOnTextNodeFromXmlMemberPostfix(sb, nCounter);
|
||||
}
|
||||
else if (null != oGenMember.sType)
|
||||
{
|
||||
@ -415,29 +429,46 @@ namespace codegen
|
||||
{
|
||||
if (oTemp.bIsEnum)
|
||||
{
|
||||
ProcessOnTextNodeFromXmlMemberPrefix(sb, oGenClass, oGenMember, nCounter);
|
||||
sb.AppendFormat("var val = {0}(text);\r\n", gc_sEnumFromXmlPrefix + oTemp.sName);
|
||||
sb.AppendFormat("if(-1 !== val){{\r\n");
|
||||
if (oGenMember.nArrayRank.HasValue)
|
||||
{
|
||||
if (oGenMember.nArrayRank > 0)
|
||||
{
|
||||
sb.AppendFormat("this._curArray.push(val);\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("this.{0}.push(val);\r\n", oGenMember.sName);
|
||||
}
|
||||
}
|
||||
else
|
||||
sb.AppendFormat("this.{0} = val;\r\n", oGenMember.sName);
|
||||
ProcessOnTextNodeFromXmlMemberElem(sb, oGenMember, "val");
|
||||
sb.AppendFormat("}}\r\n");
|
||||
nCounter = ProcessOnTextNodeFromXmlMemberPostfix(sb, nCounter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nCounter;
|
||||
}
|
||||
void ProcessOnTextNodeFromXmlMemberPrefix(StringBuilder sb, GenClassPivot oGenClass, GenMemberPivot oGenMember, int nCounter)
|
||||
{
|
||||
if (0 != nCounter)
|
||||
sb.AppendFormat("else ");
|
||||
sb.AppendFormat("if(\"{0}\" === this._curElem){{\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
}
|
||||
int ProcessOnTextNodeFromXmlMemberPostfix(StringBuilder sb, int nCounter)
|
||||
{
|
||||
sb.AppendFormat("}}\r\n");
|
||||
nCounter++;
|
||||
return nCounter;
|
||||
}
|
||||
void ProcessOnTextNodeFromXmlMemberElem(StringBuilder sb, GenMemberPivot oGenMember, string sCodeName)
|
||||
{
|
||||
if (oGenMember.nArrayRank.HasValue)
|
||||
{
|
||||
if (oGenMember.nArrayRank > 0)
|
||||
{
|
||||
sb.AppendFormat("this._curArray.push({0});\r\n", sCodeName);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("this.{0}.push({1});\r\n", oGenMember.sName, sCodeName);
|
||||
}
|
||||
}
|
||||
else
|
||||
sb.AppendFormat("this.{0} = {1};\r\n", oGenMember.sName, sCodeName);
|
||||
}
|
||||
void ProcessOnEndNodeFromXml(StringBuilder sb, GenClassPivot oGenClass, List<GenMemberPivot> aMembers)
|
||||
{
|
||||
int nCounter = 0;
|
||||
@ -527,15 +558,19 @@ namespace codegen
|
||||
bool bNeedDoubleArray = false;
|
||||
InfoFromMember(oGenClass, ref aAttributes, ref aMembers, ref bNeedTextNode, ref bNeedDoubleArray);
|
||||
|
||||
string sCodeName;
|
||||
if (oGenClass.isRoot())
|
||||
{
|
||||
sb.AppendFormat("res += \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"yes\\\"?>\";\r\n");
|
||||
sb.AppendFormat("res += \"<{0}{1}\";\r\n", oGenClass.sRootName, gc_sNamespaceToXml);
|
||||
sCodeName = "\"" + oGenClass.sRootName + "\"";
|
||||
sb.AppendFormat("writer.WriteXmlString(\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"yes\\\"?>\");\r\n");
|
||||
sb.AppendFormat("writer.WriteXmlNodeStart({0});\r\n", sCodeName);
|
||||
sb.AppendFormat("writer.WriteXmlString(\"{0}\");\r\n", gc_sNamespaceToXml);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("res += \"<\";\r\n");
|
||||
sb.AppendFormat("res += name;\r\n");
|
||||
sCodeName = "name";
|
||||
sb.AppendFormat("writer.WriteXmlNodeStart({0});\r\n", sCodeName);
|
||||
}
|
||||
|
||||
for (int i = 0; i < aAttributes.Count; ++i)
|
||||
@ -546,16 +581,22 @@ namespace codegen
|
||||
|
||||
if (aMembers.Count > 0)
|
||||
{
|
||||
sb.AppendFormat("res += \">\";\r\n");
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd({0}, true);\r\n", sCodeName);
|
||||
for (int i = 0; i < aMembers.Count; ++i)
|
||||
{
|
||||
GenMemberPivot oGenMember = aMembers[i];
|
||||
bool bNullCheck = true;
|
||||
string sCodeElem;
|
||||
if (oGenMember.nArrayRank > 0)
|
||||
{
|
||||
if (false == oGenMember.bIsArrayTypesHidden)
|
||||
{
|
||||
sb.AppendFormat("if(null !== {0}){{\r\n", oGenMember.sName);
|
||||
}
|
||||
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);
|
||||
sCodeElem = "elem";
|
||||
bNullCheck = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -565,20 +606,41 @@ namespace codegen
|
||||
{
|
||||
if (false == oGenMember.bIsArrayTypesHidden)
|
||||
{
|
||||
sb.AppendFormat("res += \"<{0}>\";\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
if (bNullCheck)
|
||||
sb.AppendFormat("if(null !== {0}){{\r\n", sCodeElem);
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd(\"{0}\", true);\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
}
|
||||
if (oGenMember.nArrayRank.HasValue)
|
||||
{
|
||||
sb.AppendFormat("for(var j = 0; j < {0}.length; ++j){{\r\n", sCodeElem);
|
||||
sb.AppendFormat("var subelem = {0}[j];\r\n", sCodeElem);
|
||||
for (int j = 0; j < oGenMember.aArrayTypes.Count; ++j)
|
||||
string sCodeSubElem;
|
||||
if (oGenMember.nArrayRank > 0)
|
||||
{
|
||||
GenMemberPivot oTempMember = oGenMember.aArrayTypes[j];
|
||||
if (0 != j)
|
||||
sb.AppendFormat("else ");
|
||||
sb.AppendFormat("if(subelem instanceof {0}){{\r\n", oTempMember.sType);
|
||||
sb.AppendFormat("res += subelem.toXml(\"{0}\");\r\n", getNameWithPrefix(oGenClass, oTempMember));
|
||||
sb.AppendFormat("}}\r\n");
|
||||
sb.AppendFormat("for(var j = 0; j < {0}.length; ++j){{\r\n", sCodeElem);
|
||||
sb.AppendFormat("var subelem = {0}[j];\r\n", sCodeElem);
|
||||
sCodeSubElem = "subelem";
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("for(var i = 0; i < {0}.length; ++i){{\r\n", sCodeElem);
|
||||
sb.AppendFormat("var elem = {0}[i];\r\n", sCodeElem);
|
||||
sCodeSubElem = "elem";
|
||||
}
|
||||
if (1 == oGenMember.aArrayTypes.Count)
|
||||
{
|
||||
GenMemberPivot oTempMember = oGenMember.aArrayTypes[0];
|
||||
ProcessMemberToXml(sb, oGenClass, oTempMember, sCodeSubElem, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int j = 0; j < oGenMember.aArrayTypes.Count; ++j)
|
||||
{
|
||||
GenMemberPivot oTempMember = oGenMember.aArrayTypes[j];
|
||||
if (0 != j)
|
||||
sb.AppendFormat("else ");
|
||||
sb.AppendFormat("if({0} instanceof {1}){{\r\n", sCodeSubElem, oTempMember.sType);
|
||||
sb.AppendFormat("{0}.toXml(writer, \"{1}\");\r\n", sCodeSubElem, getNameWithPrefix(oGenClass, oTempMember));
|
||||
sb.AppendFormat("}}\r\n");
|
||||
}
|
||||
}
|
||||
sb.AppendFormat("}}\r\n");
|
||||
}
|
||||
@ -593,42 +655,29 @@ namespace codegen
|
||||
}
|
||||
if (false == oGenMember.bIsArrayTypesHidden)
|
||||
{
|
||||
sb.AppendFormat("res += \"</{0}>\";\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd(\"{0}\");\r\n", getNameWithPrefix(oGenClass, oGenMember));
|
||||
if (bNullCheck)
|
||||
sb.AppendFormat("}}\r\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (oGenMember.nArrayRank.HasValue)
|
||||
{
|
||||
sb.AppendFormat("for(var i = 0; i < {0}.length; ++i){{\r\n", sCodeElem);
|
||||
sb.AppendFormat("var elem = {0}[i];\r\n", sCodeElem);
|
||||
ProcessMemberToXml(sb, oGenClass, oGenMember, "elem", false);
|
||||
sb.AppendFormat("}}\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ProcessMemberToXml(sb, oGenClass, oGenMember, sCodeElem, true);
|
||||
}
|
||||
ProcessMemberToXml(sb, oGenClass, oGenMember, sCodeElem, true);
|
||||
}
|
||||
if (oGenMember.nArrayRank > 0)
|
||||
{
|
||||
sb.AppendFormat("}}\r\n");
|
||||
if (false == oGenMember.bIsArrayTypesHidden)
|
||||
{
|
||||
sb.AppendFormat("}}\r\n", oGenMember.sName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (oGenClass.isRoot())
|
||||
{
|
||||
sb.AppendFormat("res += \"</{0}>\";\r\n", oGenClass.sRootName);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("res += \"</\";\r\n");
|
||||
sb.AppendFormat("res += name;\r\n");
|
||||
sb.AppendFormat("res += \">\";\r\n");
|
||||
}
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd({0});\r\n", sCodeName);
|
||||
}
|
||||
else
|
||||
sb.AppendFormat("res += \"/>\";\r\n");
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd({0}, true, true);\r\n", sCodeName);
|
||||
}
|
||||
void ProcessMemberToXml(StringBuilder sb, GenClassPivot oGenClass, GenMemberPivot oGenMember, string sElemName, bool checkNull)
|
||||
{
|
||||
@ -642,15 +691,7 @@ namespace codegen
|
||||
|
||||
if (null != oGenMember.oSystemType)
|
||||
{
|
||||
if (bIsAttribute)
|
||||
sb.AppendFormat("res += \" {0}=\\\"\";\r\n", sElemXmlName);
|
||||
else
|
||||
sb.AppendFormat("res += \"<{0}>\";\r\n", sElemXmlName);
|
||||
sb.AppendFormat("res += {0};\r\n", ProcessJsTypeToXml(oGenMember.oSystemType, sElemName));
|
||||
if (bIsAttribute)
|
||||
sb.AppendFormat("res += \"\\\"\";\r\n");
|
||||
else
|
||||
sb.AppendFormat("res += \"</{0}>\";\r\n", sElemXmlName);
|
||||
ProcessJsTypeToXml(sb, sElemXmlName, oGenMember.oSystemType, sElemName, bIsAttribute);
|
||||
}
|
||||
else if (null != oGenMember.sType)
|
||||
{
|
||||
@ -660,20 +701,13 @@ namespace codegen
|
||||
{
|
||||
if (oGenClassMember.bIsEnum)
|
||||
{
|
||||
if (bIsAttribute)
|
||||
sb.AppendFormat("res += \" {0}=\\\"\";\r\n", sElemXmlName);
|
||||
else
|
||||
sb.AppendFormat("res += \"<{0}>\";\r\n", sElemXmlName);
|
||||
sb.AppendFormat("res += {0}{1}({2});\r\n", gc_sEnumToXmlPrefix, oGenClassMember.sName, sElemName);
|
||||
if (bIsAttribute)
|
||||
sb.AppendFormat("res += \"\\\"\";\r\n");
|
||||
else
|
||||
sb.AppendFormat("res += \"</{0}>\";\r\n", sElemXmlName);
|
||||
string sElemNameEnum = gc_sEnumToXmlPrefix + oGenClassMember.sName + "("+ sElemName + ")";
|
||||
ProcessJsTypeToXml(sb, sElemXmlName, oGenMember.oSystemType, sElemNameEnum, bIsAttribute);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!bIsAttribute)
|
||||
sb.AppendFormat("res += {0}.toXml(\"{1}\");\r\n", sElemName, sElemXmlName);
|
||||
sb.AppendFormat("res += {0}.toXml(writer, \"{1}\");\r\n", sElemName, sElemXmlName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -682,13 +716,21 @@ namespace codegen
|
||||
sb.AppendFormat("}}\r\n");
|
||||
}
|
||||
}
|
||||
string ProcessJsTypeToXml(Type oType, string sVal)
|
||||
void ProcessJsTypeToXml(StringBuilder sb, string sName, Type oType, string sVal, bool bAttribute)
|
||||
{
|
||||
string sRes;
|
||||
switch (Type.GetTypeCode(oType))
|
||||
{
|
||||
case TypeCode.Boolean:
|
||||
sRes = "getXmlFromBool(" + sVal + ")";
|
||||
if(bAttribute)
|
||||
{
|
||||
sb.AppendFormat("writer.WriteXmlAttributeBool(\"{0}\", {1});\r\n", sName, sVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("writer.WriteXmlNodeStart(\"{0}\", true);\r\n", sName);
|
||||
sb.AppendFormat("writer.WriteXmlBool({0});\r\n", sVal);
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd(\"{0}\");\r\n", sName);
|
||||
}
|
||||
break;
|
||||
case TypeCode.Byte:
|
||||
case TypeCode.SByte:
|
||||
@ -700,11 +742,30 @@ namespace codegen
|
||||
case TypeCode.UInt64:
|
||||
case TypeCode.Single:
|
||||
case TypeCode.Double:
|
||||
sRes = sVal + ".toString()";
|
||||
if (bAttribute)
|
||||
{
|
||||
sb.AppendFormat("writer.WriteXmlAttributeNumber(\"{0}\", {1});\r\n", sName, sVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("writer.WriteXmlNodeStart(\"{0}\", true);\r\n", sName);
|
||||
sb.AppendFormat("writer.WriteXmlNumber({0});\r\n", sVal);
|
||||
sb.AppendFormat("writer.WriteXmlNodeEnd(\"{0}\");\r\n", sName);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (bAttribute)
|
||||
{
|
||||
sb.AppendFormat("writer.WriteXmlAttributeString(\"{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.WriteXmlNodeEnd(\"{0}\");\r\n", sName);
|
||||
}
|
||||
break;
|
||||
default: sRes = sVal; break;
|
||||
}
|
||||
return sRes;
|
||||
}
|
||||
|
||||
string getNameWithPrefix(GenClassPivot oGenClass, GenMemberPivot oGenMember)
|
||||
|
||||
@ -568,7 +568,7 @@
|
||||
<xsd:attribute name="optimizeMemory" type="xsd:boolean" use="optional" default="false"/>
|
||||
<xsd:attribute name="enableRefresh" type="xsd:boolean" use="optional" default="true"/>
|
||||
<xsd:attribute name="refreshedBy" type="s:ST_Xstring" use="optional"/>
|
||||
<xsd:attribute name="refreshedDateIso" type="xsd:dateTime" use="optional"/>
|
||||
<xsd:attribute name="refreshedDate" type="xsd:double" use="optional"/>
|
||||
<xsd:attribute name="backgroundQuery" type="xsd:boolean" default="false"/>
|
||||
<xsd:attribute name="missingItemsLimit" type="xsd:unsignedInt" use="optional"/>
|
||||
<xsd:attribute name="createdVersion" type="xsd:unsignedByte" use="optional" default="0"/>
|
||||
|
||||
@ -7,11 +7,10 @@
|
||||
QT -= core
|
||||
QT -= gui
|
||||
|
||||
VERSION = 2.4.448.000
|
||||
VERSION = 2.4.450.0
|
||||
DEFINES += INTVER=$$VERSION
|
||||
|
||||
TARGET = x2t
|
||||
|
||||
CORE_ROOT_DIR = $$PWD/../../..
|
||||
PWD_ROOT_DIR = $$PWD
|
||||
|
||||
|
||||
Reference in New Issue
Block a user