reader.cpp

来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 920 行 · 第 1/2 页

CPP
920
字号
			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 + =
减小字号Ctrl + -
显示快捷键?