void xlsx_workbook_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_attrs_t& attrs) { xml_token_pair_t parent = push_stack(ns, name); switch (name) { case XML_workbook: { xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); print_attrs(get_tokens(), attrs); } break; case XML_sheets: xml_element_expected(parent, NS_ooxml_xlsx, XML_workbook); break; case XML_sheet: { xml_element_expected(parent, NS_ooxml_xlsx, XML_sheets); workbook_sheet_attr_parser func(&get_session_context()); func = for_each(attrs.begin(), attrs.end(), func); m_sheets.push_back(new xlsx_rel_sheet_info(func.get_sheet())); const xlsx_rel_sheet_info& info = m_sheets.back(); m_sheet_info.insert( opc_rel_extras_t::value_type(func.get_rid(), &info)); } break; default: warn_unhandled(); } }
void xlsx_revheaders_context::start_element(xmlns_id_t ns, xml_token_t name, const vector<xml_token_attr_t>& attrs) { xml_token_pair_t parent = push_stack(ns, name); if (ns == NS_ooxml_xlsx) { switch (name) { case XML_headers: { xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); headers_attr_parser func; func = for_each(attrs.begin(), attrs.end(), func); cout << "* last guid: " << func.get_last_guid() << endl; cout << "* highest revision ID: " << func.get_highest_revid() << endl; cout << "* version: " << func.get_version() << endl; cout << "* disk revisions: " << func.is_disk_revisions() << endl; } break; case XML_header: { xml_element_expected(parent, NS_ooxml_xlsx, XML_headers); header_attr_parser func(get_session_context().m_string_pool); func = for_each(attrs.begin(), attrs.end(), func); cout << "* revision header (guid:" << func.get_guid() << ")" << endl; cout << " - timestamp: " << func.get_date_time().to_string() << endl; cout << " - user name: " << func.get_username() << endl; if (func.get_min_revid() != -1 && func.get_max_revid() != -1) cout << " - revision range: " << func.get_min_revid() << "-" << func.get_max_revid() << endl; long next_sheet = func.get_next_sheet_id(); if (next_sheet != -1) cout << " - next available sheet: " << (next_sheet - 1) << endl; cout << " - revision log rid: " << func.get_rid() << endl; // TODO : Intern the rid here when passing it to the revision log stream. } break; case XML_sheetIdMap: { xml_element_expected(parent, NS_ooxml_xlsx, XML_header); m_cur_sheet_ids.clear(); long n = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_count); if (n > 0) m_cur_sheet_ids.reserve(n); } break; case XML_sheetId: { xml_element_expected(parent, NS_ooxml_xlsx, XML_sheetIdMap); long val = single_long_attr_getter::get(attrs, NS_ooxml_xlsx, XML_val); if (val > 0) m_cur_sheet_ids.push_back(val-1); // convert from 1-based to 0-based. } break; default: warn_unhandled(); } } }
void opc_relations_context::start_element(xmlns_id_t ns, xml_token_t name, const vector<xml_token_attr_t> &attrs) { xml_token_pair_t parent = push_stack(ns, name); switch (name) { case XML_Relationships: { xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); print_attrs(get_tokens(), attrs); } break; case XML_Relationship: { rel_attr_parser func(&get_session_context(), &m_schema_cache); xml_element_expected(parent, NS_opc_rel, XML_Relationships); func = for_each(attrs.begin(), attrs.end(), func); const opc_rel_t& rel = func.get_rel(); if (rel.type) m_rels.push_back(rel); } break; default: warn_unhandled(); } }
xml_context_base* gnumeric_content_xml_context::create_child_context(xmlns_id_t ns, xml_token_t name) { if (ns == NS_gnumeric_gnm && name == XML_Sheet) { mp_child.reset(new gnumeric_sheet_context(get_session_context(), get_tokens(), mp_factory)); return mp_child.get(); } return NULL; }
void opc_content_types_context::start_element(xmlns_id_t ns, xml_token_t name, const::std::vector<xml_token_attr_t> &attrs) { xml_token_pair_t parent = push_stack(ns, name); switch (name) { case XML_Types: { xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); print_attrs(get_tokens(), attrs); } break; case XML_Override: { xml_element_expected(parent, NS_opc_ct, XML_Types); part_ext_attr_parser func(&m_ct_cache, XML_PartName); func = for_each(attrs.begin(), attrs.end(), func); // We need to use allocated strings for part names here because // the part names need to survive after the [Content_Types].xml // stream is destroyed. pstring part_name = get_session_context().m_string_pool.intern(func.get_name()).first; m_parts.push_back( xml_part_t(part_name, func.get_content_type())); } break; case XML_Default: { xml_element_expected(parent, NS_opc_ct, XML_Types); part_ext_attr_parser func(&m_ct_cache, XML_Extension); func = for_each(attrs.begin(), attrs.end(), func); // Like the part names, we need to use allocated strings for // extension names. pstring ext_name = get_session_context().m_string_pool.intern(func.get_name()).first; m_ext_defaults.push_back( xml_part_t(ext_name, func.get_content_type())); } break; default: warn_unhandled(); } }
void xlsx_revlog_context::characters(const pstring& str, bool transient) { const xml_token_pair_t& elem = get_current_element(); if (elem.first == NS_ooxml_xlsx) { switch (elem.second) { case XML_v: m_cur_value = to_double(str); break; case XML_f: m_cur_formula = true; // fall through to get the string. case XML_t: m_cur_string = str; if (transient) m_cur_string = get_session_context().m_string_pool.intern(m_cur_string).first; break; default: ; } } }