/** writes a coord value or a coord segment. */ static void writeCoord(XmlWriter &out, IomObject &obj) { /* object: COORD C1 102.0 C2 402.0 <COORD><C1>102.0</C1><C2>402.0</C2></COORD> */ out.startElement(tags::get_COORD(),0,0); out.startElement(tags::get_C1(),0,0); const XMLCh *c1=obj->getAttrPrim(tags::get_C1(),0); out.characters(c1); out.endElement(/*C1*/); const XMLCh *c2=obj->getAttrPrim(tags::get_C2(),0); if(c2){ out.startElement(tags::get_C2(),0,0); out.characters(c2); out.endElement(/*C2*/); const XMLCh *c3=obj->getAttrPrim(tags::get_C3(),0); if(c3){ out.startElement(tags::get_C3(),0,0); out.characters(c3); out.endElement(/*C3*/); } } out.endElement(/*COORD*/); }
/** writes a surface value. */ void iom_file::writeSurface(XmlWriter &out, IomObject &obj) { /* object: MULTISURFACE [INCOMPLETE] surface // if incomplete; multi surface values object: SURFACE boundary object: BOUNDARY polyline object: POLYLINE <SURFACE> <BOUNDARY> <POLYLINE .../> <POLYLINE .../> </BOUNDARY> <BOUNDARY> <POLYLINE .../> <POLYLINE .../> </BOUNDARY> </SURFACE> */ out.startElement(tags::get_SURFACE(),0,0); bool clipped=obj->getConsistency()==IOM_INCOMPLETE; for(int surfacei=0;surfacei<obj->getAttrValueCount(tags::get_surface());surfacei++){ if(clipped){ out.startElement(tags::get_CLIPPED(),0,0); }else{ // an unclipped surface should have only one surface element if(surfacei>0){ iom_issueerr("unclipped surface with multi 'surface' elements"); break; } } IomObject surface=obj->getAttrObj(tags::get_surface(),surfacei); for(int boundaryi=0;boundaryi<surface->getAttrValueCount(tags::get_boundary());boundaryi++){ IomObject boundary=surface->getAttrObj(tags::get_boundary(),boundaryi); out.startElement(tags::get_BOUNDARY(),0,0); for(int polylinei=0;polylinei<boundary->getAttrValueCount(tags::get_polyline());polylinei++){ IomObject polyline=boundary->getAttrObj(tags::get_polyline(),polylinei); writePolyline(out,polyline,true); } out.endElement(/*BOUNDARY*/); } if(clipped){ out.endElement(/*CLIPPED*/); } } out.endElement(/*SURFACE*/); }
void MALItem::serialize(XmlWriter& writer) const { writer.startElement("MALitem"); writer.writeAttribute("version", "1"); using std::to_string; writer.writeElement("series_itemdb_id", to_string(series_itemdb_id)); writer.writeElement("series_title", series_title); writer.writeElement("series_preferred_title", series_preferred_title); writer.writeElement("series_date_begin", series_date_begin); writer.writeElement("series_date_end", series_date_end); writer.writeElement("image_url", image_url); writer.startElement("series_synonyms"); std::for_each(std::begin(series_synonyms), std::end(series_synonyms), std::bind(&XmlWriter::writeElement, std::ref(writer), "series_synonym", std::placeholders::_1)); writer.endElement(); writer.writeElement("series_synopsis", series_synopsis ); writer.startElement("tags"); std::for_each(std::begin(tags), std::end(tags), std::bind(&XmlWriter::writeElement, std::ref(writer), "tag", std::placeholders::_1)); writer.endElement(); writer.writeElement("date_start", date_start); writer.writeElement("date_finish", date_finish); writer.writeElement("id", to_string(id)); writer.writeElement("last_updated", to_string(last_updated)); writer.writeElement("score", to_string(score)); writer.writeElement("enable_reconsuming", to_string(enable_reconsuming)); writer.writeElement("fansub_group", fansub_group); writer.writeElement("comments", comments); writer.writeElement("downloaded_items", to_string(downloaded_items)); writer.writeElement("times_consumed", to_string(times_consumed)); writer.writeElement("reconsume_value", to_string(reconsume_value)); writer.writeElement("priority", to_string(priority)); writer.writeElement("enable_discussion", to_string(enable_discussion)); writer.writeElement("has_details", to_string(has_details)); writer.endElement(); }
std::string AnimeSerializer::serialize(const Anime& anime) const { XmlWriter writer; writer.startDoc(); writer.startElement("entry"); writer.writeElement("episode", std::to_string(anime.episodes)); writer.writeElement("status", std::to_string(static_cast<int>(anime.status))); writer.writeElement("score", std::to_string(anime.score)); writer.writeElement("downloaded_episodes", std::to_string(anime.downloaded_items)); if (anime.has_details) { writer.writeElement("storage_type", std::to_string(static_cast<int>(anime.storage_type))); writer.writeElement("storage_value", std::to_string(anime.storage_value)); writer.writeElement("times_rewatched", std::to_string(anime.times_consumed)); writer.writeElement("rewatch_value", std::to_string(static_cast<int>(anime.reconsume_value))); } auto start = Glib::Date(); start.set_parse(anime.date_start); if (start.valid()) { writer.writeElement("date_start", start.format_string("%m%d%Y")); } auto finish = Glib::Date(); finish.set_parse(anime.date_finish); if (finish.valid()) { writer.writeElement("date_finish", finish.format_string("%m%d%Y")); } if (anime.has_details) { writer.writeElement("priority", std::to_string(static_cast<int>(anime.priority))); writer.writeElement("enable_discussion", anime.enable_discussion?"1":"0"); } writer.writeElement("enable_rewatching", anime.enable_reconsuming?"1":"0"); if (anime.has_details) { writer.writeElement("comments", anime.comments); writer.writeElement("fansub_group", anime.fansub_group); } std::string tags; auto iter = anime.tags.begin(); bool was_first = true; while (iter != anime.tags.end()) { if (!was_first) tags += ", "; tags += *iter; was_first = false; ++iter; } writer.writeElement("tags", tags); writer.writeElement("rewatch_episode", std::to_string(anime.rewatch_episode)); writer.endDoc(); return writer.getString(); }
void JointSensor::write(XmlWriter & output) const { output.startElement("RobotSensor"); output.writeElement("SensorType", toString(type)); output.writeElement("SensorPortNumberA", std::to_string(portA)); output.writeElement("SensorSignalTypeA", toString(portSignal)); output.writeElement("SensorPortNumberB", std::to_string(portB)); output.writeElement("SensorSignalTypeB", toString(portSignal)); output.writeElement("SensorConversionFactor", std::to_string(conversionFactor)); output.endElement(); }
/** writes a arc segment value. */ static void writeArc(XmlWriter &out, IomObject &obj) { /* object: ARC C1 103.0 C2 403.0 A1 104.0 A2 404.0 <COORD><C1>103.0</C1><C2>403.0</C2><A1>104.0</A1><A2>404.0</A2></COORD> */ out.startElement(tags::get_ARC(),0,0); out.startElement(tags::get_C1(),0,0); const XMLCh *c1=obj->getAttrPrim(tags::get_C1(),0); out.characters(c1); out.endElement(/*C1*/); const XMLCh *c2=obj->getAttrPrim(tags::get_C2(),0); out.startElement(tags::get_C2(),0,0); out.characters(c2); out.endElement(/*C2*/); const XMLCh *c3=obj->getAttrPrim(tags::get_C3(),0); if(c3){ out.startElement(tags::get_C3(),0,0); out.characters(c3); out.endElement(/*C3*/); } const XMLCh *a1=obj->getAttrPrim(tags::get_A1(),0); out.characters(a1); out.endElement(/*A1*/); const XMLCh *a2=obj->getAttrPrim(tags::get_A2(),0); out.startElement(tags::get_A2(),0,0); out.characters(a2); out.endElement(/*A2*/); const XMLCh *r=obj->getAttrPrim(tags::get_R(),0); if(r){ out.startElement(tags::get_R(),0,0); out.characters(r); out.endElement(/*R*/); } out.endElement(/*ARC*/); }
/** write all baskets to an xml file. */ int iom_file::save() { // build class/attribute list if(ilibasket.isNull()){ iom_issueerr("model required to save data"); return IOM_ERR_ILLEGALSTATE; } buildTagList(); // read rest of file (before we overwrite it!) IomIterator bi=new iom_iterator(this); while(!bi->next_basket().isNull()){ ; // empty } // open file for write XmlWriter out; int ind=0; out.open(filename);out.printNewLine(); // write header XmlWrtAttr trsfAttr[]={XmlWrtAttr(ustrings::get_xmlns(),ustrings::get_NS_INTERLIS22())}; out.printIndent(ind); out.startElement(tags::get_TRANSFER(),trsfAttr,sizeof(trsfAttr)/sizeof(trsfAttr[0]));out.printNewLine(); { ind++; out.printIndent(ind); XStr version("2.2"); XmlWrtAttr headAttr[]={ XmlWrtAttr(ustrings::get_VERSION(),version.unicodeForm()) ,XmlWrtAttr(ustrings::get_SENDER(),getHeadSecSender()) }; out.startElement(tags::get_HEADERSECTION(),headAttr,sizeof(headAttr)/sizeof(headAttr[0]));out.printNewLine(); { ind++; out.printIndent(ind); out.startElement(tags::get_ALIAS(),0,0);out.printNewLine(); { ind++; ind--; } out.printIndent(ind); out.endElement(/*ALIAS*/);out.printNewLine(); out.printIndent(ind); out.startElement(tags::get_COMMENT(),0,0); out.characters(getHeadSecComment()); out.endElement(/*COMMENT*/);out.printNewLine(); ind--; } out.printIndent(ind); out.endElement(/*HEADERSECTION*/);out.printNewLine(); ind--; } // write DATASECTION { ind++; out.printIndent(ind); out.startElement(tags::get_DATASECTION(),0,0);out.printNewLine(); { ind++; // write all baskets for(std::vector<IomBasket>::size_type basketi=0;basketi<basketv.size();basketi++){ IomBasket basket=basketv.at(basketi); const XMLCh *topics=basket->getTopics(); const XMLCh *kind=encodeBasketKind(basket->getKind()); const XMLCh *startstate=basket->getKind()!=IOM_FULL ? basket->getStartState() : 0; const XMLCh *endstate=basket->getKind()!=IOM_FULL ? basket->getEndState() : 0; const XMLCh *consistency=encodeConsistency(basket->getConsistency()); XmlWrtAttr basketAttr[]={ XmlWrtAttr(ustrings::get_BID(),basket->getOid(),true) ,XmlWrtAttr(topics ? ustrings::get_TOPICS():0,topics) ,XmlWrtAttr(kind ? ustrings::get_KIND():0 ,kind) ,XmlWrtAttr(startstate ? ustrings::get_STARTSTATE():0,startstate) ,XmlWrtAttr(endstate ? ustrings::get_ENDSTATE():0,endstate) ,XmlWrtAttr(consistency ? ustrings::get_CONSISTENCY():0,consistency) }; out.printIndent(ind); if(basket->getTag()==0){ iom_issueerr("basket requires a TOPIC name"); return IOM_ERR_ILLEGALSTATE; } out.startElement(basket->getTag(),basketAttr,sizeof(basketAttr)/sizeof(basketAttr[0]));out.printNewLine(); { ind++; // write all objects IomIterator obji=new iom_iterator(basket); IomObject obj=obji->next_object(); while(!obj.isNull()){ out.printIndent(ind); const XMLCh *bid=obj->getBid(); const XMLCh *ops=encodeOperation(obj->getOperation()); const XMLCh *consistency=encodeConsistency(basket->getConsistency()); XmlWrtAttr objAttr[]={ XmlWrtAttr(ustrings::get_TID(),obj->getOid(),true) ,XmlWrtAttr(bid ? ustrings::get_BID():0,bid,true) ,XmlWrtAttr(ops ? ustrings::get_OPERATION():0 ,ops) ,XmlWrtAttr(consistency ? ustrings::get_CONSISTENCY():0,consistency) }; out.startElement(obj->getTag(),objAttr,sizeof(objAttr)/sizeof(objAttr[0])); writeAttrs(out,obj); out.endElement(/*object*/);out.printNewLine(); obj=obji->next_object(); } ind--; } out.printIndent(ind); out.endElement(/*basket*/);out.printNewLine(); } ind--; } out.printIndent(ind); out.endElement(/*DATASECTION*/);out.printNewLine(); ind--; } out.printIndent(ind); out.endElement(/*TRANSFER*/);out.printNewLine(); // close file out.close(); return 0; }
void iom_file::writeAttr(XmlWriter &out, IomObject &obj,int attr) { int valueCount=obj->getAttrValueCount(attr); if(valueCount>0){ const XMLCh *val=obj->getAttrPrim(attr,0); // not a primitive? if(!val){ IomObject child=obj->getAttrObj(attr,0); // some special cases if(child->getTag()==tags::get_COORD()){ // COORD out.startElement(attr,0,0); writeCoord(out,child); out.endElement(/*attr*/); if(valueCount>1){ iom_issueerr("max one COORD value allowed"); } }else if(child->getTag()==tags::get_POLYLINE()){ // POLYLINE out.startElement(attr,0,0); writePolyline(out,child,false); out.endElement(/*attr*/); if(valueCount>1){ iom_issueerr("max one POLYLINE value allowed"); } }else if(child->getTag()==tags::get_MULTISURFACE()){ // MULTISURFACE out.startElement(attr,0,0); writeSurface(out,child); out.endElement(/*attr*/); if(valueCount>1){ iom_issueerr("max one MULTISURFACE value allowed"); } }else{ // normal case const XMLCh *ref=child->getRefOid(); bool isRef= ref ? true : false; // Reference-attribute or Role or EmbeddedLink? if(isRef){ const XMLCh *extref=0; const XMLCh *bid=0; XMLCh itoabuf[40]; const XMLCh *orderpos=0; if(ref){ if(child->getRefOrderPos()>0){ XMLString::binToText( child->getRefOrderPos(),itoabuf,sizeof(itoabuf)-1,10); orderpos=itoabuf; } } bid=child->getRefBid(); if(bid){ extref=ref; ref=0; } XmlWrtAttr refAttr[]={ XmlWrtAttr(ref ? ustrings::get_REF() :0, ref,true) ,XmlWrtAttr(extref ? ustrings::get_EXTREF() :0, extref,true) ,XmlWrtAttr(bid ? ustrings::get_BID() :0, bid,true) ,XmlWrtAttr(orderpos ? ustrings::get_ORDER_POS():0, orderpos) }; out.startElement(attr,refAttr,sizeof(refAttr)/sizeof(refAttr[0])); if(child->getAttrCount()>0){ out.startElement(child->getTag(),0,0); writeAttrs(out,child); out.endElement(/*child*/); } out.endElement(/*attr*/); if(valueCount>1){ iom_issueerr("max one reference value allowed"); } }else{ // struct out.startElement(attr,0,0); int valuei=0; while(1){ out.startElement(child->getTag(),0,0); writeAttrs(out,child); out.endElement(/*child*/); valuei++; if(valuei>=valueCount){ break; } child=obj->getAttrObj(attr,valuei); } out.endElement(/*attr*/); } } }else{ out.startElement(attr,0,0); out.characters(val); out.endElement(/*attr*/); if(valueCount>1){ iom_issueerr("max one primitive-type value allowed"); } } } }
/** writes a polyline value. */ void iom_file::writePolyline(XmlWriter &out, IomObject &obj,bool hasLineAttr) { /* object: POLYLINE [INCOMPLETE] lineattr object: Model.Topic.LineAttr attr00 11 sequence // if incomplete; multi sequence values object: SEGMENTS segment object: COORD C1 102.0 C2 402.0 segment object: ARC C1 103.0 C2 403.0 A1 104.0 A2 404.0 segment object: Model.SplineParam SegmentEndPoint object: COORD C1 103.0 C2 403.0 p0 1.0 p1 2.0 <POLYLINE> <LINEATTR> <Model.Topic.LineAttr> <attr00>11</attr00> </Model.Topic.LineAttr> </LINEATTR> <COORD> <C1>101.0</C1> <C2>401.0</C2> </COORD> <COORD> <C1>102.0</C1> <C2>402.0</C2> </COORD> <Model.SplineParam> <SegmentEndPoint> <COORD> <C1>103.0</C1> <C2>403.0</C2> </COORD> </SegmentEndPoint> <p0>1.0</p0> <p1>2.0</p1> </Model.SplineParam> </POLYLINE> */ out.startElement(tags::get_POLYLINE(),0,0); if(hasLineAttr){ IomObject lineattr=obj->getAttrObj(tags::get_lineattr(),0); if(!lineattr.isNull()){ out.startElement(tags::get_LINEATTR(),0,0); out.startElement(lineattr->getTag(),0,0); writeAttrs(out,lineattr); out.endElement(/*lineattr*/); out.endElement(/*LINEATTR*/); } } bool clipped=obj->getConsistency()==IOM_INCOMPLETE; for(int sequencei=0;sequencei<obj->getAttrValueCount(tags::get_sequence());sequencei++){ if(clipped){ out.startElement(tags::get_CLIPPED(),0,0); }else{ // an unclipped polyline should have only one sequence element if(sequencei>0){ iom_issueerr("unclipped polyline with multi 'sequence' elements"); break; } } IomObject sequence=obj->getAttrObj(tags::get_sequence(),sequencei); for(int segmenti=0;segmenti<sequence->getAttrValueCount(tags::get_segment());segmenti++){ IomObject segment=sequence->getAttrObj(tags::get_segment(),segmenti); if(segment->getTag()==tags::get_COORD()){ // COORD writeCoord(out,segment); }else if(segment->getTag()==tags::get_ARC()){ // ARC writeArc(out,segment); }else{ // custum line form out.startElement(segment->getTag(),0,0); writeAttrs(out,segment); out.endElement(/*segment*/); } } if(clipped){ out.endElement(/*CLIPPED*/); } } out.endElement(/*POLYLINE*/); }