?? reader.cpp
字號:
Element ele; ele.object=object; ele.propertyName=tags::get_sequence(); objStack.push(ele); return; } if(state==ST_BEFORE_CHARACTERS && tag==tags::get_COORD()){ pushReturnState(ST_AFTER_COORD); state=CV_COORD; object=dbgnew struct iom_object(); object->setTag(tags::get_COORD()); return; } if(state==BEFORE_OBJECT || state==ST_AFTER_STRUCTVALUE || state==ST_BEFORE_CHARACTERS || state==ST_BEFORE_EMBASSOC){ // start StructValue if(state==BEFORE_OBJECT){ pushReturnState(BEFORE_OBJECT); }else if(state==ST_AFTER_STRUCTVALUE){ pushReturnState(ST_AFTER_STRUCTVALUE); }else if(state==ST_BEFORE_CHARACTERS){ pushReturnState(ST_AFTER_STRUCTVALUE); }else if(state==ST_BEFORE_EMBASSOC){ pushReturnState(ST_BEFORE_EMBASSOC); } state=ST_BEFORE_PROPERTY; const XMLCh* operation=0; const XMLCh* oid=0; const XMLCh* objBid=0; const XMLCh* consistency=0; for(unsigned int attri=0;attri<attrs.getLength();attri++){ if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_TID())){ oid=attrs.getValue(attri); } if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_BID())){ objBid=attrs.getValue(attri); } if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_OPERATION())){ operation=attrs.getValue(attri); } if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_CONSISTENCY())){ consistency=attrs.getValue(attri); } } object=dbgnew struct iom_object(); object->setTag(tag); object->setXMLLineNumber(locator->getLineNumber()); object->setXMLColumnNumber(locator->getColumnNumber()); if(oid){ object->setOid(stripX(oid)); } if(objBid){ object->setBid(stripX(objBid)); } if(operation){ if(!XMLString::compareString(operation,ustrings::get_INSERT())){ object->setOperation(IOM_OP_INSERT); }else if(!XMLString::compareString(operation,ustrings::get_UPDATE())){ object->setOperation(IOM_OP_UPDATE); }else if(!XMLString::compareString(operation,ustrings::get_DELETE())){ object->setOperation(IOM_OP_DELETE); }else{ iom_issueparserr("Attribute OPERATION has wrong value in object ",IOM_ERRKIND_INVALID,locator->getLineNumber(),locator->getColumnNumber()); } } if(consistency){ if(!XMLString::compareString(consistency,ustrings::get_COMPLETE())){ object->setConsistency(IOM_COMPLETE); }else if(!XMLString::compareString(consistency,ustrings::get_INCOMPLETE())){ object->setConsistency(IOM_INCOMPLETE); }else if(!XMLString::compareString(consistency,ustrings::get_INCONSISTENT())){ object->setConsistency(IOM_INCONSISTENT); }else if(!XMLString::compareString(consistency,ustrings::get_ADAPTED())){ object->setConsistency(IOM_ADAPTED); }else{ iom_issueparserr("Attribute CONSISTENCY has wrong value in object ",IOM_ERRKIND_INVALID,locator->getLineNumber(),locator->getColumnNumber()); } } return; } if(state==ST_BEFORE_PROPERTY){ if(object.isNull()){ //throw new IllegalStateException(); assert(false); } // attribute ->characters // struct ->startElement // ref (refattr) ->endElement // ref (role) ->endElement // ref (embedded assoc) ->startElement or EndElement const XMLCh* oid=0; const XMLCh* objBid=0; unsigned int orderPos=0; for(unsigned int attri=0;attri<attrs.getLength();attri++){ if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_REF())){ oid=attrs.getValue(attri); } if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_BID())){ objBid=attrs.getValue(attri); } if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_EXTREF())){ oid=attrs.getValue(attri); } if(!XMLString::compareString(attrs.getLocalName(attri),ustrings::get_ORDER_POS())){ bool done=XMLString::textToBin(attrs.getValue(attri),orderPos); if(!done || orderPos==0){ // illgegal value iom_issueparserr("Attribute ORDER_POS has wrong value in object ",IOM_ERRKIND_INVALID,locator->getLineNumber(),locator->getColumnNumber()); orderPos=0; } } } // save name,oid,bid // push state Element ele; ele.object=object; ele.propertyName=tag; if(oid){ if(objBid){ ele.setBid(stripX(objBid)); } ele.setOid(stripX(oid)); ele.setOrderPos(orderPos); } objStack.push(ele); object=0; if(oid){ state=ST_BEFORE_EMBASSOC; }else{ state=ST_BEFORE_CHARACTERS; } // ensure we save collected characters only inside // a property and not after a struct value propertyValue.reset(); return; } skip=1;}void ParserHandler::endElement (const XMLCh *const uri , const XMLCh *const localname , const XMLCh *const qname){ level--; if(skip>0){ skip--; return; } // SegmentSequence if(state==SS_AFTER_COORD){ popReturnState(); if(state==ST_AFTER_POLYLINE){ Element ele=objStack.top();objStack.pop(); object=ele.object; // SEGMENTS ele=objStack.top();objStack.pop(); ele.object->parser_addAttrValue(ele.propertyName,object); object=ele.object; // POLYLINE }else if(state==BD_AFTER_POLYLINE){ Element ele=objStack.top();objStack.pop(); object=ele.object; // SEGMENTS ele=objStack.top();objStack.pop(); ele.object->parser_addAttrValue(ele.propertyName,object); object=ele.object; // POLYLINE ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); object=0; }else if(state==PV_AFTER_CLIPPED){ Element ele=objStack.top();objStack.pop(); object=ele.object; // SEGMENTS ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); object=0; }else{ //throw new IllegalStateException(); assert(false); } }else if(state==PV_AFTER_CLIPPED){ Element ele=objStack.top();objStack.pop(); object=ele.object; // POLYLINE state=ST_AFTER_POLYLINE; }else if(state==PV_AFTER_LINEATTRSTRUCT){ state=PV_AFTER_LINEATTR; // Boundaries }else if(state==BD_AFTER_POLYLINE){ Element ele=objStack.top();objStack.pop(); object=ele.object; // BOUNDARY ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); //Dumper dumper=new Dumper(); //dumper.dumpObject(System.err,ele.object); object=0; state=BD_AFTER_BOUNDARY; // SurfaceValue }else if(state==BD_AFTER_BOUNDARY){ popReturnState(); if(state==ST_AFTER_SURFACE){ Element ele=objStack.top();objStack.pop(); object=ele.object; // SURFACE ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); }else if(state==SV_AFTER_CLIPPED){ Element ele=objStack.top();objStack.pop(); object=ele.object; // SURFACE ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); }else{ //throw new IllegalStateException("state "+state); assert(false); } }else if(state==SV_AFTER_CLIPPED){ state=ST_AFTER_SURFACE; // CoordValue }else if(state==CV_AFTER_C1 || state==CV_AFTER_C2 || state==CV_AFTER_C3){ popReturnState(); if(state==SS_AFTER_COORD){ // part of SEGMENTS Element ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); //Dumper dumper=new Dumper(); //dumper.dumpObject(System.err,ele.object); object=0; }else if(state==ST_AFTER_COORD){ }else{ //throw new IllegalStateException(); assert(false); } }else if(state==CV_C1){ object->parser_addAttrValue(tags::get_C1(),propertyValue.getRawBuffer()); propertyValue.reset(); state=CV_AFTER_C1; }else if(state==CV_C2){ object->parser_addAttrValue(tags::get_C2(),propertyValue.getRawBuffer()); propertyValue.reset(); state=CV_AFTER_C2; }else if(state==CV_C3){ object->parser_addAttrValue(tags::get_C3(),propertyValue.getRawBuffer()); propertyValue.reset(); state=CV_AFTER_C3; // StructValue }else if(state==ST_AFTER_STRUCTVALUE || state==ST_BEFORE_CHARACTERS){ // attribute // struct Element ele=objStack.top();objStack.pop(); if(state==ST_BEFORE_CHARACTERS){ // attribute // may be: illegal whitespace, legal whitespace, not whitespace ele.object->parser_addAttrValue(ele.propertyName,propertyValue.getRawBuffer()); }else{ // bag of structvalues // added to ele.object in endElement of structvalue } object=ele.object; propertyValue.reset(); state=ST_BEFORE_PROPERTY; }else if(state==ST_BEFORE_EMBASSOC){ // ref (refattr) // ref (role) // ref (embedded assoc) with or without assocattrs Element ele=objStack.top();objStack.pop(); if(object.isNull()){ // ref (refattr) // ref (role) // ref (embedded assoc) without assocattrs object=dbgnew iom_object(); }else{ // ref (embedded assoc) with assocattrs } object->setRefOid(ele.getOid()); object->setRefBid(ele.getBid()); object->setRefOrderPos(ele.getOrderPos()); ele.object->parser_addAttrValue(ele.propertyName,object); object=ele.object; propertyValue.reset(); state=ST_BEFORE_PROPERTY; }else if(state==ST_AFTER_COORD){ // attr of type COORD Element ele=objStack.top();objStack.pop(); ele.object->parser_addAttrValue(ele.propertyName,object); object=ele.object; state=ST_BEFORE_PROPERTY; propertyValue.reset(); }else if(state==ST_AFTER_POLYLINE){ // attr of type POLYLINE Element ele=objStack.top();objStack.pop(); ele.object->parser_addAttrValue(ele.propertyName,object); object=ele.object; state=ST_BEFORE_PROPERTY; propertyValue.reset(); }else if(state==ST_AFTER_SURFACE){ // attr of type SURFACE/AREA Element ele=objStack.top();objStack.pop(); object=ele.object; // MULTISURFACE ele=objStack.top();objStack.pop(); ele.object->parser_addAttrValue(ele.propertyName,object); object=ele.object; state=ST_BEFORE_PROPERTY; propertyValue.reset(); }else if(state==ST_BEFORE_PROPERTY){ popReturnState(); if(state==BEFORE_OBJECT){ dataContainer->addObject(object); object=0; }else{ if(state==ST_AFTER_STRUCTVALUE){ Element ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); object=0; }else if(state==PV_AFTER_LINEATTRSTRUCT){ Element ele=objStack.top(); ele.object->parser_addAttrValue(tags::get_lineattr(),object); object=0; }else if(state==SS_AFTER_COORD){ // part of SEGMENTS Element ele=objStack.top(); ele.object->parser_addAttrValue(ele.propertyName,object); //Dumper dumper=new Dumper(); //dumper.dumpObject(System.err,ele.object); object=0; } } }else if(state==BEFORE_OBJECT){ file->addBasket(dataContainer); dataContainer=0; state=BEFORE_BASKET; }else if(state==BEFORE_BASKET){ state=BEFORE_DATASECTION; }else if(state==START_HEADERSECTION){ state=BEFORE_DATASECTION; }else if(state==BEFORE_DATASECTION){ state=BEFORE_TRANSFER; }}void ParserHandler::characters( const XMLCh* const chars , const unsigned int length){ if(state==ST_BEFORE_CHARACTERS || state==CV_C1 || state==CV_C2 || state==CV_C3 ){ propertyValue.append(chars,length); }}void ParserHandler::error(const SAXParseException& e){#if 0 std::cerr << "\nSAX Error at file " << StrX(e.getSystemId()) << ", line " << e.getLineNumber() << ", char " << e.getColumnNumber() << "\n Message: " << StrX(e.getMessage()) << std::endl;#endif iom_issueparserr(StrX(e.getMessage()).localForm(),IOM_ERRKIND_XMLPARSER,e.getLineNumber(),e.getColumnNumber());}void ParserHandler::fatalError(const SAXParseException& e){#if 0 std::cerr << "\nSAX Error at file " << StrX(e.getSystemId()) << ", line " << e.getLineNumber() << ", char " << e.getColumnNumber() << "\n Message: " << StrX(e.getMessage()) << std::endl;#endif iom_issueparserr(StrX(e.getMessage()).localForm(),IOM_ERRKIND_XMLPARSER,e.getLineNumber(),e.getColumnNumber());}void ParserHandler::warning(const SAXParseException& e){#if 0 std::cerr << "\nSAX Error at file " << StrX(e.getSystemId()) << ", line " << e.getLineNumber() << ", char " << e.getColumnNumber() << "\n Message: " << StrX(e.getMessage()) << std::endl;#endif iom_issueparserr(StrX(e.getMessage()).localForm(),IOM_ERRKIND_XMLPARSER,e.getLineNumber(),e.getColumnNumber());}void ParserHandler::setDocumentLocator (const Locator *const locator1){ locator=locator1;}/** pushes a return state for the parser state machine to the stack. * Used before entering a sub state machine. */void ParserHandler::pushReturnState(int returnState){ stateStack.push(returnState);}/** pops a state for the parser state machine from the stack and makes it the * new current state. * Used when leaving a sub state machine. */void ParserHandler::popReturnState(){ state=stateStack.top(); stateStack.pop();}/** changes the top state on the stack for the parser state machine. * Used to change the return state of a sub state machine. */void ParserHandler::changeReturnState(int returnState){ stateStack.pop(); stateStack.push(returnState);}/** gets the id of an xml-element name */int ParserHandler::getTagId(const char *name){ if(!namev){//FIXME namev=dbgnew XMLStringPool(); namev=new XMLStringPool(); } return namev->addOrFind(X(name));}/** gets the id of an xml-element name */int ParserHandler::getTagId(const XMLCh *const name){ if(!namev){ namev=new XMLStringPool(); } return namev->addOrFind(name);}/** gets the id of an xml-element name */const XMLCh *const ParserHandler::getTagName(int tagid){ if(!namev){ namev=new XMLStringPool(); } return namev->getValueForId(tagid);}/** cleanup reader module. This function is a part of iom_end(). */void ParserHandler::at_iom_end(){ if(namev){ delete namev; namev=0; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -