X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FEvents%2FEvents_Loop.cpp;h=139e862340007e89ce5dec7723768cb401df18cd;hb=aeca03e919a402327655e3f9c133985d9223b873;hp=1fb0ed1780636c244923a3b50469ce0e68ab22f4;hpb=deb0185764c5a7ab524646cfdc2b7ce22afae81d;p=modules%2Fshaper.git diff --git a/src/Events/Events_Loop.cpp b/src/Events/Events_Loop.cpp index 1fb0ed178..139e86234 100644 --- a/src/Events/Events_Loop.cpp +++ b/src/Events/Events_Loop.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: Events_Loop.hxx // Created: Thu Mar 13 2014 // Author: Mikhail PONIKAROV @@ -37,49 +39,59 @@ Events_ID Events_Loop::eventByName(const char* theName) return Events_ID(aResult); } -void Events_Loop::send(Events_Message& theMessage, bool isGroup) +void Events_Loop::send(const std::shared_ptr& theMessage, bool isGroup) { + if (myImmediateListeners.find(theMessage->eventID().eventText()) != myImmediateListeners.end()) { + myImmediateListeners[theMessage->eventID().eventText()]->processEvent(theMessage); + } // if it is grouped message, just accumulate it - if (isGroup) { - Events_MessageGroup* aGroup = dynamic_cast(&theMessage); + if (isGroup && myFlushed.find(theMessage->eventID().myID) == myFlushed.end()) { + std::shared_ptr aGroup = + std::dynamic_pointer_cast(theMessage); if (aGroup) { - std::map::iterator aMyGroup = myGroups.find( + std::map >::iterator aMyGroup = myGroups.find( aGroup->eventID().eventText()); if (aMyGroup == myGroups.end()) { // create a new group of messages for accumulation myGroups[aGroup->eventID().eventText()] = aGroup->newEmpty(); aMyGroup = myGroups.find(aGroup->eventID().eventText()); } - aMyGroup->second->Join(*aGroup); + std::shared_ptr aStored = + std::dynamic_pointer_cast(aMyGroup->second); + aStored->Join(aGroup); return; } } - // TO DO: make it in thread and with usage of semaphores + // TODO: make it in thread and with usage of semaphores map > >::iterator aFindID = myListeners.find( - theMessage.eventID().eventText()); + theMessage->eventID().eventText()); if (aFindID != myListeners.end()) { map >::iterator aFindSender = aFindID->second.find( - theMessage.sender()); + theMessage->sender()); if (aFindSender != aFindID->second.end()) { list& aListeners = aFindSender->second; for (list::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++) - (*aL)->processEvent(&theMessage); + (*aL)->processEvent(theMessage); } - if (theMessage.sender()) { // also call for NULL senders registered + if (theMessage->sender()) { // also call for NULL senders registered aFindSender = aFindID->second.find(NULL); if (aFindSender != aFindID->second.end()) { list& aListeners = aFindSender->second; for (list::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++) - (*aL)->processEvent(&theMessage); + (*aL)->processEvent(theMessage); } } } } void Events_Loop::registerListener(Events_Listener* theListener, const Events_ID theID, - void* theSender) + void* theSender, bool theImmediate) { + if (theImmediate) { // just register as an immediate + myImmediateListeners[theID.eventText()] = theListener; + return; + } map > >::iterator aFindID = myListeners.find( theID.eventText()); if (aFindID == myListeners.end()) { // create container associated with ID @@ -105,12 +117,19 @@ void Events_Loop::flush(const Events_ID& theID) { if (!myFlushActive) return; - std::map::iterator aMyGroup = myGroups.find(theID.eventText()); - if (aMyGroup != myGroups.end()) { // really sends - Events_MessageGroup* aGroup = aMyGroup->second; + std::map >::iterator aMyGroup; + for(aMyGroup = myGroups.find(theID.eventText()); + aMyGroup != myGroups.end(); aMyGroup = myGroups.find(theID.eventText())) + { // really sends + bool aWasFlushed = myFlushed.find(theID.myID) != myFlushed.end(); + if (!aWasFlushed) + myFlushed.insert(theID.myID); + std::shared_ptr aGroup = aMyGroup->second; myGroups.erase(aMyGroup); - send(*aGroup, false); - delete aGroup; + send(aGroup, false); + + if (!aWasFlushed) + myFlushed.erase(myFlushed.find(theID.myID)); } } @@ -118,3 +137,33 @@ void Events_Loop::activateFlushes(const bool theActivate) { myFlushActive = theActivate; } + +void Events_Loop::clear(const Events_ID& theID) +{ + std::map>::iterator aMyGroup = + myGroups.find(theID.eventText()); + if (aMyGroup != myGroups.end()) { // really sends + myGroups.erase(aMyGroup); + } +} + +void Events_Loop::autoFlush(const Events_ID& theID, const bool theAuto) +{ + if (theAuto) + myFlushed.insert(theID.myID); + else + myFlushed.erase(myFlushed.find(theID.myID)); +} + +bool Events_Loop::isFlushed(const Events_ID& theID) +{ + return myFlushed.find(theID.myID) != myFlushed.end(); +} + +void Events_Loop::setFlushed(const Events_ID& theID, const bool theValue) +{ + if (theValue) + myFlushed.insert(theID.myID); + else + myFlushed.erase(myFlushed.find(theID.myID)); +}