Changeset 7160
- Timestamp:
- Jul 26, 2010, 2:56:06 PM (14 years ago)
- Location:
- code/branches/presentation3/src/libraries/core
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/presentation3/src/libraries/core/XMLPort.cc
r5781 r7160 41 41 return ((!this->bApplyLoaderMask_) || identifier->isA(ClassIdentifier<Namespace>::getIdentifier()) || Loader::currentMask_s.isIncluded(identifier)); 42 42 } 43 44 XMLPortObjectContainer& XMLPortObjectContainer::port(BaseObject* object, Element& xmlelement, XMLPort::Mode mode) 45 { 46 if ((mode == XMLPort::LoadObject) || (mode == XMLPort::ExpandObject)) 47 { 48 try 49 { 50 Element* xmlsubelement; 51 if (!this->sectionname_.empty()) 52 xmlsubelement = xmlelement.FirstChildElement(this->sectionname_, false); 53 else 54 xmlsubelement = &xmlelement; 55 56 if (!xmlsubelement) 57 return (*this); 58 59 for (ticpp::Iterator<ticpp::Element> child = xmlsubelement->FirstChildElement(false); child != child.end(); child++) 60 { 61 Identifier* identifier = Identifier::getIdentifierByString(child->Value()); 62 if (!identifier) 63 { 64 if (!this->sectionname_.empty()) 65 { 66 COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not a valid classname." << std::endl; 67 } 68 else 69 { 70 // It's probably just another subsection 71 } 72 continue; 73 } 74 if (!identifier->isA(objectIdentifier_)) 75 { 76 COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not a '" << objectIdentifier_->getName() << "'." << std::endl; 77 continue; 78 } 79 if (!identifier->isLoadable()) 80 { 81 COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not loadable." << std::endl; 82 continue; 83 } 84 if (!this->identifierIsIncludedInLoaderMask(identifier)) 85 continue; 86 87 try 88 { 89 COUT(4) << object->getLoaderIndentation() << "fabricating " << child->Value() << "..." << std::endl; 90 91 BaseObject* newObject = identifier->fabricate(object); 92 newObject->setLoaderIndentation(object->getLoaderIndentation() + " "); 93 94 if (this->bLoadBefore_) 95 { 96 newObject->XMLPort(*child, XMLPort::LoadObject); 97 COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << std::endl; 98 } 99 else 100 { 101 COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (object not yet loaded) to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << std::endl; 102 } 103 104 COUT(5) << object->getLoaderIndentation(); 105 106 this->callLoadExecutor(object, newObject); 107 108 if (!this->bLoadBefore_) 109 newObject->XMLPort(*child, XMLPort::LoadObject); 110 111 COUT(5) << object->getLoaderIndentation() << "...fabricated " << child->Value() << " (objectname " << newObject->getName() << ")." << std::endl; 112 } 113 catch (AbortLoadingException& ex) 114 { 115 COUT(1) << "An error occurred while loading object, abort loading..." << std::endl; 116 throw ex; 117 } 118 catch (...) 119 { 120 COUT(1) << "An error occurred while loading object:" << std::endl; 121 COUT(1) << Exception::handleMessage() << std::endl; 122 } 123 } 124 } 125 catch (ticpp::Exception& ex) 126 { 127 COUT(1) << std::endl; 128 COUT(1) << "An error occurred in XMLPort.h while loading a '" << objectIdentifier_->getName() << "' in '" << this->sectionname_ << "' of '" << this->identifier_->getName() << "' (objectname: " << object->getName() << ") in " << object->getFilename() << ':' << std::endl; 129 COUT(1) << ex.what() << std::endl; 130 } 131 } 132 else if (mode == XMLPort::SaveObject) 133 { 134 } 135 136 return (*this); 137 } 43 138 } -
code/branches/presentation3/src/libraries/core/XMLPort.h
r7148 r7160 495 495 virtual ~XMLPortObjectContainer() {} 496 496 497 XMLPortObjectContainer& port(BaseObject* object, Element& xmlelement, XMLPort::Mode mode); 498 499 virtual void callLoadExecutor(BaseObject* object, BaseObject* newObject) = 0; 500 497 501 inline const std::string& getName() const 498 502 { return this->sectionname_; } … … 508 512 bool bLoadBefore_; 509 513 Identifier* identifier_; 514 Identifier* objectIdentifier_; 510 515 }; 511 516 … … 518 523 this->sectionname_ = sectionname; 519 524 this->identifier_ = identifier; 525 assert(identifier->isA(ClassIdentifier<T>::getIdentifier())); 526 this->objectIdentifier_ = ClassIdentifier<O>::getIdentifier(); 520 527 this->loadexecutor_ = loadexecutor; 521 528 this->saveexecutor_ = saveexecutor; … … 532 539 } 533 540 534 XMLPortObjectContainer& port(T* object, Element& xmlelement, XMLPort::Mode mode) 535 { 536 if ((mode == XMLPort::LoadObject) || (mode == XMLPort::ExpandObject)) 537 { 538 try 539 { 540 Element* xmlsubelement; 541 if (!this->sectionname_.empty()) 542 xmlsubelement = xmlelement.FirstChildElement(this->sectionname_, false); 543 else 544 xmlsubelement = &xmlelement; 545 546 if (xmlsubelement) 547 { 548 for (ticpp::Iterator<ticpp::Element> child = xmlsubelement->FirstChildElement(false); child != child.end(); child++) 549 { 550 Identifier* identifier = Identifier::getIdentifierByString(child->Value()); 551 if (identifier) 552 { 553 if (identifier->isA(ClassIdentifier<O>::getIdentifier())) 554 { 555 if (identifier->isLoadable()) 556 { 557 if (this->identifierIsIncludedInLoaderMask(identifier)) 558 { 559 try 560 { 561 COUT(4) << object->getLoaderIndentation() << "fabricating " << child->Value() << "..." << std::endl; 562 563 BaseObject* newObject = identifier->fabricate(static_cast<BaseObject*>(object)); 564 assert(newObject); 565 newObject->setLoaderIndentation(object->getLoaderIndentation() + " "); 566 567 O* castedObject = orxonox_cast<O*>(newObject); 568 assert(castedObject); 569 570 if (this->bLoadBefore_) 571 { 572 newObject->XMLPort(*child, XMLPort::LoadObject); 573 COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << std::endl; 574 } 575 else 576 { 577 COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (object not yet loaded) to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << std::endl; 578 } 579 580 COUT(5) << object->getLoaderIndentation(); 581 (*this->loadexecutor_)(object, castedObject); 582 583 if (!this->bLoadBefore_) 584 newObject->XMLPort(*child, XMLPort::LoadObject); 585 586 COUT(5) << object->getLoaderIndentation() << "...fabricated " << child->Value() << " (objectname " << newObject->getName() << ")." << std::endl; 587 } 588 catch (AbortLoadingException& ex) 589 { 590 COUT(1) << "An error occurred while loading object, abort loading..." << std::endl; 591 throw ex; 592 } 593 catch (...) 594 { 595 COUT(1) << "An error occurred while loading object:" << std::endl; 596 COUT(1) << Exception::handleMessage() << std::endl; 597 } 598 } 599 } 600 else 601 { 602 COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not loadable." << std::endl; 603 } 604 } 605 else 606 { 607 COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not a '" << ClassIdentifier<O>::getIdentifier()->getName() << "'." << std::endl; 608 } 609 } 610 else 611 { 612 if (!this->sectionname_.empty()) 613 { 614 COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not a valid classname." << std::endl; 615 } 616 else 617 { 618 // It's probably just another subsection 619 } 620 } 621 } 622 } 623 } 624 catch (ticpp::Exception& ex) 625 { 626 COUT(1) << std::endl; 627 COUT(1) << "An error occurred in XMLPort.h while loading a '" << ClassIdentifier<O>::getIdentifier()->getName() << "' in '" << this->sectionname_ << "' of '" << this->identifier_->getName() << "' (objectname: " << object->getName() << ") in " << object->getFilename() << ':' << std::endl; 628 COUT(1) << ex.what() << std::endl; 629 } 630 } 631 else if (mode == XMLPort::SaveObject) 632 { 633 } 634 635 return (*this); 541 void callLoadExecutor(BaseObject* object, BaseObject* newObject) 542 { 543 T* castedObject = orxonox_cast<T*>(object); 544 assert(castedObject); 545 O* castedNewObject = orxonox_cast<O*>(newObject); 546 assert(castedNewObject); 547 548 (*this->loadexecutor_)(castedObject, castedNewObject); 636 549 } 637 550
Note: See TracChangeset
for help on using the changeset viewer.