DECLARE_EXPORT void ResourceSkill::endElement (XMLInput& pIn, const Attribute& pAttr, const DataElement& pElement) { if (pAttr.isA (Tags::tag_resource)) { Resource *r = dynamic_cast<Resource*>(pIn.getPreviousObject()); if (r) setResource(r); else throw LogicException("Incorrect object type during read operation"); } else if (pAttr.isA (Tags::tag_skill)) { Skill *s = dynamic_cast<Skill*>(pIn.getPreviousObject()); if (s) setSkill(s); else throw LogicException("Incorrect object type during read operation"); } else if (pAttr.isA(Tags::tag_priority)) setPriority(pElement.getInt()); else if (pAttr.isA(Tags::tag_effective_end)) setEffectiveEnd(pElement.getDate()); else if (pAttr.isA(Tags::tag_effective_start)) setEffectiveStart(pElement.getDate()); else if (pAttr.isA(Tags::tag_action)) { delete static_cast<Action*>(pIn.getUserArea()); pIn.setUserArea( new Action(MetaClass::decodeAction(pElement.getString().c_str())) ); } else if (pIn.isObjectEnd()) { // The resourceskill data is now all read in. See if it makes sense now... Action a = pIn.getUserArea() ? *static_cast<Action*>(pIn.getUserArea()) : ADD_CHANGE; delete static_cast<Action*>(pIn.getUserArea()); try { validate(a); } catch (...) { delete this; throw; } } }
DECLARE_EXPORT void Location::endElement(XMLInput& pIn, const Attribute& pAttr, const DataElement& pElement) { if (pAttr.isA(Tags::tag_available)) { CalendarDouble *cal = dynamic_cast<CalendarDouble*>(pIn.getPreviousObject()); if (cal) setAvailable(cal); else { Calendar *c = dynamic_cast<Calendar*>(pIn.getPreviousObject()); if (!c) throw LogicException("Incorrect object type during read operation"); throw DataException("Calendar '" + c->getName() + "' has invalid type for use as location calendar"); } } else { HasDescription::endElement(pIn, pAttr, pElement); HasHierarchy<Location>::endElement(pIn, pAttr, pElement); } }
DECLARE_EXPORT void Item::endElement(XMLInput& pIn, const Attribute& pAttr, const DataElement& pElement) { if (pAttr.isA(Tags::tag_operation)) { Operation *o = dynamic_cast<Operation*>(pIn.getPreviousObject()); if (o) setOperation(o); else throw LogicException("Incorrect object type during read operation"); } else if (pAttr.isA(Tags::tag_price)) setPrice(pElement.getDouble()); else { HasDescription::endElement(pIn, pAttr, pElement); HasHierarchy<Item>::endElement(pIn, pAttr, pElement); } }