| 82 | } |
| 83 | |
| 84 | void ModuleHooks::FilterModuleEventReceivers(const ModuleEvent& evt, |
| 85 | ServiceListeners::ModuleListenerMap& moduleListeners) |
| 86 | { |
| 87 | std::vector<ServiceRegistrationBase> eventHooks; |
| 88 | coreCtx->services.Get(us_service_interface_iid<ModuleEventHook>(), eventHooks); |
| 89 | |
| 90 | { |
| 91 | MutexLock lock(coreCtx->listeners.moduleListenerMapMutex); |
| 92 | moduleListeners = coreCtx->listeners.moduleListenerMap; |
| 93 | } |
| 94 | |
| 95 | if(!eventHooks.empty()) |
| 96 | { |
| 97 | std::vector<ModuleContext*> moduleContexts; |
| 98 | for (ServiceListeners::ModuleListenerMap::iterator le = moduleListeners.begin(), |
| 99 | leEnd = moduleListeners.end(); le != leEnd; ++le) |
| 100 | { |
| 101 | moduleContexts.push_back(le->first); |
| 102 | } |
| 103 | std::sort(moduleContexts.begin(), moduleContexts.end()); |
| 104 | moduleContexts.erase(std::unique(moduleContexts.begin(), moduleContexts.end()), moduleContexts.end()); |
| 105 | |
| 106 | const std::size_t unfilteredSize = moduleContexts.size(); |
| 107 | ShrinkableVector<ModuleContext*> filtered(moduleContexts); |
| 108 | |
| 109 | std::sort(eventHooks.begin(), eventHooks.end()); |
| 110 | for (std::vector<ServiceRegistrationBase>::reverse_iterator iter = eventHooks.rbegin(), |
| 111 | iterEnd = eventHooks.rend(); iter != iterEnd; ++iter) |
| 112 | { |
| 113 | ServiceReference<ModuleEventHook> sr; |
| 114 | try |
| 115 | { |
| 116 | sr = iter->GetReference(); |
| 117 | } |
| 118 | catch (const std::logic_error& e) |
| 119 | { |
| 120 | MITK_WARN << "Failed to get event hook service reference: " << e.what(); |
| 121 | continue; |
| 122 | } |
| 123 | |
| 124 | ModuleEventHook* eh = reinterpret_cast<ModuleEventHook*>(sr.d->GetService(GetModuleContext()->GetModule())); |
| 125 | if (eh != nullptr) |
| 126 | { |
| 127 | try |
| 128 | { |
| 129 | eh->Event(evt, filtered); |
| 130 | } |
| 131 | catch (const std::exception& e) |
| 132 | { |
| 133 | MITK_WARN << "Failed to call Module EventHook #" << sr.GetProperty(ServiceConstants::SERVICE_ID()).ToString() |
| 134 | << ": " << e.what(); |
| 135 | } |
| 136 | catch (...) |
| 137 | { |
| 138 | MITK_WARN << "Failed to call Module EventHook #" << sr.GetProperty(ServiceConstants::SERVICE_ID()).ToString() |
| 139 | << ": unknown exception type"; |
| 140 | } |
| 141 | sr.d->UngetService(GetModuleContext()->GetModule(), false); |
no test coverage detected