void EventRecorder::handle(EventPtr theEvent) { if (_myMode == RECORD && filterEvent(theEvent) == false) { EventPtr myEvent = theEvent->copy(); myEvent->when = asl::Time() - _myStartTime; DB(AC_TRACE << "push node=" << *myEvent->asNode()); _myEvents.push_back(myEvent); } }
bool EventRecorder::load(const std::string & theFilename, bool theDiscardFlag) { std::string myFile = asl::readFile(theFilename); if (myFile.empty()) { AC_ERROR << "Unable to open '" << theFilename << "'"; return false; } dom::Document myDoc; myDoc.parseAll(myFile.c_str()); if (!myDoc) { AC_ERROR << "Unable to parse '" << theFilename << "'"; return false; } const dom::NodePtr & myEvents = myDoc.childNode("events"); if (!myEvents) { AC_ERROR << "No 'events' node found in '" << theFilename << "'"; return false; } // load or merge if (theDiscardFlag) { AC_DEBUG << "Discarding events"; _myEvents.clear(); } // load events into list for (unsigned i = 0; i < myEvents->childNodesLength(); ++i) { const dom::NodePtr & myEventNode = myEvents->childNode(i); DB2(AC_TRACE << "parsed " << *myEventNode); EventPtr myEvent = Event::create(myEventNode); if (myEvent) { DB2(AC_TRACE << "event " << *myEvent->asNode()); _myEvents.push_back(myEvent); } } AC_INFO << "Loaded " << _myEvents.size() << " events from '" << theFilename << "'"; // sort list by time std::sort(_myEvents.begin(), _myEvents.end(), compareEvent()); setMode(STOP); return true; }
EventPtrList EventRecorder::poll() { EventPtrList myEvents; if (_myMode == PLAY) { asl::Time myTime = asl::Time() - _myStartTime; while (_myEventIter != _myEvents.end() && (*_myEventIter)->when <= myTime) { EventPtr myEvent = *(_myEventIter++); DB(AC_TRACE << "pop node=" << *(myEvent->asNode())); myEvents.push_back(myEvent); } if (_myEventIter == _myEvents.end()) { AC_DEBUG << "Stopping event playback"; setMode(STOP); } } return myEvents; }