/** 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 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"); } } } }