Salome HOME
Debug of flush operation
authormpv <mikhail.ponikarov@opencascade.com>
Thu, 22 May 2014 13:00:38 +0000 (17:00 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Thu, 22 May 2014 13:00:38 +0000 (17:00 +0400)
src/Events/Events_Loop.cpp
src/Events/Events_Loop.h
src/Model/Model_PluginManager.cpp

index e8d6a716a780abab0f0a0c38e91d6af64f6fadb1..5a5a9442672406c62ebd8a7465cfa87bdb1608bd 100644 (file)
@@ -33,19 +33,21 @@ Events_ID Events_Loop::eventByName(const char* theName)
   return Events_ID(aResult);
 }
 
-void Events_Loop::send(Events_Message& theMessage)
+void Events_Loop::send(Events_Message& theMessage, bool isGroup)
 {
   // if it is grouped message, just accumulate it
-  Events_MessageGroup* aGroup = dynamic_cast<Events_MessageGroup*>(&theMessage);
-  if (aGroup) {
-    std::map<char*, Events_MessageGroup*>::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());
+  if (isGroup) {
+    Events_MessageGroup* aGroup = dynamic_cast<Events_MessageGroup*>(&theMessage);
+    if (aGroup) {
+      std::map<char*, Events_MessageGroup*>::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);
+      return;
     }
-    aMyGroup->second->Join(*aGroup);
-    return;
   }
 
   // TO DO: make it in thread and with usage of semaphores
@@ -101,7 +103,7 @@ void Events_Loop::flush(const Events_ID& theID)
     myGroups.find(theID.eventText());
   if (aMyGroup != myGroups.end()) { // really sends
     Events_MessageGroup* aGroup = aMyGroup->second;
-    send(*aGroup);
+    send(*aGroup, false);
     myGroups.erase(aMyGroup);
     delete aGroup;
   }
index f5721c8b45de9a430690f0c076ce1639fc92448f..d19dd4d4a39cee1fa832018961e49ea5b8702309 100644 (file)
@@ -41,7 +41,8 @@ public:
   EVENTS_EXPORT static Events_ID eventByName(const char* theName);
 
   //! Allows to send an event
-  EVENTS_EXPORT void send(Events_Message& theMessage);
+  //! \param isGroup is true for grouping messages if possible
+  EVENTS_EXPORT void send(Events_Message& theMessage, bool isGroup = true);
 
   //! Registers (or adds if such listener is already registered) a listener 
   //! that will be called on the event and from the defined sender
index 7a0a20d0a009958e1b4e4b1073aaefdbe5d00bf8..05f1586e678f1c1b5ba1df48cd2b668ee71926d8 100644 (file)
@@ -8,6 +8,7 @@
 #include <Model_Data.h>
 #include <Model_Document.h>
 #include <Model_Application.h>
+#include <Model_Events.h>
 #include <Events_Loop.h>
 #include <Events_Error.h>
 #include <Config_FeatureMessage.h>
@@ -97,27 +98,34 @@ boost::shared_ptr<ModelAPI_Document> Model_PluginManager::copy(
 Model_PluginManager::Model_PluginManager()
 {
   myPluginsInfoLoaded = false;
-  //TODO(sbh): Implement static method to extract event id [SEID]
-  static Events_ID aFeatureEvent = Events_Loop::eventByName("FeatureRegisterEvent");
-
   ModelAPI_PluginManager::SetPluginManager(boost::shared_ptr<ModelAPI_PluginManager>(this));
   // register the configuration reading listener
   Events_Loop* aLoop = Events_Loop::loop();
-  aLoop->registerListener(this, aFeatureEvent);
+  static Events_ID FeatureEvent = Events_Loop::eventByName("FeatureRegisterEvent");
+  aLoop->registerListener(this, FeatureEvent);
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_CREATED));
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_UPDATED));
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_DELETED));
 }
 
 void Model_PluginManager::processEvent(const Events_Message* theMessage)
 {
-  const Config_FeatureMessage* aMsg =
-    dynamic_cast<const Config_FeatureMessage*>(theMessage);
-  if (aMsg) {
-    // proccess the plugin info, load plugin
-    if (myPlugins.find(aMsg->id()) == myPlugins.end()) {
-      myPlugins[aMsg->id()] = aMsg->pluginLibrary();
+  static Events_ID FeatureEvent = Events_Loop::eventByName("FeatureRegisterEvent");
+  if (theMessage->eventID() == FeatureEvent) {
+    const Config_FeatureMessage* aMsg =
+      dynamic_cast<const Config_FeatureMessage*>(theMessage);
+    if (aMsg) {
+      // proccess the plugin info, load plugin
+      if (myPlugins.find(aMsg->id()) == myPlugins.end()) {
+        myPlugins[aMsg->id()] = aMsg->pluginLibrary();
+      }
     }
+    // plugins information was started to load, so, it will be loaded
+    myPluginsInfoLoaded = true;
+  } else { // create/update/delete
+    if (!rootDocument()->isOperation())
+      Events_Error::send("Modification of data structure outside of the transaction");
   }
-  // plugins information was started to load, so, it will be loaded
-  myPluginsInfoLoaded = true;
 }
 
 void Model_PluginManager::LoadPluginsInfo()